parse a repeatmasker alignment header line and place the extracted meta-data
  into the provided dictionary. An example header line is::

    239 29.42 1.92 0.97 chr1 11 17 (41) C XX#YY (74) 104 1 m_b1s502i1 4

  If the alignment is to the consensus, this will have 14 fields; to the
  reverse complement of the repeat consensus and it'll have 15. Fields as
  follows:

  =====  ========    ==========================================================
  Num    Value       description
  =====  ========    ==========================================================
  0      239         Smith-Waterman score of the match
  1      29.42       percent substitutions in match compared to the consensus
  2      1.92        percent bases opposite gap in query seq (deleted bp)
  3      0.97        percent bases opposite gap in repeat consensus (insert bp)
  4      chr1        The name of the reference sequence (usually genomic chrom)
  5      11          Start location in reference; always pos strand, I think..
  6      17          End location in reference; always pos strand, I think..
  7      (41)        Distance to end of ref (alt., neg strand co-ord of end)
  8      C           Alignment is to rev. comp. of consensus. Ommited otherwise
  8/9    XX#YY       XX is the name of the repeat and YY is the family
  9/10   (74)        if +'ve, strt coord; else bases before start on neg strand
  10/11  104         if +'ve, end coord; else start of match in pos strand
  11/12  1           if +'ve, num bases aftr mtch to end; else end in + coords
  12/13  m_b1s5..    ....?
  13/14  4           unique ID
  =====  ========    ==========================================================

  Note that repeat-masker calls the larger coordinate the start when the match
  is to the reverse complement; we swap these internally so start < end always,
  regardless of whether the match is to the consensus or the reverse complement
  of the consensus

  Each field is mapped to a key as follows

  =====  =================================================================
  Num    Key (these are defined in pyokit.datastruct.multipleAlignment.py)
  =====  =================================================================
  0      ALIG_SCORE_KEY
  1      PCENT_SUBS_KEY
  2      PCENT_S1_INDELS_KEY
  3      PCENT_S2_INDELS_KEY
  4      S1_NAME_KEY
  5      S1_START_KEY
  6      S1_END_KEY
  7      S1_END_NEG_STRAND_KEY
  8      S2_REVERSE_COMP_KEY
  8/9    S2_NAME_KEY
  9/10   S2_START_KEY (S2 + strand) / S2_START_NEG_STRAND_KEY (S2 - strand)
  10/11  S2_END_KEY (S2 + strand) / S2_START_KEY (S2 - strand)
  11/12  S2_END_NEG_STRAND_KEY (S2 + strand) / S2_END_KEY (S2 - strand)
  12/13  UNKNOWN_RM_HEADER_FIELD_KEY
  13/14  RM_ID_KEY
  =====  =================================================================

  :param parts:     the header line, as a tokenized list.
  :param meta_data: dictionary; resultant key-value pairs placed into this.

def _rm_parse_header_line(parts, meta_data):
  """
  parse a repeatmasker alignment header line and place the extracted meta-data
  into the provided dictionary. An example header line is::

    239 29.42 1.92 0.97 chr1 11 17 (41) C XX#YY (74) 104 1 m_b1s502i1 4

  If the alignment is to the consensus, this will have 14 fields; to the
  reverse complement of the repeat consensus and it'll have 15. Fields as
  follows:

  =====  ========    ==========================================================
  Num    Value       description
  =====  ========    ==========================================================
  0      239         Smith-Waterman score of the match
  1      29.42       percent substitutions in match compared to the consensus
  2      1.92        percent bases opposite gap in query seq (deleted bp)
  3      0.97        percent bases opposite gap in repeat consensus (insert bp)
  4      chr1        The name of the reference sequence (usually genomic chrom)
  5      11          Start location in reference; always pos strand, I think..
  6      17          End location in reference; always pos strand, I think..
  7      (41)        Distance to end of ref (alt., neg strand co-ord of end)
  8      C           Alignment is to rev. comp. of consensus. Ommited otherwise
  8/9    XX#YY       XX is the name of the repeat and YY is the family
  9/10   (74)        if +'ve, strt coord; else bases before start on neg strand
  10/11  104         if +'ve, end coord; else start of match in pos strand
  11/12  1           if +'ve, num bases aftr mtch to end; else end in + coords
  12/13  m_b1s5..    ....?
  13/14  4           unique ID
  =====  ========    ==========================================================

  Note that repeat-masker calls the larger coordinate the start when the match
  is to the reverse complement; we swap these internally so start < end always,
  regardless of whether the match is to the consensus or the reverse complement
  of the consensus

  Each field is mapped to a key as follows

  =====  =================================================================
  Num    Key (these are defined in pyokit.datastruct.multipleAlignment.py)
  =====  =================================================================
  0      ALIG_SCORE_KEY
  1      PCENT_SUBS_KEY
  2      PCENT_S1_INDELS_KEY
  3      PCENT_S2_INDELS_KEY
  4      S1_NAME_KEY
  5      S1_START_KEY
  6      S1_END_KEY
  7      S1_END_NEG_STRAND_KEY
  8      S2_REVERSE_COMP_KEY
  8/9    S2_NAME_KEY
  9/10   S2_START_KEY (S2 + strand) / S2_START_NEG_STRAND_KEY (S2 - strand)
  10/11  S2_END_KEY (S2 + strand) / S2_START_KEY (S2 - strand)
  11/12  S2_END_NEG_STRAND_KEY (S2 + strand) / S2_END_KEY (S2 - strand)
  12/13  UNKNOWN_RM_HEADER_FIELD_KEY
  13/14  RM_ID_KEY
  =====  =================================================================

  :param parts:     the header line, as a tokenized list.
  :param meta_data: dictionary; resultant key-value pairs placed into this.
  """
  meta_data[ALIG_SCORE_KEY] = parts[0]
  meta_data[PCENT_SUBS_KEY] = float(parts[1])
  meta_data[PCENT_S1_INDELS_KEY] = float(parts[2])
  meta_data[PCENT_S2_INDELS_KEY] = float(parts[3])
  meta_data[ANNOTATION_KEY] = ""

  if parts[8] == "C":
    meta_data[UNKNOWN_RM_HEADER_FIELD_KEY] = parts[13]
    meta_data[RM_ID_KEY] = int(parts[14])
  else:
    meta_data[UNKNOWN_RM_HEADER_FIELD_KEY] = parts[12]
    meta_data[RM_ID_KEY] = int(parts[13])