From 6399c73c98723a2a2c477d562d21102287ede0b8 Mon Sep 17 00:00:00 2001 From: Peter-J-Freeman Date: Tue, 11 Aug 2026 17:09:21 +0100 Subject: [PATCH 1/5] Files with minimal changes --- README.md | 2 +- VariantValidator/modules/exon_numbering.py | 27 +- VariantValidator/modules/expanded_repeats.py | 200 +- VariantValidator/modules/methyl_syntax.py | 12 +- VariantValidator/modules/seq_data.py | 6633 ++++++++--------- tests/variantvalidator/test_inputs_ensembl.py | 638 -- 6 files changed, 3400 insertions(+), 4112 deletions(-) delete mode 100644 tests/variantvalidator/test_inputs_ensembl.py diff --git a/README.md b/README.md index 9cb0e306..048dbe9b 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ Community engagement and collaboration with partner projects play a vital role i --- -## Features +## Key Features VariantValidator provides comprehensive support for validating, mapping and formatting genetic sequence variant descriptions. diff --git a/VariantValidator/modules/exon_numbering.py b/VariantValidator/modules/exon_numbering.py index e5263848..6da9364c 100644 --- a/VariantValidator/modules/exon_numbering.py +++ b/VariantValidator/modules/exon_numbering.py @@ -1,22 +1,7 @@ -""" -exon_numbering.py Module - -Authors: Katie Williams (@kwi11iams) and Katherine Winfield (@kjwinfield) - -This code will ultimately aim to provide exon numbering information for -VariantValidator. - -See exon_numbering.md markdown for a full description on how this -module operates. - -Use exon_numbering_tests.py for automated testing of this module. -""" - # Import vv_hgvs modules import vvhgvs import vvhgvs.exceptions - def _find_exon(position, exon_structure): """ Find the exon or intron containing an HGVS transcript position. @@ -58,10 +43,8 @@ def _find_exon(position, exon_structure): return f'{exon["exon_number"] - 1}i' return None - return None - def finds_exon_number(variant, validator): """ Find exon/intron numbering for the start and end positions of a variant. @@ -71,13 +54,11 @@ def finds_exon_number(variant, validator): :return: dictionary containing start/end exon or intron numbers for each aligned chromosomal or gene reference sequence """ - response_dictionary = validator.gene2transcripts( variant, validator, bypass_web_searches=True ) - # Find the transcript record corresponding to the submitted transcript. transcript_info = None @@ -100,8 +81,7 @@ def finds_exon_number(variant, validator): start_position = hgvs_transcript.posedit.pos.start end_position = hgvs_transcript.posedit.pos.end - - exon_start_end_positions = {} + exon_start_and_end_positions = {} for accession, transcript_data in exon_structure_dict.items(): exon_structure = transcript_data["exon_structure"] @@ -122,13 +102,12 @@ def finds_exon_number(variant, validator): if end_exon is None: end_exon = "cannot be calculated" - exon_start_end_positions[accession] = { + exon_start_and_end_positions[accession] = { "start_exon": start_exon, "end_exon": end_exon, } - return exon_start_end_positions - + return exon_start_and_end_positions # Copyright (C) 2016-2026 VariantValidator Contributors # This file is part of VariantValidator and is distributed under the diff --git a/VariantValidator/modules/expanded_repeats.py b/VariantValidator/modules/expanded_repeats.py index a7927bba..5ec68f1c 100644 --- a/VariantValidator/modules/expanded_repeats.py +++ b/VariantValidator/modules/expanded_repeats.py @@ -36,33 +36,22 @@ class RepeatSyntaxError(Exception): 'V': r'[ACG]', # A or C or G (not T) 'N': r'[ACGT]', # Any base (A or C or G or T) } -class TandemRepeats: - """Represent and process an expanded tandem-repeat variant.""" - def __init__( - self, - reference, - prefix, - variant_position, - repeat_sequence, - copy_number, - after_the_bracket, - build, - select_transcripts, - variant_str, - map_dat=False - ): +class TandemRepeats: # Set up class + """Represent and process an expanded tandem-repeat variant.""" + def __init__(self, reference, prefix, variant_position, repeat_sequence, copy_number, after_the_bracket, build, + select_transcripts, variant_str, map_dat=False): """Initialise an expanded repeat and its mapping state.""" - self.reference = reference - self.intronic_g_reference = False - self.prefix = prefix - self.variant_position = variant_position - self.repeat_sequence = repeat_sequence - self.copy_number = copy_number - self.after_the_bracket = after_the_bracket - self.build = build - self.select_transcripts = select_transcripts - self.variant_str = variant_str + self.reference = reference # Reference sequence/accession (e.g. NM_, NC_, NG_) + self.intronic_g_reference = False # Genomic reference accession used for intronic variants + self.prefix = prefix # HGVS coordinate type (g, n, or c) + self.variant_position = variant_position # HGVS position/interval of the repeat + self.repeat_sequence = repeat_sequence # Sequence motif being repeated + self.copy_number = copy_number # Number of repeat units specified in the input + self.after_the_bracket = after_the_bracket # Any content appearing after the repeat copy-number bracket + self.build = build # Genome assembly used for mapping (e.g. GRCh37/GRCh38) + self.select_transcripts = select_transcripts # Transcript-selection mode/accessions + self.variant_str = variant_str # Original HGVS variant string supplied by the caller self._c_to_n_tx_maper = None # only valid for c<->n type mappings self.g_strand = 1 # only valid for intronic +/-1 self.evm = False @@ -73,22 +62,15 @@ def __init__( self.genomic_conversion = None self.original_position = None self.reference_sequence_bases = None + self._wobble_bases_map = _wobble_bases_map # Define the wobble bases map with proper regex - # Define the wobble bases map with proper regex - self._wobble_bases_map = _wobble_bases_map - - @classmethod + @classmethod # Setup Class method to parse the expanded repeat variant string def parse_repeat_variant(cls, variant_str, build, select_transcripts, validator): """Parse expanded-repeat syntax and return a populated instance.""" - logger.info(f"Parsing variant: parse_repeat_variant({variant_str})") - # Strip any whitespace - variant_str = variant_str.strip() - - # Check if square brackets included which indicate tandem repeat - # variant - - if '[' in variant_str or ']' in variant_str: + logger.debug(f"Parsing variant with parse_repeat_variant: {variant_str}") + variant_str = variant_str.strip() # Strip any whitespace + if '[' in variant_str or ']' in variant_str: # Check if square brackets included which indicate tandem repeat variant if not ( '[' in variant_str and ']' in variant_str ): raise RepeatSyntaxError( f"RepeatSyntaxError: This variant {variant_str} contains a square bracket " @@ -105,13 +87,16 @@ def parse_repeat_variant(cls, variant_str, build, select_transcripts, validator) # Find reference sequence used (g, n, c etc.) prefix, _sep, pos_edit = suffix.partition(".") prefix = prefix.lower() + # Get position/span by extracting the bit between '.' and [ e.g. 1ACT pos_and_seq, _sep, post_bracket = pos_edit.partition("[") rep_seq = re.search("[AaCcTtGgUuMmNnRrYyKkSsWwHhBbVvDd]+", pos_and_seq) + if not rep_seq: raise RepeatSyntaxError( "RepeatSyntaxError: Ensure that the repeated sequence is included between " "the variant position and the number of repeat units, e.g. g.1_3ACT[20]") + for char in pos_and_seq: if char.isalpha(): if char not in "AaCcTtGgUuMmNnRrYyKkSsWwHhBbVvDd": @@ -119,7 +104,8 @@ def parse_repeat_variant(cls, variant_str, build, select_transcripts, validator) "RepeatSyntaxError: Please ensure the repeated sequence includes" " only Aa, Cc, Tt, Gg, Uu or a valid IUPAC nucleotide code from " "https://genome.ucsc.edu/goldenPath/help/iupac.html") - repeat_sequence = rep_seq.group() + + repeat_sequence = rep_seq.group() # Extract the matched repeat sequence from the regex match variant_position = pos_and_seq[:rep_seq.start()] if prefix == 'g': if '_' in variant_position: @@ -144,85 +130,58 @@ def parse_repeat_variant(cls, variant_str, build, select_transcripts, validator) start=variant_position[0], end=variant_position[1]) - # Get number of unit repeats + # Get number of repeat units copy_number, _sep, after_the_bracket = post_bracket.partition("]") - # Save anything after bracket so that mixed repeats are supported in future + # Save anything after the bracket so that mixed repeats are supported in future if not after_the_bracket: - after_the_bracket = "" - else: - logger.info( + after_the_bracket = '' + + else: # Not the allele format + logger.debug( "Unable to identify a tandem repeat, if a tandem repeat is " "expected then please check that the format matches HGVS: " - "(https://varnomen.hgvs.org/recommendations/DNA/variant/repeated/)" - ) - return False - # This returns False to VV to indicate no tandem repeats present. - + "(https://varnomen.hgvs.org/recommendations/DNA/variant/repeated/)") + return False # This returns False to VV to indicate no tandem repeats present. if reference.startswith("LRG"): if "t" in reference: reference = validator.db.get_refseq_transcript_id_from_lrg_transcript_id(reference) else: reference = validator.db.get_refseq_id_from_lrg_id(reference) - return cls( - reference, - prefix, - variant_position, - repeat_sequence, - copy_number, - after_the_bracket, - build, - select_transcripts, - variant_str, - ) + return cls(reference, prefix, variant_position, repeat_sequence, copy_number, after_the_bracket, build, + select_transcripts, variant_str) + + def reformat_reference(self): # Reformats the reference sequence ID + + logger.debug(f"Reformatting reference ID: reformat_reference({self.reference})") - def reformat_reference(self): - """Reformats the reference sequence name""" - logger.info(f"Reformatting reference: reformat_reference({self.reference})") if self.reference.startswith("ENS") or self.reference.startswith("N"): - assert ( - "." in self.reference - ), """Please ensure the transcript or gene version is included - following a '.' after the transcript - or gene name e.g. ENST00000357033.8""" - return self.reference - - def check_genomic_or_coding(self): - """Check that the HGVS prefix matches the reference type.""" - logger.info( - f"Checking prefix is consistent with reference: "\ - f"check_genomic_or_coding({self.reference},{self.prefix})" - ) + assert ("." in self.reference), """Please ensure the transcript or gene version is included following a '.' + after the transcript or gene name e.g. ENST00000357033.8""" + + return self.reference # Return reformatted reference + + def check_genomic_or_coding(self): # Check that the HGVS prefix matches the reference type. + logger.debug(f"Checking prefix is consistent with reference: check_genomic_or_coding({self.reference}," + f"{self.prefix})") + if self.reference.startswith("ENST"): - assert ( - self.prefix == "c" - ), """Please ensure variant type is coding - if an Ensembl transcript is provided""" + assert (self.prefix == "c"), """Please ensure variant type is coding if an Ensembl transcript is provided""" elif self.reference.startswith("NM"): - assert ( - self.prefix == "c" - ), """Please ensure variant type is coding - if a RefSeq transcript is provided""" + assert (self.prefix == "c"), """Please ensure variant type is coding if a RefSeq transcript is provided""" elif self.reference.startswith("NC"): - assert ( - self.prefix == "g" - ), "Please ensure variant type is genomic if RefSeq chromosome is used" + assert (self.prefix == "g"), "Please ensure variant type is genomic if RefSeq chromosome is used" elif self.reference.startswith("NG"): - assert ( - self.prefix == "g" - ), "Please ensure variant type is genomic if RefSeq gene is used" + assert (self.prefix == "g"), "Please ensure variant type is genomic if RefSeq gene is used" elif self.reference.startswith("NR"): - assert ( - self.prefix == "n" - ), "Please ensure variant type is non-coding if NR transcript is used" + assert (self.prefix == "n"), "Please ensure variant type is non-coding if NR transcript is used" def check_positions_given(self, validator): """Check that the stated repeat range matches the reference sequence.""" - logger.info( - f"Checking range given: "\ - f"check_positions_given({self.repeat_sequence}, "\ - f"{str(self.variant_position)}, {self.copy_number})" - ) + logger.debug( + f"Checking range given: check_positions_given({self.repeat_sequence}, {str(self.variant_position)}, " + f"{self.copy_number})") + ref = self.reference if self.intronic_g_reference: ref = self.intronic_g_reference @@ -230,7 +189,7 @@ def check_positions_given(self, validator): ref, self.variant_position.start.base-1, self.variant_position.end.base) - logger.info(f"Reference repeat sequence: {reference_repeat_sequence}") + logger.debug(f"Reference repeat sequence: {reference_repeat_sequence}") # Check if the length of reference_repeat_sequence is a multiple of the length of query_str if len(reference_repeat_sequence) % len(self.repeat_sequence) != 0: @@ -247,7 +206,7 @@ def check_positions_given(self, validator): match = regex.search(reference_repeat_sequence) try: match.group() - logger.info(f"Regex matched {match.group()}") + logger.debug(f"Regex matched {match.group()}") self.reference_sequence_bases = match.group() return except AttributeError: @@ -308,14 +267,14 @@ def get_range_from_single_or_start_pos(self, validator): end_pos = self.variant_position.end if isinstance(self.variant_position, BaseOffsetInterval) and ( start_pos.offset or end_pos.offset): - logger.info( + logger.debug( "Re-fetching the range using adaptions for exon handling " + f"using the range {str(self.variant_position)} with a " + f"copy number of {self.copy_number} and repeat of "+ self.repeat_sequence ) elif end_pos: - logger.info( + logger.debug( "Re-fetching the range from the start position of a given " + f"range using {start_pos} from {str(self.variant_position)} with a" + f" copy number of {self.copy_number} and repeat of "+ @@ -442,7 +401,8 @@ def get_range_from_single_or_start_pos(self, validator): self.genomic_conversion.posedit.edit.alt = "" self.genomic_conversion.posedit.pos.start.base = ref_start_position self.genomic_conversion.posedit.pos.end.base = ref_end_position - return full_range + + return full_range # Return the relevant range def build_regex(self, sequence): """Convert an IUPAC-coded sequence into a regex pattern.""" @@ -457,7 +417,7 @@ def check_reference_sequence(self, validator, within_ref_pos): if self.intronic_g_reference: ref = self.intronic_g_reference requested_sequence = validator.sf.fetch_seq(ref, start, end) - logger.info(f"Requested sequence: {requested_sequence} from {ref} at {start}-{end}") + logger.debug(f"Requested sequence: {requested_sequence} from {ref} at {start}-{end}") # Critical, do not use cached regex regex = self.build_regex(self.repeat_sequence) @@ -478,10 +438,9 @@ def get_reference_range(self, validator, within_ref_pos): ref = self.reference if self.intronic_g_reference: ref = self.intronic_g_reference - logger.info( + logger.debug( f"Getting the full range of the variant: " - f"get_reference_range({ref}, {str(self.variant_position)})" - ) + f"get_reference_range({ref}, {str(self.variant_position)})") # Get the full range of the reference repeat sequence start_position = None @@ -522,20 +481,18 @@ def get_reference_range(self, validator, within_ref_pos): return start_position, end_position def reformat(self, validator): - """Reformats and returns final formatted variant as a string""" - logger.info( - f"Reformatting variant: reformat({self.repeat_sequence}, "\ - f"{self.after_the_bracket}, "\ - f"{self.prefix}, {str(self.variant_position)}, {self.copy_number})" - ) + """Reformats and returns formatted variant as a string""" + logger.debug( + f"Reformatting variant: reformat({self.repeat_sequence}, {self.after_the_bracket}, {self.prefix}, " + f"{str(self.variant_position)}, {self.copy_number})") if not self.copy_number.isdecimal(): raise RepeatSyntaxError( "RepeatSyntaxError: The number of repeat units included between" " square brackets must be numeric") - # Update the repeated sequence to be upper case - self.repeat_sequence = self.repeat_sequence.upper() + self.repeat_sequence = self.repeat_sequence.upper() # Update the repeated sequence to upper case + # test for non-matching chars if re.search("[^ACTGUMRYKSWHBVDN]", self.repeat_sequence): raise RepeatSyntaxError( @@ -543,12 +500,11 @@ def reformat(self, validator): " includes only Aa, Cc, Tt, Gg, Uu or a valid IUPAC nucleotide code from " "https://genome.ucsc.edu/goldenPath/help/iupac.html") - if self.after_the_bracket != "": + if self.after_the_bracket != "": # Check for text after the brackets raise RepeatSyntaxError( f"No information should be included after " f"the number of repeat units. " - f"Currently '{self.after_the_bracket}'' is included. " - ) + f"Currently '{self.after_the_bracket}'' is included. ") if isinstance(self.variant_position, BaseOffsetInterval) and ( self.variant_position.start.offset or self.variant_position.end.offset): @@ -601,7 +557,7 @@ def _get_c_tx_info(self,validator): def convert_n_to_c_coordinates(self): """Convert n. coordinates to c. coordinates when required.""" - logger.info( + logger.debug( "Applying c type offset to n type coordinates: " + f"convert_n_to_c_coordinates({str(self.variant_position)})" ) @@ -613,7 +569,7 @@ def convert_c_to_n_coordinates(self, pos=None): """Convert c. coordinates to n. coordinates when required.""" if pos is None: pos = self.variant_position - logger.info( + logger.debug( f"Removing offset: remove_offset({str(self.variant_position)})" ) if not self.prefix == 'c': @@ -629,7 +585,7 @@ def reverse_complement(self, dna_seq): def check_exon_boundaries(self,validator): """Validate intronic positions against transcript exon boundaries.""" - logger.info( + logger.debug( "Checking intronic variant boundaries: "+ f"check_exon_boundaries({str(self.original_position)})" ) @@ -680,7 +636,7 @@ def check_exon_pos(exon_pos): def convert_tandem(variant, validator, build, select_transcripts): """Parse and store expanded-repeat data on a Variant object.""" - logger.info( + logger.debug( "Parsing expanded repeat variant from %s", variant.quibble ) @@ -707,7 +663,7 @@ def convert_tandem(variant, validator, build, select_transcripts): "reference_sequence_bases": expanded_variant.reference_sequence_bases, } - logger.info( + logger.debug( "variant.expanded_repeat: %s", variant.expanded_repeat ) diff --git a/VariantValidator/modules/methyl_syntax.py b/VariantValidator/modules/methyl_syntax.py index 0f4dd074..a6aa1b9e 100644 --- a/VariantValidator/modules/methyl_syntax.py +++ b/VariantValidator/modules/methyl_syntax.py @@ -1,16 +1,16 @@ - -def methyl_syntax(my_variant): - """ +def methyl_syntax( + my_variant +): + ''' Remove and store a methylation syntax suffix before HGVS object parsing. - :param my_variant: + :param my_variant object: :return: Updated variant if methylation syntax is detected, otherwise None. - """ + ''' quibble = my_variant.quibble if "|" not in quibble: return None - if "|gom" in quibble: my_variant.reformat_output = "|gom" elif "|lom" in quibble: diff --git a/VariantValidator/modules/seq_data.py b/VariantValidator/modules/seq_data.py index fc6deb9b..68d311aa 100644 --- a/VariantValidator/modules/seq_data.py +++ b/VariantValidator/modules/seq_data.py @@ -1,3327 +1,3319 @@ -""" seq_data.py +''' seq_data.py Contains all the necessary functions for matching RefSeq accessions with chromosome numbers -or alt loci names based on genome builds for fast mapping""" +or alt loci names based on genome builds for fast mapping''' # # Dicts are created at load time for speed # Dict Creation _get_accession_GRCh37 = { - "1": "NC_000001.10", - "2": "NC_000002.11", - "3": "NC_000003.11", - "4": "NC_000004.11", - "5": "NC_000005.9", - "6": "NC_000006.11", - "7": "NC_000007.13", - "8": "NC_000008.10", - "9": "NC_000009.11", - "10": "NC_000010.10", - "11": "NC_000011.9", - "12": "NC_000012.11", - "13": "NC_000013.10", - "14": "NC_000014.8", - "15": "NC_000015.9", - "16": "NC_000016.9", - "17": "NC_000017.10", - "18": "NC_000018.9", - "19": "NC_000019.9", - "20": "NC_000020.10", - "21": "NC_000021.8", - "22": "NC_000022.10", - "23": "NC_000023.10", - "24": "NC_000024.9", - "x": "NC_000023.10", - "y": "NC_000024.9", - "X": "NC_000023.10", - "Y": "NC_000024.9", - "M": "NC_012920.1", - "m": "NC_012920.1", - "MT": "NC_012920.1", - "mt": "NC_012920.1", - # UCSC alts - "11_GL000202_RANDOM": "NT_113921.2", - "17_CTG5_HAP1": "NT_167251.1", - "17_GL000203_RANDOM": "NT_113941.1", - "17_GL000204_RANDOM": "NT_113943.1", - "17_GL000205_RANDOM": "NT_113930.1", - "17_GL000206_RANDOM": "NT_113945.1", - "18_GL000207_RANDOM": "NT_113947.1", - "19_GL000208_RANDOM": "NT_113948.1", - "19_GL000209_RANDOM": "NT_113949.1", - "1_GL000191_RANDOM": "NT_113878.1", - "1_GL000192_RANDOM": "NT_167207.1", - "21_GL000210_RANDOM": "NT_113950.2", - "4_CTG9_HAP1": "NT_167250.1", - "4_GL000193_RANDOM": "NT_113885.1", - "4_GL000194_RANDOM": "NT_113888.1", - "6_APD_HAP1": "NT_167244.1", - "6_COX_HAP2": "NT_113891.2", - "6_DBB_HAP3": "NT_167245.1", - "6_MANN_HAP4": "NT_167246.1", - "6_MCF_HAP5": "NT_167247.1", - "6_QBL_HAP6": "NT_167248.1", - "6_SSTO_HAP7": "NT_167249.1", - "7_GL000195_RANDOM": "NT_113901.1", - "8_GL000196_RANDOM": "NT_113909.1", - "8_GL000197_RANDOM": "NT_113907.1", - "9_GL000198_RANDOM": "NT_113914.1", - "9_GL000199_RANDOM": "NT_113916.2", - "9_GL000200_RANDOM": "NT_113915.1", - "9_GL000201_RANDOM": "NT_113911.1", - "UN_GL000211": "NT_113961.1", - "UN_GL000212": "NT_113923.1", - "UN_GL000213": "NT_167208.1", - "UN_GL000214": "NT_167209.1", - "UN_GL000215": "NT_167210.1", - "UN_GL000216": "NT_167211.1", - "UN_GL000217": "NT_167212.1", - "UN_GL000218": "NT_113889.1", - "UN_GL000219": "NT_167213.1", - "UN_GL000220": "NT_167214.1", - "UN_GL000221": "NT_167215.1", - "UN_GL000222": "NT_167216.1", - "UN_GL000223": "NT_167217.1", - "UN_GL000224": "NT_167218.1", - "UN_GL000225": "NT_167219.1", - "UN_GL000226": "NT_167220.1", - "UN_GL000227": "NT_167221.1", - "UN_GL000228": "NT_167222.1", - "UN_GL000229": "NT_167223.1", - "UN_GL000230": "NT_167224.1", - "UN_GL000231": "NT_167225.1", - "UN_GL000232": "NT_167226.1", - "UN_GL000233": "NT_167227.1", - "UN_GL000234": "NT_167228.1", - "UN_GL000235": "NT_167229.1", - "UN_GL000236": "NT_167230.1", - "UN_GL000237": "NT_167231.1", - "UN_GL000238": "NT_167232.1", - "UN_GL000239": "NT_167233.1", - "UN_GL000240": "NT_167234.1", - "UN_GL000241": "NT_167235.1", - "UN_GL000242": "NT_167236.1", - "UN_GL000243": "NT_167237.1", - "UN_GL000244": "NT_167238.1", - "UN_GL000245": "NT_167239.1", - "UN_GL000246": "NT_167240.1", - "UN_GL000247": "NT_167241.1", - "UN_GL000248": "NT_167242.1", - "UN_GL000249": "NT_167243.1", - # GRC Alts - 'HG1472_PATCH': 'NW_004070864.2', - 'HG989_PATCH': 'NW_003571030.1', - 'HG1292_PATCH': 'NW_003871056.3', - 'HG1287_PATCH': 'NW_003871055.3', - 'HSCHR1_1_CTG31': 'NW_003315905.1', - 'HSCHR1_2_CTG31': 'NW_003315906.1', - 'HSCHR1_3_CTG31': 'NW_003315907.1', - 'HG1471_PATCH': 'NW_004070863.1', - 'HG1293_PATCH': 'NW_003871057.1', - 'HG1473_PATCH': 'NW_004070865.1', - 'HG999_1_PATCH': 'NW_003315903.1', - 'HG999_2_PATCH': 'NW_003315904.1', - 'HSCHR2_1_CTG1': 'NW_003315908.1', - 'HG953_PATCH': 'NW_004504299.1', - 'HG686_PATCH': 'NW_003571032.1', - 'HSCHR2_2_CTG12': 'NW_003571033.2', - 'HSCHR2_1_CTG12': 'NW_003315909.1', - 'HG1007_PATCH': 'NW_003571031.1', - 'HSCHR3_1_CTG1': 'NW_003871060.1', - 'HG325_PATCH': 'NW_003871059.1', - 'HG186_PATCH': 'NW_003315910.1', - 'HG957_PATCH': 'NW_004775426.1', - 'HG280_PATCH': 'NW_003315911.1', - 'HG1091_PATCH': 'NW_003871058.1', - 'HG991_PATCH': 'NW_003315912.1', - 'HSCHR3_1_CTG2_1': 'NW_003315913.1', - 'HG174_HG254_PATCH': 'NW_004775427.1', - 'HSCHR4_1_CTG6': 'NW_003315915.1', - 'HSCHR4_2_CTG9': 'NW_003315916.1', - 'HG706_PATCH': 'NW_003571035.1', - 'HSCHR4_1_CTG12': 'NW_003315914.1', - 'HG1032_PATCH': 'NW_003571034.1', - 'HSCHR5_2_CTG1': 'NW_003315920.1', - 'HSCHR5_3_CTG1': 'NW_003571036.1', - 'HSCHR5_1_CTG1': 'NW_003315917.2', - 'HSCHR5_1_CTG2': 'NW_003315918.1', - 'HG1063_PATCH': 'NW_003871061.1', - 'HG1082_HG167_PATCH': 'NW_004775428.1', - 'HSCHR5_1_CTG5': 'NW_003315919.1', - 'HG27_PATCH': 'NW_004070866.1', - 'HG1322_PATCH': 'NW_003871063.1', - 'HSCHR6_1_CTG5': 'NW_003315921.1', - 'HG357_PATCH': 'NW_004504300.1', - 'HG1304_PATCH': 'NW_003871062.1', - 'HG193_PATCH': 'NW_004775429.1', - 'HSCHR6_2_CTG5': 'NW_004166862.1', - 'HG736_PATCH': 'NW_003571039.1', - 'HG14_PATCH': 'NW_003571038.1', - 'HG444_PATCH': 'NW_004775430.1', - 'HG1257_PATCH': 'NW_003871064.1', - 'HG946_PATCH': 'NW_003571041.1', - 'HG115_PATCH': 'NW_003571037.1', - 'HG1308_PATCH': 'NW_003871065.1', - 'HSCHR7_1_CTG6': 'NW_003315922.2', - 'HG7_PATCH': 'NW_003571040.1', - 'HG19_PATCH': 'NW_003571042.1', - 'HG1699_PATCH': 'NW_004775431.1', - 'HG418_PATCH': 'NW_003871066.2', - 'HG104_HG975_PATCH': 'NW_003315923.1', - 'HG243_PATCH': 'NW_003315924.1', - 'HSCHR9_1_CTG1': 'NW_003315928.1', - 'HG962_PATCH': 'NW_003871067.1', - 'HSCHR9_1_CTG35': 'NW_003315929.1', - 'HSCHR9_2_CTG35': 'NW_003315930.1', - 'HSCHR9_3_CTG35': 'NW_003315931.1', - 'HG50_PATCH': 'NW_004504301.1', - 'HG1502_PATCH': 'NW_004070869.1', - 'HG79_PATCH': 'NW_003315925.1', - 'HG1500_PATCH': 'NW_004070867.1', - 'HG1501_PATCH': 'NW_004070868.1', - 'HG998_1_PATCH': 'NW_003315926.1', - 'HG998_2_PATCH': 'NW_003315927.1', - 'HG905_PATCH': 'NW_003571043.1', - 'HG871_PATCH': 'NW_003871071.1', - 'HG544_PATCH': 'NW_003315932.1', - 'HSCHR10_1_CTG2': 'NW_003315934.1', - 'HSCHR10_1_CTG5': 'NW_003315935.1', - 'HG1211_PATCH': 'NW_003871068.1', - 'HG1074_PATCH': 'NW_004504302.1', - 'HG339_PATCH': 'NW_003871070.1', - 'HG979_PATCH': 'NW_004775432.1', - 'HG311_PATCH': 'NW_003871069.1', - 'HG995_PATCH': 'NW_003315933.1', - 'HG1479_PATCH': 'NW_004070870.1', - 'HG256_PATCH': 'NW_003871075.1', - 'HG873_PATCH': 'NW_003871082.1', - 'HSCHR11_1_CTG1_1': 'NW_003315936.1', - 'HG281_PATCH': 'NW_003571045.1', - 'HG142_HG150_NOVEL_TEST': 'NW_003871073.1', - 'HG151_NOVEL_TEST': 'NW_003871074.1', - 'HG536_PATCH': 'NW_003571046.1', - 'HG865_PATCH': 'NW_004070871.1', - 'HG414_PATCH': 'NW_003871081.1', - 'HG348_PATCH': 'NW_003871079.1', - 'HG305_PATCH': 'NW_003871077.1', - 'HG388_HG400_PATCH': 'NW_003871080.1', - 'HG306_PATCH': 'NW_003871078.1', - 'HG122_PATCH': 'NW_003871072.2', - 'HG299_PATCH': 'NW_003871076.1', - 'HG858_PATCH': 'NW_003571048.1', - 'HSCHR12_1_CTG1': 'NW_003571049.1', - 'HG344_PATCH': 'NW_003871083.2', - 'HG1133_PATCH': 'NW_003571047.1', - 'HSCHR12_2_CTG2': 'NW_003571050.1', - 'HSCHR12_1_CTG2': 'NW_003315938.1', - 'HSCHR12_1_CTG2_1': 'NW_003315939.1', - 'HSCHR12_2_CTG2_1': 'NW_003315941.1', - 'HSCHR12_3_CTG2_1': 'NW_003315942.2', - 'HG1595_PATCH': 'NW_004504303.2', - 'HSCHR12_1_CTG5': 'NW_003315940.1', - 'HG996_PATCH': 'NW_003315937.1', - 'HG531_PATCH': 'NW_003571051.1', - 'HG1592_PATCH': 'NW_004166863.1', - 'HSCHR15_1_CTG4': 'NW_003315943.1', - 'HSCHR15_1_CTG8': 'NW_003315944.1', - 'HG971_PATCH': 'NW_003871084.1', - 'HSCHR16_1_CTG3_1': 'NW_003315945.1', - 'HG1208_PATCH': 'NW_003871085.1', - 'HSCHR16_2_CTG3_1': 'NW_003315946.1', - 'HG417_PATCH': 'NW_004070872.2', - 'HSCHR17_1_CTG1': 'NW_003315952.2', - 'HG990_PATCH': 'NW_003315951.1', - 'HG987_PATCH': 'NW_003315950.2', - 'HG1591_PATCH': 'NW_004775433.1', - 'HG883_PATCH': 'NW_003871090.1', - 'HG385_PATCH': 'NW_004166864.2', - 'HG75_PATCH': 'NW_003315949.1', - 'HG745_PATCH': 'NW_003315948.2', - 'HSCHR17_4_CTG4': 'NW_003871091.1', - 'HSCHR17_6_CTG4': 'NW_003871093.1', - 'HSCHR17_5_CTG4': 'NW_003871092.1', - 'HSCHR17_1_CTG4': 'NW_003315953.1', - 'HG185_PATCH': 'NW_003571052.1', - 'HG1146_PATCH': 'NW_003871086.1', - 'HG183_PATCH': 'NW_003315947.1', - 'HG747_PATCH': 'NW_003871088.1', - 'HSCHR17_2_CTG4': 'NW_003315954.1', - 'HSCHR17_3_CTG4': 'NW_003315955.1', - 'HG748_PATCH': 'NW_003871089.1', - 'HG271_PATCH': 'NW_003871087.1', - 'HSCHR18_1_CTG1_1': 'NW_003315956.1', - 'HSCHR18_2_CTG1_1': 'NW_003315959.1', - 'HSCHR18_2_CTG2': 'NW_003315960.1', - 'HSCHR18_1_CTG2': 'NW_003315957.1', - 'HSCHR18_1_CTG2_1': 'NW_003315958.1', - 'HSCHR18_2_CTG2_1': 'NW_003315961.1', - 'HG729_PATCH': 'NW_003871094.1', - 'HG730_PATCH': 'NW_003571053.2', - 'HSCHR19_1_CTG3': 'NW_003315962.1', - 'HSCHR19_2_CTG3': 'NW_003315964.2', - 'HSCHR19_3_CTG3': 'NW_003315965.1', - 'HSCHR19_1_CTG3_1': 'NW_003315963.1', - 'HG1350_HG959_PATCH': 'NW_004775434.1', - 'HG1079_PATCH': 'NW_004166865.1', - 'HSCHR19LRC_COX1_CTG1': 'NW_003571054.1', - 'HSCHR19LRC_COX2_CTG1': 'NW_003571055.1', - 'HSCHR19LRC_LRC_I_CTG1': 'NW_003571056.1', - 'HSCHR19LRC_LRC_J_CTG1': 'NW_003571057.1', - 'HSCHR19LRC_LRC_S_CTG1': 'NW_003571058.1', - 'HSCHR19LRC_LRC_T_CTG1': 'NW_003571059.1', - 'HSCHR19LRC_PGF1_CTG1': 'NW_003571060.1', - 'HSCHR19LRC_PGF2_CTG1': 'NW_003571061.1', - 'HSCHR20_1_CTG1': 'NW_003315966.1', - 'HG144_PATCH': 'NW_003871095.1', - 'HG944_PATCH': 'NW_004504304.1', - 'HG506_HG507_HG1000_PATCH': 'NW_003571063.2', - 'HSCHR21_1_CTG1_1': 'NW_003315967.1', - 'HSCHR21_2_CTG1_1': 'NW_003315968.1', - 'HSCHR21_3_CTG1_1': 'NW_003315969.1', - 'HSCHR21_4_CTG1_1': 'NW_003315970.1', - 'HG237_PATCH': 'NW_004775435.1', - 'HG1487_PATCH': 'NW_004070874.1', - 'HG1486_PATCH': 'NW_004070873.1', - 'HG1488_PATCH': 'NW_004070875.1', - 'HG329_PATCH': 'NW_003871096.1', - 'HSCHR22_1_CTG2': 'NW_003315972.1', - 'HSCHR22_1_CTG1': 'NW_003315971.2', - 'HSCHR22_2_CTG1': 'NW_004504305.1', - 'HG497_PATCH': 'NW_004070876.1', - 'HG480_HG481_PATCH': 'NW_003571064.2', - 'HG1423_PATCH': 'NW_003871098.1', - 'HG1424_PATCH': 'NW_003871099.1', - 'HG1435_PATCH': 'NW_004070879.1', - 'HG29_PATCH': 'NW_004166866.1', - 'HG1436_HG1432_PATCH': 'NW_004070880.2', - 'HG1433_PATCH': 'NW_004070877.1', - 'HG1437_PATCH': 'NW_004070881.1', - 'HG1438_PATCH': 'NW_004070882.1', - 'HG1425_PATCH': 'NW_003871100.1', - 'HG1426_PATCH': 'NW_003871101.3', - 'HG1439_PATCH': 'NW_004070883.1', - 'HG1440_PATCH': 'NW_004070884.1', - 'HG1441_PATCH': 'NW_004070885.1', - 'HG375_PATCH': 'NW_003871102.1', - 'HG1434_PATCH': 'NW_004070878.1', - 'HG1462_PATCH': 'NW_004070891.1', - 'HG1463_PATCH': 'NW_004070892.1', - 'HG1490_PATCH': 'NW_004070893.1', - 'HG1442_PATCH': 'NW_004070886.1', - 'HG1443_HG1444_PATCH': 'NW_004070887.1', - 'HG1453_PATCH': 'NW_004070888.1', - 'HG1458_PATCH': 'NW_004070889.1', - 'HG1459_PATCH': 'NW_004070890.2', - 'HG1497_PATCH': 'NW_003871103.3', - 'HSCHR6_MHC_APD_CTG1': 'NT_167244.1', - 'HSCHR6_MHC_COX_CTG1': 'NT_113891.2', - 'HSCHR6_MHC_DBB_CTG1': 'NT_167245.1', - 'HSCHR6_MHC_MANN_CTG1': 'NT_167246.1', - 'HSCHR6_MHC_MCF_CTG1': 'NT_167247.1', - 'HSCHR6_MHC_QBL_CTG1': 'NT_167248.1', - 'HSCHR6_MHC_SSTO_CTG1': 'NT_167249.1', - 'HSCHR4_1_CTG9': 'NT_167250.1', - 'HSCHR17_1_CTG5': 'NT_167251.1', -} + '1': 'NC_000001.10', + '2': 'NC_000002.11', + '3': 'NC_000003.11', + '4': 'NC_000004.11', + '5': 'NC_000005.9', + '6': 'NC_000006.11', + '7': 'NC_000007.13', + '8': 'NC_000008.10', + '9': 'NC_000009.11', + '10': 'NC_000010.10', + '11': 'NC_000011.9', + '12': 'NC_000012.11', + '13': 'NC_000013.10', + '14': 'NC_000014.8', + '15': 'NC_000015.9', + '16': 'NC_000016.9', + '17': 'NC_000017.10', + '18': 'NC_000018.9', + '19': 'NC_000019.9', + '20': 'NC_000020.10', + '21': 'NC_000021.8', + '22': 'NC_000022.10', + '23': 'NC_000023.10', + '24': 'NC_000024.9', + 'x': 'NC_000023.10', + 'y': 'NC_000024.9', + 'X': 'NC_000023.10', + 'Y': 'NC_000024.9', + 'M': 'NC_012920.1', + 'm': 'NC_012920.1', + 'MT': 'NC_012920.1', + 'mt': 'NC_012920.1', + # UCSC alt IDs + '11_GL000202_RANDOM': 'NT_113921.2', + '17_CTG5_HAP1': 'NT_167251.1', + '17_GL000203_RANDOM': 'NT_113941.1', + '17_GL000204_RANDOM': 'NT_113943.1', + '17_GL000205_RANDOM': 'NT_113930.1', + '17_GL000206_RANDOM': 'NT_113945.1', + '18_GL000207_RANDOM': 'NT_113947.1', + '19_GL000208_RANDOM': 'NT_113948.1', + '19_GL000209_RANDOM': 'NT_113949.1', + '1_GL000191_RANDOM': 'NT_113878.1', + '1_GL000192_RANDOM': 'NT_167207.1', + '21_GL000210_RANDOM': 'NT_113950.2', + '4_CTG9_HAP1': 'NT_167250.1', + '4_GL000193_RANDOM': 'NT_113885.1', + '4_GL000194_RANDOM': 'NT_113888.1', + '6_APD_HAP1': 'NT_167244.1', + '6_COX_HAP2': 'NT_113891.2', + '6_DBB_HAP3': 'NT_167245.1', + '6_MANN_HAP4': 'NT_167246.1', + '6_MCF_HAP5': 'NT_167247.1', + '6_QBL_HAP6': 'NT_167248.1', + '6_SSTO_HAP7': 'NT_167249.1', + '7_GL000195_RANDOM': 'NT_113901.1', + '8_GL000196_RANDOM': 'NT_113909.1', + '8_GL000197_RANDOM': 'NT_113907.1', + '9_GL000198_RANDOM': 'NT_113914.1', + '9_GL000199_RANDOM': 'NT_113916.2', + '9_GL000200_RANDOM': 'NT_113915.1', + '9_GL000201_RANDOM': 'NT_113911.1', + 'UN_GL000211': 'NT_113961.1', + 'UN_GL000212': 'NT_113923.1', + 'UN_GL000213': 'NT_167208.1', + 'UN_GL000214': 'NT_167209.1', + 'UN_GL000215': 'NT_167210.1', + 'UN_GL000216': 'NT_167211.1', + 'UN_GL000217': 'NT_167212.1', + 'UN_GL000218': 'NT_113889.1', + 'UN_GL000219': 'NT_167213.1', + 'UN_GL000220': 'NT_167214.1', + 'UN_GL000221': 'NT_167215.1', + 'UN_GL000222': 'NT_167216.1', + 'UN_GL000223': 'NT_167217.1', + 'UN_GL000224': 'NT_167218.1', + 'UN_GL000225': 'NT_167219.1', + 'UN_GL000226': 'NT_167220.1', + 'UN_GL000227': 'NT_167221.1', + 'UN_GL000228': 'NT_167222.1', + 'UN_GL000229': 'NT_167223.1', + 'UN_GL000230': 'NT_167224.1', + 'UN_GL000231': 'NT_167225.1', + 'UN_GL000232': 'NT_167226.1', + 'UN_GL000233': 'NT_167227.1', + 'UN_GL000234': 'NT_167228.1', + 'UN_GL000235': 'NT_167229.1', + 'UN_GL000236': 'NT_167230.1', + 'UN_GL000237': 'NT_167231.1', + 'UN_GL000238': 'NT_167232.1', + 'UN_GL000239': 'NT_167233.1', + 'UN_GL000240': 'NT_167234.1', + 'UN_GL000241': 'NT_167235.1', + 'UN_GL000242': 'NT_167236.1', + 'UN_GL000243': 'NT_167237.1', + 'UN_GL000244': 'NT_167238.1', + 'UN_GL000245': 'NT_167239.1', + 'UN_GL000246': 'NT_167240.1', + 'UN_GL000247': 'NT_167241.1', + 'UN_GL000248': 'NT_167242.1', + 'UN_GL000249': 'NT_167243.1', + # GRC Alt IDs + "HG1472_PATCH": "NW_004070864.2", + "HG989_PATCH": "NW_003571030.1", + "HG1292_PATCH": "NW_003871056.3", + "HG1287_PATCH": "NW_003871055.3", + "HSCHR1_1_CTG31": "NW_003315905.1", + "HSCHR1_2_CTG31": "NW_003315906.1", + "HSCHR1_3_CTG31": "NW_003315907.1", + "HG1471_PATCH": "NW_004070863.1", + "HG1293_PATCH": "NW_003871057.1", + "HG1473_PATCH": "NW_004070865.1", + "HG999_1_PATCH": "NW_003315903.1", + "HG999_2_PATCH": "NW_003315904.1", + "HSCHR2_1_CTG1": "NW_003315908.1", + "HG953_PATCH": "NW_004504299.1", + "HG686_PATCH": "NW_003571032.1", + "HSCHR2_2_CTG12": "NW_003571033.2", + "HSCHR2_1_CTG12": "NW_003315909.1", + "HG1007_PATCH": "NW_003571031.1", + "HSCHR3_1_CTG1": "NW_003871060.1", + "HG325_PATCH": "NW_003871059.1", + "HG186_PATCH": "NW_003315910.1", + "HG957_PATCH": "NW_004775426.1", + "HG280_PATCH": "NW_003315911.1", + "HG1091_PATCH": "NW_003871058.1", + "HG991_PATCH": "NW_003315912.1", + "HSCHR3_1_CTG2_1": "NW_003315913.1", + "HG174_HG254_PATCH": "NW_004775427.1", + "HSCHR4_1_CTG6": "NW_003315915.1", + "HSCHR4_2_CTG9": "NW_003315916.1", + "HG706_PATCH": "NW_003571035.1", + "HSCHR4_1_CTG12": "NW_003315914.1", + "HG1032_PATCH": "NW_003571034.1", + "HSCHR5_2_CTG1": "NW_003315920.1", + "HSCHR5_3_CTG1": "NW_003571036.1", + "HSCHR5_1_CTG1": "NW_003315917.2", + "HSCHR5_1_CTG2": "NW_003315918.1", + "HG1063_PATCH": "NW_003871061.1", + "HG1082_HG167_PATCH": "NW_004775428.1", + "HSCHR5_1_CTG5": "NW_003315919.1", + "HG27_PATCH": "NW_004070866.1", + "HG1322_PATCH": "NW_003871063.1", + "HSCHR6_1_CTG5": "NW_003315921.1", + "HG357_PATCH": "NW_004504300.1", + "HG1304_PATCH": "NW_003871062.1", + "HG193_PATCH": "NW_004775429.1", + "HSCHR6_2_CTG5": "NW_004166862.1", + "HG736_PATCH": "NW_003571039.1", + "HG14_PATCH": "NW_003571038.1", + "HG444_PATCH": "NW_004775430.1", + "HG1257_PATCH": "NW_003871064.1", + "HG946_PATCH": "NW_003571041.1", + "HG115_PATCH": "NW_003571037.1", + "HG1308_PATCH": "NW_003871065.1", + "HSCHR7_1_CTG6": "NW_003315922.2", + "HG7_PATCH": "NW_003571040.1", + "HG19_PATCH": "NW_003571042.1", + "HG1699_PATCH": "NW_004775431.1", + "HG418_PATCH": "NW_003871066.2", + "HG104_HG975_PATCH": "NW_003315923.1", + "HG243_PATCH": "NW_003315924.1", + "HSCHR9_1_CTG1": "NW_003315928.1", + "HG962_PATCH": "NW_003871067.1", + "HSCHR9_1_CTG35": "NW_003315929.1", + "HSCHR9_2_CTG35": "NW_003315930.1", + "HSCHR9_3_CTG35": "NW_003315931.1", + "HG50_PATCH": "NW_004504301.1", + "HG1502_PATCH": "NW_004070869.1", + "HG79_PATCH": "NW_003315925.1", + "HG1500_PATCH": "NW_004070867.1", + "HG1501_PATCH": "NW_004070868.1", + "HG998_1_PATCH": "NW_003315926.1", + "HG998_2_PATCH": "NW_003315927.1", + "HG905_PATCH": "NW_003571043.1", + "HG871_PATCH": "NW_003871071.1", + "HG544_PATCH": "NW_003315932.1", + "HSCHR10_1_CTG2": "NW_003315934.1", + "HSCHR10_1_CTG5": "NW_003315935.1", + "HG1211_PATCH": "NW_003871068.1", + "HG1074_PATCH": "NW_004504302.1", + "HG339_PATCH": "NW_003871070.1", + "HG979_PATCH": "NW_004775432.1", + "HG311_PATCH": "NW_003871069.1", + "HG995_PATCH": "NW_003315933.1", + "HG1479_PATCH": "NW_004070870.1", + "HG256_PATCH": "NW_003871075.1", + "HG873_PATCH": "NW_003871082.1", + "HSCHR11_1_CTG1_1": "NW_003315936.1", + "HG281_PATCH": "NW_003571045.1", + "HG142_HG150_NOVEL_TEST": "NW_003871073.1", + "HG151_NOVEL_TEST": "NW_003871074.1", + "HG536_PATCH": "NW_003571046.1", + "HG865_PATCH": "NW_004070871.1", + "HG414_PATCH": "NW_003871081.1", + "HG348_PATCH": "NW_003871079.1", + "HG305_PATCH": "NW_003871077.1", + "HG388_HG400_PATCH": "NW_003871080.1", + "HG306_PATCH": "NW_003871078.1", + "HG122_PATCH": "NW_003871072.2", + "HG299_PATCH": "NW_003871076.1", + "HG858_PATCH": "NW_003571048.1", + "HSCHR12_1_CTG1": "NW_003571049.1", + "HG344_PATCH": "NW_003871083.2", + "HG1133_PATCH": "NW_003571047.1", + "HSCHR12_2_CTG2": "NW_003571050.1", + "HSCHR12_1_CTG2": "NW_003315938.1", + "HSCHR12_1_CTG2_1": "NW_003315939.1", + "HSCHR12_2_CTG2_1": "NW_003315941.1", + "HSCHR12_3_CTG2_1": "NW_003315942.2", + "HG1595_PATCH": "NW_004504303.2", + "HSCHR12_1_CTG5": "NW_003315940.1", + "HG996_PATCH": "NW_003315937.1", + "HG531_PATCH": "NW_003571051.1", + "HG1592_PATCH": "NW_004166863.1", + "HSCHR15_1_CTG4": "NW_003315943.1", + "HSCHR15_1_CTG8": "NW_003315944.1", + "HG971_PATCH": "NW_003871084.1", + "HSCHR16_1_CTG3_1": "NW_003315945.1", + "HG1208_PATCH": "NW_003871085.1", + "HSCHR16_2_CTG3_1": "NW_003315946.1", + "HG417_PATCH": "NW_004070872.2", + "HSCHR17_1_CTG1": "NW_003315952.2", + "HG990_PATCH": "NW_003315951.1", + "HG987_PATCH": "NW_003315950.2", + "HG1591_PATCH": "NW_004775433.1", + "HG883_PATCH": "NW_003871090.1", + "HG385_PATCH": "NW_004166864.2", + "HG75_PATCH": "NW_003315949.1", + "HG745_PATCH": "NW_003315948.2", + "HSCHR17_4_CTG4": "NW_003871091.1", + "HSCHR17_6_CTG4": "NW_003871093.1", + "HSCHR17_5_CTG4": "NW_003871092.1", + "HSCHR17_1_CTG4": "NW_003315953.1", + "HG185_PATCH": "NW_003571052.1", + "HG1146_PATCH": "NW_003871086.1", + "HG183_PATCH": "NW_003315947.1", + "HG747_PATCH": "NW_003871088.1", + "HSCHR17_2_CTG4": "NW_003315954.1", + "HSCHR17_3_CTG4": "NW_003315955.1", + "HG748_PATCH": "NW_003871089.1", + "HG271_PATCH": "NW_003871087.1", + "HSCHR18_1_CTG1_1": "NW_003315956.1", + "HSCHR18_2_CTG1_1": "NW_003315959.1", + "HSCHR18_2_CTG2": "NW_003315960.1", + "HSCHR18_1_CTG2": "NW_003315957.1", + "HSCHR18_1_CTG2_1": "NW_003315958.1", + "HSCHR18_2_CTG2_1": "NW_003315961.1", + "HG729_PATCH": "NW_003871094.1", + "HG730_PATCH": "NW_003571053.2", + "HSCHR19_1_CTG3": "NW_003315962.1", + "HSCHR19_2_CTG3": "NW_003315964.2", + "HSCHR19_3_CTG3": "NW_003315965.1", + "HSCHR19_1_CTG3_1": "NW_003315963.1", + "HG1350_HG959_PATCH": "NW_004775434.1", + "HG1079_PATCH": "NW_004166865.1", + "HSCHR19LRC_COX1_CTG1": "NW_003571054.1", + "HSCHR19LRC_COX2_CTG1": "NW_003571055.1", + "HSCHR19LRC_LRC_I_CTG1": "NW_003571056.1", + "HSCHR19LRC_LRC_J_CTG1": "NW_003571057.1", + "HSCHR19LRC_LRC_S_CTG1": "NW_003571058.1", + "HSCHR19LRC_LRC_T_CTG1": "NW_003571059.1", + "HSCHR19LRC_PGF1_CTG1": "NW_003571060.1", + "HSCHR19LRC_PGF2_CTG1": "NW_003571061.1", + "HSCHR20_1_CTG1": "NW_003315966.1", + "HG144_PATCH": "NW_003871095.1", + "HG944_PATCH": "NW_004504304.1", + "HG506_HG507_HG1000_PATCH": "NW_003571063.2", + "HSCHR21_1_CTG1_1": "NW_003315967.1", + "HSCHR21_2_CTG1_1": "NW_003315968.1", + "HSCHR21_3_CTG1_1": "NW_003315969.1", + "HSCHR21_4_CTG1_1": "NW_003315970.1", + "HG237_PATCH": "NW_004775435.1", + "HG1487_PATCH": "NW_004070874.1", + "HG1486_PATCH": "NW_004070873.1", + "HG1488_PATCH": "NW_004070875.1", + "HG329_PATCH": "NW_003871096.1", + "HSCHR22_1_CTG2": "NW_003315972.1", + "HSCHR22_1_CTG1": "NW_003315971.2", + "HSCHR22_2_CTG1": "NW_004504305.1", + "HG497_PATCH": "NW_004070876.1", + "HG480_HG481_PATCH": "NW_003571064.2", + "HG1423_PATCH": "NW_003871098.1", + "HG1424_PATCH": "NW_003871099.1", + "HG1435_PATCH": "NW_004070879.1", + "HG29_PATCH": "NW_004166866.1", + "HG1436_HG1432_PATCH": "NW_004070880.2", + "HG1433_PATCH": "NW_004070877.1", + "HG1437_PATCH": "NW_004070881.1", + "HG1438_PATCH": "NW_004070882.1", + "HG1425_PATCH": "NW_003871100.1", + "HG1426_PATCH": "NW_003871101.3", + "HG1439_PATCH": "NW_004070883.1", + "HG1440_PATCH": "NW_004070884.1", + "HG1441_PATCH": "NW_004070885.1", + "HG375_PATCH": "NW_003871102.1", + "HG1434_PATCH": "NW_004070878.1", + "HG1462_PATCH": "NW_004070891.1", + "HG1463_PATCH": "NW_004070892.1", + "HG1490_PATCH": "NW_004070893.1", + "HG1442_PATCH": "NW_004070886.1", + "HG1443_HG1444_PATCH": "NW_004070887.1", + "HG1453_PATCH": "NW_004070888.1", + "HG1458_PATCH": "NW_004070889.1", + "HG1459_PATCH": "NW_004070890.2", + "HG1497_PATCH": "NW_003871103.3", + "HSCHR6_MHC_APD_CTG1": "NT_167244.1", + "HSCHR6_MHC_COX_CTG1": "NT_113891.2", + "HSCHR6_MHC_DBB_CTG1": "NT_167245.1", + "HSCHR6_MHC_MANN_CTG1": "NT_167246.1", + "HSCHR6_MHC_MCF_CTG1": "NT_167247.1", + "HSCHR6_MHC_QBL_CTG1": "NT_167248.1", + "HSCHR6_MHC_SSTO_CTG1": "NT_167249.1", + "HSCHR4_1_CTG9": "NT_167250.1", + "HSCHR17_1_CTG5": "NT_167251.1",} ########################################## _get_accession_hg19 = { - "1": "NC_000001.10", - "2": "NC_000002.11", - "3": "NC_000003.11", - "4": "NC_000004.11", - "5": "NC_000005.9", - "6": "NC_000006.11", - "7": "NC_000007.13", - "8": "NC_000008.10", - "9": "NC_000009.11", - "10": "NC_000010.10", - "11": "NC_000011.9", - "12": "NC_000012.11", - "13": "NC_000013.10", - "14": "NC_000014.8", - "15": "NC_000015.9", - "16": "NC_000016.9", - "17": "NC_000017.10", - "18": "NC_000018.9", - "19": "NC_000019.9", - "20": "NC_000020.10", - "21": "NC_000021.8", - "22": "NC_000022.10", - "23": "NC_000023.10", - "24": "NC_000024.9", - "x": "NC_000023.10", - "y": "NC_000024.9", - "X": "NC_000023.10", - "Y": "NC_000024.9", - "M": "NC_001807.4", - "m": "NC_001807.4", - # UCSC alts - "11_GL000202_RANDOM": "NT_113921.2", - "17_CTG5_HAP1": "NT_167251.1", - "17_GL000203_RANDOM": "NT_113941.1", - "17_GL000204_RANDOM": "NT_113943.1", - "17_GL000205_RANDOM": "NT_113930.1", - "17_GL000206_RANDOM": "NT_113945.1", - "18_GL000207_RANDOM": "NT_113947.1", - "19_GL000208_RANDOM": "NT_113948.1", - "19_GL000209_RANDOM": "NT_113949.1", - "1_GL000191_RANDOM": "NT_113878.1", - "1_GL000192_RANDOM": "NT_167207.1", - "21_GL000210_RANDOM": "NT_113950.2", - "4_CTG9_HAP1": "NT_167250.1", - "4_GL000193_RANDOM": "NT_113885.1", - "4_GL000194_RANDOM": "NT_113888.1", - "6_APD_HAP1": "NT_167244.1", - "6_COX_HAP2": "NT_113891.2", - "6_DBB_HAP3": "NT_167245.1", - "6_MANN_HAP4": "NT_167246.1", - "6_MCF_HAP5": "NT_167247.1", - "6_QBL_HAP6": "NT_167248.1", - "6_SSTO_HAP7": "NT_167249.1", - "7_GL000195_RANDOM": "NT_113901.1", - "8_GL000196_RANDOM": "NT_113909.1", - "8_GL000197_RANDOM": "NT_113907.1", - "9_GL000198_RANDOM": "NT_113914.1", - "9_GL000199_RANDOM": "NT_113916.2", - "9_GL000200_RANDOM": "NT_113915.1", - "9_GL000201_RANDOM": "NT_113911.1", - "UN_GL000211": "NT_113961.1", - "UN_GL000212": "NT_113923.1", - "UN_GL000213": "NT_167208.1", - "UN_GL000214": "NT_167209.1", - "UN_GL000215": "NT_167210.1", - "UN_GL000216": "NT_167211.1", - "UN_GL000217": "NT_167212.1", - "UN_GL000218": "NT_113889.1", - "UN_GL000219": "NT_167213.1", - "UN_GL000220": "NT_167214.1", - "UN_GL000221": "NT_167215.1", - "UN_GL000222": "NT_167216.1", - "UN_GL000223": "NT_167217.1", - "UN_GL000224": "NT_167218.1", - "UN_GL000225": "NT_167219.1", - "UN_GL000226": "NT_167220.1", - "UN_GL000227": "NT_167221.1", - "UN_GL000228": "NT_167222.1", - "UN_GL000229": "NT_167223.1", - "UN_GL000230": "NT_167224.1", - "UN_GL000231": "NT_167225.1", - "UN_GL000232": "NT_167226.1", - "UN_GL000233": "NT_167227.1", - "UN_GL000234": "NT_167228.1", - "UN_GL000235": "NT_167229.1", - "UN_GL000236": "NT_167230.1", - "UN_GL000237": "NT_167231.1", - "UN_GL000238": "NT_167232.1", - "UN_GL000239": "NT_167233.1", - "UN_GL000240": "NT_167234.1", - "UN_GL000241": "NT_167235.1", - "UN_GL000242": "NT_167236.1", - "UN_GL000243": "NT_167237.1", - "UN_GL000244": "NT_167238.1", - "UN_GL000245": "NT_167239.1", - "UN_GL000246": "NT_167240.1", - "UN_GL000247": "NT_167241.1", - "UN_GL000248": "NT_167242.1", - "UN_GL000249": "NT_167243.1", - # GRC Alts - 'HG1472_PATCH': 'NW_004070864.2', - 'HG989_PATCH': 'NW_003571030.1', - 'HG1292_PATCH': 'NW_003871056.3', - 'HG1287_PATCH': 'NW_003871055.3', - 'HSCHR1_1_CTG31': 'NW_003315905.1', - 'HSCHR1_2_CTG31': 'NW_003315906.1', - 'HSCHR1_3_CTG31': 'NW_003315907.1', - 'HG1471_PATCH': 'NW_004070863.1', - 'HG1293_PATCH': 'NW_003871057.1', - 'HG1473_PATCH': 'NW_004070865.1', - 'HG999_1_PATCH': 'NW_003315903.1', - 'HG999_2_PATCH': 'NW_003315904.1', - 'HSCHR2_1_CTG1': 'NW_003315908.1', - 'HG953_PATCH': 'NW_004504299.1', - 'HG686_PATCH': 'NW_003571032.1', - 'HSCHR2_2_CTG12': 'NW_003571033.2', - 'HSCHR2_1_CTG12': 'NW_003315909.1', - 'HG1007_PATCH': 'NW_003571031.1', - 'HSCHR3_1_CTG1': 'NW_003871060.1', - 'HG325_PATCH': 'NW_003871059.1', - 'HG186_PATCH': 'NW_003315910.1', - 'HG957_PATCH': 'NW_004775426.1', - 'HG280_PATCH': 'NW_003315911.1', - 'HG1091_PATCH': 'NW_003871058.1', - 'HG991_PATCH': 'NW_003315912.1', - 'HSCHR3_1_CTG2_1': 'NW_003315913.1', - 'HG174_HG254_PATCH': 'NW_004775427.1', - 'HSCHR4_1_CTG6': 'NW_003315915.1', - 'HSCHR4_2_CTG9': 'NW_003315916.1', - 'HG706_PATCH': 'NW_003571035.1', - 'HSCHR4_1_CTG12': 'NW_003315914.1', - 'HG1032_PATCH': 'NW_003571034.1', - 'HSCHR5_2_CTG1': 'NW_003315920.1', - 'HSCHR5_3_CTG1': 'NW_003571036.1', - 'HSCHR5_1_CTG1': 'NW_003315917.2', - 'HSCHR5_1_CTG2': 'NW_003315918.1', - 'HG1063_PATCH': 'NW_003871061.1', - 'HG1082_HG167_PATCH': 'NW_004775428.1', - 'HSCHR5_1_CTG5': 'NW_003315919.1', - 'HG27_PATCH': 'NW_004070866.1', - 'HG1322_PATCH': 'NW_003871063.1', - 'HSCHR6_1_CTG5': 'NW_003315921.1', - 'HG357_PATCH': 'NW_004504300.1', - 'HG1304_PATCH': 'NW_003871062.1', - 'HG193_PATCH': 'NW_004775429.1', - 'HSCHR6_2_CTG5': 'NW_004166862.1', - 'HG736_PATCH': 'NW_003571039.1', - 'HG14_PATCH': 'NW_003571038.1', - 'HG444_PATCH': 'NW_004775430.1', - 'HG1257_PATCH': 'NW_003871064.1', - 'HG946_PATCH': 'NW_003571041.1', - 'HG115_PATCH': 'NW_003571037.1', - 'HG1308_PATCH': 'NW_003871065.1', - 'HSCHR7_1_CTG6': 'NW_003315922.2', - 'HG7_PATCH': 'NW_003571040.1', - 'HG19_PATCH': 'NW_003571042.1', - 'HG1699_PATCH': 'NW_004775431.1', - 'HG418_PATCH': 'NW_003871066.2', - 'HG104_HG975_PATCH': 'NW_003315923.1', - 'HG243_PATCH': 'NW_003315924.1', - 'HSCHR9_1_CTG1': 'NW_003315928.1', - 'HG962_PATCH': 'NW_003871067.1', - 'HSCHR9_1_CTG35': 'NW_003315929.1', - 'HSCHR9_2_CTG35': 'NW_003315930.1', - 'HSCHR9_3_CTG35': 'NW_003315931.1', - 'HG50_PATCH': 'NW_004504301.1', - 'HG1502_PATCH': 'NW_004070869.1', - 'HG79_PATCH': 'NW_003315925.1', - 'HG1500_PATCH': 'NW_004070867.1', - 'HG1501_PATCH': 'NW_004070868.1', - 'HG998_1_PATCH': 'NW_003315926.1', - 'HG998_2_PATCH': 'NW_003315927.1', - 'HG905_PATCH': 'NW_003571043.1', - 'HG871_PATCH': 'NW_003871071.1', - 'HG544_PATCH': 'NW_003315932.1', - 'HSCHR10_1_CTG2': 'NW_003315934.1', - 'HSCHR10_1_CTG5': 'NW_003315935.1', - 'HG1211_PATCH': 'NW_003871068.1', - 'HG1074_PATCH': 'NW_004504302.1', - 'HG339_PATCH': 'NW_003871070.1', - 'HG979_PATCH': 'NW_004775432.1', - 'HG311_PATCH': 'NW_003871069.1', - 'HG995_PATCH': 'NW_003315933.1', - 'HG1479_PATCH': 'NW_004070870.1', - 'HG256_PATCH': 'NW_003871075.1', - 'HG873_PATCH': 'NW_003871082.1', - 'HSCHR11_1_CTG1_1': 'NW_003315936.1', - 'HG281_PATCH': 'NW_003571045.1', - 'HG142_HG150_NOVEL_TEST': 'NW_003871073.1', - 'HG151_NOVEL_TEST': 'NW_003871074.1', - 'HG536_PATCH': 'NW_003571046.1', - 'HG865_PATCH': 'NW_004070871.1', - 'HG414_PATCH': 'NW_003871081.1', - 'HG348_PATCH': 'NW_003871079.1', - 'HG305_PATCH': 'NW_003871077.1', - 'HG388_HG400_PATCH': 'NW_003871080.1', - 'HG306_PATCH': 'NW_003871078.1', - 'HG122_PATCH': 'NW_003871072.2', - 'HG299_PATCH': 'NW_003871076.1', - 'HG858_PATCH': 'NW_003571048.1', - 'HSCHR12_1_CTG1': 'NW_003571049.1', - 'HG344_PATCH': 'NW_003871083.2', - 'HG1133_PATCH': 'NW_003571047.1', - 'HSCHR12_2_CTG2': 'NW_003571050.1', - 'HSCHR12_1_CTG2': 'NW_003315938.1', - 'HSCHR12_1_CTG2_1': 'NW_003315939.1', - 'HSCHR12_2_CTG2_1': 'NW_003315941.1', - 'HSCHR12_3_CTG2_1': 'NW_003315942.2', - 'HG1595_PATCH': 'NW_004504303.2', - 'HSCHR12_1_CTG5': 'NW_003315940.1', - 'HG996_PATCH': 'NW_003315937.1', - 'HG531_PATCH': 'NW_003571051.1', - 'HG1592_PATCH': 'NW_004166863.1', - 'HSCHR15_1_CTG4': 'NW_003315943.1', - 'HSCHR15_1_CTG8': 'NW_003315944.1', - 'HG971_PATCH': 'NW_003871084.1', - 'HSCHR16_1_CTG3_1': 'NW_003315945.1', - 'HG1208_PATCH': 'NW_003871085.1', - 'HSCHR16_2_CTG3_1': 'NW_003315946.1', - 'HG417_PATCH': 'NW_004070872.2', - 'HSCHR17_1_CTG1': 'NW_003315952.2', - 'HG990_PATCH': 'NW_003315951.1', - 'HG987_PATCH': 'NW_003315950.2', - 'HG1591_PATCH': 'NW_004775433.1', - 'HG883_PATCH': 'NW_003871090.1', - 'HG385_PATCH': 'NW_004166864.2', - 'HG75_PATCH': 'NW_003315949.1', - 'HG745_PATCH': 'NW_003315948.2', - 'HSCHR17_4_CTG4': 'NW_003871091.1', - 'HSCHR17_6_CTG4': 'NW_003871093.1', - 'HSCHR17_5_CTG4': 'NW_003871092.1', - 'HSCHR17_1_CTG4': 'NW_003315953.1', - 'HG185_PATCH': 'NW_003571052.1', - 'HG1146_PATCH': 'NW_003871086.1', - 'HG183_PATCH': 'NW_003315947.1', - 'HG747_PATCH': 'NW_003871088.1', - 'HSCHR17_2_CTG4': 'NW_003315954.1', - 'HSCHR17_3_CTG4': 'NW_003315955.1', - 'HG748_PATCH': 'NW_003871089.1', - 'HG271_PATCH': 'NW_003871087.1', - 'HSCHR18_1_CTG1_1': 'NW_003315956.1', - 'HSCHR18_2_CTG1_1': 'NW_003315959.1', - 'HSCHR18_2_CTG2': 'NW_003315960.1', - 'HSCHR18_1_CTG2': 'NW_003315957.1', - 'HSCHR18_1_CTG2_1': 'NW_003315958.1', - 'HSCHR18_2_CTG2_1': 'NW_003315961.1', - 'HG729_PATCH': 'NW_003871094.1', - 'HG730_PATCH': 'NW_003571053.2', - 'HSCHR19_1_CTG3': 'NW_003315962.1', - 'HSCHR19_2_CTG3': 'NW_003315964.2', - 'HSCHR19_3_CTG3': 'NW_003315965.1', - 'HSCHR19_1_CTG3_1': 'NW_003315963.1', - 'HG1350_HG959_PATCH': 'NW_004775434.1', - 'HG1079_PATCH': 'NW_004166865.1', - 'HSCHR19LRC_COX1_CTG1': 'NW_003571054.1', - 'HSCHR19LRC_COX2_CTG1': 'NW_003571055.1', - 'HSCHR19LRC_LRC_I_CTG1': 'NW_003571056.1', - 'HSCHR19LRC_LRC_J_CTG1': 'NW_003571057.1', - 'HSCHR19LRC_LRC_S_CTG1': 'NW_003571058.1', - 'HSCHR19LRC_LRC_T_CTG1': 'NW_003571059.1', - 'HSCHR19LRC_PGF1_CTG1': 'NW_003571060.1', - 'HSCHR19LRC_PGF2_CTG1': 'NW_003571061.1', - 'HSCHR20_1_CTG1': 'NW_003315966.1', - 'HG144_PATCH': 'NW_003871095.1', - 'HG944_PATCH': 'NW_004504304.1', - 'HG506_HG507_HG1000_PATCH': 'NW_003571063.2', - 'HSCHR21_1_CTG1_1': 'NW_003315967.1', - 'HSCHR21_2_CTG1_1': 'NW_003315968.1', - 'HSCHR21_3_CTG1_1': 'NW_003315969.1', - 'HSCHR21_4_CTG1_1': 'NW_003315970.1', - 'HG237_PATCH': 'NW_004775435.1', - 'HG1487_PATCH': 'NW_004070874.1', - 'HG1486_PATCH': 'NW_004070873.1', - 'HG1488_PATCH': 'NW_004070875.1', - 'HG329_PATCH': 'NW_003871096.1', - 'HSCHR22_1_CTG2': 'NW_003315972.1', - 'HSCHR22_1_CTG1': 'NW_003315971.2', - 'HSCHR22_2_CTG1': 'NW_004504305.1', - 'HG497_PATCH': 'NW_004070876.1', - 'HG480_HG481_PATCH': 'NW_003571064.2', - 'HG1423_PATCH': 'NW_003871098.1', - 'HG1424_PATCH': 'NW_003871099.1', - 'HG1435_PATCH': 'NW_004070879.1', - 'HG29_PATCH': 'NW_004166866.1', - 'HG1436_HG1432_PATCH': 'NW_004070880.2', - 'HG1433_PATCH': 'NW_004070877.1', - 'HG1437_PATCH': 'NW_004070881.1', - 'HG1438_PATCH': 'NW_004070882.1', - 'HG1425_PATCH': 'NW_003871100.1', - 'HG1426_PATCH': 'NW_003871101.3', - 'HG1439_PATCH': 'NW_004070883.1', - 'HG1440_PATCH': 'NW_004070884.1', - 'HG1441_PATCH': 'NW_004070885.1', - 'HG375_PATCH': 'NW_003871102.1', - 'HG1434_PATCH': 'NW_004070878.1', - 'HG1462_PATCH': 'NW_004070891.1', - 'HG1463_PATCH': 'NW_004070892.1', - 'HG1490_PATCH': 'NW_004070893.1', - 'HG1442_PATCH': 'NW_004070886.1', - 'HG1443_HG1444_PATCH': 'NW_004070887.1', - 'HG1453_PATCH': 'NW_004070888.1', - 'HG1458_PATCH': 'NW_004070889.1', - 'HG1459_PATCH': 'NW_004070890.2', - 'HG1497_PATCH': 'NW_003871103.3', - 'HSCHR6_MHC_APD_CTG1': 'NT_167244.1', - 'HSCHR6_MHC_COX_CTG1': 'NT_113891.2', - 'HSCHR6_MHC_DBB_CTG1': 'NT_167245.1', - 'HSCHR6_MHC_MANN_CTG1': 'NT_167246.1', - 'HSCHR6_MHC_MCF_CTG1': 'NT_167247.1', - 'HSCHR6_MHC_QBL_CTG1': 'NT_167248.1', - 'HSCHR6_MHC_SSTO_CTG1': 'NT_167249.1', - 'HSCHR4_1_CTG9': 'NT_167250.1', - 'HSCHR17_1_CTG5': 'NT_167251.1' -} + '1': 'NC_000001.10', + '2': 'NC_000002.11', + '3': 'NC_000003.11', + '4': 'NC_000004.11', + '5': 'NC_000005.9', + '6': 'NC_000006.11', + '7': 'NC_000007.13', + '8': 'NC_000008.10', + '9': 'NC_000009.11', + '10': 'NC_000010.10', + '11': 'NC_000011.9', + '12': 'NC_000012.11', + '13': 'NC_000013.10', + '14': 'NC_000014.8', + '15': 'NC_000015.9', + '16': 'NC_000016.9', + '17': 'NC_000017.10', + '18': 'NC_000018.9', + '19': 'NC_000019.9', + '20': 'NC_000020.10', + '21': 'NC_000021.8', + '22': 'NC_000022.10', + '23': 'NC_000023.10', + '24': 'NC_000024.9', + 'x': 'NC_000023.10', + 'y': 'NC_000024.9', + 'X': 'NC_000023.10', + 'Y': 'NC_000024.9', + 'M': 'NC_001807.4', + 'm': 'NC_001807.4', + # UCSC alt IDs + '11_GL000202_RANDOM': 'NT_113921.2', + '17_CTG5_HAP1': 'NT_167251.1', + '17_GL000203_RANDOM': 'NT_113941.1', + '17_GL000204_RANDOM': 'NT_113943.1', + '17_GL000205_RANDOM': 'NT_113930.1', + '17_GL000206_RANDOM': 'NT_113945.1', + '18_GL000207_RANDOM': 'NT_113947.1', + '19_GL000208_RANDOM': 'NT_113948.1', + '19_GL000209_RANDOM': 'NT_113949.1', + '1_GL000191_RANDOM': 'NT_113878.1', + '1_GL000192_RANDOM': 'NT_167207.1', + '21_GL000210_RANDOM': 'NT_113950.2', + '4_CTG9_HAP1': 'NT_167250.1', + '4_GL000193_RANDOM': 'NT_113885.1', + '4_GL000194_RANDOM': 'NT_113888.1', + '6_APD_HAP1': 'NT_167244.1', + '6_COX_HAP2': 'NT_113891.2', + '6_DBB_HAP3': 'NT_167245.1', + '6_MANN_HAP4': 'NT_167246.1', + '6_MCF_HAP5': 'NT_167247.1', + '6_QBL_HAP6': 'NT_167248.1', + '6_SSTO_HAP7': 'NT_167249.1', + '7_GL000195_RANDOM': 'NT_113901.1', + '8_GL000196_RANDOM': 'NT_113909.1', + '8_GL000197_RANDOM': 'NT_113907.1', + '9_GL000198_RANDOM': 'NT_113914.1', + '9_GL000199_RANDOM': 'NT_113916.2', + '9_GL000200_RANDOM': 'NT_113915.1', + '9_GL000201_RANDOM': 'NT_113911.1', + 'UN_GL000211': 'NT_113961.1', + 'UN_GL000212': 'NT_113923.1', + 'UN_GL000213': 'NT_167208.1', + 'UN_GL000214': 'NT_167209.1', + 'UN_GL000215': 'NT_167210.1', + 'UN_GL000216': 'NT_167211.1', + 'UN_GL000217': 'NT_167212.1', + 'UN_GL000218': 'NT_113889.1', + 'UN_GL000219': 'NT_167213.1', + 'UN_GL000220': 'NT_167214.1', + 'UN_GL000221': 'NT_167215.1', + 'UN_GL000222': 'NT_167216.1', + 'UN_GL000223': 'NT_167217.1', + 'UN_GL000224': 'NT_167218.1', + 'UN_GL000225': 'NT_167219.1', + 'UN_GL000226': 'NT_167220.1', + 'UN_GL000227': 'NT_167221.1', + 'UN_GL000228': 'NT_167222.1', + 'UN_GL000229': 'NT_167223.1', + 'UN_GL000230': 'NT_167224.1', + 'UN_GL000231': 'NT_167225.1', + 'UN_GL000232': 'NT_167226.1', + 'UN_GL000233': 'NT_167227.1', + 'UN_GL000234': 'NT_167228.1', + 'UN_GL000235': 'NT_167229.1', + 'UN_GL000236': 'NT_167230.1', + 'UN_GL000237': 'NT_167231.1', + 'UN_GL000238': 'NT_167232.1', + 'UN_GL000239': 'NT_167233.1', + 'UN_GL000240': 'NT_167234.1', + 'UN_GL000241': 'NT_167235.1', + 'UN_GL000242': 'NT_167236.1', + 'UN_GL000243': 'NT_167237.1', + 'UN_GL000244': 'NT_167238.1', + 'UN_GL000245': 'NT_167239.1', + 'UN_GL000246': 'NT_167240.1', + 'UN_GL000247': 'NT_167241.1', + 'UN_GL000248': 'NT_167242.1', + 'UN_GL000249': 'NT_167243.1', + # GRC Alt IDs + "HG1472_PATCH": "NW_004070864.2", + "HG989_PATCH": "NW_003571030.1", + "HG1292_PATCH": "NW_003871056.3", + "HG1287_PATCH": "NW_003871055.3", + "HSCHR1_1_CTG31": "NW_003315905.1", + "HSCHR1_2_CTG31": "NW_003315906.1", + "HSCHR1_3_CTG31": "NW_003315907.1", + "HG1471_PATCH": "NW_004070863.1", + "HG1293_PATCH": "NW_003871057.1", + "HG1473_PATCH": "NW_004070865.1", + "HG999_1_PATCH": "NW_003315903.1", + "HG999_2_PATCH": "NW_003315904.1", + "HSCHR2_1_CTG1": "NW_003315908.1", + "HG953_PATCH": "NW_004504299.1", + "HG686_PATCH": "NW_003571032.1", + "HSCHR2_2_CTG12": "NW_003571033.2", + "HSCHR2_1_CTG12": "NW_003315909.1", + "HG1007_PATCH": "NW_003571031.1", + "HSCHR3_1_CTG1": "NW_003871060.1", + "HG325_PATCH": "NW_003871059.1", + "HG186_PATCH": "NW_003315910.1", + "HG957_PATCH": "NW_004775426.1", + "HG280_PATCH": "NW_003315911.1", + "HG1091_PATCH": "NW_003871058.1", + "HG991_PATCH": "NW_003315912.1", + "HSCHR3_1_CTG2_1": "NW_003315913.1", + "HG174_HG254_PATCH": "NW_004775427.1", + "HSCHR4_1_CTG6": "NW_003315915.1", + "HSCHR4_2_CTG9": "NW_003315916.1", + "HG706_PATCH": "NW_003571035.1", + "HSCHR4_1_CTG12": "NW_003315914.1", + "HG1032_PATCH": "NW_003571034.1", + "HSCHR5_2_CTG1": "NW_003315920.1", + "HSCHR5_3_CTG1": "NW_003571036.1", + "HSCHR5_1_CTG1": "NW_003315917.2", + "HSCHR5_1_CTG2": "NW_003315918.1", + "HG1063_PATCH": "NW_003871061.1", + "HG1082_HG167_PATCH": "NW_004775428.1", + "HSCHR5_1_CTG5": "NW_003315919.1", + "HG27_PATCH": "NW_004070866.1", + "HG1322_PATCH": "NW_003871063.1", + "HSCHR6_1_CTG5": "NW_003315921.1", + "HG357_PATCH": "NW_004504300.1", + "HG1304_PATCH": "NW_003871062.1", + "HG193_PATCH": "NW_004775429.1", + "HSCHR6_2_CTG5": "NW_004166862.1", + "HG736_PATCH": "NW_003571039.1", + "HG14_PATCH": "NW_003571038.1", + "HG444_PATCH": "NW_004775430.1", + "HG1257_PATCH": "NW_003871064.1", + "HG946_PATCH": "NW_003571041.1", + "HG115_PATCH": "NW_003571037.1", + "HG1308_PATCH": "NW_003871065.1", + "HSCHR7_1_CTG6": "NW_003315922.2", + "HG7_PATCH": "NW_003571040.1", + "HG19_PATCH": "NW_003571042.1", + "HG1699_PATCH": "NW_004775431.1", + "HG418_PATCH": "NW_003871066.2", + "HG104_HG975_PATCH": "NW_003315923.1", + "HG243_PATCH": "NW_003315924.1", + "HSCHR9_1_CTG1": "NW_003315928.1", + "HG962_PATCH": "NW_003871067.1", + "HSCHR9_1_CTG35": "NW_003315929.1", + "HSCHR9_2_CTG35": "NW_003315930.1", + "HSCHR9_3_CTG35": "NW_003315931.1", + "HG50_PATCH": "NW_004504301.1", + "HG1502_PATCH": "NW_004070869.1", + "HG79_PATCH": "NW_003315925.1", + "HG1500_PATCH": "NW_004070867.1", + "HG1501_PATCH": "NW_004070868.1", + "HG998_1_PATCH": "NW_003315926.1", + "HG998_2_PATCH": "NW_003315927.1", + "HG905_PATCH": "NW_003571043.1", + "HG871_PATCH": "NW_003871071.1", + "HG544_PATCH": "NW_003315932.1", + "HSCHR10_1_CTG2": "NW_003315934.1", + "HSCHR10_1_CTG5": "NW_003315935.1", + "HG1211_PATCH": "NW_003871068.1", + "HG1074_PATCH": "NW_004504302.1", + "HG339_PATCH": "NW_003871070.1", + "HG979_PATCH": "NW_004775432.1", + "HG311_PATCH": "NW_003871069.1", + "HG995_PATCH": "NW_003315933.1", + "HG1479_PATCH": "NW_004070870.1", + "HG256_PATCH": "NW_003871075.1", + "HG873_PATCH": "NW_003871082.1", + "HSCHR11_1_CTG1_1": "NW_003315936.1", + "HG281_PATCH": "NW_003571045.1", + "HG142_HG150_NOVEL_TEST": "NW_003871073.1", + "HG151_NOVEL_TEST": "NW_003871074.1", + "HG536_PATCH": "NW_003571046.1", + "HG865_PATCH": "NW_004070871.1", + "HG414_PATCH": "NW_003871081.1", + "HG348_PATCH": "NW_003871079.1", + "HG305_PATCH": "NW_003871077.1", + "HG388_HG400_PATCH": "NW_003871080.1", + "HG306_PATCH": "NW_003871078.1", + "HG122_PATCH": "NW_003871072.2", + "HG299_PATCH": "NW_003871076.1", + "HG858_PATCH": "NW_003571048.1", + "HSCHR12_1_CTG1": "NW_003571049.1", + "HG344_PATCH": "NW_003871083.2", + "HG1133_PATCH": "NW_003571047.1", + "HSCHR12_2_CTG2": "NW_003571050.1", + "HSCHR12_1_CTG2": "NW_003315938.1", + "HSCHR12_1_CTG2_1": "NW_003315939.1", + "HSCHR12_2_CTG2_1": "NW_003315941.1", + "HSCHR12_3_CTG2_1": "NW_003315942.2", + "HG1595_PATCH": "NW_004504303.2", + "HSCHR12_1_CTG5": "NW_003315940.1", + "HG996_PATCH": "NW_003315937.1", + "HG531_PATCH": "NW_003571051.1", + "HG1592_PATCH": "NW_004166863.1", + "HSCHR15_1_CTG4": "NW_003315943.1", + "HSCHR15_1_CTG8": "NW_003315944.1", + "HG971_PATCH": "NW_003871084.1", + "HSCHR16_1_CTG3_1": "NW_003315945.1", + "HG1208_PATCH": "NW_003871085.1", + "HSCHR16_2_CTG3_1": "NW_003315946.1", + "HG417_PATCH": "NW_004070872.2", + "HSCHR17_1_CTG1": "NW_003315952.2", + "HG990_PATCH": "NW_003315951.1", + "HG987_PATCH": "NW_003315950.2", + "HG1591_PATCH": "NW_004775433.1", + "HG883_PATCH": "NW_003871090.1", + "HG385_PATCH": "NW_004166864.2", + "HG75_PATCH": "NW_003315949.1", + "HG745_PATCH": "NW_003315948.2", + "HSCHR17_4_CTG4": "NW_003871091.1", + "HSCHR17_6_CTG4": "NW_003871093.1", + "HSCHR17_5_CTG4": "NW_003871092.1", + "HSCHR17_1_CTG4": "NW_003315953.1", + "HG185_PATCH": "NW_003571052.1", + "HG1146_PATCH": "NW_003871086.1", + "HG183_PATCH": "NW_003315947.1", + "HG747_PATCH": "NW_003871088.1", + "HSCHR17_2_CTG4": "NW_003315954.1", + "HSCHR17_3_CTG4": "NW_003315955.1", + "HG748_PATCH": "NW_003871089.1", + "HG271_PATCH": "NW_003871087.1", + "HSCHR18_1_CTG1_1": "NW_003315956.1", + "HSCHR18_2_CTG1_1": "NW_003315959.1", + "HSCHR18_2_CTG2": "NW_003315960.1", + "HSCHR18_1_CTG2": "NW_003315957.1", + "HSCHR18_1_CTG2_1": "NW_003315958.1", + "HSCHR18_2_CTG2_1": "NW_003315961.1", + "HG729_PATCH": "NW_003871094.1", + "HG730_PATCH": "NW_003571053.2", + "HSCHR19_1_CTG3": "NW_003315962.1", + "HSCHR19_2_CTG3": "NW_003315964.2", + "HSCHR19_3_CTG3": "NW_003315965.1", + "HSCHR19_1_CTG3_1": "NW_003315963.1", + "HG1350_HG959_PATCH": "NW_004775434.1", + "HG1079_PATCH": "NW_004166865.1", + "HSCHR19LRC_COX1_CTG1": "NW_003571054.1", + "HSCHR19LRC_COX2_CTG1": "NW_003571055.1", + "HSCHR19LRC_LRC_I_CTG1": "NW_003571056.1", + "HSCHR19LRC_LRC_J_CTG1": "NW_003571057.1", + "HSCHR19LRC_LRC_S_CTG1": "NW_003571058.1", + "HSCHR19LRC_LRC_T_CTG1": "NW_003571059.1", + "HSCHR19LRC_PGF1_CTG1": "NW_003571060.1", + "HSCHR19LRC_PGF2_CTG1": "NW_003571061.1", + "HSCHR20_1_CTG1": "NW_003315966.1", + "HG144_PATCH": "NW_003871095.1", + "HG944_PATCH": "NW_004504304.1", + "HG506_HG507_HG1000_PATCH": "NW_003571063.2", + "HSCHR21_1_CTG1_1": "NW_003315967.1", + "HSCHR21_2_CTG1_1": "NW_003315968.1", + "HSCHR21_3_CTG1_1": "NW_003315969.1", + "HSCHR21_4_CTG1_1": "NW_003315970.1", + "HG237_PATCH": "NW_004775435.1", + "HG1487_PATCH": "NW_004070874.1", + "HG1486_PATCH": "NW_004070873.1", + "HG1488_PATCH": "NW_004070875.1", + "HG329_PATCH": "NW_003871096.1", + "HSCHR22_1_CTG2": "NW_003315972.1", + "HSCHR22_1_CTG1": "NW_003315971.2", + "HSCHR22_2_CTG1": "NW_004504305.1", + "HG497_PATCH": "NW_004070876.1", + "HG480_HG481_PATCH": "NW_003571064.2", + "HG1423_PATCH": "NW_003871098.1", + "HG1424_PATCH": "NW_003871099.1", + "HG1435_PATCH": "NW_004070879.1", + "HG29_PATCH": "NW_004166866.1", + "HG1436_HG1432_PATCH": "NW_004070880.2", + "HG1433_PATCH": "NW_004070877.1", + "HG1437_PATCH": "NW_004070881.1", + "HG1438_PATCH": "NW_004070882.1", + "HG1425_PATCH": "NW_003871100.1", + "HG1426_PATCH": "NW_003871101.3", + "HG1439_PATCH": "NW_004070883.1", + "HG1440_PATCH": "NW_004070884.1", + "HG1441_PATCH": "NW_004070885.1", + "HG375_PATCH": "NW_003871102.1", + "HG1434_PATCH": "NW_004070878.1", + "HG1462_PATCH": "NW_004070891.1", + "HG1463_PATCH": "NW_004070892.1", + "HG1490_PATCH": "NW_004070893.1", + "HG1442_PATCH": "NW_004070886.1", + "HG1443_HG1444_PATCH": "NW_004070887.1", + "HG1453_PATCH": "NW_004070888.1", + "HG1458_PATCH": "NW_004070889.1", + "HG1459_PATCH": "NW_004070890.2", + "HG1497_PATCH": "NW_003871103.3", + "HSCHR6_MHC_APD_CTG1": "NT_167244.1", + "HSCHR6_MHC_COX_CTG1": "NT_113891.2", + "HSCHR6_MHC_DBB_CTG1": "NT_167245.1", + "HSCHR6_MHC_MANN_CTG1": "NT_167246.1", + "HSCHR6_MHC_MCF_CTG1": "NT_167247.1", + "HSCHR6_MHC_QBL_CTG1": "NT_167248.1", + "HSCHR6_MHC_SSTO_CTG1": "NT_167249.1", + "HSCHR4_1_CTG9": "NT_167250.1", + "HSCHR17_1_CTG5": "NT_167251.1"} ############################################ _get_accession_GRCh38 = { - "1": "NC_000001.11", - "2": "NC_000002.12", - "3": "NC_000003.12", - "4": "NC_000004.12", - "5": "NC_000005.10", - "6": "NC_000006.12", - "7": "NC_000007.14", - "8": "NC_000008.11", - "9": "NC_000009.12", - "10": "NC_000010.11", - "11": "NC_000011.10", - "12": "NC_000012.12", - "13": "NC_000013.11", - "14": "NC_000014.9", - "15": "NC_000015.10", - "16": "NC_000016.10", - "17": "NC_000017.11", - "18": "NC_000018.10", - "19": "NC_000019.10", - "20": "NC_000020.11", - "21": "NC_000021.9", - "22": "NC_000022.11", - "23": "NC_000023.11", - "24": "NC_000024.10", - "x": "NC_000023.11", - "y": "NC_000024.10", - "X": "NC_000023.11", - "Y": "NC_000024.10", - "M": "NC_012920.1", - "m": "NC_012920.1", - "MT": "NC_012920.1", - "mt": "NC_012920.1", - # UCSC Alts - "1_KN196472V1_fix": "NW_009646194.1", - "1_KN538360V1_fix": "NW_011332687.1", - "1_KN538361V1_fix": "NW_011332688.1", - "1_KZ208906V1_fix": "NW_018654708.1", - "1_MU273333V1_fix": "NW_025791756.1", - "2_KN538363V1_fix": "NW_011332690.1", - "2_ML143341V1_fix": "NW_021159987.1", - "2_MU273341V1_fix": "NW_025791764.1", - "2_MU273342V1_fix": "NW_025791765.1", - "2_MU273343V1_fix": "NW_025791766.1", - "2_MU273344V1_fix": "NW_025791767.1", - "3_KN196476V1_fix": "NW_009646198.1", - "3_KN538364V1_fix": "NW_011332691.1", - "3_KV766192V1_fix": "NW_017363813.1", - "3_MU273346V1_fix": "NW_025791769.1", - "3_MU273348V1_fix": "NW_025791771.1", - "4_KQ983257V1_fix": "NW_015495300.1", - "5_KV575244V1_fix": "NW_016107298.1", - "5_ML143350V1_fix": "NW_021159996.1", - "5_MU273354V1_fix": "NW_025791777.1", - "5_MU273355V1_fix": "NW_025791778.1", - "6_KV766194V1_fix": "NW_017363815.1", - "6_KZ208911V1_fix": "NW_018654713.1", - "7_KV880765V1_fix": "NW_017852930.1", - "7_KZ208912V1_fix": "NW_018654714.1", - "7_ML143352V1_fix": "NW_021159998.1", - "8_KZ208914V1_fix": "NW_018654716.1", - "8_KZ208915V1_fix": "NW_018654717.1", - "8_MU273361V1_fix": "NW_025791784.1", - "8_MU273363V1_fix": "NW_025791786.1", - "9_MU273365V1_fix": "NW_025791788.1", - "10_KQ090021V1_fix": "NW_013171807.1", - "11_KN196481V1_fix": "NW_009646203.1", - "11_KQ759759V2_fix": "NW_015148966.2", - "11_KZ559108V1_fix": "NW_019805495.1", - "11_KZ559109V1_fix": "NW_019805496.1", - "11_ML143358V1_fix": "NW_021160004.1", - "11_ML143359V1_fix": "NW_021160005.1", - "11_MU273369V1_fix": "NW_025791792.1", - "12_KN538369V1_fix": "NW_011332696.1", - "12_KZ208916V1_fix": "NW_018654718.1", - "12_ML143361V1_fix": "NW_021160007.1", - "12_ML143362V1_fix": "NW_021160008.1", - "12_MU273372V1_fix": "NW_025791795.1", - "13_KN538371V1_fix": "NW_011332698.1", - "13_ML143365V1_fix": "NW_021160011.1", - "14_KZ208920V1_fix": "NW_018654722.1", - "15_KN538374V1_fix": "NW_011332701.1", - "15_ML143371V1_fix": "NW_021160017.1", - "15_MU273374V1_fix": "NW_025791797.1", - "16_KV880768V1_fix": "NW_017852933.1", - "16_KZ559113V1_fix": "NW_019805500.1", - "16_ML143373V1_fix": "NW_021160019.1", - "16_MU273376V1_fix": "NW_025791799.1", - "17_KV575245V1_fix": "NW_016107299.1", - "17_KV766196V1_fix": "NW_017363817.1", - "17_MU273379V1_fix": "NW_025791802.1", - "17_MU273380V1_fix": "NW_025791803.1", - "17_MU273382V1_fix": "NW_025791805.1", - "18_KQ090028V1_fix": "NW_013171814.1", - "19_KN196484V1_fix": "NW_009646206.1", - "19_KQ458386V1_fix": "NW_014040929.1", - "19_ML143376V1_fix": "NW_021160022.1", - "19_MU273384V1_fix": "NW_025791807.1", - "20_MU273388V1_fix": "NW_025791811.1", - "20_MU273389V1_fix": "NW_025791812.1", - "21_MU273391V1_fix": "NW_025791814.1", - "21_MU273392V1_fix": "NW_025791815.1", - "22_KQ759762V2_fix": "NW_015148969.2", - "X_ML143381V1_fix": "NW_021160027.1", - "X_MU273394V1_fix": "NW_025791817.1", - "Y_MU273398V1_fix": "NW_025791821.1", - "10_GL383545V1_alt": "NW_003315934.1", - "10_GL383546V1_alt": "NW_003315935.1", - "10_KI270824V1_alt": "NT_187579.1", - "10_KI270825V1_alt": "NT_187580.1", - "11_GL383547V1_alt": "NW_003315936.1", - "11_JH159136V1_alt": "NW_003871073.1", - "11_JH159137V1_alt": "NW_003871074.1", - "11_KI270721V1_random": "NT_187376.1", - "11_KI270826V1_alt": "NT_187581.1", - "11_KI270827V1_alt": "NT_187582.1", - "11_KI270829V1_alt": "NT_187583.1", - "11_KI270830V1_alt": "NT_187584.1", - "11_KI270831V1_alt": "NT_187585.1", - "11_KI270832V1_alt": "NT_187586.1", - "11_KI270902V1_alt": "NT_187656.1", - "11_KI270903V1_alt": "NT_187657.1", - "11_KI270927V1_alt": "NT_187681.1", - "12_GL383549V1_alt": "NW_003315938.1", - "12_GL383550V2_alt": "NW_003315939.2", - "12_GL383551V1_alt": "NW_003315940.1", - "12_GL383552V1_alt": "NW_003315941.1", - "12_GL383553V2_alt": "NW_003315942.2", - "12_GL877875V1_alt": "NW_003571049.1", - "12_GL877876V1_alt": "NW_003571050.1", - "12_KI270833V1_alt": "NT_187589.1", - "12_KI270834V1_alt": "NT_187590.1", - "12_KI270835V1_alt": "NT_187587.1", - "12_KI270836V1_alt": "NT_187591.1", - "12_KI270837V1_alt": "NT_187588.1", - "12_KI270904V1_alt": "NT_187658.1", - "13_KI270838V1_alt": "NT_187592.1", - "13_KI270839V1_alt": "NT_187593.1", - "13_KI270840V1_alt": "NT_187594.1", - "13_KI270841V1_alt": "NT_187595.1", - "13_KI270842V1_alt": "NT_187596.1", - "13_KI270843V1_alt": "NT_187597.1", - "14_GL000009V2_random": "NT_113796.3", - "14_GL000194V1_random": "NT_113888.1", - "14_GL000225V1_random": "NT_167219.1", - "14_KI270722V1_random": "NT_187377.1", - "14_KI270723V1_random": "NT_187378.1", - "14_KI270724V1_random": "NT_187379.1", - "14_KI270725V1_random": "NT_187380.1", - "14_KI270726V1_random": "NT_187381.1", - "14_KI270844V1_alt": "NT_187598.1", - "14_KI270845V1_alt": "NT_187599.1", - "14_KI270846V1_alt": "NT_187600.1", - "14_KI270847V1_alt": "NT_187601.1", - "15_GL383554V1_alt": "NW_003315943.1", - "15_GL383555V2_alt": "NW_003315944.2", - "15_KI270727V1_random": "NT_187382.1", - "15_KI270848V1_alt": "NT_187603.1", - "15_KI270849V1_alt": "NT_187605.1", - "15_KI270850V1_alt": "NT_187606.1", - "15_KI270851V1_alt": "NT_187604.1", - "15_KI270852V1_alt": "NT_187602.1", - "15_KI270905V1_alt": "NT_187660.1", - "15_KI270906V1_alt": "NT_187659.1", - "16_GL383556V1_alt": "NW_003315945.1", - "16_GL383557V1_alt": "NW_003315946.1", - "16_KI270728V1_random": "NT_187383.1", - "16_KI270853V1_alt": "NT_187607.1", - "16_KI270854V1_alt": "NT_187610.1", - "16_KI270855V1_alt": "NT_187608.1", - "16_KI270856V1_alt": "NT_187609.1", - "17_GL000205V2_random": "NT_113930.2", - "17_GL000258V2_alt": "NT_167251.2", - "17_GL383563V3_alt": "NW_003315952.3", - "17_GL383564V2_alt": "NW_003315953.2", - "17_GL383565V1_alt": "NW_003315954.1", - "17_GL383566V1_alt": "NW_003315955.1", - "17_JH159146V1_alt": "NW_003871091.1", - "17_JH159147V1_alt": "NW_003871092.1", - "17_JH159148V1_alt": "NW_003871093.1", - "17_KI270729V1_random": "NT_187384.1", - "17_KI270730V1_random": "NT_187385.1", - "17_KI270857V1_alt": "NT_187614.1", - "17_KI270858V1_alt": "NT_187615.1", - "17_KI270859V1_alt": "NT_187616.1", - "17_KI270860V1_alt": "NT_187612.1", - "17_KI270861V1_alt": "NT_187611.1", - "17_KI270862V1_alt": "NT_187613.1", - "17_KI270907V1_alt": "NT_187662.1", - "17_KI270908V1_alt": "NT_187663.1", - "17_KI270909V1_alt": "NT_187661.1", - "17_KI270910V1_alt": "NT_187664.1", - "18_GL383567V1_alt": "NW_003315956.1", - "18_GL383568V1_alt": "NW_003315957.1", - "18_GL383569V1_alt": "NW_003315958.1", - "18_GL383570V1_alt": "NW_003315959.1", - "18_GL383571V1_alt": "NW_003315960.1", - "18_GL383572V1_alt": "NW_003315961.1", - "18_KI270863V1_alt": "NT_187617.1", - "18_KI270864V1_alt": "NT_187618.1", - "18_KI270911V1_alt": "NT_187666.1", - "18_KI270912V1_alt": "NT_187665.1", - "19_GL000209V2_alt": "NT_113949.2", - "19_GL383573V1_alt": "NW_003315962.1", - "19_GL383574V1_alt": "NW_003315963.1", - "19_GL383575V2_alt": "NW_003315964.2", - "19_GL383576V1_alt": "NW_003315965.1", - "19_GL949746V1_alt": "NW_003571054.1", - "19_GL949747V2_alt": "NW_003571055.2", - "19_GL949748V2_alt": "NW_003571056.2", - "19_GL949749V2_alt": "NW_003571057.2", - "19_GL949750V2_alt": "NW_003571058.2", - "19_GL949751V2_alt": "NW_003571059.2", - "19_GL949752V1_alt": "NW_003571060.1", - "19_GL949753V2_alt": "NW_003571061.2", - "19_KI270865V1_alt": "NT_187621.1", - "19_KI270866V1_alt": "NT_187619.1", - "19_KI270867V1_alt": "NT_187620.1", - "19_KI270868V1_alt": "NT_187622.1", - "19_KI270882V1_alt": "NT_187636.1", - "19_KI270883V1_alt": "NT_187637.1", - "19_KI270884V1_alt": "NT_187638.1", - "19_KI270885V1_alt": "NT_187639.1", - "19_KI270886V1_alt": "NT_187640.1", - "19_KI270887V1_alt": "NT_187641.1", - "19_KI270888V1_alt": "NT_187642.1", - "19_KI270889V1_alt": "NT_187643.1", - "19_KI270890V1_alt": "NT_187644.1", - "19_KI270891V1_alt": "NT_187645.1", - "19_KI270914V1_alt": "NT_187668.1", - "19_KI270915V1_alt": "NT_187669.1", - "19_KI270916V1_alt": "NT_187670.1", - "19_KI270917V1_alt": "NT_187671.1", - "19_KI270918V1_alt": "NT_187672.1", - "19_KI270919V1_alt": "NT_187673.1", - "19_KI270920V1_alt": "NT_187674.1", - "19_KI270921V1_alt": "NT_187675.1", - "19_KI270922V1_alt": "NT_187676.1", - "19_KI270923V1_alt": "NT_187677.1", - "19_KI270929V1_alt": "NT_187683.1", - "19_KI270930V1_alt": "NT_187684.1", - "19_KI270931V1_alt": "NT_187685.1", - "19_KI270932V1_alt": "NT_187686.1", - "19_KI270933V1_alt": "NT_187687.1", - "19_KI270938V1_alt": "NT_187693.1", - "1_GL383518V1_alt": "NW_003315905.1", - "1_GL383519V1_alt": "NW_003315906.1", - "1_GL383520V2_alt": "NW_003315907.2", - "1_KI270706V1_random": "NT_187361.1", - "1_KI270707V1_random": "NT_187362.1", - "1_KI270708V1_random": "NT_187363.1", - "1_KI270709V1_random": "NT_187364.1", - "1_KI270710V1_random": "NT_187365.1", - "1_KI270711V1_random": "NT_187366.1", - "1_KI270712V1_random": "NT_187367.1", - "1_KI270713V1_random": "NT_187368.1", - "1_KI270714V1_random": "NT_187369.1", - "1_KI270759V1_alt": "NT_187516.1", - "1_KI270760V1_alt": "NT_187514.1", - "1_KI270761V1_alt": "NT_187518.1", - "1_KI270762V1_alt": "NT_187515.1", - "1_KI270763V1_alt": "NT_187519.1", - "1_KI270764V1_alt": "NT_187521.1", - "1_KI270765V1_alt": "NT_187520.1", - "1_KI270766V1_alt": "NT_187517.1", - "1_KI270892V1_alt": "NT_187646.1", - "20_GL383577V2_alt": "NW_003315966.2", - "20_KI270869V1_alt": "NT_187623.1", - "20_KI270870V1_alt": "NT_187624.1", - "20_KI270871V1_alt": "NT_187625.1", - "21_GL383578V2_alt": "NW_003315967.2", - "21_GL383579V2_alt": "NW_003315968.2", - "21_GL383580V2_alt": "NW_003315969.2", - "21_GL383581V2_alt": "NW_003315970.2", - "21_KI270872V1_alt": "NT_187626.1", - "21_KI270873V1_alt": "NT_187627.1", - "21_KI270874V1_alt": "NT_187628.1", - "22_GL383582V2_alt": "NW_003315971.2", - "22_GL383583V2_alt": "NW_003315972.2", - "22_KB663609V1_alt": "NW_004504305.1", - "22_KI270731V1_random": "NT_187386.1", - "22_KI270732V1_random": "NT_187387.1", - "22_KI270733V1_random": "NT_187388.1", - "22_KI270734V1_random": "NT_187389.1", - "22_KI270735V1_random": "NT_187390.1", - "22_KI270736V1_random": "NT_187391.1", - "22_KI270737V1_random": "NT_187392.1", - "22_KI270738V1_random": "NT_187393.1", - "22_KI270739V1_random": "NT_187394.1", - "22_KI270875V1_alt": "NT_187629.1", - "22_KI270876V1_alt": "NT_187630.1", - "22_KI270877V1_alt": "NT_187631.1", - "22_KI270878V1_alt": "NT_187632.1", - "22_KI270879V1_alt": "NT_187633.1", - "22_KI270928V1_alt": "NT_187682.1", - "2_GL383521V1_alt": "NW_003315908.1", - "2_GL383522V1_alt": "NW_003315909.1", - "2_GL582966V2_alt": "NW_003571033.2", - "2_KI270715V1_random": "NT_187370.1", - "2_KI270716V1_random": "NT_187371.1", - "2_KI270767V1_alt": "NT_187523.1", - "2_KI270768V1_alt": "NT_187528.1", - "2_KI270769V1_alt": "NT_187522.1", - "2_KI270770V1_alt": "NT_187525.1", - "2_KI270771V1_alt": "NT_187530.1", - "2_KI270772V1_alt": "NT_187524.1", - "2_KI270773V1_alt": "NT_187526.1", - "2_KI270774V1_alt": "NT_187529.1", - "2_KI270775V1_alt": "NT_187531.1", - "2_KI270776V1_alt": "NT_187527.1", - "2_KI270893V1_alt": "NT_187647.1", - "2_KI270894V1_alt": "NT_187648.1", - "3_GL000221V1_random": "NT_167215.1", - "3_GL383526V1_alt": "NW_003315913.1", - "3_JH636055V2_alt": "NW_003871060.2", - "3_KI270777V1_alt": "NT_187533.1", - "3_KI270778V1_alt": "NT_187536.1", - "3_KI270779V1_alt": "NT_187532.1", - "3_KI270780V1_alt": "NT_187537.1", - "3_KI270781V1_alt": "NT_187538.1", - "3_KI270782V1_alt": "NT_187534.1", - "3_KI270783V1_alt": "NT_187535.1", - "3_KI270784V1_alt": "NT_187539.1", - "3_KI270895V1_alt": "NT_187649.1", - "3_KI270924V1_alt": "NT_187678.1", - "3_KI270934V1_alt": "NT_187688.1", - "3_KI270935V1_alt": "NT_187689.1", - "3_KI270936V1_alt": "NT_187690.1", - "3_KI270937V1_alt": "NT_187691.1", - "4_GL000008V2_random": "NT_113793.3", - "4_GL000257V2_alt": "NT_167250.2", - "4_GL383527V1_alt": "NW_003315914.1", - "4_GL383528V1_alt": "NW_003315915.1", - "4_KI270785V1_alt": "NT_187542.1", - "4_KI270786V1_alt": "NT_187543.1", - "4_KI270787V1_alt": "NT_187541.1", - "4_KI270788V1_alt": "NT_187544.1", - "4_KI270789V1_alt": "NT_187545.1", - "4_KI270790V1_alt": "NT_187540.1", - "4_KI270896V1_alt": "NT_187650.1", - "4_KI270925V1_alt": "NT_187679.1", - "5_GL000208V1_random": "NT_113948.1", - "5_GL339449V2_alt": "NW_003315917.2", - "5_GL383530V1_alt": "NW_003315918.1", - "5_GL383531V1_alt": "NW_003315919.1", - "5_GL383532V1_alt": "NW_003315920.1", - "5_GL949742V1_alt": "NW_003571036.1", - "5_KI270791V1_alt": "NT_187547.1", - "5_KI270792V1_alt": "NT_187548.1", - "5_KI270793V1_alt": "NT_187550.1", - "5_KI270794V1_alt": "NT_187551.1", - "5_KI270795V1_alt": "NT_187546.1", - "5_KI270796V1_alt": "NT_187549.1", - "5_KI270897V1_alt": "NT_187651.1", - "5_KI270898V1_alt": "NT_187652.1", - "6_GL000250V2_alt": "NT_167244.2", - "6_GL000251V2_alt": "NT_113891.3", - "6_GL000252V2_alt": "NT_167245.2", - "6_GL000253V2_alt": "NT_167246.2", - "6_GL000254V2_alt": "NT_167247.2", - "6_GL000255V2_alt": "NT_167248.2", - "6_GL000256V2_alt": "NT_167249.2", - "6_GL383533V1_alt": "NW_003315921.1", - "6_KB021644V2_alt": "NW_004166862.2", - "6_KI270758V1_alt": "NT_187692.1", - "6_KI270797V1_alt": "NT_187552.1", - "6_KI270798V1_alt": "NT_187553.1", - "6_KI270799V1_alt": "NT_187554.1", - "6_KI270800V1_alt": "NT_187555.1", - "6_KI270801V1_alt": "NT_187556.1", - "6_KI270802V1_alt": "NT_187557.1", - "7_GL383534V2_alt": "NW_003315922.2", - "7_KI270803V1_alt": "NT_187562.1", - "7_KI270804V1_alt": "NT_187558.1", - "7_KI270805V1_alt": "NT_187560.1", - "7_KI270806V1_alt": "NT_187559.1", - "7_KI270807V1_alt": "NT_187563.1", - "7_KI270808V1_alt": "NT_187564.1", - "7_KI270809V1_alt": "NT_187561.1", - "7_KI270899V1_alt": "NT_187653.1", - "8_KI270810V1_alt": "NT_187567.1", - "8_KI270811V1_alt": "NT_187565.1", - "8_KI270812V1_alt": "NT_187568.1", - "8_KI270813V1_alt": "NT_187570.1", - "8_KI270814V1_alt": "NT_187566.1", - "8_KI270815V1_alt": "NT_187569.1", - "8_KI270816V1_alt": "NT_187571.1", - "8_KI270817V1_alt": "NT_187573.1", - "8_KI270818V1_alt": "NT_187572.1", - "8_KI270819V1_alt": "NT_187574.1", - "8_KI270820V1_alt": "NT_187575.1", - "8_KI270821V1_alt": "NT_187576.1", - "8_KI270822V1_alt": "NT_187577.1", - "8_KI270900V1_alt": "NT_187654.1", - "8_KI270901V1_alt": "NT_187655.1", - "8_KI270926V1_alt": "NT_187680.1", - "9_GL383539V1_alt": "NW_003315928.1", - "9_GL383540V1_alt": "NW_003315929.1", - "9_GL383541V1_alt": "NW_003315930.1", - "9_GL383542V1_alt": "NW_003315931.1", - "9_KI270717V1_random": "NT_187372.1", - "9_KI270718V1_random": "NT_187373.1", - "9_KI270719V1_random": "NT_187374.1", - "9_KI270720V1_random": "NT_187375.1", - "9_KI270823V1_alt": "NT_187578.1", - "Un_GL000195V1": "NT_113901.1", - "Un_GL000213V1": "NT_167208.1", - "Un_GL000214V1": "NT_167209.1", - "Un_GL000216V2": "NT_167211.2", - "Un_GL000218V1": "NT_113889.1", - "Un_GL000219V1": "NT_167213.1", - "Un_GL000220V1": "NT_167214.1", - "Un_GL000224V1": "NT_167218.1", - "Un_GL000226V1": "NT_167220.1", - "Un_KI270302V1": "NT_187396.1", - "Un_KI270303V1": "NT_187398.1", - "Un_KI270304V1": "NT_187397.1", - "Un_KI270305V1": "NT_187399.1", - "Un_KI270310V1": "NT_187402.1", - "Un_KI270311V1": "NT_187406.1", - "Un_KI270312V1": "NT_187405.1", - "Un_KI270315V1": "NT_187404.1", - "Un_KI270316V1": "NT_187403.1", - "Un_KI270317V1": "NT_187407.1", - "Un_KI270320V1": "NT_187401.1", - "Un_KI270322V1": "NT_187400.1", - "Un_KI270329V1": "NT_187459.1", - "Un_KI270330V1": "NT_187458.1", - "Un_KI270333V1": "NT_187461.1", - "Un_KI270334V1": "NT_187460.1", - "Un_KI270335V1": "NT_187462.1", - "Un_KI270336V1": "NT_187465.1", - "Un_KI270337V1": "NT_187466.1", - "Un_KI270338V1": "NT_187463.1", - "Un_KI270340V1": "NT_187464.1", - "Un_KI270362V1": "NT_187469.1", - "Un_KI270363V1": "NT_187467.1", - "Un_KI270364V1": "NT_187468.1", - "Un_KI270366V1": "NT_187470.1", - "Un_KI270371V1": "NT_187494.1", - "Un_KI270372V1": "NT_187491.1", - "Un_KI270373V1": "NT_187492.1", - "Un_KI270374V1": "NT_187490.1", - "Un_KI270375V1": "NT_187493.1", - "Un_KI270376V1": "NT_187489.1", - "Un_KI270378V1": "NT_187471.1", - "Un_KI270379V1": "NT_187472.1", - "Un_KI270381V1": "NT_187486.1", - "Un_KI270382V1": "NT_187488.1", - "Un_KI270383V1": "NT_187482.1", - "Un_KI270384V1": "NT_187484.1", - "Un_KI270385V1": "NT_187487.1", - "Un_KI270386V1": "NT_187480.1", - "Un_KI270387V1": "NT_187475.1", - "Un_KI270388V1": "NT_187478.1", - "Un_KI270389V1": "NT_187473.1", - "Un_KI270390V1": "NT_187474.1", - "Un_KI270391V1": "NT_187481.1", - "Un_KI270392V1": "NT_187485.1", - "Un_KI270393V1": "NT_187483.1", - "Un_KI270394V1": "NT_187479.1", - "Un_KI270395V1": "NT_187476.1", - "Un_KI270396V1": "NT_187477.1", - "Un_KI270411V1": "NT_187409.1", - "Un_KI270412V1": "NT_187408.1", - "Un_KI270414V1": "NT_187410.1", - "Un_KI270417V1": "NT_187415.1", - "Un_KI270418V1": "NT_187412.1", - "Un_KI270419V1": "NT_187411.1", - "Un_KI270420V1": "NT_187413.1", - "Un_KI270422V1": "NT_187416.1", - "Un_KI270423V1": "NT_187417.1", - "Un_KI270424V1": "NT_187414.1", - "Un_KI270425V1": "NT_187418.1", - "Un_KI270429V1": "NT_187419.1", - "Un_KI270435V1": "NT_187424.1", - "Un_KI270438V1": "NT_187425.1", - "Un_KI270442V1": "NT_187420.1", - "Un_KI270448V1": "NT_187495.1", - "Un_KI270465V1": "NT_187422.1", - "Un_KI270466V1": "NT_187421.1", - "Un_KI270467V1": "NT_187423.1", - "Un_KI270468V1": "NT_187426.1", - "Un_KI270507V1": "NT_187437.1", - "Un_KI270508V1": "NT_187430.1", - "Un_KI270509V1": "NT_187428.1", - "Un_KI270510V1": "NT_187427.1", - "Un_KI270511V1": "NT_187435.1", - "Un_KI270512V1": "NT_187432.1", - "Un_KI270515V1": "NT_187436.1", - "Un_KI270516V1": "NT_187431.1", - "Un_KI270517V1": "NT_187438.1", - "Un_KI270518V1": "NT_187429.1", - "Un_KI270519V1": "NT_187433.1", - "Un_KI270521V1": "NT_187496.1", - "Un_KI270522V1": "NT_187434.1", - "Un_KI270528V1": "NT_187440.1", - "Un_KI270529V1": "NT_187439.1", - "Un_KI270530V1": "NT_187441.1", - "Un_KI270538V1": "NT_187443.1", - "Un_KI270539V1": "NT_187442.1", - "Un_KI270544V1": "NT_187444.1", - "Un_KI270548V1": "NT_187445.1", - "Un_KI270579V1": "NT_187450.1", - "Un_KI270580V1": "NT_187448.1", - "Un_KI270581V1": "NT_187449.1", - "Un_KI270582V1": "NT_187454.1", - "Un_KI270583V1": "NT_187446.1", - "Un_KI270584V1": "NT_187453.1", - "Un_KI270587V1": "NT_187447.1", - "Un_KI270588V1": "NT_187455.1", - "Un_KI270589V1": "NT_187451.1", - "Un_KI270590V1": "NT_187452.1", - "Un_KI270591V1": "NT_187457.1", - "Un_KI270593V1": "NT_187456.1", - "Un_KI270741V1": "NT_187497.1", - "Un_KI270742V1": "NT_187513.1", - "Un_KI270743V1": "NT_187498.1", - "Un_KI270744V1": "NT_187499.1", - "Un_KI270745V1": "NT_187500.1", - "Un_KI270746V1": "NT_187501.1", - "Un_KI270747V1": "NT_187502.1", - "Un_KI270748V1": "NT_187503.1", - "Un_KI270749V1": "NT_187504.1", - "Un_KI270750V1": "NT_187505.1", - "Un_KI270751V1": "NT_187506.1", - "Un_KI270752V1": "NT_187507.1", - "Un_KI270753V1": "NT_187508.1", - "Un_KI270754V1": "NT_187509.1", - "Un_KI270755V1": "NT_187510.1", - "Un_KI270756V1": "NT_187511.1", - "Un_KI270757V1": "NT_187512.1", - "X_KI270880V1_alt": "NT_187634.1", - "X_KI270881V1_alt": "NT_187635.1", - "X_KI270913V1_alt": "NT_187667.1", - "Y_KI270740V1_random": "NT_187395.1", - "2_KN538362V1_fix": "NW_011332689.1", - "10_KN538365V1_fix": "NW_011332692.1", - "10_KN538366V1_fix": "NW_011332693.1", - "10_KN538367V1_fix": "NW_011332694.1", - "11_KN538368V1_alt": "NW_011332695.1", - "12_KN538370V1_fix": "NW_011332697.1", - "13_KN538372V1_fix": "NW_011332699.1", - "13_KN538373V1_fix": "NW_011332700.1", - "1_KQ031383V1_fix": "NW_012132914.1", - "2_KQ031384V1_fix": "NW_012132915.1", - "3_KQ031385V1_fix": "NW_012132916.1", - "3_KQ031386V1_fix": "NW_012132917.1", - "6_KQ031387V1_fix": "NW_012132918.1", - "7_KQ031388V1_fix": "NW_012132919.1", - "15_KQ031389V1_alt": "NW_012132920.1", - "16_KQ031390V1_alt": "NW_012132921.1", - "4_KQ090013V1_alt": "NW_013171799.1", - "4_KQ090014V1_alt": "NW_013171800.1", - "4_KQ090015V1_alt": "NW_013171801.1", - "6_KQ090016V1_fix": "NW_013171802.1", - "6_KQ090017V1_alt": "NW_013171803.1", - "9_KQ090018V1_alt": "NW_013171804.1", - "9_KQ090019V1_alt": "NW_013171805.1", - "10_KQ090020V1_alt": "NW_013171806.1", - "11_KQ090022V1_fix": "NW_013171808.1", - "12_KQ090023V1_alt": "NW_013171809.1", - "13_KQ090024V1_alt": "NW_013171810.1", - "13_KQ090025V1_alt": "NW_013171811.1", - "16_KQ090026V1_alt": "NW_013171812.1", - "16_KQ090027V1_alt": "NW_013171813.1", - "1_KQ458382V1_alt": "NW_014040925.1", - "1_KQ458383V1_alt": "NW_014040926.1", - "1_KQ458384V1_alt": "NW_014040927.1", - "18_KQ458385V1_alt": "NW_014040928.1", - "22_KQ458387V1_alt": "NW_014040930.1", - "22_KQ458388V1_alt": "NW_014040931.1", - "11_KQ759759V1_fix": "NW_015148966.1", - "12_KQ759760V1_fix": "NW_015148967.1", - "22_KQ759761V1_alt": "NW_015148968.1", - "22_KQ759762V1_fix": "NW_015148969.1", - "1_KQ983255V1_alt": "NW_015495298.1", - "2_KQ983256V1_alt": "NW_015495299.1", - "4_KQ983258V1_alt": "NW_015495301.1", - "5_KV575243V1_alt": "NW_016107297.1", - "19_KV575246V1_alt": "NW_016107300.1", - "19_KV575247V1_alt": "NW_016107301.1", - "19_KV575248V1_alt": "NW_016107302.1", - "19_KV575249V1_alt": "NW_016107303.1", - "19_KV575250V1_alt": "NW_016107304.1", - "19_KV575251V1_alt": "NW_016107305.1", - "19_KV575252V1_alt": "NW_016107306.1", - "19_KV575253V1_alt": "NW_016107307.1", - "19_KV575254V1_alt": "NW_016107308.1", - "19_KV575255V1_alt": "NW_016107309.1", - "19_KV575256V1_alt": "NW_016107310.1", - "19_KV575257V1_alt": "NW_016107311.1", - "19_KV575258V1_alt": "NW_016107312.1", - "19_KV575259V1_alt": "NW_016107313.1", - "19_KV575260V1_alt": "NW_016107314.1", - "4_KV766193V1_alt": "NW_017363814.1", - "11_KV766195V1_fix": "NW_017363816.1", - "17_KV766197V1_alt": "NW_017363818.1", - "17_KV766198V1_alt": "NW_017363819.1", - "X_KV766199V1_alt": "NW_017363820.1", - "1_KV880763V1_alt": "NW_017852928.1", - "7_KV880764V1_fix": "NW_017852929.1", - "8_KV880766V1_fix": "NW_017852931.1", - "8_KV880767V1_fix": "NW_017852932.1", - "1_KZ208904V1_alt": "NW_018654706.1", - "1_KZ208905V1_alt": "NW_018654707.1", - "2_KZ208907V1_alt": "NW_018654709.1", - "2_KZ208908V1_alt": "NW_018654710.1", - "3_KZ208909V1_alt": "NW_018654711.1", - "5_KZ208910V1_alt": "NW_018654712.1", - "7_KZ208913V1_alt": "NW_018654715.1", - "12_KZ208917V1_fix": "NW_018654719.1", - "12_KZ208918V1_alt": "NW_018654720.1", - "14_KZ208919V1_alt": "NW_018654721.1", - "16_KZ208921V1_alt": "NW_018654723.1", - "18_KZ208922V1_fix": "NW_018654724.1", - "Y_KZ208923V1_fix": "NW_018654725.1", - "Y_KZ208924V1_fix": "NW_018654726.1", - "1_KZ559100V1_fix": "NW_019805487.1", - "3_KZ559101V1_alt": "NW_019805488.1", - "3_KZ559102V1_alt": "NW_019805489.1", - "3_KZ559103V1_alt": "NW_019805490.1", - "3_KZ559104V1_fix": "NW_019805491.1", - "3_KZ559105V1_alt": "NW_019805492.1", - "7_KZ559106V1_alt": "NW_019805493.1", - "8_KZ559107V1_alt": "NW_019805494.1", - "11_KZ559110V1_alt": "NW_019805497.1", - "11_KZ559111V1_alt": "NW_019805498.1", - "12_KZ559112V1_alt": "NW_019805499.1", - "17_KZ559114V1_alt": "NW_019805501.1", - "18_KZ559115V1_fix": "NW_019805502.1", - "18_KZ559116V1_alt": "NW_019805503.1", - "2_ML143342V1_fix": "NW_021159988.1", - "3_ML143343V1_alt": "NW_021159989.1", - "4_ML143344V1_fix": "NW_021159990.1", - "4_ML143345V1_fix": "NW_021159991.1", - "4_ML143346V1_fix": "NW_021159992.1", - "4_ML143347V1_fix": "NW_021159993.1", - "4_ML143348V1_fix": "NW_021159994.1", - "4_ML143349V1_fix": "NW_021159995.1", - "6_ML143351V1_fix": "NW_021159997.1", - "9_ML143353V1_fix": "NW_021159999.1", - "10_ML143354V1_fix": "NW_021160000.1", - "10_ML143355V1_fix": "NW_021160001.1", - "11_ML143356V1_fix": "NW_021160002.1", - "11_ML143357V1_fix": "NW_021160003.1", - "11_ML143360V1_fix": "NW_021160006.1", - "13_ML143363V1_fix": "NW_021160009.1", - "13_ML143364V1_fix": "NW_021160010.1", - "13_ML143366V1_fix": "NW_021160012.1", - "14_ML143367V1_fix": "NW_021160013.1", - "14_ML143368V1_alt": "NW_021160014.1", - "15_ML143369V1_fix": "NW_021160015.1", - "15_ML143370V1_fix": "NW_021160016.1", - "15_ML143372V1_fix": "NW_021160018.1", - "17_ML143374V1_fix": "NW_021160020.1", - "17_ML143375V1_fix": "NW_021160021.1", - "21_ML143377V1_fix": "NW_021160023.1", - "22_ML143378V1_fix": "NW_021160024.1", - "22_ML143379V1_fix": "NW_021160025.1", - "22_ML143380V1_fix": "NW_021160026.1", - "X_ML143382V1_fix": "NW_021160028.1", - "X_ML143383V1_fix": "NW_021160029.1", - "X_ML143384V1_fix": "NW_021160030.1", - "X_ML143385V1_fix": "NW_021160031.1", - # GRC Alts - 'HG1342_HG2282_PATCH': 'NW_012132914.1', - 'HSCHR1_5_CTG3': 'NW_015495298.1', - 'HG2095_PATCH': 'NW_011332688.1', - 'HSCHR1_4_CTG3': 'NW_014040926.1', - 'HG2058_PATCH': 'NW_009646195.1', - 'HSCHR1_8_CTG3': 'NW_018654706.1', - 'HG460_PATCH': 'NW_019805487.1', - 'HG986_PATCH': 'NW_009646194.1', - 'HSCHR1_9_CTG3': 'NW_018654707.1', - 'HSCHR1_3_CTG3': 'NW_014040925.1', - 'HSCHR1_6_CTG3': 'NW_017852928.1', - 'HG2104_PATCH': 'NW_009646196.1', - 'HG1832_PATCH': 'NW_011332687.1', - 'HG2002_PATCH': 'NW_018654708.1', - 'HSCHR1_5_CTG32_1': 'NW_014040927.1', - 'HG2290_PATCH': 'NW_012132915.1', - 'HSCHR2_7_CTG7_2': 'NW_018654709.1', - 'HSCHR2_6_CTG7_2': 'NW_015495299.1', - 'HSCHR2_8_CTG7_2': 'NW_018654710.1', - 'HG2232_PATCH': 'NW_011332690.1', - 'HG2233_PATCH': 'NW_011332689.1', - 'HG2236_PATCH': 'NW_017363813.1', - 'HG2066_PATCH': 'NW_009646197.1', - 'HG2235_PATCH': 'NW_012132916.1', - 'HG126_PATCH': 'NW_011332691.1', - 'HSCHR3_4_CTG1': 'NW_018654711.1', - 'HG2237_PATCH': 'NW_012132917.1', - 'HG2022_PATCH': 'NW_009646198.1', - 'HG2133_PATCH': 'NW_019805491.1', - 'HSCHR3_6_CTG2_1': 'NW_019805492.1', - 'HSCHR3_9_CTG2_1': 'NW_019805490.1', - 'HSCHR3_8_CTG2_1': 'NW_019805489.1', - 'HSCHR3_7_CTG2_1': 'NW_019805488.1', - 'HSCHR4_2_CTG4': 'NW_013171799.1', - 'HSCHR4_8_CTG12': 'NW_013171800.1', - 'HSCHR4_9_CTG12': 'NW_013171801.1', - 'HSCHR4_12_CTG12': 'NW_017363814.1', - 'HG2023_PATCH': 'NW_015495300.1', - 'HSCHR4_11_CTG12': 'NW_015495301.1', - 'HSCHR5_9_CTG1': 'NW_018654712.1', - 'HSCHR5_7_CTG1': 'NW_009646199.1', - 'HSCHR5_8_CTG1': 'NW_016107297.1', - 'HG30_PATCH': 'NW_016107298.1', - 'HG2057_PATCH': 'NW_018654713.1', - 'HSCHR6_1_CTG10': 'NW_013171803.1', - 'HG1651_PATCH': 'NW_012132918.1', - 'HG2128_PATCH': 'NW_009646200.1', - 'HG2072_PATCH': 'NW_013171802.1', - 'HG2121_PATCH': 'NW_017363815.1', - 'HSCHR7_3_CTG1': 'NW_019805493.1', - 'HG2088_PATCH': 'NW_017852929.1', - 'HG2266_PATCH': 'NW_017852930.1', - 'HG708_PATCH': 'NW_018654714.1', - 'HSCHR7_3_CTG4_4': 'NW_018654715.1', - 'HG2239_PATCH': 'NW_012132919.1', - 'HG76_PATCH': 'NW_018654717.1', - 'HG2068_PATCH': 'NW_017852932.1', - 'HG2067_PATCH': 'NW_017852931.1', - 'HSCHR8_7_CTG7': 'NW_019805494.1', - 'HG2419_PATCH': 'NW_018654716.1', - 'HSCHR9_1_CTG6': 'NW_013171804.1', - 'HSCHR9_1_CTG7': 'NW_013171805.1', - 'HG2030_PATCH': 'NW_009646201.1', - 'HG2244_HG2245_PATCH': 'NW_011332694.1', - 'HSCHR10_1_CTG6': 'NW_013171806.1', - 'HG2191_PATCH': 'NW_009646202.1', - 'HG2334_PATCH': 'NW_013171807.1', - 'HG2242_HG2243_PATCH': 'NW_011332693.1', - 'HG2241_PATCH': 'NW_011332692.1', - 'HG107_PATCH': 'NW_015148966.1', - 'HSCHR11_1_CTG1_2': 'NW_011332695.1', - 'HG2114_PATCH': 'NW_019805496.1', - 'HG2060_PATCH': 'NW_019805495.1', - 'HG1708_PATCH': 'NW_017363816.1', - 'HSCHR11_1_CTG3_1': 'NW_019805498.1', - 'HSCHR11_2_CTG8': 'NW_019805497.1', - 'HG2116_PATCH': 'NW_013171808.1', - 'HG2217_PATCH': 'NW_009646203.1', - 'HSCHR12_2_CTG1': 'NW_013171809.1', - 'HG1815_PATCH': 'NW_018654718.1', - 'HG1362_PATCH': 'NW_011332696.1', - 'HG23_PATCH': 'NW_009646204.1', - 'HSCHR12_8_CTG2_1': 'NW_018654720.1', - 'HG2063_PATCH': 'NW_015148967.1', - 'HG2047_PATCH': 'NW_018654719.1', - 'HG2247_PATCH': 'NW_011332697.1', - 'HSCHR12_9_CTG2_1': 'NW_019805499.1', - 'HG2291_PATCH': 'NW_011332699.1', - 'HSCHR13_1_CTG7': 'NW_013171810.1', - 'HG2216_PATCH': 'NW_009646205.1', - 'HG2249_PATCH': 'NW_011332700.1', - 'HSCHR13_1_CTG8': 'NW_013171811.1', - 'HG2288_HG2289_PATCH': 'NW_011332698.1', - 'HG1_PATCH': 'NW_018654722.1', - 'HSCHR14_8_CTG1': 'NW_018654721.1', - 'HG2139_PATCH': 'NW_011332701.1', - 'HSCHR15_6_CTG8': 'NW_012132920.1', - 'HSCHR16_5_CTG1': 'NW_013171812.1', - 'HG2263_PATCH': 'NW_019805500.1', - 'HG926_PATCH': 'NW_017852933.1', - 'HSCHR16_4_CTG3_1': 'NW_013171813.1', - 'HSCHR16_5_CTG3_1': 'NW_018654723.1', - 'HSCHR16_3_CTG3_1': 'NW_012132921.1', - 'HG2285_HG106_HG2252_PATCH': 'NW_017363817.1', - 'HG2046_PATCH': 'NW_016107299.1', - 'HSCHR17_3_CTG1': 'NW_017363819.1', - 'HSCHR17_11_CTG4': 'NW_017363818.1', - 'HSCHR17_12_CTG4': 'NW_019805501.1', - 'HSCHR18_1_CTG1': 'NW_019805503.1', - 'HSCHR18_5_CTG1_1': 'NW_014040928.1', - 'HG2412_PATCH': 'NW_019805502.1', - 'HG2213_PATCH': 'NW_013171814.1', - 'HG2442_PATCH': 'NW_018654724.1', - 'HG26_PATCH': 'NW_014040929.1', - 'HG2021_PATCH': 'NW_009646206.1', - 'HSCHR19KIR_0019-4656-A_CTG3_1': 'NW_016107300.1', - 'HSCHR19KIR_CA01-TA01_1_CTG3_1': 'NW_016107301.1', - 'HSCHR19KIR_CA01-TA01_2_CTG3_1': 'NW_016107302.1', - 'HSCHR19KIR_CA01-TB04_CTG3_1': 'NW_016107303.1', - 'HSCHR19KIR_CA01-TB01_CTG3_1': 'NW_016107304.1', - 'HSCHR19KIR_HG2394_CTG3_1': 'NW_016107305.1', - 'HSCHR19KIR_502960008-2_CTG3_1': 'NW_016107306.1', - 'HSCHR19KIR_502960008-1_CTG3_1': 'NW_016107307.1', - 'HSCHR19KIR_0010-5217-AB_CTG3_1': 'NW_016107308.1', - 'HSCHR19KIR_7191059-1_CTG3_1': 'NW_016107309.1', - 'HSCHR19KIR_0019-4656-B_CTG3_1': 'NW_016107310.1', - 'HSCHR19KIR_CA04_CTG3_1': 'NW_016107311.1', - 'HSCHR19KIR_7191059-2_CTG3_1': 'NW_016107313.1', - 'HSCHR19KIR_HG2396_CTG3_1': 'NW_016107314.1', - 'HSCHR19KIR_HG2393_CTG3_1': 'NW_016107312.1', - 'HSCHR22_4_CTG1': 'NW_009646207.1', - 'HSCHR22_6_CTG1': 'NW_014040930.1', - 'HSCHR22_7_CTG1': 'NW_014040931.1', - 'HSCHR22_5_CTG1': 'NW_009646208.1', - 'HSCHR22_8_CTG1': 'NW_015148968.1', - 'HG1311_PATCH': 'NW_015148969.1', - 'HSCHRX_3_CTG7': 'NW_017363820.1', - 'HG1531_PATCH': 'NW_018654725.1', - 'HG1535_PATCH': 'NW_018654726.1', - 'HG2062_PATCH': 'NW_009646209.1', - 'HSCHR1_1_CTG3': 'NT_187515.1', - 'HSCHR1_2_CTG3': 'NT_187517.1', - 'HSCHR1_1_CTG11': 'NT_187514.1', - 'HSCHR1_4_CTG31': 'NT_187520.1', - 'HSCHR1_1_CTG31': 'NW_003315905.1', - 'HSCHR1_2_CTG31': 'NW_003315906.1', - 'HSCHR1_3_CTG31': 'NW_003315907.2', - 'HSCHR1_4_CTG32_1': 'NT_187521.1', - 'HSCHR1_3_CTG32_1': 'NT_187519.1', - 'HSCHR1_1_CTG32_1': 'NT_187516.1', - 'HSCHR1_2_CTG32_1': 'NT_187518.1', - 'HSCHR2_2_CTG1': 'NT_187525.1', - 'HSCHR2_3_CTG1': 'NT_187526.1', - 'HSCHR2_4_CTG1': 'NT_187529.1', - 'HSCHR2_1_CTG1': 'NT_187522.1', - 'HSCHR2_1_CTG5': 'NW_003315908.1', - 'HSCHR2_1_CTG7': 'NT_187524.1', - 'HSCHR2_5_CTG7_2': 'NT_187531.1', - 'HSCHR2_4_CTG7_2': 'NT_187530.1', - 'HSCHR2_3_CTG7_2': 'NT_187528.1', - 'HSCHR2_2_CTG7_2': 'NW_003571033.2', - 'HSCHR2_1_CTG7_2': 'NW_003315909.1', - 'HSCHR2_3_CTG15': 'NT_187527.1', - 'HSCHR2_1_CTG15': 'NT_187523.1', - 'HSCHR3_1_CTG1': 'NW_003871060.2', - 'HSCHR3_3_CTG1': 'NT_187535.1', - 'HSCHR3_4_CTG2_1': 'NT_187537.1', - 'HSCHR3_1_CTG2_1': 'NW_003315913.1', - 'HSCHR3_2_CTG2_1': 'NT_187533.1', - 'HSCHR3_3_CTG2_1': 'NT_187536.1', - 'HSCHR3_5_CTG2_1': 'NT_187538.1', - 'HSCHR3_1_CTG3': 'NT_187532.1', - 'HSCHR3_2_CTG3': 'NT_187534.1', - 'HSCHR3_9_CTG3': 'NT_187539.1', - 'HSCHR4_1_CTG4': 'NT_187540.1', - 'HSCHR4_1_CTG6': 'NW_003315915.1', - 'HSCHR4_1_CTG8_1': 'NT_187541.1', - 'HSCHR4_1_CTG9': 'NT_167250.2', - 'HSCHR4_4_CTG12': 'NT_187544.1', - 'HSCHR4_1_CTG12': 'NW_003315914.1', - 'HSCHR4_2_CTG12': 'NT_187542.1', - 'HSCHR4_5_CTG12': 'NT_187545.1', - 'HSCHR4_3_CTG12': 'NT_187543.1', - 'HSCHR5_5_CTG1': 'NT_187550.1', - 'HSCHR5_4_CTG1': 'NT_187548.1', - 'HSCHR5_3_CTG1': 'NT_187547.1', - 'HSCHR5_1_CTG1': 'NW_003315920.1', - 'HSCHR5_2_CTG1': 'NW_003571036.1', - 'HSCHR5_6_CTG1': 'NT_187551.1', - 'HSCHR5_2_CTG1_1': 'NW_003315917.2', - 'HSCHR5_3_CTG1_1': 'NW_003315918.1', - 'HSCHR5_4_CTG1_1': 'NT_187549.1', - 'HSCHR5_1_CTG5': 'NW_003315919.1', - 'HSCHR5_2_CTG5': 'NT_187546.1', - 'HSCHR6_MHC_APD_CTG1': 'NT_167244.2', - 'HSCHR6_1_CTG7': 'NT_187555.1', - 'HSCHR6_1_CTG6': 'NT_187554.1', - 'HSCHR6_1_CTG2': 'NW_003315921.1', - 'HSCHR6_1_CTG8': 'NT_187556.1', - 'HSCHR6_1_CTG9': 'NT_187557.1', - 'HSCHR6_1_CTG3': 'NW_004166862.2', - 'HSCHR6_1_CTG4': 'NT_187552.1', - 'HSCHR6_1_CTG5': 'NT_187553.1', - 'HSCHR7_1_CTG1': 'NT_187558.1', - 'HSCHR7_2_CTG4_4': 'NT_187561.1', - 'HSCHR7_1_CTG4_4': 'NT_187559.1', - 'HSCHR7_1_CTG6': 'NW_003315922.2', - 'HSCHR7_2_CTG6': 'NT_187562.1', - 'HSCHR7_3_CTG6': 'NT_187564.1', - 'HSCHR7_2_CTG7': 'NT_187563.1', - 'HSCHR7_1_CTG7': 'NT_187560.1', - 'HSCHR8_4_CTG1': 'NT_187572.1', - 'HSCHR8_2_CTG1': 'NT_187568.1', - 'HSCHR8_1_CTG1': 'NT_187565.1', - 'HSCHR8_8_CTG1': 'NT_187576.1', - 'HSCHR8_3_CTG1': 'NT_187570.1', - 'HSCHR8_9_CTG1': 'NT_187577.1', - 'HSCHR8_1_CTG6': 'NT_187566.1', - 'HSCHR8_1_CTG7': 'NT_187567.1', - 'HSCHR8_5_CTG7': 'NT_187574.1', - 'HSCHR8_6_CTG7': 'NT_187575.1', - 'HSCHR8_4_CTG7': 'NT_187573.1', - 'HSCHR8_3_CTG7': 'NT_187571.1', - 'HSCHR8_2_CTG7': 'NT_187569.1', - 'HSCHR9_1_CTG1': 'NW_003315928.1', - 'HSCHR9_1_CTG2': 'NW_003315929.1', - 'HSCHR9_1_CTG3': 'NW_003315930.1', - 'HSCHR9_1_CTG4': 'NW_003315931.1', - 'HSCHR9_1_CTG5': 'NT_187578.1', - 'HSCHR10_1_CTG1': 'NW_003315934.1', - 'HSCHR10_1_CTG3': 'NT_187579.1', - 'HSCHR10_1_CTG2': 'NW_003315935.1', - 'HSCHR10_1_CTG4': 'NT_187580.1', - 'HSCHR11_1_CTG8': 'NT_187586.1', - 'HSCHR11_1_CTG6': 'NT_187584.1', - 'HSCHR11_1_CTG7': 'NT_187585.1', - 'HSCHR11_1_CTG5': 'NT_187583.1', - 'HSCHR11_1_CTG1_1': 'NW_003315936.1', - 'HG142_HG150_NOVEL_TEST': 'NW_003871073.1', - 'HG151_NOVEL_TEST': 'NW_003871074.1', - 'HSCHR11_1_CTG3': 'NT_187582.1', - 'HSCHR11_1_CTG2': 'NT_187581.1', - 'HSCHR12_1_CTG1': 'NW_003571049.1', - 'HSCHR12_2_CTG2': 'NW_003571050.1', - 'HSCHR12_5_CTG2': 'NT_187588.1', - 'HSCHR12_1_CTG2': 'NW_003315938.1', - 'HSCHR12_4_CTG2': 'NT_187587.1', - 'HSCHR12_1_CTG2_1': 'NW_003315939.2', - 'HSCHR12_2_CTG2_1': 'NW_003315941.1', - 'HSCHR12_3_CTG2_1': 'NW_003315942.2', - 'HSCHR12_6_CTG2_1': 'NT_187590.1', - 'HSCHR12_4_CTG2_1': 'NW_003315940.1', - 'HSCHR12_5_CTG2_1': 'NT_187589.1', - 'HSCHR12_7_CTG2_1': 'NT_187591.1', - 'HSCHR13_1_CTG3': 'NT_187594.1', - 'HSCHR13_1_CTG2': 'NT_187593.1', - 'HSCHR13_1_CTG6': 'NT_187597.1', - 'HSCHR13_1_CTG4': 'NT_187595.1', - 'HSCHR13_1_CTG1': 'NT_187592.1', - 'HSCHR13_1_CTG5': 'NT_187596.1', - 'HSCHR14_1_CTG1': 'NT_187598.1', - 'HSCHR14_7_CTG1': 'NT_187601.1', - 'HSCHR14_2_CTG1': 'NT_187599.1', - 'HSCHR14_3_CTG1': 'NT_187600.1', - 'HSCHR15_1_CTG1': 'NT_187602.1', - 'HSCHR15_3_CTG3': 'NT_187604.1', - 'HSCHR15_1_CTG3': 'NT_187603.1', - 'HSCHR15_1_CTG8': 'NW_003315943.1', - 'HSCHR15_3_CTG8': 'NT_187605.1', - 'HSCHR15_2_CTG8': 'NW_003315944.2', - 'HSCHR15_5_CTG8': 'NT_187606.1', - 'HSCHR16_CTG2': 'NT_187610.1', - 'HSCHR16_4_CTG1': 'NT_187609.1', - 'HSCHR16_3_CTG1': 'NT_187608.1', - 'HSCHR16_1_CTG1': 'NT_187607.1', - 'HSCHR16_1_CTG3_1': 'NW_003315945.1', - 'HSCHR16_2_CTG3_1': 'NW_003315946.1', - 'HSCHR17_1_CTG1': 'NW_003315952.3', - 'HSCHR17_2_CTG2': 'NT_187613.1', - 'HSCHR17_1_CTG2': 'NT_187611.1', - 'HSCHR17_7_CTG4': 'NT_187614.1', - 'HSCHR17_4_CTG4': 'NW_003871091.1', - 'HSCHR17_5_CTG4': 'NW_003871092.1', - 'HSCHR17_1_CTG4': 'NW_003315953.2', - 'HSCHR17_1_CTG5': 'NT_167251.2', - 'HSCHR17_2_CTG4': 'NW_003315954.1', - 'HSCHR17_8_CTG4': 'NT_187615.1', - 'HSCHR17_9_CTG4': 'NT_187616.1', - 'HSCHR17_3_CTG4': 'NW_003315955.1', - 'HSCHR17_1_CTG9': 'NT_187612.1', - 'HSCHR18_4_CTG1_1': 'NT_187618.1', - 'HSCHR18_1_CTG1_1': 'NW_003315956.1', - 'HSCHR18_2_CTG1_1': 'NW_003315959.1', - 'HSCHR18_2_CTG2': 'NW_003315960.1', - 'HSCHR18_1_CTG2': 'NW_003315957.1', - 'HSCHR18_1_CTG2_1': 'NW_003315958.1', - 'HSCHR18_2_CTG2_1': 'NW_003315961.1', - 'HSCHR18_3_CTG2_1': 'NT_187617.1', - 'HSCHR19_5_CTG2': 'NT_187622.1', - 'HSCHR19_4_CTG2': 'NT_187621.1', - 'HSCHR19_1_CTG2': 'NW_003315962.1', - 'HSCHR19_2_CTG2': 'NW_003315964.2', - 'HSCHR19_3_CTG2': 'NW_003315965.1', - 'HSCHR19_1_CTG3_1': 'NW_003315963.1', - 'HSCHR19_2_CTG3_1': 'NT_187619.1', - 'HSCHR19_3_CTG3_1': 'NT_187620.1', - 'HSCHR19LRC_COX1_CTG3_1': 'NW_003571054.1', - 'HSCHR20_1_CTG1': 'NW_003315966.2', - 'HSCHR20_1_CTG2': 'NT_187623.1', - 'HSCHR20_1_CTG4': 'NT_187625.1', - 'HSCHR20_1_CTG3': 'NT_187624.1', - 'HSCHR21_1_CTG1_1': 'NW_003315967.2', - 'HSCHR21_8_CTG1_1': 'NT_187628.1', - 'HSCHR21_6_CTG1_1': 'NT_187627.1', - 'HSCHR21_2_CTG1_1': 'NW_003315968.2', - 'HSCHR21_3_CTG1_1': 'NW_003315969.2', - 'HSCHR21_4_CTG1_1': 'NW_003315970.2', - 'HSCHR21_5_CTG2': 'NT_187626.1', - 'HSCHR22_1_CTG3': 'NT_187629.1', - 'HSCHR22_1_CTG6': 'NT_187632.1', - 'HSCHR22_1_CTG7': 'NT_187633.1', - 'HSCHR22_1_CTG4': 'NT_187630.1', - 'HSCHR22_1_CTG5': 'NT_187631.1', - 'HSCHR22_1_CTG2': 'NW_003315972.2', - 'HSCHR22_1_CTG1': 'NW_003315971.2', - 'HSCHRX_1_CTG3': 'NT_187634.1', - 'HSCHRX_2_CTG12': 'NT_187635.1', - 'HSCHR1_ALT2_1_CTG32_1': 'NT_187646.1', - 'HSCHR2_2_CTG7': 'NT_187648.1', - 'HSCHR2_2_CTG15': 'NT_187647.1', - 'HSCHR3_3_CTG3': 'NT_187649.1', - 'HSCHR4_6_CTG12': 'NT_187650.1', - 'HSCHR5_1_CTG1_1': 'NT_187651.1', - 'HSCHR5_3_CTG5': 'NT_187652.1', - 'HSCHR6_MHC_COX_CTG1': 'NT_113891.3', - 'HSCHR7_2_CTG1': 'NT_187653.1', - 'HSCHR8_6_CTG1': 'NT_187655.1', - 'HSCHR8_5_CTG1': 'NT_187654.1', - 'HSCHR11_2_CTG1': 'NT_187656.1', - 'HSCHR11_2_CTG1_1': 'NT_187657.1', - 'HSCHR12_3_CTG2': 'NT_187658.1', - 'HSCHR15_2_CTG3': 'NT_187659.1', - 'HSCHR15_4_CTG8': 'NT_187660.1', - 'HSCHR17_2_CTG1': 'NT_187662.1', - 'HSCHR17_3_CTG2': 'NT_187664.1', - 'HSCHR17_10_CTG4': 'NT_187661.1', - 'HSCHR17_6_CTG4': 'NW_003871093.1', - 'HSCHR17_2_CTG5': 'NT_187663.1', - 'HSCHR18_ALT21_CTG2_1': 'NT_187665.1', - 'HSCHR18_ALT2_CTG2_1': 'NT_187666.1', - 'HSCHR19LRC_COX2_CTG3_1': 'NW_003571055.2', - 'HSCHR22_2_CTG1': 'NW_004504305.1', - 'HSCHRX_2_CTG3': 'NT_187667.1', - 'HSCHR3_4_CTG3': 'NT_187678.1', - 'HSCHR4_7_CTG12': 'NT_187679.1', - 'HSCHR6_MHC_DBB_CTG1': 'NT_167245.2', - 'HSCHR8_7_CTG1': 'NT_187680.1', - 'HSCHR11_3_CTG1': 'NT_187681.1', - 'HSCHR19LRC_LRC_I_CTG3_1': 'NW_003571056.2', - 'HSCHR22_3_CTG1': 'NT_187682.1', - 'HSCHR3_5_CTG3': 'NT_187688.1', - 'HSCHR6_MHC_MANN_CTG1': 'NT_167246.2', - 'HSCHR19LRC_LRC_J_CTG3_1': 'NW_003571057.2', - 'HSCHR3_6_CTG3': 'NT_187689.1', - 'HSCHR6_MHC_MCF_CTG1': 'NT_167247.2', - 'HSCHR19LRC_LRC_S_CTG3_1': 'NW_003571058.2', - 'HSCHR3_7_CTG3': 'NT_187690.1', - 'HSCHR6_MHC_QBL_CTG1': 'NT_167248.2', - 'HSCHR19LRC_LRC_T_CTG3_1': 'NW_003571059.2', - 'HSCHR3_8_CTG3': 'NT_187691.1', - 'HSCHR6_MHC_SSTO_CTG1': 'NT_167249.2', - 'HSCHR19LRC_PGF1_CTG3_1': 'NW_003571060.1', - 'HSCHR6_8_CTG1': 'NT_187692.1', - 'HSCHR19LRC_PGF2_CTG3_1': 'NW_003571061.2', - 'HSCHR19_4_CTG3_1': 'NT_187693.1', - 'HSCHR19KIR_FH15_B_HAP_CTG3_1': 'NT_187636.1', - 'HSCHR19KIR_G085_A_HAP_CTG3_1': 'NT_187637.1', - 'HSCHR19KIR_G085_BA1_HAP_CTG3_1': 'NT_187638.1', - 'HSCHR19KIR_G248_A_HAP_CTG3_1': 'NT_187639.1', - 'HSCHR19KIR_G248_BA2_HAP_CTG3_1': 'NT_187640.1', - 'HSCHR19KIR_GRC212_AB_HAP_CTG3_1': 'NT_187641.1', - 'HSCHR19KIR_GRC212_BA1_HAP_CTG3_1': 'NT_187642.1', - 'HSCHR19KIR_LUCE_A_HAP_CTG3_1': 'NT_187643.1', - 'HSCHR19KIR_LUCE_BDEL_HAP_CTG3_1': 'NT_187644.1', - 'HSCHR19KIR_RSH_A_HAP_CTG3_1': 'NT_187645.1', - 'HSCHR19KIR_RSH_BA2_HAP_CTG3_1': 'NT_187668.1', - 'HSCHR19KIR_T7526_A_HAP_CTG3_1': 'NT_187669.1', - 'HSCHR19KIR_T7526_BDEL_HAP_CTG3_1': 'NT_187670.1', - 'HSCHR19KIR_ABC08_A1_HAP_CTG3_1': 'NT_187671.1', - 'HSCHR19KIR_ABC08_AB_HAP_C_P_CTG3_1': 'NT_187672.1', - 'HSCHR19KIR_ABC08_AB_HAP_T_P_CTG3_1': 'NT_187673.1', - 'HSCHR19KIR_FH05_A_HAP_CTG3_1': 'NT_187674.1', - 'HSCHR19KIR_FH05_B_HAP_CTG3_1': 'NT_187675.1', - 'HSCHR19KIR_FH06_A_HAP_CTG3_1': 'NT_187676.1', - 'HSCHR19KIR_FH06_BA1_HAP_CTG3_1': 'NT_187677.1', - 'HSCHR19KIR_FH08_A_HAP_CTG3_1': 'NT_187683.1', - 'HSCHR19KIR_FH08_BAX_HAP_CTG3_1': 'NT_187684.1', - 'HSCHR19KIR_FH13_A_HAP_CTG3_1': 'NT_187685.1', - 'HSCHR19KIR_FH13_BA2_HAP_CTG3_1': 'NT_187686.1', - 'HSCHR19KIR_FH15_A_HAP_CTG3_1': 'NT_187687.1', - 'HSCHR19KIR_RP5_B_HAP_CTG3_1': 'NT_113949.2', - 'HSCHR22_CTG1_3': 'NT_167235.1', - 'HG1343_HG173_HG459_PATCH': 'NW_025791756.1', - 'HSCHR1_12_CTG3': 'NW_025791753.1', - 'HG2515_PATCH': 'NW_025791758.1', - 'HG2577_PATCH': 'NW_025791759.1', - 'HSCHR1_5_CTG31': 'NW_025791754.1', - 'HG2571_PATCH': 'NW_025791757.1', - 'HSCHR1_6_CTG31': 'NW_025791755.1', - 'HG1384_PATCH': 'NW_021159988.1', - 'HG2231_HG2496_PATCH': 'NW_025791767.1', - 'HG2052_PATCH': 'NW_025791766.1', - 'HSCHR2_6_CTG1': 'NW_025791763.1', - 'HSCHR2_10_CTG7_2': 'NW_025791760.1', - 'HG2275_PATCH': 'NW_025791765.1', - 'HSCHR2_12_CTG7_2': 'NW_025791762.1', - 'HSCHR2_11_CTG7_2': 'NW_025791761.1', - 'HG2494_PATCH': 'NW_025791764.1', - 'HG2077_PATCH': 'NW_025791770.1', - 'HG2069_PATCH': 'NW_025791771.1', - 'HG2264_PATCH': 'NW_025791769.1', - 'HG287_PATCH': 'NW_025791774.1', - 'HSCHR4_2_CTG8_1': 'NW_025791772.1', - 'HG2155_PATCH': 'NW_025791773.1', - 'HG2476_PATCH': 'NW_025791776.1', - 'HSCHR5_10_CTG1': 'NW_025791779.1', - 'HG1395_PATCH': 'NW_021159996.1', - 'HG2308_PATCH': 'NW_025791778.1', - 'HG1046_PATCH': 'NW_025791775.1', - 'HSCHR6_1_CTG1': 'NW_025791780.1', - 'HSCHR7_4_CTG1': 'NW_025791781.1', - 'HG2176_PATCH': 'NW_025791782.1', - 'HG2408_PATCH': 'NW_025791784.1', - 'HG1047_PATCH': 'NW_025791783.1', - 'HG1206_PATCH': 'NW_025791789.1', - 'HG2158_PATCH': 'NW_025791787.1', - 'HG1012_PATCH': 'NW_025791788.1', - 'HG2576_PATCH': 'NW_025791790.1', - 'HG107_HG2565_PATCH': 'NW_015148966.2', - 'HG152_PATCH': 'NW_025791792.1', - 'HG28_PATCH': 'NW_021160004.1', - 'HG2578_PATCH': 'NW_025791794.1', - 'HG2115_PATCH': 'NW_021160005.1', - 'HSCHR11_2_CTG3_1': 'NW_025791791.1', - 'HG1398_PATCH': 'NW_021160008.1', - 'HG2554_PATCH': 'NW_025791795.1', - 'HG2246_HG2248_HG2276_PATCH': 'NW_021160007.1', - 'HG2509_PATCH': 'NW_021160012.1', - 'HG2510_PATCH': 'NW_021160013.1', - 'HG2526_HG2573_PATCH': 'NW_025791796.1', - 'HG2511_PATCH': 'NW_021160018.1', - 'HG2365_PATCH': 'NW_021160017.1', - 'HSCHR15_9_CTG8': 'NW_025791798.1', - 'HG2198_PATCH': 'NW_021160016.1', - 'HG2280_PATCH': 'NW_025791797.1', - 'HG2499_PATCH': 'NW_021160015.1', - 'HG2471_PATCH': 'NW_021160019.1', - 'HG405_PATCH': 'NW_025791800.1', - 'HG2087_PATCH': 'NW_021160020.1', - 'HG2407_PATCH': 'NW_025791803.1', - 'HSCHR17_13_CTG4': 'NW_025791801.1', - 'HG2580_PATCH': 'NW_025791806.1', - 'HG2118_PATCH': 'NW_025791802.1', - 'HG1369_PATCH': 'NW_025791805.1', - 'HG1320_PATCH': 'NW_021160021.1', - 'HG2251_PATCH': 'NW_025791804.1', - 'HSCHR19_6_CTG2': 'NW_025791810.1', - 'HG2461_PATCH': 'NW_025791807.1', - 'HG109_PATCH': 'NW_021160022.1', - 'HG2569_PATCH': 'NW_025791808.1', - 'HG2225_PATCH': 'NW_025791811.1', - 'HG410_PATCH': 'NW_025791812.1', - 'HG2513_PATCH': 'NW_021160023.1', - 'HG2219_PATCH': 'NW_025791813.1', - 'HG2265_PATCH': 'NW_025791814.1', - 'HG2521_PATCH': 'NW_025791815.1', - 'HG2512_PATCH': 'NW_021160026.1', - 'HG1485_PATCH': 'NW_021160024.1', - 'HG494_PATCH': 'NW_021160025.1', - 'HG1466_PATCH': 'NW_021160031.1', - 'HSCHRX_3_CTG3': 'NW_025791820.1', - 'HG1506_PATCH': 'NW_021160028.1', - 'HG2527_PATCH': 'NW_025791816.1', - 'HG1507_PATCH': 'NW_021160029.1', - 'HG2541_PATCH': 'NW_025791817.1', - 'HG439_PATCH': 'NW_021160027.1', - 'HSCHRX_2_CTG14': 'NW_025791819.1', - 'HG1509_PATCH': 'NW_021160030.1', - 'HSCHRX_1_CTG14': 'NW_025791818.1', - 'HG1532_PATCH': 'NW_025791821.1', - 'HG2469_PATCH': 'NW_025791809.1', - 'HG2405_PATCH': 'NW_025791777.1' -} + '1': 'NC_000001.11', + '2': 'NC_000002.12', + '3': 'NC_000003.12', + '4': 'NC_000004.12', + '5': 'NC_000005.10', + '6': 'NC_000006.12', + '7': 'NC_000007.14', + '8': 'NC_000008.11', + '9': 'NC_000009.12', + '10': 'NC_000010.11', + '11': 'NC_000011.10', + '12': 'NC_000012.12', + '13': 'NC_000013.11', + '14': 'NC_000014.9', + '15': 'NC_000015.10', + '16': 'NC_000016.10', + '17': 'NC_000017.11', + '18': 'NC_000018.10', + '19': 'NC_000019.10', + '20': 'NC_000020.11', + '21': 'NC_000021.9', + '22': 'NC_000022.11', + '23': 'NC_000023.11', + '24': 'NC_000024.10', + 'x': 'NC_000023.11', + 'y': 'NC_000024.10', + 'X': 'NC_000023.11', + 'Y': 'NC_000024.10', + 'M': 'NC_012920.1', + 'm': 'NC_012920.1', + 'MT': 'NC_012920.1', + 'mt': 'NC_012920.1', + # UCSC Alt IDs + '1_KN196472V1_fix': 'NW_009646194.1', + '1_KN538360V1_fix': 'NW_011332687.1', + '1_KN538361V1_fix': 'NW_011332688.1', + '1_KZ208906V1_fix': 'NW_018654708.1', + '1_MU273333V1_fix': 'NW_025791756.1', + '2_KN538363V1_fix': 'NW_011332690.1', + '2_ML143341V1_fix': 'NW_021159987.1', + '2_MU273341V1_fix': 'NW_025791764.1', + '2_MU273342V1_fix': 'NW_025791765.1', + '2_MU273343V1_fix': 'NW_025791766.1', + '2_MU273344V1_fix': 'NW_025791767.1', + '3_KN196476V1_fix': 'NW_009646198.1', + '3_KN538364V1_fix': 'NW_011332691.1', + '3_KV766192V1_fix': 'NW_017363813.1', + '3_MU273346V1_fix': 'NW_025791769.1', + '3_MU273348V1_fix': 'NW_025791771.1', + '4_KQ983257V1_fix': 'NW_015495300.1', + '5_KV575244V1_fix': 'NW_016107298.1', + '5_ML143350V1_fix': 'NW_021159996.1', + '5_MU273354V1_fix': 'NW_025791777.1', + '5_MU273355V1_fix': 'NW_025791778.1', + '6_KV766194V1_fix': 'NW_017363815.1', + '6_KZ208911V1_fix': 'NW_018654713.1', + '7_KV880765V1_fix': 'NW_017852930.1', + '7_KZ208912V1_fix': 'NW_018654714.1', + '7_ML143352V1_fix': 'NW_021159998.1', + '8_KZ208914V1_fix': 'NW_018654716.1', + '8_KZ208915V1_fix': 'NW_018654717.1', + '8_MU273361V1_fix': 'NW_025791784.1', + '8_MU273363V1_fix': 'NW_025791786.1', + '9_MU273365V1_fix': 'NW_025791788.1', + '10_KQ090021V1_fix': 'NW_013171807.1', + '11_KN196481V1_fix': 'NW_009646203.1', + '11_KQ759759V2_fix': 'NW_015148966.2', + '11_KZ559108V1_fix': 'NW_019805495.1', + '11_KZ559109V1_fix': 'NW_019805496.1', + '11_ML143358V1_fix': 'NW_021160004.1', + '11_ML143359V1_fix': 'NW_021160005.1', + '11_MU273369V1_fix': 'NW_025791792.1', + '12_KN538369V1_fix': 'NW_011332696.1', + '12_KZ208916V1_fix': 'NW_018654718.1', + '12_ML143361V1_fix': 'NW_021160007.1', + '12_ML143362V1_fix': 'NW_021160008.1', + '12_MU273372V1_fix': 'NW_025791795.1', + '13_KN538371V1_fix': 'NW_011332698.1', + '13_ML143365V1_fix': 'NW_021160011.1', + '14_KZ208920V1_fix': 'NW_018654722.1', + '15_KN538374V1_fix': 'NW_011332701.1', + '15_ML143371V1_fix': 'NW_021160017.1', + '15_MU273374V1_fix': 'NW_025791797.1', + '16_KV880768V1_fix': 'NW_017852933.1', + '16_KZ559113V1_fix': 'NW_019805500.1', + '16_ML143373V1_fix': 'NW_021160019.1', + '16_MU273376V1_fix': 'NW_025791799.1', + '17_KV575245V1_fix': 'NW_016107299.1', + '17_KV766196V1_fix': 'NW_017363817.1', + '17_MU273379V1_fix': 'NW_025791802.1', + '17_MU273380V1_fix': 'NW_025791803.1', + '17_MU273382V1_fix': 'NW_025791805.1', + '18_KQ090028V1_fix': 'NW_013171814.1', + '19_KN196484V1_fix': 'NW_009646206.1', + '19_KQ458386V1_fix': 'NW_014040929.1', + '19_ML143376V1_fix': 'NW_021160022.1', + '19_MU273384V1_fix': 'NW_025791807.1', + '20_MU273388V1_fix': 'NW_025791811.1', + '20_MU273389V1_fix': 'NW_025791812.1', + '21_MU273391V1_fix': 'NW_025791814.1', + '21_MU273392V1_fix': 'NW_025791815.1', + '22_KQ759762V2_fix': 'NW_015148969.2', + 'X_ML143381V1_fix': 'NW_021160027.1', + 'X_MU273394V1_fix': 'NW_025791817.1', + 'Y_MU273398V1_fix': 'NW_025791821.1', + '10_GL383545V1_alt': 'NW_003315934.1', + '10_GL383546V1_alt': 'NW_003315935.1', + '10_KI270824V1_alt': 'NT_187579.1', + '10_KI270825V1_alt': 'NT_187580.1', + '11_GL383547V1_alt': 'NW_003315936.1', + '11_JH159136V1_alt': 'NW_003871073.1', + '11_JH159137V1_alt': 'NW_003871074.1', + '11_KI270721V1_random': 'NT_187376.1', + '11_KI270826V1_alt': 'NT_187581.1', + '11_KI270827V1_alt': 'NT_187582.1', + '11_KI270829V1_alt': 'NT_187583.1', + '11_KI270830V1_alt': 'NT_187584.1', + '11_KI270831V1_alt': 'NT_187585.1', + '11_KI270832V1_alt': 'NT_187586.1', + '11_KI270902V1_alt': 'NT_187656.1', + '11_KI270903V1_alt': 'NT_187657.1', + '11_KI270927V1_alt': 'NT_187681.1', + '12_GL383549V1_alt': 'NW_003315938.1', + '12_GL383550V2_alt': 'NW_003315939.2', + '12_GL383551V1_alt': 'NW_003315940.1', + '12_GL383552V1_alt': 'NW_003315941.1', + '12_GL383553V2_alt': 'NW_003315942.2', + '12_GL877875V1_alt': 'NW_003571049.1', + '12_GL877876V1_alt': 'NW_003571050.1', + '12_KI270833V1_alt': 'NT_187589.1', + '12_KI270834V1_alt': 'NT_187590.1', + '12_KI270835V1_alt': 'NT_187587.1', + '12_KI270836V1_alt': 'NT_187591.1', + '12_KI270837V1_alt': 'NT_187588.1', + '12_KI270904V1_alt': 'NT_187658.1', + '13_KI270838V1_alt': 'NT_187592.1', + '13_KI270839V1_alt': 'NT_187593.1', + '13_KI270840V1_alt': 'NT_187594.1', + '13_KI270841V1_alt': 'NT_187595.1', + '13_KI270842V1_alt': 'NT_187596.1', + '13_KI270843V1_alt': 'NT_187597.1', + '14_GL000009V2_random': 'NT_113796.3', + '14_GL000194V1_random': 'NT_113888.1', + '14_GL000225V1_random': 'NT_167219.1', + '14_KI270722V1_random': 'NT_187377.1', + '14_KI270723V1_random': 'NT_187378.1', + '14_KI270724V1_random': 'NT_187379.1', + '14_KI270725V1_random': 'NT_187380.1', + '14_KI270726V1_random': 'NT_187381.1', + '14_KI270844V1_alt': 'NT_187598.1', + '14_KI270845V1_alt': 'NT_187599.1', + '14_KI270846V1_alt': 'NT_187600.1', + '14_KI270847V1_alt': 'NT_187601.1', + '15_GL383554V1_alt': 'NW_003315943.1', + '15_GL383555V2_alt': 'NW_003315944.2', + '15_KI270727V1_random': 'NT_187382.1', + '15_KI270848V1_alt': 'NT_187603.1', + '15_KI270849V1_alt': 'NT_187605.1', + '15_KI270850V1_alt': 'NT_187606.1', + '15_KI270851V1_alt': 'NT_187604.1', + '15_KI270852V1_alt': 'NT_187602.1', + '15_KI270905V1_alt': 'NT_187660.1', + '15_KI270906V1_alt': 'NT_187659.1', + '16_GL383556V1_alt': 'NW_003315945.1', + '16_GL383557V1_alt': 'NW_003315946.1', + '16_KI270728V1_random': 'NT_187383.1', + '16_KI270853V1_alt': 'NT_187607.1', + '16_KI270854V1_alt': 'NT_187610.1', + '16_KI270855V1_alt': 'NT_187608.1', + '16_KI270856V1_alt': 'NT_187609.1', + '17_GL000205V2_random': 'NT_113930.2', + '17_GL000258V2_alt': 'NT_167251.2', + '17_GL383563V3_alt': 'NW_003315952.3', + '17_GL383564V2_alt': 'NW_003315953.2', + '17_GL383565V1_alt': 'NW_003315954.1', + '17_GL383566V1_alt': 'NW_003315955.1', + '17_JH159146V1_alt': 'NW_003871091.1', + '17_JH159147V1_alt': 'NW_003871092.1', + '17_JH159148V1_alt': 'NW_003871093.1', + '17_KI270729V1_random': 'NT_187384.1', + '17_KI270730V1_random': 'NT_187385.1', + '17_KI270857V1_alt': 'NT_187614.1', + '17_KI270858V1_alt': 'NT_187615.1', + '17_KI270859V1_alt': 'NT_187616.1', + '17_KI270860V1_alt': 'NT_187612.1', + '17_KI270861V1_alt': 'NT_187611.1', + '17_KI270862V1_alt': 'NT_187613.1', + '17_KI270907V1_alt': 'NT_187662.1', + '17_KI270908V1_alt': 'NT_187663.1', + '17_KI270909V1_alt': 'NT_187661.1', + '17_KI270910V1_alt': 'NT_187664.1', + '18_GL383567V1_alt': 'NW_003315956.1', + '18_GL383568V1_alt': 'NW_003315957.1', + '18_GL383569V1_alt': 'NW_003315958.1', + '18_GL383570V1_alt': 'NW_003315959.1', + '18_GL383571V1_alt': 'NW_003315960.1', + '18_GL383572V1_alt': 'NW_003315961.1', + '18_KI270863V1_alt': 'NT_187617.1', + '18_KI270864V1_alt': 'NT_187618.1', + '18_KI270911V1_alt': 'NT_187666.1', + '18_KI270912V1_alt': 'NT_187665.1', + '19_GL000209V2_alt': 'NT_113949.2', + '19_GL383573V1_alt': 'NW_003315962.1', + '19_GL383574V1_alt': 'NW_003315963.1', + '19_GL383575V2_alt': 'NW_003315964.2', + '19_GL383576V1_alt': 'NW_003315965.1', + '19_GL949746V1_alt': 'NW_003571054.1', + '19_GL949747V2_alt': 'NW_003571055.2', + '19_GL949748V2_alt': 'NW_003571056.2', + '19_GL949749V2_alt': 'NW_003571057.2', + '19_GL949750V2_alt': 'NW_003571058.2', + '19_GL949751V2_alt': 'NW_003571059.2', + '19_GL949752V1_alt': 'NW_003571060.1', + '19_GL949753V2_alt': 'NW_003571061.2', + '19_KI270865V1_alt': 'NT_187621.1', + '19_KI270866V1_alt': 'NT_187619.1', + '19_KI270867V1_alt': 'NT_187620.1', + '19_KI270868V1_alt': 'NT_187622.1', + '19_KI270882V1_alt': 'NT_187636.1', + '19_KI270883V1_alt': 'NT_187637.1', + '19_KI270884V1_alt': 'NT_187638.1', + '19_KI270885V1_alt': 'NT_187639.1', + '19_KI270886V1_alt': 'NT_187640.1', + '19_KI270887V1_alt': 'NT_187641.1', + '19_KI270888V1_alt': 'NT_187642.1', + '19_KI270889V1_alt': 'NT_187643.1', + '19_KI270890V1_alt': 'NT_187644.1', + '19_KI270891V1_alt': 'NT_187645.1', + '19_KI270914V1_alt': 'NT_187668.1', + '19_KI270915V1_alt': 'NT_187669.1', + '19_KI270916V1_alt': 'NT_187670.1', + '19_KI270917V1_alt': 'NT_187671.1', + '19_KI270918V1_alt': 'NT_187672.1', + '19_KI270919V1_alt': 'NT_187673.1', + '19_KI270920V1_alt': 'NT_187674.1', + '19_KI270921V1_alt': 'NT_187675.1', + '19_KI270922V1_alt': 'NT_187676.1', + '19_KI270923V1_alt': 'NT_187677.1', + '19_KI270929V1_alt': 'NT_187683.1', + '19_KI270930V1_alt': 'NT_187684.1', + '19_KI270931V1_alt': 'NT_187685.1', + '19_KI270932V1_alt': 'NT_187686.1', + '19_KI270933V1_alt': 'NT_187687.1', + '19_KI270938V1_alt': 'NT_187693.1', + '1_GL383518V1_alt': 'NW_003315905.1', + '1_GL383519V1_alt': 'NW_003315906.1', + '1_GL383520V2_alt': 'NW_003315907.2', + '1_KI270706V1_random': 'NT_187361.1', + '1_KI270707V1_random': 'NT_187362.1', + '1_KI270708V1_random': 'NT_187363.1', + '1_KI270709V1_random': 'NT_187364.1', + '1_KI270710V1_random': 'NT_187365.1', + '1_KI270711V1_random': 'NT_187366.1', + '1_KI270712V1_random': 'NT_187367.1', + '1_KI270713V1_random': 'NT_187368.1', + '1_KI270714V1_random': 'NT_187369.1', + '1_KI270759V1_alt': 'NT_187516.1', + '1_KI270760V1_alt': 'NT_187514.1', + '1_KI270761V1_alt': 'NT_187518.1', + '1_KI270762V1_alt': 'NT_187515.1', + '1_KI270763V1_alt': 'NT_187519.1', + '1_KI270764V1_alt': 'NT_187521.1', + '1_KI270765V1_alt': 'NT_187520.1', + '1_KI270766V1_alt': 'NT_187517.1', + '1_KI270892V1_alt': 'NT_187646.1', + '20_GL383577V2_alt': 'NW_003315966.2', + '20_KI270869V1_alt': 'NT_187623.1', + '20_KI270870V1_alt': 'NT_187624.1', + '20_KI270871V1_alt': 'NT_187625.1', + '21_GL383578V2_alt': 'NW_003315967.2', + '21_GL383579V2_alt': 'NW_003315968.2', + '21_GL383580V2_alt': 'NW_003315969.2', + '21_GL383581V2_alt': 'NW_003315970.2', + '21_KI270872V1_alt': 'NT_187626.1', + '21_KI270873V1_alt': 'NT_187627.1', + '21_KI270874V1_alt': 'NT_187628.1', + '22_GL383582V2_alt': 'NW_003315971.2', + '22_GL383583V2_alt': 'NW_003315972.2', + '22_KB663609V1_alt': 'NW_004504305.1', + '22_KI270731V1_random': 'NT_187386.1', + '22_KI270732V1_random': 'NT_187387.1', + '22_KI270733V1_random': 'NT_187388.1', + '22_KI270734V1_random': 'NT_187389.1', + '22_KI270735V1_random': 'NT_187390.1', + '22_KI270736V1_random': 'NT_187391.1', + '22_KI270737V1_random': 'NT_187392.1', + '22_KI270738V1_random': 'NT_187393.1', + '22_KI270739V1_random': 'NT_187394.1', + '22_KI270875V1_alt': 'NT_187629.1', + '22_KI270876V1_alt': 'NT_187630.1', + '22_KI270877V1_alt': 'NT_187631.1', + '22_KI270878V1_alt': 'NT_187632.1', + '22_KI270879V1_alt': 'NT_187633.1', + '22_KI270928V1_alt': 'NT_187682.1', + '2_GL383521V1_alt': 'NW_003315908.1', + '2_GL383522V1_alt': 'NW_003315909.1', + '2_GL582966V2_alt': 'NW_003571033.2', + '2_KI270715V1_random': 'NT_187370.1', + '2_KI270716V1_random': 'NT_187371.1', + '2_KI270767V1_alt': 'NT_187523.1', + '2_KI270768V1_alt': 'NT_187528.1', + '2_KI270769V1_alt': 'NT_187522.1', + '2_KI270770V1_alt': 'NT_187525.1', + '2_KI270771V1_alt': 'NT_187530.1', + '2_KI270772V1_alt': 'NT_187524.1', + '2_KI270773V1_alt': 'NT_187526.1', + '2_KI270774V1_alt': 'NT_187529.1', + '2_KI270775V1_alt': 'NT_187531.1', + '2_KI270776V1_alt': 'NT_187527.1', + '2_KI270893V1_alt': 'NT_187647.1', + '2_KI270894V1_alt': 'NT_187648.1', + '3_GL000221V1_random': 'NT_167215.1', + '3_GL383526V1_alt': 'NW_003315913.1', + '3_JH636055V2_alt': 'NW_003871060.2', + '3_KI270777V1_alt': 'NT_187533.1', + '3_KI270778V1_alt': 'NT_187536.1', + '3_KI270779V1_alt': 'NT_187532.1', + '3_KI270780V1_alt': 'NT_187537.1', + '3_KI270781V1_alt': 'NT_187538.1', + '3_KI270782V1_alt': 'NT_187534.1', + '3_KI270783V1_alt': 'NT_187535.1', + '3_KI270784V1_alt': 'NT_187539.1', + '3_KI270895V1_alt': 'NT_187649.1', + '3_KI270924V1_alt': 'NT_187678.1', + '3_KI270934V1_alt': 'NT_187688.1', + '3_KI270935V1_alt': 'NT_187689.1', + '3_KI270936V1_alt': 'NT_187690.1', + '3_KI270937V1_alt': 'NT_187691.1', + '4_GL000008V2_random': 'NT_113793.3', + '4_GL000257V2_alt': 'NT_167250.2', + '4_GL383527V1_alt': 'NW_003315914.1', + '4_GL383528V1_alt': 'NW_003315915.1', + '4_KI270785V1_alt': 'NT_187542.1', + '4_KI270786V1_alt': 'NT_187543.1', + '4_KI270787V1_alt': 'NT_187541.1', + '4_KI270788V1_alt': 'NT_187544.1', + '4_KI270789V1_alt': 'NT_187545.1', + '4_KI270790V1_alt': 'NT_187540.1', + '4_KI270896V1_alt': 'NT_187650.1', + '4_KI270925V1_alt': 'NT_187679.1', + '5_GL000208V1_random': 'NT_113948.1', + '5_GL339449V2_alt': 'NW_003315917.2', + '5_GL383530V1_alt': 'NW_003315918.1', + '5_GL383531V1_alt': 'NW_003315919.1', + '5_GL383532V1_alt': 'NW_003315920.1', + '5_GL949742V1_alt': 'NW_003571036.1', + '5_KI270791V1_alt': 'NT_187547.1', + '5_KI270792V1_alt': 'NT_187548.1', + '5_KI270793V1_alt': 'NT_187550.1', + '5_KI270794V1_alt': 'NT_187551.1', + '5_KI270795V1_alt': 'NT_187546.1', + '5_KI270796V1_alt': 'NT_187549.1', + '5_KI270897V1_alt': 'NT_187651.1', + '5_KI270898V1_alt': 'NT_187652.1', + '6_GL000250V2_alt': 'NT_167244.2', + '6_GL000251V2_alt': 'NT_113891.3', + '6_GL000252V2_alt': 'NT_167245.2', + '6_GL000253V2_alt': 'NT_167246.2', + '6_GL000254V2_alt': 'NT_167247.2', + '6_GL000255V2_alt': 'NT_167248.2', + '6_GL000256V2_alt': 'NT_167249.2', + '6_GL383533V1_alt': 'NW_003315921.1', + '6_KB021644V2_alt': 'NW_004166862.2', + '6_KI270758V1_alt': 'NT_187692.1', + '6_KI270797V1_alt': 'NT_187552.1', + '6_KI270798V1_alt': 'NT_187553.1', + '6_KI270799V1_alt': 'NT_187554.1', + '6_KI270800V1_alt': 'NT_187555.1', + '6_KI270801V1_alt': 'NT_187556.1', + '6_KI270802V1_alt': 'NT_187557.1', + '7_GL383534V2_alt': 'NW_003315922.2', + '7_KI270803V1_alt': 'NT_187562.1', + '7_KI270804V1_alt': 'NT_187558.1', + '7_KI270805V1_alt': 'NT_187560.1', + '7_KI270806V1_alt': 'NT_187559.1', + '7_KI270807V1_alt': 'NT_187563.1', + '7_KI270808V1_alt': 'NT_187564.1', + '7_KI270809V1_alt': 'NT_187561.1', + '7_KI270899V1_alt': 'NT_187653.1', + '8_KI270810V1_alt': 'NT_187567.1', + '8_KI270811V1_alt': 'NT_187565.1', + '8_KI270812V1_alt': 'NT_187568.1', + '8_KI270813V1_alt': 'NT_187570.1', + '8_KI270814V1_alt': 'NT_187566.1', + '8_KI270815V1_alt': 'NT_187569.1', + '8_KI270816V1_alt': 'NT_187571.1', + '8_KI270817V1_alt': 'NT_187573.1', + '8_KI270818V1_alt': 'NT_187572.1', + '8_KI270819V1_alt': 'NT_187574.1', + '8_KI270820V1_alt': 'NT_187575.1', + '8_KI270821V1_alt': 'NT_187576.1', + '8_KI270822V1_alt': 'NT_187577.1', + '8_KI270900V1_alt': 'NT_187654.1', + '8_KI270901V1_alt': 'NT_187655.1', + '8_KI270926V1_alt': 'NT_187680.1', + '9_GL383539V1_alt': 'NW_003315928.1', + '9_GL383540V1_alt': 'NW_003315929.1', + '9_GL383541V1_alt': 'NW_003315930.1', + '9_GL383542V1_alt': 'NW_003315931.1', + '9_KI270717V1_random': 'NT_187372.1', + '9_KI270718V1_random': 'NT_187373.1', + '9_KI270719V1_random': 'NT_187374.1', + '9_KI270720V1_random': 'NT_187375.1', + '9_KI270823V1_alt': 'NT_187578.1', + 'Un_GL000195V1': 'NT_113901.1', + 'Un_GL000213V1': 'NT_167208.1', + 'Un_GL000214V1': 'NT_167209.1', + 'Un_GL000216V2': 'NT_167211.2', + 'Un_GL000218V1': 'NT_113889.1', + 'Un_GL000219V1': 'NT_167213.1', + 'Un_GL000220V1': 'NT_167214.1', + 'Un_GL000224V1': 'NT_167218.1', + 'Un_GL000226V1': 'NT_167220.1', + 'Un_KI270302V1': 'NT_187396.1', + 'Un_KI270303V1': 'NT_187398.1', + 'Un_KI270304V1': 'NT_187397.1', + 'Un_KI270305V1': 'NT_187399.1', + 'Un_KI270310V1': 'NT_187402.1', + 'Un_KI270311V1': 'NT_187406.1', + 'Un_KI270312V1': 'NT_187405.1', + 'Un_KI270315V1': 'NT_187404.1', + 'Un_KI270316V1': 'NT_187403.1', + 'Un_KI270317V1': 'NT_187407.1', + 'Un_KI270320V1': 'NT_187401.1', + 'Un_KI270322V1': 'NT_187400.1', + 'Un_KI270329V1': 'NT_187459.1', + 'Un_KI270330V1': 'NT_187458.1', + 'Un_KI270333V1': 'NT_187461.1', + 'Un_KI270334V1': 'NT_187460.1', + 'Un_KI270335V1': 'NT_187462.1', + 'Un_KI270336V1': 'NT_187465.1', + 'Un_KI270337V1': 'NT_187466.1', + 'Un_KI270338V1': 'NT_187463.1', + 'Un_KI270340V1': 'NT_187464.1', + 'Un_KI270362V1': 'NT_187469.1', + 'Un_KI270363V1': 'NT_187467.1', + 'Un_KI270364V1': 'NT_187468.1', + 'Un_KI270366V1': 'NT_187470.1', + 'Un_KI270371V1': 'NT_187494.1', + 'Un_KI270372V1': 'NT_187491.1', + 'Un_KI270373V1': 'NT_187492.1', + 'Un_KI270374V1': 'NT_187490.1', + 'Un_KI270375V1': 'NT_187493.1', + 'Un_KI270376V1': 'NT_187489.1', + 'Un_KI270378V1': 'NT_187471.1', + 'Un_KI270379V1': 'NT_187472.1', + 'Un_KI270381V1': 'NT_187486.1', + 'Un_KI270382V1': 'NT_187488.1', + 'Un_KI270383V1': 'NT_187482.1', + 'Un_KI270384V1': 'NT_187484.1', + 'Un_KI270385V1': 'NT_187487.1', + 'Un_KI270386V1': 'NT_187480.1', + 'Un_KI270387V1': 'NT_187475.1', + 'Un_KI270388V1': 'NT_187478.1', + 'Un_KI270389V1': 'NT_187473.1', + 'Un_KI270390V1': 'NT_187474.1', + 'Un_KI270391V1': 'NT_187481.1', + 'Un_KI270392V1': 'NT_187485.1', + 'Un_KI270393V1': 'NT_187483.1', + 'Un_KI270394V1': 'NT_187479.1', + 'Un_KI270395V1': 'NT_187476.1', + 'Un_KI270396V1': 'NT_187477.1', + 'Un_KI270411V1': 'NT_187409.1', + 'Un_KI270412V1': 'NT_187408.1', + 'Un_KI270414V1': 'NT_187410.1', + 'Un_KI270417V1': 'NT_187415.1', + 'Un_KI270418V1': 'NT_187412.1', + 'Un_KI270419V1': 'NT_187411.1', + 'Un_KI270420V1': 'NT_187413.1', + 'Un_KI270422V1': 'NT_187416.1', + 'Un_KI270423V1': 'NT_187417.1', + 'Un_KI270424V1': 'NT_187414.1', + 'Un_KI270425V1': 'NT_187418.1', + 'Un_KI270429V1': 'NT_187419.1', + 'Un_KI270435V1': 'NT_187424.1', + 'Un_KI270438V1': 'NT_187425.1', + 'Un_KI270442V1': 'NT_187420.1', + 'Un_KI270448V1': 'NT_187495.1', + 'Un_KI270465V1': 'NT_187422.1', + 'Un_KI270466V1': 'NT_187421.1', + 'Un_KI270467V1': 'NT_187423.1', + 'Un_KI270468V1': 'NT_187426.1', + 'Un_KI270507V1': 'NT_187437.1', + 'Un_KI270508V1': 'NT_187430.1', + 'Un_KI270509V1': 'NT_187428.1', + 'Un_KI270510V1': 'NT_187427.1', + 'Un_KI270511V1': 'NT_187435.1', + 'Un_KI270512V1': 'NT_187432.1', + 'Un_KI270515V1': 'NT_187436.1', + 'Un_KI270516V1': 'NT_187431.1', + 'Un_KI270517V1': 'NT_187438.1', + 'Un_KI270518V1': 'NT_187429.1', + 'Un_KI270519V1': 'NT_187433.1', + 'Un_KI270521V1': 'NT_187496.1', + 'Un_KI270522V1': 'NT_187434.1', + 'Un_KI270528V1': 'NT_187440.1', + 'Un_KI270529V1': 'NT_187439.1', + 'Un_KI270530V1': 'NT_187441.1', + 'Un_KI270538V1': 'NT_187443.1', + 'Un_KI270539V1': 'NT_187442.1', + 'Un_KI270544V1': 'NT_187444.1', + 'Un_KI270548V1': 'NT_187445.1', + 'Un_KI270579V1': 'NT_187450.1', + 'Un_KI270580V1': 'NT_187448.1', + 'Un_KI270581V1': 'NT_187449.1', + 'Un_KI270582V1': 'NT_187454.1', + 'Un_KI270583V1': 'NT_187446.1', + 'Un_KI270584V1': 'NT_187453.1', + 'Un_KI270587V1': 'NT_187447.1', + 'Un_KI270588V1': 'NT_187455.1', + 'Un_KI270589V1': 'NT_187451.1', + 'Un_KI270590V1': 'NT_187452.1', + 'Un_KI270591V1': 'NT_187457.1', + 'Un_KI270593V1': 'NT_187456.1', + 'Un_KI270741V1': 'NT_187497.1', + 'Un_KI270742V1': 'NT_187513.1', + 'Un_KI270743V1': 'NT_187498.1', + 'Un_KI270744V1': 'NT_187499.1', + 'Un_KI270745V1': 'NT_187500.1', + 'Un_KI270746V1': 'NT_187501.1', + 'Un_KI270747V1': 'NT_187502.1', + 'Un_KI270748V1': 'NT_187503.1', + 'Un_KI270749V1': 'NT_187504.1', + 'Un_KI270750V1': 'NT_187505.1', + 'Un_KI270751V1': 'NT_187506.1', + 'Un_KI270752V1': 'NT_187507.1', + 'Un_KI270753V1': 'NT_187508.1', + 'Un_KI270754V1': 'NT_187509.1', + 'Un_KI270755V1': 'NT_187510.1', + 'Un_KI270756V1': 'NT_187511.1', + 'Un_KI270757V1': 'NT_187512.1', + 'X_KI270880V1_alt': 'NT_187634.1', + 'X_KI270881V1_alt': 'NT_187635.1', + 'X_KI270913V1_alt': 'NT_187667.1', + 'Y_KI270740V1_random': 'NT_187395.1', + '2_KN538362V1_fix': 'NW_011332689.1', + '10_KN538365V1_fix': 'NW_011332692.1', + '10_KN538366V1_fix': 'NW_011332693.1', + '10_KN538367V1_fix': 'NW_011332694.1', + '11_KN538368V1_alt': 'NW_011332695.1', + '12_KN538370V1_fix': 'NW_011332697.1', + '13_KN538372V1_fix': 'NW_011332699.1', + '13_KN538373V1_fix': 'NW_011332700.1', + '1_KQ031383V1_fix': 'NW_012132914.1', + '2_KQ031384V1_fix': 'NW_012132915.1', + '3_KQ031385V1_fix': 'NW_012132916.1', + '3_KQ031386V1_fix': 'NW_012132917.1', + '6_KQ031387V1_fix': 'NW_012132918.1', + '7_KQ031388V1_fix': 'NW_012132919.1', + '15_KQ031389V1_alt': 'NW_012132920.1', + '16_KQ031390V1_alt': 'NW_012132921.1', + '4_KQ090013V1_alt': 'NW_013171799.1', + '4_KQ090014V1_alt': 'NW_013171800.1', + '4_KQ090015V1_alt': 'NW_013171801.1', + '6_KQ090016V1_fix': 'NW_013171802.1', + '6_KQ090017V1_alt': 'NW_013171803.1', + '9_KQ090018V1_alt': 'NW_013171804.1', + '9_KQ090019V1_alt': 'NW_013171805.1', + '10_KQ090020V1_alt': 'NW_013171806.1', + '11_KQ090022V1_fix': 'NW_013171808.1', + '12_KQ090023V1_alt': 'NW_013171809.1', + '13_KQ090024V1_alt': 'NW_013171810.1', + '13_KQ090025V1_alt': 'NW_013171811.1', + '16_KQ090026V1_alt': 'NW_013171812.1', + '16_KQ090027V1_alt': 'NW_013171813.1', + '1_KQ458382V1_alt': 'NW_014040925.1', + '1_KQ458383V1_alt': 'NW_014040926.1', + '1_KQ458384V1_alt': 'NW_014040927.1', + '18_KQ458385V1_alt': 'NW_014040928.1', + '22_KQ458387V1_alt': 'NW_014040930.1', + '22_KQ458388V1_alt': 'NW_014040931.1', + '11_KQ759759V1_fix': 'NW_015148966.1', + '12_KQ759760V1_fix': 'NW_015148967.1', + '22_KQ759761V1_alt': 'NW_015148968.1', + '22_KQ759762V1_fix': 'NW_015148969.1', + '1_KQ983255V1_alt': 'NW_015495298.1', + '2_KQ983256V1_alt': 'NW_015495299.1', + '4_KQ983258V1_alt': 'NW_015495301.1', + '5_KV575243V1_alt': 'NW_016107297.1', + '19_KV575246V1_alt': 'NW_016107300.1', + '19_KV575247V1_alt': 'NW_016107301.1', + '19_KV575248V1_alt': 'NW_016107302.1', + '19_KV575249V1_alt': 'NW_016107303.1', + '19_KV575250V1_alt': 'NW_016107304.1', + '19_KV575251V1_alt': 'NW_016107305.1', + '19_KV575252V1_alt': 'NW_016107306.1', + '19_KV575253V1_alt': 'NW_016107307.1', + '19_KV575254V1_alt': 'NW_016107308.1', + '19_KV575255V1_alt': 'NW_016107309.1', + '19_KV575256V1_alt': 'NW_016107310.1', + '19_KV575257V1_alt': 'NW_016107311.1', + '19_KV575258V1_alt': 'NW_016107312.1', + '19_KV575259V1_alt': 'NW_016107313.1', + '19_KV575260V1_alt': 'NW_016107314.1', + '4_KV766193V1_alt': 'NW_017363814.1', + '11_KV766195V1_fix': 'NW_017363816.1', + '17_KV766197V1_alt': 'NW_017363818.1', + '17_KV766198V1_alt': 'NW_017363819.1', + 'X_KV766199V1_alt': 'NW_017363820.1', + '1_KV880763V1_alt': 'NW_017852928.1', + '7_KV880764V1_fix': 'NW_017852929.1', + '8_KV880766V1_fix': 'NW_017852931.1', + '8_KV880767V1_fix': 'NW_017852932.1', + '1_KZ208904V1_alt': 'NW_018654706.1', + '1_KZ208905V1_alt': 'NW_018654707.1', + '2_KZ208907V1_alt': 'NW_018654709.1', + '2_KZ208908V1_alt': 'NW_018654710.1', + '3_KZ208909V1_alt': 'NW_018654711.1', + '5_KZ208910V1_alt': 'NW_018654712.1', + '7_KZ208913V1_alt': 'NW_018654715.1', + '12_KZ208917V1_fix': 'NW_018654719.1', + '12_KZ208918V1_alt': 'NW_018654720.1', + '14_KZ208919V1_alt': 'NW_018654721.1', + '16_KZ208921V1_alt': 'NW_018654723.1', + '18_KZ208922V1_fix': 'NW_018654724.1', + 'Y_KZ208923V1_fix': 'NW_018654725.1', + 'Y_KZ208924V1_fix': 'NW_018654726.1', + '1_KZ559100V1_fix': 'NW_019805487.1', + '3_KZ559101V1_alt': 'NW_019805488.1', + '3_KZ559102V1_alt': 'NW_019805489.1', + '3_KZ559103V1_alt': 'NW_019805490.1', + '3_KZ559104V1_fix': 'NW_019805491.1', + '3_KZ559105V1_alt': 'NW_019805492.1', + '7_KZ559106V1_alt': 'NW_019805493.1', + '8_KZ559107V1_alt': 'NW_019805494.1', + '11_KZ559110V1_alt': 'NW_019805497.1', + '11_KZ559111V1_alt': 'NW_019805498.1', + '12_KZ559112V1_alt': 'NW_019805499.1', + '17_KZ559114V1_alt': 'NW_019805501.1', + '18_KZ559115V1_fix': 'NW_019805502.1', + '18_KZ559116V1_alt': 'NW_019805503.1', + '2_ML143342V1_fix': 'NW_021159988.1', + '3_ML143343V1_alt': 'NW_021159989.1', + '4_ML143344V1_fix': 'NW_021159990.1', + '4_ML143345V1_fix': 'NW_021159991.1', + '4_ML143346V1_fix': 'NW_021159992.1', + '4_ML143347V1_fix': 'NW_021159993.1', + '4_ML143348V1_fix': 'NW_021159994.1', + '4_ML143349V1_fix': 'NW_021159995.1', + '6_ML143351V1_fix': 'NW_021159997.1', + '9_ML143353V1_fix': 'NW_021159999.1', + '10_ML143354V1_fix': 'NW_021160000.1', + '10_ML143355V1_fix': 'NW_021160001.1', + '11_ML143356V1_fix': 'NW_021160002.1', + '11_ML143357V1_fix': 'NW_021160003.1', + '11_ML143360V1_fix': 'NW_021160006.1', + '13_ML143363V1_fix': 'NW_021160009.1', + '13_ML143364V1_fix': 'NW_021160010.1', + '13_ML143366V1_fix': 'NW_021160012.1', + '14_ML143367V1_fix': 'NW_021160013.1', + '14_ML143368V1_alt': 'NW_021160014.1', + '15_ML143369V1_fix': 'NW_021160015.1', + '15_ML143370V1_fix': 'NW_021160016.1', + '15_ML143372V1_fix': 'NW_021160018.1', + '17_ML143374V1_fix': 'NW_021160020.1', + '17_ML143375V1_fix': 'NW_021160021.1', + '21_ML143377V1_fix': 'NW_021160023.1', + '22_ML143378V1_fix': 'NW_021160024.1', + '22_ML143379V1_fix': 'NW_021160025.1', + '22_ML143380V1_fix': 'NW_021160026.1', + 'X_ML143382V1_fix': 'NW_021160028.1', + 'X_ML143383V1_fix': 'NW_021160029.1', + 'X_ML143384V1_fix': 'NW_021160030.1', + 'X_ML143385V1_fix': 'NW_021160031.1', + # GRC Alt IDs + "HG1342_HG2282_PATCH": "NW_012132914.1", + "HSCHR1_5_CTG3": "NW_015495298.1", + "HG2095_PATCH": "NW_011332688.1", + "HSCHR1_4_CTG3": "NW_014040926.1", + "HG2058_PATCH": "NW_009646195.1", + "HSCHR1_8_CTG3": "NW_018654706.1", + "HG460_PATCH": "NW_019805487.1", + "HG986_PATCH": "NW_009646194.1", + "HSCHR1_9_CTG3": "NW_018654707.1", + "HSCHR1_3_CTG3": "NW_014040925.1", + "HSCHR1_6_CTG3": "NW_017852928.1", + "HG2104_PATCH": "NW_009646196.1", + "HG1832_PATCH": "NW_011332687.1", + "HG2002_PATCH": "NW_018654708.1", + "HSCHR1_5_CTG32_1": "NW_014040927.1", + "HG2290_PATCH": "NW_012132915.1", + "HSCHR2_7_CTG7_2": "NW_018654709.1", + "HSCHR2_6_CTG7_2": "NW_015495299.1", + "HSCHR2_8_CTG7_2": "NW_018654710.1", + "HG2232_PATCH": "NW_011332690.1", + "HG2233_PATCH": "NW_011332689.1", + "HG2236_PATCH": "NW_017363813.1", + "HG2066_PATCH": "NW_009646197.1", + "HG2235_PATCH": "NW_012132916.1", + "HG126_PATCH": "NW_011332691.1", + "HSCHR3_4_CTG1": "NW_018654711.1", + "HG2237_PATCH": "NW_012132917.1", + "HG2022_PATCH": "NW_009646198.1", + "HG2133_PATCH": "NW_019805491.1", + "HSCHR3_6_CTG2_1": "NW_019805492.1", + "HSCHR3_9_CTG2_1": "NW_019805490.1", + "HSCHR3_8_CTG2_1": "NW_019805489.1", + "HSCHR3_7_CTG2_1": "NW_019805488.1", + "HSCHR4_2_CTG4": "NW_013171799.1", + "HSCHR4_8_CTG12": "NW_013171800.1", + "HSCHR4_9_CTG12": "NW_013171801.1", + "HSCHR4_12_CTG12": "NW_017363814.1", + "HG2023_PATCH": "NW_015495300.1", + "HSCHR4_11_CTG12": "NW_015495301.1", + "HSCHR5_9_CTG1": "NW_018654712.1", + "HSCHR5_7_CTG1": "NW_009646199.1", + "HSCHR5_8_CTG1": "NW_016107297.1", + "HG30_PATCH": "NW_016107298.1", + "HG2057_PATCH": "NW_018654713.1", + "HSCHR6_1_CTG10": "NW_013171803.1", + "HG1651_PATCH": "NW_012132918.1", + "HG2128_PATCH": "NW_009646200.1", + "HG2072_PATCH": "NW_013171802.1", + "HG2121_PATCH": "NW_017363815.1", + "HSCHR7_3_CTG1": "NW_019805493.1", + "HG2088_PATCH": "NW_017852929.1", + "HG2266_PATCH": "NW_017852930.1", + "HG708_PATCH": "NW_018654714.1", + "HSCHR7_3_CTG4_4": "NW_018654715.1", + "HG2239_PATCH": "NW_012132919.1", + "HG76_PATCH": "NW_018654717.1", + "HG2068_PATCH": "NW_017852932.1", + "HG2067_PATCH": "NW_017852931.1", + "HSCHR8_7_CTG7": "NW_019805494.1", + "HG2419_PATCH": "NW_018654716.1", + "HSCHR9_1_CTG6": "NW_013171804.1", + "HSCHR9_1_CTG7": "NW_013171805.1", + "HG2030_PATCH": "NW_009646201.1", + "HG2244_HG2245_PATCH": "NW_011332694.1", + "HSCHR10_1_CTG6": "NW_013171806.1", + "HG2191_PATCH": "NW_009646202.1", + "HG2334_PATCH": "NW_013171807.1", + "HG2242_HG2243_PATCH": "NW_011332693.1", + "HG2241_PATCH": "NW_011332692.1", + "HG107_PATCH": "NW_015148966.1", + "HSCHR11_1_CTG1_2": "NW_011332695.1", + "HG2114_PATCH": "NW_019805496.1", + "HG2060_PATCH": "NW_019805495.1", + "HG1708_PATCH": "NW_017363816.1", + "HSCHR11_1_CTG3_1": "NW_019805498.1", + "HSCHR11_2_CTG8": "NW_019805497.1", + "HG2116_PATCH": "NW_013171808.1", + "HG2217_PATCH": "NW_009646203.1", + "HSCHR12_2_CTG1": "NW_013171809.1", + "HG1815_PATCH": "NW_018654718.1", + "HG1362_PATCH": "NW_011332696.1", + "HG23_PATCH": "NW_009646204.1", + "HSCHR12_8_CTG2_1": "NW_018654720.1", + "HG2063_PATCH": "NW_015148967.1", + "HG2047_PATCH": "NW_018654719.1", + "HG2247_PATCH": "NW_011332697.1", + "HSCHR12_9_CTG2_1": "NW_019805499.1", + "HG2291_PATCH": "NW_011332699.1", + "HSCHR13_1_CTG7": "NW_013171810.1", + "HG2216_PATCH": "NW_009646205.1", + "HG2249_PATCH": "NW_011332700.1", + "HSCHR13_1_CTG8": "NW_013171811.1", + "HG2288_HG2289_PATCH": "NW_011332698.1", + "HG1_PATCH": "NW_018654722.1", + "HSCHR14_8_CTG1": "NW_018654721.1", + "HG2139_PATCH": "NW_011332701.1", + "HSCHR15_6_CTG8": "NW_012132920.1", + "HSCHR16_5_CTG1": "NW_013171812.1", + "HG2263_PATCH": "NW_019805500.1", + "HG926_PATCH": "NW_017852933.1", + "HSCHR16_4_CTG3_1": "NW_013171813.1", + "HSCHR16_5_CTG3_1": "NW_018654723.1", + "HSCHR16_3_CTG3_1": "NW_012132921.1", + "HG2285_HG106_HG2252_PATCH": "NW_017363817.1", + "HG2046_PATCH": "NW_016107299.1", + "HSCHR17_3_CTG1": "NW_017363819.1", + "HSCHR17_11_CTG4": "NW_017363818.1", + "HSCHR17_12_CTG4": "NW_019805501.1", + "HSCHR18_1_CTG1": "NW_019805503.1", + "HSCHR18_5_CTG1_1": "NW_014040928.1", + "HG2412_PATCH": "NW_019805502.1", + "HG2213_PATCH": "NW_013171814.1", + "HG2442_PATCH": "NW_018654724.1", + "HG26_PATCH": "NW_014040929.1", + "HG2021_PATCH": "NW_009646206.1", + "HSCHR19KIR_0019-4656-A_CTG3_1": "NW_016107300.1", + "HSCHR19KIR_CA01-TA01_1_CTG3_1": "NW_016107301.1", + "HSCHR19KIR_CA01-TA01_2_CTG3_1": "NW_016107302.1", + "HSCHR19KIR_CA01-TB04_CTG3_1": "NW_016107303.1", + "HSCHR19KIR_CA01-TB01_CTG3_1": "NW_016107304.1", + "HSCHR19KIR_HG2394_CTG3_1": "NW_016107305.1", + "HSCHR19KIR_502960008-2_CTG3_1": "NW_016107306.1", + "HSCHR19KIR_502960008-1_CTG3_1": "NW_016107307.1", + "HSCHR19KIR_0010-5217-AB_CTG3_1": "NW_016107308.1", + "HSCHR19KIR_7191059-1_CTG3_1": "NW_016107309.1", + "HSCHR19KIR_0019-4656-B_CTG3_1": "NW_016107310.1", + "HSCHR19KIR_CA04_CTG3_1": "NW_016107311.1", + "HSCHR19KIR_7191059-2_CTG3_1": "NW_016107313.1", + "HSCHR19KIR_HG2396_CTG3_1": "NW_016107314.1", + "HSCHR19KIR_HG2393_CTG3_1": "NW_016107312.1", + "HSCHR22_4_CTG1": "NW_009646207.1", + "HSCHR22_6_CTG1": "NW_014040930.1", + "HSCHR22_7_CTG1": "NW_014040931.1", + "HSCHR22_5_CTG1": "NW_009646208.1", + "HSCHR22_8_CTG1": "NW_015148968.1", + "HG1311_PATCH": "NW_015148969.1", + "HSCHRX_3_CTG7": "NW_017363820.1", + "HG1531_PATCH": "NW_018654725.1", + "HG1535_PATCH": "NW_018654726.1", + "HG2062_PATCH": "NW_009646209.1", + "HSCHR1_1_CTG3": "NT_187515.1", + "HSCHR1_2_CTG3": "NT_187517.1", + "HSCHR1_1_CTG11": "NT_187514.1", + "HSCHR1_4_CTG31": "NT_187520.1", + "HSCHR1_1_CTG31": "NW_003315905.1", + "HSCHR1_2_CTG31": "NW_003315906.1", + "HSCHR1_3_CTG31": "NW_003315907.2", + "HSCHR1_4_CTG32_1": "NT_187521.1", + "HSCHR1_3_CTG32_1": "NT_187519.1", + "HSCHR1_1_CTG32_1": "NT_187516.1", + "HSCHR1_2_CTG32_1": "NT_187518.1", + "HSCHR2_2_CTG1": "NT_187525.1", + "HSCHR2_3_CTG1": "NT_187526.1", + "HSCHR2_4_CTG1": "NT_187529.1", + "HSCHR2_1_CTG1": "NT_187522.1", + "HSCHR2_1_CTG5": "NW_003315908.1", + "HSCHR2_1_CTG7": "NT_187524.1", + "HSCHR2_5_CTG7_2": "NT_187531.1", + "HSCHR2_4_CTG7_2": "NT_187530.1", + "HSCHR2_3_CTG7_2": "NT_187528.1", + "HSCHR2_2_CTG7_2": "NW_003571033.2", + "HSCHR2_1_CTG7_2": "NW_003315909.1", + "HSCHR2_3_CTG15": "NT_187527.1", + "HSCHR2_1_CTG15": "NT_187523.1", + "HSCHR3_1_CTG1": "NW_003871060.2", + "HSCHR3_3_CTG1": "NT_187535.1", + "HSCHR3_4_CTG2_1": "NT_187537.1", + "HSCHR3_1_CTG2_1": "NW_003315913.1", + "HSCHR3_2_CTG2_1": "NT_187533.1", + "HSCHR3_3_CTG2_1": "NT_187536.1", + "HSCHR3_5_CTG2_1": "NT_187538.1", + "HSCHR3_1_CTG3": "NT_187532.1", + "HSCHR3_2_CTG3": "NT_187534.1", + "HSCHR3_9_CTG3": "NT_187539.1", + "HSCHR4_1_CTG4": "NT_187540.1", + "HSCHR4_1_CTG6": "NW_003315915.1", + "HSCHR4_1_CTG8_1": "NT_187541.1", + "HSCHR4_1_CTG9": "NT_167250.2", + "HSCHR4_4_CTG12": "NT_187544.1", + "HSCHR4_1_CTG12": "NW_003315914.1", + "HSCHR4_2_CTG12": "NT_187542.1", + "HSCHR4_5_CTG12": "NT_187545.1", + "HSCHR4_3_CTG12": "NT_187543.1", + "HSCHR5_5_CTG1": "NT_187550.1", + "HSCHR5_4_CTG1": "NT_187548.1", + "HSCHR5_3_CTG1": "NT_187547.1", + "HSCHR5_1_CTG1": "NW_003315920.1", + "HSCHR5_2_CTG1": "NW_003571036.1", + "HSCHR5_6_CTG1": "NT_187551.1", + "HSCHR5_2_CTG1_1": "NW_003315917.2", + "HSCHR5_3_CTG1_1": "NW_003315918.1", + "HSCHR5_4_CTG1_1": "NT_187549.1", + "HSCHR5_1_CTG5": "NW_003315919.1", + "HSCHR5_2_CTG5": "NT_187546.1", + "HSCHR6_MHC_APD_CTG1": "NT_167244.2", + "HSCHR6_1_CTG7": "NT_187555.1", + "HSCHR6_1_CTG6": "NT_187554.1", + "HSCHR6_1_CTG2": "NW_003315921.1", + "HSCHR6_1_CTG8": "NT_187556.1", + "HSCHR6_1_CTG9": "NT_187557.1", + "HSCHR6_1_CTG3": "NW_004166862.2", + "HSCHR6_1_CTG4": "NT_187552.1", + "HSCHR6_1_CTG5": "NT_187553.1", + "HSCHR7_1_CTG1": "NT_187558.1", + "HSCHR7_2_CTG4_4": "NT_187561.1", + "HSCHR7_1_CTG4_4": "NT_187559.1", + "HSCHR7_1_CTG6": "NW_003315922.2", + "HSCHR7_2_CTG6": "NT_187562.1", + "HSCHR7_3_CTG6": "NT_187564.1", + "HSCHR7_2_CTG7": "NT_187563.1", + "HSCHR7_1_CTG7": "NT_187560.1", + "HSCHR8_4_CTG1": "NT_187572.1", + "HSCHR8_2_CTG1": "NT_187568.1", + "HSCHR8_1_CTG1": "NT_187565.1", + "HSCHR8_8_CTG1": "NT_187576.1", + "HSCHR8_3_CTG1": "NT_187570.1", + "HSCHR8_9_CTG1": "NT_187577.1", + "HSCHR8_1_CTG6": "NT_187566.1", + "HSCHR8_1_CTG7": "NT_187567.1", + "HSCHR8_5_CTG7": "NT_187574.1", + "HSCHR8_6_CTG7": "NT_187575.1", + "HSCHR8_4_CTG7": "NT_187573.1", + "HSCHR8_3_CTG7": "NT_187571.1", + "HSCHR8_2_CTG7": "NT_187569.1", + "HSCHR9_1_CTG1": "NW_003315928.1", + "HSCHR9_1_CTG2": "NW_003315929.1", + "HSCHR9_1_CTG3": "NW_003315930.1", + "HSCHR9_1_CTG4": "NW_003315931.1", + "HSCHR9_1_CTG5": "NT_187578.1", + "HSCHR10_1_CTG1": "NW_003315934.1", + "HSCHR10_1_CTG3": "NT_187579.1", + "HSCHR10_1_CTG2": "NW_003315935.1", + "HSCHR10_1_CTG4": "NT_187580.1", + "HSCHR11_1_CTG8": "NT_187586.1", + "HSCHR11_1_CTG6": "NT_187584.1", + "HSCHR11_1_CTG7": "NT_187585.1", + "HSCHR11_1_CTG5": "NT_187583.1", + "HSCHR11_1_CTG1_1": "NW_003315936.1", + "HG142_HG150_NOVEL_TEST": "NW_003871073.1", + "HG151_NOVEL_TEST": "NW_003871074.1", + "HSCHR11_1_CTG3": "NT_187582.1", + "HSCHR11_1_CTG2": "NT_187581.1", + "HSCHR12_1_CTG1": "NW_003571049.1", + "HSCHR12_2_CTG2": "NW_003571050.1", + "HSCHR12_5_CTG2": "NT_187588.1", + "HSCHR12_1_CTG2": "NW_003315938.1", + "HSCHR12_4_CTG2": "NT_187587.1", + "HSCHR12_1_CTG2_1": "NW_003315939.2", + "HSCHR12_2_CTG2_1": "NW_003315941.1", + "HSCHR12_3_CTG2_1": "NW_003315942.2", + "HSCHR12_6_CTG2_1": "NT_187590.1", + "HSCHR12_4_CTG2_1": "NW_003315940.1", + "HSCHR12_5_CTG2_1": "NT_187589.1", + "HSCHR12_7_CTG2_1": "NT_187591.1", + "HSCHR13_1_CTG3": "NT_187594.1", + "HSCHR13_1_CTG2": "NT_187593.1", + "HSCHR13_1_CTG6": "NT_187597.1", + "HSCHR13_1_CTG4": "NT_187595.1", + "HSCHR13_1_CTG1": "NT_187592.1", + "HSCHR13_1_CTG5": "NT_187596.1", + "HSCHR14_1_CTG1": "NT_187598.1", + "HSCHR14_7_CTG1": "NT_187601.1", + "HSCHR14_2_CTG1": "NT_187599.1", + "HSCHR14_3_CTG1": "NT_187600.1", + "HSCHR15_1_CTG1": "NT_187602.1", + "HSCHR15_3_CTG3": "NT_187604.1", + "HSCHR15_1_CTG3": "NT_187603.1", + "HSCHR15_1_CTG8": "NW_003315943.1", + "HSCHR15_3_CTG8": "NT_187605.1", + "HSCHR15_2_CTG8": "NW_003315944.2", + "HSCHR15_5_CTG8": "NT_187606.1", + "HSCHR16_CTG2": "NT_187610.1", + "HSCHR16_4_CTG1": "NT_187609.1", + "HSCHR16_3_CTG1": "NT_187608.1", + "HSCHR16_1_CTG1": "NT_187607.1", + "HSCHR16_1_CTG3_1": "NW_003315945.1", + "HSCHR16_2_CTG3_1": "NW_003315946.1", + "HSCHR17_1_CTG1": "NW_003315952.3", + "HSCHR17_2_CTG2": "NT_187613.1", + "HSCHR17_1_CTG2": "NT_187611.1", + "HSCHR17_7_CTG4": "NT_187614.1", + "HSCHR17_4_CTG4": "NW_003871091.1", + "HSCHR17_5_CTG4": "NW_003871092.1", + "HSCHR17_1_CTG4": "NW_003315953.2", + "HSCHR17_1_CTG5": "NT_167251.2", + "HSCHR17_2_CTG4": "NW_003315954.1", + "HSCHR17_8_CTG4": "NT_187615.1", + "HSCHR17_9_CTG4": "NT_187616.1", + "HSCHR17_3_CTG4": "NW_003315955.1", + "HSCHR17_1_CTG9": "NT_187612.1", + "HSCHR18_4_CTG1_1": "NT_187618.1", + "HSCHR18_1_CTG1_1": "NW_003315956.1", + "HSCHR18_2_CTG1_1": "NW_003315959.1", + "HSCHR18_2_CTG2": "NW_003315960.1", + "HSCHR18_1_CTG2": "NW_003315957.1", + "HSCHR18_1_CTG2_1": "NW_003315958.1", + "HSCHR18_2_CTG2_1": "NW_003315961.1", + "HSCHR18_3_CTG2_1": "NT_187617.1", + "HSCHR19_5_CTG2": "NT_187622.1", + "HSCHR19_4_CTG2": "NT_187621.1", + "HSCHR19_1_CTG2": "NW_003315962.1", + "HSCHR19_2_CTG2": "NW_003315964.2", + "HSCHR19_3_CTG2": "NW_003315965.1", + "HSCHR19_1_CTG3_1": "NW_003315963.1", + "HSCHR19_2_CTG3_1": "NT_187619.1", + "HSCHR19_3_CTG3_1": "NT_187620.1", + "HSCHR19LRC_COX1_CTG3_1": "NW_003571054.1", + "HSCHR20_1_CTG1": "NW_003315966.2", + "HSCHR20_1_CTG2": "NT_187623.1", + "HSCHR20_1_CTG4": "NT_187625.1", + "HSCHR20_1_CTG3": "NT_187624.1", + "HSCHR21_1_CTG1_1": "NW_003315967.2", + "HSCHR21_8_CTG1_1": "NT_187628.1", + "HSCHR21_6_CTG1_1": "NT_187627.1", + "HSCHR21_2_CTG1_1": "NW_003315968.2", + "HSCHR21_3_CTG1_1": "NW_003315969.2", + "HSCHR21_4_CTG1_1": "NW_003315970.2", + "HSCHR21_5_CTG2": "NT_187626.1", + "HSCHR22_1_CTG3": "NT_187629.1", + "HSCHR22_1_CTG6": "NT_187632.1", + "HSCHR22_1_CTG7": "NT_187633.1", + "HSCHR22_1_CTG4": "NT_187630.1", + "HSCHR22_1_CTG5": "NT_187631.1", + "HSCHR22_1_CTG2": "NW_003315972.2", + "HSCHR22_1_CTG1": "NW_003315971.2", + "HSCHRX_1_CTG3": "NT_187634.1", + "HSCHRX_2_CTG12": "NT_187635.1", + "HSCHR1_ALT2_1_CTG32_1": "NT_187646.1", + "HSCHR2_2_CTG7": "NT_187648.1", + "HSCHR2_2_CTG15": "NT_187647.1", + "HSCHR3_3_CTG3": "NT_187649.1", + "HSCHR4_6_CTG12": "NT_187650.1", + "HSCHR5_1_CTG1_1": "NT_187651.1", + "HSCHR5_3_CTG5": "NT_187652.1", + "HSCHR6_MHC_COX_CTG1": "NT_113891.3", + "HSCHR7_2_CTG1": "NT_187653.1", + "HSCHR8_6_CTG1": "NT_187655.1", + "HSCHR8_5_CTG1": "NT_187654.1", + "HSCHR11_2_CTG1": "NT_187656.1", + "HSCHR11_2_CTG1_1": "NT_187657.1", + "HSCHR12_3_CTG2": "NT_187658.1", + "HSCHR15_2_CTG3": "NT_187659.1", + "HSCHR15_4_CTG8": "NT_187660.1", + "HSCHR17_2_CTG1": "NT_187662.1", + "HSCHR17_3_CTG2": "NT_187664.1", + "HSCHR17_10_CTG4": "NT_187661.1", + "HSCHR17_6_CTG4": "NW_003871093.1", + "HSCHR17_2_CTG5": "NT_187663.1", + "HSCHR18_ALT21_CTG2_1": "NT_187665.1", + "HSCHR18_ALT2_CTG2_1": "NT_187666.1", + "HSCHR19LRC_COX2_CTG3_1": "NW_003571055.2", + "HSCHR22_2_CTG1": "NW_004504305.1", + "HSCHRX_2_CTG3": "NT_187667.1", + "HSCHR3_4_CTG3": "NT_187678.1", + "HSCHR4_7_CTG12": "NT_187679.1", + "HSCHR6_MHC_DBB_CTG1": "NT_167245.2", + "HSCHR8_7_CTG1": "NT_187680.1", + "HSCHR11_3_CTG1": "NT_187681.1", + "HSCHR19LRC_LRC_I_CTG3_1": "NW_003571056.2", + "HSCHR22_3_CTG1": "NT_187682.1", + "HSCHR3_5_CTG3": "NT_187688.1", + "HSCHR6_MHC_MANN_CTG1": "NT_167246.2", + "HSCHR19LRC_LRC_J_CTG3_1": "NW_003571057.2", + "HSCHR3_6_CTG3": "NT_187689.1", + "HSCHR6_MHC_MCF_CTG1": "NT_167247.2", + "HSCHR19LRC_LRC_S_CTG3_1": "NW_003571058.2", + "HSCHR3_7_CTG3": "NT_187690.1", + "HSCHR6_MHC_QBL_CTG1": "NT_167248.2", + "HSCHR19LRC_LRC_T_CTG3_1": "NW_003571059.2", + "HSCHR3_8_CTG3": "NT_187691.1", + "HSCHR6_MHC_SSTO_CTG1": "NT_167249.2", + "HSCHR19LRC_PGF1_CTG3_1": "NW_003571060.1", + "HSCHR6_8_CTG1": "NT_187692.1", + "HSCHR19LRC_PGF2_CTG3_1": "NW_003571061.2", + "HSCHR19_4_CTG3_1": "NT_187693.1", + "HSCHR19KIR_FH15_B_HAP_CTG3_1": "NT_187636.1", + "HSCHR19KIR_G085_A_HAP_CTG3_1": "NT_187637.1", + "HSCHR19KIR_G085_BA1_HAP_CTG3_1": "NT_187638.1", + "HSCHR19KIR_G248_A_HAP_CTG3_1": "NT_187639.1", + "HSCHR19KIR_G248_BA2_HAP_CTG3_1": "NT_187640.1", + "HSCHR19KIR_GRC212_AB_HAP_CTG3_1": "NT_187641.1", + "HSCHR19KIR_GRC212_BA1_HAP_CTG3_1": "NT_187642.1", + "HSCHR19KIR_LUCE_A_HAP_CTG3_1": "NT_187643.1", + "HSCHR19KIR_LUCE_BDEL_HAP_CTG3_1": "NT_187644.1", + "HSCHR19KIR_RSH_A_HAP_CTG3_1": "NT_187645.1", + "HSCHR19KIR_RSH_BA2_HAP_CTG3_1": "NT_187668.1", + "HSCHR19KIR_T7526_A_HAP_CTG3_1": "NT_187669.1", + "HSCHR19KIR_T7526_BDEL_HAP_CTG3_1": "NT_187670.1", + "HSCHR19KIR_ABC08_A1_HAP_CTG3_1": "NT_187671.1", + "HSCHR19KIR_ABC08_AB_HAP_C_P_CTG3_1": "NT_187672.1", + "HSCHR19KIR_ABC08_AB_HAP_T_P_CTG3_1": "NT_187673.1", + "HSCHR19KIR_FH05_A_HAP_CTG3_1": "NT_187674.1", + "HSCHR19KIR_FH05_B_HAP_CTG3_1": "NT_187675.1", + "HSCHR19KIR_FH06_A_HAP_CTG3_1": "NT_187676.1", + "HSCHR19KIR_FH06_BA1_HAP_CTG3_1": "NT_187677.1", + "HSCHR19KIR_FH08_A_HAP_CTG3_1": "NT_187683.1", + "HSCHR19KIR_FH08_BAX_HAP_CTG3_1": "NT_187684.1", + "HSCHR19KIR_FH13_A_HAP_CTG3_1": "NT_187685.1", + "HSCHR19KIR_FH13_BA2_HAP_CTG3_1": "NT_187686.1", + "HSCHR19KIR_FH15_A_HAP_CTG3_1": "NT_187687.1", + "HSCHR19KIR_RP5_B_HAP_CTG3_1": "NT_113949.2", + "HSCHR22_CTG1_3": "NT_167235.1", + "HG1343_HG173_HG459_PATCH": "NW_025791756.1", + "HSCHR1_12_CTG3": "NW_025791753.1", + "HG2515_PATCH": "NW_025791758.1", + "HG2577_PATCH": "NW_025791759.1", + "HSCHR1_5_CTG31": "NW_025791754.1", + "HG2571_PATCH": "NW_025791757.1", + "HSCHR1_6_CTG31": "NW_025791755.1", + "HG1384_PATCH": "NW_021159988.1", + "HG2231_HG2496_PATCH": "NW_025791767.1", + "HG2052_PATCH": "NW_025791766.1", + "HSCHR2_6_CTG1": "NW_025791763.1", + "HSCHR2_10_CTG7_2": "NW_025791760.1", + "HG2275_PATCH": "NW_025791765.1", + "HSCHR2_12_CTG7_2": "NW_025791762.1", + "HSCHR2_11_CTG7_2": "NW_025791761.1", + "HG2494_PATCH": "NW_025791764.1", + "HG2077_PATCH": "NW_025791770.1", + "HG2069_PATCH": "NW_025791771.1", + "HG2264_PATCH": "NW_025791769.1", + "HG287_PATCH": "NW_025791774.1", + "HSCHR4_2_CTG8_1": "NW_025791772.1", + "HG2155_PATCH": "NW_025791773.1", + "HG2476_PATCH": "NW_025791776.1", + "HSCHR5_10_CTG1": "NW_025791779.1", + "HG1395_PATCH": "NW_021159996.1", + "HG2308_PATCH": "NW_025791778.1", + "HG1046_PATCH": "NW_025791775.1", + "HSCHR6_1_CTG1": "NW_025791780.1", + "HSCHR7_4_CTG1": "NW_025791781.1", + "HG2176_PATCH": "NW_025791782.1", + "HG2408_PATCH": "NW_025791784.1", + "HG1047_PATCH": "NW_025791783.1", + "HG1206_PATCH": "NW_025791789.1", + "HG2158_PATCH": "NW_025791787.1", + "HG1012_PATCH": "NW_025791788.1", + "HG2576_PATCH": "NW_025791790.1", + "HG107_HG2565_PATCH": "NW_015148966.2", + "HG152_PATCH": "NW_025791792.1", + "HG28_PATCH": "NW_021160004.1", + "HG2578_PATCH": "NW_025791794.1", + "HG2115_PATCH": "NW_021160005.1", + "HSCHR11_2_CTG3_1": "NW_025791791.1", + "HG1398_PATCH": "NW_021160008.1", + "HG2554_PATCH": "NW_025791795.1", + "HG2246_HG2248_HG2276_PATCH": "NW_021160007.1", + "HG2509_PATCH": "NW_021160012.1", + "HG2510_PATCH": "NW_021160013.1", + "HG2526_HG2573_PATCH": "NW_025791796.1", + "HG2511_PATCH": "NW_021160018.1", + "HG2365_PATCH": "NW_021160017.1", + "HSCHR15_9_CTG8": "NW_025791798.1", + "HG2198_PATCH": "NW_021160016.1", + "HG2280_PATCH": "NW_025791797.1", + "HG2499_PATCH": "NW_021160015.1", + "HG2471_PATCH": "NW_021160019.1", + "HG405_PATCH": "NW_025791800.1", + "HG2087_PATCH": "NW_021160020.1", + "HG2407_PATCH": "NW_025791803.1", + "HSCHR17_13_CTG4": "NW_025791801.1", + "HG2580_PATCH": "NW_025791806.1", + "HG2118_PATCH": "NW_025791802.1", + "HG1369_PATCH": "NW_025791805.1", + "HG1320_PATCH": "NW_021160021.1", + "HG2251_PATCH": "NW_025791804.1", + "HSCHR19_6_CTG2": "NW_025791810.1", + "HG2461_PATCH": "NW_025791807.1", + "HG109_PATCH": "NW_021160022.1", + "HG2569_PATCH": "NW_025791808.1", + "HG2225_PATCH": "NW_025791811.1", + "HG410_PATCH": "NW_025791812.1", + "HG2513_PATCH": "NW_021160023.1", + "HG2219_PATCH": "NW_025791813.1", + "HG2265_PATCH": "NW_025791814.1", + "HG2521_PATCH": "NW_025791815.1", + "HG2512_PATCH": "NW_021160026.1", + "HG1485_PATCH": "NW_021160024.1", + "HG494_PATCH": "NW_021160025.1", + "HG1466_PATCH": "NW_021160031.1", + "HSCHRX_3_CTG3": "NW_025791820.1", + "HG1506_PATCH": "NW_021160028.1", + "HG2527_PATCH": "NW_025791816.1", + "HG1507_PATCH": "NW_021160029.1", + "HG2541_PATCH": "NW_025791817.1", + "HG439_PATCH": "NW_021160027.1", + "HSCHRX_2_CTG14": "NW_025791819.1", + "HG1509_PATCH": "NW_021160030.1", + "HSCHRX_1_CTG14": "NW_025791818.1", + "HG1532_PATCH": "NW_025791821.1", + "HG2469_PATCH": "NW_025791809.1", + "HG2405_PATCH": "NW_025791777.1"} ####################################### _ucsc_to_chr_num_hg19 = { - "NC_000001.10": "chr1", - "NC_000002.11": "chr2", - "NC_000003.11": "chr3", - "NC_000004.11": "chr4", - "NC_000005.9": "chr5", - "NC_000006.11": "chr6", - "NC_000007.13": "chr7", - "NC_000008.10": "chr8", - "NC_000009.11": "chr9", - "NC_000010.10": "chr10", - "NC_000011.9": "chr11", - "NC_000012.11": "chr12", - "NC_000013.10": "chr13", - "NC_000014.8": "chr14", - "NC_000015.9": "chr15", - "NC_000016.9": "chr16", - "NC_000017.10": "chr17", - "NC_000018.9": "chr18", - "NC_000019.9": "chr19", - "NC_000020.10": "chr20", - "NC_000021.8": "chr21", - "NC_000022.10": "chr22", - "NC_000023.10": "chrX", - "NC_000024.9": "chrY", - "NC_012920.1": "chrM", # Cambridge revised mitochondrial - "NC_001807.4": "chrM", # hg19 mitochondrial - # UCSC hg19 ALTS - "NT_113921.2": "chr11_gl000202_random", - "NT_167251.1": "chr17_ctg5_hap1", - "NT_113941.1": "chr17_gl000203_random", - "NT_113943.1": "chr17_gl000204_random", - "NT_113930.1": "chr17_gl000205_random", - "NT_113945.1": "chr17_gl000206_random", - "NT_113947.1": "chr18_gl000207_random", - "NT_113948.1": "chr19_gl000208_random", - "NT_113949.1": "chr19_gl000209_random", - "NT_113878.1": "chr1_gl000191_random", - "NT_167207.1": "chr1_gl000192_random", - "NT_113950.2": "chr21_gl000210_random", - "NT_167250.1": "chr4_ctg9_hap1", - "NT_113885.1": "chr4_gl000193_random", - "NT_113888.1": "chr4_gl000194_random", - "NT_167244.1": "chr6_apd_hap1", - "NT_113891.2": "chr6_cox_hap2", - "NT_167245.1": "chr6_dbb_hap3", - "NT_167246.1": "chr6_mann_hap4", - "NT_167247.1": "chr6_mcf_hap5", - "NT_167248.1": "chr6_qbl_hap6", - "NT_167249.1": "chr6_ssto_hap7", - "NT_113901.1": "chr7_gl000195_random", - "NT_113909.1": "chr8_gl000196_random", - "NT_113907.1": "chr8_gl000197_random", - "NT_113914.1": "chr9_gl000198_random", - "NT_113916.2": "chr9_gl000199_random", - "NT_113915.1": "chr9_gl000200_random", - "NT_113911.1": "chr9_gl000201_random", - "NT_113961.1": "chrUn_gl000211", - "NT_113923.1": "chrUn_gl000212", - "NT_167208.1": "chrUn_gl000213", - "NT_167209.1": "chrUn_gl000214", - "NT_167210.1": "chrUn_gl000215", - "NT_167211.1": "chrUn_gl000216", - "NT_167212.1": "chrUn_gl000217", - "NT_113889.1": "chrUn_gl000218", - "NT_167213.1": "chrUn_gl000219", - "NT_167214.1": "chrUn_gl000220", - "NT_167215.1": "chrUn_gl000221", - "NT_167216.1": "chrUn_gl000222", - "NT_167217.1": "chrUn_gl000223", - "NT_167218.1": "chrUn_gl000224", - "NT_167219.1": "chrUn_gl000225", - "NT_167220.1": "chrUn_gl000226", - "NT_167221.1": "chrUn_gl000227", - "NT_167222.1": "chrUn_gl000228", - "NT_167223.1": "chrUn_gl000229", - "NT_167224.1": "chrUn_gl000230", - "NT_167225.1": "chrUn_gl000231", - "NT_167226.1": "chrUn_gl000232", - "NT_167227.1": "chrUn_gl000233", - "NT_167228.1": "chrUn_gl000234", - "NT_167229.1": "chrUn_gl000235", - "NT_167230.1": "chrUn_gl000236", - "NT_167231.1": "chrUn_gl000237", - "NT_167232.1": "chrUn_gl000238", - "NT_167233.1": "chrUn_gl000239", - "NT_167234.1": "chrUn_gl000240", - "NT_167235.1": "chrUn_gl000241", - "NT_167236.1": "chrUn_gl000242", - "NT_167237.1": "chrUn_gl000243", - "NT_167238.1": "chrUn_gl000244", - "NT_167239.1": "chrUn_gl000245", - "NT_167240.1": "chrUn_gl000246", - "NT_167241.1": "chrUn_gl000247", - "NT_167242.1": "chrUn_gl000248", - "NT_167243.1": "chrUn_gl000249" -} + 'NC_000001.10': 'chr1', + 'NC_000002.11': 'chr2', + 'NC_000003.11': 'chr3', + 'NC_000004.11': 'chr4', + 'NC_000005.9': 'chr5', + 'NC_000006.11': 'chr6', + 'NC_000007.13': 'chr7', + 'NC_000008.10': 'chr8', + 'NC_000009.11': 'chr9', + 'NC_000010.10': 'chr10', + 'NC_000011.9': 'chr11', + 'NC_000012.11': 'chr12', + 'NC_000013.10': 'chr13', + 'NC_000014.8': 'chr14', + 'NC_000015.9': 'chr15', + 'NC_000016.9': 'chr16', + 'NC_000017.10': 'chr17', + 'NC_000018.9': 'chr18', + 'NC_000019.9': 'chr19', + 'NC_000020.10': 'chr20', + 'NC_000021.8': 'chr21', + 'NC_000022.10': 'chr22', + 'NC_000023.10': 'chrX', + 'NC_000024.9': 'chrY', + 'NC_012920.1': 'chrM', # Cambridge revised mitochondrial + 'NC_001807.4': 'chrM', # hg19 mitochondrial + # UCSC hg19 ALT IDs + 'NT_113921.2': 'chr11_gl000202_random', + 'NT_167251.1': 'chr17_ctg5_hap1', + 'NT_113941.1': 'chr17_gl000203_random', + 'NT_113943.1': 'chr17_gl000204_random', + 'NT_113930.1': 'chr17_gl000205_random', + 'NT_113945.1': 'chr17_gl000206_random', + 'NT_113947.1': 'chr18_gl000207_random', + 'NT_113948.1': 'chr19_gl000208_random', + 'NT_113949.1': 'chr19_gl000209_random', + 'NT_113878.1': 'chr1_gl000191_random', + 'NT_167207.1': 'chr1_gl000192_random', + 'NT_113950.2': 'chr21_gl000210_random', + 'NT_167250.1': 'chr4_ctg9_hap1', + 'NT_113885.1': 'chr4_gl000193_random', + 'NT_113888.1': 'chr4_gl000194_random', + 'NT_167244.1': 'chr6_apd_hap1', + 'NT_113891.2': 'chr6_cox_hap2', + 'NT_167245.1': 'chr6_dbb_hap3', + 'NT_167246.1': 'chr6_mann_hap4', + 'NT_167247.1': 'chr6_mcf_hap5', + 'NT_167248.1': 'chr6_qbl_hap6', + 'NT_167249.1': 'chr6_ssto_hap7', + 'NT_113901.1': 'chr7_gl000195_random', + 'NT_113909.1': 'chr8_gl000196_random', + 'NT_113907.1': 'chr8_gl000197_random', + 'NT_113914.1': 'chr9_gl000198_random', + 'NT_113916.2': 'chr9_gl000199_random', + 'NT_113915.1': 'chr9_gl000200_random', + 'NT_113911.1': 'chr9_gl000201_random', + 'NT_113961.1': 'chrUn_gl000211', + 'NT_113923.1': 'chrUn_gl000212', + 'NT_167208.1': 'chrUn_gl000213', + 'NT_167209.1': 'chrUn_gl000214', + 'NT_167210.1': 'chrUn_gl000215', + 'NT_167211.1': 'chrUn_gl000216', + 'NT_167212.1': 'chrUn_gl000217', + 'NT_113889.1': 'chrUn_gl000218', + 'NT_167213.1': 'chrUn_gl000219', + 'NT_167214.1': 'chrUn_gl000220', + 'NT_167215.1': 'chrUn_gl000221', + 'NT_167216.1': 'chrUn_gl000222', + 'NT_167217.1': 'chrUn_gl000223', + 'NT_167218.1': 'chrUn_gl000224', + 'NT_167219.1': 'chrUn_gl000225', + 'NT_167220.1': 'chrUn_gl000226', + 'NT_167221.1': 'chrUn_gl000227', + 'NT_167222.1': 'chrUn_gl000228', + 'NT_167223.1': 'chrUn_gl000229', + 'NT_167224.1': 'chrUn_gl000230', + 'NT_167225.1': 'chrUn_gl000231', + 'NT_167226.1': 'chrUn_gl000232', + 'NT_167227.1': 'chrUn_gl000233', + 'NT_167228.1': 'chrUn_gl000234', + 'NT_167229.1': 'chrUn_gl000235', + 'NT_167230.1': 'chrUn_gl000236', + 'NT_167231.1': 'chrUn_gl000237', + 'NT_167232.1': 'chrUn_gl000238', + 'NT_167233.1': 'chrUn_gl000239', + 'NT_167234.1': 'chrUn_gl000240', + 'NT_167235.1': 'chrUn_gl000241', + 'NT_167236.1': 'chrUn_gl000242', + 'NT_167237.1': 'chrUn_gl000243', + 'NT_167238.1': 'chrUn_gl000244', + 'NT_167239.1': 'chrUn_gl000245', + 'NT_167240.1': 'chrUn_gl000246', + 'NT_167241.1': 'chrUn_gl000247', + 'NT_167242.1': 'chrUn_gl000248', + 'NT_167243.1': 'chrUn_gl000249'} ##################################### _ucsc_to_chr_num_hg38 = { - "NC_000001.11": "chr1", - "NC_000002.12": "chr2", - "NC_000003.12": "chr3", - "NC_000004.12": "chr4", - "NC_000005.10": "chr5", - "NC_000006.12": "chr6", - "NC_000007.14": "chr7", - "NC_000008.11": "chr8", - "NC_000009.12": "chr9", - "NC_000010.11": "chr10", - "NC_000011.10": "chr11", - "NC_000012.12": "chr12", - "NC_000013.11": "chr13", - "NC_000014.9": "chr14", - "NC_000015.10": "chr15", - "NC_000016.10": "chr16", - "NC_000017.11": "chr17", - "NC_000018.10": "chr18", - "NC_000019.10": "chr19", - "NC_000020.11": "chr20", - "NC_000021.9": "chr21", - "NC_000022.11": "chr22", - "NC_000023.11": "chrX", - "NC_000024.10": "chrY", - "NC_012920.1": "chrM", - # UCSC hg38 Alts - "NW_009646194.1": "chr1_KN196472v1_fix", - "NW_011332687.1": "chr1_KN538360v1_fix", - "NW_011332688.1": "chr1_KN538361v1_fix", - "NW_018654708.1": "chr1_KZ208906v1_fix", - "NW_025791756.1": "chr1_MU273333v1_fix", - "NW_011332690.1": "chr2_KN538363v1_fix", - "NW_021159987.1": "chr2_ML143341v1_fix", - "NW_025791764.1": "chr2_MU273341v1_fix", - "NW_025791765.1": "chr2_MU273342v1_fix", - "NW_025791766.1": "chr2_MU273343v1_fix", - "NW_025791767.1": "chr2_MU273344v1_fix", - "NW_009646198.1": "chr3_KN196476v1_fix", - "NW_011332691.1": "chr3_KN538364v1_fix", - "NW_017363813.1": "chr3_KV766192v1_fix", - "NW_025791769.1": "chr3_MU273346v1_fix", - "NW_025791771.1": "chr3_MU273348v1_fix", - "NW_015495300.1": "chr4_KQ983257v1_fix", - "NW_016107298.1": "chr5_KV575244v1_fix", - "NW_021159996.1": "chr5_ML143350v1_fix", - "NW_025791777.1": "chr5_MU273354v1_fix", - "NW_025791778.1": "chr5_MU273355v1_fix", - "NW_017363815.1": "chr6_KV766194v1_fix", - "NW_018654713.1": "chr6_KZ208911v1_fix", - "NW_017852930.1": "chr7_KV880765v1_fix", - "NW_018654714.1": "chr7_KZ208912v1_fix", - "NW_021159998.1": "chr7_ML143352v1_fix", - "NW_018654716.1": "chr8_KZ208914v1_fix", - "NW_018654717.1": "chr8_KZ208915v1_fix", - "NW_025791784.1": "chr8_MU273361v1_fix", - "NW_025791786.1": "chr8_MU273363v1_fix", - "NW_025791788.1": "chr9_MU273365v1_fix", - "NW_013171807.1": "chr10_KQ090021v1_fix", - "NW_009646203.1": "chr11_KN196481v1_fix", - "NW_015148966.2": "chr11_KQ759759v2_fix", - "NW_019805495.1": "chr11_KZ559108v1_fix", - "NW_019805496.1": "chr11_KZ559109v1_fix", - "NW_021160004.1": "chr11_ML143358v1_fix", - "NW_021160005.1": "chr11_ML143359v1_fix", - "NW_025791792.1": "chr11_MU273369v1_fix", - "NW_011332696.1": "chr12_KN538369v1_fix", - "NW_018654718.1": "chr12_KZ208916v1_fix", - "NW_021160007.1": "chr12_ML143361v1_fix", - "NW_021160008.1": "chr12_ML143362v1_fix", - "NW_025791795.1": "chr12_MU273372v1_fix", - "NW_011332698.1": "chr13_KN538371v1_fix", - "NW_021160011.1": "chr13_ML143365v1_fix", - "NW_018654722.1": "chr14_KZ208920v1_fix", - "NW_011332701.1": "chr15_KN538374v1_fix", - "NW_021160017.1": "chr15_ML143371v1_fix", - "NW_025791797.1": "chr15_MU273374v1_fix", - "NW_017852933.1": "chr16_KV880768v1_fix", - "NW_019805500.1": "chr16_KZ559113v1_fix", - "NW_021160019.1": "chr16_ML143373v1_fix", - "NW_025791799.1": "chr16_MU273376v1_fix", - "NW_016107299.1": "chr17_KV575245v1_fix", - "NW_017363817.1": "chr17_KV766196v1_fix", - "NW_025791802.1": "chr17_MU273379v1_fix", - "NW_025791803.1": "chr17_MU273380v1_fix", - "NW_025791805.1": "chr17_MU273382v1_fix", - "NW_013171814.1": "chr18_KQ090028v1_fix", - "NW_009646206.1": "chr19_KN196484v1_fix", - "NW_014040929.1": "chr19_KQ458386v1_fix", - "NW_021160022.1": "chr19_ML143376v1_fix", - "NW_025791807.1": "chr19_MU273384v1_fix", - "NW_025791811.1": "chr20_MU273388v1_fix", - "NW_025791812.1": "chr20_MU273389v1_fix", - "NW_025791814.1": "chr21_MU273391v1_fix", - "NW_025791815.1": "chr21_MU273392v1_fix", - "NW_015148969.2": "chr22_KQ759762v2_fix", - "NW_021160027.1": "chrX_ML143381v1_fix", - "NW_025791817.1": "chrX_MU273394v1_fix", - "NW_025791821.1": "chrY_MU273398v1_fix", - "NW_003315934.1": "chr10_GL383545v1_alt", - "NW_003315935.1": "chr10_GL383546v1_alt", - "NT_187579.1": "chr10_KI270824v1_alt", - "NT_187580.1": "chr10_KI270825v1_alt", - "NW_003315936.1": "chr11_GL383547v1_alt", - "NW_003871073.1": "chr11_JH159136v1_alt", - "NW_003871074.1": "chr11_JH159137v1_alt", - "NT_187376.1": "chr11_KI270721v1_random", - "NT_187581.1": "chr11_KI270826v1_alt", - "NT_187582.1": "chr11_KI270827v1_alt", - "NT_187583.1": "chr11_KI270829v1_alt", - "NT_187584.1": "chr11_KI270830v1_alt", - "NT_187585.1": "chr11_KI270831v1_alt", - "NT_187586.1": "chr11_KI270832v1_alt", - "NT_187656.1": "chr11_KI270902v1_alt", - "NT_187657.1": "chr11_KI270903v1_alt", - "NT_187681.1": "chr11_KI270927v1_alt", - "NW_003315938.1": "chr12_GL383549v1_alt", - "NW_003315939.2": "chr12_GL383550v2_alt", - "NW_003315940.1": "chr12_GL383551v1_alt", - "NW_003315941.1": "chr12_GL383552v1_alt", - "NW_003315942.2": "chr12_GL383553v2_alt", - "NW_003571049.1": "chr12_GL877875v1_alt", - "NW_003571050.1": "chr12_GL877876v1_alt", - "NT_187589.1": "chr12_KI270833v1_alt", - "NT_187590.1": "chr12_KI270834v1_alt", - "NT_187587.1": "chr12_KI270835v1_alt", - "NT_187591.1": "chr12_KI270836v1_alt", - "NT_187588.1": "chr12_KI270837v1_alt", - "NT_187658.1": "chr12_KI270904v1_alt", - "NT_187592.1": "chr13_KI270838v1_alt", - "NT_187593.1": "chr13_KI270839v1_alt", - "NT_187594.1": "chr13_KI270840v1_alt", - "NT_187595.1": "chr13_KI270841v1_alt", - "NT_187596.1": "chr13_KI270842v1_alt", - "NT_187597.1": "chr13_KI270843v1_alt", - "NT_113796.3": "chr14_GL000009v2_random", - "NT_113888.1": "chr14_GL000194v1_random", - "NT_167219.1": "chr14_GL000225v1_random", - "NT_187377.1": "chr14_KI270722v1_random", - "NT_187378.1": "chr14_KI270723v1_random", - "NT_187379.1": "chr14_KI270724v1_random", - "NT_187380.1": "chr14_KI270725v1_random", - "NT_187381.1": "chr14_KI270726v1_random", - "NT_187598.1": "chr14_KI270844v1_alt", - "NT_187599.1": "chr14_KI270845v1_alt", - "NT_187600.1": "chr14_KI270846v1_alt", - "NT_187601.1": "chr14_KI270847v1_alt", - "NW_003315943.1": "chr15_GL383554v1_alt", - "NW_003315944.2": "chr15_GL383555v2_alt", - "NT_187382.1": "chr15_KI270727v1_random", - "NT_187603.1": "chr15_KI270848v1_alt", - "NT_187605.1": "chr15_KI270849v1_alt", - "NT_187606.1": "chr15_KI270850v1_alt", - "NT_187604.1": "chr15_KI270851v1_alt", - "NT_187602.1": "chr15_KI270852v1_alt", - "NT_187660.1": "chr15_KI270905v1_alt", - "NT_187659.1": "chr15_KI270906v1_alt", - "NW_003315945.1": "chr16_GL383556v1_alt", - "NW_003315946.1": "chr16_GL383557v1_alt", - "NT_187383.1": "chr16_KI270728v1_random", - "NT_187607.1": "chr16_KI270853v1_alt", - "NT_187610.1": "chr16_KI270854v1_alt", - "NT_187608.1": "chr16_KI270855v1_alt", - "NT_187609.1": "chr16_KI270856v1_alt", - "NT_113930.2": "chr17_GL000205v2_random", - "NT_167251.2": "chr17_GL000258v2_alt", - "NW_003315952.3": "chr17_GL383563v3_alt", - "NW_003315953.2": "chr17_GL383564v2_alt", - "NW_003315954.1": "chr17_GL383565v1_alt", - "NW_003315955.1": "chr17_GL383566v1_alt", - "NW_003871091.1": "chr17_JH159146v1_alt", - "NW_003871092.1": "chr17_JH159147v1_alt", - "NW_003871093.1": "chr17_JH159148v1_alt", - "NT_187384.1": "chr17_KI270729v1_random", - "NT_187385.1": "chr17_KI270730v1_random", - "NT_187614.1": "chr17_KI270857v1_alt", - "NT_187615.1": "chr17_KI270858v1_alt", - "NT_187616.1": "chr17_KI270859v1_alt", - "NT_187612.1": "chr17_KI270860v1_alt", - "NT_187611.1": "chr17_KI270861v1_alt", - "NT_187613.1": "chr17_KI270862v1_alt", - "NT_187662.1": "chr17_KI270907v1_alt", - "NT_187663.1": "chr17_KI270908v1_alt", - "NT_187661.1": "chr17_KI270909v1_alt", - "NT_187664.1": "chr17_KI270910v1_alt", - "NW_003315956.1": "chr18_GL383567v1_alt", - "NW_003315957.1": "chr18_GL383568v1_alt", - "NW_003315958.1": "chr18_GL383569v1_alt", - "NW_003315959.1": "chr18_GL383570v1_alt", - "NW_003315960.1": "chr18_GL383571v1_alt", - "NW_003315961.1": "chr18_GL383572v1_alt", - "NT_187617.1": "chr18_KI270863v1_alt", - "NT_187618.1": "chr18_KI270864v1_alt", - "NT_187666.1": "chr18_KI270911v1_alt", - "NT_187665.1": "chr18_KI270912v1_alt", - "NT_113949.2": "chr19_GL000209v2_alt", - "NW_003315962.1": "chr19_GL383573v1_alt", - "NW_003315963.1": "chr19_GL383574v1_alt", - "NW_003315964.2": "chr19_GL383575v2_alt", - "NW_003315965.1": "chr19_GL383576v1_alt", - "NW_003571054.1": "chr19_GL949746v1_alt", - "NW_003571055.2": "chr19_GL949747v2_alt", - "NW_003571056.2": "chr19_GL949748v2_alt", - "NW_003571057.2": "chr19_GL949749v2_alt", - "NW_003571058.2": "chr19_GL949750v2_alt", - "NW_003571059.2": "chr19_GL949751v2_alt", - "NW_003571060.1": "chr19_GL949752v1_alt", - "NW_003571061.2": "chr19_GL949753v2_alt", - "NT_187621.1": "chr19_KI270865v1_alt", - "NT_187619.1": "chr19_KI270866v1_alt", - "NT_187620.1": "chr19_KI270867v1_alt", - "NT_187622.1": "chr19_KI270868v1_alt", - "NT_187636.1": "chr19_KI270882v1_alt", - "NT_187637.1": "chr19_KI270883v1_alt", - "NT_187638.1": "chr19_KI270884v1_alt", - "NT_187639.1": "chr19_KI270885v1_alt", - "NT_187640.1": "chr19_KI270886v1_alt", - "NT_187641.1": "chr19_KI270887v1_alt", - "NT_187642.1": "chr19_KI270888v1_alt", - "NT_187643.1": "chr19_KI270889v1_alt", - "NT_187644.1": "chr19_KI270890v1_alt", - "NT_187645.1": "chr19_KI270891v1_alt", - "NT_187668.1": "chr19_KI270914v1_alt", - "NT_187669.1": "chr19_KI270915v1_alt", - "NT_187670.1": "chr19_KI270916v1_alt", - "NT_187671.1": "chr19_KI270917v1_alt", - "NT_187672.1": "chr19_KI270918v1_alt", - "NT_187673.1": "chr19_KI270919v1_alt", - "NT_187674.1": "chr19_KI270920v1_alt", - "NT_187675.1": "chr19_KI270921v1_alt", - "NT_187676.1": "chr19_KI270922v1_alt", - "NT_187677.1": "chr19_KI270923v1_alt", - "NT_187683.1": "chr19_KI270929v1_alt", - "NT_187684.1": "chr19_KI270930v1_alt", - "NT_187685.1": "chr19_KI270931v1_alt", - "NT_187686.1": "chr19_KI270932v1_alt", - "NT_187687.1": "chr19_KI270933v1_alt", - "NT_187693.1": "chr19_KI270938v1_alt", - "NW_003315905.1": "chr1_GL383518v1_alt", - "NW_003315906.1": "chr1_GL383519v1_alt", - "NW_003315907.2": "chr1_GL383520v2_alt", - "NT_187361.1": "chr1_KI270706v1_random", - "NT_187362.1": "chr1_KI270707v1_random", - "NT_187363.1": "chr1_KI270708v1_random", - "NT_187364.1": "chr1_KI270709v1_random", - "NT_187365.1": "chr1_KI270710v1_random", - "NT_187366.1": "chr1_KI270711v1_random", - "NT_187367.1": "chr1_KI270712v1_random", - "NT_187368.1": "chr1_KI270713v1_random", - "NT_187369.1": "chr1_KI270714v1_random", - "NT_187516.1": "chr1_KI270759v1_alt", - "NT_187514.1": "chr1_KI270760v1_alt", - "NT_187518.1": "chr1_KI270761v1_alt", - "NT_187515.1": "chr1_KI270762v1_alt", - "NT_187519.1": "chr1_KI270763v1_alt", - "NT_187521.1": "chr1_KI270764v1_alt", - "NT_187520.1": "chr1_KI270765v1_alt", - "NT_187517.1": "chr1_KI270766v1_alt", - "NT_187646.1": "chr1_KI270892v1_alt", - "NW_003315966.2": "chr20_GL383577v2_alt", - "NT_187623.1": "chr20_KI270869v1_alt", - "NT_187624.1": "chr20_KI270870v1_alt", - "NT_187625.1": "chr20_KI270871v1_alt", - "NW_003315967.2": "chr21_GL383578v2_alt", - "NW_003315968.2": "chr21_GL383579v2_alt", - "NW_003315969.2": "chr21_GL383580v2_alt", - "NW_003315970.2": "chr21_GL383581v2_alt", - "NT_187626.1": "chr21_KI270872v1_alt", - "NT_187627.1": "chr21_KI270873v1_alt", - "NT_187628.1": "chr21_KI270874v1_alt", - "NW_003315971.2": "chr22_GL383582v2_alt", - "NW_003315972.2": "chr22_GL383583v2_alt", - "NW_004504305.1": "chr22_KB663609v1_alt", - "NT_187386.1": "chr22_KI270731v1_random", - "NT_187387.1": "chr22_KI270732v1_random", - "NT_187388.1": "chr22_KI270733v1_random", - "NT_187389.1": "chr22_KI270734v1_random", - "NT_187390.1": "chr22_KI270735v1_random", - "NT_187391.1": "chr22_KI270736v1_random", - "NT_187392.1": "chr22_KI270737v1_random", - "NT_187393.1": "chr22_KI270738v1_random", - "NT_187394.1": "chr22_KI270739v1_random", - "NT_187629.1": "chr22_KI270875v1_alt", - "NT_187630.1": "chr22_KI270876v1_alt", - "NT_187631.1": "chr22_KI270877v1_alt", - "NT_187632.1": "chr22_KI270878v1_alt", - "NT_187633.1": "chr22_KI270879v1_alt", - "NT_187682.1": "chr22_KI270928v1_alt", - "NW_003315908.1": "chr2_GL383521v1_alt", - "NW_003315909.1": "chr2_GL383522v1_alt", - "NW_003571033.2": "chr2_GL582966v2_alt", - "NT_187370.1": "chr2_KI270715v1_random", - "NT_187371.1": "chr2_KI270716v1_random", - "NT_187523.1": "chr2_KI270767v1_alt", - "NT_187528.1": "chr2_KI270768v1_alt", - "NT_187522.1": "chr2_KI270769v1_alt", - "NT_187525.1": "chr2_KI270770v1_alt", - "NT_187530.1": "chr2_KI270771v1_alt", - "NT_187524.1": "chr2_KI270772v1_alt", - "NT_187526.1": "chr2_KI270773v1_alt", - "NT_187529.1": "chr2_KI270774v1_alt", - "NT_187531.1": "chr2_KI270775v1_alt", - "NT_187527.1": "chr2_KI270776v1_alt", - "NT_187647.1": "chr2_KI270893v1_alt", - "NT_187648.1": "chr2_KI270894v1_alt", - "NT_167215.1": "chr3_GL000221v1_random", - "NW_003315913.1": "chr3_GL383526v1_alt", - "NW_003871060.2": "chr3_JH636055v2_alt", - "NT_187533.1": "chr3_KI270777v1_alt", - "NT_187536.1": "chr3_KI270778v1_alt", - "NT_187532.1": "chr3_KI270779v1_alt", - "NT_187537.1": "chr3_KI270780v1_alt", - "NT_187538.1": "chr3_KI270781v1_alt", - "NT_187534.1": "chr3_KI270782v1_alt", - "NT_187535.1": "chr3_KI270783v1_alt", - "NT_187539.1": "chr3_KI270784v1_alt", - "NT_187649.1": "chr3_KI270895v1_alt", - "NT_187678.1": "chr3_KI270924v1_alt", - "NT_187688.1": "chr3_KI270934v1_alt", - "NT_187689.1": "chr3_KI270935v1_alt", - "NT_187690.1": "chr3_KI270936v1_alt", - "NT_187691.1": "chr3_KI270937v1_alt", - "NT_113793.3": "chr4_GL000008v2_random", - "NT_167250.2": "chr4_GL000257v2_alt", - "NW_003315914.1": "chr4_GL383527v1_alt", - "NW_003315915.1": "chr4_GL383528v1_alt", - "NT_187542.1": "chr4_KI270785v1_alt", - "NT_187543.1": "chr4_KI270786v1_alt", - "NT_187541.1": "chr4_KI270787v1_alt", - "NT_187544.1": "chr4_KI270788v1_alt", - "NT_187545.1": "chr4_KI270789v1_alt", - "NT_187540.1": "chr4_KI270790v1_alt", - "NT_187650.1": "chr4_KI270896v1_alt", - "NT_187679.1": "chr4_KI270925v1_alt", - "NT_113948.1": "chr5_GL000208v1_random", - "NW_003315917.2": "chr5_GL339449v2_alt", - "NW_003315918.1": "chr5_GL383530v1_alt", - "NW_003315919.1": "chr5_GL383531v1_alt", - "NW_003315920.1": "chr5_GL383532v1_alt", - "NW_003571036.1": "chr5_GL949742v1_alt", - "NT_187547.1": "chr5_KI270791v1_alt", - "NT_187548.1": "chr5_KI270792v1_alt", - "NT_187550.1": "chr5_KI270793v1_alt", - "NT_187551.1": "chr5_KI270794v1_alt", - "NT_187546.1": "chr5_KI270795v1_alt", - "NT_187549.1": "chr5_KI270796v1_alt", - "NT_187651.1": "chr5_KI270897v1_alt", - "NT_187652.1": "chr5_KI270898v1_alt", - "NT_167244.2": "chr6_GL000250v2_alt", - "NT_113891.3": "chr6_GL000251v2_alt", - "NT_167245.2": "chr6_GL000252v2_alt", - "NT_167246.2": "chr6_GL000253v2_alt", - "NT_167247.2": "chr6_GL000254v2_alt", - "NT_167248.2": "chr6_GL000255v2_alt", - "NT_167249.2": "chr6_GL000256v2_alt", - "NW_003315921.1": "chr6_GL383533v1_alt", - "NW_004166862.2": "chr6_KB021644v2_alt", - "NT_187692.1": "chr6_KI270758v1_alt", - "NT_187552.1": "chr6_KI270797v1_alt", - "NT_187553.1": "chr6_KI270798v1_alt", - "NT_187554.1": "chr6_KI270799v1_alt", - "NT_187555.1": "chr6_KI270800v1_alt", - "NT_187556.1": "chr6_KI270801v1_alt", - "NT_187557.1": "chr6_KI270802v1_alt", - "NW_003315922.2": "chr7_GL383534v2_alt", - "NT_187562.1": "chr7_KI270803v1_alt", - "NT_187558.1": "chr7_KI270804v1_alt", - "NT_187560.1": "chr7_KI270805v1_alt", - "NT_187559.1": "chr7_KI270806v1_alt", - "NT_187563.1": "chr7_KI270807v1_alt", - "NT_187564.1": "chr7_KI270808v1_alt", - "NT_187561.1": "chr7_KI270809v1_alt", - "NT_187653.1": "chr7_KI270899v1_alt", - "NT_187567.1": "chr8_KI270810v1_alt", - "NT_187565.1": "chr8_KI270811v1_alt", - "NT_187568.1": "chr8_KI270812v1_alt", - "NT_187570.1": "chr8_KI270813v1_alt", - "NT_187566.1": "chr8_KI270814v1_alt", - "NT_187569.1": "chr8_KI270815v1_alt", - "NT_187571.1": "chr8_KI270816v1_alt", - "NT_187573.1": "chr8_KI270817v1_alt", - "NT_187572.1": "chr8_KI270818v1_alt", - "NT_187574.1": "chr8_KI270819v1_alt", - "NT_187575.1": "chr8_KI270820v1_alt", - "NT_187576.1": "chr8_KI270821v1_alt", - "NT_187577.1": "chr8_KI270822v1_alt", - "NT_187654.1": "chr8_KI270900v1_alt", - "NT_187655.1": "chr8_KI270901v1_alt", - "NT_187680.1": "chr8_KI270926v1_alt", - "NW_003315928.1": "chr9_GL383539v1_alt", - "NW_003315929.1": "chr9_GL383540v1_alt", - "NW_003315930.1": "chr9_GL383541v1_alt", - "NW_003315931.1": "chr9_GL383542v1_alt", - "NT_187372.1": "chr9_KI270717v1_random", - "NT_187373.1": "chr9_KI270718v1_random", - "NT_187374.1": "chr9_KI270719v1_random", - "NT_187375.1": "chr9_KI270720v1_random", - "NT_187578.1": "chr9_KI270823v1_alt", - "NT_113901.1": "chrUn_GL000195v1", - "NT_167208.1": "chrUn_GL000213v1", - "NT_167209.1": "chrUn_GL000214v1", - "NT_167211.2": "chrUn_GL000216v2", - "NT_113889.1": "chrUn_GL000218v1", - "NT_167213.1": "chrUn_GL000219v1", - "NT_167214.1": "chrUn_GL000220v1", - "NT_167218.1": "chrUn_GL000224v1", - "NT_167220.1": "chrUn_GL000226v1", - "NT_187396.1": "chrUn_KI270302v1", - "NT_187398.1": "chrUn_KI270303v1", - "NT_187397.1": "chrUn_KI270304v1", - "NT_187399.1": "chrUn_KI270305v1", - "NT_187402.1": "chrUn_KI270310v1", - "NT_187406.1": "chrUn_KI270311v1", - "NT_187405.1": "chrUn_KI270312v1", - "NT_187404.1": "chrUn_KI270315v1", - "NT_187403.1": "chrUn_KI270316v1", - "NT_187407.1": "chrUn_KI270317v1", - "NT_187401.1": "chrUn_KI270320v1", - "NT_187400.1": "chrUn_KI270322v1", - "NT_187459.1": "chrUn_KI270329v1", - "NT_187458.1": "chrUn_KI270330v1", - "NT_187461.1": "chrUn_KI270333v1", - "NT_187460.1": "chrUn_KI270334v1", - "NT_187462.1": "chrUn_KI270335v1", - "NT_187465.1": "chrUn_KI270336v1", - "NT_187466.1": "chrUn_KI270337v1", - "NT_187463.1": "chrUn_KI270338v1", - "NT_187464.1": "chrUn_KI270340v1", - "NT_187469.1": "chrUn_KI270362v1", - "NT_187467.1": "chrUn_KI270363v1", - "NT_187468.1": "chrUn_KI270364v1", - "NT_187470.1": "chrUn_KI270366v1", - "NT_187494.1": "chrUn_KI270371v1", - "NT_187491.1": "chrUn_KI270372v1", - "NT_187492.1": "chrUn_KI270373v1", - "NT_187490.1": "chrUn_KI270374v1", - "NT_187493.1": "chrUn_KI270375v1", - "NT_187489.1": "chrUn_KI270376v1", - "NT_187471.1": "chrUn_KI270378v1", - "NT_187472.1": "chrUn_KI270379v1", - "NT_187486.1": "chrUn_KI270381v1", - "NT_187488.1": "chrUn_KI270382v1", - "NT_187482.1": "chrUn_KI270383v1", - "NT_187484.1": "chrUn_KI270384v1", - "NT_187487.1": "chrUn_KI270385v1", - "NT_187480.1": "chrUn_KI270386v1", - "NT_187475.1": "chrUn_KI270387v1", - "NT_187478.1": "chrUn_KI270388v1", - "NT_187473.1": "chrUn_KI270389v1", - "NT_187474.1": "chrUn_KI270390v1", - "NT_187481.1": "chrUn_KI270391v1", - "NT_187485.1": "chrUn_KI270392v1", - "NT_187483.1": "chrUn_KI270393v1", - "NT_187479.1": "chrUn_KI270394v1", - "NT_187476.1": "chrUn_KI270395v1", - "NT_187477.1": "chrUn_KI270396v1", - "NT_187409.1": "chrUn_KI270411v1", - "NT_187408.1": "chrUn_KI270412v1", - "NT_187410.1": "chrUn_KI270414v1", - "NT_187415.1": "chrUn_KI270417v1", - "NT_187412.1": "chrUn_KI270418v1", - "NT_187411.1": "chrUn_KI270419v1", - "NT_187413.1": "chrUn_KI270420v1", - "NT_187416.1": "chrUn_KI270422v1", - "NT_187417.1": "chrUn_KI270423v1", - "NT_187414.1": "chrUn_KI270424v1", - "NT_187418.1": "chrUn_KI270425v1", - "NT_187419.1": "chrUn_KI270429v1", - "NT_187424.1": "chrUn_KI270435v1", - "NT_187425.1": "chrUn_KI270438v1", - "NT_187420.1": "chrUn_KI270442v1", - "NT_187495.1": "chrUn_KI270448v1", - "NT_187422.1": "chrUn_KI270465v1", - "NT_187421.1": "chrUn_KI270466v1", - "NT_187423.1": "chrUn_KI270467v1", - "NT_187426.1": "chrUn_KI270468v1", - "NT_187437.1": "chrUn_KI270507v1", - "NT_187430.1": "chrUn_KI270508v1", - "NT_187428.1": "chrUn_KI270509v1", - "NT_187427.1": "chrUn_KI270510v1", - "NT_187435.1": "chrUn_KI270511v1", - "NT_187432.1": "chrUn_KI270512v1", - "NT_187436.1": "chrUn_KI270515v1", - "NT_187431.1": "chrUn_KI270516v1", - "NT_187438.1": "chrUn_KI270517v1", - "NT_187429.1": "chrUn_KI270518v1", - "NT_187433.1": "chrUn_KI270519v1", - "NT_187496.1": "chrUn_KI270521v1", - "NT_187434.1": "chrUn_KI270522v1", - "NT_187440.1": "chrUn_KI270528v1", - "NT_187439.1": "chrUn_KI270529v1", - "NT_187441.1": "chrUn_KI270530v1", - "NT_187443.1": "chrUn_KI270538v1", - "NT_187442.1": "chrUn_KI270539v1", - "NT_187444.1": "chrUn_KI270544v1", - "NT_187445.1": "chrUn_KI270548v1", - "NT_187450.1": "chrUn_KI270579v1", - "NT_187448.1": "chrUn_KI270580v1", - "NT_187449.1": "chrUn_KI270581v1", - "NT_187454.1": "chrUn_KI270582v1", - "NT_187446.1": "chrUn_KI270583v1", - "NT_187453.1": "chrUn_KI270584v1", - "NT_187447.1": "chrUn_KI270587v1", - "NT_187455.1": "chrUn_KI270588v1", - "NT_187451.1": "chrUn_KI270589v1", - "NT_187452.1": "chrUn_KI270590v1", - "NT_187457.1": "chrUn_KI270591v1", - "NT_187456.1": "chrUn_KI270593v1", - "NT_187497.1": "chrUn_KI270741v1", - "NT_187513.1": "chrUn_KI270742v1", - "NT_187498.1": "chrUn_KI270743v1", - "NT_187499.1": "chrUn_KI270744v1", - "NT_187500.1": "chrUn_KI270745v1", - "NT_187501.1": "chrUn_KI270746v1", - "NT_187502.1": "chrUn_KI270747v1", - "NT_187503.1": "chrUn_KI270748v1", - "NT_187504.1": "chrUn_KI270749v1", - "NT_187505.1": "chrUn_KI270750v1", - "NT_187506.1": "chrUn_KI270751v1", - "NT_187507.1": "chrUn_KI270752v1", - "NT_187508.1": "chrUn_KI270753v1", - "NT_187509.1": "chrUn_KI270754v1", - "NT_187510.1": "chrUn_KI270755v1", - "NT_187511.1": "chrUn_KI270756v1", - "NT_187512.1": "chrUn_KI270757v1", - "NT_187634.1": "chrX_KI270880v1_alt", - "NT_187635.1": "chrX_KI270881v1_alt", - "NT_187667.1": "chrX_KI270913v1_alt", - "NT_187395.1": "chrY_KI270740v1_random", - "NW_011332689.1": "chr2_KN538362v1_fix", - "NW_011332692.1": "chr10_KN538365v1_fix", - "NW_011332693.1": "chr10_KN538366v1_fix", - "NW_011332694.1": "chr10_KN538367v1_fix", - "NW_011332695.1": "chr11_KN538368v1_alt", - "NW_011332697.1": "chr12_KN538370v1_fix", - "NW_011332699.1": "chr13_KN538372v1_fix", - "NW_011332700.1": "chr13_KN538373v1_fix", - "NW_012132914.1": "chr1_KQ031383v1_fix", - "NW_012132915.1": "chr2_KQ031384v1_fix", - "NW_012132916.1": "chr3_KQ031385v1_fix", - "NW_012132917.1": "chr3_KQ031386v1_fix", - "NW_012132918.1": "chr6_KQ031387v1_fix", - "NW_012132919.1": "chr7_KQ031388v1_fix", - "NW_012132920.1": "chr15_KQ031389v1_alt", - "NW_012132921.1": "chr16_KQ031390v1_alt", - "NW_013171799.1": "chr4_KQ090013v1_alt", - "NW_013171800.1": "chr4_KQ090014v1_alt", - "NW_013171801.1": "chr4_KQ090015v1_alt", - "NW_013171802.1": "chr6_KQ090016v1_fix", - "NW_013171803.1": "chr6_KQ090017v1_alt", - "NW_013171804.1": "chr9_KQ090018v1_alt", - "NW_013171805.1": "chr9_KQ090019v1_alt", - "NW_013171806.1": "chr10_KQ090020v1_alt", - "NW_013171808.1": "chr11_KQ090022v1_fix", - "NW_013171809.1": "chr12_KQ090023v1_alt", - "NW_013171810.1": "chr13_KQ090024v1_alt", - "NW_013171811.1": "chr13_KQ090025v1_alt", - "NW_013171812.1": "chr16_KQ090026v1_alt", - "NW_013171813.1": "chr16_KQ090027v1_alt", - "NW_014040925.1": "chr1_KQ458382v1_alt", - "NW_014040926.1": "chr1_KQ458383v1_alt", - "NW_014040927.1": "chr1_KQ458384v1_alt", - "NW_014040928.1": "chr18_KQ458385v1_alt", - "NW_014040930.1": "chr22_KQ458387v1_alt", - "NW_014040931.1": "chr22_KQ458388v1_alt", - "NW_015148966.1": "chr11_KQ759759v1_fix", - "NW_015148967.1": "chr12_KQ759760v1_fix", - "NW_015148968.1": "chr22_KQ759761v1_alt", - "NW_015148969.1": "chr22_KQ759762v1_fix", - "NW_015495298.1": "chr1_KQ983255v1_alt", - "NW_015495299.1": "chr2_KQ983256v1_alt", - "NW_015495301.1": "chr4_KQ983258v1_alt", - "NW_016107297.1": "chr5_KV575243v1_alt", - "NW_016107300.1": "chr19_KV575246v1_alt", - "NW_016107301.1": "chr19_KV575247v1_alt", - "NW_016107302.1": "chr19_KV575248v1_alt", - "NW_016107303.1": "chr19_KV575249v1_alt", - "NW_016107304.1": "chr19_KV575250v1_alt", - "NW_016107305.1": "chr19_KV575251v1_alt", - "NW_016107306.1": "chr19_KV575252v1_alt", - "NW_016107307.1": "chr19_KV575253v1_alt", - "NW_016107308.1": "chr19_KV575254v1_alt", - "NW_016107309.1": "chr19_KV575255v1_alt", - "NW_016107310.1": "chr19_KV575256v1_alt", - "NW_016107311.1": "chr19_KV575257v1_alt", - "NW_016107312.1": "chr19_KV575258v1_alt", - "NW_016107313.1": "chr19_KV575259v1_alt", - "NW_016107314.1": "chr19_KV575260v1_alt", - "NW_017363814.1": "chr4_KV766193v1_alt", - "NW_017363816.1": "chr11_KV766195v1_fix", - "NW_017363818.1": "chr17_KV766197v1_alt", - "NW_017363819.1": "chr17_KV766198v1_alt", - "NW_017363820.1": "chrX_KV766199v1_alt", - "NW_017852928.1": "chr1_KV880763v1_alt", - "NW_017852929.1": "chr7_KV880764v1_fix", - "NW_017852931.1": "chr8_KV880766v1_fix", - "NW_017852932.1": "chr8_KV880767v1_fix", - "NW_018654706.1": "chr1_KZ208904v1_alt", - "NW_018654707.1": "chr1_KZ208905v1_alt", - "NW_018654709.1": "chr2_KZ208907v1_alt", - "NW_018654710.1": "chr2_KZ208908v1_alt", - "NW_018654711.1": "chr3_KZ208909v1_alt", - "NW_018654712.1": "chr5_KZ208910v1_alt", - "NW_018654715.1": "chr7_KZ208913v1_alt", - "NW_018654719.1": "chr12_KZ208917v1_fix", - "NW_018654720.1": "chr12_KZ208918v1_alt", - "NW_018654721.1": "chr14_KZ208919v1_alt", - "NW_018654723.1": "chr16_KZ208921v1_alt", - "NW_018654724.1": "chr18_KZ208922v1_fix", - "NW_018654725.1": "chrY_KZ208923v1_fix", - "NW_018654726.1": "chrY_KZ208924v1_fix", - "NW_019805487.1": "chr1_KZ559100v1_fix", - "NW_019805488.1": "chr3_KZ559101v1_alt", - "NW_019805489.1": "chr3_KZ559102v1_alt", - "NW_019805490.1": "chr3_KZ559103v1_alt", - "NW_019805491.1": "chr3_KZ559104v1_fix", - "NW_019805492.1": "chr3_KZ559105v1_alt", - "NW_019805493.1": "chr7_KZ559106v1_alt", - "NW_019805494.1": "chr8_KZ559107v1_alt", - "NW_019805497.1": "chr11_KZ559110v1_alt", - "NW_019805498.1": "chr11_KZ559111v1_alt", - "NW_019805499.1": "chr12_KZ559112v1_alt", - "NW_019805501.1": "chr17_KZ559114v1_alt", - "NW_019805502.1": "chr18_KZ559115v1_fix", - "NW_019805503.1": "chr18_KZ559116v1_alt", - "NW_021159988.1": "chr2_ML143342v1_fix", - "NW_021159989.1": "chr3_ML143343v1_alt", - "NW_021159990.1": "chr4_ML143344v1_fix", - "NW_021159991.1": "chr4_ML143345v1_fix", - "NW_021159992.1": "chr4_ML143346v1_fix", - "NW_021159993.1": "chr4_ML143347v1_fix", - "NW_021159994.1": "chr4_ML143348v1_fix", - "NW_021159995.1": "chr4_ML143349v1_fix", - "NW_021159997.1": "chr6_ML143351v1_fix", - "NW_021159999.1": "chr9_ML143353v1_fix", - "NW_021160000.1": "chr10_ML143354v1_fix", - "NW_021160001.1": "chr10_ML143355v1_fix", - "NW_021160002.1": "chr11_ML143356v1_fix", - "NW_021160003.1": "chr11_ML143357v1_fix", - "NW_021160006.1": "chr11_ML143360v1_fix", - "NW_021160009.1": "chr13_ML143363v1_fix", - "NW_021160010.1": "chr13_ML143364v1_fix", - "NW_021160012.1": "chr13_ML143366v1_fix", - "NW_021160013.1": "chr14_ML143367v1_fix", - "NW_021160014.1": "chr14_ML143368v1_alt", - "NW_021160015.1": "chr15_ML143369v1_fix", - "NW_021160016.1": "chr15_ML143370v1_fix", - "NW_021160018.1": "chr15_ML143372v1_fix", - "NW_021160020.1": "chr17_ML143374v1_fix", - "NW_021160021.1": "chr17_ML143375v1_fix", - "NW_021160023.1": "chr21_ML143377v1_fix", - "NW_021160024.1": "chr22_ML143378v1_fix", - "NW_021160025.1": "chr22_ML143379v1_fix", - "NW_021160026.1": "chr22_ML143380v1_fix", - "NW_021160028.1": "chrX_ML143382v1_fix", - "NW_021160029.1": "chrX_ML143383v1_fix", - "NW_021160030.1": "chrX_ML143384v1_fix", - "NW_021160031.1": "chrX_ML143385v1_fix" -} + 'NC_000001.11': 'chr1', + 'NC_000002.12': 'chr2', + 'NC_000003.12': 'chr3', + 'NC_000004.12': 'chr4', + 'NC_000005.10': 'chr5', + 'NC_000006.12': 'chr6', + 'NC_000007.14': 'chr7', + 'NC_000008.11': 'chr8', + 'NC_000009.12': 'chr9', + 'NC_000010.11': 'chr10', + 'NC_000011.10': 'chr11', + 'NC_000012.12': 'chr12', + 'NC_000013.11': 'chr13', + 'NC_000014.9': 'chr14', + 'NC_000015.10': 'chr15', + 'NC_000016.10': 'chr16', + 'NC_000017.11': 'chr17', + 'NC_000018.10': 'chr18', + 'NC_000019.10': 'chr19', + 'NC_000020.11': 'chr20', + 'NC_000021.9': 'chr21', + 'NC_000022.11': 'chr22', + 'NC_000023.11': 'chrX', + 'NC_000024.10': 'chrY', + 'NC_012920.1': 'chrM', + # UCSC hg38 Alt IDs + 'NW_009646194.1': 'chr1_KN196472v1_fix', + 'NW_011332687.1': 'chr1_KN538360v1_fix', + 'NW_011332688.1': 'chr1_KN538361v1_fix', + 'NW_018654708.1': 'chr1_KZ208906v1_fix', + 'NW_025791756.1': 'chr1_MU273333v1_fix', + 'NW_011332690.1': 'chr2_KN538363v1_fix', + 'NW_021159987.1': 'chr2_ML143341v1_fix', + 'NW_025791764.1': 'chr2_MU273341v1_fix', + 'NW_025791765.1': 'chr2_MU273342v1_fix', + 'NW_025791766.1': 'chr2_MU273343v1_fix', + 'NW_025791767.1': 'chr2_MU273344v1_fix', + 'NW_009646198.1': 'chr3_KN196476v1_fix', + 'NW_011332691.1': 'chr3_KN538364v1_fix', + 'NW_017363813.1': 'chr3_KV766192v1_fix', + 'NW_025791769.1': 'chr3_MU273346v1_fix', + 'NW_025791771.1': 'chr3_MU273348v1_fix', + 'NW_015495300.1': 'chr4_KQ983257v1_fix', + 'NW_016107298.1': 'chr5_KV575244v1_fix', + 'NW_021159996.1': 'chr5_ML143350v1_fix', + 'NW_025791777.1': 'chr5_MU273354v1_fix', + 'NW_025791778.1': 'chr5_MU273355v1_fix', + 'NW_017363815.1': 'chr6_KV766194v1_fix', + 'NW_018654713.1': 'chr6_KZ208911v1_fix', + 'NW_017852930.1': 'chr7_KV880765v1_fix', + 'NW_018654714.1': 'chr7_KZ208912v1_fix', + 'NW_021159998.1': 'chr7_ML143352v1_fix', + 'NW_018654716.1': 'chr8_KZ208914v1_fix', + 'NW_018654717.1': 'chr8_KZ208915v1_fix', + 'NW_025791784.1': 'chr8_MU273361v1_fix', + 'NW_025791786.1': 'chr8_MU273363v1_fix', + 'NW_025791788.1': 'chr9_MU273365v1_fix', + 'NW_013171807.1': 'chr10_KQ090021v1_fix', + 'NW_009646203.1': 'chr11_KN196481v1_fix', + 'NW_015148966.2': 'chr11_KQ759759v2_fix', + 'NW_019805495.1': 'chr11_KZ559108v1_fix', + 'NW_019805496.1': 'chr11_KZ559109v1_fix', + 'NW_021160004.1': 'chr11_ML143358v1_fix', + 'NW_021160005.1': 'chr11_ML143359v1_fix', + 'NW_025791792.1': 'chr11_MU273369v1_fix', + 'NW_011332696.1': 'chr12_KN538369v1_fix', + 'NW_018654718.1': 'chr12_KZ208916v1_fix', + 'NW_021160007.1': 'chr12_ML143361v1_fix', + 'NW_021160008.1': 'chr12_ML143362v1_fix', + 'NW_025791795.1': 'chr12_MU273372v1_fix', + 'NW_011332698.1': 'chr13_KN538371v1_fix', + 'NW_021160011.1': 'chr13_ML143365v1_fix', + 'NW_018654722.1': 'chr14_KZ208920v1_fix', + 'NW_011332701.1': 'chr15_KN538374v1_fix', + 'NW_021160017.1': 'chr15_ML143371v1_fix', + 'NW_025791797.1': 'chr15_MU273374v1_fix', + 'NW_017852933.1': 'chr16_KV880768v1_fix', + 'NW_019805500.1': 'chr16_KZ559113v1_fix', + 'NW_021160019.1': 'chr16_ML143373v1_fix', + 'NW_025791799.1': 'chr16_MU273376v1_fix', + 'NW_016107299.1': 'chr17_KV575245v1_fix', + 'NW_017363817.1': 'chr17_KV766196v1_fix', + 'NW_025791802.1': 'chr17_MU273379v1_fix', + 'NW_025791803.1': 'chr17_MU273380v1_fix', + 'NW_025791805.1': 'chr17_MU273382v1_fix', + 'NW_013171814.1': 'chr18_KQ090028v1_fix', + 'NW_009646206.1': 'chr19_KN196484v1_fix', + 'NW_014040929.1': 'chr19_KQ458386v1_fix', + 'NW_021160022.1': 'chr19_ML143376v1_fix', + 'NW_025791807.1': 'chr19_MU273384v1_fix', + 'NW_025791811.1': 'chr20_MU273388v1_fix', + 'NW_025791812.1': 'chr20_MU273389v1_fix', + 'NW_025791814.1': 'chr21_MU273391v1_fix', + 'NW_025791815.1': 'chr21_MU273392v1_fix', + 'NW_015148969.2': 'chr22_KQ759762v2_fix', + 'NW_021160027.1': 'chrX_ML143381v1_fix', + 'NW_025791817.1': 'chrX_MU273394v1_fix', + 'NW_025791821.1': 'chrY_MU273398v1_fix', + 'NW_003315934.1': 'chr10_GL383545v1_alt', + 'NW_003315935.1': 'chr10_GL383546v1_alt', + 'NT_187579.1': 'chr10_KI270824v1_alt', + 'NT_187580.1': 'chr10_KI270825v1_alt', + 'NW_003315936.1': 'chr11_GL383547v1_alt', + 'NW_003871073.1': 'chr11_JH159136v1_alt', + 'NW_003871074.1': 'chr11_JH159137v1_alt', + 'NT_187376.1': 'chr11_KI270721v1_random', + 'NT_187581.1': 'chr11_KI270826v1_alt', + 'NT_187582.1': 'chr11_KI270827v1_alt', + 'NT_187583.1': 'chr11_KI270829v1_alt', + 'NT_187584.1': 'chr11_KI270830v1_alt', + 'NT_187585.1': 'chr11_KI270831v1_alt', + 'NT_187586.1': 'chr11_KI270832v1_alt', + 'NT_187656.1': 'chr11_KI270902v1_alt', + 'NT_187657.1': 'chr11_KI270903v1_alt', + 'NT_187681.1': 'chr11_KI270927v1_alt', + 'NW_003315938.1': 'chr12_GL383549v1_alt', + 'NW_003315939.2': 'chr12_GL383550v2_alt', + 'NW_003315940.1': 'chr12_GL383551v1_alt', + 'NW_003315941.1': 'chr12_GL383552v1_alt', + 'NW_003315942.2': 'chr12_GL383553v2_alt', + 'NW_003571049.1': 'chr12_GL877875v1_alt', + 'NW_003571050.1': 'chr12_GL877876v1_alt', + 'NT_187589.1': 'chr12_KI270833v1_alt', + 'NT_187590.1': 'chr12_KI270834v1_alt', + 'NT_187587.1': 'chr12_KI270835v1_alt', + 'NT_187591.1': 'chr12_KI270836v1_alt', + 'NT_187588.1': 'chr12_KI270837v1_alt', + 'NT_187658.1': 'chr12_KI270904v1_alt', + 'NT_187592.1': 'chr13_KI270838v1_alt', + 'NT_187593.1': 'chr13_KI270839v1_alt', + 'NT_187594.1': 'chr13_KI270840v1_alt', + 'NT_187595.1': 'chr13_KI270841v1_alt', + 'NT_187596.1': 'chr13_KI270842v1_alt', + 'NT_187597.1': 'chr13_KI270843v1_alt', + 'NT_113796.3': 'chr14_GL000009v2_random', + 'NT_113888.1': 'chr14_GL000194v1_random', + 'NT_167219.1': 'chr14_GL000225v1_random', + 'NT_187377.1': 'chr14_KI270722v1_random', + 'NT_187378.1': 'chr14_KI270723v1_random', + 'NT_187379.1': 'chr14_KI270724v1_random', + 'NT_187380.1': 'chr14_KI270725v1_random', + 'NT_187381.1': 'chr14_KI270726v1_random', + 'NT_187598.1': 'chr14_KI270844v1_alt', + 'NT_187599.1': 'chr14_KI270845v1_alt', + 'NT_187600.1': 'chr14_KI270846v1_alt', + 'NT_187601.1': 'chr14_KI270847v1_alt', + 'NW_003315943.1': 'chr15_GL383554v1_alt', + 'NW_003315944.2': 'chr15_GL383555v2_alt', + 'NT_187382.1': 'chr15_KI270727v1_random', + 'NT_187603.1': 'chr15_KI270848v1_alt', + 'NT_187605.1': 'chr15_KI270849v1_alt', + 'NT_187606.1': 'chr15_KI270850v1_alt', + 'NT_187604.1': 'chr15_KI270851v1_alt', + 'NT_187602.1': 'chr15_KI270852v1_alt', + 'NT_187660.1': 'chr15_KI270905v1_alt', + 'NT_187659.1': 'chr15_KI270906v1_alt', + 'NW_003315945.1': 'chr16_GL383556v1_alt', + 'NW_003315946.1': 'chr16_GL383557v1_alt', + 'NT_187383.1': 'chr16_KI270728v1_random', + 'NT_187607.1': 'chr16_KI270853v1_alt', + 'NT_187610.1': 'chr16_KI270854v1_alt', + 'NT_187608.1': 'chr16_KI270855v1_alt', + 'NT_187609.1': 'chr16_KI270856v1_alt', + 'NT_113930.2': 'chr17_GL000205v2_random', + 'NT_167251.2': 'chr17_GL000258v2_alt', + 'NW_003315952.3': 'chr17_GL383563v3_alt', + 'NW_003315953.2': 'chr17_GL383564v2_alt', + 'NW_003315954.1': 'chr17_GL383565v1_alt', + 'NW_003315955.1': 'chr17_GL383566v1_alt', + 'NW_003871091.1': 'chr17_JH159146v1_alt', + 'NW_003871092.1': 'chr17_JH159147v1_alt', + 'NW_003871093.1': 'chr17_JH159148v1_alt', + 'NT_187384.1': 'chr17_KI270729v1_random', + 'NT_187385.1': 'chr17_KI270730v1_random', + 'NT_187614.1': 'chr17_KI270857v1_alt', + 'NT_187615.1': 'chr17_KI270858v1_alt', + 'NT_187616.1': 'chr17_KI270859v1_alt', + 'NT_187612.1': 'chr17_KI270860v1_alt', + 'NT_187611.1': 'chr17_KI270861v1_alt', + 'NT_187613.1': 'chr17_KI270862v1_alt', + 'NT_187662.1': 'chr17_KI270907v1_alt', + 'NT_187663.1': 'chr17_KI270908v1_alt', + 'NT_187661.1': 'chr17_KI270909v1_alt', + 'NT_187664.1': 'chr17_KI270910v1_alt', + 'NW_003315956.1': 'chr18_GL383567v1_alt', + 'NW_003315957.1': 'chr18_GL383568v1_alt', + 'NW_003315958.1': 'chr18_GL383569v1_alt', + 'NW_003315959.1': 'chr18_GL383570v1_alt', + 'NW_003315960.1': 'chr18_GL383571v1_alt', + 'NW_003315961.1': 'chr18_GL383572v1_alt', + 'NT_187617.1': 'chr18_KI270863v1_alt', + 'NT_187618.1': 'chr18_KI270864v1_alt', + 'NT_187666.1': 'chr18_KI270911v1_alt', + 'NT_187665.1': 'chr18_KI270912v1_alt', + 'NT_113949.2': 'chr19_GL000209v2_alt', + 'NW_003315962.1': 'chr19_GL383573v1_alt', + 'NW_003315963.1': 'chr19_GL383574v1_alt', + 'NW_003315964.2': 'chr19_GL383575v2_alt', + 'NW_003315965.1': 'chr19_GL383576v1_alt', + 'NW_003571054.1': 'chr19_GL949746v1_alt', + 'NW_003571055.2': 'chr19_GL949747v2_alt', + 'NW_003571056.2': 'chr19_GL949748v2_alt', + 'NW_003571057.2': 'chr19_GL949749v2_alt', + 'NW_003571058.2': 'chr19_GL949750v2_alt', + 'NW_003571059.2': 'chr19_GL949751v2_alt', + 'NW_003571060.1': 'chr19_GL949752v1_alt', + 'NW_003571061.2': 'chr19_GL949753v2_alt', + 'NT_187621.1': 'chr19_KI270865v1_alt', + 'NT_187619.1': 'chr19_KI270866v1_alt', + 'NT_187620.1': 'chr19_KI270867v1_alt', + 'NT_187622.1': 'chr19_KI270868v1_alt', + 'NT_187636.1': 'chr19_KI270882v1_alt', + 'NT_187637.1': 'chr19_KI270883v1_alt', + 'NT_187638.1': 'chr19_KI270884v1_alt', + 'NT_187639.1': 'chr19_KI270885v1_alt', + 'NT_187640.1': 'chr19_KI270886v1_alt', + 'NT_187641.1': 'chr19_KI270887v1_alt', + 'NT_187642.1': 'chr19_KI270888v1_alt', + 'NT_187643.1': 'chr19_KI270889v1_alt', + 'NT_187644.1': 'chr19_KI270890v1_alt', + 'NT_187645.1': 'chr19_KI270891v1_alt', + 'NT_187668.1': 'chr19_KI270914v1_alt', + 'NT_187669.1': 'chr19_KI270915v1_alt', + 'NT_187670.1': 'chr19_KI270916v1_alt', + 'NT_187671.1': 'chr19_KI270917v1_alt', + 'NT_187672.1': 'chr19_KI270918v1_alt', + 'NT_187673.1': 'chr19_KI270919v1_alt', + 'NT_187674.1': 'chr19_KI270920v1_alt', + 'NT_187675.1': 'chr19_KI270921v1_alt', + 'NT_187676.1': 'chr19_KI270922v1_alt', + 'NT_187677.1': 'chr19_KI270923v1_alt', + 'NT_187683.1': 'chr19_KI270929v1_alt', + 'NT_187684.1': 'chr19_KI270930v1_alt', + 'NT_187685.1': 'chr19_KI270931v1_alt', + 'NT_187686.1': 'chr19_KI270932v1_alt', + 'NT_187687.1': 'chr19_KI270933v1_alt', + 'NT_187693.1': 'chr19_KI270938v1_alt', + 'NW_003315905.1': 'chr1_GL383518v1_alt', + 'NW_003315906.1': 'chr1_GL383519v1_alt', + 'NW_003315907.2': 'chr1_GL383520v2_alt', + 'NT_187361.1': 'chr1_KI270706v1_random', + 'NT_187362.1': 'chr1_KI270707v1_random', + 'NT_187363.1': 'chr1_KI270708v1_random', + 'NT_187364.1': 'chr1_KI270709v1_random', + 'NT_187365.1': 'chr1_KI270710v1_random', + 'NT_187366.1': 'chr1_KI270711v1_random', + 'NT_187367.1': 'chr1_KI270712v1_random', + 'NT_187368.1': 'chr1_KI270713v1_random', + 'NT_187369.1': 'chr1_KI270714v1_random', + 'NT_187516.1': 'chr1_KI270759v1_alt', + 'NT_187514.1': 'chr1_KI270760v1_alt', + 'NT_187518.1': 'chr1_KI270761v1_alt', + 'NT_187515.1': 'chr1_KI270762v1_alt', + 'NT_187519.1': 'chr1_KI270763v1_alt', + 'NT_187521.1': 'chr1_KI270764v1_alt', + 'NT_187520.1': 'chr1_KI270765v1_alt', + 'NT_187517.1': 'chr1_KI270766v1_alt', + 'NT_187646.1': 'chr1_KI270892v1_alt', + 'NW_003315966.2': 'chr20_GL383577v2_alt', + 'NT_187623.1': 'chr20_KI270869v1_alt', + 'NT_187624.1': 'chr20_KI270870v1_alt', + 'NT_187625.1': 'chr20_KI270871v1_alt', + 'NW_003315967.2': 'chr21_GL383578v2_alt', + 'NW_003315968.2': 'chr21_GL383579v2_alt', + 'NW_003315969.2': 'chr21_GL383580v2_alt', + 'NW_003315970.2': 'chr21_GL383581v2_alt', + 'NT_187626.1': 'chr21_KI270872v1_alt', + 'NT_187627.1': 'chr21_KI270873v1_alt', + 'NT_187628.1': 'chr21_KI270874v1_alt', + 'NW_003315971.2': 'chr22_GL383582v2_alt', + 'NW_003315972.2': 'chr22_GL383583v2_alt', + 'NW_004504305.1': 'chr22_KB663609v1_alt', + 'NT_187386.1': 'chr22_KI270731v1_random', + 'NT_187387.1': 'chr22_KI270732v1_random', + 'NT_187388.1': 'chr22_KI270733v1_random', + 'NT_187389.1': 'chr22_KI270734v1_random', + 'NT_187390.1': 'chr22_KI270735v1_random', + 'NT_187391.1': 'chr22_KI270736v1_random', + 'NT_187392.1': 'chr22_KI270737v1_random', + 'NT_187393.1': 'chr22_KI270738v1_random', + 'NT_187394.1': 'chr22_KI270739v1_random', + 'NT_187629.1': 'chr22_KI270875v1_alt', + 'NT_187630.1': 'chr22_KI270876v1_alt', + 'NT_187631.1': 'chr22_KI270877v1_alt', + 'NT_187632.1': 'chr22_KI270878v1_alt', + 'NT_187633.1': 'chr22_KI270879v1_alt', + 'NT_187682.1': 'chr22_KI270928v1_alt', + 'NW_003315908.1': 'chr2_GL383521v1_alt', + 'NW_003315909.1': 'chr2_GL383522v1_alt', + 'NW_003571033.2': 'chr2_GL582966v2_alt', + 'NT_187370.1': 'chr2_KI270715v1_random', + 'NT_187371.1': 'chr2_KI270716v1_random', + 'NT_187523.1': 'chr2_KI270767v1_alt', + 'NT_187528.1': 'chr2_KI270768v1_alt', + 'NT_187522.1': 'chr2_KI270769v1_alt', + 'NT_187525.1': 'chr2_KI270770v1_alt', + 'NT_187530.1': 'chr2_KI270771v1_alt', + 'NT_187524.1': 'chr2_KI270772v1_alt', + 'NT_187526.1': 'chr2_KI270773v1_alt', + 'NT_187529.1': 'chr2_KI270774v1_alt', + 'NT_187531.1': 'chr2_KI270775v1_alt', + 'NT_187527.1': 'chr2_KI270776v1_alt', + 'NT_187647.1': 'chr2_KI270893v1_alt', + 'NT_187648.1': 'chr2_KI270894v1_alt', + 'NT_167215.1': 'chr3_GL000221v1_random', + 'NW_003315913.1': 'chr3_GL383526v1_alt', + 'NW_003871060.2': 'chr3_JH636055v2_alt', + 'NT_187533.1': 'chr3_KI270777v1_alt', + 'NT_187536.1': 'chr3_KI270778v1_alt', + 'NT_187532.1': 'chr3_KI270779v1_alt', + 'NT_187537.1': 'chr3_KI270780v1_alt', + 'NT_187538.1': 'chr3_KI270781v1_alt', + 'NT_187534.1': 'chr3_KI270782v1_alt', + 'NT_187535.1': 'chr3_KI270783v1_alt', + 'NT_187539.1': 'chr3_KI270784v1_alt', + 'NT_187649.1': 'chr3_KI270895v1_alt', + 'NT_187678.1': 'chr3_KI270924v1_alt', + 'NT_187688.1': 'chr3_KI270934v1_alt', + 'NT_187689.1': 'chr3_KI270935v1_alt', + 'NT_187690.1': 'chr3_KI270936v1_alt', + 'NT_187691.1': 'chr3_KI270937v1_alt', + 'NT_113793.3': 'chr4_GL000008v2_random', + 'NT_167250.2': 'chr4_GL000257v2_alt', + 'NW_003315914.1': 'chr4_GL383527v1_alt', + 'NW_003315915.1': 'chr4_GL383528v1_alt', + 'NT_187542.1': 'chr4_KI270785v1_alt', + 'NT_187543.1': 'chr4_KI270786v1_alt', + 'NT_187541.1': 'chr4_KI270787v1_alt', + 'NT_187544.1': 'chr4_KI270788v1_alt', + 'NT_187545.1': 'chr4_KI270789v1_alt', + 'NT_187540.1': 'chr4_KI270790v1_alt', + 'NT_187650.1': 'chr4_KI270896v1_alt', + 'NT_187679.1': 'chr4_KI270925v1_alt', + 'NT_113948.1': 'chr5_GL000208v1_random', + 'NW_003315917.2': 'chr5_GL339449v2_alt', + 'NW_003315918.1': 'chr5_GL383530v1_alt', + 'NW_003315919.1': 'chr5_GL383531v1_alt', + 'NW_003315920.1': 'chr5_GL383532v1_alt', + 'NW_003571036.1': 'chr5_GL949742v1_alt', + 'NT_187547.1': 'chr5_KI270791v1_alt', + 'NT_187548.1': 'chr5_KI270792v1_alt', + 'NT_187550.1': 'chr5_KI270793v1_alt', + 'NT_187551.1': 'chr5_KI270794v1_alt', + 'NT_187546.1': 'chr5_KI270795v1_alt', + 'NT_187549.1': 'chr5_KI270796v1_alt', + 'NT_187651.1': 'chr5_KI270897v1_alt', + 'NT_187652.1': 'chr5_KI270898v1_alt', + 'NT_167244.2': 'chr6_GL000250v2_alt', + 'NT_113891.3': 'chr6_GL000251v2_alt', + 'NT_167245.2': 'chr6_GL000252v2_alt', + 'NT_167246.2': 'chr6_GL000253v2_alt', + 'NT_167247.2': 'chr6_GL000254v2_alt', + 'NT_167248.2': 'chr6_GL000255v2_alt', + 'NT_167249.2': 'chr6_GL000256v2_alt', + 'NW_003315921.1': 'chr6_GL383533v1_alt', + 'NW_004166862.2': 'chr6_KB021644v2_alt', + 'NT_187692.1': 'chr6_KI270758v1_alt', + 'NT_187552.1': 'chr6_KI270797v1_alt', + 'NT_187553.1': 'chr6_KI270798v1_alt', + 'NT_187554.1': 'chr6_KI270799v1_alt', + 'NT_187555.1': 'chr6_KI270800v1_alt', + 'NT_187556.1': 'chr6_KI270801v1_alt', + 'NT_187557.1': 'chr6_KI270802v1_alt', + 'NW_003315922.2': 'chr7_GL383534v2_alt', + 'NT_187562.1': 'chr7_KI270803v1_alt', + 'NT_187558.1': 'chr7_KI270804v1_alt', + 'NT_187560.1': 'chr7_KI270805v1_alt', + 'NT_187559.1': 'chr7_KI270806v1_alt', + 'NT_187563.1': 'chr7_KI270807v1_alt', + 'NT_187564.1': 'chr7_KI270808v1_alt', + 'NT_187561.1': 'chr7_KI270809v1_alt', + 'NT_187653.1': 'chr7_KI270899v1_alt', + 'NT_187567.1': 'chr8_KI270810v1_alt', + 'NT_187565.1': 'chr8_KI270811v1_alt', + 'NT_187568.1': 'chr8_KI270812v1_alt', + 'NT_187570.1': 'chr8_KI270813v1_alt', + 'NT_187566.1': 'chr8_KI270814v1_alt', + 'NT_187569.1': 'chr8_KI270815v1_alt', + 'NT_187571.1': 'chr8_KI270816v1_alt', + 'NT_187573.1': 'chr8_KI270817v1_alt', + 'NT_187572.1': 'chr8_KI270818v1_alt', + 'NT_187574.1': 'chr8_KI270819v1_alt', + 'NT_187575.1': 'chr8_KI270820v1_alt', + 'NT_187576.1': 'chr8_KI270821v1_alt', + 'NT_187577.1': 'chr8_KI270822v1_alt', + 'NT_187654.1': 'chr8_KI270900v1_alt', + 'NT_187655.1': 'chr8_KI270901v1_alt', + 'NT_187680.1': 'chr8_KI270926v1_alt', + 'NW_003315928.1': 'chr9_GL383539v1_alt', + 'NW_003315929.1': 'chr9_GL383540v1_alt', + 'NW_003315930.1': 'chr9_GL383541v1_alt', + 'NW_003315931.1': 'chr9_GL383542v1_alt', + 'NT_187372.1': 'chr9_KI270717v1_random', + 'NT_187373.1': 'chr9_KI270718v1_random', + 'NT_187374.1': 'chr9_KI270719v1_random', + 'NT_187375.1': 'chr9_KI270720v1_random', + 'NT_187578.1': 'chr9_KI270823v1_alt', + 'NT_113901.1': 'chrUn_GL000195v1', + 'NT_167208.1': 'chrUn_GL000213v1', + 'NT_167209.1': 'chrUn_GL000214v1', + 'NT_167211.2': 'chrUn_GL000216v2', + 'NT_113889.1': 'chrUn_GL000218v1', + 'NT_167213.1': 'chrUn_GL000219v1', + 'NT_167214.1': 'chrUn_GL000220v1', + 'NT_167218.1': 'chrUn_GL000224v1', + 'NT_167220.1': 'chrUn_GL000226v1', + 'NT_187396.1': 'chrUn_KI270302v1', + 'NT_187398.1': 'chrUn_KI270303v1', + 'NT_187397.1': 'chrUn_KI270304v1', + 'NT_187399.1': 'chrUn_KI270305v1', + 'NT_187402.1': 'chrUn_KI270310v1', + 'NT_187406.1': 'chrUn_KI270311v1', + 'NT_187405.1': 'chrUn_KI270312v1', + 'NT_187404.1': 'chrUn_KI270315v1', + 'NT_187403.1': 'chrUn_KI270316v1', + 'NT_187407.1': 'chrUn_KI270317v1', + 'NT_187401.1': 'chrUn_KI270320v1', + 'NT_187400.1': 'chrUn_KI270322v1', + 'NT_187459.1': 'chrUn_KI270329v1', + 'NT_187458.1': 'chrUn_KI270330v1', + 'NT_187461.1': 'chrUn_KI270333v1', + 'NT_187460.1': 'chrUn_KI270334v1', + 'NT_187462.1': 'chrUn_KI270335v1', + 'NT_187465.1': 'chrUn_KI270336v1', + 'NT_187466.1': 'chrUn_KI270337v1', + 'NT_187463.1': 'chrUn_KI270338v1', + 'NT_187464.1': 'chrUn_KI270340v1', + 'NT_187469.1': 'chrUn_KI270362v1', + 'NT_187467.1': 'chrUn_KI270363v1', + 'NT_187468.1': 'chrUn_KI270364v1', + 'NT_187470.1': 'chrUn_KI270366v1', + 'NT_187494.1': 'chrUn_KI270371v1', + 'NT_187491.1': 'chrUn_KI270372v1', + 'NT_187492.1': 'chrUn_KI270373v1', + 'NT_187490.1': 'chrUn_KI270374v1', + 'NT_187493.1': 'chrUn_KI270375v1', + 'NT_187489.1': 'chrUn_KI270376v1', + 'NT_187471.1': 'chrUn_KI270378v1', + 'NT_187472.1': 'chrUn_KI270379v1', + 'NT_187486.1': 'chrUn_KI270381v1', + 'NT_187488.1': 'chrUn_KI270382v1', + 'NT_187482.1': 'chrUn_KI270383v1', + 'NT_187484.1': 'chrUn_KI270384v1', + 'NT_187487.1': 'chrUn_KI270385v1', + 'NT_187480.1': 'chrUn_KI270386v1', + 'NT_187475.1': 'chrUn_KI270387v1', + 'NT_187478.1': 'chrUn_KI270388v1', + 'NT_187473.1': 'chrUn_KI270389v1', + 'NT_187474.1': 'chrUn_KI270390v1', + 'NT_187481.1': 'chrUn_KI270391v1', + 'NT_187485.1': 'chrUn_KI270392v1', + 'NT_187483.1': 'chrUn_KI270393v1', + 'NT_187479.1': 'chrUn_KI270394v1', + 'NT_187476.1': 'chrUn_KI270395v1', + 'NT_187477.1': 'chrUn_KI270396v1', + 'NT_187409.1': 'chrUn_KI270411v1', + 'NT_187408.1': 'chrUn_KI270412v1', + 'NT_187410.1': 'chrUn_KI270414v1', + 'NT_187415.1': 'chrUn_KI270417v1', + 'NT_187412.1': 'chrUn_KI270418v1', + 'NT_187411.1': 'chrUn_KI270419v1', + 'NT_187413.1': 'chrUn_KI270420v1', + 'NT_187416.1': 'chrUn_KI270422v1', + 'NT_187417.1': 'chrUn_KI270423v1', + 'NT_187414.1': 'chrUn_KI270424v1', + 'NT_187418.1': 'chrUn_KI270425v1', + 'NT_187419.1': 'chrUn_KI270429v1', + 'NT_187424.1': 'chrUn_KI270435v1', + 'NT_187425.1': 'chrUn_KI270438v1', + 'NT_187420.1': 'chrUn_KI270442v1', + 'NT_187495.1': 'chrUn_KI270448v1', + 'NT_187422.1': 'chrUn_KI270465v1', + 'NT_187421.1': 'chrUn_KI270466v1', + 'NT_187423.1': 'chrUn_KI270467v1', + 'NT_187426.1': 'chrUn_KI270468v1', + 'NT_187437.1': 'chrUn_KI270507v1', + 'NT_187430.1': 'chrUn_KI270508v1', + 'NT_187428.1': 'chrUn_KI270509v1', + 'NT_187427.1': 'chrUn_KI270510v1', + 'NT_187435.1': 'chrUn_KI270511v1', + 'NT_187432.1': 'chrUn_KI270512v1', + 'NT_187436.1': 'chrUn_KI270515v1', + 'NT_187431.1': 'chrUn_KI270516v1', + 'NT_187438.1': 'chrUn_KI270517v1', + 'NT_187429.1': 'chrUn_KI270518v1', + 'NT_187433.1': 'chrUn_KI270519v1', + 'NT_187496.1': 'chrUn_KI270521v1', + 'NT_187434.1': 'chrUn_KI270522v1', + 'NT_187440.1': 'chrUn_KI270528v1', + 'NT_187439.1': 'chrUn_KI270529v1', + 'NT_187441.1': 'chrUn_KI270530v1', + 'NT_187443.1': 'chrUn_KI270538v1', + 'NT_187442.1': 'chrUn_KI270539v1', + 'NT_187444.1': 'chrUn_KI270544v1', + 'NT_187445.1': 'chrUn_KI270548v1', + 'NT_187450.1': 'chrUn_KI270579v1', + 'NT_187448.1': 'chrUn_KI270580v1', + 'NT_187449.1': 'chrUn_KI270581v1', + 'NT_187454.1': 'chrUn_KI270582v1', + 'NT_187446.1': 'chrUn_KI270583v1', + 'NT_187453.1': 'chrUn_KI270584v1', + 'NT_187447.1': 'chrUn_KI270587v1', + 'NT_187455.1': 'chrUn_KI270588v1', + 'NT_187451.1': 'chrUn_KI270589v1', + 'NT_187452.1': 'chrUn_KI270590v1', + 'NT_187457.1': 'chrUn_KI270591v1', + 'NT_187456.1': 'chrUn_KI270593v1', + 'NT_187497.1': 'chrUn_KI270741v1', + 'NT_187513.1': 'chrUn_KI270742v1', + 'NT_187498.1': 'chrUn_KI270743v1', + 'NT_187499.1': 'chrUn_KI270744v1', + 'NT_187500.1': 'chrUn_KI270745v1', + 'NT_187501.1': 'chrUn_KI270746v1', + 'NT_187502.1': 'chrUn_KI270747v1', + 'NT_187503.1': 'chrUn_KI270748v1', + 'NT_187504.1': 'chrUn_KI270749v1', + 'NT_187505.1': 'chrUn_KI270750v1', + 'NT_187506.1': 'chrUn_KI270751v1', + 'NT_187507.1': 'chrUn_KI270752v1', + 'NT_187508.1': 'chrUn_KI270753v1', + 'NT_187509.1': 'chrUn_KI270754v1', + 'NT_187510.1': 'chrUn_KI270755v1', + 'NT_187511.1': 'chrUn_KI270756v1', + 'NT_187512.1': 'chrUn_KI270757v1', + 'NT_187634.1': 'chrX_KI270880v1_alt', + 'NT_187635.1': 'chrX_KI270881v1_alt', + 'NT_187667.1': 'chrX_KI270913v1_alt', + 'NT_187395.1': 'chrY_KI270740v1_random', + 'NW_011332689.1': 'chr2_KN538362v1_fix', + 'NW_011332692.1': 'chr10_KN538365v1_fix', + 'NW_011332693.1': 'chr10_KN538366v1_fix', + 'NW_011332694.1': 'chr10_KN538367v1_fix', + 'NW_011332695.1': 'chr11_KN538368v1_alt', + 'NW_011332697.1': 'chr12_KN538370v1_fix', + 'NW_011332699.1': 'chr13_KN538372v1_fix', + 'NW_011332700.1': 'chr13_KN538373v1_fix', + 'NW_012132914.1': 'chr1_KQ031383v1_fix', + 'NW_012132915.1': 'chr2_KQ031384v1_fix', + 'NW_012132916.1': 'chr3_KQ031385v1_fix', + 'NW_012132917.1': 'chr3_KQ031386v1_fix', + 'NW_012132918.1': 'chr6_KQ031387v1_fix', + 'NW_012132919.1': 'chr7_KQ031388v1_fix', + 'NW_012132920.1': 'chr15_KQ031389v1_alt', + 'NW_012132921.1': 'chr16_KQ031390v1_alt', + 'NW_013171799.1': 'chr4_KQ090013v1_alt', + 'NW_013171800.1': 'chr4_KQ090014v1_alt', + 'NW_013171801.1': 'chr4_KQ090015v1_alt', + 'NW_013171802.1': 'chr6_KQ090016v1_fix', + 'NW_013171803.1': 'chr6_KQ090017v1_alt', + 'NW_013171804.1': 'chr9_KQ090018v1_alt', + 'NW_013171805.1': 'chr9_KQ090019v1_alt', + 'NW_013171806.1': 'chr10_KQ090020v1_alt', + 'NW_013171808.1': 'chr11_KQ090022v1_fix', + 'NW_013171809.1': 'chr12_KQ090023v1_alt', + 'NW_013171810.1': 'chr13_KQ090024v1_alt', + 'NW_013171811.1': 'chr13_KQ090025v1_alt', + 'NW_013171812.1': 'chr16_KQ090026v1_alt', + 'NW_013171813.1': 'chr16_KQ090027v1_alt', + 'NW_014040925.1': 'chr1_KQ458382v1_alt', + 'NW_014040926.1': 'chr1_KQ458383v1_alt', + 'NW_014040927.1': 'chr1_KQ458384v1_alt', + 'NW_014040928.1': 'chr18_KQ458385v1_alt', + 'NW_014040930.1': 'chr22_KQ458387v1_alt', + 'NW_014040931.1': 'chr22_KQ458388v1_alt', + 'NW_015148966.1': 'chr11_KQ759759v1_fix', + 'NW_015148967.1': 'chr12_KQ759760v1_fix', + 'NW_015148968.1': 'chr22_KQ759761v1_alt', + 'NW_015148969.1': 'chr22_KQ759762v1_fix', + 'NW_015495298.1': 'chr1_KQ983255v1_alt', + 'NW_015495299.1': 'chr2_KQ983256v1_alt', + 'NW_015495301.1': 'chr4_KQ983258v1_alt', + 'NW_016107297.1': 'chr5_KV575243v1_alt', + 'NW_016107300.1': 'chr19_KV575246v1_alt', + 'NW_016107301.1': 'chr19_KV575247v1_alt', + 'NW_016107302.1': 'chr19_KV575248v1_alt', + 'NW_016107303.1': 'chr19_KV575249v1_alt', + 'NW_016107304.1': 'chr19_KV575250v1_alt', + 'NW_016107305.1': 'chr19_KV575251v1_alt', + 'NW_016107306.1': 'chr19_KV575252v1_alt', + 'NW_016107307.1': 'chr19_KV575253v1_alt', + 'NW_016107308.1': 'chr19_KV575254v1_alt', + 'NW_016107309.1': 'chr19_KV575255v1_alt', + 'NW_016107310.1': 'chr19_KV575256v1_alt', + 'NW_016107311.1': 'chr19_KV575257v1_alt', + 'NW_016107312.1': 'chr19_KV575258v1_alt', + 'NW_016107313.1': 'chr19_KV575259v1_alt', + 'NW_016107314.1': 'chr19_KV575260v1_alt', + 'NW_017363814.1': 'chr4_KV766193v1_alt', + 'NW_017363816.1': 'chr11_KV766195v1_fix', + 'NW_017363818.1': 'chr17_KV766197v1_alt', + 'NW_017363819.1': 'chr17_KV766198v1_alt', + 'NW_017363820.1': 'chrX_KV766199v1_alt', + 'NW_017852928.1': 'chr1_KV880763v1_alt', + 'NW_017852929.1': 'chr7_KV880764v1_fix', + 'NW_017852931.1': 'chr8_KV880766v1_fix', + 'NW_017852932.1': 'chr8_KV880767v1_fix', + 'NW_018654706.1': 'chr1_KZ208904v1_alt', + 'NW_018654707.1': 'chr1_KZ208905v1_alt', + 'NW_018654709.1': 'chr2_KZ208907v1_alt', + 'NW_018654710.1': 'chr2_KZ208908v1_alt', + 'NW_018654711.1': 'chr3_KZ208909v1_alt', + 'NW_018654712.1': 'chr5_KZ208910v1_alt', + 'NW_018654715.1': 'chr7_KZ208913v1_alt', + 'NW_018654719.1': 'chr12_KZ208917v1_fix', + 'NW_018654720.1': 'chr12_KZ208918v1_alt', + 'NW_018654721.1': 'chr14_KZ208919v1_alt', + 'NW_018654723.1': 'chr16_KZ208921v1_alt', + 'NW_018654724.1': 'chr18_KZ208922v1_fix', + 'NW_018654725.1': 'chrY_KZ208923v1_fix', + 'NW_018654726.1': 'chrY_KZ208924v1_fix', + 'NW_019805487.1': 'chr1_KZ559100v1_fix', + 'NW_019805488.1': 'chr3_KZ559101v1_alt', + 'NW_019805489.1': 'chr3_KZ559102v1_alt', + 'NW_019805490.1': 'chr3_KZ559103v1_alt', + 'NW_019805491.1': 'chr3_KZ559104v1_fix', + 'NW_019805492.1': 'chr3_KZ559105v1_alt', + 'NW_019805493.1': 'chr7_KZ559106v1_alt', + 'NW_019805494.1': 'chr8_KZ559107v1_alt', + 'NW_019805497.1': 'chr11_KZ559110v1_alt', + 'NW_019805498.1': 'chr11_KZ559111v1_alt', + 'NW_019805499.1': 'chr12_KZ559112v1_alt', + 'NW_019805501.1': 'chr17_KZ559114v1_alt', + 'NW_019805502.1': 'chr18_KZ559115v1_fix', + 'NW_019805503.1': 'chr18_KZ559116v1_alt', + 'NW_021159988.1': 'chr2_ML143342v1_fix', + 'NW_021159989.1': 'chr3_ML143343v1_alt', + 'NW_021159990.1': 'chr4_ML143344v1_fix', + 'NW_021159991.1': 'chr4_ML143345v1_fix', + 'NW_021159992.1': 'chr4_ML143346v1_fix', + 'NW_021159993.1': 'chr4_ML143347v1_fix', + 'NW_021159994.1': 'chr4_ML143348v1_fix', + 'NW_021159995.1': 'chr4_ML143349v1_fix', + 'NW_021159997.1': 'chr6_ML143351v1_fix', + 'NW_021159999.1': 'chr9_ML143353v1_fix', + 'NW_021160000.1': 'chr10_ML143354v1_fix', + 'NW_021160001.1': 'chr10_ML143355v1_fix', + 'NW_021160002.1': 'chr11_ML143356v1_fix', + 'NW_021160003.1': 'chr11_ML143357v1_fix', + 'NW_021160006.1': 'chr11_ML143360v1_fix', + 'NW_021160009.1': 'chr13_ML143363v1_fix', + 'NW_021160010.1': 'chr13_ML143364v1_fix', + 'NW_021160012.1': 'chr13_ML143366v1_fix', + 'NW_021160013.1': 'chr14_ML143367v1_fix', + 'NW_021160014.1': 'chr14_ML143368v1_alt', + 'NW_021160015.1': 'chr15_ML143369v1_fix', + 'NW_021160016.1': 'chr15_ML143370v1_fix', + 'NW_021160018.1': 'chr15_ML143372v1_fix', + 'NW_021160020.1': 'chr17_ML143374v1_fix', + 'NW_021160021.1': 'chr17_ML143375v1_fix', + 'NW_021160023.1': 'chr21_ML143377v1_fix', + 'NW_021160024.1': 'chr22_ML143378v1_fix', + 'NW_021160025.1': 'chr22_ML143379v1_fix', + 'NW_021160026.1': 'chr22_ML143380v1_fix', + 'NW_021160028.1': 'chrX_ML143382v1_fix', + 'NW_021160029.1': 'chrX_ML143383v1_fix', + 'NW_021160030.1': 'chrX_ML143384v1_fix', + 'NW_021160031.1': 'chrX_ML143385v1_fix'} ############################################# _refseq_to_chr_num_grch37 = { - "NC_000001.10": "1", - "NC_000002.11": "2", - "NC_000003.11": "3", - "NC_000004.11": "4", - "NC_000005.9": "5", - "NC_000006.11": "6", - "NC_000007.13": "7", - "NC_000008.10": "8", - "NC_000009.11": "9", - "NC_000010.10": "10", - "NC_000011.9": "11", - "NC_000012.11": "12", - "NC_000013.10": "13", - "NC_000014.8": "14", - "NC_000015.9": "15", - "NC_000016.9": "16", - "NC_000017.10": "17", - "NC_000018.9": "18", - "NC_000019.9": "19", - "NC_000020.10": "20", - "NC_000021.8": "21", - "NC_000022.10": "22", - "NC_000023.10": "X", - "NC_000024.9": "Y", - "NC_012920.1": "M", - # GRC GRCh37 alts - 'NW_004070864.2': 'HG1472_PATCH', - 'NW_003571030.1': 'HG989_PATCH', - 'NW_003871056.3': 'HG1292_PATCH', - 'NW_003871055.3': 'HG1287_PATCH', - 'NW_003315905.1': 'HSCHR1_1_CTG31', - 'NW_003315906.1': 'HSCHR1_2_CTG31', - 'NW_003315907.1': 'HSCHR1_3_CTG31', - 'NW_004070863.1': 'HG1471_PATCH', - 'NW_003871057.1': 'HG1293_PATCH', - 'NW_004070865.1': 'HG1473_PATCH', - 'NW_003315903.1': 'HG999_1_PATCH', - 'NW_003315904.1': 'HG999_2_PATCH', - 'NW_003315908.1': 'HSCHR2_1_CTG1', - 'NW_004504299.1': 'HG953_PATCH', - 'NW_003571032.1': 'HG686_PATCH', - 'NW_003571033.2': 'HSCHR2_2_CTG12', - 'NW_003315909.1': 'HSCHR2_1_CTG12', - 'NW_003571031.1': 'HG1007_PATCH', - 'NW_003871060.1': 'HSCHR3_1_CTG1', - 'NW_003871059.1': 'HG325_PATCH', - 'NW_003315910.1': 'HG186_PATCH', - 'NW_004775426.1': 'HG957_PATCH', - 'NW_003315911.1': 'HG280_PATCH', - 'NW_003871058.1': 'HG1091_PATCH', - 'NW_003315912.1': 'HG991_PATCH', - 'NW_003315913.1': 'HSCHR3_1_CTG2_1', - 'NW_004775427.1': 'HG174_HG254_PATCH', - 'NW_003315915.1': 'HSCHR4_1_CTG6', - 'NW_003315916.1': 'HSCHR4_2_CTG9', - 'NW_003571035.1': 'HG706_PATCH', - 'NW_003315914.1': 'HSCHR4_1_CTG12', - 'NW_003571034.1': 'HG1032_PATCH', - 'NW_003315920.1': 'HSCHR5_2_CTG1', - 'NW_003571036.1': 'HSCHR5_3_CTG1', - 'NW_003315917.2': 'HSCHR5_1_CTG1', - 'NW_003315918.1': 'HSCHR5_1_CTG2', - 'NW_003871061.1': 'HG1063_PATCH', - 'NW_004775428.1': 'HG1082_HG167_PATCH', - 'NW_003315919.1': 'HSCHR5_1_CTG5', - 'NW_004070866.1': 'HG27_PATCH', - 'NW_003871063.1': 'HG1322_PATCH', - 'NW_003315921.1': 'HSCHR6_1_CTG5', - 'NW_004504300.1': 'HG357_PATCH', - 'NW_003871062.1': 'HG1304_PATCH', - 'NW_004775429.1': 'HG193_PATCH', - 'NW_004166862.1': 'HSCHR6_2_CTG5', - 'NW_003571039.1': 'HG736_PATCH', - 'NW_003571038.1': 'HG14_PATCH', - 'NW_004775430.1': 'HG444_PATCH', - 'NW_003871064.1': 'HG1257_PATCH', - 'NW_003571041.1': 'HG946_PATCH', - 'NW_003571037.1': 'HG115_PATCH', - 'NW_003871065.1': 'HG1308_PATCH', - 'NW_003315922.2': 'HSCHR7_1_CTG6', - 'NW_003571040.1': 'HG7_PATCH', - 'NW_003571042.1': 'HG19_PATCH', - 'NW_004775431.1': 'HG1699_PATCH', - 'NW_003871066.2': 'HG418_PATCH', - 'NW_003315923.1': 'HG104_HG975_PATCH', - 'NW_003315924.1': 'HG243_PATCH', - 'NW_003315928.1': 'HSCHR9_1_CTG1', - 'NW_003871067.1': 'HG962_PATCH', - 'NW_003315929.1': 'HSCHR9_1_CTG35', - 'NW_003315930.1': 'HSCHR9_2_CTG35', - 'NW_003315931.1': 'HSCHR9_3_CTG35', - 'NW_004504301.1': 'HG50_PATCH', - 'NW_004070869.1': 'HG1502_PATCH', - 'NW_003315925.1': 'HG79_PATCH', - 'NW_004070867.1': 'HG1500_PATCH', - 'NW_004070868.1': 'HG1501_PATCH', - 'NW_003315926.1': 'HG998_1_PATCH', - 'NW_003315927.1': 'HG998_2_PATCH', - 'NW_003571043.1': 'HG905_PATCH', - 'NW_003871071.1': 'HG871_PATCH', - 'NW_003315932.1': 'HG544_PATCH', - 'NW_003315934.1': 'HSCHR10_1_CTG2', - 'NW_003315935.1': 'HSCHR10_1_CTG5', - 'NW_003871068.1': 'HG1211_PATCH', - 'NW_004504302.1': 'HG1074_PATCH', - 'NW_003871070.1': 'HG339_PATCH', - 'NW_004775432.1': 'HG979_PATCH', - 'NW_003871069.1': 'HG311_PATCH', - 'NW_003315933.1': 'HG995_PATCH', - 'NW_004070870.1': 'HG1479_PATCH', - 'NW_003871075.1': 'HG256_PATCH', - 'NW_003871082.1': 'HG873_PATCH', - 'NW_003315936.1': 'HSCHR11_1_CTG1_1', - 'NW_003571045.1': 'HG281_PATCH', - 'NW_003871073.1': 'HG142_HG150_NOVEL_TEST', - 'NW_003871074.1': 'HG151_NOVEL_TEST', - 'NW_003571046.1': 'HG536_PATCH', - 'NW_004070871.1': 'HG865_PATCH', - 'NW_003871081.1': 'HG414_PATCH', - 'NW_003871079.1': 'HG348_PATCH', - 'NW_003871077.1': 'HG305_PATCH', - 'NW_003871080.1': 'HG388_HG400_PATCH', - 'NW_003871078.1': 'HG306_PATCH', - 'NW_003871072.2': 'HG122_PATCH', - 'NW_003871076.1': 'HG299_PATCH', - 'NW_003571048.1': 'HG858_PATCH', - 'NW_003571049.1': 'HSCHR12_1_CTG1', - 'NW_003871083.2': 'HG344_PATCH', - 'NW_003571047.1': 'HG1133_PATCH', - 'NW_003571050.1': 'HSCHR12_2_CTG2', - 'NW_003315938.1': 'HSCHR12_1_CTG2', - 'NW_003315939.1': 'HSCHR12_1_CTG2_1', - 'NW_003315941.1': 'HSCHR12_2_CTG2_1', - 'NW_003315942.2': 'HSCHR12_3_CTG2_1', - 'NW_004504303.2': 'HG1595_PATCH', - 'NW_003315940.1': 'HSCHR12_1_CTG5', - 'NW_003315937.1': 'HG996_PATCH', - 'NW_003571051.1': 'HG531_PATCH', - 'NW_004166863.1': 'HG1592_PATCH', - 'NW_003315943.1': 'HSCHR15_1_CTG4', - 'NW_003315944.1': 'HSCHR15_1_CTG8', - 'NW_003871084.1': 'HG971_PATCH', - 'NW_003315945.1': 'HSCHR16_1_CTG3_1', - 'NW_003871085.1': 'HG1208_PATCH', - 'NW_003315946.1': 'HSCHR16_2_CTG3_1', - 'NW_004070872.2': 'HG417_PATCH', - 'NW_003315952.2': 'HSCHR17_1_CTG1', - 'NW_003315951.1': 'HG990_PATCH', - 'NW_003315950.2': 'HG987_PATCH', - 'NW_004775433.1': 'HG1591_PATCH', - 'NW_003871090.1': 'HG883_PATCH', - 'NW_004166864.2': 'HG385_PATCH', - 'NW_003315949.1': 'HG75_PATCH', - 'NW_003315948.2': 'HG745_PATCH', - 'NW_003871091.1': 'HSCHR17_4_CTG4', - 'NW_003871093.1': 'HSCHR17_6_CTG4', - 'NW_003871092.1': 'HSCHR17_5_CTG4', - 'NW_003315953.1': 'HSCHR17_1_CTG4', - 'NW_003571052.1': 'HG185_PATCH', - 'NW_003871086.1': 'HG1146_PATCH', - 'NW_003315947.1': 'HG183_PATCH', - 'NW_003871088.1': 'HG747_PATCH', - 'NW_003315954.1': 'HSCHR17_2_CTG4', - 'NW_003315955.1': 'HSCHR17_3_CTG4', - 'NW_003871089.1': 'HG748_PATCH', - 'NW_003871087.1': 'HG271_PATCH', - 'NW_003315956.1': 'HSCHR18_1_CTG1_1', - 'NW_003315959.1': 'HSCHR18_2_CTG1_1', - 'NW_003315960.1': 'HSCHR18_2_CTG2', - 'NW_003315957.1': 'HSCHR18_1_CTG2', - 'NW_003315958.1': 'HSCHR18_1_CTG2_1', - 'NW_003315961.1': 'HSCHR18_2_CTG2_1', - 'NW_003871094.1': 'HG729_PATCH', - 'NW_003571053.2': 'HG730_PATCH', - 'NW_003315962.1': 'HSCHR19_1_CTG3', - 'NW_003315964.2': 'HSCHR19_2_CTG3', - 'NW_003315965.1': 'HSCHR19_3_CTG3', - 'NW_003315963.1': 'HSCHR19_1_CTG3_1', - 'NW_004775434.1': 'HG1350_HG959_PATCH', - 'NW_004166865.1': 'HG1079_PATCH', - 'NW_003571054.1': 'HSCHR19LRC_COX1_CTG1', - 'NW_003571055.1': 'HSCHR19LRC_COX2_CTG1', - 'NW_003571056.1': 'HSCHR19LRC_LRC_I_CTG1', - 'NW_003571057.1': 'HSCHR19LRC_LRC_J_CTG1', - 'NW_003571058.1': 'HSCHR19LRC_LRC_S_CTG1', - 'NW_003571059.1': 'HSCHR19LRC_LRC_T_CTG1', - 'NW_003571060.1': 'HSCHR19LRC_PGF1_CTG1', - 'NW_003571061.1': 'HSCHR19LRC_PGF2_CTG1', - 'NW_003315966.1': 'HSCHR20_1_CTG1', - 'NW_003871095.1': 'HG144_PATCH', - 'NW_004504304.1': 'HG944_PATCH', - 'NW_003571063.2': 'HG506_HG507_HG1000_PATCH', - 'NW_003315967.1': 'HSCHR21_1_CTG1_1', - 'NW_003315968.1': 'HSCHR21_2_CTG1_1', - 'NW_003315969.1': 'HSCHR21_3_CTG1_1', - 'NW_003315970.1': 'HSCHR21_4_CTG1_1', - 'NW_004775435.1': 'HG237_PATCH', - 'NW_004070874.1': 'HG1487_PATCH', - 'NW_004070873.1': 'HG1486_PATCH', - 'NW_004070875.1': 'HG1488_PATCH', - 'NW_003871096.1': 'HG329_PATCH', - 'NW_003315972.1': 'HSCHR22_1_CTG2', - 'NW_003315971.2': 'HSCHR22_1_CTG1', - 'NW_004504305.1': 'HSCHR22_2_CTG1', - 'NW_004070876.1': 'HG497_PATCH', - 'NW_003571064.2': 'HG480_HG481_PATCH', - 'NW_003871098.1': 'HG1423_PATCH', - 'NW_003871099.1': 'HG1424_PATCH', - 'NW_004070879.1': 'HG1435_PATCH', - 'NW_004166866.1': 'HG29_PATCH', - 'NW_004070880.2': 'HG1436_HG1432_PATCH', - 'NW_004070877.1': 'HG1433_PATCH', - 'NW_004070881.1': 'HG1437_PATCH', - 'NW_004070882.1': 'HG1438_PATCH', - 'NW_003871100.1': 'HG1425_PATCH', - 'NW_003871101.3': 'HG1426_PATCH', - 'NW_004070883.1': 'HG1439_PATCH', - 'NW_004070884.1': 'HG1440_PATCH', - 'NW_004070885.1': 'HG1441_PATCH', - 'NW_003871102.1': 'HG375_PATCH', - 'NW_004070878.1': 'HG1434_PATCH', - 'NW_004070891.1': 'HG1462_PATCH', - 'NW_004070892.1': 'HG1463_PATCH', - 'NW_004070893.1': 'HG1490_PATCH', - 'NW_004070886.1': 'HG1442_PATCH', - 'NW_004070887.1': 'HG1443_HG1444_PATCH', - 'NW_004070888.1': 'HG1453_PATCH', - 'NW_004070889.1': 'HG1458_PATCH', - 'NW_004070890.2': 'HG1459_PATCH', - 'NW_003871103.3': 'HG1497_PATCH', - 'NT_167244.1': 'HSCHR6_MHC_APD_CTG1', - 'NT_113891.2': 'HSCHR6_MHC_COX_CTG1', - 'NT_167245.1': 'HSCHR6_MHC_DBB_CTG1', - 'NT_167246.1': 'HSCHR6_MHC_MANN_CTG1', - 'NT_167247.1': 'HSCHR6_MHC_MCF_CTG1', - 'NT_167248.1': 'HSCHR6_MHC_QBL_CTG1', - 'NT_167249.1': 'HSCHR6_MHC_SSTO_CTG1', - 'NT_167250.1': 'HSCHR4_1_CTG9', - 'NT_167251.1': 'HSCHR17_1_CTG5' -} + 'NC_000001.10': '1', + 'NC_000002.11': '2', + 'NC_000003.11': '3', + 'NC_000004.11': '4', + 'NC_000005.9': '5', + 'NC_000006.11': '6', + 'NC_000007.13': '7', + 'NC_000008.10': '8', + 'NC_000009.11': '9', + 'NC_000010.10': '10', + 'NC_000011.9': '11', + 'NC_000012.11': '12', + 'NC_000013.10': '13', + 'NC_000014.8': '14', + 'NC_000015.9': '15', + 'NC_000016.9': '16', + 'NC_000017.10': '17', + 'NC_000018.9': '18', + 'NC_000019.9': '19', + 'NC_000020.10': '20', + 'NC_000021.8': '21', + 'NC_000022.10': '22', + 'NC_000023.10': 'X', + 'NC_000024.9': 'Y', + 'NC_012920.1': 'M', + # GRC GRCh37 alt IDs + "NW_004070864.2": "HG1472_PATCH", + "NW_003571030.1": "HG989_PATCH", + "NW_003871056.3": "HG1292_PATCH", + "NW_003871055.3": "HG1287_PATCH", + "NW_003315905.1": "HSCHR1_1_CTG31", + "NW_003315906.1": "HSCHR1_2_CTG31", + "NW_003315907.1": "HSCHR1_3_CTG31", + "NW_004070863.1": "HG1471_PATCH", + "NW_003871057.1": "HG1293_PATCH", + "NW_004070865.1": "HG1473_PATCH", + "NW_003315903.1": "HG999_1_PATCH", + "NW_003315904.1": "HG999_2_PATCH", + "NW_003315908.1": "HSCHR2_1_CTG1", + "NW_004504299.1": "HG953_PATCH", + "NW_003571032.1": "HG686_PATCH", + "NW_003571033.2": "HSCHR2_2_CTG12", + "NW_003315909.1": "HSCHR2_1_CTG12", + "NW_003571031.1": "HG1007_PATCH", + "NW_003871060.1": "HSCHR3_1_CTG1", + "NW_003871059.1": "HG325_PATCH", + "NW_003315910.1": "HG186_PATCH", + "NW_004775426.1": "HG957_PATCH", + "NW_003315911.1": "HG280_PATCH", + "NW_003871058.1": "HG1091_PATCH", + "NW_003315912.1": "HG991_PATCH", + "NW_003315913.1": "HSCHR3_1_CTG2_1", + "NW_004775427.1": "HG174_HG254_PATCH", + "NW_003315915.1": "HSCHR4_1_CTG6", + "NW_003315916.1": "HSCHR4_2_CTG9", + "NW_003571035.1": "HG706_PATCH", + "NW_003315914.1": "HSCHR4_1_CTG12", + "NW_003571034.1": "HG1032_PATCH", + "NW_003315920.1": "HSCHR5_2_CTG1", + "NW_003571036.1": "HSCHR5_3_CTG1", + "NW_003315917.2": "HSCHR5_1_CTG1", + "NW_003315918.1": "HSCHR5_1_CTG2", + "NW_003871061.1": "HG1063_PATCH", + "NW_004775428.1": "HG1082_HG167_PATCH", + "NW_003315919.1": "HSCHR5_1_CTG5", + "NW_004070866.1": "HG27_PATCH", + "NW_003871063.1": "HG1322_PATCH", + "NW_003315921.1": "HSCHR6_1_CTG5", + "NW_004504300.1": "HG357_PATCH", + "NW_003871062.1": "HG1304_PATCH", + "NW_004775429.1": "HG193_PATCH", + "NW_004166862.1": "HSCHR6_2_CTG5", + "NW_003571039.1": "HG736_PATCH", + "NW_003571038.1": "HG14_PATCH", + "NW_004775430.1": "HG444_PATCH", + "NW_003871064.1": "HG1257_PATCH", + "NW_003571041.1": "HG946_PATCH", + "NW_003571037.1": "HG115_PATCH", + "NW_003871065.1": "HG1308_PATCH", + "NW_003315922.2": "HSCHR7_1_CTG6", + "NW_003571040.1": "HG7_PATCH", + "NW_003571042.1": "HG19_PATCH", + "NW_004775431.1": "HG1699_PATCH", + "NW_003871066.2": "HG418_PATCH", + "NW_003315923.1": "HG104_HG975_PATCH", + "NW_003315924.1": "HG243_PATCH", + "NW_003315928.1": "HSCHR9_1_CTG1", + "NW_003871067.1": "HG962_PATCH", + "NW_003315929.1": "HSCHR9_1_CTG35", + "NW_003315930.1": "HSCHR9_2_CTG35", + "NW_003315931.1": "HSCHR9_3_CTG35", + "NW_004504301.1": "HG50_PATCH", + "NW_004070869.1": "HG1502_PATCH", + "NW_003315925.1": "HG79_PATCH", + "NW_004070867.1": "HG1500_PATCH", + "NW_004070868.1": "HG1501_PATCH", + "NW_003315926.1": "HG998_1_PATCH", + "NW_003315927.1": "HG998_2_PATCH", + "NW_003571043.1": "HG905_PATCH", + "NW_003871071.1": "HG871_PATCH", + "NW_003315932.1": "HG544_PATCH", + "NW_003315934.1": "HSCHR10_1_CTG2", + "NW_003315935.1": "HSCHR10_1_CTG5", + "NW_003871068.1": "HG1211_PATCH", + "NW_004504302.1": "HG1074_PATCH", + "NW_003871070.1": "HG339_PATCH", + "NW_004775432.1": "HG979_PATCH", + "NW_003871069.1": "HG311_PATCH", + "NW_003315933.1": "HG995_PATCH", + "NW_004070870.1": "HG1479_PATCH", + "NW_003871075.1": "HG256_PATCH", + "NW_003871082.1": "HG873_PATCH", + "NW_003315936.1": "HSCHR11_1_CTG1_1", + "NW_003571045.1": "HG281_PATCH", + "NW_003871073.1": "HG142_HG150_NOVEL_TEST", + "NW_003871074.1": "HG151_NOVEL_TEST", + "NW_003571046.1": "HG536_PATCH", + "NW_004070871.1": "HG865_PATCH", + "NW_003871081.1": "HG414_PATCH", + "NW_003871079.1": "HG348_PATCH", + "NW_003871077.1": "HG305_PATCH", + "NW_003871080.1": "HG388_HG400_PATCH", + "NW_003871078.1": "HG306_PATCH", + "NW_003871072.2": "HG122_PATCH", + "NW_003871076.1": "HG299_PATCH", + "NW_003571048.1": "HG858_PATCH", + "NW_003571049.1": "HSCHR12_1_CTG1", + "NW_003871083.2": "HG344_PATCH", + "NW_003571047.1": "HG1133_PATCH", + "NW_003571050.1": "HSCHR12_2_CTG2", + "NW_003315938.1": "HSCHR12_1_CTG2", + "NW_003315939.1": "HSCHR12_1_CTG2_1", + "NW_003315941.1": "HSCHR12_2_CTG2_1", + "NW_003315942.2": "HSCHR12_3_CTG2_1", + "NW_004504303.2": "HG1595_PATCH", + "NW_003315940.1": "HSCHR12_1_CTG5", + "NW_003315937.1": "HG996_PATCH", + "NW_003571051.1": "HG531_PATCH", + "NW_004166863.1": "HG1592_PATCH", + "NW_003315943.1": "HSCHR15_1_CTG4", + "NW_003315944.1": "HSCHR15_1_CTG8", + "NW_003871084.1": "HG971_PATCH", + "NW_003315945.1": "HSCHR16_1_CTG3_1", + "NW_003871085.1": "HG1208_PATCH", + "NW_003315946.1": "HSCHR16_2_CTG3_1", + "NW_004070872.2": "HG417_PATCH", + "NW_003315952.2": "HSCHR17_1_CTG1", + "NW_003315951.1": "HG990_PATCH", + "NW_003315950.2": "HG987_PATCH", + "NW_004775433.1": "HG1591_PATCH", + "NW_003871090.1": "HG883_PATCH", + "NW_004166864.2": "HG385_PATCH", + "NW_003315949.1": "HG75_PATCH", + "NW_003315948.2": "HG745_PATCH", + "NW_003871091.1": "HSCHR17_4_CTG4", + "NW_003871093.1": "HSCHR17_6_CTG4", + "NW_003871092.1": "HSCHR17_5_CTG4", + "NW_003315953.1": "HSCHR17_1_CTG4", + "NW_003571052.1": "HG185_PATCH", + "NW_003871086.1": "HG1146_PATCH", + "NW_003315947.1": "HG183_PATCH", + "NW_003871088.1": "HG747_PATCH", + "NW_003315954.1": "HSCHR17_2_CTG4", + "NW_003315955.1": "HSCHR17_3_CTG4", + "NW_003871089.1": "HG748_PATCH", + "NW_003871087.1": "HG271_PATCH", + "NW_003315956.1": "HSCHR18_1_CTG1_1", + "NW_003315959.1": "HSCHR18_2_CTG1_1", + "NW_003315960.1": "HSCHR18_2_CTG2", + "NW_003315957.1": "HSCHR18_1_CTG2", + "NW_003315958.1": "HSCHR18_1_CTG2_1", + "NW_003315961.1": "HSCHR18_2_CTG2_1", + "NW_003871094.1": "HG729_PATCH", + "NW_003571053.2": "HG730_PATCH", + "NW_003315962.1": "HSCHR19_1_CTG3", + "NW_003315964.2": "HSCHR19_2_CTG3", + "NW_003315965.1": "HSCHR19_3_CTG3", + "NW_003315963.1": "HSCHR19_1_CTG3_1", + "NW_004775434.1": "HG1350_HG959_PATCH", + "NW_004166865.1": "HG1079_PATCH", + "NW_003571054.1": "HSCHR19LRC_COX1_CTG1", + "NW_003571055.1": "HSCHR19LRC_COX2_CTG1", + "NW_003571056.1": "HSCHR19LRC_LRC_I_CTG1", + "NW_003571057.1": "HSCHR19LRC_LRC_J_CTG1", + "NW_003571058.1": "HSCHR19LRC_LRC_S_CTG1", + "NW_003571059.1": "HSCHR19LRC_LRC_T_CTG1", + "NW_003571060.1": "HSCHR19LRC_PGF1_CTG1", + "NW_003571061.1": "HSCHR19LRC_PGF2_CTG1", + "NW_003315966.1": "HSCHR20_1_CTG1", + "NW_003871095.1": "HG144_PATCH", + "NW_004504304.1": "HG944_PATCH", + "NW_003571063.2": "HG506_HG507_HG1000_PATCH", + "NW_003315967.1": "HSCHR21_1_CTG1_1", + "NW_003315968.1": "HSCHR21_2_CTG1_1", + "NW_003315969.1": "HSCHR21_3_CTG1_1", + "NW_003315970.1": "HSCHR21_4_CTG1_1", + "NW_004775435.1": "HG237_PATCH", + "NW_004070874.1": "HG1487_PATCH", + "NW_004070873.1": "HG1486_PATCH", + "NW_004070875.1": "HG1488_PATCH", + "NW_003871096.1": "HG329_PATCH", + "NW_003315972.1": "HSCHR22_1_CTG2", + "NW_003315971.2": "HSCHR22_1_CTG1", + "NW_004504305.1": "HSCHR22_2_CTG1", + "NW_004070876.1": "HG497_PATCH", + "NW_003571064.2": "HG480_HG481_PATCH", + "NW_003871098.1": "HG1423_PATCH", + "NW_003871099.1": "HG1424_PATCH", + "NW_004070879.1": "HG1435_PATCH", + "NW_004166866.1": "HG29_PATCH", + "NW_004070880.2": "HG1436_HG1432_PATCH", + "NW_004070877.1": "HG1433_PATCH", + "NW_004070881.1": "HG1437_PATCH", + "NW_004070882.1": "HG1438_PATCH", + "NW_003871100.1": "HG1425_PATCH", + "NW_003871101.3": "HG1426_PATCH", + "NW_004070883.1": "HG1439_PATCH", + "NW_004070884.1": "HG1440_PATCH", + "NW_004070885.1": "HG1441_PATCH", + "NW_003871102.1": "HG375_PATCH", + "NW_004070878.1": "HG1434_PATCH", + "NW_004070891.1": "HG1462_PATCH", + "NW_004070892.1": "HG1463_PATCH", + "NW_004070893.1": "HG1490_PATCH", + "NW_004070886.1": "HG1442_PATCH", + "NW_004070887.1": "HG1443_HG1444_PATCH", + "NW_004070888.1": "HG1453_PATCH", + "NW_004070889.1": "HG1458_PATCH", + "NW_004070890.2": "HG1459_PATCH", + "NW_003871103.3": "HG1497_PATCH", + "NT_167244.1": "HSCHR6_MHC_APD_CTG1", + "NT_113891.2": "HSCHR6_MHC_COX_CTG1", + "NT_167245.1": "HSCHR6_MHC_DBB_CTG1", + "NT_167246.1": "HSCHR6_MHC_MANN_CTG1", + "NT_167247.1": "HSCHR6_MHC_MCF_CTG1", + "NT_167248.1": "HSCHR6_MHC_QBL_CTG1", + "NT_167249.1": "HSCHR6_MHC_SSTO_CTG1", + "NT_167250.1": "HSCHR4_1_CTG9", + "NT_167251.1": "HSCHR17_1_CTG5"} ########################################### _refseq_to_chr_num_grch38 = { - "NC_000001.11": "1", - "NC_000002.12": "2", - "NC_000003.12": "3", - "NC_000004.12": "4", - "NC_000005.10": "5", - "NC_000006.12": "6", - "NC_000007.14": "7", - "NC_000008.11": "8", - "NC_000009.12": "9", - "NC_000010.11": "10", - "NC_000011.10": "11", - "NC_000012.12": "12", - "NC_000013.11": "13", - "NC_000014.9": "14", - "NC_000015.10": "15", - "NC_000016.10": "16", - "NC_000017.11": "17", - "NC_000018.10": "18", - "NC_000019.10": "19", - "NC_000020.11": "20", - "NC_000021.9": "21", - "NC_000022.11": "22", - "NC_000023.11": "X", - "NC_000024.10": "Y", - "NC_012920.1": "M", - - # GRCh38 alts - 'NW_012132914.1': 'HG1342_HG2282_PATCH', - 'NW_015495298.1': 'HSCHR1_5_CTG3', - 'NW_011332688.1': 'HG2095_PATCH', - 'NW_014040926.1': 'HSCHR1_4_CTG3', - 'NW_009646195.1': 'HG2058_PATCH', - 'NW_018654706.1': 'HSCHR1_8_CTG3', - 'NW_019805487.1': 'HG460_PATCH', - 'NW_009646194.1': 'HG986_PATCH', - 'NW_018654707.1': 'HSCHR1_9_CTG3', - 'NW_014040925.1': 'HSCHR1_3_CTG3', - 'NW_017852928.1': 'HSCHR1_6_CTG3', - 'NW_009646196.1': 'HG2104_PATCH', - 'NW_011332687.1': 'HG1832_PATCH', - 'NW_018654708.1': 'HG2002_PATCH', - 'NW_014040927.1': 'HSCHR1_5_CTG32_1', - 'NW_012132915.1': 'HG2290_PATCH', - 'NW_018654709.1': 'HSCHR2_7_CTG7_2', - 'NW_015495299.1': 'HSCHR2_6_CTG7_2', - 'NW_018654710.1': 'HSCHR2_8_CTG7_2', - 'NW_011332690.1': 'HG2232_PATCH', - 'NW_011332689.1': 'HG2233_PATCH', - 'NW_017363813.1': 'HG2236_PATCH', - 'NW_009646197.1': 'HG2066_PATCH', - 'NW_012132916.1': 'HG2235_PATCH', - 'NW_011332691.1': 'HG126_PATCH', - 'NW_018654711.1': 'HSCHR3_4_CTG1', - 'NW_012132917.1': 'HG2237_PATCH', - 'NW_009646198.1': 'HG2022_PATCH', - 'NW_019805491.1': 'HG2133_PATCH', - 'NW_019805492.1': 'HSCHR3_6_CTG2_1', - 'NW_019805490.1': 'HSCHR3_9_CTG2_1', - 'NW_019805489.1': 'HSCHR3_8_CTG2_1', - 'NW_019805488.1': 'HSCHR3_7_CTG2_1', - 'NW_013171799.1': 'HSCHR4_2_CTG4', - 'NW_013171800.1': 'HSCHR4_8_CTG12', - 'NW_013171801.1': 'HSCHR4_9_CTG12', - 'NW_017363814.1': 'HSCHR4_12_CTG12', - 'NW_015495300.1': 'HG2023_PATCH', - 'NW_015495301.1': 'HSCHR4_11_CTG12', - 'NW_018654712.1': 'HSCHR5_9_CTG1', - 'NW_009646199.1': 'HSCHR5_7_CTG1', - 'NW_016107297.1': 'HSCHR5_8_CTG1', - 'NW_016107298.1': 'HG30_PATCH', - 'NW_018654713.1': 'HG2057_PATCH', - 'NW_013171803.1': 'HSCHR6_1_CTG10', - 'NW_012132918.1': 'HG1651_PATCH', - 'NW_009646200.1': 'HG2128_PATCH', - 'NW_013171802.1': 'HG2072_PATCH', - 'NW_017363815.1': 'HG2121_PATCH', - 'NW_019805493.1': 'HSCHR7_3_CTG1', - 'NW_017852929.1': 'HG2088_PATCH', - 'NW_017852930.1': 'HG2266_PATCH', - 'NW_018654714.1': 'HG708_PATCH', - 'NW_018654715.1': 'HSCHR7_3_CTG4_4', - 'NW_012132919.1': 'HG2239_PATCH', - 'NW_018654717.1': 'HG76_PATCH', - 'NW_017852932.1': 'HG2068_PATCH', - 'NW_017852931.1': 'HG2067_PATCH', - 'NW_019805494.1': 'HSCHR8_7_CTG7', - 'NW_018654716.1': 'HG2419_PATCH', - 'NW_013171804.1': 'HSCHR9_1_CTG6', - 'NW_013171805.1': 'HSCHR9_1_CTG7', - 'NW_009646201.1': 'HG2030_PATCH', - 'NW_011332694.1': 'HG2244_HG2245_PATCH', - 'NW_013171806.1': 'HSCHR10_1_CTG6', - 'NW_009646202.1': 'HG2191_PATCH', - 'NW_013171807.1': 'HG2334_PATCH', - 'NW_011332693.1': 'HG2242_HG2243_PATCH', - 'NW_011332692.1': 'HG2241_PATCH', - 'NW_015148966.1': 'HG107_PATCH', - 'NW_011332695.1': 'HSCHR11_1_CTG1_2', - 'NW_019805496.1': 'HG2114_PATCH', - 'NW_019805495.1': 'HG2060_PATCH', - 'NW_017363816.1': 'HG1708_PATCH', - 'NW_019805498.1': 'HSCHR11_1_CTG3_1', - 'NW_019805497.1': 'HSCHR11_2_CTG8', - 'NW_013171808.1': 'HG2116_PATCH', - 'NW_009646203.1': 'HG2217_PATCH', - 'NW_013171809.1': 'HSCHR12_2_CTG1', - 'NW_018654718.1': 'HG1815_PATCH', - 'NW_011332696.1': 'HG1362_PATCH', - 'NW_009646204.1': 'HG23_PATCH', - 'NW_018654720.1': 'HSCHR12_8_CTG2_1', - 'NW_015148967.1': 'HG2063_PATCH', - 'NW_018654719.1': 'HG2047_PATCH', - 'NW_011332697.1': 'HG2247_PATCH', - 'NW_019805499.1': 'HSCHR12_9_CTG2_1', - 'NW_011332699.1': 'HG2291_PATCH', - 'NW_013171810.1': 'HSCHR13_1_CTG7', - 'NW_009646205.1': 'HG2216_PATCH', - 'NW_011332700.1': 'HG2249_PATCH', - 'NW_013171811.1': 'HSCHR13_1_CTG8', - 'NW_011332698.1': 'HG2288_HG2289_PATCH', - 'NW_018654722.1': 'HG1_PATCH', - 'NW_018654721.1': 'HSCHR14_8_CTG1', - 'NW_011332701.1': 'HG2139_PATCH', - 'NW_012132920.1': 'HSCHR15_6_CTG8', - 'NW_013171812.1': 'HSCHR16_5_CTG1', - 'NW_019805500.1': 'HG2263_PATCH', - 'NW_017852933.1': 'HG926_PATCH', - 'NW_013171813.1': 'HSCHR16_4_CTG3_1', - 'NW_018654723.1': 'HSCHR16_5_CTG3_1', - 'NW_012132921.1': 'HSCHR16_3_CTG3_1', - 'NW_017363817.1': 'HG2285_HG106_HG2252_PATCH', - 'NW_016107299.1': 'HG2046_PATCH', - 'NW_017363819.1': 'HSCHR17_3_CTG1', - 'NW_017363818.1': 'HSCHR17_11_CTG4', - 'NW_019805501.1': 'HSCHR17_12_CTG4', - 'NW_019805503.1': 'HSCHR18_1_CTG1', - 'NW_014040928.1': 'HSCHR18_5_CTG1_1', - 'NW_019805502.1': 'HG2412_PATCH', - 'NW_013171814.1': 'HG2213_PATCH', - 'NW_018654724.1': 'HG2442_PATCH', - 'NW_014040929.1': 'HG26_PATCH', - 'NW_009646206.1': 'HG2021_PATCH', - 'NW_016107300.1': 'HSCHR19KIR_0019-4656-A_CTG3_1', - 'NW_016107301.1': 'HSCHR19KIR_CA01-TA01_1_CTG3_1', - 'NW_016107302.1': 'HSCHR19KIR_CA01-TA01_2_CTG3_1', - 'NW_016107303.1': 'HSCHR19KIR_CA01-TB04_CTG3_1', - 'NW_016107304.1': 'HSCHR19KIR_CA01-TB01_CTG3_1', - 'NW_016107305.1': 'HSCHR19KIR_HG2394_CTG3_1', - 'NW_016107306.1': 'HSCHR19KIR_502960008-2_CTG3_1', - 'NW_016107307.1': 'HSCHR19KIR_502960008-1_CTG3_1', - 'NW_016107308.1': 'HSCHR19KIR_0010-5217-AB_CTG3_1', - 'NW_016107309.1': 'HSCHR19KIR_7191059-1_CTG3_1', - 'NW_016107310.1': 'HSCHR19KIR_0019-4656-B_CTG3_1', - 'NW_016107311.1': 'HSCHR19KIR_CA04_CTG3_1', - 'NW_016107313.1': 'HSCHR19KIR_7191059-2_CTG3_1', - 'NW_016107314.1': 'HSCHR19KIR_HG2396_CTG3_1', - 'NW_016107312.1': 'HSCHR19KIR_HG2393_CTG3_1', - 'NW_009646207.1': 'HSCHR22_4_CTG1', - 'NW_014040930.1': 'HSCHR22_6_CTG1', - 'NW_014040931.1': 'HSCHR22_7_CTG1', - 'NW_009646208.1': 'HSCHR22_5_CTG1', - 'NW_015148968.1': 'HSCHR22_8_CTG1', - 'NW_015148969.1': 'HG1311_PATCH', - 'NW_017363820.1': 'HSCHRX_3_CTG7', - 'NW_018654725.1': 'HG1531_PATCH', - 'NW_018654726.1': 'HG1535_PATCH', - 'NW_009646209.1': 'HG2062_PATCH', - 'NT_187515.1': 'HSCHR1_1_CTG3', - 'NT_187517.1': 'HSCHR1_2_CTG3', - 'NT_187514.1': 'HSCHR1_1_CTG11', - 'NT_187520.1': 'HSCHR1_4_CTG31', - 'NW_003315905.1': 'HSCHR1_1_CTG31', - 'NW_003315906.1': 'HSCHR1_2_CTG31', - 'NW_003315907.2': 'HSCHR1_3_CTG31', - 'NT_187521.1': 'HSCHR1_4_CTG32_1', - 'NT_187519.1': 'HSCHR1_3_CTG32_1', - 'NT_187516.1': 'HSCHR1_1_CTG32_1', - 'NT_187518.1': 'HSCHR1_2_CTG32_1', - 'NT_187525.1': 'HSCHR2_2_CTG1', - 'NT_187526.1': 'HSCHR2_3_CTG1', - 'NT_187529.1': 'HSCHR2_4_CTG1', - 'NT_187522.1': 'HSCHR2_1_CTG1', - 'NW_003315908.1': 'HSCHR2_1_CTG5', - 'NT_187524.1': 'HSCHR2_1_CTG7', - 'NT_187531.1': 'HSCHR2_5_CTG7_2', - 'NT_187530.1': 'HSCHR2_4_CTG7_2', - 'NT_187528.1': 'HSCHR2_3_CTG7_2', - 'NW_003571033.2': 'HSCHR2_2_CTG7_2', - 'NW_003315909.1': 'HSCHR2_1_CTG7_2', - 'NT_187527.1': 'HSCHR2_3_CTG15', - 'NT_187523.1': 'HSCHR2_1_CTG15', - 'NW_003871060.2': 'HSCHR3_1_CTG1', - 'NT_187535.1': 'HSCHR3_3_CTG1', - 'NT_187537.1': 'HSCHR3_4_CTG2_1', - 'NW_003315913.1': 'HSCHR3_1_CTG2_1', - 'NT_187533.1': 'HSCHR3_2_CTG2_1', - 'NT_187536.1': 'HSCHR3_3_CTG2_1', - 'NT_187538.1': 'HSCHR3_5_CTG2_1', - 'NT_187532.1': 'HSCHR3_1_CTG3', - 'NT_187534.1': 'HSCHR3_2_CTG3', - 'NT_187539.1': 'HSCHR3_9_CTG3', - 'NT_187540.1': 'HSCHR4_1_CTG4', - 'NW_003315915.1': 'HSCHR4_1_CTG6', - 'NT_187541.1': 'HSCHR4_1_CTG8_1', - 'NT_167250.2': 'HSCHR4_1_CTG9', - 'NT_187544.1': 'HSCHR4_4_CTG12', - 'NW_003315914.1': 'HSCHR4_1_CTG12', - 'NT_187542.1': 'HSCHR4_2_CTG12', - 'NT_187545.1': 'HSCHR4_5_CTG12', - 'NT_187543.1': 'HSCHR4_3_CTG12', - 'NT_187550.1': 'HSCHR5_5_CTG1', - 'NT_187548.1': 'HSCHR5_4_CTG1', - 'NT_187547.1': 'HSCHR5_3_CTG1', - 'NW_003315920.1': 'HSCHR5_1_CTG1', - 'NW_003571036.1': 'HSCHR5_2_CTG1', - 'NT_187551.1': 'HSCHR5_6_CTG1', - 'NW_003315917.2': 'HSCHR5_2_CTG1_1', - 'NW_003315918.1': 'HSCHR5_3_CTG1_1', - 'NT_187549.1': 'HSCHR5_4_CTG1_1', - 'NW_003315919.1': 'HSCHR5_1_CTG5', - 'NT_187546.1': 'HSCHR5_2_CTG5', - 'NT_167244.2': 'HSCHR6_MHC_APD_CTG1', - 'NT_187555.1': 'HSCHR6_1_CTG7', - 'NT_187554.1': 'HSCHR6_1_CTG6', - 'NW_003315921.1': 'HSCHR6_1_CTG2', - 'NT_187556.1': 'HSCHR6_1_CTG8', - 'NT_187557.1': 'HSCHR6_1_CTG9', - 'NW_004166862.2': 'HSCHR6_1_CTG3', - 'NT_187552.1': 'HSCHR6_1_CTG4', - 'NT_187553.1': 'HSCHR6_1_CTG5', - 'NT_187558.1': 'HSCHR7_1_CTG1', - 'NT_187561.1': 'HSCHR7_2_CTG4_4', - 'NT_187559.1': 'HSCHR7_1_CTG4_4', - 'NW_003315922.2': 'HSCHR7_1_CTG6', - 'NT_187562.1': 'HSCHR7_2_CTG6', - 'NT_187564.1': 'HSCHR7_3_CTG6', - 'NT_187563.1': 'HSCHR7_2_CTG7', - 'NT_187560.1': 'HSCHR7_1_CTG7', - 'NT_187572.1': 'HSCHR8_4_CTG1', - 'NT_187568.1': 'HSCHR8_2_CTG1', - 'NT_187565.1': 'HSCHR8_1_CTG1', - 'NT_187576.1': 'HSCHR8_8_CTG1', - 'NT_187570.1': 'HSCHR8_3_CTG1', - 'NT_187577.1': 'HSCHR8_9_CTG1', - 'NT_187566.1': 'HSCHR8_1_CTG6', - 'NT_187567.1': 'HSCHR8_1_CTG7', - 'NT_187574.1': 'HSCHR8_5_CTG7', - 'NT_187575.1': 'HSCHR8_6_CTG7', - 'NT_187573.1': 'HSCHR8_4_CTG7', - 'NT_187571.1': 'HSCHR8_3_CTG7', - 'NT_187569.1': 'HSCHR8_2_CTG7', - 'NW_003315928.1': 'HSCHR9_1_CTG1', - 'NW_003315929.1': 'HSCHR9_1_CTG2', - 'NW_003315930.1': 'HSCHR9_1_CTG3', - 'NW_003315931.1': 'HSCHR9_1_CTG4', - 'NT_187578.1': 'HSCHR9_1_CTG5', - 'NW_003315934.1': 'HSCHR10_1_CTG1', - 'NT_187579.1': 'HSCHR10_1_CTG3', - 'NW_003315935.1': 'HSCHR10_1_CTG2', - 'NT_187580.1': 'HSCHR10_1_CTG4', - 'NT_187586.1': 'HSCHR11_1_CTG8', - 'NT_187584.1': 'HSCHR11_1_CTG6', - 'NT_187585.1': 'HSCHR11_1_CTG7', - 'NT_187583.1': 'HSCHR11_1_CTG5', - 'NW_003315936.1': 'HSCHR11_1_CTG1_1', - 'NW_003871073.1': 'HG142_HG150_NOVEL_TEST', - 'NW_003871074.1': 'HG151_NOVEL_TEST', - 'NT_187582.1': 'HSCHR11_1_CTG3', - 'NT_187581.1': 'HSCHR11_1_CTG2', - 'NW_003571049.1': 'HSCHR12_1_CTG1', - 'NW_003571050.1': 'HSCHR12_2_CTG2', - 'NT_187588.1': 'HSCHR12_5_CTG2', - 'NW_003315938.1': 'HSCHR12_1_CTG2', - 'NT_187587.1': 'HSCHR12_4_CTG2', - 'NW_003315939.2': 'HSCHR12_1_CTG2_1', - 'NW_003315941.1': 'HSCHR12_2_CTG2_1', - 'NW_003315942.2': 'HSCHR12_3_CTG2_1', - 'NT_187590.1': 'HSCHR12_6_CTG2_1', - 'NW_003315940.1': 'HSCHR12_4_CTG2_1', - 'NT_187589.1': 'HSCHR12_5_CTG2_1', - 'NT_187591.1': 'HSCHR12_7_CTG2_1', - 'NT_187594.1': 'HSCHR13_1_CTG3', - 'NT_187593.1': 'HSCHR13_1_CTG2', - 'NT_187597.1': 'HSCHR13_1_CTG6', - 'NT_187595.1': 'HSCHR13_1_CTG4', - 'NT_187592.1': 'HSCHR13_1_CTG1', - 'NT_187596.1': 'HSCHR13_1_CTG5', - 'NT_187598.1': 'HSCHR14_1_CTG1', - 'NT_187601.1': 'HSCHR14_7_CTG1', - 'NT_187599.1': 'HSCHR14_2_CTG1', - 'NT_187600.1': 'HSCHR14_3_CTG1', - 'NT_187602.1': 'HSCHR15_1_CTG1', - 'NT_187604.1': 'HSCHR15_3_CTG3', - 'NT_187603.1': 'HSCHR15_1_CTG3', - 'NW_003315943.1': 'HSCHR15_1_CTG8', - 'NT_187605.1': 'HSCHR15_3_CTG8', - 'NW_003315944.2': 'HSCHR15_2_CTG8', - 'NT_187606.1': 'HSCHR15_5_CTG8', - 'NT_187610.1': 'HSCHR16_CTG2', - 'NT_187609.1': 'HSCHR16_4_CTG1', - 'NT_187608.1': 'HSCHR16_3_CTG1', - 'NT_187607.1': 'HSCHR16_1_CTG1', - 'NW_003315945.1': 'HSCHR16_1_CTG3_1', - 'NW_003315946.1': 'HSCHR16_2_CTG3_1', - 'NW_003315952.3': 'HSCHR17_1_CTG1', - 'NT_187613.1': 'HSCHR17_2_CTG2', - 'NT_187611.1': 'HSCHR17_1_CTG2', - 'NT_187614.1': 'HSCHR17_7_CTG4', - 'NW_003871091.1': 'HSCHR17_4_CTG4', - 'NW_003871092.1': 'HSCHR17_5_CTG4', - 'NW_003315953.2': 'HSCHR17_1_CTG4', - 'NT_167251.2': 'HSCHR17_1_CTG5', - 'NW_003315954.1': 'HSCHR17_2_CTG4', - 'NT_187615.1': 'HSCHR17_8_CTG4', - 'NT_187616.1': 'HSCHR17_9_CTG4', - 'NW_003315955.1': 'HSCHR17_3_CTG4', - 'NT_187612.1': 'HSCHR17_1_CTG9', - 'NT_187618.1': 'HSCHR18_4_CTG1_1', - 'NW_003315956.1': 'HSCHR18_1_CTG1_1', - 'NW_003315959.1': 'HSCHR18_2_CTG1_1', - 'NW_003315960.1': 'HSCHR18_2_CTG2', - 'NW_003315957.1': 'HSCHR18_1_CTG2', - 'NW_003315958.1': 'HSCHR18_1_CTG2_1', - 'NW_003315961.1': 'HSCHR18_2_CTG2_1', - 'NT_187617.1': 'HSCHR18_3_CTG2_1', - 'NT_187622.1': 'HSCHR19_5_CTG2', - 'NT_187621.1': 'HSCHR19_4_CTG2', - 'NW_003315962.1': 'HSCHR19_1_CTG2', - 'NW_003315964.2': 'HSCHR19_2_CTG2', - 'NW_003315965.1': 'HSCHR19_3_CTG2', - 'NW_003315963.1': 'HSCHR19_1_CTG3_1', - 'NT_187619.1': 'HSCHR19_2_CTG3_1', - 'NT_187620.1': 'HSCHR19_3_CTG3_1', - 'NW_003571054.1': 'HSCHR19LRC_COX1_CTG3_1', - 'NW_003315966.2': 'HSCHR20_1_CTG1', - 'NT_187623.1': 'HSCHR20_1_CTG2', - 'NT_187625.1': 'HSCHR20_1_CTG4', - 'NT_187624.1': 'HSCHR20_1_CTG3', - 'NW_003315967.2': 'HSCHR21_1_CTG1_1', - 'NT_187628.1': 'HSCHR21_8_CTG1_1', - 'NT_187627.1': 'HSCHR21_6_CTG1_1', - 'NW_003315968.2': 'HSCHR21_2_CTG1_1', - 'NW_003315969.2': 'HSCHR21_3_CTG1_1', - 'NW_003315970.2': 'HSCHR21_4_CTG1_1', - 'NT_187626.1': 'HSCHR21_5_CTG2', - 'NT_187629.1': 'HSCHR22_1_CTG3', - 'NT_187632.1': 'HSCHR22_1_CTG6', - 'NT_187633.1': 'HSCHR22_1_CTG7', - 'NT_187630.1': 'HSCHR22_1_CTG4', - 'NT_187631.1': 'HSCHR22_1_CTG5', - 'NW_003315972.2': 'HSCHR22_1_CTG2', - 'NW_003315971.2': 'HSCHR22_1_CTG1', - 'NT_187634.1': 'HSCHRX_1_CTG3', - 'NT_187635.1': 'HSCHRX_2_CTG12', - 'NT_187646.1': 'HSCHR1_ALT2_1_CTG32_1', - 'NT_187648.1': 'HSCHR2_2_CTG7', - 'NT_187647.1': 'HSCHR2_2_CTG15', - 'NT_187649.1': 'HSCHR3_3_CTG3', - 'NT_187650.1': 'HSCHR4_6_CTG12', - 'NT_187651.1': 'HSCHR5_1_CTG1_1', - 'NT_187652.1': 'HSCHR5_3_CTG5', - 'NT_113891.3': 'HSCHR6_MHC_COX_CTG1', - 'NT_187653.1': 'HSCHR7_2_CTG1', - 'NT_187655.1': 'HSCHR8_6_CTG1', - 'NT_187654.1': 'HSCHR8_5_CTG1', - 'NT_187656.1': 'HSCHR11_2_CTG1', - 'NT_187657.1': 'HSCHR11_2_CTG1_1', - 'NT_187658.1': 'HSCHR12_3_CTG2', - 'NT_187659.1': 'HSCHR15_2_CTG3', - 'NT_187660.1': 'HSCHR15_4_CTG8', - 'NT_187662.1': 'HSCHR17_2_CTG1', - 'NT_187664.1': 'HSCHR17_3_CTG2', - 'NT_187661.1': 'HSCHR17_10_CTG4', - 'NW_003871093.1': 'HSCHR17_6_CTG4', - 'NT_187663.1': 'HSCHR17_2_CTG5', - 'NT_187665.1': 'HSCHR18_ALT21_CTG2_1', - 'NT_187666.1': 'HSCHR18_ALT2_CTG2_1', - 'NW_003571055.2': 'HSCHR19LRC_COX2_CTG3_1', - 'NW_004504305.1': 'HSCHR22_2_CTG1', - 'NT_187667.1': 'HSCHRX_2_CTG3', - 'NT_187678.1': 'HSCHR3_4_CTG3', - 'NT_187679.1': 'HSCHR4_7_CTG12', - 'NT_167245.2': 'HSCHR6_MHC_DBB_CTG1', - 'NT_187680.1': 'HSCHR8_7_CTG1', - 'NT_187681.1': 'HSCHR11_3_CTG1', - 'NW_003571056.2': 'HSCHR19LRC_LRC_I_CTG3_1', - 'NT_187682.1': 'HSCHR22_3_CTG1', - 'NT_187688.1': 'HSCHR3_5_CTG3', - 'NT_167246.2': 'HSCHR6_MHC_MANN_CTG1', - 'NW_003571057.2': 'HSCHR19LRC_LRC_J_CTG3_1', - 'NT_187689.1': 'HSCHR3_6_CTG3', - 'NT_167247.2': 'HSCHR6_MHC_MCF_CTG1', - 'NW_003571058.2': 'HSCHR19LRC_LRC_S_CTG3_1', - 'NT_187690.1': 'HSCHR3_7_CTG3', - 'NT_167248.2': 'HSCHR6_MHC_QBL_CTG1', - 'NW_003571059.2': 'HSCHR19LRC_LRC_T_CTG3_1', - 'NT_187691.1': 'HSCHR3_8_CTG3', - 'NT_167249.2': 'HSCHR6_MHC_SSTO_CTG1', - 'NW_003571060.1': 'HSCHR19LRC_PGF1_CTG3_1', - 'NT_187692.1': 'HSCHR6_8_CTG1', - 'NW_003571061.2': 'HSCHR19LRC_PGF2_CTG3_1', - 'NT_187693.1': 'HSCHR19_4_CTG3_1', - 'NT_187636.1': 'HSCHR19KIR_FH15_B_HAP_CTG3_1', - 'NT_187637.1': 'HSCHR19KIR_G085_A_HAP_CTG3_1', - 'NT_187638.1': 'HSCHR19KIR_G085_BA1_HAP_CTG3_1', - 'NT_187639.1': 'HSCHR19KIR_G248_A_HAP_CTG3_1', - 'NT_187640.1': 'HSCHR19KIR_G248_BA2_HAP_CTG3_1', - 'NT_187641.1': 'HSCHR19KIR_GRC212_AB_HAP_CTG3_1', - 'NT_187642.1': 'HSCHR19KIR_GRC212_BA1_HAP_CTG3_1', - 'NT_187643.1': 'HSCHR19KIR_LUCE_A_HAP_CTG3_1', - 'NT_187644.1': 'HSCHR19KIR_LUCE_BDEL_HAP_CTG3_1', - 'NT_187645.1': 'HSCHR19KIR_RSH_A_HAP_CTG3_1', - 'NT_187668.1': 'HSCHR19KIR_RSH_BA2_HAP_CTG3_1', - 'NT_187669.1': 'HSCHR19KIR_T7526_A_HAP_CTG3_1', - 'NT_187670.1': 'HSCHR19KIR_T7526_BDEL_HAP_CTG3_1', - 'NT_187671.1': 'HSCHR19KIR_ABC08_A1_HAP_CTG3_1', - 'NT_187672.1': 'HSCHR19KIR_ABC08_AB_HAP_C_P_CTG3_1', - 'NT_187673.1': 'HSCHR19KIR_ABC08_AB_HAP_T_P_CTG3_1', - 'NT_187674.1': 'HSCHR19KIR_FH05_A_HAP_CTG3_1', - 'NT_187675.1': 'HSCHR19KIR_FH05_B_HAP_CTG3_1', - 'NT_187676.1': 'HSCHR19KIR_FH06_A_HAP_CTG3_1', - 'NT_187677.1': 'HSCHR19KIR_FH06_BA1_HAP_CTG3_1', - 'NT_187683.1': 'HSCHR19KIR_FH08_A_HAP_CTG3_1', - 'NT_187684.1': 'HSCHR19KIR_FH08_BAX_HAP_CTG3_1', - 'NT_187685.1': 'HSCHR19KIR_FH13_A_HAP_CTG3_1', - 'NT_187686.1': 'HSCHR19KIR_FH13_BA2_HAP_CTG3_1', - 'NT_187687.1': 'HSCHR19KIR_FH15_A_HAP_CTG3_1', - 'NT_113949.2': 'HSCHR19KIR_RP5_B_HAP_CTG3_1', - 'NT_167235.1': 'HSCHR22_CTG1_3', - 'NW_025791756.1': 'HG1343_HG173_HG459_PATCH', - 'NW_025791753.1': 'HSCHR1_12_CTG3', - 'NW_025791758.1': 'HG2515_PATCH', - 'NW_025791759.1': 'HG2577_PATCH', - 'NW_025791754.1': 'HSCHR1_5_CTG31', - 'NW_025791757.1': 'HG2571_PATCH', - 'NW_025791755.1': 'HSCHR1_6_CTG31', - 'NW_021159988.1': 'HG1384_PATCH', - 'NW_025791767.1': 'HG2231_HG2496_PATCH', - 'NW_025791766.1': 'HG2052_PATCH', - 'NW_025791763.1': 'HSCHR2_6_CTG1', - 'NW_025791760.1': 'HSCHR2_10_CTG7_2', - 'NW_025791765.1': 'HG2275_PATCH', - 'NW_025791762.1': 'HSCHR2_12_CTG7_2', - 'NW_025791761.1': 'HSCHR2_11_CTG7_2', - 'NW_025791764.1': 'HG2494_PATCH', - 'NW_025791770.1': 'HG2077_PATCH', - 'NW_025791771.1': 'HG2069_PATCH', - 'NW_025791769.1': 'HG2264_PATCH', - 'NW_025791774.1': 'HG287_PATCH', - 'NW_025791772.1': 'HSCHR4_2_CTG8_1', - 'NW_025791773.1': 'HG2155_PATCH', - 'NW_025791776.1': 'HG2476_PATCH', - 'NW_025791779.1': 'HSCHR5_10_CTG1', - 'NW_021159996.1': 'HG1395_PATCH', - 'NW_025791778.1': 'HG2308_PATCH', - 'NW_025791775.1': 'HG1046_PATCH', - 'NW_025791780.1': 'HSCHR6_1_CTG1', - 'NW_025791781.1': 'HSCHR7_4_CTG1', - 'NW_025791782.1': 'HG2176_PATCH', - 'NW_025791784.1': 'HG2408_PATCH', - 'NW_025791783.1': 'HG1047_PATCH', - 'NW_025791789.1': 'HG1206_PATCH', - 'NW_025791787.1': 'HG2158_PATCH', - 'NW_025791788.1': 'HG1012_PATCH', - 'NW_025791790.1': 'HG2576_PATCH', - 'NW_015148966.2': 'HG107_HG2565_PATCH', - 'NW_025791792.1': 'HG152_PATCH', - 'NW_021160004.1': 'HG28_PATCH', - 'NW_025791794.1': 'HG2578_PATCH', - 'NW_021160005.1': 'HG2115_PATCH', - 'NW_025791791.1': 'HSCHR11_2_CTG3_1', - 'NW_021160008.1': 'HG1398_PATCH', - 'NW_025791795.1': 'HG2554_PATCH', - 'NW_021160007.1': 'HG2246_HG2248_HG2276_PATCH', - 'NW_021160012.1': 'HG2509_PATCH', - 'NW_021160013.1': 'HG2510_PATCH', - 'NW_025791796.1': 'HG2526_HG2573_PATCH', - 'NW_021160018.1': 'HG2511_PATCH', - 'NW_021160017.1': 'HG2365_PATCH', - 'NW_025791798.1': 'HSCHR15_9_CTG8', - 'NW_021160016.1': 'HG2198_PATCH', - 'NW_025791797.1': 'HG2280_PATCH', - 'NW_021160015.1': 'HG2499_PATCH', - 'NW_021160019.1': 'HG2471_PATCH', - 'NW_025791800.1': 'HG405_PATCH', - 'NW_021160020.1': 'HG2087_PATCH', - 'NW_025791803.1': 'HG2407_PATCH', - 'NW_025791801.1': 'HSCHR17_13_CTG4', - 'NW_025791806.1': 'HG2580_PATCH', - 'NW_025791802.1': 'HG2118_PATCH', - 'NW_025791805.1': 'HG1369_PATCH', - 'NW_021160021.1': 'HG1320_PATCH', - 'NW_025791804.1': 'HG2251_PATCH', - 'NW_025791810.1': 'HSCHR19_6_CTG2', - 'NW_025791807.1': 'HG2461_PATCH', - 'NW_021160022.1': 'HG109_PATCH', - 'NW_025791808.1': 'HG2569_PATCH', - 'NW_025791811.1': 'HG2225_PATCH', - 'NW_025791812.1': 'HG410_PATCH', - 'NW_021160023.1': 'HG2513_PATCH', - 'NW_025791813.1': 'HG2219_PATCH', - 'NW_025791814.1': 'HG2265_PATCH', - 'NW_025791815.1': 'HG2521_PATCH', - 'NW_021160026.1': 'HG2512_PATCH', - 'NW_021160024.1': 'HG1485_PATCH', - 'NW_021160025.1': 'HG494_PATCH', - 'NW_021160031.1': 'HG1466_PATCH', - 'NW_025791820.1': 'HSCHRX_3_CTG3', - 'NW_021160028.1': 'HG1506_PATCH', - 'NW_025791816.1': 'HG2527_PATCH', - 'NW_021160029.1': 'HG1507_PATCH', - 'NW_025791817.1': 'HG2541_PATCH', - 'NW_021160027.1': 'HG439_PATCH', - 'NW_025791819.1': 'HSCHRX_2_CTG14', - 'NW_021160030.1': 'HG1509_PATCH', - 'NW_025791818.1': 'HSCHRX_1_CTG14', - 'NW_025791821.1': 'HG1532_PATCH', - 'NW_025791809.1': 'HG2469_PATCH', - 'NW_025791777.1': 'HG2405_PATCH' -} + 'NC_000001.11': '1', + 'NC_000002.12': '2', + 'NC_000003.12': '3', + 'NC_000004.12': '4', + 'NC_000005.10': '5', + 'NC_000006.12': '6', + 'NC_000007.14': '7', + 'NC_000008.11': '8', + 'NC_000009.12': '9', + 'NC_000010.11': '10', + 'NC_000011.10': '11', + 'NC_000012.12': '12', + 'NC_000013.11': '13', + 'NC_000014.9': '14', + 'NC_000015.10': '15', + 'NC_000016.10': '16', + 'NC_000017.11': '17', + 'NC_000018.10': '18', + 'NC_000019.10': '19', + 'NC_000020.11': '20', + 'NC_000021.9': '21', + 'NC_000022.11': '22', + 'NC_000023.11': 'X', + 'NC_000024.10': 'Y', + 'NC_012920.1': 'M', + # GRCh38 alt Ids + "NW_012132914.1": "HG1342_HG2282_PATCH", + "NW_015495298.1": "HSCHR1_5_CTG3", + "NW_011332688.1": "HG2095_PATCH", + "NW_014040926.1": "HSCHR1_4_CTG3", + "NW_009646195.1": "HG2058_PATCH", + "NW_018654706.1": "HSCHR1_8_CTG3", + "NW_019805487.1": "HG460_PATCH", + "NW_009646194.1": "HG986_PATCH", + "NW_018654707.1": "HSCHR1_9_CTG3", + "NW_014040925.1": "HSCHR1_3_CTG3", + "NW_017852928.1": "HSCHR1_6_CTG3", + "NW_009646196.1": "HG2104_PATCH", + "NW_011332687.1": "HG1832_PATCH", + "NW_018654708.1": "HG2002_PATCH", + "NW_014040927.1": "HSCHR1_5_CTG32_1", + "NW_012132915.1": "HG2290_PATCH", + "NW_018654709.1": "HSCHR2_7_CTG7_2", + "NW_015495299.1": "HSCHR2_6_CTG7_2", + "NW_018654710.1": "HSCHR2_8_CTG7_2", + "NW_011332690.1": "HG2232_PATCH", + "NW_011332689.1": "HG2233_PATCH", + "NW_017363813.1": "HG2236_PATCH", + "NW_009646197.1": "HG2066_PATCH", + "NW_012132916.1": "HG2235_PATCH", + "NW_011332691.1": "HG126_PATCH", + "NW_018654711.1": "HSCHR3_4_CTG1", + "NW_012132917.1": "HG2237_PATCH", + "NW_009646198.1": "HG2022_PATCH", + "NW_019805491.1": "HG2133_PATCH", + "NW_019805492.1": "HSCHR3_6_CTG2_1", + "NW_019805490.1": "HSCHR3_9_CTG2_1", + "NW_019805489.1": "HSCHR3_8_CTG2_1", + "NW_019805488.1": "HSCHR3_7_CTG2_1", + "NW_013171799.1": "HSCHR4_2_CTG4", + "NW_013171800.1": "HSCHR4_8_CTG12", + "NW_013171801.1": "HSCHR4_9_CTG12", + "NW_017363814.1": "HSCHR4_12_CTG12", + "NW_015495300.1": "HG2023_PATCH", + "NW_015495301.1": "HSCHR4_11_CTG12", + "NW_018654712.1": "HSCHR5_9_CTG1", + "NW_009646199.1": "HSCHR5_7_CTG1", + "NW_016107297.1": "HSCHR5_8_CTG1", + "NW_016107298.1": "HG30_PATCH", + "NW_018654713.1": "HG2057_PATCH", + "NW_013171803.1": "HSCHR6_1_CTG10", + "NW_012132918.1": "HG1651_PATCH", + "NW_009646200.1": "HG2128_PATCH", + "NW_013171802.1": "HG2072_PATCH", + "NW_017363815.1": "HG2121_PATCH", + "NW_019805493.1": "HSCHR7_3_CTG1", + "NW_017852929.1": "HG2088_PATCH", + "NW_017852930.1": "HG2266_PATCH", + "NW_018654714.1": "HG708_PATCH", + "NW_018654715.1": "HSCHR7_3_CTG4_4", + "NW_012132919.1": "HG2239_PATCH", + "NW_018654717.1": "HG76_PATCH", + "NW_017852932.1": "HG2068_PATCH", + "NW_017852931.1": "HG2067_PATCH", + "NW_019805494.1": "HSCHR8_7_CTG7", + "NW_018654716.1": "HG2419_PATCH", + "NW_013171804.1": "HSCHR9_1_CTG6", + "NW_013171805.1": "HSCHR9_1_CTG7", + "NW_009646201.1": "HG2030_PATCH", + "NW_011332694.1": "HG2244_HG2245_PATCH", + "NW_013171806.1": "HSCHR10_1_CTG6", + "NW_009646202.1": "HG2191_PATCH", + "NW_013171807.1": "HG2334_PATCH", + "NW_011332693.1": "HG2242_HG2243_PATCH", + "NW_011332692.1": "HG2241_PATCH", + "NW_015148966.1": "HG107_PATCH", + "NW_011332695.1": "HSCHR11_1_CTG1_2", + "NW_019805496.1": "HG2114_PATCH", + "NW_019805495.1": "HG2060_PATCH", + "NW_017363816.1": "HG1708_PATCH", + "NW_019805498.1": "HSCHR11_1_CTG3_1", + "NW_019805497.1": "HSCHR11_2_CTG8", + "NW_013171808.1": "HG2116_PATCH", + "NW_009646203.1": "HG2217_PATCH", + "NW_013171809.1": "HSCHR12_2_CTG1", + "NW_018654718.1": "HG1815_PATCH", + "NW_011332696.1": "HG1362_PATCH", + "NW_009646204.1": "HG23_PATCH", + "NW_018654720.1": "HSCHR12_8_CTG2_1", + "NW_015148967.1": "HG2063_PATCH", + "NW_018654719.1": "HG2047_PATCH", + "NW_011332697.1": "HG2247_PATCH", + "NW_019805499.1": "HSCHR12_9_CTG2_1", + "NW_011332699.1": "HG2291_PATCH", + "NW_013171810.1": "HSCHR13_1_CTG7", + "NW_009646205.1": "HG2216_PATCH", + "NW_011332700.1": "HG2249_PATCH", + "NW_013171811.1": "HSCHR13_1_CTG8", + "NW_011332698.1": "HG2288_HG2289_PATCH", + "NW_018654722.1": "HG1_PATCH", + "NW_018654721.1": "HSCHR14_8_CTG1", + "NW_011332701.1": "HG2139_PATCH", + "NW_012132920.1": "HSCHR15_6_CTG8", + "NW_013171812.1": "HSCHR16_5_CTG1", + "NW_019805500.1": "HG2263_PATCH", + "NW_017852933.1": "HG926_PATCH", + "NW_013171813.1": "HSCHR16_4_CTG3_1", + "NW_018654723.1": "HSCHR16_5_CTG3_1", + "NW_012132921.1": "HSCHR16_3_CTG3_1", + "NW_017363817.1": "HG2285_HG106_HG2252_PATCH", + "NW_016107299.1": "HG2046_PATCH", + "NW_017363819.1": "HSCHR17_3_CTG1", + "NW_017363818.1": "HSCHR17_11_CTG4", + "NW_019805501.1": "HSCHR17_12_CTG4", + "NW_019805503.1": "HSCHR18_1_CTG1", + "NW_014040928.1": "HSCHR18_5_CTG1_1", + "NW_019805502.1": "HG2412_PATCH", + "NW_013171814.1": "HG2213_PATCH", + "NW_018654724.1": "HG2442_PATCH", + "NW_014040929.1": "HG26_PATCH", + "NW_009646206.1": "HG2021_PATCH", + "NW_016107300.1": "HSCHR19KIR_0019-4656-A_CTG3_1", + "NW_016107301.1": "HSCHR19KIR_CA01-TA01_1_CTG3_1", + "NW_016107302.1": "HSCHR19KIR_CA01-TA01_2_CTG3_1", + "NW_016107303.1": "HSCHR19KIR_CA01-TB04_CTG3_1", + "NW_016107304.1": "HSCHR19KIR_CA01-TB01_CTG3_1", + "NW_016107305.1": "HSCHR19KIR_HG2394_CTG3_1", + "NW_016107306.1": "HSCHR19KIR_502960008-2_CTG3_1", + "NW_016107307.1": "HSCHR19KIR_502960008-1_CTG3_1", + "NW_016107308.1": "HSCHR19KIR_0010-5217-AB_CTG3_1", + "NW_016107309.1": "HSCHR19KIR_7191059-1_CTG3_1", + "NW_016107310.1": "HSCHR19KIR_0019-4656-B_CTG3_1", + "NW_016107311.1": "HSCHR19KIR_CA04_CTG3_1", + "NW_016107313.1": "HSCHR19KIR_7191059-2_CTG3_1", + "NW_016107314.1": "HSCHR19KIR_HG2396_CTG3_1", + "NW_016107312.1": "HSCHR19KIR_HG2393_CTG3_1", + "NW_009646207.1": "HSCHR22_4_CTG1", + "NW_014040930.1": "HSCHR22_6_CTG1", + "NW_014040931.1": "HSCHR22_7_CTG1", + "NW_009646208.1": "HSCHR22_5_CTG1", + "NW_015148968.1": "HSCHR22_8_CTG1", + "NW_015148969.1": "HG1311_PATCH", + "NW_017363820.1": "HSCHRX_3_CTG7", + "NW_018654725.1": "HG1531_PATCH", + "NW_018654726.1": "HG1535_PATCH", + "NW_009646209.1": "HG2062_PATCH", + "NT_187515.1": "HSCHR1_1_CTG3", + "NT_187517.1": "HSCHR1_2_CTG3", + "NT_187514.1": "HSCHR1_1_CTG11", + "NT_187520.1": "HSCHR1_4_CTG31", + "NW_003315905.1": "HSCHR1_1_CTG31", + "NW_003315906.1": "HSCHR1_2_CTG31", + "NW_003315907.2": "HSCHR1_3_CTG31", + "NT_187521.1": "HSCHR1_4_CTG32_1", + "NT_187519.1": "HSCHR1_3_CTG32_1", + "NT_187516.1": "HSCHR1_1_CTG32_1", + "NT_187518.1": "HSCHR1_2_CTG32_1", + "NT_187525.1": "HSCHR2_2_CTG1", + "NT_187526.1": "HSCHR2_3_CTG1", + "NT_187529.1": "HSCHR2_4_CTG1", + "NT_187522.1": "HSCHR2_1_CTG1", + "NW_003315908.1": "HSCHR2_1_CTG5", + "NT_187524.1": "HSCHR2_1_CTG7", + "NT_187531.1": "HSCHR2_5_CTG7_2", + "NT_187530.1": "HSCHR2_4_CTG7_2", + "NT_187528.1": "HSCHR2_3_CTG7_2", + "NW_003571033.2": "HSCHR2_2_CTG7_2", + "NW_003315909.1": "HSCHR2_1_CTG7_2", + "NT_187527.1": "HSCHR2_3_CTG15", + "NT_187523.1": "HSCHR2_1_CTG15", + "NW_003871060.2": "HSCHR3_1_CTG1", + "NT_187535.1": "HSCHR3_3_CTG1", + "NT_187537.1": "HSCHR3_4_CTG2_1", + "NW_003315913.1": "HSCHR3_1_CTG2_1", + "NT_187533.1": "HSCHR3_2_CTG2_1", + "NT_187536.1": "HSCHR3_3_CTG2_1", + "NT_187538.1": "HSCHR3_5_CTG2_1", + "NT_187532.1": "HSCHR3_1_CTG3", + "NT_187534.1": "HSCHR3_2_CTG3", + "NT_187539.1": "HSCHR3_9_CTG3", + "NT_187540.1": "HSCHR4_1_CTG4", + "NW_003315915.1": "HSCHR4_1_CTG6", + "NT_187541.1": "HSCHR4_1_CTG8_1", + "NT_167250.2": "HSCHR4_1_CTG9", + "NT_187544.1": "HSCHR4_4_CTG12", + "NW_003315914.1": "HSCHR4_1_CTG12", + "NT_187542.1": "HSCHR4_2_CTG12", + "NT_187545.1": "HSCHR4_5_CTG12", + "NT_187543.1": "HSCHR4_3_CTG12", + "NT_187550.1": "HSCHR5_5_CTG1", + "NT_187548.1": "HSCHR5_4_CTG1", + "NT_187547.1": "HSCHR5_3_CTG1", + "NW_003315920.1": "HSCHR5_1_CTG1", + "NW_003571036.1": "HSCHR5_2_CTG1", + "NT_187551.1": "HSCHR5_6_CTG1", + "NW_003315917.2": "HSCHR5_2_CTG1_1", + "NW_003315918.1": "HSCHR5_3_CTG1_1", + "NT_187549.1": "HSCHR5_4_CTG1_1", + "NW_003315919.1": "HSCHR5_1_CTG5", + "NT_187546.1": "HSCHR5_2_CTG5", + "NT_167244.2": "HSCHR6_MHC_APD_CTG1", + "NT_187555.1": "HSCHR6_1_CTG7", + "NT_187554.1": "HSCHR6_1_CTG6", + "NW_003315921.1": "HSCHR6_1_CTG2", + "NT_187556.1": "HSCHR6_1_CTG8", + "NT_187557.1": "HSCHR6_1_CTG9", + "NW_004166862.2": "HSCHR6_1_CTG3", + "NT_187552.1": "HSCHR6_1_CTG4", + "NT_187553.1": "HSCHR6_1_CTG5", + "NT_187558.1": "HSCHR7_1_CTG1", + "NT_187561.1": "HSCHR7_2_CTG4_4", + "NT_187559.1": "HSCHR7_1_CTG4_4", + "NW_003315922.2": "HSCHR7_1_CTG6", + "NT_187562.1": "HSCHR7_2_CTG6", + "NT_187564.1": "HSCHR7_3_CTG6", + "NT_187563.1": "HSCHR7_2_CTG7", + "NT_187560.1": "HSCHR7_1_CTG7", + "NT_187572.1": "HSCHR8_4_CTG1", + "NT_187568.1": "HSCHR8_2_CTG1", + "NT_187565.1": "HSCHR8_1_CTG1", + "NT_187576.1": "HSCHR8_8_CTG1", + "NT_187570.1": "HSCHR8_3_CTG1", + "NT_187577.1": "HSCHR8_9_CTG1", + "NT_187566.1": "HSCHR8_1_CTG6", + "NT_187567.1": "HSCHR8_1_CTG7", + "NT_187574.1": "HSCHR8_5_CTG7", + "NT_187575.1": "HSCHR8_6_CTG7", + "NT_187573.1": "HSCHR8_4_CTG7", + "NT_187571.1": "HSCHR8_3_CTG7", + "NT_187569.1": "HSCHR8_2_CTG7", + "NW_003315928.1": "HSCHR9_1_CTG1", + "NW_003315929.1": "HSCHR9_1_CTG2", + "NW_003315930.1": "HSCHR9_1_CTG3", + "NW_003315931.1": "HSCHR9_1_CTG4", + "NT_187578.1": "HSCHR9_1_CTG5", + "NW_003315934.1": "HSCHR10_1_CTG1", + "NT_187579.1": "HSCHR10_1_CTG3", + "NW_003315935.1": "HSCHR10_1_CTG2", + "NT_187580.1": "HSCHR10_1_CTG4", + "NT_187586.1": "HSCHR11_1_CTG8", + "NT_187584.1": "HSCHR11_1_CTG6", + "NT_187585.1": "HSCHR11_1_CTG7", + "NT_187583.1": "HSCHR11_1_CTG5", + "NW_003315936.1": "HSCHR11_1_CTG1_1", + "NW_003871073.1": "HG142_HG150_NOVEL_TEST", + "NW_003871074.1": "HG151_NOVEL_TEST", + "NT_187582.1": "HSCHR11_1_CTG3", + "NT_187581.1": "HSCHR11_1_CTG2", + "NW_003571049.1": "HSCHR12_1_CTG1", + "NW_003571050.1": "HSCHR12_2_CTG2", + "NT_187588.1": "HSCHR12_5_CTG2", + "NW_003315938.1": "HSCHR12_1_CTG2", + "NT_187587.1": "HSCHR12_4_CTG2", + "NW_003315939.2": "HSCHR12_1_CTG2_1", + "NW_003315941.1": "HSCHR12_2_CTG2_1", + "NW_003315942.2": "HSCHR12_3_CTG2_1", + "NT_187590.1": "HSCHR12_6_CTG2_1", + "NW_003315940.1": "HSCHR12_4_CTG2_1", + "NT_187589.1": "HSCHR12_5_CTG2_1", + "NT_187591.1": "HSCHR12_7_CTG2_1", + "NT_187594.1": "HSCHR13_1_CTG3", + "NT_187593.1": "HSCHR13_1_CTG2", + "NT_187597.1": "HSCHR13_1_CTG6", + "NT_187595.1": "HSCHR13_1_CTG4", + "NT_187592.1": "HSCHR13_1_CTG1", + "NT_187596.1": "HSCHR13_1_CTG5", + "NT_187598.1": "HSCHR14_1_CTG1", + "NT_187601.1": "HSCHR14_7_CTG1", + "NT_187599.1": "HSCHR14_2_CTG1", + "NT_187600.1": "HSCHR14_3_CTG1", + "NT_187602.1": "HSCHR15_1_CTG1", + "NT_187604.1": "HSCHR15_3_CTG3", + "NT_187603.1": "HSCHR15_1_CTG3", + "NW_003315943.1": "HSCHR15_1_CTG8", + "NT_187605.1": "HSCHR15_3_CTG8", + "NW_003315944.2": "HSCHR15_2_CTG8", + "NT_187606.1": "HSCHR15_5_CTG8", + "NT_187610.1": "HSCHR16_CTG2", + "NT_187609.1": "HSCHR16_4_CTG1", + "NT_187608.1": "HSCHR16_3_CTG1", + "NT_187607.1": "HSCHR16_1_CTG1", + "NW_003315945.1": "HSCHR16_1_CTG3_1", + "NW_003315946.1": "HSCHR16_2_CTG3_1", + "NW_003315952.3": "HSCHR17_1_CTG1", + "NT_187613.1": "HSCHR17_2_CTG2", + "NT_187611.1": "HSCHR17_1_CTG2", + "NT_187614.1": "HSCHR17_7_CTG4", + "NW_003871091.1": "HSCHR17_4_CTG4", + "NW_003871092.1": "HSCHR17_5_CTG4", + "NW_003315953.2": "HSCHR17_1_CTG4", + "NT_167251.2": "HSCHR17_1_CTG5", + "NW_003315954.1": "HSCHR17_2_CTG4", + "NT_187615.1": "HSCHR17_8_CTG4", + "NT_187616.1": "HSCHR17_9_CTG4", + "NW_003315955.1": "HSCHR17_3_CTG4", + "NT_187612.1": "HSCHR17_1_CTG9", + "NT_187618.1": "HSCHR18_4_CTG1_1", + "NW_003315956.1": "HSCHR18_1_CTG1_1", + "NW_003315959.1": "HSCHR18_2_CTG1_1", + "NW_003315960.1": "HSCHR18_2_CTG2", + "NW_003315957.1": "HSCHR18_1_CTG2", + "NW_003315958.1": "HSCHR18_1_CTG2_1", + "NW_003315961.1": "HSCHR18_2_CTG2_1", + "NT_187617.1": "HSCHR18_3_CTG2_1", + "NT_187622.1": "HSCHR19_5_CTG2", + "NT_187621.1": "HSCHR19_4_CTG2", + "NW_003315962.1": "HSCHR19_1_CTG2", + "NW_003315964.2": "HSCHR19_2_CTG2", + "NW_003315965.1": "HSCHR19_3_CTG2", + "NW_003315963.1": "HSCHR19_1_CTG3_1", + "NT_187619.1": "HSCHR19_2_CTG3_1", + "NT_187620.1": "HSCHR19_3_CTG3_1", + "NW_003571054.1": "HSCHR19LRC_COX1_CTG3_1", + "NW_003315966.2": "HSCHR20_1_CTG1", + "NT_187623.1": "HSCHR20_1_CTG2", + "NT_187625.1": "HSCHR20_1_CTG4", + "NT_187624.1": "HSCHR20_1_CTG3", + "NW_003315967.2": "HSCHR21_1_CTG1_1", + "NT_187628.1": "HSCHR21_8_CTG1_1", + "NT_187627.1": "HSCHR21_6_CTG1_1", + "NW_003315968.2": "HSCHR21_2_CTG1_1", + "NW_003315969.2": "HSCHR21_3_CTG1_1", + "NW_003315970.2": "HSCHR21_4_CTG1_1", + "NT_187626.1": "HSCHR21_5_CTG2", + "NT_187629.1": "HSCHR22_1_CTG3", + "NT_187632.1": "HSCHR22_1_CTG6", + "NT_187633.1": "HSCHR22_1_CTG7", + "NT_187630.1": "HSCHR22_1_CTG4", + "NT_187631.1": "HSCHR22_1_CTG5", + "NW_003315972.2": "HSCHR22_1_CTG2", + "NW_003315971.2": "HSCHR22_1_CTG1", + "NT_187634.1": "HSCHRX_1_CTG3", + "NT_187635.1": "HSCHRX_2_CTG12", + "NT_187646.1": "HSCHR1_ALT2_1_CTG32_1", + "NT_187648.1": "HSCHR2_2_CTG7", + "NT_187647.1": "HSCHR2_2_CTG15", + "NT_187649.1": "HSCHR3_3_CTG3", + "NT_187650.1": "HSCHR4_6_CTG12", + "NT_187651.1": "HSCHR5_1_CTG1_1", + "NT_187652.1": "HSCHR5_3_CTG5", + "NT_113891.3": "HSCHR6_MHC_COX_CTG1", + "NT_187653.1": "HSCHR7_2_CTG1", + "NT_187655.1": "HSCHR8_6_CTG1", + "NT_187654.1": "HSCHR8_5_CTG1", + "NT_187656.1": "HSCHR11_2_CTG1", + "NT_187657.1": "HSCHR11_2_CTG1_1", + "NT_187658.1": "HSCHR12_3_CTG2", + "NT_187659.1": "HSCHR15_2_CTG3", + "NT_187660.1": "HSCHR15_4_CTG8", + "NT_187662.1": "HSCHR17_2_CTG1", + "NT_187664.1": "HSCHR17_3_CTG2", + "NT_187661.1": "HSCHR17_10_CTG4", + "NW_003871093.1": "HSCHR17_6_CTG4", + "NT_187663.1": "HSCHR17_2_CTG5", + "NT_187665.1": "HSCHR18_ALT21_CTG2_1", + "NT_187666.1": "HSCHR18_ALT2_CTG2_1", + "NW_003571055.2": "HSCHR19LRC_COX2_CTG3_1", + "NW_004504305.1": "HSCHR22_2_CTG1", + "NT_187667.1": "HSCHRX_2_CTG3", + "NT_187678.1": "HSCHR3_4_CTG3", + "NT_187679.1": "HSCHR4_7_CTG12", + "NT_167245.2": "HSCHR6_MHC_DBB_CTG1", + "NT_187680.1": "HSCHR8_7_CTG1", + "NT_187681.1": "HSCHR11_3_CTG1", + "NW_003571056.2": "HSCHR19LRC_LRC_I_CTG3_1", + "NT_187682.1": "HSCHR22_3_CTG1", + "NT_187688.1": "HSCHR3_5_CTG3", + "NT_167246.2": "HSCHR6_MHC_MANN_CTG1", + "NW_003571057.2": "HSCHR19LRC_LRC_J_CTG3_1", + "NT_187689.1": "HSCHR3_6_CTG3", + "NT_167247.2": "HSCHR6_MHC_MCF_CTG1", + "NW_003571058.2": "HSCHR19LRC_LRC_S_CTG3_1", + "NT_187690.1": "HSCHR3_7_CTG3", + "NT_167248.2": "HSCHR6_MHC_QBL_CTG1", + "NW_003571059.2": "HSCHR19LRC_LRC_T_CTG3_1", + "NT_187691.1": "HSCHR3_8_CTG3", + "NT_167249.2": "HSCHR6_MHC_SSTO_CTG1", + "NW_003571060.1": "HSCHR19LRC_PGF1_CTG3_1", + "NT_187692.1": "HSCHR6_8_CTG1", + "NW_003571061.2": "HSCHR19LRC_PGF2_CTG3_1", + "NT_187693.1": "HSCHR19_4_CTG3_1", + "NT_187636.1": "HSCHR19KIR_FH15_B_HAP_CTG3_1", + "NT_187637.1": "HSCHR19KIR_G085_A_HAP_CTG3_1", + "NT_187638.1": "HSCHR19KIR_G085_BA1_HAP_CTG3_1", + "NT_187639.1": "HSCHR19KIR_G248_A_HAP_CTG3_1", + "NT_187640.1": "HSCHR19KIR_G248_BA2_HAP_CTG3_1", + "NT_187641.1": "HSCHR19KIR_GRC212_AB_HAP_CTG3_1", + "NT_187642.1": "HSCHR19KIR_GRC212_BA1_HAP_CTG3_1", + "NT_187643.1": "HSCHR19KIR_LUCE_A_HAP_CTG3_1", + "NT_187644.1": "HSCHR19KIR_LUCE_BDEL_HAP_CTG3_1", + "NT_187645.1": "HSCHR19KIR_RSH_A_HAP_CTG3_1", + "NT_187668.1": "HSCHR19KIR_RSH_BA2_HAP_CTG3_1", + "NT_187669.1": "HSCHR19KIR_T7526_A_HAP_CTG3_1", + "NT_187670.1": "HSCHR19KIR_T7526_BDEL_HAP_CTG3_1", + "NT_187671.1": "HSCHR19KIR_ABC08_A1_HAP_CTG3_1", + "NT_187672.1": "HSCHR19KIR_ABC08_AB_HAP_C_P_CTG3_1", + "NT_187673.1": "HSCHR19KIR_ABC08_AB_HAP_T_P_CTG3_1", + "NT_187674.1": "HSCHR19KIR_FH05_A_HAP_CTG3_1", + "NT_187675.1": "HSCHR19KIR_FH05_B_HAP_CTG3_1", + "NT_187676.1": "HSCHR19KIR_FH06_A_HAP_CTG3_1", + "NT_187677.1": "HSCHR19KIR_FH06_BA1_HAP_CTG3_1", + "NT_187683.1": "HSCHR19KIR_FH08_A_HAP_CTG3_1", + "NT_187684.1": "HSCHR19KIR_FH08_BAX_HAP_CTG3_1", + "NT_187685.1": "HSCHR19KIR_FH13_A_HAP_CTG3_1", + "NT_187686.1": "HSCHR19KIR_FH13_BA2_HAP_CTG3_1", + "NT_187687.1": "HSCHR19KIR_FH15_A_HAP_CTG3_1", + "NT_113949.2": "HSCHR19KIR_RP5_B_HAP_CTG3_1", + "NT_167235.1": "HSCHR22_CTG1_3", + "NW_025791756.1": "HG1343_HG173_HG459_PATCH", + "NW_025791753.1": "HSCHR1_12_CTG3", + "NW_025791758.1": "HG2515_PATCH", + "NW_025791759.1": "HG2577_PATCH", + "NW_025791754.1": "HSCHR1_5_CTG31", + "NW_025791757.1": "HG2571_PATCH", + "NW_025791755.1": "HSCHR1_6_CTG31", + "NW_021159988.1": "HG1384_PATCH", + "NW_025791767.1": "HG2231_HG2496_PATCH", + "NW_025791766.1": "HG2052_PATCH", + "NW_025791763.1": "HSCHR2_6_CTG1", + "NW_025791760.1": "HSCHR2_10_CTG7_2", + "NW_025791765.1": "HG2275_PATCH", + "NW_025791762.1": "HSCHR2_12_CTG7_2", + "NW_025791761.1": "HSCHR2_11_CTG7_2", + "NW_025791764.1": "HG2494_PATCH", + "NW_025791770.1": "HG2077_PATCH", + "NW_025791771.1": "HG2069_PATCH", + "NW_025791769.1": "HG2264_PATCH", + "NW_025791774.1": "HG287_PATCH", + "NW_025791772.1": "HSCHR4_2_CTG8_1", + "NW_025791773.1": "HG2155_PATCH", + "NW_025791776.1": "HG2476_PATCH", + "NW_025791779.1": "HSCHR5_10_CTG1", + "NW_021159996.1": "HG1395_PATCH", + "NW_025791778.1": "HG2308_PATCH", + "NW_025791775.1": "HG1046_PATCH", + "NW_025791780.1": "HSCHR6_1_CTG1", + "NW_025791781.1": "HSCHR7_4_CTG1", + "NW_025791782.1": "HG2176_PATCH", + "NW_025791784.1": "HG2408_PATCH", + "NW_025791783.1": "HG1047_PATCH", + "NW_025791789.1": "HG1206_PATCH", + "NW_025791787.1": "HG2158_PATCH", + "NW_025791788.1": "HG1012_PATCH", + "NW_025791790.1": "HG2576_PATCH", + "NW_015148966.2": "HG107_HG2565_PATCH", + "NW_025791792.1": "HG152_PATCH", + "NW_021160004.1": "HG28_PATCH", + "NW_025791794.1": "HG2578_PATCH", + "NW_021160005.1": "HG2115_PATCH", + "NW_025791791.1": "HSCHR11_2_CTG3_1", + "NW_021160008.1": "HG1398_PATCH", + "NW_025791795.1": "HG2554_PATCH", + "NW_021160007.1": "HG2246_HG2248_HG2276_PATCH", + "NW_021160012.1": "HG2509_PATCH", + "NW_021160013.1": "HG2510_PATCH", + "NW_025791796.1": "HG2526_HG2573_PATCH", + "NW_021160018.1": "HG2511_PATCH", + "NW_021160017.1": "HG2365_PATCH", + "NW_025791798.1": "HSCHR15_9_CTG8", + "NW_021160016.1": "HG2198_PATCH", + "NW_025791797.1": "HG2280_PATCH", + "NW_021160015.1": "HG2499_PATCH", + "NW_021160019.1": "HG2471_PATCH", + "NW_025791800.1": "HG405_PATCH", + "NW_021160020.1": "HG2087_PATCH", + "NW_025791803.1": "HG2407_PATCH", + "NW_025791801.1": "HSCHR17_13_CTG4", + "NW_025791806.1": "HG2580_PATCH", + "NW_025791802.1": "HG2118_PATCH", + "NW_025791805.1": "HG1369_PATCH", + "NW_021160021.1": "HG1320_PATCH", + "NW_025791804.1": "HG2251_PATCH", + "NW_025791810.1": "HSCHR19_6_CTG2", + "NW_025791807.1": "HG2461_PATCH", + "NW_021160022.1": "HG109_PATCH", + "NW_025791808.1": "HG2569_PATCH", + "NW_025791811.1": "HG2225_PATCH", + "NW_025791812.1": "HG410_PATCH", + "NW_021160023.1": "HG2513_PATCH", + "NW_025791813.1": "HG2219_PATCH", + "NW_025791814.1": "HG2265_PATCH", + "NW_025791815.1": "HG2521_PATCH", + "NW_021160026.1": "HG2512_PATCH", + "NW_021160024.1": "HG1485_PATCH", + "NW_021160025.1": "HG494_PATCH", + "NW_021160031.1": "HG1466_PATCH", + "NW_025791820.1": "HSCHRX_3_CTG3", + "NW_021160028.1": "HG1506_PATCH", + "NW_025791816.1": "HG2527_PATCH", + "NW_021160029.1": "HG1507_PATCH", + "NW_025791817.1": "HG2541_PATCH", + "NW_021160027.1": "HG439_PATCH", + "NW_025791819.1": "HSCHRX_2_CTG14", + "NW_021160030.1": "HG1509_PATCH", + "NW_025791818.1": "HSCHRX_1_CTG14", + "NW_025791821.1": "HG1532_PATCH", + "NW_025791809.1": "HG2469_PATCH", + "NW_025791777.1": "HG2405_PATCH"} def is_supported_for_mapping(ac, primary_assembly): - """Check whether an accession is supported for chromosome mapping. + '''Check whether an accession is supported for chromosome mapping. Determines whether the supplied RefSeq accession can be mapped to a chromosome or alternative-locus identifier for the requested genome @@ -3335,14 +3327,14 @@ def is_supported_for_mapping(ac, primary_assembly): Returns: bool: ``True`` if the accession can be mapped for the requested assembly; otherwise ``False``. - """ + ''' return ( get_chr_num_refseq(ac, primary_assembly) is not None or get_chr_num_ucsc(ac, primary_assembly) is not None ) def get_accession(chr_num, primary_assembly): - """Return the RefSeq accession for a genomic sequence identifier. + '''Return the RefSeq accession for a genomic sequence identifier. Converts a chromosome, alternative-locus, or patch identifier to its corresponding RefSeq genomic accession for the requested genome assembly. A leading ``chr`` prefix is accepted and removed before lookup. @@ -3355,19 +3347,19 @@ def get_accession(chr_num, primary_assembly): Returns: str | None: The corresponding RefSeq genomic accession, or ``None`` if the identifier or genome assembly is not supported. - """ - if chr_num.upper().startswith("CHR"): + ''' + if chr_num.upper().startswith('CHR'): chr_num = chr_num[3:] - if primary_assembly == "GRCh37": + if primary_assembly == 'GRCh37': return _get_accession_GRCh37.get(chr_num) - if primary_assembly == "hg19": + if primary_assembly == 'hg19': return _get_accession_hg19.get(chr_num) - if primary_assembly in ("GRCh38", "hg38"): + if primary_assembly in ('GRCh38', 'hg38'): return _get_accession_GRCh38.get(chr_num) return None def get_chr_num_ucsc(accession, primary_assembly): - """Return the UCSC sequence identifier for a RefSeq genomic accession. + '''Return the UCSC sequence identifier for a RefSeq genomic accession. Converts a RefSeq genomic accession to the corresponding UCSC chromosome, alternative-locus, or patch identifier for the requested UCSC genome assembly. UCSC aliases for alternative loci and patches may differ from @@ -3379,15 +3371,15 @@ def get_chr_num_ucsc(accession, primary_assembly): Returns: str | None: The corresponding UCSC sequence identifier, or ``None`` if the accession or genome assembly is not supported. - """ - if primary_assembly == "hg19": + ''' + if primary_assembly == 'hg19': return _ucsc_to_chr_num_hg19.get(accession) - if primary_assembly == "hg38": + if primary_assembly == 'hg38': return _ucsc_to_chr_num_hg38.get(accession) return None def get_chr_num_refseq(accession, primary_assembly): - """Return the RefSeq/GenBank sequence identifier for a genomic accession. + '''Return the RefSeq/GenBank sequence identifier for a genomic accession. Converts a RefSeq genomic accession to the corresponding chromosome, alternative-locus, or patch identifier used by the RefSeq/GenBank genome assembly. GRCh and UCSC assembly names are accepted as aliases for @@ -3401,14 +3393,13 @@ def get_chr_num_refseq(accession, primary_assembly): Returns: str | None: The corresponding RefSeq/GenBank sequence identifier, or ``None`` if the accession or genome assembly is not supported. - """ - if primary_assembly in ("GRCh37", "hg19"): + ''' + if primary_assembly in ('GRCh37', 'hg19'): return _refseq_to_chr_num_grch37.get(accession) - if primary_assembly in ("GRCh38", "hg38"): + if primary_assembly in ('GRCh38', 'hg38'): return _refseq_to_chr_num_grch38.get(accession) return None - # Copyright (C) 2016-2026 VariantValidator Contributors # This file is part of VariantValidator and is distributed under the # GNU Affero General Public License, version 3 or (at your option) any diff --git a/tests/variantvalidator/test_inputs_ensembl.py b/tests/variantvalidator/test_inputs_ensembl.py deleted file mode 100644 index e3c4a7ab..00000000 --- a/tests/variantvalidator/test_inputs_ensembl.py +++ /dev/null @@ -1,638 +0,0 @@ -from VariantValidator import Validator -from unittest import TestCase - - -class TestVariantsEnsembl(TestCase): - - @classmethod - def setup_class(cls): - cls.vv = Validator() - - # COL1A1 - def test_variant1(self): - variant = 'ENST00000225964.10:c.589-1GG>G' - results = self.vv.validate(variant, 'GRCh38', 'all', transcript_set="ensembl").format_as_dict(test=True) - print(results) - - assert results['flag'] == 'gene_variant' - assert 'ENST00000225964.10:c.590del' in list(results.keys()) - assert results['ENST00000225964.10:c.590del']['submitted_variant'] == 'ENST00000225964.10:c.589-1GG>G' - assert results['ENST00000225964.10:c.590del']['gene_symbol'] == 'COL1A1' - assert results['ENST00000225964.10:c.590del']['gene_ids'] == {'hgnc_id': 'HGNC:2197', 'entrez_gene_id': '1277', - 'ucsc_id': 'uc002iqm.4', 'omim_id': ['120150']} - assert results['ENST00000225964.10:c.590del']['hgvs_transcript_variant'] == 'ENST00000225964.10:c.590del' - assert results['ENST00000225964.10:c.590del']['genome_context_intronic_sequence'] == '' - # assert results['ENST00000225964.10:c.590del']['refseqgene_context_intronic_sequence'] == '' - # assert results['ENST00000225964.10:c.590del']['hgvs_refseqgene_variant'] == 'NG_007400.1:g.8639del' - assert results['ENST00000225964.10:c.590del']['hgvs_predicted_protein_consequence'] == { - 'tlr': 'ENSP00000225964.6:p.(Gly197ValfsTer68)', 'slr': 'ENSP00000225964.6:p.(G197Vfs*68)'} - # assert results['ENST00000225964.10:c.590del']['hgvs_lrg_transcript_variant'] == 'LRG_1t1:c.590del' - # assert results['ENST00000225964.10:c.590del']['hgvs_lrg_variant'] == 'LRG_1:g.8639del' - self.assertCountEqual(results['ENST00000225964.10:c.590del']['alt_genomic_loci'], []) - # assert results['ENST00000225964.10:c.590del']['primary_assembly_loci']['hg19'] == { - # 'hgvs_genomic_description': 'NC_000017.10:g.48275364del', - # 'vcf': {'chr': 'chr17', 'pos': '48275361', 'ref': 'AC', 'alt': 'A'}} - assert results['ENST00000225964.10:c.590del']['primary_assembly_loci']['hg38'] == { - 'hgvs_genomic_description': 'NC_000017.11:g.50198003del', - 'vcf': {'chr': 'chr17', 'pos': '50198000', 'ref': 'AC', 'alt': 'A'}} - # assert results['ENST00000225964.10:c.590del']['primary_assembly_loci']['grch37'] == { - # 'hgvs_genomic_description': 'NC_000017.10:g.48275364del', - # 'vcf': {'chr': '17', 'pos': '48275361', 'ref': 'AC', 'alt': 'A'}} - assert results['ENST00000225964.10:c.590del']['primary_assembly_loci']['grch38'] == { - 'hgvs_genomic_description': 'NC_000017.11:g.50198003del', - 'vcf': {'chr': '17', 'pos': '50198000', 'ref': 'AC', 'alt': 'A'}} - assert results['ENST00000225964.10:c.590del']['reference_sequence_records'] == { - 'transcript': 'https://www.ensembl.org/Homo_sapiens/Transcript/Summary?db=core;t=ENST00000225964.10', - 'protein': 'https://www.ensembl.org/Homo_sapiens/Transcript/ProteinSummary?db=core;p=ENSP00000225964.6', - } - - # COL5A1 - def test_variant2(self): - variant = 'ENST00000371817.8:c.5071A>T' - results = self.vv.validate(variant, 'GRCh38', 'all', transcript_set="ensembl").format_as_dict(test=True) - print(results) - - assert results['flag'] == 'gene_variant' - assert 'ENST00000371817.8:c.5071A>T' in list(results.keys()) - assert results['ENST00000371817.8:c.5071A>T']['submitted_variant'] == 'ENST00000371817.8:c.5071A>T' - assert results['ENST00000371817.8:c.5071A>T']['gene_symbol'] == 'COL5A1' - assert results['ENST00000371817.8:c.5071A>T']['gene_ids'] == {'hgnc_id': 'HGNC:2209', 'entrez_gene_id': '1289', - 'ucsc_id': 'uc004cfe.5', 'omim_id': ['120215']} - assert results['ENST00000371817.8:c.5071A>T']['hgvs_transcript_variant'] == 'ENST00000371817.8:c.5071A>T' - assert results['ENST00000371817.8:c.5071A>T']['genome_context_intronic_sequence'] == '' - # assert results['ENST00000371817.8:c.5071A>T']['refseqgene_context_intronic_sequence'] == '' - # assert results['ENST00000371817.8:c.5071A>T']['hgvs_refseqgene_variant'] == '' - assert results['ENST00000371817.8:c.5071A>T']['hgvs_predicted_protein_consequence'] == { - 'tlr': 'ENSP00000360882.3:p.(Arg1691Ter)', 'slr': 'ENSP00000360882.3:p.(R1691*)'} - # assert results['ENST00000371817.8:c.5071A>T']['hgvs_lrg_transcript_variant'] == '' - # assert results['ENST00000371817.8:c.5071A>T']['hgvs_lrg_variant'] == '' - self.assertCountEqual(results['ENST00000371817.8:c.5071A>T']['alt_genomic_loci'], []) - # assert results['ENST00000371817.8:c.5071A>T']['primary_assembly_loci']['hg19'] == { - # 'hgvs_genomic_description': 'NC_000009.11:g.137721825A>T', - # 'vcf': {'chr': 'chr9', 'pos': '137721825', 'ref': 'A', 'alt': 'T'}} - assert results['ENST00000371817.8:c.5071A>T']['primary_assembly_loci']['hg38'] == { - 'hgvs_genomic_description': 'NC_000009.12:g.134829979A>T', - 'vcf': {'chr': 'chr9', 'pos': '134829979', 'ref': 'A', 'alt': 'T'}} - # assert results['ENST00000371817.8:c.5071A>T']['primary_assembly_loci']['grch37'] == { - # 'hgvs_genomic_description': 'NC_000009.11:g.137721825A>T', - # 'vcf': {'chr': '9', 'pos': '137721825', 'ref': 'A', 'alt': 'T'}} - assert results['ENST00000371817.8:c.5071A>T']['primary_assembly_loci']['grch38'] == { - 'hgvs_genomic_description': 'NC_000009.12:g.134829979A>T', - 'vcf': {'chr': '9', 'pos': '134829979', 'ref': 'A', 'alt': 'T'}} - assert results['ENST00000371817.8:c.5071A>T']['reference_sequence_records'] == { - 'transcript': 'https://www.ensembl.org/Homo_sapiens/Transcript/Summary?db=core;t=ENST00000371817.8', - 'protein': 'https://www.ensembl.org/Homo_sapiens/Transcript/ProteinSummary?db=core;p=ENSP00000360882.3'} - - # TP53 - def test_variant3(self): - variant = 'ENST00000269305.9:c.652_654del' - results = self.vv.validate(variant, 'GRCh38', 'all', transcript_set="ensembl").format_as_dict(test=True) - print(results) - - assert results['flag'] == 'gene_variant' - assert 'ENST00000269305.9:c.652_654del' in list(results.keys()) - assert results['ENST00000269305.9:c.652_654del']['submitted_variant'] == 'ENST00000269305.9:c.652_654del' - assert results['ENST00000269305.9:c.652_654del']['gene_symbol'] == 'TP53' - assert results['ENST00000269305.9:c.652_654del']['gene_ids'] == {'hgnc_id': 'HGNC:11998', 'entrez_gene_id': '7157', - 'ucsc_id': 'uc060aur.1', 'omim_id': ['191170']} - assert results['ENST00000269305.9:c.652_654del']['hgvs_transcript_variant'] == 'ENST00000269305.9:c.652_654del' - assert results['ENST00000269305.9:c.652_654del']['genome_context_intronic_sequence'] == '' - # assert results['ENST00000269305.9:c.652_654del']['refseqgene_context_intronic_sequence'] == '' - # assert results['ENST00000269305.9:c.652_654del']['hgvs_refseqgene_variant'] == 'NG_017013.2:g.17672_17674del' - assert results['ENST00000269305.9:c.652_654del']['hgvs_predicted_protein_consequence'] == { - 'tlr': 'ENSP00000269305.4:p.(Val218del)', 'slr': 'ENSP00000269305.4:p.(V218del)'} - # assert results['ENST00000269305.9:c.652_654del']['hgvs_lrg_transcript_variant'] == 'LRG_321t1:c.652_654del' - # assert results['ENST00000269305.9:c.652_654del']['hgvs_lrg_variant'] == 'LRG_321:g.17672_17674del' - self.assertCountEqual(results['ENST00000269305.9:c.652_654del']['alt_genomic_loci'], []) - # assert results['ENST00000269305.9:c.652_654del']['primary_assembly_loci']['hg19'] == { - # 'hgvs_genomic_description': 'NC_000017.10:g.7578201_7578203del', - # 'vcf': {'chr': 'chr17', 'pos': '7578194', 'ref': 'GCAC', 'alt': 'G'}} - assert results['ENST00000269305.9:c.652_654del']['primary_assembly_loci']['hg38'] == { - 'hgvs_genomic_description': 'NC_000017.11:g.7674883_7674885del', - 'vcf': {'chr': 'chr17', 'pos': '7674876', 'ref': 'GCAC', 'alt': 'G'}} - # assert results['ENST00000269305.9:c.652_654del']['primary_assembly_loci']['grch37'] == { - # 'hgvs_genomic_description': 'NC_000017.10:g.7578201_7578203del', - # 'vcf': {'chr': '17', 'pos': '7578194', 'ref': 'GCAC', 'alt': 'G'}} - assert results['ENST00000269305.9:c.652_654del']['primary_assembly_loci']['grch38'] == { - 'hgvs_genomic_description': 'NC_000017.11:g.7674883_7674885del', - 'vcf': {'chr': '17', 'pos': '7674876', 'ref': 'GCAC', 'alt': 'G'}} - assert results['ENST00000269305.9:c.652_654del']['reference_sequence_records'] == { - 'transcript': 'https://www.ensembl.org/Homo_sapiens/Transcript/Summary?db=core;t=ENST00000269305.9', - 'protein': 'https://www.ensembl.org/Homo_sapiens/Transcript/ProteinSummary?db=core;p=ENSP00000269305.4' - #'refseqgene': 'https://www.ncbi.nlm.nih.gov/nuccore/NG_017013.2', - #'lrg': 'http://ftp.ebi.ac.uk/pub/databases/lrgex/LRG_321.xml' - } - - # P3H1 - def test_variant4(self): - variant = 'ENST00000296388.10:c.2055+18G>A' - results = self.vv.validate(variant, 'GRCh38', 'all', transcript_set="ensembl").format_as_dict(test=True) - print(results) - - assert results['flag'] == 'gene_variant' - assert 'ENST00000296388.10:c.2055+18G>A' in list(results.keys()) - assert results['ENST00000296388.10:c.2055+18G>A']['submitted_variant'] == 'ENST00000296388.10:c.2055+18G>A' - assert results['ENST00000296388.10:c.2055+18G>A']['gene_symbol'] == 'P3H1' - assert results['ENST00000296388.10:c.2055+18G>A']['gene_ids'] == {'hgnc_id': 'HGNC:19316', 'entrez_gene_id': '64175', - 'ucsc_id': '', 'omim_id': ['610339']} - assert results['ENST00000296388.10:c.2055+18G>A']['hgvs_transcript_variant'] == 'ENST00000296388.10:c.2055+18G>A' - assert results['ENST00000296388.10:c.2055+18G>A']['genome_context_intronic_sequence'] == 'NC_000001.11(ENST00000296388.10):c.2055+18G>A' - # assert results['ENST00000296388.10:c.2055+18G>A'][ - # 'refseqgene_context_intronic_sequence'] == 'NG_008123.1(ENST00000296388.10):c.2055+18G>A' - # assert results['ENST00000296388.10:c.2055+18G>A']['hgvs_refseqgene_variant'] == 'NG_008123.1:g.24831G>A' - assert results['ENST00000296388.10:c.2055+18G>A']['hgvs_predicted_protein_consequence'] == { - 'tlr': 'ENSP00000296388.5:p.?', 'slr': 'ENSP00000296388.5:p.?'} - # assert results['ENST00000296388.10:c.2055+18G>A']['hgvs_lrg_transcript_variant'] == 'LRG_5t1:c.2055+18G>A' - # assert results['ENST00000296388.10:c.2055+18G>A']['hgvs_lrg_variant'] == 'LRG_5:g.24831G>A' - self.assertCountEqual(results['ENST00000296388.10:c.2055+18G>A']['alt_genomic_loci'], []) - # assert results['ENST00000296388.10:c.2055+18G>A']['primary_assembly_loci']['hg19'] == { - # 'hgvs_genomic_description': 'NC_000001.10:g.43212925C>T', - # 'vcf': {'chr': 'chr1', 'pos': '43212925', 'ref': 'C', 'alt': 'T'}} - assert results['ENST00000296388.10:c.2055+18G>A']['primary_assembly_loci']['hg38'] == { - 'hgvs_genomic_description': 'NC_000001.11:g.42747254C>T', - 'vcf': {'chr': 'chr1', 'pos': '42747254', 'ref': 'C', 'alt': 'T'}} - # assert results['ENST00000296388.10:c.2055+18G>A']['primary_assembly_loci']['grch37'] == { - # 'hgvs_genomic_description': 'NC_000001.10:g.43212925C>T', - # 'vcf': {'chr': '1', 'pos': '43212925', 'ref': 'C', 'alt': 'T'}} - assert results['ENST00000296388.10:c.2055+18G>A']['primary_assembly_loci']['grch38'] == { - 'hgvs_genomic_description': 'NC_000001.11:g.42747254C>T', - 'vcf': {'chr': '1', 'pos': '42747254', 'ref': 'C', 'alt': 'T'}} - assert results['ENST00000296388.10:c.2055+18G>A']['reference_sequence_records'] == { - 'transcript': 'https://www.ensembl.org/Homo_sapiens/Transcript/Summary?db=core;t=ENST00000296388.10', - 'protein': 'https://www.ensembl.org/Homo_sapiens/Transcript/ProteinSummary?db=core;p=ENSP00000296388.5' - } - - # BRCA1 - def test_variant5(self): - variant = 'ENST00000357654.9:c.301+1G>C' - results = self.vv.validate(variant, 'GRCh38', 'all', transcript_set="ensembl").format_as_dict(test=True) - print(results) - - assert 'ENST00000357654.9:c.301+1G>C' in list(results.keys()) - assert results['ENST00000357654.9:c.301+1G>C']['submitted_variant'] == 'ENST00000357654.9:c.301+1G>C' - assert results['ENST00000357654.9:c.301+1G>C']['gene_symbol'] == 'BRCA1' - assert results['ENST00000357654.9:c.301+1G>C']['gene_ids'] == {'hgnc_id': 'HGNC:1100', 'entrez_gene_id': '672', - 'ucsc_id': 'uc002ict.4', 'omim_id': ['113705']} - assert results['ENST00000357654.9:c.301+1G>C']['hgvs_transcript_variant'] == 'ENST00000357654.9:c.301+1G>C' - assert results['ENST00000357654.9:c.301+1G>C'][ - 'genome_context_intronic_sequence'] == 'NC_000017.11(ENST00000357654.9):c.301+1G>C' - # assert results['ENST00000357654.9:c.301+1G>C'][ - # 'refseqgene_context_intronic_sequence'] == 'NG_005905.2(ENST00000357654.9):c.301+1G>C' - # assert results['ENST00000357654.9:c.301+1G>C']['hgvs_refseqgene_variant'] == 'NG_005905.2:g.113117G>C' - assert results['ENST00000357654.9:c.301+1G>C']['hgvs_predicted_protein_consequence'] == { - 'tlr': 'ENSP00000350283.3:p.?', 'slr': 'ENSP00000350283.3:p.?'} - # assert results['ENST00000357654.9:c.301+1G>C']['hgvs_lrg_transcript_variant'] == 'LRG_292t1:c.301+1G>C' - # assert results['ENST00000357654.9:c.301+1G>C']['hgvs_lrg_variant'] == 'LRG_292:g.113117G>C' - self.assertCountEqual(results['ENST00000357654.9:c.301+1G>C']['alt_genomic_loci'], []) - # assert results['ENST00000357654.9:c.301+1G>C']['primary_assembly_loci']['hg19'] == { - # 'hgvs_genomic_description': 'NC_000017.10:g.41256884C>G', - # 'vcf': {'chr': 'chr17', 'pos': '41256884', 'ref': 'C', 'alt': 'G'}} - assert results['ENST00000357654.9:c.301+1G>C']['primary_assembly_loci']['hg38'] == { - 'hgvs_genomic_description': 'NC_000017.11:g.43104867C>G', - 'vcf': {'chr': 'chr17', 'pos': '43104867', 'ref': 'C', 'alt': 'G'}} - # assert results['ENST00000357654.9:c.301+1G>C']['primary_assembly_loci']['grch37'] == { - # 'hgvs_genomic_description': 'NC_000017.10:g.41256884C>G', - # 'vcf': {'chr': '17', 'pos': '41256884', 'ref': 'C', 'alt': 'G'}} - assert results['ENST00000357654.9:c.301+1G>C']['primary_assembly_loci']['grch38'] == { - 'hgvs_genomic_description': 'NC_000017.11:g.43104867C>G', - 'vcf': {'chr': '17', 'pos': '43104867', 'ref': 'C', 'alt': 'G'}} - assert results['ENST00000357654.9:c.301+1G>C']['reference_sequence_records'] == { - 'transcript': 'https://www.ensembl.org/Homo_sapiens/Transcript/Summary?db=core;t=ENST00000357654.9', - 'protein': 'https://www.ensembl.org/Homo_sapiens/Transcript/ProteinSummary?db=core;p=ENSP00000350283.3' - } - - # BRCA2 - def test_variant6(self): - variant = 'NC_000013.10:g.32929387T>C' - results = self.vv.validate(variant, 'GRCh37', 'all', transcript_set="ensembl").format_as_dict(test=True) - print(results) - - assert results['flag'] == 'gene_variant' - assert 'ENST00000380152.3:c.7397T>C' in list(results.keys()) - assert results['ENST00000380152.3:c.7397T>C']['submitted_variant'] == 'NC_000013.10:g.32929387T>C' - assert results['ENST00000380152.3:c.7397T>C']['gene_symbol'] == 'BRCA2' - assert results['ENST00000380152.3:c.7397T>C']['gene_ids'] == {'hgnc_id': 'HGNC:1101', 'entrez_gene_id': '675', - 'ucsc_id': 'uc001uub.2', 'omim_id': ['600185']} - assert results['ENST00000380152.3:c.7397T>C']['hgvs_transcript_variant'] == 'ENST00000380152.3:c.7397T>C' - assert results['ENST00000380152.3:c.7397T>C']['genome_context_intronic_sequence'] == '' - # assert results['ENST00000380152.3:c.7397T>C']['refseqgene_context_intronic_sequence'] == '' - # assert results['ENST00000380152.3:c.7397T>C']['hgvs_refseqgene_variant'] == 'NG_012772.3:g.44771=' - assert results['ENST00000380152.3:c.7397T>C']['hgvs_predicted_protein_consequence'] == { - "tlr": "ENSP00000369497.3:p.(Val2466Ala)", - "slr": "ENSP00000369497.3:p.(V2466A)" - } - # assert results['ENST00000380152.3:c.7397T>C']['hgvs_lrg_transcript_variant'] == 'LRG_293t1:c.7397T>C' - # assert results['ENST00000380152.3:c.7397T>C']['hgvs_lrg_variant'] == 'LRG_293:g.44771=' - self.assertCountEqual(results['ENST00000380152.3:c.7397T>C']['alt_genomic_loci'], []) - assert results['ENST00000380152.3:c.7397T>C']['primary_assembly_loci']['hg19'] == { - 'hgvs_genomic_description': 'NC_000013.10:g.32929387T>C', - 'vcf': {'chr': 'chr13', 'pos': '32929387', 'ref': 'T', 'alt': 'C'}} - # assert results['ENST00000380152.3:c.7397T>C']['primary_assembly_loci']['hg38'] == { - # 'hgvs_genomic_description': 'NC_000013.11:g.32355250T>C', - # 'vcf': {'chr': 'chr13', 'pos': '32355250', 'ref': 'T', 'alt': 'C'}} - assert results['ENST00000380152.3:c.7397T>C']['primary_assembly_loci']['grch37'] == { - 'hgvs_genomic_description': 'NC_000013.10:g.32929387T>C', - 'vcf': {'chr': '13', 'pos': '32929387', 'ref': 'T', 'alt': 'C'}} - # assert results['ENST00000380152.3:c.7397T>C']['primary_assembly_loci']['grch38'] == { - # 'hgvs_genomic_description': 'NC_000013.11:g.32355250T>C', - # 'vcf': {'chr': '13', 'pos': '32355250', 'ref': 'T', 'alt': 'C'}} - - assert results['flag'] == 'gene_variant' - assert 'ENST00000544455.1:c.7397T>C' in list(results.keys()) - assert results['ENST00000544455.1:c.7397T>C']['submitted_variant'] == 'NC_000013.10:g.32929387T>C' - assert results['ENST00000544455.1:c.7397T>C']['gene_symbol'] == 'BRCA2' - assert results['ENST00000544455.1:c.7397T>C']['gene_ids'] == {'hgnc_id': 'HGNC:1101', 'entrez_gene_id': '675', - 'ucsc_id': 'uc001uub.2', 'omim_id': ['600185']} - assert results['ENST00000544455.1:c.7397T>C']['hgvs_transcript_variant'] == 'ENST00000544455.1:c.7397T>C' - assert results['ENST00000544455.1:c.7397T>C']['genome_context_intronic_sequence'] == '' - # assert results['ENST00000544455.1:c.7397T>C']['refseqgene_context_intronic_sequence'] == '' - # assert results['ENST00000544455.1:c.7397T>C']['hgvs_refseqgene_variant'] == 'NG_012772.3:g.44771=' - assert results['ENST00000544455.1:c.7397T>C']['hgvs_predicted_protein_consequence'] == { - 'tlr': 'ENSP00000439902.1:p.(Val2466Ala)', 'slr': 'ENSP00000439902.1:p.(V2466A)'} - # assert results['ENST00000544455.1:c.7397T>C']['hgvs_lrg_transcript_variant'] == 'LRG_293t1:c.7397T>C' - # assert results['ENST00000544455.1:c.7397T>C']['hgvs_lrg_variant'] == 'LRG_293:g.44771=' - self.assertCountEqual(results['ENST00000544455.1:c.7397T>C']['alt_genomic_loci'], []) - assert results['ENST00000544455.1:c.7397T>C']['primary_assembly_loci']['hg19'] == { - 'hgvs_genomic_description': 'NC_000013.10:g.32929387T>C', - 'vcf': {'chr': 'chr13', 'pos': '32929387', 'ref': 'T', 'alt': 'C'}} - # assert results['ENST00000544455.1:c.7397T>C']['primary_assembly_loci']['hg38'] == { - # 'hgvs_genomic_description': 'NC_000013.11:g.32355250T>C', - # 'vcf': {'chr': 'chr13', 'pos': '32355250', 'ref': 'T', 'alt': 'C'}} - assert results['ENST00000544455.1:c.7397T>C']['primary_assembly_loci']['grch37'] == { - 'hgvs_genomic_description': 'NC_000013.10:g.32929387T>C', - 'vcf': {'chr': '13', 'pos': '32929387', 'ref': 'T', 'alt': 'C'}} - # assert results['ENST00000544455.1:c.7397T>C']['primary_assembly_loci']['grch38'] == { - # 'hgvs_genomic_description': 'NC_000013.11:g.32355250T>C', - # 'vcf': {'chr': '13', 'pos': '32355250', 'ref': 'T', 'alt': 'C'}} - - # HBG1 - def test_variant7(self): - variant = '11-5248232-T-A' # Pseudo-VCF format - results = self.vv.validate(variant, 'GRCh38', 'all', transcript_set="ensembl").format_as_dict(test=True) - print(results) - - assert results['flag'] == 'gene_variant' - assert 'ENST00000330597.3:c.*127A>T' in list(results.keys()) - assert results['ENST00000330597.3:c.*127A>T']['submitted_variant'] == '11-5248232-T-A' - assert results['ENST00000330597.3:c.*127A>T']['gene_symbol'] == 'HBG1' - assert results['ENST00000330597.3:c.*127A>T']['gene_ids'] == {'hgnc_id': 'HGNC:4831', 'entrez_gene_id': '3047', - 'ucsc_id': 'uc001mah.2', 'omim_id': ['142200']} - assert results['ENST00000330597.3:c.*127A>T']['hgvs_transcript_variant'] == 'ENST00000330597.3:c.*127A>T' - assert results['ENST00000330597.3:c.*127A>T']['genome_context_intronic_sequence'] == '' - # assert results['ENST00000330597.3:c.*127A>T']['refseqgene_context_intronic_sequence'] == '' - # assert results['ENST00000330597.3:c.*127A>T']['hgvs_refseqgene_variant'] == 'NG_059281.1:g.5070A>T' - assert results['ENST00000330597.3:c.*127A>T']['hgvs_predicted_protein_consequence'] == { - 'tlr': 'ENSP00000327431.3:p.(=)', 'slr': 'ENSP00000327431.3:p.(=)'} - # assert results['ENST00000330597.3:c.*127A>T']['hgvs_lrg_transcript_variant'] == 'LRG_1232t1:c.20A>T' - # assert results['ENST00000330597.3:c.*127A>T']['hgvs_lrg_variant'] == 'LRG_1232:g.5070A>T' - self.assertCountEqual(results['ENST00000330597.3:c.*127A>T']['alt_genomic_loci'], []) - # assert results['ENST00000330597.3:c.*127A>T']['primary_assembly_loci']['hg19'] == { - # 'hgvs_genomic_description': 'NC_000011.9:g.5269462T>A', - # 'vcf': {'chr': 'chr11', 'pos': '5269462', 'ref': 'T', 'alt': 'A'}} - assert results['ENST00000330597.3:c.*127A>T']['primary_assembly_loci']['hg38'] == { - 'hgvs_genomic_description': 'NC_000011.10:g.5248232T>A', - 'vcf': {'chr': 'chr11', 'pos': '5248232', 'ref': 'T', 'alt': 'A'}} - # assert results['ENST00000330597.3:c.*127A>T']['primary_assembly_loci']['grch37'] == { - # 'hgvs_genomic_description': 'NC_000011.9:g.5269462T>A', - # 'vcf': {'chr': '11', 'pos': '5269462', 'ref': 'T', 'alt': 'A'}} - assert results['ENST00000330597.3:c.*127A>T']['primary_assembly_loci']['grch38'] == { - 'hgvs_genomic_description': 'NC_000011.10:g.5248232T>A', - 'vcf': {'chr': '11', 'pos': '5248232', 'ref': 'T', 'alt': 'A'}} - assert results['ENST00000330597.3:c.*127A>T']['reference_sequence_records'] == { - 'transcript': 'https://www.ensembl.org/Homo_sapiens/Transcript/Summary?db=core;t=ENST00000330597.3', - 'protein': 'https://www.ensembl.org/Homo_sapiens/Transcript/ProteinSummary?db=core;p=ENSP00000327431.3' - } - - # TNXB - def test_variant9(self): - variant = '6-32012992-CG-C' - results = self.vv.validate(variant, 'GRCh37', 'all', transcript_set="ensembl").format_as_dict(test=True) - print(results) - - assert results['flag'] == 'gene_variant' - assert 'ENST00000375247.2:c.10711del' in list(results.keys()) - assert results['ENST00000375247.2:c.10711del']['submitted_variant'] == '6-32012992-CG-C' - assert results['ENST00000375247.2:c.10711del']['gene_symbol'] == 'TNXB' - assert results['ENST00000375247.2:c.10711del']['gene_ids'] == {'hgnc_id': 'HGNC:11976', 'entrez_gene_id': '7148', - 'ucsc_id': 'uc063nnw.1', 'omim_id': ['600985']} - assert results['ENST00000375247.2:c.10711del']['hgvs_transcript_variant'] == 'ENST00000375247.2:c.10711del' - assert results['ENST00000375247.2:c.10711del']['genome_context_intronic_sequence'] == '' - #assert results['ENST00000375247.2:c.10711del']['refseqgene_context_intronic_sequence'] == '' - #assert results['ENST00000375247.2:c.10711del']['hgvs_refseqgene_variant'] == 'NG_008337.2:g.69159del' - assert results['ENST00000375247.2:c.10711del']['hgvs_predicted_protein_consequence'] == { - 'tlr': 'ENSP00000364396.2:p.(Arg3571AlafsTer91)', 'slr': 'ENSP00000364396.2:p.(R3571Afs*91)'} - #assert results['ENST00000375247.2:c.10711del']['hgvs_lrg_transcript_variant'] == '' - #assert results['ENST00000375247.2:c.10711del']['hgvs_lrg_variant'] == '' - assert results['ENST00000375247.2:c.10711del']['primary_assembly_loci']['hg19'] == { - 'hgvs_genomic_description': 'NC_000006.11:g.32012993del', - 'vcf': {'chr': 'chr6', 'pos': '32012992', 'ref': 'CG', 'alt': 'C'}} - # assert results['ENST00000375247.2:c.10711del']['primary_assembly_loci']['hg38'] == { - # 'hgvs_genomic_description': 'NC_000006.12:g.32045216del', - # 'vcf': {'chr': 'chr6', 'pos': '32045215', 'ref': 'CG', 'alt': 'C'}} - assert results['ENST00000375247.2:c.10711del']['primary_assembly_loci']['grch37'] == { - 'hgvs_genomic_description': 'NC_000006.11:g.32012993del', - 'vcf': {'chr': '6', 'pos': '32012992', 'ref': 'CG', 'alt': 'C'}} - # assert results['ENST00000375247.2:c.10711del']['primary_assembly_loci']['grch38'] == { - # 'hgvs_genomic_description': 'NC_000006.12:g.32045216del', - # 'vcf': {'chr': '6', 'pos': '32045215', 'ref': 'CG', 'alt': 'C'}} - assert results['ENST00000375247.2:c.10711del']['reference_sequence_records'] == { - 'transcript': 'https://grch37.ensembl.org/Homo_sapiens/Transcript/Summary?db=core;t=ENST00000375247.2', - 'protein': 'https://grch37.ensembl.org/Homo_sapiens/Transcript/ProteinSummary?db=core;p=ENSP00000364396.2' - #'refseqgene': 'https://www.ncbi.nlm.nih.gov/nuccore/NG_008337.2' - } - - assert 'ENST00000451343.1:c.4del' in list(results.keys()) - assert results['ENST00000451343.1:c.4del']['submitted_variant'] == '6-32012992-CG-C' - assert results['ENST00000451343.1:c.4del']['gene_symbol'] == 'TNXB' - assert results['ENST00000451343.1:c.4del']['gene_ids'] == {'hgnc_id': 'HGNC:11976', 'entrez_gene_id': '7148', - 'ucsc_id': 'uc063nnw.1', 'omim_id': ['600985']} - assert results['ENST00000451343.1:c.4del']['hgvs_transcript_variant'] == 'ENST00000451343.1:c.4del' - assert results['ENST00000451343.1:c.4del']['genome_context_intronic_sequence'] == '' - #assert results['ENST00000451343.1:c.4del']['refseqgene_context_intronic_sequence'] == '' - #assert results['ENST00000451343.1:c.4del']['hgvs_refseqgene_variant'] == 'NG_008337.2:g.69159del' - assert results['ENST00000451343.1:c.4del']['hgvs_predicted_protein_consequence'] == { - 'tlr': 'ENSP00000407685.1:p.(Arg2AlafsTer91)', 'slr': 'ENSP00000407685.1:p.(R2Afs*91)'} - #assert results['ENST00000451343.1:c.4del']['hgvs_lrg_transcript_variant'] == '' - #assert results['ENST00000451343.1:c.4del']['hgvs_lrg_variant'] == '' - assert results['ENST00000451343.1:c.4del']['primary_assembly_loci']['hg19'] == { - 'hgvs_genomic_description': 'NC_000006.11:g.32012993del', - 'vcf': {'chr': 'chr6', 'pos': '32012992', 'ref': 'CG', 'alt': 'C'}} - # assert results['ENST00000451343.1:c.4del']['primary_assembly_loci']['hg38'] == { - # 'hgvs_genomic_description': 'NC_000006.12:g.32045216del', - # 'vcf': {'chr': 'chr6', 'pos': '32045215', 'ref': 'CG', 'alt': 'C'}} - assert results['ENST00000451343.1:c.4del']['primary_assembly_loci']['grch37'] == { - 'hgvs_genomic_description': 'NC_000006.11:g.32012993del', - 'vcf': {'chr': '6', 'pos': '32012992', 'ref': 'CG', 'alt': 'C'}} - # assert results['ENST00000451343.1:c.4del']['primary_assembly_loci']['grch38'] == { - # 'hgvs_genomic_description': 'NC_000006.12:g.32045216del', - # 'vcf': {'chr': '6', 'pos': '32045215', 'ref': 'CG', 'alt': 'C'}} - assert results['ENST00000451343.1:c.4del']['reference_sequence_records'] == { - 'transcript': 'https://grch37.ensembl.org/Homo_sapiens/Transcript/Summary?db=core;t=ENST00000451343.1', - 'protein': 'https://grch37.ensembl.org/Homo_sapiens/Transcript/ProteinSummary?db=core;p=ENSP00000407685.1' - } - - # TSC1 - def test_variant10(self): - variant = 'ENST00000298552.9:c.363+1dupG' - results = self.vv.validate(variant, 'GRCh38', 'all', transcript_set="ensembl").format_as_dict(test=True) - print(results) - - assert 'ENST00000298552.9:c.363+1dup' in list(results.keys()) - assert results['ENST00000298552.9:c.363+1dup']['submitted_variant'] == 'ENST00000298552.9:c.363+1dupG' - assert results['ENST00000298552.9:c.363+1dup']['gene_symbol'] == 'TSC1' - assert results['ENST00000298552.9:c.363+1dup']['gene_ids'] == {'hgnc_id': 'HGNC:12362', 'entrez_gene_id': '7248', - 'ucsc_id': 'uc004cca.3', 'omim_id': ['605284']} - assert results['ENST00000298552.9:c.363+1dup']['hgvs_transcript_variant'] == 'ENST00000298552.9:c.363+1dup' - assert results['ENST00000298552.9:c.363+1dup'][ - 'genome_context_intronic_sequence'] == 'NC_000009.12(ENST00000298552.9):c.363+1dup' - # assert results['ENST00000298552.9:c.363+1dup'][ - # 'refseqgene_context_intronic_sequence'] == 'NG_012386.1(ENST00000298552.9):c.363+1dup' - # assert results['ENST00000298552.9:c.363+1dup']['hgvs_refseqgene_variant'] == 'NG_012386.1:g.24048dup' - assert results['ENST00000298552.9:c.363+1dup']['hgvs_predicted_protein_consequence'] == { - 'tlr': 'ENSP00000298552.3:p.?', 'slr': 'ENSP00000298552.3:p.?'} - # assert results['ENST00000298552.9:c.363+1dup']['hgvs_lrg_transcript_variant'] == 'LRG_486t1:c.363+1dup' - # assert results['ENST00000298552.9:c.363+1dup']['hgvs_lrg_variant'] == 'LRG_486:g.24048dup' - self.assertCountEqual(results['ENST00000298552.9:c.363+1dup']['alt_genomic_loci'], []) - # assert results['ENST00000298552.9:c.363+1dup']['primary_assembly_loci']['hg19'] == { - # 'hgvs_genomic_description': 'NC_000009.11:g.135800974dup', - # 'vcf': {'chr': 'chr9', 'pos': '135800972', 'ref': 'A', 'alt': 'AC'}} - assert results['ENST00000298552.9:c.363+1dup']['primary_assembly_loci']['hg38'] == { - 'hgvs_genomic_description': 'NC_000009.12:g.132925587dup', - 'vcf': {'chr': 'chr9', 'pos': '132925585', 'ref': 'A', 'alt': 'AC'}} - # assert results['ENST00000298552.9:c.363+1dup']['primary_assembly_loci']['grch37'] == { - # 'hgvs_genomic_description': 'NC_000009.11:g.135800974dup', - # 'vcf': {'chr': '9', 'pos': '135800972', 'ref': 'A', 'alt': 'AC'}} - assert results['ENST00000298552.9:c.363+1dup']['primary_assembly_loci']['grch38'] == { - 'hgvs_genomic_description': 'NC_000009.12:g.132925587dup', - 'vcf': {'chr': '9', 'pos': '132925585', 'ref': 'A', 'alt': 'AC'}} - assert results['ENST00000298552.9:c.363+1dup']['reference_sequence_records'] == { - 'transcript': 'https://www.ensembl.org/Homo_sapiens/Transcript/Summary?db=core;t=ENST00000298552.9', - 'protein': 'https://www.ensembl.org/Homo_sapiens/Transcript/ProteinSummary?db=core;p=ENSP00000298552.3' - } - - # TSC2 - def test_variant11(self): - variant = 'NC_000016.10:g.2099572TG>T' - results = self.vv.validate(variant, 'GRCh38', 'all', transcript_set="ensembl").format_as_dict(test=True) - print(results) - - assert results['flag'] == 'gene_variant' - assert 'ENST00000262304.9:c.10050+71del' in list(results.keys()) - assert results['ENST00000262304.9:c.10050+71del']['submitted_variant'] == 'NC_000016.10:g.2099572TG>T' - assert results['ENST00000262304.9:c.10050+71del']['gene_symbol'] == 'PKD1' - assert results['ENST00000262304.9:c.10050+71del']['hgvs_transcript_variant' - ] == ('ENST00000262304.9:c.10050+71del') - assert results['ENST00000262304.9:c.10050+71del'][ - 'genome_context_intronic_sequence'] == 'NC_000016.10(ENST00000262304.9):c.10050+71del' - assert results['ENST00000262304.9:c.10050+71del']['hgvs_predicted_protein_consequence'] == { - 'tlr': 'ENSP00000262304.4:p.?', 'slr': 'ENSP00000262304.4:p.?'} - self.assertCountEqual(results['ENST00000262304.9:c.10050+71del']['alt_genomic_loci'], []) - # assert results['ENST00000262304.9:c.10050+71del']['primary_assembly_loci']['hg19'] == { - # 'hgvs_genomic_description': 'NC_000016.9:g.2149575del', 'vcf': { - # 'chr': 'chr16', 'pos': '2149573', 'ref': 'TG', 'alt': 'T'}} - assert results['ENST00000262304.9:c.10050+71del']['primary_assembly_loci']['hg38'] == { - 'hgvs_genomic_description': 'NC_000016.10:g.2099574del', 'vcf': { - 'chr': 'chr16', 'pos': '2099572', 'ref': 'TG', 'alt': 'T'}} - - """ - Gapped alignment test variants - """ - - def test_variant12(self): - variant = '19-41123094-G-GG' # ENST00000396819.3 contains 1 extra bases between c.3233_3235 than NC_000019.9 - results = self.vv.validate(variant, 'GRCh37', 'all', transcript_set="ensembl").format_as_dict(test=True) - print(results) - - assert results['flag'] == 'gene_variant' - assert 'ENST00000396819.3:c.3033_3034insGGT' in list(results.keys()) - assert results['ENST00000396819.3:c.3033_3034insGGT']['submitted_variant'] == '19-41123094-G-GG' - assert results['ENST00000396819.3:c.3033_3034insGGT']['gene_symbol'] == 'LTBP4' - assert results['ENST00000396819.3:c.3033_3034insGGT']['gene_ids'] == {'hgnc_id': 'HGNC:6717', 'entrez_gene_id': '8425', - 'ucsc_id': 'uc032hxp.2', 'omim_id': ['604710']} - assert results['ENST00000396819.3:c.3033_3034insGGT']['hgvs_transcript_variant'] == 'ENST00000396819.3:c.3033_3034insGGT' - assert results['ENST00000396819.3:c.3033_3034insGGT']['genome_context_intronic_sequence'] == '' - assert results['ENST00000396819.3:c.3033_3034insGGT']['refseqgene_context_intronic_sequence'] == '' - assert results['ENST00000396819.3:c.3033_3034insGGT']['hgvs_predicted_protein_consequence'] == \ - { - "slr": "ENSP00000380031.3:p.(Q1011_Y1012insG)", - "tlr": "ENSP00000380031.3:p.(Gln1011_Tyr1012insGly)" - } - assert results['ENST00000396819.3:c.3033_3034insGGT']['hgvs_lrg_transcript_variant'] == '' - assert results['ENST00000396819.3:c.3033_3034insGGT']['hgvs_lrg_variant'] == '' - self.assertCountEqual(results['ENST00000396819.3:c.3033_3034insGGT']['alt_genomic_loci'], []) - assert results['ENST00000396819.3:c.3033_3034insGGT']['primary_assembly_loci']['hg19'] == { - 'hgvs_genomic_description': 'NC_000019.9:g.41123095dup', - 'vcf': {'chr': 'chr19', 'pos': '41123093', 'ref': 'A', 'alt': 'AG'}} - # assert results['ENST00000396819.3:c.3033_3034insGGT']['primary_assembly_loci']['hg38'] == { - # 'hgvs_genomic_description': 'NC_000019.10:g.40617187_40617189=', - # 'vcf': {'chr': 'chr19', 'pos': '40617187', 'ref': 'AGG', 'alt': 'AGG'}} - assert results['ENST00000396819.3:c.3033_3034insGGT']['primary_assembly_loci']['grch37'] == { - 'hgvs_genomic_description': 'NC_000019.9:g.41123095dup', - 'vcf': {'chr': '19', 'pos': '41123093', 'ref': 'A', 'alt': 'AG'}} - # assert results['ENST00000396819.3:c.3033_3034insGGT']['primary_assembly_loci']['grch38'] == { - # 'hgvs_genomic_description': 'NC_000019.10:g.40617187_40617189=', - # 'vcf': {'chr': '19', 'pos': '40617187', 'ref': 'AGG', 'alt': 'AGG'}} - - def test_variant12b(self): - variant = 'ENST00000396819.3:c.3033_3034insGGT' # ENST00000396819.3 contains 1 extra bases between c.3233_3235 than NC_000019.9 - results = self.vv.validate(variant, 'GRCh37', 'all', transcript_set="ensembl").format_as_dict(test=True) - print(results) - - assert results['flag'] == 'gene_variant' - assert 'ENST00000396819.3:c.3033_3034insGGT' in list(results.keys()) - assert results['ENST00000396819.3:c.3033_3034insGGT']['submitted_variant'] == 'ENST00000396819.3:c.3033_3034insGGT' - assert results['ENST00000396819.3:c.3033_3034insGGT']['gene_symbol'] == 'LTBP4' - assert results['ENST00000396819.3:c.3033_3034insGGT']['gene_ids'] == {'hgnc_id': 'HGNC:6717', 'entrez_gene_id': '8425', - 'ucsc_id': 'uc032hxp.2', 'omim_id': ['604710']} - assert results['ENST00000396819.3:c.3033_3034insGGT']['hgvs_transcript_variant'] == 'ENST00000396819.3:c.3033_3034insGGT' - assert results['ENST00000396819.3:c.3033_3034insGGT']['genome_context_intronic_sequence'] == '' - assert results['ENST00000396819.3:c.3033_3034insGGT']['refseqgene_context_intronic_sequence'] == '' - assert results['ENST00000396819.3:c.3033_3034insGGT']['hgvs_predicted_protein_consequence'] == \ - { - "slr": "ENSP00000380031.3:p.(Q1011_Y1012insG)", - "tlr": "ENSP00000380031.3:p.(Gln1011_Tyr1012insGly)" - } - assert results['ENST00000396819.3:c.3033_3034insGGT']['hgvs_lrg_transcript_variant'] == '' - assert results['ENST00000396819.3:c.3033_3034insGGT']['hgvs_lrg_variant'] == '' - self.assertCountEqual(results['ENST00000396819.3:c.3033_3034insGGT']['alt_genomic_loci'], []) - assert results['ENST00000396819.3:c.3033_3034insGGT']['primary_assembly_loci']['hg19'] == { - 'hgvs_genomic_description': 'NC_000019.9:g.41123095dup', - 'vcf': {'chr': 'chr19', 'pos': '41123093', 'ref': 'A', 'alt': 'AG'}} - # assert results['ENST00000396819.3:c.3033_3034insGGT']['primary_assembly_loci']['hg38'] == { - # 'hgvs_genomic_description': 'NC_000019.10:g.40617187_40617189=', - # 'vcf': {'chr': 'chr19', 'pos': '40617187', 'ref': 'AGG', 'alt': 'AGG'}} - assert results['ENST00000396819.3:c.3033_3034insGGT']['primary_assembly_loci']['grch37'] == { - 'hgvs_genomic_description': 'NC_000019.9:g.41123095dup', - 'vcf': {'chr': '19', 'pos': '41123093', 'ref': 'A', 'alt': 'AG'}} - # assert results['ENST00000396819.3:c.3033_3034insGGT']['primary_assembly_loci']['grch38'] == { - # 'hgvs_genomic_description': 'NC_000019.10:g.40617187_40617189=', - # 'vcf': {'chr': '19', 'pos': '40617187', 'ref': 'AGG', 'alt': 'AGG'}} - - # - def test_variant13(self): - # No GRCh37 coding transcripts for NR2E3 - variant = '15-72105928-AC-A' # ENST00000398840.2 contains 1 fewer bases between NC_000015.9 - results = self.vv.validate(variant, 'GRCh37', 'ENST00000398840.2', transcript_set="ensembl").format_as_dict(test=True) - print(results) - - assert results['flag'] == 'gene_variant' - assert 'ENST00000398840.2:n.1133_1141=' in list(results.keys()) - assert results['ENST00000398840.2:n.1133_1141=']['submitted_variant'] == '15-72105928-AC-A' - assert results['ENST00000398840.2:n.1133_1141=']['gene_symbol'] == 'NR2E3' - assert results['ENST00000398840.2:n.1133_1141=']['hgvs_transcript_variant'] == 'ENST00000398840.2:n.1133_1141=' - assert results['ENST00000398840.2:n.1133_1141='][ - 'genome_context_intronic_sequence'] == '' - # assert results['ENST00000398840.2:n.1133_1141=']['refseqgene_context_intronic_sequence'] == '' - # assert results['ENST00000398840.2:n.1133_1141=']['hgvs_refseqgene_variant'] == '' - assert results['ENST00000398840.2:n.1133_1141=']['hgvs_predicted_protein_consequence'] == { - 'tlr': '', 'slr': ''} - # assert results['ENST00000398840.2:n.1133_1141=']['hgvs_lrg_transcript_variant'] == '' - # assert results['ENST00000398840.2:n.1133_1141=']['hgvs_lrg_variant'] == '' - self.assertCountEqual(results['ENST00000398840.2:n.1133_1141=']['alt_genomic_loci'], []) - assert results['ENST00000398840.2:n.1133_1141=']['primary_assembly_loci']['hg19'] == { - "hgvs_genomic_description": "NC_000015.9:g.72105933del", - "vcf": { - "alt": "A", - "chr": "chr15", - "pos": "72105928", - "ref": "AC" - }} - # assert results['ENST00000398840.2:n.1133_1141=']['primary_assembly_loci']['hg38'] == { - # 'hgvs_genomic_description': 'NC_000016.10:g.2049574del', - # 'vcf': {'chr': 'chr16', 'pos': '2049571', 'ref': 'TC', 'alt': 'T'}} - assert results['ENST00000398840.2:n.1133_1141=']['primary_assembly_loci']['grch37'] == { - "hgvs_genomic_description": "NC_000015.9:g.72105933del", - "vcf": { - "alt": "A", - "chr": "15", - "pos": "72105928", - "ref": "AC" - }} - # assert results['ENST00000398840.2:n.1133_1141=']['primary_assembly_loci']['grch38'] == { - # 'hgvs_genomic_description': 'NC_000016.10:g.2049574del', - # 'vcf': {'chr': '16', 'pos': '2049571', 'ref': 'TC', 'alt': 'T'}} - - def test_variant13b(self): - # No GRCh37 coding transcripts for NR2E3 - variant = 'ENST00000398840.2:n.1133_1141=' # ENST00000398840.2 contains 1 fewer bases between NC_000015.9 - results = self.vv.validate(variant, 'GRCh37', 'ENST00000398840.2', transcript_set="ensembl").format_as_dict( - test=True) - print(results) - - assert results['flag'] == 'gene_variant' - assert 'ENST00000398840.2:n.1133_1141=' in list(results.keys()) - assert results['ENST00000398840.2:n.1133_1141=']['submitted_variant'] == 'ENST00000398840.2:n.1133_1141=' - assert results['ENST00000398840.2:n.1133_1141=']['gene_symbol'] == 'NR2E3' - assert results['ENST00000398840.2:n.1133_1141=']['hgvs_transcript_variant'] == 'ENST00000398840.2:n.1133_1141=' - assert results['ENST00000398840.2:n.1133_1141='][ - 'genome_context_intronic_sequence'] == '' - # assert results['ENST00000398840.2:n.1133_1141=']['refseqgene_context_intronic_sequence'] == '' - # assert results['ENST00000398840.2:n.1133_1141=']['hgvs_refseqgene_variant'] == '' - assert results['ENST00000398840.2:n.1133_1141=']['hgvs_predicted_protein_consequence'] == { - 'tlr': '', 'slr': ''} - # assert results['ENST00000398840.2:n.1133_1141=']['hgvs_lrg_transcript_variant'] == '' - # assert results['ENST00000398840.2:n.1133_1141=']['hgvs_lrg_variant'] == '' - self.assertCountEqual(results['ENST00000398840.2:n.1133_1141=']['alt_genomic_loci'], []) - assert results['ENST00000398840.2:n.1133_1141=']['primary_assembly_loci']['hg19'] == { - "hgvs_genomic_description": "NC_000015.9:g.72105933del", - "vcf": { - "alt": "A", - "chr": "chr15", - "pos": "72105928", - "ref": "AC" - }} - # assert results['ENST00000398840.2:n.1133_1141=']['primary_assembly_loci']['hg38'] == { - # 'hgvs_genomic_description': 'NC_000016.10:g.2049574del', - # 'vcf': {'chr': 'chr16', 'pos': '2049571', 'ref': 'TC', 'alt': 'T'}} - assert results['ENST00000398840.2:n.1133_1141=']['primary_assembly_loci']['grch37'] == { - "hgvs_genomic_description": "NC_000015.9:g.72105933del", - "vcf": { - "alt": "A", - "chr": "15", - "pos": "72105928", - "ref": "AC" - }} - # assert results['ENST00000398840.2:n.1133_1141=']['primary_assembly_loci']['grch38'] == { - # 'hgvs_genomic_description': 'NC_000016.10:g.2049574del', - # 'vcf': {'chr': '16', 'pos': '2049571', 'ref': 'TC', 'alt': 'T'}} - - def test_variant14(self): - # Because this is a 3 nt deletion, there is no gap in the transcript becuse the transcript matches the genome - variant = 'NC_000002.11:g.95847041_95847043GCG=' # ENST00000340539.5 contains 3 fewer bases between NC_000002.11 - results = self.vv.validate(variant, 'GRCh37', 'ENST00000340539.5', transcript_set="ensembl").format_as_dict(test=True) - print(results) - - assert results['flag'] == 'gene_variant' - assert 'ENST00000340539.5:c.468_470=' in list(results.keys()) - assert results['ENST00000340539.5:c.468_470=']['submitted_variant'] == 'NC_000002.11:g.95847041_95847043GCG=' - assert results['ENST00000340539.5:c.468_470=']['gene_symbol'] == 'ZNF2' - assert results['ENST00000340539.5:c.468_470=']['hgvs_transcript_variant'] == 'ENST00000340539.5:c.468_470=' - assert results['ENST00000340539.5:c.468_470='][ - 'genome_context_intronic_sequence'] == '' - # assert results['ENST00000340539.5:c.468_470=']['refseqgene_context_intronic_sequence'] == '' - # assert results['ENST00000340539.5:c.468_470=']['hgvs_refseqgene_variant'] == '' - assert results['ENST00000340539.5:c.468_470=']['hgvs_predicted_protein_consequence'] == { - "slr": "ENSP00000345392.5:p.(L156_R157=)", - "tlr": "ENSP00000345392.5:p.(Leu156_Arg157=)" - } - # assert results['ENST00000340539.5:c.468_470=']['hgvs_lrg_transcript_variant'] == '' - # assert results['ENST00000340539.5:c.468_470=']['hgvs_lrg_variant'] == '' - self.assertCountEqual(results['ENST00000340539.5:c.468_470=']['alt_genomic_loci'], []) - assert results['ENST00000340539.5:c.468_470=']['primary_assembly_loci'][ - 'hg19']["hgvs_genomic_description"] == "NC_000002.11:g.95847041_95847043=" - # assert results['ENST00000340539.5:c.468_470=']['primary_assembly_loci']['hg38'] == { - # 'hgvs_genomic_description': 'NC_000016.10:g.2049574del', - # 'vcf': {'chr': 'chr16', 'pos': '2049571', 'ref': 'TC', 'alt': 'T'}} - assert results['ENST00000340539.5:c.468_470=']['primary_assembly_loci'][ - 'grch37']["hgvs_genomic_description"] == "NC_000002.11:g.95847041_95847043=" - # assert results['ENST00000340539.5:c.468_470=']['primary_assembly_loci']['grch38'] == { - # 'hgvs_genomic_description': 'NC_000016.10:g.2049574del', - # 'vcf': {'chr': '16', 'pos': '2049571', 'ref': 'TC', 'alt': 'T'}} - - -# Copyright (C) 2016-2026 VariantValidator Contributors -# This file is part of VariantValidator and is distributed under the -# GNU Affero General Public License, version 3 or (at your option) any -# later version. See the LICENSE file in the project root for the full -# licence terms. -# SPDX-License-Identifier: AGPL-3.0-or-later From 5824d6229b46a0b8295daa638305b7262074b0ea Mon Sep 17 00:00:00 2001 From: Peter-J-Freeman Date: Tue, 11 Aug 2026 17:10:24 +0100 Subject: [PATCH 2/5] Db file cleaning --- VariantValidator/modules/vvDBGet.py | 37 +++++---- VariantValidator/modules/vvDBInit.py | 9 +- VariantValidator/modules/vvDBInsert.py | 50 ++++++------ VariantValidator/modules/vvDatabase.py | 109 +++++++++++++------------ VariantValidator/validator.py | 29 +++---- 5 files changed, 125 insertions(+), 109 deletions(-) diff --git a/VariantValidator/modules/vvDBGet.py b/VariantValidator/modules/vvDBGet.py index e1507bfd..33bfb585 100644 --- a/VariantValidator/modules/vvDBGet.py +++ b/VariantValidator/modules/vvDBGet.py @@ -6,7 +6,6 @@ from .utils import handleCursor from . import vvDBInit - logger = logging.getLogger(__name__) LRG_TX_LINK = {} @@ -41,13 +40,14 @@ def _set_cached(key, value): return value -class Mixin(vvDBInit.Mixin): +class Mixin( + vvDBInit.Mixin): """ Most of the functions in DBGet generate queries for retrieving data from the databases. """ - @handleCursor + @handleCursor # Decorate def execute(self, *query_args): attempts = 3 @@ -59,7 +59,7 @@ def execute(self, *query_args): cursor.execute(*query_args) row = cursor.fetchone() - if row is None: + if row is None: # Blank result logger.debug( "No data returned from query %s", query_args, @@ -109,7 +109,7 @@ def execute_write(self, *query_args): except Exception: pass - @handleCursor + @handleCursor # Decorated def execute_all(self, *query_args): attempts = 3 @@ -177,7 +177,8 @@ def get_hgnc(self, gene_symbol): (gene_symbol,), ) - def get_transcript_description(self, transcript_id): + def get_transcript_description(self, + transcript_id): key = ("transcript_description", transcript_id) cached = _get_cached(key) @@ -388,7 +389,8 @@ def get_lrg_data_from_lrg_id(self, lrg_id): (lrg_id,), ) - def get_transcript_info_for_gene(self, gene_symbol): + def get_transcript_info_for_gene(self, + gene_symbol): query = ( "SELECT refSeqID, description, transcriptVariant, " "currentVersion, hgncSymbol, utaSymbol, updated, " @@ -444,7 +446,7 @@ def get_g_to_g_info( ) def get_all_transcript_id(self): - query = "SELECT refSeqID FROM transcript_info" + query = 'SELECT refSeqID FROM transcript_info' return self.execute_all(query) def get_stable_gene_id_info(self, hgnc_symbol): @@ -501,24 +503,27 @@ def get_db_version(self): return self.execute(query) # Direct methods (GET). - def get_uta_symbol(self, gene_symbol): + def get_uta_symbol(self, + gene_symbol): # Return the UTA gene symbol when an HGNC gene symbol is input. return str( self.get_uta(gene_symbol)[0] ) - def get_hgnc_symbol(self, gene_symbol): + def get_hgnc_symbol(self, + gene_symbol): # Return the HGNC gene symbol when a UTA gene symbol is input. return str( self.get_hgnc(gene_symbol)[0] ) # From external.py. - def get_urls(self, dict_out): + def get_urls(self, + dict_out): """ Provide direct links to reference sequence records. """ - report_urls = {} + report_urls={} # Blank dict transcript_variant = dict_out["hgvs_transcript_variant"] transcript_accession = transcript_variant.split(":", 1)[0] @@ -571,14 +576,15 @@ def get_urls(self, dict_out): and lrg_data[0] != "none" and len(lrg_data) > 4 ): - lrg_status = str(lrg_data[4]) + lrg_status = str( + lrg_data[4]) if lrg_status == "public": report_urls["lrg"] = ( "http://ftp.ebi.ac.uk/pub/" f"databases/lrgex/{lrg_id}.xml" ) - else: + else: # else report_urls["lrg"] = ( "http://ftp.ebi.ac.uk/pub/" "databases/lrgex/pending/" @@ -615,8 +621,7 @@ def get_urls(self, dict_out): "Homo_sapiens/Transcript/ProteinSummary?" f"db=core;p={protein_accession}" ) - - return report_urls + return report_urls # return # Copyright (C) 2016-2026 VariantValidator Contributors diff --git a/VariantValidator/modules/vvDBInit.py b/VariantValidator/modules/vvDBInit.py index 49e2d06a..99af23c4 100644 --- a/VariantValidator/modules/vvDBInit.py +++ b/VariantValidator/modules/vvDBInit.py @@ -25,10 +25,9 @@ class MariaDBProgrammingError(Exception): except ModuleNotFoundError: MySQLConnectionPool = None - class Mixin: """ - A mixin containing the database initialisation routines. + A mixin containing the database initialisation routines """ def __init__(self, db_config): @@ -36,9 +35,9 @@ def __init__(self, db_config): self.dbConfig = db_config self.init_db() - def __del__(self): - if getattr(self, "pool", None): - self.pool = None + def __del__( + self): + if getattr(self, "pool", None): self.pool = None def init_db(self): """ diff --git a/VariantValidator/modules/vvDBInsert.py b/VariantValidator/modules/vvDBInsert.py index 45429e9c..da2d3787 100644 --- a/VariantValidator/modules/vvDBInsert.py +++ b/VariantValidator/modules/vvDBInsert.py @@ -2,13 +2,17 @@ from . import vvDBGet -class Mixin(vvDBGet.Mixin): +class Mixin( + vvDBGet.Mixin): """ - This object is a function container for inserting objects into the database. + Object is a function container for inserting objects into the database. """ - @handleCursor - def insert(self, entry, data, table): + @handleCursor # Decorated function + def insert(self, + entry, + data, + table): # Connect and create cursor conn = self.get_conn() cursor = self.get_cursor(conn) @@ -34,16 +38,16 @@ def insert(self, entry, data, table): if cursor.lastrowid: success = "true" - else: + else: # Error success = "Unknown error" conn.commit() cursor.close() conn.close() - return success + return success # return - @handleCursor + @handleCursor # Decorated function def insert_refseq_gene_data(self, rsg_data): # Connect and create cursor conn = self.get_conn() @@ -75,16 +79,16 @@ def insert_refseq_gene_data(self, rsg_data): if cursor.lastrowid: success = "true" - else: + else: # Error success = "Unknown error" conn.commit() cursor.close() conn.close() - return success + return success # return - @handleCursor + @handleCursor # Decorated function def insert_refseq_gene_id_from_lrg_id(self, lrg_rs_lookup): # Connect and create cursor conn = self.get_conn() @@ -107,16 +111,16 @@ def insert_refseq_gene_id_from_lrg_id(self, lrg_rs_lookup): if cursor.lastrowid: success = "true" - else: + else: # Error success = "Unknown error" conn.commit() cursor.close() conn.close() - return success + return success # return - @handleCursor + @handleCursor # Decorated function def insert_lrg_transcript_data(self, lrgtx_to_rst_id): # Connect and create cursor conn = self.get_conn() @@ -137,16 +141,16 @@ def insert_lrg_transcript_data(self, lrgtx_to_rst_id): if cursor.lastrowid: success = "true" - else: + else: # Errro success = "Unknown error" conn.commit() cursor.close() conn.close() - return success + return success # Return - @handleCursor + @handleCursor # Decorated function def insert_lrg_protein_data(self, lrg_p, rs_p): # Connect and create cursor conn = self.get_conn() @@ -164,16 +168,16 @@ def insert_lrg_protein_data(self, lrg_p, rs_p): if cursor.lastrowid: success = "true" - else: + else: # Error success = "Unknown error" conn.commit() cursor.close() conn.close() - return success + return success # Return - @handleCursor + @handleCursor # Decorated function def insert_gene_stable_ids(self, data): # Connect and create cursor conn = self.get_conn() @@ -210,7 +214,7 @@ def insert_gene_stable_ids(self, data): return success - @handleCursor + @handleCursor # Decorated function def update(self, entry, data): # Connect and create cursor conn = self.get_conn() @@ -240,7 +244,7 @@ def update(self, entry, data): return "true" - @handleCursor + @handleCursor # Decorated function def update_refseq_gene_data(self, rsg_data): # Connect and create cursor conn = self.get_conn() @@ -265,7 +269,7 @@ def update_refseq_gene_data(self, rsg_data): return "true" - @handleCursor + @handleCursor # Decorated function def update_gene_stable_ids(self, gene_stable_ids): # Connect and create cursor conn = self.get_conn() @@ -297,7 +301,7 @@ def update_gene_stable_ids(self, gene_stable_ids): return "true" - @handleCursor + @handleCursor # Decorated function def update_db_version(self, db_version): # Connect and create cursor conn = self.get_conn() diff --git a/VariantValidator/modules/vvDatabase.py b/VariantValidator/modules/vvDatabase.py index 1645615c..193e7093 100644 --- a/VariantValidator/modules/vvDatabase.py +++ b/VariantValidator/modules/vvDatabase.py @@ -14,20 +14,20 @@ class Database(vvDBInsert.Mixin): """ - This class contains and handles the MySQL connections for the VariantValidator database. - - It now uses mixins, and the order of inheritance is - vvDBInit.Mixin - v - vvDBGet.Mixin - v - vvDBInsert.Mixin - v - vvDatabase + # This class contains and handles the MySQL connections for the VariantValidator database. + # + # It now uses mixins, and the order of inheritance is + # vvDBInit.Mixin + # v + # vvDBGet.Mixin + # v + # vvDBInsert.Mixin + # v + # vvDatabase """ # From dbquery - @handleCursor + @handleCursor # Decorated function def query_with_fetchone(self, entry): # Connect and create cursor conn = self.get_conn() @@ -44,24 +44,24 @@ def query_with_fetchone(self, entry): cursor.execute(query, (entry,)) row = cursor.fetchone() - if row is None: - row = ['none', 'No data'] + if row is None: # Nothing found + row = ['none', + 'No data'] logger.debug("No data returned from query %s", query) cursor.close() conn.close() - return row + return row # return - # From data def data_add(self, accession, validator, genome_build=None): """ Add accurate transcript descriptions to the database. - :param accession: - :param validator: - :param genome_build: - :return: + :param accession + :param validator + :param genome_build + :return """ self.update_transcript_info_record( accession, @@ -69,7 +69,8 @@ def data_add(self, accession, validator, genome_build=None): genome_build=genome_build ) - entry = self.in_entries(accession, 'transcript_info') + entry = self.in_entries(accession, + 'transcript_info') i = 1 while i in range(10): @@ -80,38 +81,40 @@ def data_add(self, accession, validator, genome_build=None): time.sleep(2) entry = self.in_entries(accession, 'transcript_info') - return entry + return entry # return - def in_entries(self, entry, table): + def in_entries(self, + entry, + table): """ Retrieve transcript information. - :param entry: - :param table: - :return: + :param entry: transcript entry + :param table: database table + :return: transcript information """ - data = {} + if table != "transcript_info": + return {} - if table == 'transcript_info': - row = self.query_with_fetchone(entry) + row = self.query_with_fetchone(entry) - if row[0] == 'error': - data['error'] = row[0] - data['description'] = row[1] - elif row[0] == 'none': - data['none'] = row[0] - data['description'] = row[1] - else: - data['accession'] = row[0] - data['description'] = row[1] - data['variant'] = row[2] - data['version'] = row[3] - data['hgnc_symbol'] = row[4] - data['uta_symbol'] = row[5] - data['updated'] = row[6] - data['expiry'] = row[7] + if row[0] in ("error", "none"): + return { + row[0]: row[0], + "description": row[1], + } - return data + fields = ( + "accession", + "description", + "variant", + "version", + "hgnc_symbol", + "uta_symbol", + "updated", + "expiry", + ) + return dict(zip(fields, row)) def update_gene_stable_identifiers(self, symbol): # First perform a search against the input gene symbol or the symbol @@ -511,7 +514,7 @@ def update_transcript_info_record( Get information from UTA. """ if kwargs.get("test") is not True: - try: + try: # look in VVTA uta_info = validator.hdp.get_tx_identity_info( version ) @@ -597,7 +600,7 @@ def update_transcript_info_record( query_info, table, ) - else: + else: # data is found self.update( version, query_info, @@ -609,12 +612,13 @@ def update_refseqgene_loci(self, rsg_data): rsg_data[2] ) - if entry_exists[0] == 'none': + if entry_exists[0] == "none": self.insert_refseq_gene_data(rsg_data) - else: + else: # Data found self.update_refseq_gene_data(rsg_data) - def update_lrg_rs_lookup(self, lrg_rs_lookup): + def update_lrg_rs_lookup(self, + lrg_rs_lookup): rsg_id = self.get_refseq_id_from_lrg_id(lrg_rs_lookup[0]) if rsg_id == 'none': @@ -628,13 +632,16 @@ def update_lrgt_rst(self, lrgtx_to_rst_id): if rst_id == 'none': self.insert_lrg_transcript_data(lrgtx_to_rst_id) - def update_lrg_p_rs_p_lookup(self, lrg_p, rs_p): + def update_lrg_p_rs_p_lookup(self, + lrg_p, + rs_p): rsp_id = self.get_refseq_protein_id_from_lrg_protein_id(lrg_p) if rsp_id == 'none': self.insert_lrg_protein_data(lrg_p, rs_p) - def ref_type_assign(self, accession): + def ref_type_assign(self, + accession): if accession.startswith(('NC_', 'NG_', 'NT_', 'NW_')): return ':g.' diff --git a/VariantValidator/validator.py b/VariantValidator/validator.py index 43ca6bb0..4aad8ccc 100644 --- a/VariantValidator/validator.py +++ b/VariantValidator/validator.py @@ -1,19 +1,20 @@ from .modules import vvMixinCore as vvMixinCore - -class Validator(vvMixinCore.Mixin): - """ - #Mixins are used to split this very large, complex object over multiple files. - #There is a logical chain to it, though: - # vvMixinInit - # v - # vvMixinConverters - # v - # vvMixinCore - # v - # Validator <- this object. - """ - pass +class Validator( + vvMixinCore.Mixin +): + ''' + Mixins are used to split this very large, complex object over multiple files. + There is a logical chain to it, though: + vvMixinInit + v + vvMixinConverters + v + vvMixinCore + v + Validator <- this object. + ''' + pass # Object contains no additional methods or attributes beyond those provided by the mixins. # Copyright (C) 2016-2026 VariantValidator Contributors From 8274d0b3f2b9116d7bbcb148ea91d1ccb323b547 Mon Sep 17 00:00:00 2001 From: Peter-J-Freeman Date: Tue, 11 Aug 2026 17:11:17 +0100 Subject: [PATCH 3/5] Mixin file changes vvMixinCore.py Has had a more thorough clean to improve performance --- VariantValidator/modules/vvMixinConverters.py | 1370 +++++++++-------- VariantValidator/modules/vvMixinCore.py | 954 +++++++----- VariantValidator/modules/vvMixinInit.py | 105 +- 3 files changed, 1274 insertions(+), 1155 deletions(-) diff --git a/VariantValidator/modules/vvMixinConverters.py b/VariantValidator/modules/vvMixinConverters.py index 29b8ba75..f39f7132 100644 --- a/VariantValidator/modules/vvMixinConverters.py +++ b/VariantValidator/modules/vvMixinConverters.py @@ -1,5 +1,3 @@ -import re -import copy import logging import vvhgvs from vvhgvs.assemblymapper import AssemblyMapper @@ -8,13 +6,14 @@ from . import seq_data from . import hgvs_utils, hgvs_position_utils from . import expanded_repeats -from Bio import Entrez, SeqIO +from Bio import SeqIO, Entrez from Bio.Seq import Seq from . import utils as fn import sys import json - -from vvhgvs.exceptions import HGVSError, HGVSDataNotAvailableError, HGVSUnsupportedOperationError, \ +import copy +import re +from vvhgvs.exceptions import HGVSDataNotAvailableError, HGVSUnsupportedOperationError, \ HGVSInvalidVariantError from vvhgvs.enums import Datum # needed to handle r-> n mapping without re-parsing posedit from VariantValidator.modules.hgvs_utils import hgvs_delins_parts_to_hgvs_obj, hgvs_dup_to_delins,\ @@ -23,23 +22,24 @@ logger = logging.getLogger(__name__) - class AlleleSyntaxError(Exception): pass -class Mixin(vvMixinInit.Mixin): - """ +class Mixin( + vvMixinInit.Mixin + ): + ''' Converters that use the Validator configuration. - """ + ''' def _expand_ref(self, ac, start, stop): - """ + ''' Fetch the first and last bases of a sequence interval. For intervals <= 1 kb, a single sequence fetch is faster than two separate 1 bp fetches. Coordinates are 0-based SeqRepo coordinates. - """ + ''' if stop - start > 1000: pre_base = self.sf.fetch_seq(ac, start, start + 1) post_base = self.sf.fetch_seq(ac, stop - 1, stop) @@ -48,10 +48,126 @@ def _expand_ref(self, ac, start, stop): span = self.sf.fetch_seq(ac, start, stop) return span[0], span[-1] + def _prepare_gap_alt( + self, + transcript_gap_n, + transcript_gap_alt_n + ): + ''' + Build the delete/insert ALT sequence used for gap reconstruction. + + Returns the possibly converted n. and alternate n. objects because + duplication objects may need conversion before their ALT is accessible. + ''' + try: + alt = transcript_gap_alt_n.posedit.edit.alt + except AttributeError: + transcript_gap_n = hgvs_dup_to_delins(transcript_gap_n) + transcript_gap_alt_n = hgvs_dup_to_delins(transcript_gap_alt_n) + alt = transcript_gap_alt_n.posedit.edit.alt + + if alt is None: + alt = 'X' * len(transcript_gap_alt_n.posedit.edit.ref) + + ref_start = transcript_gap_n.posedit.pos.start.base + ref_end = transcript_gap_n.posedit.pos.end.base + alt_start = transcript_gap_alt_n.posedit.pos.start.base + alt_end = transcript_gap_alt_n.posedit.pos.end.base + + ref_base_dict = { + ref_start + index: base + for index, base in enumerate(transcript_gap_n.posedit.edit.ref) + } + + alternate_sequence_bases = [] + for position in range(ref_start, ref_end + 1): + if position == alt_start: + alternate_sequence_bases.append(alt) + elif alt_start <= position <= alt_end: + alternate_sequence_bases.append('X') + elif position in ref_base_dict: + alternate_sequence_bases.append(ref_base_dict[position]) + + transcript_gap_n.posedit.edit.alt = ''.join( + alternate_sequence_bases + ).replace('X', '') + + return transcript_gap_n, transcript_gap_alt_n + + def _rebuild_gap_variant( + self, + transcript_gap_n, + transcript_gap_alt_n, + genomic_ac, + hn, + alt_aln_method + ): + ''' + Reconstruct and map a transcript variant across a transcript/genome gap. + + This is shared by the gap-recovery paths in myevm_t_to_g() and + myvm_t_to_g(). The HGVS objects are intentionally modified in place, + matching the historical implementation. + ''' + transcript_gap_n, transcript_gap_alt_n = self._prepare_gap_alt( + transcript_gap_n, + transcript_gap_alt_n + ) + + try: + transcript_gap_variant = self.vm.n_to_c(transcript_gap_n) + except vvhgvs.exceptions.HGVSError: + transcript_gap_variant = transcript_gap_n + + try: + mapped = self.vm.t_to_g( + transcript_gap_variant, + genomic_ac, + alt_aln_method + ) + return hn.normalize(mapped) + + except vvhgvs.exceptions.HGVSError as error: + if str(error) != 'base start position must be <= end position': + raise + + pre_base, post_base = self._expand_ref( + transcript_gap_n.ac, + transcript_gap_n.posedit.pos.start.base - 2, + transcript_gap_n.posedit.pos.end.base + 1 + ) + + transcript_gap_n.posedit.pos.start.base -= 1 + transcript_gap_n.posedit.pos.end.base += 1 + + transcript_gap_n.posedit.edit.ref = ( + pre_base + + transcript_gap_n.posedit.edit.ref + + post_base + ) + transcript_gap_n.posedit.edit.alt = ( + pre_base + + transcript_gap_n.posedit.edit.alt + + post_base + ) + + try: + transcript_gap_variant = self.vm.n_to_c(transcript_gap_n) + except vvhgvs.exceptions.HGVSError: + transcript_gap_variant = transcript_gap_n + + mapped = self.vm.t_to_g( + transcript_gap_variant, + genomic_ac, + alt_aln_method + ) + return hn.normalize(mapped) + + def coding(self, variant): - """ + ''' Return a transcript variant as a c. HGVS object where applicable. - """ + ''' if isinstance(variant, str): if ':c.' not in variant and ':n.' not in variant: return None @@ -66,9 +182,9 @@ def coding(self, variant): return None def genomic(self, variant, evm, primary_assembly, vv_variant): - """ + ''' Return a variant as a genomic HGVS object where applicable. - """ + ''' hn = vv_variant.hn logger.info("Map %s to genomic position", variant) @@ -99,9 +215,10 @@ def genomic(self, variant, evm, primary_assembly, vv_variant): return None if ':c.' in variant or ':n.' in variant: - hgvs_var = self.hp.parse_hgvs_variant(variant) + hgvs_var = self.hp.parse_hgvs_variant( + variant) - try: + try: # Return return self.myevm_t_to_g( hgvs_var, evm, @@ -126,7 +243,7 @@ def myevm_t_to_g( variant, reset_g_origin=False ): - """ + ''' Enhanced transcript-to-genome mapping using evm. Handles transcript positions affected by transcript/genome alignment gaps @@ -143,9 +260,9 @@ def myevm_t_to_g( NG_ Requires a parsed c. or n. HGVS object and returns a parsed g. object. - """ - alt_aln_method = self.alt_aln_method - stored_hgvs_c = copy.deepcopy(hgvs_c) + ''' + alt_aln_method = self.alt_aln_method # Set alt alignment method + stored_hgvs_c = copy.deepcopy(hgvs_c) # Copy stored c. expand_out = False # ------------------------------------------------------------------ @@ -153,10 +270,10 @@ def myevm_t_to_g( # ------------------------------------------------------------------ def gap_pre_tx_corrections(hgvs_cg): - """ + ''' Expand a non-intronic transcript variant before mapping across a gapped transcript/genome alignment. - """ + ''' if hgvs_cg.posedit.edit.type not in ( 'identity', 'del', 'delins', 'dup', 'sub', 'ins', 'inv' ): @@ -166,11 +283,11 @@ def gap_pre_tx_corrections(hgvs_cg): if hgvs_cg.type == 'c': hgvs_cg = no_norm_evm.c_to_n(hgvs_cg) - try: + try: # Normalize hn.normalize(hgvs_cg) - except vvhgvs.exceptions.HGVSError as e: - error = str(e) + except vvhgvs.exceptions.HGVSError as error: + error = str(error) if ( 'intronic variant' not in error @@ -185,9 +302,8 @@ def gap_pre_tx_corrections(hgvs_cg): - 1 ) - # Do not expand intronic variants. if not hgvs_position_utils.either_position_is_intronic(hgvs_cg): - try: + try: # Do not expand intronic variants. hgvs_t = copy.deepcopy(hgvs_cg) edit_type = hgvs_t.posedit.edit.type @@ -266,9 +382,9 @@ def gap_pre_tx_corrections(hgvs_cg): offset_pos=True ) - else: + else: # Branch if hgvs_t.posedit.edit.alt is None: - hgvs_t.posedit.edit.alt = '' + hgvs_t.posedit.edit.alt = "" pre_base, post_base = self._expand_ref( hgvs_t.ac, @@ -297,11 +413,11 @@ def gap_pre_tx_corrections(hgvs_cg): hgvs_cg = copy.deepcopy(hgvs_t) # Historical defensive behaviour around malformed/gapped HGVS. - except Exception: - pass + except Exception as e: + logger.warning(f"Unhandled exception: {e}") + pass # Pass unhandled exceptions - # Convert back to c. where possible. - try: + try: # Convert back to c. where possible. hgvs_cg = no_norm_evm.n_to_c(hgvs_cg) except vvhgvs.exceptions.HGVSError: hgvs_cg = copy.deepcopy(stored_hgvs_c) @@ -309,14 +425,14 @@ def gap_pre_tx_corrections(hgvs_cg): # Ensure expansion has not crossed an exon/intron boundary. hgvs_check_boundaries = copy.deepcopy(hgvs_cg) - try: + try: # Normalize hn.normalize(hgvs_check_boundaries) except vvhgvs.exceptions.HGVSError as e: if 'spanning the exon-intron boundary' in str(e): hgvs_cg = copy.deepcopy(stored_hgvs_c) # Identity variants require an additional reference-only check. - if hgvs_check_boundaries.posedit.edit.type == 'identity': + if hgvs_check_boundaries.posedit.edit.type == "identity": hgvs_reform_ident = hgvs_delins_parts_to_hgvs_obj( hgvs_cg.ac, stored_hgvs_c.type, @@ -326,10 +442,11 @@ def gap_pre_tx_corrections(hgvs_cg): offset_pos=True ) - try: - hn.normalize(hgvs_reform_ident) - except vvhgvs.exceptions.HGVSError as e: - error = str(e) + try: # Normalize + hn.normalize( + hgvs_reform_ident) + except vvhgvs.exceptions.HGVSError as error: + error = str(error) if ( 'spanning the exon-intron boundary' in error @@ -340,10 +457,10 @@ def gap_pre_tx_corrections(hgvs_cg): return hgvs_cg def map_to_genomic_ac(transcript_variant, genomic_ac): - """ + ''' Map to a specific genomic accession, applying transcript gap compensation where required. - """ + ''' if variant.map_dat.is_gapped_map( hgvs_c.ac, genomic_ac, @@ -375,136 +492,6 @@ def map_to_genomic_ac(transcript_variant, genomic_ac): alt_aln_method=alt_aln_method ) - def rebuild_gap_variant( - transcript_gap_n, - transcript_gap_alt_n, - genomic_ac - ): - """ - Reconstruct a transcript delins across a transcript/genome alignment - gap and map it back to the genome. - - This replaces the two historically duplicated reconstruction blocks. - """ - # Duplications do not expose alt in the same way as NARefAlt. - try: - alt = transcript_gap_alt_n.posedit.edit.alt - except AttributeError: - transcript_gap_n = hgvs_dup_to_delins( - transcript_gap_n - ) - transcript_gap_alt_n = hgvs_dup_to_delins( - transcript_gap_alt_n - ) - alt = transcript_gap_alt_n.posedit.edit.alt - - if alt is None: - alternate_bases = ( - ['X'] - * len(transcript_gap_alt_n.posedit.edit.ref) - ) - else: - alternate_bases = list(alt) - - ref_start = transcript_gap_n.posedit.pos.start.base - alt_start = transcript_gap_alt_n.posedit.pos.start.base - - ref_base_dict = { - ref_start + index: base - for index, base in enumerate( - transcript_gap_n.posedit.edit.ref - ) - } - - alt_base_dict = {} - - for position in range( - transcript_gap_alt_n.posedit.pos.start.base, - transcript_gap_alt_n.posedit.pos.end.base + 1 - ): - if position == alt_start: - alt_base_dict[position] = ''.join( - alternate_bases - ) - else: - alt_base_dict[position] = 'X' - - alternate_sequence_bases = [] - - for position in range( - transcript_gap_n.posedit.pos.start.base, - transcript_gap_n.posedit.pos.end.base + 1 - ): - if position in alt_base_dict: - alternate_sequence_bases.append( - alt_base_dict[position] - ) - elif position in ref_base_dict: - alternate_sequence_bases.append( - ref_base_dict[position] - ) - - transcript_gap_n.posedit.edit.alt = ''.join( - alternate_sequence_bases - ).replace('X', '') - - try: - transcript_gap_variant = self.vm.n_to_c( - transcript_gap_n - ) - except vvhgvs.exceptions.HGVSError: - transcript_gap_variant = transcript_gap_n - - try: - mapped = self.vm.t_to_g( - transcript_gap_variant, - genomic_ac, - alt_aln_method - ) - - return hn.normalize(mapped) - - except vvhgvs.exceptions.HGVSError as e: - if str(e) != 'base start position must be <= end position': - raise - - # Variant must be expanded one base at each side before it can - # map back across the genomic gap. - pre_base, post_base = self._expand_ref( - transcript_gap_n.ac, - transcript_gap_n.posedit.pos.start.base - 2, - transcript_gap_n.posedit.pos.end.base + 1 - ) - - transcript_gap_n.posedit.pos.start.base -= 1 - transcript_gap_n.posedit.pos.end.base += 1 - - transcript_gap_n.posedit.edit.ref = ( - pre_base - + transcript_gap_n.posedit.edit.ref - + post_base - ) - - transcript_gap_n.posedit.edit.alt = ( - pre_base - + transcript_gap_n.posedit.edit.alt - + post_base - ) - - try: - transcript_gap_variant = self.vm.n_to_c( - transcript_gap_n - ) - except vvhgvs.exceptions.HGVSError: - transcript_gap_variant = transcript_gap_n - - mapped = self.vm.t_to_g( - transcript_gap_variant, - genomic_ac, - alt_aln_method - ) - - return hn.normalize(mapped) # ------------------------------------------------------------------ # Determine available mappings @@ -515,6 +502,18 @@ def rebuild_gap_variant( hdp=self.hdp ) + mapping_support_cache = {} + + def _is_supported_for_mapping(genomic_ac): + if genomic_ac not in mapping_support_cache: + mapping_support_cache[genomic_ac] = ( + seq_data.is_supported_for_mapping( + genomic_ac, + primary_assembly + ) + ) + return mapping_support_cache[genomic_ac] + hgvs_genomic = None gap_corrected_hgvs_c = None attempted_mapping_errors = [] @@ -527,16 +526,13 @@ def rebuild_gap_variant( if ( genomic_ac.startswith('NC_') - and seq_data.is_supported_for_mapping( - genomic_ac, - primary_assembly - ) + and _is_supported_for_mapping(genomic_ac) ): # Preserve historical behaviour: the final supported # NC_ encountered becomes the relative accession. hgvs_c.rel_ac = genomic_ac - try: + try: # normalize hn.normalize(hgvs_c) except vvhgvs.exceptions.HGVSError: pass @@ -579,8 +575,7 @@ def rebuild_gap_variant( hgvs_genomic = None if not mapping_options: - raise HGVSDataNotAvailableError( - "No alignment data between the specified transcript " + raise HGVSDataNotAvailableError("No alignment data between the specified transcript " "reference sequence and any GRCh37 and GRCh38 genomic " "reference sequences (including alternate chromosome " "assemblies, patches and RefSeqGenes) are available." @@ -596,12 +591,12 @@ def rebuild_gap_variant( current_options = [] - for option in mapping_options: + for option in mapping_options: # loop through mapping options genomic_ac = option[1] alignment_method = option[2] if alignment_method.startswith('blat'): - continue + continue # continue if genomic_ac.startswith(genomic_ac_type): current_options.append(genomic_ac) @@ -609,10 +604,7 @@ def rebuild_gap_variant( # Requested assembly first. NG_ is not chromosomal. if genomic_ac_type != 'NG_': for genomic_ac in current_options: - if not seq_data.is_supported_for_mapping( - genomic_ac, - primary_assembly - ): + if not _is_supported_for_mapping(genomic_ac): continue try: @@ -621,14 +613,15 @@ def rebuild_gap_variant( genomic_ac ) - except Exception as e: + except Exception as error: attempted_mapping_errors.append( - f"{e}/{hgvs_c.ac}/{genomic_ac}~" + f"{error}/{hgvs_c.ac}/{genomic_ac}~" ) continue - try: - hn.normalize(hgvs_genomic) + try: # normalize + hn.normalize( + hgvs_genomic) except Exception: if norm_f_hgvs_genomic is None: @@ -646,14 +639,11 @@ def rebuild_gap_variant( for genomic_ac in current_options: if ( genomic_ac_type != 'NG_' - and seq_data.is_supported_for_mapping( - genomic_ac, - primary_assembly - ) + and _is_supported_for_mapping(genomic_ac) ): continue - try: + try: # Map to genomic hgvs_genomic = map_to_genomic_ac( hgvs_c, genomic_ac @@ -665,8 +655,9 @@ def rebuild_gap_variant( ) continue - try: - hn.normalize(hgvs_genomic) + try: # Normalize + hn.normalize( + hgvs_genomic) except Exception: if norm_f_hgvs_genomic is None: @@ -719,36 +710,39 @@ def rebuild_gap_variant( # ------------------------------------------------------------------ if hgvs_genomic.posedit.edit.type == 'ins' and gapped_mapping: - try: - hgvs_genomic = hn.normalize(hgvs_genomic) + try: # normalize + hgvs_genomic = hn.normalize( + hgvs_genomic) - except vvhgvs.exceptions.HGVSError as e: - error = str(e) + except vvhgvs.exceptions.HGVSError as error: + error = str(error) - if error == 'insertion length must be 1': + if error == "insertion length must be 1": ref = self.sf.fetch_seq( hgvs_genomic.ac, hgvs_genomic.posedit.pos.start.base - 1, hgvs_genomic.posedit.pos.end.base ) - hgvs_genomic.posedit.edit.ref = ref + hgvs_genomic.posedit.edit.ref = ref # maintain ref hgvs_genomic.posedit.edit.alt = ( ref[:1] + hgvs_genomic.posedit.edit.alt + ref[-1:] ) - hgvs_genomic = hn.normalize(hgvs_genomic) + hgvs_genomic = hn.normalize( + hgvs_genomic) elif error == 'base start position must be <= end position': - start = hgvs_genomic.posedit.pos.start.base - end = hgvs_genomic.posedit.pos.end.base + start = hgvs_genomic.posedit.pos.start.base # catch start + end = hgvs_genomic.posedit.pos.end.base # catch end - hgvs_genomic.posedit.pos.start.base = end - hgvs_genomic.posedit.pos.end.base = start + hgvs_genomic.posedit.pos.start.base = end # set start + hgvs_genomic.posedit.pos.end.base = start # set end - hgvs_genomic = hn.normalize(hgvs_genomic) + hgvs_genomic = hn.normalize( + hgvs_genomic) # ------------------------------------------------------------------ # Restore references required by expanded gap descriptions @@ -758,12 +752,12 @@ def rebuild_gap_variant( stored_hgvs_c.posedit.edit.ref in ('', None) and expand_out ): - if stored_hgvs_c.type == 'c': + if stored_hgvs_c.type == "c": stored_hgvs_n = self.vm.c_to_n( stored_hgvs_c ) - else: - stored_hgvs_n = stored_hgvs_c + else: # else + stored_hgvs_n = stored_hgvs_c # Maintain stored_hgvs_c.posedit.edit.ref = self.sf.fetch_seq( stored_hgvs_n.ac, @@ -782,7 +776,7 @@ def rebuild_gap_variant( hgvs_genomic.posedit.pos.end.base ) - hgvs_genomic.posedit.edit.ref = stored_ref + hgvs_genomic.posedit.edit.ref = stored_ref # Set Ref hgvs_genomic.posedit.edit.alt = ( stored_ref[:1] + hgvs_genomic.posedit.edit.alt @@ -800,11 +794,12 @@ def rebuild_gap_variant( alt_aln_method ) - try: - hn.normalize(nr_genomic) + try: # Normalize + hn.normalize( + nr_genomic) - except vvhgvs.exceptions.HGVSInvalidVariantError as e: - error_type_1 = str(e) + except vvhgvs.exceptions.HGVSInvalidVariantError as error: + error_type_1 = str(error) if ( 'Length implied by coordinates must equal sequence deletion length' @@ -828,8 +823,9 @@ def rebuild_gap_variant( alt_aln_method ) - try: - hn.normalize(genomic_gap_variant) + try: # Normalize + hn.normalize( + genomic_gap_variant) except vvhgvs.exceptions.HGVSInvalidVariantError as e2: if ( @@ -839,20 +835,21 @@ def rebuild_gap_variant( 'Length implied by coordinates must equal' in error_type_1 ): - make_gen_var = copy.copy(nr_genomic) + make_gen_var = copy.deepcopy( + nr_genomic) make_gen_var.posedit.edit.ref = ( self.sf.fetch_seq( nr_genomic.ac, - nr_genomic.posedit.pos.start.base - 1, + nr_genomic.posedit.pos.start.base-1, # set to -1 nr_genomic.posedit.pos.end.base ) ) genomic_gap_variant = make_gen_var - error_type_1 = None + error_type_1 = None # Set to None - else: + else: # else genomic_gap_variant = self.nr_vm.t_to_g( hgvs_c, hgvs_genomic.ac, @@ -873,8 +870,9 @@ def rebuild_gap_variant( alt_aln_method ) - try: - hn.normalize(genomic_gap_variant) + try: # normalize + hn.normalize( + genomic_gap_variant) except Exception as gap_error: gap_error_text = str(gap_error) @@ -959,14 +957,14 @@ def rebuild_gap_variant( genomic_gap_variant.posedit.pos.start.base -= 1 genomic_gap_variant.posedit.pos.end.base += 1 - genomic_gap_variant.posedit.edit.ref = '' + genomic_gap_variant.posedit.edit.ref = "" stored_hgvs_c = copy.deepcopy( hgvs_c ) - try: - genomic_gap_variant.posedit.edit.alt = '' + try: # Set placeholder + genomic_gap_variant.posedit.edit.alt = "" except AttributeError: pass @@ -984,7 +982,7 @@ def rebuild_gap_variant( 'Length implied by coordinates must equal sequence deletion length' not in gap_error_text ): - try: + try: # Normalize transcript_gap_variant = hn.normalize( transcript_gap_variant ) @@ -1000,13 +998,15 @@ def rebuild_gap_variant( ) except vvhgvs.exceptions.HGVSError: - transcript_gap_n = transcript_gap_variant - transcript_gap_alt_n = stored_hgvs_c + transcript_gap_n = transcript_gap_variant # reset + transcript_gap_alt_n = stored_hgvs_c # reset - hgvs_genomic = rebuild_gap_variant( + hgvs_genomic = self._rebuild_gap_variant( transcript_gap_n, transcript_gap_alt_n, - hgvs_genomic.ac + hgvs_genomic.ac, + hn, + alt_aln_method ) # Bypass the later expansion correction. @@ -1039,7 +1039,7 @@ def rebuild_gap_variant( hgvs_genomic.posedit.edit.ref = genomic_ref[1:-1] - if hgvs_genomic.posedit.edit.alt is not None: + if hgvs_genomic.posedit.edit.alt is not None: # Check alt hgvs_genomic.posedit.edit.alt = ( hgvs_genomic.posedit.edit.alt[1:-1] ) @@ -1054,8 +1054,9 @@ def rebuild_gap_variant( alt_aln_method ) - try: - hn.normalize(genomic_gap_variant) + try: # Normalize + hn.normalize( + genomic_gap_variant) except Exception as gap_error: if ( @@ -1095,7 +1096,7 @@ def rebuild_gap_variant( transcript_gap_variant ) - try: + try: # Normalize transcript_gap_n = no_norm_evm.c_to_n( transcript_gap_variant ) @@ -1107,10 +1108,12 @@ def rebuild_gap_variant( transcript_gap_n = transcript_gap_variant transcript_gap_alt_n = stored_hgvs_c - hgvs_genomic = rebuild_gap_variant( + hgvs_genomic = self._rebuild_gap_variant( transcript_gap_n, transcript_gap_alt_n, - hgvs_genomic.ac + hgvs_genomic.ac, + hn, + alt_aln_method ) # ------------------------------------------------------------------ @@ -1123,15 +1126,18 @@ def rebuild_gap_variant( hgvs_c ) ): - try: - hn.normalize(hgvs_genomic) + try: # Normalize + hn.normalize( + hgvs_genomic) except vvhgvs.exceptions.HGVSError as e: - if str(e) == 'insertion length must be 1': - if hgvs_c.type == 'c': - hgvs_t = self.vm.c_to_n(hgvs_c) - else: - hgvs_t = copy.copy(hgvs_c) + if str(e) == "insertion length must be 1": + if hgvs_c.type == "c": + hgvs_t = self.vm.c_to_n( + hgvs_c) + else: # Other error + hgvs_t = copy.copy( + hgvs_c) ins_ref = self.sf.fetch_seq( hgvs_t.ac, @@ -1155,12 +1161,14 @@ def rebuild_gap_variant( offset_pos=True ) - try: - hgvs_c = self.vm.n_to_c(hgvs_t) + try: # map + hgvs_c = self.vm.n_to_c( + hgvs_t) except vvhgvs.exceptions.HGVSError: - hgvs_c = copy.copy(hgvs_t) + hgvs_c = copy.copy( + hgvs_t) - try: + try: # Normalize hgvs_genomic = no_norm_evm.t_to_g( hgvs_c ) @@ -1233,10 +1241,10 @@ def rebuild_gap_variant( except vvhgvs.exceptions.HGVSError: pass - return hgvs_genomic + return hgvs_genomic # Return def noreplace_myevm_t_to_g(self, hgvs_c, variant): - """ + ''' USE WITH MAPPER THAT DOES NOT REPLACE THE REFERENCE GENOMIC BASES AND DOES NOT NORMALIZE. @@ -1247,12 +1255,12 @@ def noreplace_myevm_t_to_g(self, hgvs_c, variant): UTA mapping options in order. Returns a parsed HGVS g. object. - """ - alt_aln_method = self.alt_aln_method + ''' + alt_aln_method = self.alt_aln_method # set alt aln method hgvs_genomic = None attempted_mapping_errors = [] - try: + try: # map hgvs_genomic = variant.evm.t_to_g(hgvs_c) variant.hn.normalize(hgvs_genomic) @@ -1263,6 +1271,18 @@ def noreplace_myevm_t_to_g(self, hgvs_c, variant): hdp=self.hdp ) + mapping_support_cache = {} + + def _is_supported_for_mapping(genomic_ac): + if genomic_ac not in mapping_support_cache: + mapping_support_cache[genomic_ac] = ( + seq_data.is_supported_for_mapping( + genomic_ac, + variant.primary_assembly + ) + ) + return mapping_support_cache[genomic_ac] + if not mapping_options: raise HGVSDataNotAvailableError( "no g. mapping options available" @@ -1275,7 +1295,7 @@ def search_in_options( ): for op in mapping_options: if op[2].startswith('blat'): - continue + continue # loop out blat genomic_ac = op[1] @@ -1283,25 +1303,22 @@ def search_in_options( continue if not final: - chr_num = seq_data.is_supported_for_mapping( - genomic_ac, - variant.primary_assembly - ) + chr_num = _is_supported_for_mapping(genomic_ac) if chr_num_val: if chr_num == 'false': - continue + continue # loop out elif chr_num != 'false': - continue + continue # loop out - try: + try: # Make return return self.vm.t_to_g( hgvs_c, genomic_ac, alt_aln_method ) - except Exception as e: + except Exception as e: # Exception attempted_mapping_errors.append( f"{e}/{hgvs_c.ac}/{genomic_ac}~" ) @@ -1328,7 +1345,7 @@ def search_in_options( ) if candidate is None: - continue + continue # loop out hgvs_genomic = candidate @@ -1337,7 +1354,7 @@ def search_in_options( if final: break - try: + try: # Normalize variant.hn.normalize(hgvs_genomic) except vvhgvs.exceptions.HGVSError: continue @@ -1355,15 +1372,17 @@ def search_in_options( hgvs_c.posedit.edit.type == 'ins' and not hgvs_position_utils.either_position_is_intronic(hgvs_c) ): - try: + try: # Normalize variant.hn.normalize(hgvs_genomic) except vvhgvs.exceptions.HGVSError as e: if str(e) == 'insertion length must be 1': - if hgvs_c.type == 'c': - hgvs_t = self.vm.c_to_n(hgvs_c) - else: - hgvs_t = copy.copy(hgvs_c) + if hgvs_c.type == "c": + hgvs_t = self.vm.c_to_n( + hgvs_c) + else: # if cannot map, copy + hgvs_t = copy.copy( + hgvs_c) ins_ref = self.sf.fetch_seq( hgvs_t.ac, @@ -1387,12 +1406,14 @@ def search_in_options( offset_pos=True ) - try: - hgvs_c = self.vm.n_to_c(hgvs_t) + try: # map + hgvs_c = self.vm.n_to_c( + hgvs_t) except vvhgvs.exceptions.HGVSError: - hgvs_c = copy.copy(hgvs_t) + hgvs_c = copy.copy( + hgvs_t) - try: + try: # Normalize hgvs_genomic = variant.no_norm_evm.t_to_g( hgvs_c ) @@ -1402,22 +1423,27 @@ def search_in_options( e ) - return hgvs_genomic + return hgvs_genomic # return - def myevm_g_to_t(self, evm, hgvs_genomic, alt_ac): - """ - Enhanced transcript to genome position on a specified genomic reference using vm - Deals with mapping from transcript positions that do not exist in the genomic sequence - i.e. the stated position aligns to a genomic gap! - returns parsed hgvs g. object - """ - hgvs_t = evm.g_to_t(hgvs_genomic, alt_ac) - return hgvs_t + def myevm_g_to_t(self, + evm, + hgvs_genomic, + alt_ac): + ''' + Enhanced transcript to genome position on a specified genomic reference using vm not evm + Deals with mapping from transcript positions that do not exist in the genomic sequence i.e. the stated position + aligns to a genomic gap! + - returns parsed hgvs g. object + ''' + hgvs_t = evm.g_to_t(hgvs_genomic, + alt_ac) + return hgvs_t # return def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): # Store the input - alt_aln_method = self.alt_aln_method - stored_hgvs_c = copy.deepcopy(hgvs_c) + alt_aln_method = self.alt_aln_method # set alt aln method + stored_hgvs_c = copy.deepcopy( + hgvs_c) expand_out = False utilise_gap_code = map_dat.is_gapped_map( @@ -1426,7 +1452,7 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): hdp=self.hdp ) - # Warn gap code in use + # Warn that gap code is in use logger.debug("gap_compensation_mvm = %s", utilise_gap_code) if ( @@ -1436,16 +1462,18 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): ): # If NM_ need the n. position if hgvs_c.type == 'c': - hgvs_c = no_norm_evm.c_to_n(hgvs_c) + hgvs_c = no_norm_evm.c_to_n( + hgvs_c) - # Check for intronic - try: - hn.normalize(hgvs_c) - except vvhgvs.exceptions.HGVSError as e: - error = str(e) + # Check for intronic variation + try: # Normalize + hn.normalize( + hgvs_c) + except vvhgvs.exceptions.HGVSError as error: + error = str(error) if 'intronic variant' in error: - logger.debug("Except passed, %s", e) + logger.debug("Except passed, %s", error) elif ( 'Length implied by coordinates must equal sequence deletion length' @@ -1460,13 +1488,14 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): # Check again before continuing if not hgvs_position_utils.either_position_is_intronic(hgvs_c): - try: - # For non-intronic sequence - hgvs_t = copy.deepcopy(hgvs_c) + try: # For non-intronic sequence + hgvs_t = copy.deepcopy( + hgvs_c) # Handle inversions - if hgvs_t.posedit.edit.type == 'inv': - inv_alt = self.revcomp(hgvs_t.posedit.edit.ref) + if hgvs_t.posedit.edit.type == "inv": + inv_alt = self.revcomp( + hgvs_t.posedit.edit.ref) pre_base, post_base = self._expand_ref( hgvs_t.ac, @@ -1484,7 +1513,7 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): offset_pos=True ) - if hgvs_c.posedit.edit.type == 'dup': + if hgvs_c.posedit.edit.type == "dup": pre_base, post_base = self._expand_ref( hgvs_t.ac, hgvs_t.posedit.pos.start.base - 2, @@ -1505,7 +1534,7 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): offset_pos=True ) - elif hgvs_c.posedit.edit.type == 'ins': + elif hgvs_c.posedit.edit.type == "ins": ins_ref = self.sf.fetch_seq( hgvs_t.ac, hgvs_t.posedit.pos.start.base - 2, @@ -1528,9 +1557,9 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): offset_pos=True ) - else: + else: # branch if hgvs_t.posedit.edit.alt is None: - hgvs_t.posedit.edit.alt = '' + hgvs_t.posedit.edit.alt = "" pre_base, post_base = self._expand_ref( hgvs_t.ac, @@ -1548,33 +1577,38 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): offset_pos=True ) - hgvs_c = copy.deepcopy(hgvs_t) + hgvs_c = copy.deepcopy( + hgvs_t) - # Set expanded out test to true + # Set expanded out test to true to handle later expand_out = True - except Exception: + except Exception: # unhandled exception pass # Convert back to c. position from n. position - try: - hgvs_c = no_norm_evm.n_to_c(hgvs_c) + try: # map with evm + hgvs_c = no_norm_evm.n_to_c( + hgvs_c) except vvhgvs.exceptions.HGVSError: - hgvs_c = copy.deepcopy(stored_hgvs_c) + hgvs_c = copy.deepcopy( + stored_hgvs_c) # Ensure the altered c. variant has not crossed intron/exon boundaries - hgvs_check_boundaries = copy.deepcopy(hgvs_c) + hgvs_check_boundaries = copy.deepcopy( + hgvs_c) - try: + try: # normalize hn.normalize(hgvs_check_boundaries) - except vvhgvs.exceptions.HGVSError as e: - error = str(e) + except vvhgvs.exceptions.HGVSError as error: + error = str(error) if 'spanning the exon-intron boundary' in error: - hgvs_c = copy.deepcopy(stored_hgvs_c) + hgvs_c = copy.deepcopy( + stored_hgvs_c) - # Catch identity at the exon/intron boundary by trying to normalize ref only - if hgvs_check_boundaries.posedit.edit.type == 'identity': + # Catch identity at exon/intron boundary by trying to normalize ref only + if hgvs_check_boundaries.posedit.edit.type == "identity": hgvs_reform_ident = hgvs_delins_parts_to_hgvs_obj( hgvs_c.ac, stored_hgvs_c.type, @@ -1584,16 +1618,18 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): offset_pos=True ) - try: - hn.normalize(hgvs_reform_ident) - except vvhgvs.exceptions.HGVSError as e: - error = str(e) + try: # Normalize + hn.normalize( + hgvs_reform_ident) + except vvhgvs.exceptions.HGVSError as error: + error = str(error) if ( 'spanning the exon-intron boundary' in error or 'Normalization of intronic variants' in error ): - hgvs_c = copy.deepcopy(stored_hgvs_c) + hgvs_c = copy.deepcopy( + stored_hgvs_c) hgvs_genomic = self.vm.t_to_g( hgvs_c, @@ -1607,18 +1643,18 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): and hgvs_genomic.posedit.edit.alt == '' and not expand_out ): - hgvs_genomic.posedit.edit.alt = hgvs_genomic.posedit.edit.ref + hgvs_genomic.posedit.edit.alt = hgvs_genomic.posedit.edit.ref # Set alt = ref if hgvs_genomic.posedit.edit.type == 'ins' and utilise_gap_code: if stored_hgvs_c.posedit.edit.type == "dup": stored_hgvs_c = hgvs_dup_to_delins(stored_hgvs_c) - try: - # Can move ins variants (and in doing so break - # mid base == original bases assumption) - pre_norm_genomic = copy.copy(hgvs_genomic) - hgvs_genomic = hn.normalize(hgvs_genomic) + try: # Can move ins variants + pre_norm_genomic = copy.deepcopy( + hgvs_genomic) + hgvs_genomic = hn.normalize( + hgvs_genomic) if ( stored_hgvs_c.posedit.edit.alt @@ -1630,33 +1666,35 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): pre_norm_genomic.posedit.edit.alt = ( pre_norm_genomic.posedit.edit.alt[1:-1] ) - hgvs_genomic = copy.copy(pre_norm_genomic) - hgvs_genomic = hn.normalize(hgvs_genomic) + hgvs_genomic = copy.deepcopy(pre_norm_genomic) + hgvs_genomic = hn.normalize( + hgvs_genomic) hgvs_c.posedit.edit.alt = hgvs_c.posedit.edit.alt[1:-1] - except vvhgvs.exceptions.HGVSError as e: - error = str(e) + except vvhgvs.exceptions.HGVSError as error: + error = str(error) - if error == 'insertion length must be 1': + if error == "insertion length must be 1": ref = self.sf.fetch_seq( hgvs_genomic.ac, hgvs_genomic.posedit.pos.start.base - 1, hgvs_genomic.posedit.pos.end.base ) - hgvs_genomic.posedit.edit.ref = ref + hgvs_genomic.posedit.edit.ref = ref # Set ref = ref hgvs_genomic.posedit.edit.alt = ( ref[:1] + hgvs_genomic.posedit.edit.alt + ref[-1:] ) - hgvs_genomic = hn.normalize(hgvs_genomic) + hgvs_genomic = hn.normalize( + hgvs_genomic) - if error == 'base start position must be <= end position': - start = hgvs_genomic.posedit.pos.start.base - end = hgvs_genomic.posedit.pos.end.base - hgvs_genomic.posedit.pos.start.base = end - hgvs_genomic.posedit.pos.end.base = start - hgvs_genomic = hn.normalize(hgvs_genomic) + if error == "base start position must be <= end position": + start = hgvs_genomic.posedit.pos.start.base # get start base + hgvs_genomic.posedit.pos.start.base = hgvs_genomic.posedit.pos.end.base + hgvs_genomic.posedit.pos.end.base = start # set end to start + hgvs_genomic = hn.normalize( + hgvs_genomic) except AttributeError as e: if "'Dup' object has no attribute 'alt'" in str(e): @@ -1678,20 +1716,20 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): ) and expand_out ): - if stored_hgvs_c.type == 'c': - stored_hgvs_n = self.vm.c_to_n(stored_hgvs_c) - else: - stored_hgvs_n = stored_hgvs_c + if stored_hgvs_c.type == "c": + stored_hgvs_n = self.vm.c_to_n( + stored_hgvs_c) + else: stored_hgvs_n = stored_hgvs_c stored_ref = self.sf.fetch_seq( stored_hgvs_n.ac, stored_hgvs_n.posedit.pos.start.base - 1, stored_hgvs_n.posedit.pos.end.base ) - stored_hgvs_c.posedit.edit.ref = stored_ref + stored_hgvs_c.posedit.edit.ref = stored_ref # set ref to ref - # First look for variants mapping to the flanks of gaps - # either in the gap or on the flank but not fully within the gap + # First look for variants mapping to the flanks of gaps either in the gap or on the flank but not fully within + # the gap if expand_out: nr_genomic = self.nr_vm.t_to_g( hgvs_c, @@ -1699,11 +1737,12 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): alt_aln_method ) - try: - hn.normalize(nr_genomic) + try: # normalize + hn.normalize( + nr_genomic) - except vvhgvs.exceptions.HGVSInvalidVariantError as e: - error_type_1 = str(e) + except vvhgvs.exceptions.HGVSInvalidVariantError as error: + error_type_1 = str(error) if ( 'Length implied by coordinates must equal sequence deletion length' @@ -1731,8 +1770,9 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): alt_aln_method ) - try: - hn.normalize(genomic_gap_variant) + try: # normalize + hn.normalize( + genomic_gap_variant) except vvhgvs.exceptions.HGVSInvalidVariantError as e: if ( @@ -1741,16 +1781,17 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): and 'Length implied by coordinates must equal' in error_type_1 ): - make_gen_var = copy.copy(nr_genomic) + make_gen_var = copy.deepcopy( + nr_genomic) make_gen_var.posedit.edit.ref = self.sf.fetch_seq( nr_genomic.ac, - nr_genomic.posedit.pos.start.base - 1, + nr_genomic.posedit.pos.start.base-1, # set to -1 nr_genomic.posedit.pos.end.base ) - genomic_gap_variant = make_gen_var - error_type_1 = None + genomic_gap_variant = make_gen_var # Set gap var + error_type_1 = None # Set error to None - else: + else: # else if ( genomic_gap_variant.posedit.edit.ref is None and 'Length implied by coordinates must equal' @@ -1759,7 +1800,7 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): # Handle gaps correctly for current expectations. # With delGCTinsGGT when tx GCT maps to gen GT, # output should be delG, not C>G, when normalized. - make_gen_var = copy.copy(nr_genomic) + make_gen_var = copy.deepcopy(nr_genomic) make_gen_var.posedit.edit.ref = self.sf.fetch_seq( nr_genomic.ac, nr_genomic.posedit.pos.start.base - 1, @@ -1775,7 +1816,7 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): alt_aln_method=alt_aln_method ) - if error_type_1 == 'base start position must be <= end position': + if error_type_1 == "base start position must be <= end position": logger.info('Variant is fully within a genomic gap') genomic_gap_variant = self.vm.t_to_g( stored_hgvs_c, @@ -1786,17 +1827,18 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): # Logic: # We have checked that the variant does not cross boundaries, # or is intronic, so it is likely mapping to a genomic gap. - try: - hn.normalize(genomic_gap_variant) + try: # Normalize + hn.normalize( + genomic_gap_variant) except Exception as ea1: if str(ea1) == 'base start position must be <= end position': # This will only happen when the variant is fully # within the gap. - gap_start = genomic_gap_variant.posedit.pos.end.base - gap_end = genomic_gap_variant.posedit.pos.start.base - genomic_gap_variant.posedit.pos.start.base = gap_start - genomic_gap_variant.posedit.pos.end.base = gap_end + gap_start = genomic_gap_variant.posedit.pos.end.base # catch start + gap_end = genomic_gap_variant.posedit.pos.start.base # catch end + genomic_gap_variant.posedit.pos.start.base = gap_start # set start + genomic_gap_variant.posedit.pos.end.base = gap_end # set end if ( 'Length implied by coordinates must equal sequence deletion length' @@ -1818,7 +1860,7 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): genomic_gap_variant.ac, alt_aln_method ) - init_flank_hgvs_genomic = copy.copy( + init_flank_hgvs_genomic = copy.deepcopy( flank_hgvs_genomic ) @@ -1914,22 +1956,23 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): gap_end = ( genomic_gap_variant.posedit.pos.end.base + 1 ) - genomic_gap_variant.posedit.pos.start.base = gap_start - genomic_gap_variant.posedit.pos.end.base = gap_end - genomic_gap_variant.posedit.edit.ref = '' - stored_hgvs_c = copy.deepcopy(hgvs_c) + genomic_gap_variant.posedit.pos.start.base = gap_start # set start + genomic_gap_variant.posedit.pos.end.base = gap_end # set end + genomic_gap_variant.posedit.edit.ref = "" + stored_hgvs_c = copy.deepcopy( + hgvs_c) - # Remove alt - try: - genomic_gap_variant.posedit.edit.alt = '' - except Exception as e: - logger.debug("Except passed, %s", e) + try: # Remove alt + genomic_gap_variant.posedit.edit.alt = "" + except Exception as error: + logger.debug("Except passed, %s", error) # Should be a delins so will normalize statically and # replace the reference bases - genomic_gap_variant = hn.normalize(genomic_gap_variant) + genomic_gap_variant = hn.normalize( + genomic_gap_variant) - # Static map to c. and static normalize + # Static map to c. and static normalize c. transcript_gap_variant = self.vm.g_to_t( genomic_gap_variant, hgvs_c.ac, @@ -1940,7 +1983,7 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): 'Length implied by coordinates must equal sequence deletion length' not in str(ea1) ): - try: + try: # Normalize transcript_gap_variant = hn.normalize( transcript_gap_variant ) @@ -1956,15 +1999,15 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): stored_hgvs_c ) except vvhgvs.exceptions.HGVSError: - transcript_gap_n = transcript_gap_variant - transcript_gap_alt_n = stored_hgvs_c - - # Ensure an ALT exists - try: - if transcript_gap_alt_n.posedit.edit.alt is None: - transcript_gap_alt_n.posedit.edit.alt = 'X' - except Exception as e: - if str(e) == "'Dup' object has no attribute 'alt'": + transcript_gap_n = transcript_gap_variant # reset + transcript_gap_alt_n = stored_hgvs_c # reset + + # Ensure an Alt exists + try: # look for alt is None + if transcript_gap_alt_n.posedit.edit.alt is None: # look for alt is None + transcript_gap_alt_n.posedit.edit.alt = "X" + except Exception as error: + if str(error) == "'Dup' object has no attribute 'alt'": transcript_gap_n = hgvs_dup_to_delins( transcript_gap_n ) @@ -1977,25 +2020,24 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): transcript_gap_n.posedit.edit.ref ) - if transcript_gap_alt_n.posedit.edit.alt is not None: + if (transcript_gap_alt_n.posedit.edit.alt is not None): alternate_bases = list( transcript_gap_alt_n.posedit.edit.alt ) - else: - alternate_bases = ['X'] * len( + else: alternate_bases = ['X'] * len( transcript_gap_alt_n.posedit.edit.ref ) - ref_start = transcript_gap_n.posedit.pos.start.base - alt_start = transcript_gap_alt_n.posedit.pos.start.base + ref_start = transcript_gap_n.posedit.pos.start.base # set start + alt_start = transcript_gap_alt_n.posedit.pos.start.base # set end - ref_base_dict = {} + ref_base_dict = {} # Create blank dict - for base in reference_bases: + for base in reference_bases: # loop bases ref_base_dict[ref_start] = base ref_start += 1 - alt_base_dict = {} + alt_base_dict = {} # create blank dict # All variants forced into delete-insert format. # Deleted ALT bases are represented by X. @@ -2005,10 +2047,9 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): ): if i == alt_start: alt_base_dict[i] = ''.join(alternate_bases) - else: - alt_base_dict[i] = 'X' + else: alt_base_dict[i] = 'X' - alternate_sequence_bases = [] + alternate_sequence_bases = [] # create blank list for i in range( transcript_gap_n.posedit.pos.start.base, @@ -2027,26 +2068,26 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): alternate_sequence_bases ).replace('X', '') - transcript_gap_n.posedit.edit.alt = alternate_sequence + transcript_gap_n.posedit.edit.alt = alternate_sequence # Set alt - try: + try: # Map with vm transcript_gap_variant = self.vm.n_to_c( transcript_gap_n ) - except vvhgvs.exceptions.HGVSError: - transcript_gap_variant = transcript_gap_n + except vvhgvs.exceptions.HGVSError: transcript_gap_variant = transcript_gap_n - try: + try: # Map with vm hgvs_genomic = self.vm.t_to_g( transcript_gap_variant, hgvs_genomic.ac, alt_aln_method ) - pre_norm_genomic = copy.copy(hgvs_genomic) - hgvs_genomic = hn.normalize(hgvs_genomic) + pre_norm_genomic = copy.deepcopy(hgvs_genomic) + hgvs_genomic = hn.normalize( + hgvs_genomic) - except Exception as e: - if str(e) == "base start position must be <= end position": + except Exception as error: + if str(error) == "base start position must be <= end position": # Expansion out required to map back to genome pre_base, post_base = self._expand_ref( transcript_gap_n.ac, @@ -2068,31 +2109,31 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): + post_base ) - try: + try: # vm map transcript_gap_variant = self.vm.n_to_c( transcript_gap_n ) - except vvhgvs.exceptions.HGVSError: - transcript_gap_variant = transcript_gap_n + except vvhgvs.exceptions.HGVSError: transcript_gap_variant = transcript_gap_n hgvs_genomic = self.vm.t_to_g( transcript_gap_variant, hgvs_genomic.ac, alt_aln_method ) - pre_norm_genomic = copy.copy(hgvs_genomic) - hgvs_genomic = hn.normalize(hgvs_genomic) + pre_norm_genomic = copy.deepcopy( + hgvs_genomic) + hgvs_genomic = hn.normalize( + hgvs_genomic) - # Bypass the next bit of gap code + # Bypass the next part of gap code expand_out = False - # CASCADING STATEMENTS WHICH CAPTURE t to g MAPPING OPTIONS - # Remove identity bases - if hgvs_c == stored_hgvs_c: + # CASCADING STATEMENTS that CAPTURE t to g MAPPING OPTIONS + if hgvs_c == stored_hgvs_c: # Remove identity bases from the object expand_out = False elif not expand_out or not utilise_gap_code: - pass + pass # pass # Correct ref inside gap elif expand_out and hgvs_genomic.posedit.edit.ref is None: @@ -2111,7 +2152,7 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): except vvhgvs.exceptions.HGVSError: pass - # Correct expansion ref + 2 + # Correct expansion ref + 2. elif ( expand_out and len(hgvs_genomic.posedit.edit.ref) @@ -2119,10 +2160,10 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): ): hgvs_genomic.posedit.pos.start.base += 1 hgvs_genomic.posedit.pos.end.base -= 1 - hgvs_genomic.posedit.edit.ref = hgvs_genomic.posedit.edit.ref[1:-1] + hgvs_genomic.posedit.edit.ref = hgvs_genomic.posedit.edit.ref[1:-1] # minus external bases try: - if hgvs_genomic.posedit.edit.alt is not None: + if hgvs_genomic.posedit.edit.alt is not None: # Alt exists hgvs_genomic.posedit.edit.alt = ( hgvs_genomic.posedit.edit.alt[1:-1] ) @@ -2145,23 +2186,24 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): alt_aln_method ) - try: - hn.normalize(genomic_gap_variant) + try: # Normalize + hn.normalize( + genomic_gap_variant) - except Exception as e: - if str(e) == 'base start position must be <= end position': - gap_start = genomic_gap_variant.posedit.pos.end.base - gap_end = genomic_gap_variant.posedit.pos.start.base - genomic_gap_variant.posedit.pos.start.base = gap_start - genomic_gap_variant.posedit.pos.end.base = gap_end + except Exception as error: + if str(error) == 'base start position must be <= end position': + gap_start = genomic_gap_variant.posedit.pos.end.base # catch end + gap_end = genomic_gap_variant.posedit.pos.start.base # Catch start + genomic_gap_variant.posedit.pos.start.base = gap_start # Set end + genomic_gap_variant.posedit.pos.end.base = gap_end # Set start - # Remove alt - try: - genomic_gap_variant.posedit.edit.alt = '' - except Exception as e: - logger.debug("Except passed, %s", e) + try: # Remove alt bases + genomic_gap_variant.posedit.edit.alt = "" + except Exception as error: + logger.debug("Except passed, %s", error) - genomic_gap_variant = hn.normalize(genomic_gap_variant) + genomic_gap_variant = hn.normalize( + genomic_gap_variant) transcript_gap_variant = self.vm.g_to_t( genomic_gap_variant, @@ -2181,93 +2223,33 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): stored_hgvs_c ) except vvhgvs.exceptions.HGVSError: - transcript_gap_n = transcript_gap_variant - transcript_gap_alt_n = stored_hgvs_c + transcript_gap_n = transcript_gap_variant # Set gap n + transcript_gap_alt_n = stored_hgvs_c # Set gap c - # Ensure an ALT exists - try: - if transcript_gap_alt_n.posedit.edit.alt is None: - transcript_gap_alt_n.posedit.edit.alt = 'X' - except Exception as e: - if str(e) == "'Dup' object has no attribute 'alt'": - transcript_gap_n = hgvs_dup_to_delins( - transcript_gap_n - ) - transcript_gap_alt_n = hgvs_dup_to_delins( - transcript_gap_alt_n - ) - - reference_bases = list( - transcript_gap_n.posedit.edit.ref - ) - - if transcript_gap_alt_n.posedit.edit.alt is not None: - alternate_bases = list( - transcript_gap_alt_n.posedit.edit.alt - ) - else: - alternate_bases = ['X'] * len( - transcript_gap_alt_n.posedit.edit.ref + transcript_gap_n, transcript_gap_alt_n = ( + self._prepare_gap_alt( + transcript_gap_n, + transcript_gap_alt_n ) + ) - ref_start = transcript_gap_n.posedit.pos.start.base - alt_start = transcript_gap_alt_n.posedit.pos.start.base - - ref_base_dict = {} - - for base in reference_bases: - ref_base_dict[ref_start] = base - ref_start += 1 - - alt_base_dict = {} - - for i in range( - transcript_gap_alt_n.posedit.pos.start.base, - transcript_gap_alt_n.posedit.pos.end.base + 1 - ): - if i == alt_start: - alt_base_dict[i] = ''.join(alternate_bases) - else: - alt_base_dict[i] = 'X' - - alternate_sequence_bases = [] - - for i in range( - transcript_gap_n.posedit.pos.start.base, - transcript_gap_n.posedit.pos.end.base + 1 - ): - if i in alt_base_dict: - alternate_sequence_bases.append( - alt_base_dict[i] - ) - elif i in ref_base_dict: - alternate_sequence_bases.append( - ref_base_dict[i] - ) - - alternate_sequence = ''.join( - alternate_sequence_bases - ).replace('X', '') - - transcript_gap_n.posedit.edit.alt = alternate_sequence - - try: + try: # vm map transcript_gap_variant = self.vm.n_to_c( transcript_gap_n ) - except vvhgvs.exceptions.HGVSError: - transcript_gap_variant = transcript_gap_n + except vvhgvs.exceptions.HGVSError: transcript_gap_variant = transcript_gap_n - try: + try: # vm map hgvs_genomic = self.vm.t_to_g( transcript_gap_variant, hgvs_genomic.ac, alt_aln_method ) - hgvs_genomic = hn.normalize(hgvs_genomic) + hgvs_genomic = hn.normalize( + hgvs_genomic) - except Exception as e: - if str(e) == "base start position must be <= end position": + except Exception as error: + if str(error) == "base start position must be <= end position": pre_base, post_base = self._expand_ref( transcript_gap_n.ac, transcript_gap_n.posedit.pos.start.base - 2, @@ -2288,36 +2270,38 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): + post_base ) - try: + try: # vm map transcript_gap_variant = self.vm.n_to_c( transcript_gap_n ) except vvhgvs.exceptions.HGVSError: - transcript_gap_variant = transcript_gap_n + transcript_gap_variant = transcript_gap_n # Set here hgvs_genomic = self.vm.t_to_g( transcript_gap_variant, hgvs_genomic.ac, alt_aln_method ) - hgvs_genomic = hn.normalize(hgvs_genomic) + hgvs_genomic = hn.normalize( + hgvs_genomic) # Ins variants map badly - especially between c. exon/exon boundary if ( hgvs_c.posedit.edit.type == 'ins' and not hgvs_position_utils.either_position_is_intronic(hgvs_c) ): - try: - hn.normalize(hgvs_genomic) + try: # Normalize + hn.normalize( + hgvs_genomic) - except vvhgvs.exceptions.HGVSError as e: - error = str(e) + except vvhgvs.exceptions.HGVSError as error: + error = str(error) - if error == 'insertion length must be 1': - if hgvs_c.type == 'c': - hgvs_t = self.vm.c_to_n(hgvs_c) - else: - hgvs_t = copy.copy(hgvs_c) + if error == "insertion length must be 1": + if hgvs_c.type == "c": + hgvs_t = self.vm.c_to_n( + hgvs_c) + else: hgvs_t = copy.copy(hgvs_c) ins_ref = self.sf.fetch_seq( hgvs_t.ac, @@ -2341,38 +2325,42 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn, map_dat): offset_pos=True ) - try: - hgvs_c = self.vm.n_to_c(hgvs_t) + try: # vm map + hgvs_c = self.vm.n_to_c( + hgvs_t) except vvhgvs.exceptions.HGVSError: - hgvs_c = copy.copy(hgvs_t) + hgvs_c = copy.copy( + hgvs_t) - try: - hgvs_genomic = no_norm_evm.t_to_g(hgvs_c) + try: # evm map + hgvs_genomic = no_norm_evm.t_to_g( + hgvs_c) except vvhgvs.exceptions.HGVSError as e: logger.info( 'Ins mapping error in myt_to_g %s', e ) - return hgvs_genomic + return hgvs_genomic # return - def hgvs_r_to_c(self, hgvs_object): - """ - Convert r. into c. - """ + def hgvs_r_to_c(self, + hgvs_object): + ''' + Convert r. (RNA) into c. (cDNA) + ''' # Check for LRG_t with r. if 'LRG' in hgvs_object.ac: transcript_ac = self.db.get_refseq_transcript_id_from_lrg_transcript_id( hgvs_object.ac ) - if transcript_ac == 'none': + if transcript_ac == "none": raise HGVSDataNotAvailableError( 'Unable to identify a relevant transcript for ' + hgvs_object.ac ) - hgvs_object.ac = transcript_ac + hgvs_object.ac = transcript_ac # Set accession - hgvs_object.type = 'c' + hgvs_object.type = "c" edit = hgvs_object.posedit.edit # Uppercase and switch U to T. @@ -2407,9 +2395,9 @@ def relevant_transcripts( reverse_normalizer, select_transcripts ): - """ + ''' Automatically maps genomic positions onto all overlapping transcripts. - """ + ''' # The two region queries differ by one base at each boundary. # Combine both to avoid missing transcripts at either end. rts_list = self.hdp.get_tx_for_region( @@ -2513,10 +2501,10 @@ def relevant_transcripts( ) # Project genomic variant onto overlapping transcripts. - code_var = [] + code_var = [] # Blank list for tx_ac in rts: - try: + try: # emv map variant = evm.g_to_t( hgvs_genomic, tx_ac @@ -2529,20 +2517,20 @@ def relevant_transcripts( else hgvs_genomic ) - try: + try: # evm map variant = evm.g_to_t( curr_genomic, tx_ac ) except vvhgvs.exceptions.HGVSError: - continue + continue # loop out except Exception as err: logger.info( 'non expected err type %s', err ) - continue + continue # loop out try: reverse_normalizer.normalize(variant) @@ -2565,7 +2553,7 @@ def relevant_transcripts( or hgvs_position_utils.start_is_3_prime_utr(variant) or hgvs_position_utils.end_is_3_prime_utr(variant) ): - tx_ac = variant.ac + tx_ac = variant.ac # Set accession try: if rts_dict[tx_ac] < 0: @@ -2588,44 +2576,51 @@ def relevant_transcripts( code_var.append(variant) - return code_var + return code_var # return def validateHGVS(self, query): - """ - Take HGVS string, parse into hgvs object and validate - """ + ''' + Take string, and parse into hgvs object and validate + ''' if type(query) is str: hgvs_input = self.hp.parse_hgvs_variant(query) else: hgvs_input = query - try: - self.vr.validate(hgvs_input) + try: # validate + self.vr.validate( + hgvs_input) except vvhgvs.exceptions.HGVSError as e: return e - else: + else: # else return 'false' - def entrez_efetch(self, db, id, rettype, retmode): - """ - Search Entrez databases with efetch and SeqIO - """ + def entrez_efetch(self, + db, + id, + rettype, + retmode): + ''' + Search Entrez databases - efetch and SeqIO + ''' Entrez.email = self.entrez_email Entrez.tool = 'VariantValidator' if self.entrez_api_key: Entrez.api_key = self.entrez_api_key - # from Bio import SeqIO - handle = Entrez.efetch(db=db, id=id, rettype=rettype, retmode=retmode) - # Get record - record = SeqIO.read(handle, "gb") - # Place into text - handle.close() - return record - - def revcomp(self, bases): - """ + + handle = Entrez.efetch(db=db, + id=id, + rettype=rettype, + retmode=retmode) + record = SeqIO.read(handle, 'gb') + handle.close() # Close handle + return record # and return result + + def revcomp(self, + bases): + ''' Return the reverse complement of a nucleotide sequence. - """ + ''' return fn.simple_dna_revcomp(bases) def merge_hgvs_3pr( @@ -2637,14 +2632,14 @@ def merge_hgvs_3pr( hgvs_strict=False, map_dat=None ): - """ + ''' Merge multiple HGVS variants into a single delins using 3-prime normalization. Production paths are expected to supply parsed HGVS objects. Unit tests may supply HGVS strings, which are parsed at the testing boundary. - """ - h_list = [] + ''' + h_list = [] # Blank list store_ref_type = "" c_to_g_mapped = { @@ -2657,8 +2652,7 @@ def merge_hgvs_3pr( if not tx_map_dat: tx_map_dat = TranscriptMapData(hdp=self.hdp) - # Prepare and validate submitted HGVS variants. - for hgvs_v in hgvs_variant_list: + for hgvs_v in hgvs_variant_list: # Prepare and validate submitted HGVS variants. # Validate the HGVS object BEFORE converting c. coordinates to the # internal n. representation used by the merge. @@ -2693,11 +2687,12 @@ def merge_hgvs_3pr( ) # Convert coding coordinates only AFTER validation. - if hgvs_v.type == 'c': - store_ref_type = 'c' + if hgvs_v.type == "c": + store_ref_type = "c" - try: - hgvs_v = self.vm.c_to_n(hgvs_v) + try: # vm map + hgvs_v = self.vm.c_to_n( + hgvs_v) except Exception: raise fn.mergeHGVSerror( "AlleleSyntaxError: Unable to map from c. position to " @@ -2709,7 +2704,8 @@ def merge_hgvs_3pr( "AlleleSyntaxError: Unsupported HGVS reference type" ) - h_list.append(hgvs_v) + h_list.append( + hgvs_v) # Map intronic transcript variants to the supplied genomic reference. if c_to_g_mapped["mapped"]: @@ -2775,7 +2771,7 @@ def merge_hgvs_3pr( for hgvs_v in h_list: # Intronic positions require a genomic reference. - try: + try: # Check intronic if ( hgvs_v.posedit.pos.start.offset != 0 and genomic_reference is False @@ -2795,25 +2791,27 @@ def merge_hgvs_3pr( except AttributeError as e: logger.debug("Except passed, %s", e) - try: - hgvs_v = hn.normalize(hgvs_v) + try: # Normalize + hgvs_v = hn.normalize( + hgvs_v) except vvhgvs.exceptions.HGVSUnsupportedOperationError: pass - if accession is None: - accession = hgvs_v.ac - seqtype = hgvs_v.type + if accession is None: # Set accession if None + accession = hgvs_v.ac # accession + seqtype = hgvs_v.type # edit type elif hgvs_v.ac != accession: raise fn.mergeHGVSerror( "AlleleSyntaxError: More than one reference sequence submitted" ) - if merge_start_pos is None: - merge_start_pos = hgvs_v.posedit.pos.start.base - merge_end_pos = hgvs_v.posedit.pos.end.base - full_list.append(hgvs_v) - continue + if merge_start_pos is None: # Set merge + merge_start_pos = hgvs_v.posedit.pos.start.base # start position + merge_end_pos = hgvs_v.posedit.pos.end.base # end position + full_list.append( + hgvs_v) + continue # loop out if hgvs_v.posedit.pos.start.base <= merge_end_pos: raise fn.mergeHGVSerror( @@ -2840,8 +2838,9 @@ def merge_hgvs_3pr( ) ) - merge_end_pos = hgvs_v.posedit.pos.end.base - full_list.append(hgvs_v) + merge_end_pos = hgvs_v.posedit.pos.end.base # set end position + full_list.append( + hgvs_v) # Strict HGVS merge-rule handling. check_frame_restore = False @@ -2948,14 +2947,16 @@ def merge_hgvs_3pr( hgvs_variant_list = cp_hgvs_variant_list # Build the merged alternate sequence directly from HGVS objects. - alt_sequence = '' + alt_parts = [] for hgvs_v in full_list: ref_alt = hgvs_utils.hgvs_ref_alt( hgvs_v, self.sf ) - alt_sequence += ref_alt['alt'] + alt_parts.append(ref_alt['alt']) + + alt_sequence = ''.join(alt_parts) reference_sequence = self.sf.fetch_seq( accession, @@ -2972,14 +2973,16 @@ def merge_hgvs_3pr( end=merge_end_pos ) - try: - hgvs_delins = self.vm.n_to_c(hgvs_delins) + try: # vm map + hgvs_delins = self.vm.n_to_c( + hgvs_delins) except Exception as e: logger.debug("Except passed, %s", e) if final_norm: - try: - hgvs_delins = hn.normalize(hgvs_delins) + try: # normalize + hgvs_delins = hn.normalize( + hgvs_delins) except HGVSUnsupportedOperationError as e: logger.debug("Except passed, %s", e) @@ -3042,13 +3045,13 @@ def merge_hgvs_3pr( f"{fn.valstr(hgvs_delins)}" ) - return hgvs_delins + return hgvs_delins # return def hgvs_alleles(self, my_variant, genomic_reference=False): - """ + ''' HGVS allele handling function which takes a single HGVS allele description and separates each allele into a list of HGVS variants. - """ + ''' logger.info( "HGVS allele handling function with variant %s and genomic reference " "set to %s", @@ -3056,7 +3059,7 @@ def hgvs_alleles(self, my_variant, genomic_reference=False): genomic_reference ) - try: + try: # try split description accession, remainder = my_variant.quibble.split(':') logger.info( "Accession: %s and remainder: %s", @@ -3116,7 +3119,7 @@ def _check_and_fix_for_ex_repeat( pe, genomic_reference ): - """ + ''' Detect expanded repeat syntax within an allele and convert it to a normalised HGVS SequenceVariant for downstream processing. @@ -3124,7 +3127,7 @@ def _check_and_fix_for_ex_repeat( ------- tuple (repeat_variant_or_None, genomic_reference) - """ + ''' if ( not pe.endswith("]") or not re.search(r"[GATC]+\[\d+\]$", pe) @@ -3199,14 +3202,14 @@ def _check_and_fix_for_ex_repeat( return repeat_to_delins, genomic_reference def _parse_posedits(posedits, prefix=''): - """ + ''' Parse one semicolon-separated allele into HGVS objects. The returned list contains HGVS SequenceVariant objects only. - """ + ''' nonlocal genomic_reference - current_allele = [] + current_allele = [] # blank list for pe in posedits.split(';'): if '?' in pe or pe == '0': @@ -3235,12 +3238,12 @@ def _parse_posedits(posedits, prefix=''): return current_allele def _validate_merges(alleles): - """ + ''' Apply strict HGVS merge validation to each non-empty allele. merge_hgvs_3pr() is called for its validation behaviour here; its returned merged variant is not required. - """ + ''' for each_allele in alleles: if not each_allele: continue @@ -3262,42 +3265,46 @@ def _validate_merges(alleles): # Remove the shared position and surrounding allele brackets. remainder = remainder[len(pos):] - remainder = remainder[1:-1] + remainder = remainder[1:-1] # Remove outer bases - alleles = remainder.split('];[') - my_alleles = [] + alleles = remainder.split('];[') # Split at alle markers + my_alleles = [] # Blank list - for posedit in alleles: + for posedit in alleles: # Loop through posedits # NM_004006.2:c.2376[G>C];[(G>C)] if '(' in posedit: - continue + continue # loop out current_allele = _parse_posedits( posedit, prefix=pos ) - my_alleles.append(current_allele) + my_alleles.append( + current_allele) - else: + else: # else var_type, remainder = remainder.split('.', 1) if '(;)' in remainder and '];' in remainder: - # NM_004006.2:c.[296T>G];[476T>C](;)1083A>C(;)1406del - pre_alleles = remainder.split('(;)') + # NM_004006.2:c.[296T>G];[476T>C](;)1083A>C(;)1406del. + pre_alleles = remainder.split( + '(;)' + ) - pre_merges = [] - alleles = [] + pre_merges = [] # blank list + alleles = [] # blank list - for allele in pre_alleles: + for allele in pre_alleles: # loop alleles if '[' in allele: - pre_merges.append(allele) - else: - alleles.append(allele) + pre_merges.append( + allele) + else: # else + alleles.append( + allele) - my_alleles = [] + my_alleles = [] # Blank list - # Unbracketed alleles. - for posedits in alleles: + for posedits in alleles: # Unbracketed alleles. my_alleles.append( _parse_posedits(posedits) ) @@ -3323,10 +3330,12 @@ def _validate_merges(alleles): ] elif '(;)' in remainder: - # Uncertain phase without bracketed allele syntax. - # - # NM_004006.2:c.2376G>C(;)3103del - # NM_000548.3:c.3623_3647del(;)3745_3756dup + """ + Uncertain phase without bracketed allele syntax. + + NM_004006.2:c.2376G>C(;)3103del + NM_000548.3:c.3623_3647del(;)3745_3756dup + """ if '[' in remainder: raise fn.alleleVariantError( 'Unsupported format ' + @@ -3340,13 +3349,15 @@ def _validate_merges(alleles): for posedits in remainder.split('(;)') ] - else: - # Standard bracketed allele syntax. - # - # NM_004006.2:c.[2376G>C];[3103del] - # NM_004006.2:c.[296T>G;476C>T;1083A>C]; - # [296T>G;1083A>C] - # NM_000548.3:c.[4358_4359del;4361_4372del] + else: # else + """ + Standard bracketed allele syntax. + + NM_004006.2:c.[2376G>C];[3103del] + NM_004006.2:c.[296T>G;476C>T;1083A>C]; + [296T>G;1083A>C] + NM_000548.3:c.[4358_4359del;4361_4372del] + """ if '(' in remainder: raise fn.alleleVariantError( 'Unsupported format ' + @@ -3380,21 +3391,24 @@ def _validate_merges(alleles): for allele in alleles_l ] - except Exception as e: + except Exception as e: # except exc_type, exc_value, last_traceback = sys.exc_info() logger.error("%s %s", exc_type, exc_value) - raise fn.alleleVariantError(str(e)) + raise fn.alleleVariantError( + str(e) + ) def chr_to_rsg(self, hgvs_genomic, hn): - """ + ''' Convert a chromosomal HGVS description to RefSeqGene. - """ - hgvs_genomic = hn.normalize(hgvs_genomic) + ''' + hgvs_genomic = hn.normalize( + hgvs_genomic) - chr_ac = hgvs_genomic.ac + chr_ac = hgvs_genomic.ac # set accession chr_start_pos = hgvs_genomic.posedit.pos.start.base chr_end_pos = hgvs_genomic.posedit.pos.end.base - chr_edit = hgvs_genomic.posedit.edit + chr_edit = hgvs_genomic.posedit.edit # set edit all_info = self.db.get_g_to_g_info( gen_id=chr_ac, @@ -3404,13 +3418,13 @@ def chr_to_rsg(self, hgvs_genomic, hn): descriptions = [] - for line in all_info: + for line in all_info: # Loop through info if not ( chr_ac == line[1] and chr_start_pos >= int(line[2]) and chr_end_pos <= int(line[3]) ): - continue + continue # Loop out rsg_ac = line[0] rsg_start = int(line[2]) @@ -3420,7 +3434,7 @@ def chr_to_rsg(self, hgvs_genomic, hn): edit = copy.deepcopy(chr_edit) - if ori == '+': + if ori == "+": start = chr_start_pos - rsg_start + 1 end = chr_end_pos - rsg_start + 1 @@ -3460,26 +3474,28 @@ def chr_to_rsg(self, hgvs_genomic, hn): offset_pos=True ) - try: - hgvs_refseqgene = hn.normalize(hgvs_refseqgene) + try: # Normalize + hgvs_refseqgene = hn.normalize( + hgvs_refseqgene) except vvhgvs.exceptions.HGVSError: descriptions.append({ 'hgvs_refseqgene': hgvs_refseqgene, 'gene': gene, 'valid': 'Not in SeqRepo' }) - continue + continue # loop out - try: - self.vr.validate(hgvs_refseqgene) + try: # validate + self.vr.validate( + hgvs_refseqgene) except vvhgvs.exceptions.HGVSError as e: - error = str(e) + error = str(e) # strign error if 'does not agree with reference sequence' in error: match = re.findall(r'\(([GATC]+)\)', error) hgvs_refseqgene.posedit.edit.ref = match[1] - error = 'true' + error = "true" descriptions.append({ 'hgvs_refseqgene': hgvs_refseqgene, @@ -3487,44 +3503,44 @@ def chr_to_rsg(self, hgvs_genomic, hn): 'valid': error }) - else: + else: # else descriptions.append({ 'hgvs_refseqgene': hgvs_refseqgene, 'gene': gene, 'valid': 'true' }) - return descriptions + return descriptions # return def rsg_to_chr(self, hgvs_refseqgene, primary_assembly, hn): - """ + ''' Convert a RefSeqGene HGVS description to chromosomal HGVS. - - :param hgvs_refseqgene: - :param primary_assembly: - :param hn: HGVS Normalizer - :return: - """ - try: - hgvs_refseqgene = hn.normalize(hgvs_refseqgene) + :param hgvs_refseqgene + :param primary_assembly + :param hn: - HGVS Normalizer + :return + ''' + try: # Normalize + hgvs_refseqgene = hn.normalize( + hgvs_refseqgene) except vvhgvs.exceptions.HGVSError as e: logger.debug("Except passed, %s", e) - rsg_ac = hgvs_refseqgene.ac + rsg_ac = hgvs_refseqgene.ac # set accession rsg_start_pos = hgvs_refseqgene.posedit.pos.start.base rsg_end_pos = hgvs_refseqgene.posedit.pos.end.base - rsg_edit = hgvs_refseqgene.posedit.edit + rsg_edit = hgvs_refseqgene.posedit.edit # set edit all_info = self.db.get_g_to_g_info(rsg_id=rsg_ac) descriptions = [] - for line in all_info: + for line in all_info: # loop through info if not ( rsg_ac == line[0] and primary_assembly == line[6] ): - continue + continue # loop out chr_ac = line[1] chr_start = int(line[2]) @@ -3534,7 +3550,7 @@ def rsg_to_chr(self, hgvs_refseqgene, primary_assembly, hn): edit = copy.deepcopy(rsg_edit) - if ori == '+': + if ori == "+": start = chr_start + rsg_start_pos - 1 end = chr_start + rsg_end_pos - 1 @@ -3564,8 +3580,7 @@ def rsg_to_chr(self, hgvs_refseqgene, primary_assembly, hn): + 1 ) - else: - continue + else: continue hgvs_genomic = hgvs_obj_from_existing_edit( chr_ac, @@ -3576,18 +3591,19 @@ def rsg_to_chr(self, hgvs_refseqgene, primary_assembly, hn): offset_pos=True ) - hgvs_genomic = hn.normalize(hgvs_genomic) + hgvs_genomic = hn.normalize( + hgvs_genomic) - try: + try: # validate self.vr.validate(hgvs_genomic) - except vvhgvs.exceptions.HGVSError as e: - error = str(e) + except vvhgvs.exceptions.HGVSError as error: + error = str(error) if 'does not agree with reference sequence' in error: match = re.findall(r'\(([GATC]+)\)', error) hgvs_genomic.posedit.edit.ref = match[1] - error = 'true' + error = "true" descriptions.append({ 'hgvs_genomic': str(hgvs_genomic), @@ -3595,20 +3611,20 @@ def rsg_to_chr(self, hgvs_refseqgene, primary_assembly, hn): 'valid': error }) - else: + else: # else descriptions.append({ 'hgvs_genomic': str(hgvs_genomic), 'gene': gene, 'valid': 'true' }) - return descriptions + return descriptions # return def transcript_filter(self, rts, select_transcripts=None): - """ + ''' Filter transcript lists to the latest accession versions, or return explicitly selected transcripts. - """ + ''' if self.testing or select_transcripts == 'raw': return rts diff --git a/VariantValidator/modules/vvMixinCore.py b/VariantValidator/modules/vvMixinCore.py index bac60736..3901c3b0 100644 --- a/VariantValidator/modules/vvMixinCore.py +++ b/VariantValidator/modules/vvMixinCore.py @@ -1,12 +1,11 @@ import vvhgvs import vvhgvs.exceptions import vvhgvs.normalizer -from vvhgvs.enums import Datum -import copy import json import logging import re import time +import copy from vvhgvs.location import Interval from vvhgvs.sequencevariant import SequenceVariant @@ -35,7 +34,7 @@ ) from vvhgvs.location import AAPosition from vvhgvs.posedit import PosEdit -from vvhgvs.edit import AASub +from vvhgvs.edit import AASub, AARefAlt logger = logging.getLogger(__name__) @@ -44,7 +43,20 @@ class ValidatorSubmissionError(Exception): pass -class Mixin(vvMixinConverters.Mixin): +_mapable_assemblies = { + 'GRCh37': True, + 'GRCh38': True, + 'NCBI36': False +} + +_VCF_WHITESPACE_RE = re.compile(r'\s+\d+\s+') +_VCF_REFERENCE_PREFIXES = ('g.', 'c.', 'r.', 'n.', 'm.', 'o.') +_TRANSCRIPT_RE = re.compile(r'(ENST|NM_|NR_)\d+\.\d+') +_VERSION_RE = re.compile(r'\d\.\d') + + +class Mixin( + vvMixinConverters.Mixin): """ This module contains the main function for variant validator. It's added to the Validator object in the vvObjects file. @@ -128,7 +140,7 @@ def _selected_transcript_dicts(self, select_transcripts): transcript_id ) if transcript_id == "none": - continue + continue # loop out selected_with_version[transcript_id] = "" selected[transcript_id.split(".", 1)[0]] = "" @@ -249,31 +261,27 @@ def validate(self, ) batch_list = self._build_batch(batch_variant) - # Create List to carry batch data output - batch_out = [] + batch_out = [] # Create List to carry batch data output - # Enter the validation loop - ########################### - # Allow order by input - ordering = 0 + # Enter the validation loop. + ############################ - """ - Set a flag to mark the final output type - flag : warning - flag : error - flag : intragenic - flag : gene - flag : mitochondrial - """ + ordering = 0 # Allow order by input. - logger.debug("Batch list length " + str(len(batch_list))) + # Set a flag to mark the final output type + # flag : warning + # flag : error + # flag : intragenic + # flag : gene + # flag : mitochondrial + + logger.debug("Batch list length %s", len(batch_list)) for my_variant in batch_list: self._set_variant_normalizers(my_variant) - # This will be used to order the final output if not my_variant.order: - ordering = ordering + 1 + ordering = ordering + 1 # This will be used to order the final output. my_variant.order = ordering if not isinstance(my_variant.quibble, str): @@ -290,12 +298,12 @@ def validate(self, if my_variant.reftype in [':c.', ':n.']: my_variant.gene_symbol = self.db.get_gene_symbol_from_transcript_id( - my_variant.quibble.ac) + my_variant.quibble.ac) try: toskip = mappers.transcripts_to_gene( - my_variant, - self, - select_transcripts_dict_plus_version) + my_variant, + self, + select_transcripts_dict_plus_version) except mappers.MappersError: my_variant.output_type_flag = 'warning' continue @@ -306,7 +314,7 @@ def validate(self, # normally happens in structure_checks! # (do we want to change the normal location too ?) my_variant.gene_symbol = self.db.get_gene_symbol_from_transcript_id( - my_variant.quibble.ac) + my_variant.quibble.ac) if my_variant.gene_symbol == 'none': my_variant.gene_symbol = '' if toskip: @@ -314,7 +322,7 @@ def validate(self, my_variant.hgvs_transcript_variant = my_variant.quibble # set output to variant type specific - if my_variant.reftype in [':n.',':t.',':c.'] and my_variant.hgvs_transcript_variant != '': + if my_variant.reftype in [':n.', ':t.', ':c.'] and my_variant.hgvs_transcript_variant != '': my_variant.output_type_flag = 'gene' elif my_variant.reftype == ':g.': my_variant.output_type_flag = 'intergenic' @@ -323,8 +331,8 @@ def validate(self, continue - # Bug catcher - try: + # Bug catcher. + try: # Trap bugs ############################################################### # Runtime information and errors at warning and above only!!! # ############################################################### @@ -351,11 +359,11 @@ def validate(self, 'Unicode characters can be found at https://unicode-search.net/' % (chars, positions) my_variant.warnings.append(error) logger.info(error) - continue + continue # loop out # VCF line handling - Note: handling csv brings too many issues, so stick to tabs tsv - if (("\t" in my_variant.quibble or re.search(r"\s+\d+\s+", my_variant.quibble)) - and not re.search(r"[gcrnmo]\.", my_variant.quibble)): + if (("\t" in my_variant.quibble or _VCF_WHITESPACE_RE.search(my_variant.quibble)) + and not any(prefix in my_variant.quibble for prefix in _VCF_REFERENCE_PREFIXES)): try: my_variant.quibble = vcf_to_pvcf.vcf_to_shorthand(my_variant.quibble) my_variant.original = ",".join(my_variant.original.split("\t")) @@ -364,7 +372,11 @@ def validate(self, my_variant.warnings.append(f"VcfConversionWarning: VCF line identified and converted " f"to {my_variant.quibble}") except vcf_to_pvcf.VcfConversionError as e: - logger.info(f"Cannot convert {my_variant.quibble} into PVCF format {e}") + logger.info( + "Cannot convert %s into PVCF format %s", + my_variant.quibble, + e, + ) continue # Remove whitespace and quotes @@ -372,32 +384,34 @@ def validate(self, my_variant.remove_quotes() my_variant.remove_typos() - # Set the primary_assembly + # Set the primary_assembly. if not my_variant.primary_assembly: - if selected_assembly == 'hg19': - primary_assembly = 'GRCh37' - elif selected_assembly == 'hg38': - primary_assembly = 'GRCh38' - # Ensure genome build is correctly formatted + if selected_assembly == "hg19": + primary_assembly = "GRCh37" + elif selected_assembly == "hg38": + primary_assembly = "GRCh38" + + # Ensure genome build is correctly formatted. elif selected_assembly.upper().startswith("GRC"): selected_assembly = ( selected_assembly[:3].upper() + selected_assembly[3:].lower() ) - primary_assembly = selected_assembly - # Catch invalid genome build + primary_assembly = selected_assembly # set assembly + + # Catch invalid genome build. if primary_assembly in self.genome_builds or primary_assembly == 'hg38': my_variant.primary_assembly = primary_assembly my_variant.selected_assembly = selected_assembly else: my_variant.primary_assembly = 'GRCh38' my_variant.selected_assembly = selected_assembly - primary_assembly = 'GRCh38' + primary_assembly = "GRCh38" my_variant.warnings.append('Invalid genome build has been specified. Automap has selected ' 'the default build (GRCh38)') logger.info( 'Invalid genome build has been specified. Automap has selected the ' 'default build ' + my_variant.primary_assembly) - else: + else: # Set primary_assembly = my_variant.primary_assembly # Create the additional required normalizers which come from allele merge code and other sources @@ -409,7 +423,7 @@ def validate(self, # Are submitted ENST transcripts coding or noncoding? if "ENST" in my_variant.quibble or "NM_" in my_variant.quibble or "NR_" in my_variant.quibble: - match = re.search(r"(ENST|NM_|NR_)\d+\.\d+", my_variant.quibble) + match = _TRANSCRIPT_RE.search(my_variant.quibble) if match: result = match.group() @@ -433,7 +447,7 @@ def validate(self, except vvhgvs.exceptions.HGVSDataNotAvailableError as e: if "No transcript definition for" in str(e): my_variant.warnings.append("The transcript " + result + " is not in " - "our database. Please check the transcript ID") + "our database. Please check the transcript ID") versions_available = [] for i in range(1, 20): accession, version = result.split(".") @@ -540,7 +554,7 @@ def validate(self, if ( "The entered coordinates do not agree with the intron/exon " "boundaries for the selected transcript" - not in str(my_variant.warnings[0]) + not in my_variant.warnings[0] ): my_variant.warnings.reverse() @@ -556,25 +570,26 @@ def validate(self, else: if my_variant.warnings is not None and my_variant.hgvs_genomic is not None: - if "NC_" in str(my_variant.hgvs_genomic) and my_variant.reformat_output == "uncertain_pos": + if my_variant.hgvs_genomic.ac.startswith("NC_") and my_variant.reformat_output == "uncertain_pos": my_variant.primary_assembly_loci = {my_variant.primary_assembly.lower(): - {"hgvs_genomic_description":my_variant.hgvs_genomic, - "vcf": {"chr": None, - "pos": None, - "ref": None, - "alt": None},}} + { + "hgvs_genomic_description": my_variant.hgvs_genomic, + "vcf": {"chr": None, + "pos": None, + "ref": None, + "alt": None}, }} if isinstance(my_variant.quibble, str): lovd_response = lovd_api.lovd_syntax_check(my_variant.original, do_lovd_check=self.lovd_syntax_check) - if "lovd_api_error" not in lovd_response.keys(): + if "lovd_api_error" not in lovd_response: my_variant.output_type_flag = 'warning' my_variant.lovd_syntax_check = lovd_response if toskip: if my_variant.primary_assembly_loci is None: my_variant.primary_assembly_loci = {} - continue + continue # Loop out - # INITIAL USER INPUT FORMATTING + # INITIAL USER INPUT FORMATTING. initial_formatting.initial_user_formattng(my_variant, self) # Set some configurations @@ -584,24 +599,22 @@ def validate(self, logger.debug("Variant input formatted, proceeding to validate.") - # Change RNA bases to upper case but nothing else if my_variant.reftype == ":r.": query_r_var = copy.deepcopy(formatted_variant) edit = formatted_variant.posedit.edit if edit.ref: edit.ref = edit.ref.lower() - if not edit.type in ['inv', 'dup'] and edit.alt: + if edit.type not in ['inv', 'dup'] and edit.alt: edit.alt = edit.alt.lower() formatted_variant.posedit.edit = edit # do we need to limit the supported variant types? # the case for the reftype needs to already have been checked at this point - if str(query_r_var) != str(formatted_variant): + if query_r_var != formatted_variant: e = "This not a valid HGVS description, due to characters being in the wrong case. " \ "Please check the use of upper- and lowercase characters." - my_variant.warnings.append(str(e)) - logger.info(str(e)) - + my_variant.warnings.append(e) + logger.info("%s", e) my_variant.hgvs_formatted = formatted_variant @@ -610,8 +623,7 @@ def validate(self, else: my_variant.hgvs_formatted.ac = my_variant.hgvs_formatted.ac.upper() - if my_variant.hgvs_formatted.type == "p" and my_variant.hgvs_formatted.posedit is None \ - and ":p.?" in str(my_variant.hgvs_formatted): + if my_variant.hgvs_formatted.type == "p" and my_variant.hgvs_formatted.posedit is None: # Protein variants needed early! toskip = format_converters.proteins(my_variant, self) @@ -630,39 +642,37 @@ def validate(self, try: formatted_variant = str(my_variant.hgvs_formatted) except KeyError as e: - if "p" in my_variant.hgvs_formatted.type: + if my_variant.hgvs_formatted.type == "p": error = "Invalid amino acid %s stated in description %s" % ( - str(e), - str(my_variant.quibble.format({'p_3_letter':False}))) + str(e), + my_variant.quibble.format({'p_3_letter': False})) my_variant.warnings.append(error) continue my_variant.set_quibble(my_variant.hgvs_formatted) - logger.debug("HVGS acceptance test passed") - - # Check whether supported genome build is requested for non g. descriptions - mapable_assemblies = { - 'GRCh37': True, - 'GRCh38': True, - 'NCBI36': False - } - is_mapable = mapable_assemblies.get(primary_assembly) + logger.debug("HGVS acceptance test passed") + + # Check whether supported genome build is requested for non g. descriptions. + + is_mapable = _mapable_assemblies.get(primary_assembly) if is_mapable: - # These objects cannot be moved outside of the main function because they gather data from the - # user input e.g. alignment method and genome build - # They initiate quickly, so no need to move them unnecessarily + """ + These objects cannot be moved outside of the main function because they gather data from the + user input e.g. alignment method and genome build + They initiate quickly, so no need to move them unnecessarily + """ self._set_variant_mappers(my_variant, primary_assembly) - else: + else: # else error = 'Mapping of ' + formatted_variant + ' to genome assembly ' + \ primary_assembly + ' is not supported' my_variant.warnings.append(error) logger.info(error) - continue + continue # loop out - # Catch interval end > interval start + # Catch interval end > interval start.. # hgvs did/does not handle 3' UTR position ordering well. This function # ensures that end pos is not > start pos wrt 3' UTRs. # Also identifies some variants which span into the downstream sequence @@ -673,87 +683,93 @@ def validate(self, isinstance(my_variant.quibble.posedit.pos.end, Interval): continue - if '*' in str(my_variant.hgvs_formatted.posedit): + if ( + my_variant.hgvs_formatted.type == "c" + and ( + hgvs_position_utils.start_is_3_prime_utr(my_variant.hgvs_formatted) + or hgvs_position_utils.end_is_3_prime_utr(my_variant.hgvs_formatted) + ) + ): input_parses_copy = copy.deepcopy(my_variant.hgvs_formatted) - input_parses_copy.type = "c" - # Map to n. position - # Create easy variant mapper (over variant mapper) and splign locked evm - try: + input_parses_copy.type = 'c' + + # Map to n. position. + try: # map to n with evm to_n = my_variant.evm.c_to_n(input_parses_copy) - except Exception as e: - logger.debug("Error with to_n") - logger.debug(str(e)) + except Exception as error: + logger.debug("%s", error) except vvhgvs.exceptions.HGVSError as e: logger.debug("Except passed, %s", e) - else: - if to_n.posedit.pos.end.base < to_n.posedit.pos.start.base: - error = 'Interval end position < interval start position ' + else: # else + if (to_n.posedit.pos.end.base < + to_n.posedit.pos.start.base): + error = "Interval end position < interval start position " my_variant.warnings.append(error) logger.info(error) - continue + continue # loop out elif my_variant.hgvs_formatted.posedit.pos.end.base < \ my_variant.hgvs_formatted.posedit.pos.start.base: if my_variant.hgvs_formatted.ac not in ["NC_012920.1", "NC_001807.4"]: - error = 'Interval end position ' +\ - str(my_variant.hgvs_formatted.posedit.pos.end.base) + \ - ' < interval start position ' + \ - str(my_variant.hgvs_formatted.posedit.pos.start.base) + error = ( + f'Interval end position {my_variant.hgvs_formatted.posedit.pos.end.base} ' + f'< interval start position {my_variant.hgvs_formatted.posedit.pos.start.base}' + ) my_variant.warnings.append(error) logger.info(error) - continue + continue # loop out # Catch missing version number in refseq/ens - is_version = re.compile(r"\d\.\d") + is_version = _VERSION_RE if ((my_variant.refsource == 'RefSeq' or my_variant.refsource == 'ENS') and not is_version.search(my_variant.hgvs_formatted.ac)): - error = 'RefSeq variant accession numbers MUST include a version number' + error = "RefSeq variant accession numbers MUST include a version number" my_variant.warnings.append(error) - continue + continue # loop out logger.debug("HVGS interval/version mapping complete") - # handle LRG inputs + # handle LRG inputs. if my_variant.refsource == 'LRG': format_converters.lrg_to_refseq(my_variant, self) logger.debug("LRG check for conversion to refseq completed") - # Additional Incorrectly input variant capture training + # Additional Incorrectly input variant capture training. if my_variant.refsource in ('RefSeq', 'ENS'): toskip = use_checking.refseq_type_mismatch(my_variant, self) if toskip: - continue + continue # loop out logger.debug("Passed 'common mistakes' catcher") - # Primary validation of the input + # Primary validation of the input. toskip = use_checking.structure_checks(my_variant, self) if toskip: - continue + continue # loop out logger.debug("Variant structure and contents searches passed") # Mitochondrial variants toskip = format_converters.mitochondrial(my_variant, self) if toskip: - continue + continue # loop out # Protein variants toskip = format_converters.proteins(my_variant, self) if toskip: - continue + continue # loop out # RNA variants trapped_input = str(my_variant.hgvs_formatted) my_variant.pre_RNA_conversion = trapped_input toskip = format_converters.rna(my_variant, self) if toskip: - continue + continue # loop out # COLLECT gene symbol, name and ACCESSION INFORMATION # Gene symbol if my_variant.reftype != ':g.': toskip = self._get_transcript_info(my_variant) if toskip: - continue + continue # loop out # Now start mapping from genome to transcripts if my_variant.reftype == ':g.': @@ -767,7 +783,7 @@ def validate(self, my_variant.warnings.append(error) toskip = True if toskip: - continue + continue # loop out if my_variant.reftype in (':c.', ':n.'): try: @@ -781,18 +797,18 @@ def validate(self, if toskip: continue - # Set the data + # Set the data. my_variant.output_type_flag = 'gene' my_variant.primary_assembly = primary_assembly - logger.info("Completed initial validation for %s", str(my_variant.quibble)) + logger.info("Completed initial validation for %s", my_variant.quibble) - # Report errors to User and VV admin - except KeyboardInterrupt: - raise + # Report errors to User and VV admin. + except KeyboardInterrupt: # e.g. ctrl + c + raise # Raise except Exception: lovd_response = lovd_api.lovd_syntax_check(my_variant.original.strip(), do_lovd_check=self.lovd_syntax_check) - if "lovd_api_error" not in lovd_response.keys(): + if "lovd_api_error" not in lovd_response: my_variant.output_type_flag = 'warning' my_variant.lovd_syntax_check = lovd_response continue @@ -807,11 +823,11 @@ def validate(self, logger.exception(error) continue - # Outside the for loop - ###################### + # Outside for loop + ################## logger.debug("End of 1st for loop - Finalising formatting") - # order the rows + # order the rows. by_order = sorted(batch_list, key=lambda x: x.order) for variant in by_order: ############################################################### @@ -826,18 +842,22 @@ def validate(self, logger.warning(structure_loop_variant) if isinstance(variant.quibble, str): - logger.debug(f"Formatting variant {variant.quibble}") + logger.debug("Formatting variant %s", variant.quibble) else: logger.debug("Formatting variant " + variant.quibble.format({'p_3_letter': False})) if not variant.write: logger.debug("Variant not set to write") continue - # Genomic sequence variation + # Genomic sequence variation. + # Check for gapped delins if (variant.genomic_g and variant.genomic_g.posedit.edit.type == 'delins' and variant.genomic_g.posedit.edit.alt == ""): - logger.info(f"Delins minus an ALT sequence identified {variant.genomic_g}") + logger.info( + "Delins minus an ALT sequence identified %s", + variant.genomic_g, + ) variant.genomic_g = hgvs_delins_parts_to_hgvs_obj( variant.genomic_g.ac, variant.genomic_g.type, @@ -846,128 +866,137 @@ def validate(self, hgvs_genomic_variant = variant.genomic_g - # genomic accession + # genomic accession. logger.debug("genomic accession") if hgvs_genomic_variant: hgvs_genomic_variant = unset_hgvs_obj_ref(hgvs_genomic_variant) - genomic_accession = hgvs_genomic_variant.ac - else: + genomic_accession = hgvs_genomic_variant.ac # set acc + else: # else genomic_accession = None - # RefSeqGene variation + # RefSeqGene variation. logger.debug("RefSeqGene variation") refseqgene_variant = variant.genomic_r if not refseqgene_variant or isinstance(refseqgene_variant, str) and 'RefSeqGene' in refseqgene_variant: variant.warnings.append(refseqgene_variant) - lrg_variant = '' + lrg_variant = "" refseqgene_variant = '' - else: - rsg_ac = self.db.get_lrg_id_from_refseq_gene_id(str(refseqgene_variant.ac)) - if rsg_ac[0] == 'none': - lrg_variant = '' - else: + else: # else + rsg_ac = self.db.get_lrg_id_from_refseq_gene_id(refseqgene_variant.ac) + if rsg_ac[0] == "none": + lrg_variant = "" + else: # else hgvs_lrg = copy.deepcopy(refseqgene_variant) - hgvs_lrg.ac = rsg_ac[0] - lrg_variant = fn.valstr(hgvs_lrg) + hgvs_lrg.ac = rsg_ac[ + 0] + lrg_variant = fn.valstr( + hgvs_lrg) if rsg_ac[1] != 'public': - variant.warnings.append('The current status of ' + str(hgvs_lrg.ac) + ' is pending ' - 'therefore changes may be made to the LRG reference sequence') + variant.warnings.append(f'The current status of {hgvs_lrg.ac} is pending ' + 'therefore changes may be made to the LRG reference sequence') - # Transcript sequence variation + # Transcript sequence variation. logger.debug("Transcript sequence variation") hgvs_tx_variant = None if variant.coding: - if '(' in str(hgvs_tx_variant) and ')' in str(hgvs_tx_variant): - assert False - - # transcript accession + # transcript accession. logger.debug("transcript accession") hgvs_tx_variant = unset_hgvs_obj_ref(variant.coding) hgvs_transcript_variant = copy.deepcopy(hgvs_tx_variant) - transcript_accession = hgvs_transcript_variant.ac + transcript_accession = hgvs_transcript_variant.ac # set acc - # Handle LRG + # Handle LRG. logger.debug("Handle LRG") lrg_transcript = self.db.get_lrg_transcript_id_from_refseq_transcript_id(transcript_accession) - if lrg_transcript == 'none': - lrg_transcript_variant = '' - else: - # Note - LRG availability is dependant on UTA containing the data. In some - # instances we will be able to display the LRG_tx without being able to - # display the LRG gene data - - try: - hgvs_lrg_t = self.vm.g_to_t(refseqgene_variant, transcript_accession) - hgvs_lrg_t.ac = lrg_transcript - lrg_transcript_variant = fn.valstr(hgvs_lrg_t) + if lrg_transcript == "none": + lrg_transcript_variant = "" + else: # Note - LRG availability is dependant on UTA containing the data. + # In some instances we will be able to display the LRG_tx without being able to display the + # LRG gene data + + try: # vm map + hgvs_lrg_t = self.vm.g_to_t(refseqgene_variant, + transcript_accession) + hgvs_lrg_t.ac = lrg_transcript # set acc + lrg_transcript_variant = fn.valstr( + hgvs_lrg_t) except Exception: - if hgvs_transcript_variant.posedit.pos.start.offset == 0 and \ - hgvs_transcript_variant.posedit.pos.end.offset == 0: - hgvs_lrg_t = copy.copy(hgvs_transcript_variant) - hgvs_lrg_t.ac = lrg_transcript - lrg_transcript_variant = fn.valstr(hgvs_lrg_t) - else: - lrg_transcript_variant = '' - else: - transcript_accession = '' - lrg_transcript_variant = '' - hgvs_transcript_variant = '' - - # Look for intronic variants + if not hgvs_position_utils.either_position_is_intronic( + hgvs_transcript_variant + ): + hgvs_lrg_t = copy.copy( + hgvs_transcript_variant) + hgvs_lrg_t.ac = lrg_transcript # Set acc + lrg_transcript_variant = fn.valstr( + hgvs_lrg_t) + else: # else + lrg_transcript_variant = "" + else: # else + transcript_accession = "" + lrg_transcript_variant = "" + hgvs_transcript_variant = "" + + # Look for intronic variants. logger.debug("Look for intronic variants") if transcript_accession != '' and genomic_accession: - # Remove del bases + # Remove del bases. hgvs_transcript_variant = unset_hgvs_obj_ref(hgvs_transcript_variant) - try: - self.vr.validate(hgvs_transcript_variant) + try: # validate + self.vr.validate( + hgvs_transcript_variant) except vvhgvs.exceptions.HGVSError as e: - error = str(e) + error = str( + e) if 'intronic variant' in error: - genome_context_transcript_variant = genomic_accession + '(' + transcript_accession +\ - '):c.' + hgvs_transcript_variant.posedit.format({'max_ref_length': 0}) + genome_context_transcript_variant = genomic_accession + '(' + transcript_accession + \ + '):c.' + hgvs_transcript_variant.posedit.format( + {'max_ref_length': 0}) if refseqgene_variant: refseqgene_variant = unset_hgvs_obj_ref(refseqgene_variant) refseqgene_accession = refseqgene_variant.ac try: - hgvs_coding_from_refseqgene = self.vm.g_to_t(refseqgene_variant, - hgvs_transcript_variant.ac) + hgvs_coding_from_refseqgene = self.vm.g_to_t( + refseqgene_variant, + hgvs_transcript_variant.ac + ) except vvhgvs.exceptions.HGVSInvalidIntervalError: hgvs_coding_from_refseqgene = hgvs_transcript_variant hgvs_coding_from_refseqgene = unset_hgvs_obj_ref(hgvs_coding_from_refseqgene) refseqgene_context_transcript_variant = refseqgene_accession + '(' + \ - transcript_accession + '):c.' + str(hgvs_coding_from_refseqgene.posedit.pos) +\ - hgvs_coding_from_refseqgene.posedit.edit.format({'max_ref_length': 0}) - else: - refseqgene_context_transcript_variant = '' - else: - genome_context_transcript_variant = '' # transcript_variant - refseqgene_context_transcript_variant = '' - else: - genome_context_transcript_variant = '' # transcript_variant - refseqgene_context_transcript_variant = '' + transcript_accession + '):c.' + str( + hgvs_coding_from_refseqgene.posedit.pos) + \ + hgvs_coding_from_refseqgene.posedit.edit.format( + {'max_ref_length': 0}) + else: # else + refseqgene_context_transcript_variant = "" + else: # else + genome_context_transcript_variant = "" # transcript_variant + refseqgene_context_transcript_variant = "" + else: # else + genome_context_transcript_variant = "" # transcript_variant + refseqgene_context_transcript_variant = "" else: if variant.genome_context_intronic_sequence is not None: genome_context_transcript_variant = variant.genome_context_intronic_sequence - else: - genome_context_transcript_variant = '' + else: # else + genome_context_transcript_variant = "" if variant.refseqgene_context_intronic_sequence is not None: refseqgene_context_transcript_variant = variant.refseqgene_context_intronic_sequence else: refseqgene_context_transcript_variant = '' - - # Protein description + # Protein description. logger.debug("Protein description") predicted_protein_variant = variant.protein - if not isinstance(predicted_protein_variant, str) and 'NP_' in predicted_protein_variant.ac: + if not isinstance(predicted_protein_variant, str) and predicted_protein_variant.ac.startswith("NP_"): lrg_p = self.db.get_lrg_protein_id_from_ref_seq_protein_id( - predicted_protein_variant.ac) + predicted_protein_variant.ac) if 'LRG' in lrg_p: - predicted_protein_variant.ac= predicted_protein_variant.ac + '(' + lrg_p + ')' + predicted_protein_variant.ac = predicted_protein_variant.ac + '(' + lrg_p + ')' - # Gene + # Gene. if transcript_accession == '': variant.gene_symbol = '' @@ -977,24 +1006,25 @@ def validate(self, hgvs_tx_variant, liftover_level=liftover_level) - else: - # HGVS genomic in the absence of a transcript variant + else: # HGVS genomic in the absence of a transcript variant. if hgvs_genomic_variant: - multi_gen_vars = [hgvs_genomic_variant] - else: - multi_gen_vars = [] - # Dictionaries of genomic loci - alt_genomic_dicts = [] - primary_genomic_dicts = {} + multi_gen_vars = [ + hgvs_genomic_variant] + else: # else + multi_gen_vars = [] # blank the list + + # Dictionaries of genomic loci. + alt_genomic_dicts = [] # blank list + primary_genomic_dicts = {} # blank dict # Identify Pseudo Autosomal Regions chrX = False chrY = False par = False for g_var in multi_gen_vars: - if 'NC_000023' in g_var.ac: + if g_var.ac.startswith("NC_000023"): chrX = True - if 'NC_000024' in g_var.ac: + if g_var.ac.startswith("NC_000024"): chrY = True if chrX is True and chrY is True: par = True @@ -1002,10 +1032,11 @@ def validate(self, 'the X and Y chromosomes, so the Y context description has been moved to ' 'alt_genomic_loci') - for alt_gen_var in multi_gen_vars: - if 'NC_' in alt_gen_var.ac: - if 'NC_000' not in alt_gen_var.ac and 'NC_012920.1' not in alt_gen_var.ac and \ - 'NC_001807.4' not in alt_gen_var.ac: + for alt_gen_var in multi_gen_vars: # loop through alts + alt_ac = alt_gen_var.ac + if alt_ac.startswith("NC_"): + if (not alt_ac.startswith("NC_000") and + alt_ac not in ("NC_012920.1", "NC_001807.4")): continue try: alt_gen_var = variant.hn.normalize(alt_gen_var) @@ -1013,22 +1044,24 @@ def validate(self, continue except vvhgvs.exceptions.HGVSDataNotAvailableError: continue - try: - vcf_dict = hgvs_utils.report_hgvs2vcf(alt_gen_var, 'All', variant.reverse_normalizer, + try: # Make dict + vcf_dict = hgvs_utils.report_hgvs2vcf(alt_gen_var, 'All', + variant.reverse_normalizer, self.sf) except vvhgvs.exceptions.HGVSInvalidVariantError: - continue - # Identify primary assembly positions + continue # loop out + # Identify primary assembly positions. primary = False - if 'NC_' in alt_gen_var.ac and par is False: - if 'NC_000' not in alt_gen_var.ac and 'NC_012920.1' not in alt_gen_var.ac and \ - 'NC_001807.4' not in alt_gen_var.ac: + alt_ac = alt_gen_var.ac + if alt_ac.startswith("NC_") and not par: + if (not alt_ac.startswith("NC_000") and + alt_ac not in ("NC_012920.1", "NC_001807.4")): continue - primary =True - elif 'NC_' not in alt_gen_var.ac and par is False: + primary = True + elif not alt_ac.startswith("NC_") and not par: pass - elif 'NC_000023' in alt_gen_var.ac and par is True: - primary =True + elif alt_ac.startswith("NC_000023") and par: + primary = True if primary: for genome_build in vcf_dict['chrs_by_genome']: primary_genomic_dicts[genome_build] = { @@ -1038,17 +1071,16 @@ def validate(self, 'ref': vcf_dict['ref'], 'alt': vcf_dict['alt'] } - } - else: + } + else: # else for genome_build in vcf_dict['chrs_by_genome']: alt_dict = {genome_build: { 'hgvs_genomic_description': alt_gen_var, 'vcf': {'chr': vcf_dict['chrs_by_genome'][genome_build], - 'pos': vcf_dict['pos'], - 'ref': vcf_dict['ref'], - 'alt': vcf_dict['alt'] - } - }} + 'pos': vcf_dict['pos'], # set pos + 'ref': vcf_dict['ref'], # set ref + 'alt': vcf_dict['alt'] # set alt + }}} alt_genomic_dicts.append(alt_dict) # Clean up mito genome issues @@ -1059,163 +1091,235 @@ def validate(self, elif key == "grch37" and "NC_001807.4" == val["hgvs_genomic_description"].ac: primary_genomic_dicts.pop(key) - # Warn not directly mapped to specified genome build - if genomic_accession: - if primary_assembly.lower() not in list(primary_genomic_dicts.keys()): - errors = [str(variant.hgvs_coding) + ' is not part of genome build ' + primary_assembly] - - if self.alt_aln_method == "splign": - errors.append(str(variant.hgvs_coding) + ' cannot be mapped directly to genome build ' + primary_assembly) - errors.append('See alternative genomic loci or alternative genome builds for aligned genomic positions') - - elif self.alt_aln_method == "genebuild": - # Get the alternative genome build to recommend - if primary_assembly == "GRCh38" or primary_assembly == "hg38": - alt_build = "GRCh37" - elif primary_assembly == "GRCh37" or primary_assembly == "hg19": - alt_build = "GRCh38" - # Shows the alternative genome build too - errors.append(str(variant.hgvs_coding) + ' cannot be mapped directly to genome build ' + primary_assembly - + ', did you mean ' + alt_build + '?') - - variant.warnings.extend(errors) + # Warn not directly mapped to specified genome build. + if genomic_accession and primary_assembly.lower() not in primary_genomic_dicts: + coding_variant = str(variant.hgvs_coding) + errors = [ + f'{coding_variant} is not part of genome build {primary_assembly}' + ] + + if self.alt_aln_method == 'splign': + errors.extend([ + f'{coding_variant} cannot be mapped directly to genome build ' + f'{primary_assembly}', + 'See alternative genomic loci or alternative genome builds for ' + 'aligned genomic positions', + ]) + + elif self.alt_aln_method == 'genebuild': + if primary_assembly in ('GRCh38', 'hg38'): + alt_build = 'GRCh37' + elif primary_assembly in ('GRCh37', 'hg19'): + alt_build = 'GRCh38' + + errors.append( + f'{coding_variant} cannot be mapped directly to genome build ' + f'{primary_assembly}, did you mean {alt_build}?' + ) + variant.warnings.extend( + errors) # Ensure variants have had reference bases removed. if refseqgene_variant: - try: - refseqgene_variant = unset_hgvs_obj_ref(refseqgene_variant) + try: # Handle RSGs + refseqgene_variant = unset_hgvs_obj_ref(refseqgene_variant) except Exception as e: logger.debug("Except passed, %s", e) if variant.gene_symbol == "" and refseqgene_variant: gene_symbol = self.db.get_gene_symbol_from_refseq_id(refseqgene_variant.ac) variant.gene_symbol = gene_symbol - # Add predicted protein variant dictionary this is the output form so str for final is OK - if predicted_protein_variant != '': - predicted_protein_variant_dict = {} - predicted_protein_variant_dict["slr"] = '' - predicted_protein_variant_dict["tlr"] = '' - predicted_protein_variant_dict["lrg_tlr"] = '' - predicted_protein_variant_dict["lrg_slr"] = '' - if not isinstance(predicted_protein_variant, str): - # add protein descriptions if not N type edit - add_p_descps = True - try: - if "N" in str(hgvs_tx_variant.posedit.edit): - add_p_descps = False - except AttributeError: - pass - if add_p_descps is True: + # Add predicted protein variant dictionary. + # String conversion is appropriate for final output. + predicted_protein_variant_dict = { + 'slr': '', + 'tlr': '', + 'lrg_tlr': '', + 'lrg_slr': '', + } + + # Only process an actual HGVS protein object. + if isinstance(predicted_protein_variant, SequenceVariant): + + # N-type transcript variants do not have a predicted protein + # consequence. + if not hgvs_tx_variant or hgvs_tx_variant.type != 'n': + + try: # Remove LRG from the accession and retain it for the final output. + if 'LRG' in predicted_protein_variant.ac: + format_lrg = predicted_protein_variant.ac + + if '(' in format_lrg: + format_lrg = ( + format_lrg.split('(', 1)[1] + .replace(')', '') + ) + predicted_protein_variant.ac = re.sub( + r'\(LRG_.+?\)', + '', + predicted_protein_variant.ac, + ) + else: + format_lrg = None + + # Convert UTR variants from p.? to p.(=). try: - # Remove LRG if present and store presence for later - if 'LRG' in predicted_protein_variant.ac: - format_lrg = predicted_protein_variant.ac - if "(" in format_lrg: - format_lrg = format_lrg.split('(')[1] - format_lrg = format_lrg.replace(')', '') - predicted_protein_variant.ac = re.sub( - r'\(LRG_.+?\)', '', predicted_protein_variant.ac) - else: - format_lrg = None - - # convert UTR variants from p.? to p.(?) - try: - if ( - variant.hgvs_coding.posedit.pos.end.base < 0 or - variant.hgvs_coding.posedit.pos.start.datum == - Datum.CDS_END - ): - logger.info( - f"UTR variant {variant.hgvs_coding} identified. " - f"Updating from p.? to p.(=)" + if ( + hgvs_position_utils.end_is_5_prime_utr( + variant.hgvs_coding ) - - predicted_protein_variant = vvhgvs.sequencevariant.SequenceVariant( + or hgvs_position_utils.start_is_3_prime_utr( + variant.hgvs_coding + ) + ): + logger.info( + 'UTR variant %s identified. ' + 'Updating from p.? to p.(=)', + variant.hgvs_coding, + ) + + predicted_protein_variant = ( + SequenceVariant( ac=predicted_protein_variant.ac, type='p', - posedit="(=)" + posedit=PosEdit( + pos=None, + edit=AARefAlt(), + uncertain=True, + ), ) + ) - except Exception: - pass + except Exception: + pass + # Add protein description. + predicted_protein_variant_dict['tlr'] = ( + predicted_protein_variant.format( + {'max_ref_length': 0} + ) + ) - # Add single letter AA code to protein descriptions - predicted_protein_variant_dict = {"tlr": str( - predicted_protein_variant.format({'max_ref_length': 0}) - ), "slr": ''} + # Add initiation amino acid warning where appropriate. + posedit = predicted_protein_variant.posedit + + if isinstance(posedit, PosEdit): + protein_pos = posedit.pos + protein_edit = posedit.edit + protein_start = getattr( + protein_pos, + 'start', + protein_pos, + ) + + if ( + isinstance(protein_edit, AASub) + and getattr( + protein_start, + 'base', + None, + ) == 1 + and protein_edit.alt != '?' + ): + logger.info( + 'Protein variant %s maps to the ' + 'initialisation amino acid.', + predicted_protein_variant, + ) - if re.search("[A-Z][a-z][a-z]1[A-Z][a-z][a-z]", str( - predicted_protein_variant.posedit)): - logger.info(f"{predicted_protein_variant} maps to the initialisation amino acid.") cp_warnings = [] + for each_warning in variant.warnings: - if "is HGVS compliant and contains a valid reference " \ - "amino acid description" not in each_warning: + if ( + 'is HGVS compliant and contains a ' + 'valid reference amino acid ' + 'description' + not in each_warning + ): cp_warnings.append(each_warning) - else: - aa_1 = self.sf.fetch_seq( - predicted_protein_variant.ac, - start_i=0, - end_i=1) - aa_1 = fn.one_to_three(aa_1) - cp_format_p = f"{predicted_protein_variant.ac}:p.({aa_1}1?)" - cp_warnings.append( - f"Variant {predicted_protein_variant} affects the initiation amino acid" - f" so is better described as {cp_format_p}") - - predicted_protein_variant = vvhgvs.sequencevariant.SequenceVariant( + continue + + aa_1 = self.sf.fetch_seq( + predicted_protein_variant.ac, + start_i=0, + end_i=1, + ) + aa_1 = fn.one_to_three(aa_1) + + cp_format_p = ( + f'{predicted_protein_variant.ac}:p.' + f'({aa_1}1?)' + ) + + cp_warnings.append( + f'Variant {predicted_protein_variant} ' + f'affects the initiation amino acid ' + f'so is better described as ' + f'{cp_format_p}' + ) + + predicted_protein_variant = ( + SequenceVariant( ac=predicted_protein_variant.ac, - type="p", + type='p', posedit=PosEdit( pos=AAPosition( base=1, - aa=fn.three_to_one(aa_1), # "Met" -> "M" - ), - edit=AASub( - alt="?" + aa=fn.three_to_one(aa_1), ), + edit=AASub(alt='?'), uncertain=True, ), ) - variant.warnings = cp_warnings + ) - logger.info(f"Warnings updated to {variant.warnings}") + variant.warnings = cp_warnings - # Set formatted tlr - try: - predicted_protein_variant_dict['tlr'] = \ - predicted_protein_variant.format({ - 'max_ref_length': 0}) - predicted_protein_variant_dict['slr']= \ - predicted_protein_variant.format({ - 'max_ref_length': 0, - 'p_3_letter':False}) - except Exception: - logger.exception("Unable to format protein variants.") - - - # set LRG outputs - if format_lrg is not None: - predicted_protein_variant_dict["lrg_tlr"] = \ - format_lrg + ':' + \ - predicted_protein_variant_dict["tlr"].split(':')[1] - predicted_protein_variant_dict["lrg_slr"] = \ - format_lrg + ':' + \ - predicted_protein_variant_dict["slr"].split(':')[1] - else: - predicted_protein_variant_dict["lrg_tlr"] = '' - predicted_protein_variant_dict["lrg_slr"] = '' - - except vvhgvs.exceptions.HGVSParseError as e: - logger.debug("Except passed, %s", e) - else: - predicted_protein_variant_dict = {} - predicted_protein_variant_dict["slr"] = '' - predicted_protein_variant_dict["tlr"] = '' - predicted_protein_variant_dict["lrg_tlr"] = '' - predicted_protein_variant_dict["lrg_slr"] = '' + logger.info( + 'Warnings updated to %s', + variant.warnings, + ) + + # Set formatted protein descriptions. + try: + predicted_protein_variant_dict['tlr'] = ( + predicted_protein_variant.format( + {'max_ref_length': 0} + ) + ) + predicted_protein_variant_dict['slr'] = ( + predicted_protein_variant.format( + { + 'max_ref_length': 0, + 'p_3_letter': False, + } + ) + ) + except Exception: + logger.exception( + 'Unable to format protein variants.' + ) + + # Set LRG outputs. + if format_lrg is not None: + tlr = predicted_protein_variant_dict['tlr'] + slr = predicted_protein_variant_dict['slr'] + + if ':' in tlr: + predicted_protein_variant_dict['lrg_tlr'] = ( + f'{format_lrg}:' + f'{tlr.split(":", 1)[1]}' + ) + + if ':' in slr: + predicted_protein_variant_dict['lrg_slr'] = ( + f'{format_lrg}:' + f'{slr.split(":", 1)[1]}' + ) + + except vvhgvs.exceptions.HGVSParseError as e: + logger.debug('Except passed, %s', e) # Add missing gene info which should be there (May have come from uncertain positions for example) if variant.hgvs_transcript_variant and variant.gene_symbol == '': @@ -1269,7 +1373,7 @@ def validate(self, # reformat ccds return into a Python list my_ccds = gene_stable_info[8].replace('[', '') my_ccds = my_ccds.replace(']', '') - my_ccds = my_ccds.replace('"','') + my_ccds = my_ccds.replace('"', '') my_ccds = my_ccds.replace(',', '') ccds_list = my_ccds.split() stable_gene_ids['ccds_ids'] = ccds_list @@ -1284,7 +1388,6 @@ def validate(self, # Add or update stable ID and transcript data try: annotation_info = json.loads(annotation_info) - annotation_info.keys() except Exception: try: self.db.update_transcript_info_record(hgvs_tx_variant.ac, self, @@ -1321,34 +1424,34 @@ def validate(self, if hgvs_tx_variant: variant.hgvs_transcript_variant = hgvs_tx_variant else: - for mapping in variant.alt_genomic_loci: + for mapping in variant.alt_genomic_loci: for gennome in mapping: mapping[gennome]["vcf"] = { - 'chr': None, - 'pos': None, - 'ref': None, - 'alt': None} + 'chr': None, + 'pos': None, + 'ref': None, + 'alt': None} if not variant.hgvs_transcript_variant and hgvs_tx_variant: variant.hgvs_transcript_variant = hgvs_tx_variant variant.reference_sequence_records = '' variant.validated = True - # Add links to reference_sequence_records + # Add links to reference_sequence_records. pre_out = { - 'hgvs_transcript_variant':'', - 'hgvs_predicted_protein_consequence':{'slr':''}, - 'hgvs_refseqgene_variant':'', - 'hgvs_lrg_variant':'', - 'selected_assembly':self.selected_assembly} + 'hgvs_transcript_variant': '', + 'hgvs_predicted_protein_consequence': {'slr': ''}, + 'hgvs_refseqgene_variant': '', + 'hgvs_lrg_variant': '', + 'selected_assembly': self.selected_assembly} if variant.hgvs_transcript_variant: pre_out['hgvs_transcript_variant'] = variant.hgvs_transcript_variant.ac if variant.hgvs_refseqgene_variant: pre_out['hgvs_refseqgene_variant'] = variant.hgvs_refseqgene_variant.ac - if variant.hgvs_lrg_variant:# is str + if variant.hgvs_lrg_variant: # is str pre_out['hgvs_lrg_variant'] = variant.hgvs_lrg_variant if variant.hgvs_predicted_protein_consequence: pre_out['hgvs_predicted_protein_consequence']['slr'] = \ - variant.hgvs_predicted_protein_consequence['slr'] + variant.hgvs_predicted_protein_consequence['slr'] ref_records = self.db.get_urls(pre_out) if ref_records: variant.reference_sequence_records = ref_records @@ -1358,10 +1461,10 @@ def validate(self, # Liftover intergenic positions genome to genome if (variant.output_type_flag == 'intergenic' and liftover_level is not None) or \ - (('grch37' not in variant.primary_assembly_loci.keys() or - 'grch38' not in variant.primary_assembly_loci.keys() or - 'hg38' not in variant.primary_assembly_loci.keys() or - 'hg19' not in variant.primary_assembly_loci.keys()) + (('grch37' not in variant.primary_assembly_loci or + 'grch38' not in variant.primary_assembly_loci or + 'hg38' not in variant.primary_assembly_loci or + 'hg19' not in variant.primary_assembly_loci) and liftover_level is not None): # Simple cache @@ -1378,7 +1481,7 @@ def validate(self, # Identify the current build and hgvs_genomic description if 'hg' in g_p_key: - # set builds + # set builds if g_p_key == 'hg38': build_to = 'hg19' build_from = 'hg38' @@ -1386,7 +1489,7 @@ def validate(self, build_to = 'hg38' build_from = 'hg19' elif 'grc' in g_p_key: - # set builds + # set builds if g_p_key == 'grch38': build_to = 'GRCh37' build_from = 'GRCh38' @@ -1400,9 +1503,9 @@ def validate(self, g_to_g = True # Lift-over - if (str(genomic_position_info[g_p_key]['hgvs_genomic_description']) not in lo_cache.keys() - ) or ("NC_012920.1" == genomic_position_info[g_p_key]['hgvs_genomic_description'].ac - and build_from == "hg38" and build_to == "hg19"): + if (str(genomic_position_info[g_p_key]['hgvs_genomic_description']) not in lo_cache + ) or ("NC_012920.1" == genomic_position_info[g_p_key]['hgvs_genomic_description'].ac + and build_from == "hg38" and build_to == "hg19"): lifted_response = liftover(genomic_position_info[g_p_key]['hgvs_genomic_description'], build_from, @@ -1431,10 +1534,10 @@ def validate(self, lifted_response[key] = capture_corrected_response lo_cache[str(genomic_position_info[g_p_key]['hgvs_genomic_description'])] \ - = lifted_response + = lifted_response else: lifted_response = \ - lo_cache[str(genomic_position_info[g_p_key]['hgvs_genomic_description'])] + lo_cache[str(genomic_position_info[g_p_key]['hgvs_genomic_description'])] # Sort the respomse into primary assembly and ALT primary_assembly_loci = {} @@ -1479,7 +1582,7 @@ def validate(self, accession = '' if variant.hgvs_transcript_variant: accession = variant.hgvs_transcript_variant.ac - term = str(accession) + term = accession term_2 = "%s automapped to" % str(hgvs_tx_variant) term_3 = "%s automapped to" % str(hgvs_genomic_variant) @@ -1500,12 +1603,12 @@ def validate(self, variant_warnings.append(f"OutOfBoundsError: {vt}") continue - # Do not warn transcript not part of build if it's not the relevant transcript + # Do not warn transcript not part of build if it's not the relevant transcript. if "is not part of genome build" in vt and term not in vt: - continue + continue # loop out - # Do not warn transcript cannot be mapped to build if it's not the relevant transcript - elif "cannot be mapped directly to genome build" in vt and term not in vt: + # Do not warn transcript cannot be mapped to build if it's not the relevant transcript. + elif 'cannot be mapped directly to genome build' in vt and term not in vt: continue # Do not warn transcript updates for the selected transcript @@ -1561,34 +1664,43 @@ def validate(self, # Reformat as required to add back variation that would/does get lost on mapping if variant.reformat_output is not False: - if "|" in variant.reformat_output and "=" in str(variant.quibble): + if ( + "|" in variant.reformat_output + and isinstance(variant.quibble, SequenceVariant) + and isinstance(variant.quibble.posedit, PosEdit) + and variant.quibble.type != "p" + and variant.quibble.posedit.edit.type == "identity" + ): def _apply_met_variation(data): if isinstance(data, dict): for key in data: - if isinstance(data[key],dict) or isinstance(data[key],list): + if isinstance(data[key], dict) or isinstance(data[key], list): data[key] = _apply_met_variation(data[key]) - elif isinstance(data[key],SequenceVariant) and not data[key].type == 'p': + elif isinstance(data[key], SequenceVariant) and not data[key].type == 'p': if isinstance(data[key].posedit, PosEdit): data[key] = to_vv_hgvs(data[key]) data[key].posedit.met_variation = variant.reformat_output - elif isinstance(data[key], str) and data[key].endswith('=') and not data[key].endswith('|met=') and not ':p.' in data[key]: + elif isinstance(data[key], str) and data[key].endswith('=') and not data[ + key].endswith('|met=') and not ':p.' in data[key]: data[key] = data[key][:-1] + variant.reformat_output - elif isinstance(data,list): + elif isinstance(data, list): for index, value in enumerate(data): - if isinstance(value,dict) or isinstance(value,list): + if isinstance(value, dict) or isinstance(value, list): data[index] = _apply_met_variation(value) - elif isinstance(value,SequenceVariant) and not value.type == 'p': + elif isinstance(value, SequenceVariant) and not value.type == 'p': if isinstance(value.posedit, PosEdit): value = to_vv_hgvs(value) value.posedit.met_variation = variant.reformat_output data[index] = value - elif isinstance(value, str) and value.endswith('=') and not value.endswith('|met=') and not ':p.' in value: + elif isinstance(value, str) and value.endswith('=') and not value.endswith( + '|met=') and not ':p.' in value: data[index] = value[:-1] + variant.reformat_output - elif isinstance(data,SequenceVariant) and not data.type == 'p': + elif isinstance(data, SequenceVariant) and not data.type == 'p': if isinstance(data.posedit, PosEdit): data = to_vv_hgvs(data) data.posedit.met_variation = variant.reformat_output - elif isinstance(data, str) and data.endswith('=') and not data.endswith('|met=') and not ':p.' in data: + elif isinstance(data, str) and data.endswith('=') and not data.endswith( + '|met=') and not ':p.' in data: data = data[:-1] + variant.reformat_output return data @@ -1601,12 +1713,12 @@ def _apply_met_variation(data): setattr(variant, attribute, item) # Add expanded repeat information - logger.info(f"expanded repeat is {variant.expanded_repeat}") + logger.info("Expanded repeat is %s", variant.expanded_repeat) if variant.expanded_repeat is not None: starting_tx_posedit = None if variant.hgvs_transcript_variant: starting_tx_posedit = variant.hgvs_transcript_variant.posedit.format( - {'max_ref_length': 0}) + {'max_ref_length': 0}) hgd = "hgvs_genomic_description" ex_rep_start = variant.expanded_repeat["variant"].ac[:3] ex_rep_var = copy.copy(variant.expanded_repeat["variant"]) @@ -1614,14 +1726,14 @@ def _apply_met_variation(data): if ex_rep_start in ["NG_", "LRG"]: try: variant.hgvs_transcript_variant = convert_seq_state_to_expanded_repeat( - variant.hgvs_transcript_variant, self, - known_repeat_unit=variant.expanded_repeat["repeat_sequence"], - genomic_reference=ex_rep_var.ac) + variant.hgvs_transcript_variant, self, + known_repeat_unit=variant.expanded_repeat["repeat_sequence"], + genomic_reference=ex_rep_var.ac) except Exception: pass elif ex_rep_start == 'NC_': variant.primary_assembly_loci[self.primary_assembly.lower() - ][hgd] = ex_rep_var + ][hgd] = ex_rep_var if self.primary_assembly == "GRCh37": variant.primary_assembly_loci['grch37'][hgd] = ex_rep_var variant.primary_assembly_loci["hg19"][hgd] = ex_rep_var @@ -1633,7 +1745,7 @@ def _apply_met_variation(data): except Exception: pass variant.primary_assembly_loci["hg38"][hgd] = \ - variant.primary_assembly_loci["grch38"][hgd] + variant.primary_assembly_loci["grch38"][hgd] else: variant.primary_assembly_loci["grch38"][hgd] = ex_rep_var variant.primary_assembly_loci["hg38"][hgd] = ex_rep_var @@ -1651,7 +1763,7 @@ def _apply_met_variation(data): convert_seq_state_to_expanded_repeat( variant.hgvs_transcript_variant, self, genomic_reference=ex_rep_var.ac, - known_repeat_unit=variant.expanded_repeat["repeat_sequence"]) + known_repeat_unit=variant.expanded_repeat["repeat_sequence"]) except Exception: pass @@ -1688,40 +1800,41 @@ def _apply_met_variation(data): assert variant.hgvs_refseqgene_variant.ac.startswith('NG_') try: variant.hgvs_refseqgene_variant = ( - convert_seq_state_to_expanded_repeat( - variant.hgvs_refseqgene_variant, self, - known_repeat_unit=variant.expanded_repeat["repeat_sequence"])) + convert_seq_state_to_expanded_repeat( + variant.hgvs_refseqgene_variant, self, + known_repeat_unit=variant.expanded_repeat["repeat_sequence"])) if variant.hgvs_lrg_variant: variant.hgvs_lrg_variant = ( - f"{variant.hgvs_lrg_variant.split(':g.')[0]}:g." + - variant.hgvs_refseqgene_variant.posedit.format( - {'max_ref_length': 0})) + f"{variant.hgvs_lrg_variant.split(':g.')[0]}:g." + + variant.hgvs_refseqgene_variant.posedit.format( + {'max_ref_length': 0})) except Exception: pass # LRG transcript data can be, but may not be, the same as the main mapped tx # so we need to test for identity before using. LRG is already text and # won't be reused for VRS. This skips ex_rep conversion in the corner case. if variant.hgvs_lrg_transcript_variant and \ - variant.hgvs_lrg_transcript_variant.split(':c.')[1] ==\ + variant.hgvs_lrg_transcript_variant.split(':c.')[1] == \ starting_tx_posedit and variant.hgvs_transcript_variant: variant.hgvs_lrg_transcript_variant = \ - f"{variant.hgvs_lrg_transcript_variant.split(':c.')[0]}:c."\ + f"{variant.hgvs_lrg_transcript_variant.split(':c.')[0]}:c." \ + variant.hgvs_transcript_variant.posedit.format( {'max_ref_length': 0}) # Some variant objects must be strings for back-compatibility with old output if variant.hgvs_transcript_variant: variant.hgvs_transcript_variant = \ - variant.hgvs_transcript_variant.format({'max_ref_length': 0}) + variant.hgvs_transcript_variant.format({'max_ref_length': 0}) else: variant.hgvs_transcript_variant = '' if variant.hgvs_refseqgene_variant: variant.hgvs_refseqgene_variant = \ - variant.hgvs_refseqgene_variant.format({'max_ref_length': 0}) + variant.hgvs_refseqgene_variant.format({'max_ref_length': 0}) else: variant.hgvs_refseqgene_variant = '' hgd = "hgvs_genomic_description" - def _vcf_abrv(hgvs,vcf,max_non_abrv_len=500): + + def _vcf_abrv(hgvs, vcf, max_non_abrv_len=500): """ Abbreviate long del/dup/ins type vcf Use start-stop as pos ref N alt as type, @@ -1739,17 +1852,16 @@ def _vcf_abrv(hgvs,vcf,max_non_abrv_len=500): # hgvs can still be text, not object, for some ambig pos, and MT, data return vcf # Overwrite/standardise VCF-style fields if still needed - vcf["pos"] = f'{str(hgvs.posedit.pos.start.base)}-{str(hgvs.posedit.pos.end.base)}' + vcf["pos"] = f'{hgvs.posedit.pos.start.base}-{hgvs.posedit.pos.end.base}' vcf["ref"] = 'N' vcf["alt"] = hgvs.posedit.edit.type.upper() return vcf - if variant.primary_assembly_loci is not None: for gen in variant.primary_assembly_loci.keys(): variant.primary_assembly_loci[gen]['vcf'] = _vcf_abrv( - variant.primary_assembly_loci[gen][hgd], - variant.primary_assembly_loci[gen]['vcf']) + variant.primary_assembly_loci[gen][hgd], + variant.primary_assembly_loci[gen]['vcf']) variant.primary_assembly_loci[gen][hgd] = \ variant.primary_assembly_loci[gen][hgd].format({'max_ref_length': 0}) @@ -1760,14 +1872,14 @@ def _vcf_abrv(hgvs,vcf,max_non_abrv_len=500): loc[gen]['vcf']) loc[gen][hgd] = loc[gen][hgd].format({'max_ref_length': 0}) - # Append to a list for return + # Append to a list for return. batch_out.append(variant) output = valoutput.ValOutput(batch_out, self) return output - # Bug catcher - except KeyboardInterrupt: - raise + # Bug catcher. + except KeyboardInterrupt: # e.g. ctrl + c + raise # raise the exception except BaseException as e: logger.error("Validation loop variant: %s", validation_loop_variant) logger.error("Structure loop variant: %s", structure_loop_variant) @@ -2087,7 +2199,7 @@ def _refresh_ensembl_transcript_info(self, variant, accession): return False except Exception as error: - logger.info(str(error)) + logger.info("%s", error) message = ( f"Unable to assign transcript identity records to {accession}, " f"potentially an obsolete record or there is an issue retrieving " diff --git a/VariantValidator/modules/vvMixinInit.py b/VariantValidator/modules/vvMixinInit.py index e682db63..9a61e7aa 100644 --- a/VariantValidator/modules/vvMixinInit.py +++ b/VariantValidator/modules/vvMixinInit.py @@ -1,9 +1,7 @@ -# -*- coding: utf-8 -*- - import logging -import os from functools import lru_cache from configparser import ConfigParser +import os import vvhgvs import vvhgvs.assemblymapper @@ -101,7 +99,8 @@ class Mixin: variant validations. """ - def __init__(self): + def __init__( + self): """ Initialise Validator configuration and persistent infrastructure. @@ -179,7 +178,7 @@ def __init__(self): # SeqRepo configuration # -------------------------------------------------------------- - self.seqrepoVersion = config["seqrepo"]["version"] + self.seqrepoVersion = config["seqrepo"]["version"] # Get config require_threading = config["seqrepo"]["require_threading"] @@ -227,14 +226,13 @@ def __init__(self): self.vvdbVersion = config["mysql"]["version"] - self.dbConfig = { + self.dbConfig = { # Set configuration "user": config["mysql"]["user"], "password": config["mysql"]["password"], "host": config["mysql"]["host"], "port": int(config["mysql"]["port"]), "database": config["mysql"]["database"], - "raise_on_warnings": True, - } + "raise_on_warnings": True} mysql_unix_socket = config.get( "mysql", @@ -321,8 +319,7 @@ def __init__(self): self.lose_vm = vvhgvs.variantmapper.VariantMapper( self.hdp, - replace_reference=True, - prevalidation_level=None, + replace_reference=True, prevalidation_level=None, ) self.nr_vm = vvhgvs.variantmapper.VariantMapper( @@ -335,8 +332,7 @@ def __init__(self): # -------------------------------------------------------------- self.sf = vvhgvs.dataproviders.seqfetcher.SeqFetcher( - self.check_same_thread, - ) + self.check_same_thread) # Wrap the SeqFetcher with the LRU cache layer. # @@ -406,15 +402,13 @@ def create_additional_normalizers_and_mappers(self): self.hdp, cross_boundaries=False, shuffle_direction=5, - alt_aln_method=self.alt_aln_method, - ) + alt_aln_method=self.alt_aln_method) self.hn = vvhgvs.normalizer.Normalizer( self.hdp, cross_boundaries=False, shuffle_direction=3, - alt_aln_method=self.alt_aln_method, - ) + alt_aln_method=self.alt_aln_method) self.merge_normalizer = vvhgvs.normalizer.Normalizer( self.hdp, @@ -423,8 +417,7 @@ def create_additional_normalizers_and_mappers(self): vvhgvs.global_config.normalizer.shuffle_direction ), alt_aln_method=self.alt_aln_method, - validate=False, - ) + validate=False) self.reverse_merge_normalizer = ( vvhgvs.normalizer.Normalizer( @@ -433,18 +426,16 @@ def create_additional_normalizers_and_mappers(self): shuffle_direction=5, alt_aln_method=self.alt_aln_method, validate=False, - ) - ) + )) self.no_norm_evm = vvhgvs.assemblymapper.AssemblyMapper( self.hdp, assembly_name=self.primary_assembly, alt_aln_method=self.alt_aln_method, - normalize=False, - replace_reference=True, - ) + normalize=False, replace_reference=True) - def __del__(self): + def __del__( + self): if getattr(self, "pool", None): self.pool = None @@ -452,13 +443,12 @@ def my_config(self): """ Return VariantValidator configuration/version information. """ - return { + return { # Create return "variantvalidator_version": self.version, "variantvalidator_hgvs_version": self.hgvsVersion, "vvta_version": self.utaSchema, "vvseqrepo_db": self.seqrepoPath, - "vvdb_version": self.vvdbVersion, - } + "vvdb_version": self.vvdbVersion} def myc_to_p(self, hgvs_transcript, evm, re_to_p, hn): logger.info( @@ -502,8 +492,9 @@ def myc_to_p(self, hgvs_transcript, evm, re_to_p, hn): "", "", ) - p = evm.c_to_p(cod) - associated_protein_accession = p.ac + p = evm.c_to_p( + cod) + associated_protein_accession = p.ac # Set accession nucleotide_not_equal = edit_type != "identity" @@ -609,8 +600,8 @@ def _remake_unc( residue_one, ) - else: - try: + else: # Else + try: # Map with evm hgvs_protein = evm.c_to_p( hgvs_transcript ) @@ -622,7 +613,7 @@ def _remake_unc( ), ) - except IndexError as e: + except IndexError as e: # Dups affected if ( "string index out of range" in str(e) and edit_type == "dup" @@ -689,7 +680,7 @@ def _remake_unc( ) ) - return hgvs_transcript_to_hgvs_protein + return hgvs_transcript_to_hgvs_protein # Return logger.info( "Passing %s into VV handled c_to_p mapping", @@ -742,7 +733,7 @@ def _remake_unc( shifts = "" not_delins = False - try: + try: # map with evm shifts = evm.c_to_p( hgvs_transcript ) @@ -769,7 +760,7 @@ def _remake_unc( not_delins = True except Exception: - not_delins = False + not_delins = False # Dop not set if not_delins: hgvs_transcript_to_hgvs_protein[ @@ -876,7 +867,7 @@ def _remake_unc( residue_one, ) - else: + else: # else hgvs_protein = _tot_unc( associated_protein_accession ) @@ -885,7 +876,7 @@ def _remake_unc( "hgvs_protein" ] = hgvs_protein - return hgvs_transcript_to_hgvs_protein + return hgvs_transcript_to_hgvs_protein # return logger.info( "Variant is not intronic and is not fully UTR, " @@ -898,20 +889,20 @@ def _remake_unc( hgvs_transcript.ac ) - cds_start = inf[3] + cds_start = inf[3] # set start and end of CDS cds_end = inf[4] - try: + try: # Detch the sequence ref_seq = self.sf.fetch_seq( hgvs_naughty.ac ) - except Exception as e: + except Exception as error: hgvs_transcript_to_hgvs_protein[ "error" - ] = str(e) + ] = str(error) - return hgvs_transcript_to_hgvs_protein + return hgvs_transcript_to_hgvs_protein # Return early var_seq = utils.n_inversion( ref_seq, @@ -1005,14 +996,14 @@ def _remake_unc( return hgvs_transcript_to_hgvs_protein - try: + try: # translate prot_var_seq = utils.translate( var_seq, cds_start, modified_aa, ) - except IndexError: + except IndexError: # index error hgvs_transcript_to_hgvs_protein["error"] = ( "ProteinTranslationError: Cannot generate a " "protein without an identifiable in-frame " @@ -1026,7 +1017,7 @@ def _remake_unc( associated_protein_accession ) - return hgvs_transcript_to_hgvs_protein + return hgvs_transcript_to_hgvs_protein # return except KeyError: hgvs_transcript_to_hgvs_protein["error"] = ( @@ -1042,7 +1033,7 @@ def _remake_unc( associated_protein_accession ) - return hgvs_transcript_to_hgvs_protein + return hgvs_transcript_to_hgvs_protein # return no_start_err = ( "ProteinTranslationError: Unable to generate protein " @@ -1082,7 +1073,7 @@ def _remake_unc( associated_protein_accession ) - return hgvs_transcript_to_hgvs_protein + return hgvs_transcript_to_hgvs_protein # return if prot_var_seq == "error": if ( @@ -1125,12 +1116,12 @@ def _remake_unc( residue_one, ) - else: + else: # else hgvs_transcript_to_hgvs_protein[ "error" ] = no_start_err - return hgvs_transcript_to_hgvs_protein + return hgvs_transcript_to_hgvs_protein # return if ( ( @@ -1191,7 +1182,7 @@ def _remake_unc( prot_var_seq, ) - else: + else: # else logger.info( "passing %s translations to pro_delins_info " "function", @@ -1350,7 +1341,7 @@ def _remake_unc( "hgvs_protein" ] = hgvs_protein - return hgvs_transcript_to_hgvs_protein + return hgvs_transcript_to_hgvs_protein # return if pro_inv_info["error"] == "true": hgvs_transcript_to_hgvs_protein["error"] = ( @@ -1678,7 +1669,7 @@ def _remake_unc( nucleotide_not_equal=nucleotide_not_equal, ) - else: + else: # else posedit = VVPosEdit( pos=Interval( start=AAPosition( @@ -1698,7 +1689,7 @@ def _remake_unc( nucleotide_not_equal=nucleotide_not_equal, ) - else: + else: # else posedit = VVPosEdit( pos=Interval( start=AAPosition( @@ -1718,7 +1709,7 @@ def _remake_unc( nucleotide_not_equal=nucleotide_not_equal, ) - else: + else: # else if prot_ins_seq == prot_del_seq + prot_del_seq: posedit = VVPosEdit( pos=Interval( @@ -1785,7 +1776,7 @@ def _remake_unc( nucleotide_not_equal=nucleotide_not_equal, ) - else: + else: # else posedit = VVPosEdit( pos=Interval( start=AAPosition( @@ -1831,7 +1822,7 @@ def _remake_unc( nucleotide_not_equal=nucleotide_not_equal, ) - else: + else: # else posedit = VVPosEdit( pos=Interval( start=AAPosition( @@ -1859,7 +1850,7 @@ def _remake_unc( "hgvs_protein" ] = hgvs_protein - return hgvs_transcript_to_hgvs_protein + return hgvs_transcript_to_hgvs_protein # return def revcomp(self, bases): """ From 6186d6a8cf3b8c336d64e68382291852f0d05b26 Mon Sep 17 00:00:00 2001 From: Peter-J-Freeman Date: Tue, 11 Aug 2026 17:11:48 +0100 Subject: [PATCH 4/5] Utils files clean hgvs_utils.py has had a more extensive clean --- VariantValidator/modules/hgvs_utils.py | 1414 ++++++++---------------- VariantValidator/modules/mappers.py | 363 +++--- 2 files changed, 662 insertions(+), 1115 deletions(-) diff --git a/VariantValidator/modules/hgvs_utils.py b/VariantValidator/modules/hgvs_utils.py index c5e5d25d..c693d486 100644 --- a/VariantValidator/modules/hgvs_utils.py +++ b/VariantValidator/modules/hgvs_utils.py @@ -1,11 +1,4 @@ -""" -A variety of functions that convert parser hgvs objects into VCF component parts -Each function has a slightly difference emphasis -""" - -# Import modules -import re -import copy +import copy, re from . import seq_data from . import utils from . import hgvs_position_utils @@ -24,11 +17,9 @@ logger = logging.getLogger(__name__) -# Database connections and hgvs objects are now passed from VariantValidator.py - -# Error handling +# Custom error handling class PseudoVCF2HGVSError(Exception): - pass + pass # Pass exception class VVPosEdit(PosEdit): "override class for posedit to get VV specific formatting" @@ -592,619 +583,272 @@ def hgvs_to_delins_hgvs(hgvs_object, hp, hn, allow_fix=False): # Create the object directly via vcfcp_to_hgvs_obj return vcfcp_to_hgvs_obj({"pos": v_pos, "ref": v_ref, "alt": v_alt}, hgvs_object) -def pvcf_to_hgvs(query, selected_assembly, normalization_direction, reverse_normalizer, validator): - """ - :param query: pseudo_vcf string - :param selected_assembly: - :param normalization_direction: normalization direction an integer, 5 or 3. - :param reverse_normalizer: - :param validator: - :return: - """ - # Set normalizer - selected_normalizer = None - if normalization_direction == 3: - selected_normalizer = validator.hn - if normalization_direction == 5: - selected_normalizer = reverse_normalizer - - # Gel stye pVCF - query = query.replace(':', '-') - pre_input = copy.deepcopy(query) - vcf_elements = pre_input.split('-') - - # VCF type 1 - if re.search(r'-\d+-[GATC]+-[GATC]+', query): - query = '%s:%s%s>%s' % (vcf_elements[0], vcf_elements[1], vcf_elements[2], vcf_elements[3]) - elif re.search(r'-\d+-[GATC]+-', query): - query = '%s:%s%s>%s' % (vcf_elements[0], vcf_elements[1], vcf_elements[2], vcf_elements[2]) - else: - raise PseudoVCF2HGVSError('Unsupported format: VCF specification 4.1 or later') - - # Chr16:2099572TC>T - try: - input_list = query.split(':') - position_and_edit = input_list[1] - if not query.startswith(("NC_", "NG_", "NW_", "NT_")) and not re.fullmatch(r"LRG_\d+", query): - chr_num = input_list[0].strip().upper() - if chr_num.startswith("CHR"): - chr_num = chr_num[3:] - # Use selected assembly - accession = seq_data.get_accession(chr_num, selected_assembly) - if accession is None: - error = chr_num + ' is not part of genome build ' + selected_assembly + ' or is not supported' - raise PseudoVCF2HGVSError(error) - else: - accession = input_list[0] - - # Assign reference sequence type - ref_type = ':g.' - if 'LRG_' in accession: - accession = validator.db.get_refseq_id_from_lrg_id(accession) - - # Reformat the variant - query = str(accession) + ref_type + str(position_and_edit) - except Exception as e: - error = str(e) - raise PseudoVCF2HGVSError(error) - - # Find not_sub type in input e.g. GGGG>G - not_sub = copy.deepcopy(query) - not_sub_find = re.compile(r"([GATCgatc]+)>([GATCgatc]+)") - if not_sub_find.search(not_sub): - try: - # If the length of either side of the substitution delimer (>) is >1 - matches = not_sub_find.search(not_sub) - if len(matches.group(1)) > 1 or len(matches.group(2)) > 1 or re.search( - r"([GATCgatc]+)>([GATCgatc]+),([GATCgatc]+)", query): - # Search for and remove range - range = re.compile(r"([0-9]+)_([0-9]+)") - if range.search(not_sub): - m = not_sub_find.search(not_sub) - start = m.group(1) - delete = m.group(2) - beginning_string, middle_string = not_sub.split(':') - middle_string = middle_string.split('_')[0] - end_string = start + '>' + delete - not_sub = beginning_string + ':' + middle_string + end_string - # Split description - ref_ac, _sep, remainder = not_sub.partition(':') - ref_type, _sep, posedit = remainder.partition('.') - pos_ref, _sep, insert = posedit.partition('>') - # Split remainder using matches - r = re.compile(r"([0-9]+)([GATCgatc]+)") - try: - m = r.search(pos_ref) - delete = m.group(2) - starts = posedit.split(delete)[0] - hgvs_re_try = hgvs_delins_parts_to_hgvs_obj( - ref_ac, - ref_type, - starts, delete[0], insert) - hgvs_re_try.posedit.edit.ref = delete - start_pos = str(hgvs_re_try.posedit.pos.start) - end_pos = None - if '-' in start_pos: - base, offset = start_pos.split('-') - new_offset = 0 - int(offset) + (len(delete)) - end_pos = base + '-' + str(new_offset) - elif '+' in start_pos: - base, offset = start_pos.split('+') - new_offset = 0 + int(offset) + (len(delete) - 1) - end_pos = base + '+' + str(new_offset) - else: - end_pos = int(start_pos) + (len(delete) - 1) - except Exception as e: - error = str(e) - raise PseudoVCF2HGVSError(error) - - # Parse into hgvs object - try: - hgvs_not_delins = hgvs_delins_parts_to_hgvs_obj( - ref_ac, ref_type, start_pos, - delete, insert, - end=end_pos) - except vvhgvs.exceptions.HGVSError as e: - error = str(e) - raise PseudoVCF2HGVSError(error) - - # HGVS will deal with the errors - hgvs_object = hgvs_not_delins - else: - # we know that this should be a sub type variant, and so ends with R>A, - # where R and A is 1 base of ref or alt respectivly (since the second - # match did not trigger). - start = position_and_edit[:-4] - if '_' in position_and_edit[:-3]: - start, _sep, end = position_and_edit.partition('_') - hgvs_object = hgvs_delins_parts_to_hgvs_obj( - str(accession), - ref_type, - int(start), - position_and_edit[-3], - position_and_edit[-1]) - - except Exception as e: - error = str(e) - raise PseudoVCF2HGVSError(error) - else: - # we should not get here! if we can we need to handle it - raise PseudoVCF2HGVSError('Unsupported format: VCF specification 4.1 or later!') - - # Normalize - hgvs_object = selected_normalizer.normalize(hgvs_object) - # return - return hgvs_object - - -def hgvs2vcf(hgvs_genomic, primary_assembly, reverse_normalizer, sf, extra_flank_bases=0): - """ - Simple conversion which ensures identity is as 5 prime as possible by adding an extra 5 - prime base. Necessary for most gap handling situations - - :param hgvs_genomic: - :param primary_assembly: - :param reverse_normalizer: - :param sf: - :return: - """ - hgvs_genomic_variant = hgvs_genomic - # Reverse normalize hgvs_genomic_variant: NOTE will replace ref - if reverse_normalizer is None: - reverse_normalized_hgvs_genomic = hgvs_genomic_variant - else: - reverse_normalized_hgvs_genomic = reverse_normalizer.normalize(hgvs_genomic_variant) - # hgvs_genomic_5pr = copy.deepcopy(reverse_normalized_hgvs_genomic) - - # Chr - chr = seq_data.get_chr_num_ucsc(reverse_normalized_hgvs_genomic.ac, primary_assembly) - if chr is not None: - pass - else: - chr = reverse_normalized_hgvs_genomic.ac - - # Identity - if reverse_normalized_hgvs_genomic.posedit.edit.type == 'identity': - pos = str(reverse_normalized_hgvs_genomic.posedit.pos.start) - ref = reverse_normalized_hgvs_genomic.posedit.edit.ref - alt = reverse_normalized_hgvs_genomic.posedit.edit.ref - - # Insertions - elif reverse_normalized_hgvs_genomic.posedit.edit.type == 'ins': - end = int(reverse_normalized_hgvs_genomic.posedit.pos.end.base) - start = int(reverse_normalized_hgvs_genomic.posedit.pos.start.base) - alt_start = start - 1 # - # Recover sequences - ref_seq = sf.fetch_seq(reverse_normalized_hgvs_genomic.ac, alt_start, end - 1) - ins_seq = reverse_normalized_hgvs_genomic.posedit.edit.alt - # Assemble - pos = start - ref = ref_seq - alt = ref_seq + ins_seq - - # Substitutions - elif reverse_normalized_hgvs_genomic.posedit.edit.type == 'sub': - ref = reverse_normalized_hgvs_genomic.posedit.edit.ref - alt = reverse_normalized_hgvs_genomic.posedit.edit.alt - pos = str(reverse_normalized_hgvs_genomic.posedit.pos) - - # Deletions - elif reverse_normalized_hgvs_genomic.posedit.edit.type == 'del': - end = int(reverse_normalized_hgvs_genomic.posedit.pos.end.base) - start = int(reverse_normalized_hgvs_genomic.posedit.pos.start.base) - adj_start = start - 2 - start = start - 1 - # Recover sequences - hgvs_del_seq_w_pre_base = sf.fetch_seq( - reverse_normalized_hgvs_genomic.ac, - adj_start, end) - pos = str(start) - ref = hgvs_del_seq_w_pre_base - alt = hgvs_del_seq_w_pre_base[0] - - # inv - elif reverse_normalized_hgvs_genomic.posedit.edit.type == 'inv': - end = int(reverse_normalized_hgvs_genomic.posedit.pos.end.base) - start = int(reverse_normalized_hgvs_genomic.posedit.pos.start.base) - adj_start = start - 1 - - # Use the reference sequence already available on the HGVS object where - # possible. Sequence retrieval is only required when ref is unavailable. - try: - vcf_del_seq = reverse_normalized_hgvs_genomic.posedit.edit.ref - except AttributeError: - vcf_del_seq = None - - if not vcf_del_seq: - vcf_del_seq = sf.fetch_seq( - reverse_normalized_hgvs_genomic.ac, - adj_start, - end - ) - - # Assemble - pos = str(start) - ref = vcf_del_seq - alt = utils.simple_dna_revcomp(vcf_del_seq) - - # Delins - elif reverse_normalized_hgvs_genomic.posedit.edit.type == 'delins': - end = int(reverse_normalized_hgvs_genomic.posedit.pos.end.base) - start = int(reverse_normalized_hgvs_genomic.posedit.pos.start.base) - adj_start = start - 2 - - ins_seq = reverse_normalized_hgvs_genomic.posedit.edit.alt or '' - - vcf_del_seq = sf.fetch_seq( - reverse_normalized_hgvs_genomic.ac, - adj_start, - end +def _select_pvcf_normalizer(normalization_direction, reverse_normalizer, validator): + """Return the normalizer for the requested VCF normalisation direction.""" + return {3: validator.hn, 5: reverse_normalizer}[normalization_direction] + +def _pvcf_to_hgvs_input(query): + """Convert pseudo-VCF input to an HGVS-like substitution description.""" + query = query.replace(":", "-") + vcf_elements = query.split("-") + if re.search(r"-\d+-[GATC]+-[GATC]+", query): + return f"{vcf_elements[0]}:{vcf_elements[1]}{vcf_elements[2]}>{vcf_elements[3]}" + if re.search(r"-\d+-[GATC]+-", query): + return f"{vcf_elements[0]}:{vcf_elements[1]}{vcf_elements[2]}>{vcf_elements[2]}" + raise PseudoVCF2HGVSError("Unsupported format: VCF specification 4.1 or later") + +def _resolve_pvcf_accession(accession, selected_assembly, validator): + """Resolve a pseudo-VCF chromosome/LRG identifier to an accession.""" + if accession.startswith(("NC_", "NG_", "NW_", "NT_")): + return accession + if re.fullmatch(r"LRG_\d+", accession): + return validator.db.get_refseq_id_from_lrg_id(accession) + chr_num = accession.strip().upper() + if chr_num.startswith("CHR"): + chr_num = chr_num[3:] + accession = seq_data.get_accession(chr_num, selected_assembly) + if accession is None: # Accession is not set + raise PseudoVCF2HGVSError( + f"{chr_num} is not part of genome build {selected_assembly} or is not supported" ) + return accession + +def _pvcf_get_alleles(position_and_edit): + """Extract reference and alternate alleles from a pseudo-VCF edit.""" + match = re.search(r"([GATCgatc]+)>([GATCgatc]+)", position_and_edit) + if match is None: + raise PseudoVCF2HGVSError("Unsupported format: VCF specification 4.1 or later!") + return match.groups() + +def _pvcf_build_simple_hgvs(accession, ref_type, position_and_edit): + """Build an HGVS object for a single-base pseudo-VCF substitution.""" + match = re.fullmatch(r"(\d+)(?:_(\d+))?([GATCgatc])>([GATCgatc])", position_and_edit) + if match is None: + raise PseudoVCF2HGVSError( + f"Unable to parse pseudo-VCF substitution: {position_and_edit}" + ) + start, end, ref, alt = match.groups() + return hgvs_delins_parts_to_hgvs_obj( + accession, ref_type, int(start), ref, alt, + end=int(end) if end is not None else None, + ) - pos = str(start - 1) - ref = vcf_del_seq - alt = vcf_del_seq[0] + ins_seq - - # Duplications - elif reverse_normalized_hgvs_genomic.posedit.edit.type == 'dup': - end = int(reverse_normalized_hgvs_genomic.posedit.pos.end.base) # - start = int(reverse_normalized_hgvs_genomic.posedit.pos.start.base) - adj_start = start - 2 # - start = start - 1 # - # Recover sequences - dup_seq = reverse_normalized_hgvs_genomic.posedit.edit.ref - vcf_ref_seq = sf.fetch_seq(reverse_normalized_hgvs_genomic.ac, adj_start, end) - # Assemble - pos = str(start) - ref = vcf_ref_seq - alt = vcf_ref_seq + dup_seq - else: - chr = '' - ref = '' - alt = '' - pos = '' - - # ensure as 5' as possible - if chr != '' and pos != '' and ref != '' and alt != '': - if len(ref) > 1: - if reverse_normalized_hgvs_genomic.posedit.edit.type == 'identity': - pos = int(pos) - 1 - prev = sf.fetch_seq(reverse_normalized_hgvs_genomic.ac, pos - 1, pos) - pos = str(pos) - ref = prev + ref - alt = prev + alt - - # Add flank bases if requested - if extra_flank_bases > 0: - original_pos = pos - pos = str(int(pos) - extra_flank_bases) - left_flank = sf.fetch_seq(reverse_normalized_hgvs_genomic.ac, int(pos) - 1, int(original_pos) - 1) - right_flank = sf.fetch_seq(reverse_normalized_hgvs_genomic.ac, int(original_pos) + len(ref) - 1, - int(original_pos) + len(ref) - 1 + extra_flank_bases) - ref = left_flank + ref + right_flank - alt = left_flank + alt + right_flank - - # Dictionary the VCF - vcf_dict = {'chr': chr, 'pos': pos, 'ref': ref, 'alt': alt, 'normalized_hgvs': reverse_normalized_hgvs_genomic} - return vcf_dict - - -def report_hgvs2vcf(hgvs_genomic, primary_assembly, reverse_normalizer, sf): - """ - Used to report the Most true representation of the VCF i.e. 5 prime normalized but no - additional bases added. NOTE: no gap handling capabilities - - :param hgvs_genomic: - :param primary_assembly: - :param reverse_normalizer: - :param sf: - :return: - """ - - hgvs_genomic_variant = hgvs_genomic - - # Reverse normalize hgvs_genomic_variant: NOTE will replace ref - reverse_normalized_hgvs_genomic = reverse_normalizer.normalize(hgvs_genomic_variant) - - ucsc_pa = '' - grc_pa = '' - ucsc_chr = '' - grc_chr = '' - chrs = {} - # Sort the primary assemblies or go through all valid assemblies - if primary_assembly == 'All': - # return all valid genome builds on our report output list - gen_name_map = { - 'GRCh37':'grch37', - 'hg19':'hg19', - 'GRCh38':'grch38', - 'hg38':'hg38'} - - genomes = ['GRCh37','hg19','GRCh38','hg38'] - for genome in genomes: - if not seq_data.is_supported_for_mapping(hgvs_genomic_variant.ac, genome): - continue - if genome.startswith('GRC'): - chrom = seq_data.get_chr_num_refseq( - reverse_normalized_hgvs_genomic.ac, - genome) - else: - chrom = seq_data.get_chr_num_ucsc( - reverse_normalized_hgvs_genomic.ac, - genome) - if chrom is None: - chrom = hgvs_genomic_variant.ac - chrs[gen_name_map[genome]]=chrom - else: - if 'GRC' in primary_assembly: - if '37' in primary_assembly: - ucsc_pa = 'hg19' - grc_pa = primary_assembly - if '38' in primary_assembly: - ucsc_pa = 'hg38' - grc_pa = primary_assembly - else: - if '19' in primary_assembly: - ucsc_pa = primary_assembly - grc_pa = 'GRCh37' - if '38' in primary_assembly: - ucsc_pa = primary_assembly - grc_pa = 'GRCh38' - # UCSC Chr - ucsc_chr = seq_data.get_chr_num_ucsc(reverse_normalized_hgvs_genomic.ac, ucsc_pa) - if ucsc_chr is not None: - pass - else: - ucsc_chr = reverse_normalized_hgvs_genomic.ac - - # GRC Chr - grc_chr = seq_data.get_chr_num_refseq(reverse_normalized_hgvs_genomic.ac, grc_pa) - if grc_chr is not None: - pass - else: - grc_chr = reverse_normalized_hgvs_genomic.ac +def _pvcf_build_multibase_hgvs(accession, ref_type, position_and_edit): + """Build an HGVS object for a multi-base pseudo-VCF edit.""" + ref, alt = _pvcf_get_alleles(position_and_edit) + not_sub = f"{accession}{ref_type}{position_and_edit}" + if re.search(r"[0-9]+_[0-9]+", not_sub): + beginning_string, middle_string = not_sub.split(":", 1) + middle_string = middle_string.split("_", 1)[0] + not_sub = f"{beginning_string}:{middle_string}{ref}>{alt}" + + ref_ac, _, remainder = not_sub.partition(":") + hgvs_ref_type, _, posedit = remainder.partition(".") + pos_ref, _, insert = posedit.partition(">") + match = re.search(r"([0-9]+)([GATCgatc]+)", pos_ref) + if match is None: + raise PseudoVCF2HGVSError(f"Unable to parse reference sequence from {not_sub}") + + delete = match.group(2) + starts = posedit.split(delete, 1)[0] + temporary = hgvs_delins_parts_to_hgvs_obj( + ref_ac, hgvs_ref_type, starts, delete[0], insert + ) + temporary.posedit.edit.ref = delete + start = temporary.posedit.pos.start - # Identity - if reverse_normalized_hgvs_genomic.posedit.edit.type == 'identity': - pos = str(reverse_normalized_hgvs_genomic.posedit.pos.start) - ref = reverse_normalized_hgvs_genomic.posedit.edit.ref - alt = reverse_normalized_hgvs_genomic.posedit.edit.ref - - # Insertions - elif reverse_normalized_hgvs_genomic.posedit.edit.type == 'ins': - end = int(reverse_normalized_hgvs_genomic.posedit.pos.end.base) - start = int(reverse_normalized_hgvs_genomic.posedit.pos.start.base) - alt_start = start - 1 # - # Recover sequences - ref_seq = sf.fetch_seq(reverse_normalized_hgvs_genomic.ac, alt_start, end - 1) - ins_seq = reverse_normalized_hgvs_genomic.posedit.edit.alt - # Assemble - pos = start - ref = ref_seq - alt = ref_seq + ins_seq - - # Substitutions - elif reverse_normalized_hgvs_genomic.posedit.edit.type == 'sub': - ref = reverse_normalized_hgvs_genomic.posedit.edit.ref - alt = reverse_normalized_hgvs_genomic.posedit.edit.alt - pos = str(reverse_normalized_hgvs_genomic.posedit.pos) - - # Deletions - elif reverse_normalized_hgvs_genomic.posedit.edit.type == 'del': - end = int(reverse_normalized_hgvs_genomic.posedit.pos.end.base) - start = int(reverse_normalized_hgvs_genomic.posedit.pos.start.base) - adj_start = start - 2 - start = start - 1 - # Recover sequences - if adj_start >= 0: - hgvs_del_seq_w_pre_base = sf.fetch_seq( - reverse_normalized_hgvs_genomic.ac, - adj_start, end) - ref = hgvs_del_seq_w_pre_base - alt = hgvs_del_seq_w_pre_base[0] - pos = str(start) - else: - hgvs_del_seq_w_post_base = sf.fetch_seq( - reverse_normalized_hgvs_genomic.ac, - start, end + 1) - ref = hgvs_del_seq_w_post_base - alt = hgvs_del_seq_w_post_base[-1] - pos = "1" - - # inv - elif reverse_normalized_hgvs_genomic.posedit.edit.type == 'inv': - end = int(reverse_normalized_hgvs_genomic.posedit.pos.end.base) - start = int(reverse_normalized_hgvs_genomic.posedit.pos.start.base) - adj_start = start - 1 - - # Use the existing reference sequence where available, avoiding the - # relatively expensive sequence fetch. - try: - vcf_del_seq = reverse_normalized_hgvs_genomic.posedit.edit.ref - except AttributeError: - vcf_del_seq = None - - if not vcf_del_seq: - vcf_del_seq = sf.fetch_seq( - reverse_normalized_hgvs_genomic.ac, - adj_start, - end + if isinstance(start, BaseOffsetPosition): + if start.offset < 0: + end = BaseOffsetPosition( + base=start.base, offset=-start.offset + len(delete), datum=start.datum ) + else: # Make base offset position + end = BaseOffsetPosition( + base=start.base, offset=start.offset + len(delete) - 1, datum=start.datum + ) + else: # Make simple position + end = SimplePosition(base=start.base + len(delete) - 1) - # Assemble - pos = str(start) - ref = vcf_del_seq - alt = utils.simple_dna_revcomp(vcf_del_seq) - - # Delins - elif reverse_normalized_hgvs_genomic.posedit.edit.type == 'delins': - start = int(reverse_normalized_hgvs_genomic.posedit.pos.start.base) - end = int(reverse_normalized_hgvs_genomic.posedit.pos.end.base) - - ins_seq = reverse_normalized_hgvs_genomic.posedit.edit.alt or '' - - vcf_del_seq = sf.fetch_seq( - reverse_normalized_hgvs_genomic.ac, - start - 1, - end - ) - - pos = str(start) - ref = vcf_del_seq - alt = ins_seq - - # Duplications - elif reverse_normalized_hgvs_genomic.posedit.edit.type == 'dup': - end = int(reverse_normalized_hgvs_genomic.posedit.pos.end.base) # - start = int(reverse_normalized_hgvs_genomic.posedit.pos.start.base) - adj_start = start - 2 # - start = start - 1 # - # Recover sequences - vcf_ref_seq = sf.fetch_seq(reverse_normalized_hgvs_genomic.ac, adj_start, end) - # Assemble - pos = str(start) - ref = vcf_ref_seq[0] - alt = vcf_ref_seq - else: - ref = '' - alt = '' - pos = '' - - # Dictionary the VCF - vcf_dict = {'pos': str(pos), 'ref': ref, 'alt': alt, 'ucsc_chr': ucsc_chr, 'grc_chr': grc_chr, - 'normalized_hgvs': reverse_normalized_hgvs_genomic,'chrs_by_genome':chrs} - return vcf_dict + return hgvs_obj_from_existing_edit( + ref_ac, hgvs_ref_type, start, + vvhgvs.edit.NARefAlt(ref=delete, alt=insert), end=end, + ) +def _pvcf_build_hgvs_object(accession, ref_type, position_and_edit): + """Build a pseudo-VCF HGVS object while preserving HGVS position objects.""" + ref, alt = _pvcf_get_alleles(position_and_edit) + if len(ref) == 1 and len(alt) == 1 and "," not in position_and_edit: + return _pvcf_build_simple_hgvs(accession, ref_type, position_and_edit) + return _pvcf_build_multibase_hgvs(accession, ref_type, position_and_edit) -def pos_lock_hgvs2vcf(hgvs_genomic, primary_assembly, reverse_normalizer, sf): - """ - No normalization at all. No additional bases added. Simply returns an in-situ VCF - :param hgvs_genomic: - :param primary_assembly: - :param reverse_normalizer: - :param sf: - :return: - """ - # Replace reference manually - if hgvs_genomic.posedit.edit.ref == '': - hgvs_genomic.posedit.edit.ref = sf.fetch_seq(hgvs_genomic.ac, hgvs_genomic.posedit.pos.start.base - 1, - hgvs_genomic.posedit.pos.end.base) - - reverse_normalized_hgvs_genomic = hgvs_genomic - if reverse_normalized_hgvs_genomic.posedit.edit.type == 'identity' and len( - reverse_normalized_hgvs_genomic.posedit.edit.ref) == 0: - reverse_normalized_hgvs_genomic = reverse_normalizer.normalize(reverse_normalized_hgvs_genomic) - - # hgvs_genomic_5pr = copy.deepcopy(reverse_normalized_hgvs_genomic) - - # Chr - chr = seq_data.get_chr_num_ucsc(reverse_normalized_hgvs_genomic.ac, primary_assembly) - if chr is not None: - pass - else: - chr = reverse_normalized_hgvs_genomic.ac +def pvcf_to_hgvs(query, selected_assembly, normalization_direction, reverse_normalizer, validator): + """Convert a pseudo-VCF description to an HGVS object.""" + selected_normalizer = _select_pvcf_normalizer( + normalization_direction, reverse_normalizer, validator + ) + query = _pvcf_to_hgvs_input(query) + accession, position_and_edit = query.split(":", 1) + accession = _resolve_pvcf_accession(accession, selected_assembly, validator) + hgvs_object = _pvcf_build_hgvs_object(accession, ":g.", position_and_edit) + return selected_normalizer.normalize(hgvs_object) + +def _hgvs_vcf_sequence(hgvs, sf, report_mode=False): + """Convert an HGVS edit to VCF position/ref/alt components.""" + edit = hgvs.posedit.edit + position = hgvs.posedit.pos + edit_type = edit.type - # Identity - if reverse_normalized_hgvs_genomic.posedit.edit.type == 'identity': - pos = str(reverse_normalized_hgvs_genomic.posedit.pos.start) - ref = reverse_normalized_hgvs_genomic.posedit.edit.ref - alt = reverse_normalized_hgvs_genomic.posedit.edit.ref - - # Insertions - elif reverse_normalized_hgvs_genomic.posedit.edit.type == 'ins': - end = int(reverse_normalized_hgvs_genomic.posedit.pos.end.base) - start = int(reverse_normalized_hgvs_genomic.posedit.pos.start.base) - alt_start = start - 1 # - # Recover sequences - ref_seq = sf.fetch_seq(reverse_normalized_hgvs_genomic.ac, alt_start, end - 1) - ins_seq = reverse_normalized_hgvs_genomic.posedit.edit.alt - # Assemble - pos = start - ref = ref_seq - alt = ref_seq + ins_seq - - # Substitutions - elif reverse_normalized_hgvs_genomic.posedit.edit.type == 'sub': - ref = reverse_normalized_hgvs_genomic.posedit.edit.ref - alt = reverse_normalized_hgvs_genomic.posedit.edit.alt - pos = str(reverse_normalized_hgvs_genomic.posedit.pos) - - # Deletions - elif reverse_normalized_hgvs_genomic.posedit.edit.type == 'del': - end = int(reverse_normalized_hgvs_genomic.posedit.pos.end.base) - start = int(reverse_normalized_hgvs_genomic.posedit.pos.start.base) + if edit_type == "identity": + return str(position.start), edit.ref, edit.ref + if edit_type == "ins": + end = int(position.end.base) + start = int(position.start.base) + ref_seq = sf.fetch_seq(hgvs.ac, start - 1, end - 1) + return start, ref_seq, ref_seq + edit.alt + if edit_type == "sub": + return str(position), edit.ref, edit.alt + if edit_type == "del": + end = int(position.end.base) + start = int(position.start.base) adj_start = start - 2 - start = start - 1 - # Recover sequences - hgvs_del_seq_w_pre_base = sf.fetch_seq( - reverse_normalized_hgvs_genomic.ac, - adj_start, end) - # Assemble - pos = str(start) - ref = hgvs_del_seq_w_pre_base - alt = hgvs_del_seq_w_pre_base[0] - - # inv - elif reverse_normalized_hgvs_genomic.posedit.edit.type == 'inv': - start = int(reverse_normalized_hgvs_genomic.posedit.pos.start.base) - end = int(reverse_normalized_hgvs_genomic.posedit.pos.end.base) - - try: - vcf_del_seq = reverse_normalized_hgvs_genomic.posedit.edit.ref - except AttributeError: - vcf_del_seq = None - - if not vcf_del_seq: - vcf_del_seq = sf.fetch_seq( - reverse_normalized_hgvs_genomic.ac, - start - 1, - end + if report_mode and adj_start < 0: + ref_seq = sf.fetch_seq(hgvs.ac, start, end + 1) + return "1", ref_seq, ref_seq[-1] + ref_seq = sf.fetch_seq(hgvs.ac, adj_start, end) + return str(start - 1), ref_seq, ref_seq[0] + if edit_type == "inv": + start = int(position.start.base) + end = int(position.end.base) + ref_seq = getattr(edit, "ref", None) + if not ref_seq: + ref_seq = sf.fetch_seq(hgvs.ac, start - 1, end) + return str(start), ref_seq, utils.simple_dna_revcomp(ref_seq) + if edit_type == "delins": + start = int(position.start.base) + end = int(position.end.base) + ins_seq = edit.alt or "" + if report_mode: + ref_seq = sf.fetch_seq(hgvs.ac, start - 1, end) + return str(start), ref_seq, ins_seq + ref_seq = sf.fetch_seq(hgvs.ac, start - 2, end) + return str(start - 1), ref_seq, ref_seq[0] + ins_seq + if edit_type == "dup": + end = int(position.end.base) + start = int(position.start.base) + ref_seq = sf.fetch_seq(hgvs.ac, start - 2, end) + if report_mode: + return str(start - 1), ref_seq[0], ref_seq + return str(start - 1), ref_seq, ref_seq + edit.ref + return "", "", "" + +def _hgvs2vcf_chromosome(hgvs, primary_assembly): + return seq_data.get_chr_num_ucsc(hgvs.ac, primary_assembly) or hgvs.ac + +def _report_vcf_chromosomes(hgvs, primary_assembly): + if primary_assembly == "All": + gen_name_map = {"GRCh37": "grch37", "hg19": "hg19", "GRCh38": "grch38", "hg38": "hg38"} + chrs = {} + for genome, output_name in gen_name_map.items(): + if not seq_data.is_supported_for_mapping(hgvs.ac, genome): + continue + chrom = ( + seq_data.get_chr_num_refseq(hgvs.ac, genome) + if genome.startswith("GRC") + else seq_data.get_chr_num_ucsc(hgvs.ac, genome) ) + chrs[output_name] = chrom or hgvs.ac + return "", "", chrs + + ucsc_pa = "" + grc_pa = "" + if "GRC" in primary_assembly: + if "37" in primary_assembly: + ucsc_pa = "hg19" + grc_pa = primary_assembly # inherits + if "38" in primary_assembly: + ucsc_pa = "hg38" + grc_pa = primary_assembly # inherits + else: # When hg formart us used rather than GRCh + if "19" in primary_assembly: + ucsc_pa = primary_assembly # inherits + grc_pa = "GRCh37" + if "38" in primary_assembly: + ucsc_pa = primary_assembly # inherits + grc_pa = "GRCh38" + + return ( + seq_data.get_chr_num_ucsc(hgvs.ac, ucsc_pa) or hgvs.ac, + seq_data.get_chr_num_refseq(hgvs.ac, grc_pa) or hgvs.ac, + {}, + ) - # Assemble - pos = str(start) - ref = vcf_del_seq - alt = utils.simple_dna_revcomp(vcf_del_seq) - - # Delins - elif reverse_normalized_hgvs_genomic.posedit.edit.type == 'delins': - start = int(reverse_normalized_hgvs_genomic.posedit.pos.start.base) - end = int(reverse_normalized_hgvs_genomic.posedit.pos.end.base) - adj_start = start - 2 +def _add_vcf_flanks(hgvs, sf, pos, ref, alt, extra_flank_bases): + if extra_flank_bases <= 0: + return pos, ref, alt + original_pos = pos + pos = str(int(pos) - extra_flank_bases) + left_flank = sf.fetch_seq(hgvs.ac, int(pos) - 1, int(original_pos) - 1) + right_flank = sf.fetch_seq( + hgvs.ac, + int(original_pos) + len(ref) - 1, + int(original_pos) + len(ref) - 1 + extra_flank_bases, + ) + return pos, left_flank + ref + right_flank, left_flank + alt + right_flank - ins_seq = reverse_normalized_hgvs_genomic.posedit.edit.alt or '' +def hgvs2vcf(hgvs_genomic, primary_assembly, reverse_normalizer, sf, extra_flank_bases=0): + """Convert HGVS to the standard VCF representation.""" + normalized = ( + hgvs_genomic + if reverse_normalizer is None + else reverse_normalizer.normalize(hgvs_genomic) + ) + chrom = _hgvs2vcf_chromosome(normalized, primary_assembly) + pos, ref, alt = _hgvs_vcf_sequence(normalized, sf) + + if chrom and pos and ref and alt and len(ref) > 1: + if normalized.posedit.edit.type == "identity": + pos_int = int(pos) - 1 + previous = sf.fetch_seq(normalized.ac, pos_int - 1, pos_int) + pos = str(pos_int) + ref = previous + ref + alt = previous + alt + pos, ref, alt = _add_vcf_flanks(normalized, sf, pos, ref, alt, extra_flank_bases) + return {"chr": chrom, "pos": pos, "ref": ref, "alt": alt, "normalized_hgvs": normalized} - vcf_del_seq = sf.fetch_seq( - reverse_normalized_hgvs_genomic.ac, - adj_start, - end +def report_hgvs2vcf(hgvs_genomic, primary_assembly, reverse_normalizer, sf): + """Return the report VCF representation without additional flank bases.""" + normalized = reverse_normalizer.normalize(hgvs_genomic) + ucsc_chr, grc_chr, chrs = _report_vcf_chromosomes(normalized, primary_assembly) + pos, ref, alt = _hgvs_vcf_sequence(normalized, sf, report_mode=True) + return { + "pos": str(pos), + "ref": ref, + "alt": alt, + "ucsc_chr": ucsc_chr, + "grc_chr": grc_chr, + "normalized_hgvs": normalized, + "chrs_by_genome": chrs, + } + +def pos_lock_hgvs2vcf(hgvs_genomic, + primary_assembly, + reverse_normalizer, + sf): + """Return an in-situ VCF representation without normalisation.""" + if hgvs_genomic.posedit.edit.ref == "": + hgvs_genomic.posedit.edit.ref = sf.fetch_seq( + hgvs_genomic.ac, + hgvs_genomic.posedit.pos.start.base - 1, + hgvs_genomic.posedit.pos.end.base, ) - pos = str(start - 1) - ref = vcf_del_seq - alt = vcf_del_seq[0] + ins_seq - - # Duplications - elif reverse_normalized_hgvs_genomic.posedit.edit.type == 'dup': - end = int(reverse_normalized_hgvs_genomic.posedit.pos.end.base) # - start = int(reverse_normalized_hgvs_genomic.posedit.pos.start.base) - adj_start = start - 2 # - start = start - 1 # - # Recover sequences - dup_seq = reverse_normalized_hgvs_genomic.posedit.edit.ref - vcf_ref_seq = sf.fetch_seq(reverse_normalized_hgvs_genomic.ac, adj_start, end) - # Assemble - pos = str(start) - ref = vcf_ref_seq - alt = vcf_ref_seq + dup_seq - else: - chr = '' - ref = '' - alt = '' - pos = '' + normalized = hgvs_genomic + if normalized.posedit.edit.type == "identity" and not normalized.posedit.edit.ref: + normalized = reverse_normalizer.normalize(normalized) - vcf_dict = {'chr': chr, 'pos': pos, 'ref': ref, 'alt': alt, 'normalized_hgvs': reverse_normalized_hgvs_genomic} - return vcf_dict + chrom = _hgvs2vcf_chromosome(normalized, primary_assembly) + pos, ref, alt = _hgvs_vcf_sequence(normalized, sf) + return {"chr": chrom, "pos": pos, "ref": ref, "alt": alt, "normalized_hgvs": normalized} def pre_push_vcf_tx_g_map_fix( norm_hgvs_transcript, @@ -1413,6 +1057,105 @@ def pre_push_vcf_tx_g_map_fix( return hgvs_genomic_n_assembled +def _prepare_hard_hgvs( + hgvs_genomic, + primary_assembly, + normalizer, + hn, + sf, + vm, + tx_ac, + map_dat, + alt_aln_method, + genomic_ac, + mapped_g, + pre_norm, +): + """Prepare the HGVS object and initial VCF components for hard pushing. + + The left and right push algorithms deliberately remain separate. This + helper only handles their identical input preparation and VCF conversion. + """ + if hgvs_genomic.type == "c": + hgvs_genomic = vm.c_to_n(hgvs_genomic) + + if pre_norm: + normalized_hgvs_genomic = pre_norm + else: + normalized_hgvs_genomic = normalizer.normalize(hgvs_genomic) + + if hgvs_genomic.type != "g": + normalized_hgvs_genomic = pre_push_vcf_tx_g_map_fix( + normalized_hgvs_genomic, + hgvs_genomic, + genomic_ac, + vm, + hn, + sf, + mapped_g, + ) + + if hgvs_genomic.type == "g": + chrom = seq_data.get_chr_num_ucsc( + normalized_hgvs_genomic.ac, + primary_assembly, + ) or normalized_hgvs_genomic.ac + else: + chrom = normalized_hgvs_genomic.ac + + pos, ref, alt = _hgvs_vcf_sequence(normalized_hgvs_genomic, sf) + if not (pos and ref and alt): + chrom = "" + + return ( + hgvs_genomic, + normalized_hgvs_genomic, + chrom, + pos, + ref, + alt, + ) + + +def _hard_exon_boundary( + map_dat, + tx_ac, + hgvs_ac, + genomic_ac, + alt_aln_method, + pos, + direction, +): + """Return the exon boundary used by a hard push. + + ``direction`` is ``right`` for the 3-prime boundary and ``left`` for + the 5-prime boundary. The mapping column selection is unchanged from + the original hard push implementations. + """ + if genomic_ac is False: + exon_set = map_dat.mapped_exons( + tx_ac, + hgvs_ac, + alt_aln_method=alt_aln_method, + ) + start_column, end_column = 7, 8 + else: + exon_set = map_dat.mapped_exons( + hgvs_ac, + genomic_ac, + alt_aln_method=alt_aln_method, + ) + start_column, end_column = 5, 6 + + for exon in exon_set: + if int(exon[start_column]) + 1 <= int(pos) <= int(exon[end_column]): + if direction == "right": + return int(exon[end_column]) + return int(exon[start_column] + 1) + + return None + + def hard_right_hgvs2vcf(hgvs_genomic, primary_assembly, hn, reverse_normalizer, sf, tx_ac, map_dat, alt_aln_method, hp, vm, mrg, genomic_ac=False, mapped_g=False, pre_norm=False): """ @@ -1428,138 +1171,33 @@ def hard_right_hgvs2vcf(hgvs_genomic, primary_assembly, hn, reverse_normalizer, :param alt_aln_method: :param hp: :param vm: + :param mrg: :param genomic_ac: Genomic ac when transcirpt var is input *Must* be false for genomic var :return: """ - if hgvs_genomic.type == 'g': - # Reverse normalize input prior to convert: NOTE will replace ref - if pre_norm: - normalized_hgvs_genomic = pre_norm - else: - normalized_hgvs_genomic = hn.normalize(hgvs_genomic) - else: - # c. must be in n. format - if hgvs_genomic.type == 'c': - hgvs_genomic = vm.c_to_n(hgvs_genomic) - if pre_norm: - normalized_hgvs_genomic = pre_norm - else: - normalized_hgvs_genomic = hn.normalize(hgvs_genomic) - normalized_hgvs_genomic = pre_push_vcf_tx_g_map_fix( - normalized_hgvs_genomic, - hgvs_genomic, - genomic_ac, - vm, - hn,# normaliser - sf,# seq_fetcher - mapped_g) - - # Chr - if hgvs_genomic.type == 'g': - chr = seq_data.get_chr_num_ucsc(normalized_hgvs_genomic.ac, primary_assembly) - if chr is None: - chr = normalized_hgvs_genomic.ac - else: - chr = normalized_hgvs_genomic.ac - - # identity - if normalized_hgvs_genomic.posedit.edit.type == 'identity': - pos = str(normalized_hgvs_genomic.posedit.pos.start) - ref = normalized_hgvs_genomic.posedit.edit.ref - alt = normalized_hgvs_genomic.posedit.edit.ref - - # Insertions - elif normalized_hgvs_genomic.posedit.edit.type == 'ins': - end = int(normalized_hgvs_genomic.posedit.pos.end.base) - start = int(normalized_hgvs_genomic.posedit.pos.start.base) - alt_start = start - 1 # - # Recover sequences - ref_seq = sf.fetch_seq(normalized_hgvs_genomic.ac, alt_start, end - 1) - ins_seq = normalized_hgvs_genomic.posedit.edit.alt - # Assemble - pos = start - ref = ref_seq - alt = ref_seq + ins_seq - - # Substitutions - elif normalized_hgvs_genomic.posedit.edit.type == 'sub': - ref = normalized_hgvs_genomic.posedit.edit.ref - alt = normalized_hgvs_genomic.posedit.edit.alt - pos = str(normalized_hgvs_genomic.posedit.pos) - - # Deletions - elif normalized_hgvs_genomic.posedit.edit.type == 'del': - end = int(normalized_hgvs_genomic.posedit.pos.end.base) - start = int(normalized_hgvs_genomic.posedit.pos.start.base) - adj_start = start - 2 - start = start - 1 - # Recover sequences - hgvs_del_seq_w_adj_start = sf.fetch_seq(normalized_hgvs_genomic.ac, adj_start, end) - # Assemble - pos = str(start) - ref = hgvs_del_seq_w_adj_start - alt = hgvs_del_seq_w_adj_start[0] - - # inv - elif normalized_hgvs_genomic.posedit.edit.type == 'inv': - start = int(normalized_hgvs_genomic.posedit.pos.start.base) - end = int(normalized_hgvs_genomic.posedit.pos.end.base) - - try: - vcf_del_seq = normalized_hgvs_genomic.posedit.edit.ref - except AttributeError: - vcf_del_seq = None - - if not vcf_del_seq: - vcf_del_seq = sf.fetch_seq( - normalized_hgvs_genomic.ac, - start - 1, - end - ) - - # Assemble - pos = str(start) - ref = vcf_del_seq - alt = utils.simple_dna_revcomp(vcf_del_seq) - - # Delins - elif normalized_hgvs_genomic.posedit.edit.type == 'delins': - start = int(normalized_hgvs_genomic.posedit.pos.start.base) - end = int(normalized_hgvs_genomic.posedit.pos.end.base) - adj_start = start - 2 - - ins_seq = normalized_hgvs_genomic.posedit.edit.alt or '' - - vcf_del_seq = sf.fetch_seq( - normalized_hgvs_genomic.ac, - adj_start, - end - ) - - pos = str(start - 1) - ref = vcf_del_seq - alt = vcf_del_seq[0] + ins_seq - - # Duplications - elif normalized_hgvs_genomic.posedit.edit.type == 'dup': - end = int(normalized_hgvs_genomic.posedit.pos.end.base) # - start = int(normalized_hgvs_genomic.posedit.pos.start.base) - adj_start = start - 2 # - start = start - 1 # - # Recover sequences - dup_seq = normalized_hgvs_genomic.posedit.edit.ref - vcf_ref_seq = sf.fetch_seq(normalized_hgvs_genomic.ac, adj_start, end) - # Assemble - pos = str(start) - ref = vcf_ref_seq - alt = vcf_ref_seq + dup_seq - else: - chr = '' - ref = '' - alt = '' - pos = '' + ( + hgvs_genomic, + normalized_hgvs_genomic, + chr, + pos, + ref, + alt, + ) = _prepare_hard_hgvs( + hgvs_genomic, + primary_assembly, + hn, + hn, + sf, + vm, + tx_ac, + map_dat, + alt_aln_method, + genomic_ac, + mapped_g, + pre_norm, + ) - # ADD SURROUNDING BASES + # Add surrounding bases # If possible, capture and alt variant that spans the gap merged_variant = False pre_merged_variant = False @@ -1567,27 +1205,18 @@ def hard_right_hgvs2vcf(hgvs_genomic, primary_assembly, hn, reverse_normalizer, identifying_g_variant = False needs_a_push = False - if chr != '' and pos != '' and ref != '' and alt != '': - - # Set exon boundary - if genomic_ac is False: - # Find the boundaries at the genomic level for the current exon - exon_set = map_dat.mapped_exons( - tx_ac, hgvs_genomic.ac, alt_aln_method=alt_aln_method) - exon_end_genomic = None - for exon in exon_set: - if int(exon[7]) + 1 <= int(pos) <= int(exon[8]): - exon_end_genomic = int(exon[8]) - break - else: - # Trick the system using transcript positions - exon_set = map_dat.mapped_exons( - hgvs_genomic.ac, genomic_ac, alt_aln_method=alt_aln_method) - exon_end_genomic = None - for exon in exon_set: - if int(exon[5]) + 1 <= int(pos) <= int(exon[6]): - exon_end_genomic = int(exon[6]) - break + if chr != "" and pos != "" and ref != "" and alt != "": + + # Set exon boundary. + exon_end_genomic = _hard_exon_boundary( + map_dat, + tx_ac, + hgvs_genomic.ac, + genomic_ac, + alt_aln_method, + pos, + "right", + ) # Set loop variables for extending the push push_ref = ref @@ -1640,7 +1269,8 @@ def hard_right_hgvs2vcf(hgvs_genomic, primary_assembly, hn, reverse_normalizer, if hgvs_genomic.type != "g": normlize_check_mapped = vm.n_to_g(normlize_check_variant, genomic_ac) else: - normlize_check_mapped = vm.g_to_n(normlize_check_variant, tx_ac, alt_aln_method) + normlize_check_mapped = vm.g_to_n(normlize_check_variant, + tx_ac, alt_aln_method) # Catch out-of-bounds errors except vvhgvs.exceptions.HGVSInvalidIntervalError: @@ -2100,164 +1730,57 @@ def hard_right_hgvs2vcf(hgvs_genomic, primary_assembly, hn, reverse_normalizer, ref = push_ref alt = push_alt - # Dictionary the VCF + # Dictionary VCF vcf_dict = {'chr': chr, 'pos': pos, 'ref': ref, 'alt': alt, 'normalized_hgvs': normalized_hgvs_genomic, 'merged_variant': merged_variant, 'identifying_variant': identifying_variant, 'pre_merged_variant': pre_merged_variant, 'identifying_g_variant': identifying_g_variant} str_hgvs = vcfcp_to_hgvsstr(vcf_dict, hgvs_genomic) vcf_dict['str_hgvs'] = str_hgvs vcf_dict['needs_a_push'] = needs_a_push - return vcf_dict + return vcf_dict # Return dict def hard_left_hgvs2vcf(hgvs_genomic, primary_assembly, hn, reverse_normalizer, sf, tx_ac, map_dat, alt_aln_method, - hp, vm, mrg, genomic_ac=False, mapped_g=False, pre_norm=False ): + hp, vm, mrg, genomic_ac=False, mapped_g=False, pre_norm=False): """ - Designed specifically for gap handling. - hard left pushes as 5 prime as possible and adds additional bases - :param hgvs_genomic: - :param primary_assembly: - :param hn: - :param reverse_normalizer: - :param sf: - :param tx_ac: + Designed specifically for gap handling - hard left pushes as 5 prime as possible and adds additional bases + :param hgvs_genomic + :param primary_assembly + :param hn + :param reverse_normalizer + :param sf + :param tx_ac :param map_dat: cached fetcher/store for transcript mapping data - :param alt_aln_method: - :param hp: - :param vm: - :param genomic_ac: + :param alt_aln_method + :param hp + :param vm + :param mrg + :param genomic_ac :param mapped_g: genomic mapping, used if a transcript type is input - :return: + :return """ - if hgvs_genomic.type == 'g': - # Reverse normalize input prior to convert: NOTE will replace ref - if pre_norm: - reverse_normalized_hgvs_genomic = pre_norm - else: - reverse_normalized_hgvs_genomic = reverse_normalizer.normalize(hgvs_genomic) - else: - # c. must be in n. format - if hgvs_genomic.type == 'c': - hgvs_genomic = vm.c_to_n(hgvs_genomic) - if pre_norm: - reverse_normalized_hgvs_genomic = pre_norm - else: - reverse_normalized_hgvs_genomic = reverse_normalizer.normalize(hgvs_genomic) - reverse_normalized_hgvs_genomic = pre_push_vcf_tx_g_map_fix( - reverse_normalized_hgvs_genomic, - hgvs_genomic, - genomic_ac, - vm, - hn,# normaliser - sf,# seq_fetcher - mapped_g) - - # Chr - if hgvs_genomic.type == 'g': - chr = seq_data.get_chr_num_ucsc(reverse_normalized_hgvs_genomic.ac, primary_assembly) - if chr is None: - chr = reverse_normalized_hgvs_genomic.ac - else: - chr = reverse_normalized_hgvs_genomic.ac - - # Identity - if reverse_normalized_hgvs_genomic.posedit.edit.type == 'identity': - pos = str(reverse_normalized_hgvs_genomic.posedit.pos.start) - ref = reverse_normalized_hgvs_genomic.posedit.edit.ref - alt = reverse_normalized_hgvs_genomic.posedit.edit.ref - - # Insertions - elif reverse_normalized_hgvs_genomic.posedit.edit.type == 'ins': - end = int(reverse_normalized_hgvs_genomic.posedit.pos.end.base) - start = int(reverse_normalized_hgvs_genomic.posedit.pos.start.base) - alt_start = start - 1 # - # Recover sequences - ref_seq = sf.fetch_seq(reverse_normalized_hgvs_genomic.ac, alt_start, end - 1) - ins_seq = reverse_normalized_hgvs_genomic.posedit.edit.alt - # Assemble - pos = start - ref = ref_seq - alt = ref_seq + ins_seq - - # Substitutions - elif reverse_normalized_hgvs_genomic.posedit.edit.type == 'sub': - ref = reverse_normalized_hgvs_genomic.posedit.edit.ref - alt = reverse_normalized_hgvs_genomic.posedit.edit.alt - pos = str(reverse_normalized_hgvs_genomic.posedit.pos) - - # Deletions - elif reverse_normalized_hgvs_genomic.posedit.edit.type == 'del': - end = int(reverse_normalized_hgvs_genomic.posedit.pos.end.base) - start = int(reverse_normalized_hgvs_genomic.posedit.pos.start.base) - adj_start = start - 2 - start = start - 1 - # Recover sequences - hgvs_del_seq_w_pre_base = sf.fetch_seq(reverse_normalized_hgvs_genomic.ac, adj_start, end) - # Assemble - pos = str(start) - ref = hgvs_del_seq_w_pre_base - alt = hgvs_del_seq_w_pre_base[0] - - # inv - elif reverse_normalized_hgvs_genomic.posedit.edit.type == 'inv': - start = int(reverse_normalized_hgvs_genomic.posedit.pos.start.base) - end = int(reverse_normalized_hgvs_genomic.posedit.pos.end.base) - - try: - vcf_del_seq = reverse_normalized_hgvs_genomic.posedit.edit.ref - except AttributeError: - vcf_del_seq = None - - if not vcf_del_seq: - vcf_del_seq = sf.fetch_seq( - reverse_normalized_hgvs_genomic.ac, - start - 1, - end - ) - - # Assemble - pos = str(start) - ref = vcf_del_seq - alt = utils.simple_dna_revcomp(vcf_del_seq) - - # Delins - elif reverse_normalized_hgvs_genomic.posedit.edit.type == 'delins': - start = int(reverse_normalized_hgvs_genomic.posedit.pos.start.base) - end = int(reverse_normalized_hgvs_genomic.posedit.pos.end.base) - adj_start = start - 2 - - ins_seq = reverse_normalized_hgvs_genomic.posedit.edit.alt or '' - - vcf_del_seq = sf.fetch_seq( - reverse_normalized_hgvs_genomic.ac, - adj_start, - end - ) - - # Assemble - pos = str(start - 1) - ref = vcf_del_seq - alt = vcf_del_seq[0] + ins_seq - - # Duplications - elif reverse_normalized_hgvs_genomic.posedit.edit.type == 'dup': - end = int(reverse_normalized_hgvs_genomic.posedit.pos.end.base) # - start = int(reverse_normalized_hgvs_genomic.posedit.pos.start.base) - adj_start = start - 2 # - start = start - 1 # - # Recover sequences - dup_seq = reverse_normalized_hgvs_genomic.posedit.edit.ref - vcf_ref_seq = sf.fetch_seq(reverse_normalized_hgvs_genomic.ac, adj_start, end) - # Assemble - pos = str(start) - ref = vcf_ref_seq - alt = vcf_ref_seq + dup_seq - else: - chr = '' - ref = '' - alt = '' - pos = '' + ( + hgvs_genomic, + reverse_normalized_hgvs_genomic, + chr, + pos, + ref, + alt, + ) = _prepare_hard_hgvs( + hgvs_genomic, + primary_assembly, + reverse_normalizer, + hn, + sf, + vm, + tx_ac, + map_dat, + alt_aln_method, + genomic_ac, + mapped_g, + pre_norm, + ) - # ADD SURROUNDING BASES + # Add surrounding bases # If possible, capture and alt variant that spans the gap merged_variant = False pre_merged_variant = False @@ -2265,26 +1788,20 @@ def hard_left_hgvs2vcf(hgvs_genomic, primary_assembly, hn, reverse_normalizer, s identifying_g_variant = False needs_a_push = False - if chr != '' and pos != '' and ref != '' and alt != '': - # Set exon boundary - if genomic_ac is False: - # Find the boundaries at the genomic level for the current exon - exon_set = map_dat.mapped_exons( - tx_ac, hgvs_genomic.ac, alt_aln_method=alt_aln_method) - exon_start_genomic = None - for exon in exon_set: - if int(exon[7]) + 1 <= int(pos) <= int(exon[8]): - exon_start_genomic = int(exon[7] + 1) - break - else: - # Trick the system using transcript positions - exon_set = map_dat.mapped_exons( - hgvs_genomic.ac, genomic_ac, alt_aln_method=alt_aln_method) - exon_start_genomic = None - for exon in exon_set: - if int(exon[5]) + 1 <= int(pos) <= int(exon[6]): - exon_start_genomic = int(exon[5] + 1) - break + if (chr != '' + and pos != '' + and ref != '' + and alt != ''): + # Set exon boundary. + exon_start_genomic = _hard_exon_boundary( + map_dat, + tx_ac, + hgvs_genomic.ac, + genomic_ac, + alt_aln_method, + pos, + "left", + ) # Set loop variables for extending the push push_ref = ref @@ -2319,7 +1836,8 @@ def hard_left_hgvs2vcf(hgvs_genomic, primary_assembly, hn, reverse_normalizer, s if hgvs_genomic.type != "g": normlize_check_mapped = vm.n_to_g(normlize_check_variant, genomic_ac) else: - normlize_check_mapped = vm.g_to_n(normlize_check_variant, tx_ac, alt_aln_method) + normlize_check_mapped = vm.g_to_n(normlize_check_variant, + tx_ac, alt_aln_method) # Catch out-of-bounds errors except vvhgvs.exceptions.HGVSInvalidIntervalError: needs_a_push = False @@ -2789,17 +2307,17 @@ def hard_left_hgvs2vcf(hgvs_genomic, primary_assembly, hn, reverse_normalizer, s ref = push_ref alt = push_alt - # Dictionary the VCF + # Dictionary VCF vcf_dict = {'chr': chr, 'pos': pos, 'ref': ref, 'alt': alt, 'normalized_hgvs': reverse_normalized_hgvs_genomic, 'merged_variant': merged_variant, 'identifying_variant': identifying_variant, 'pre_merged_variant': pre_merged_variant, 'identifying_g_variant': identifying_g_variant} str_hgvs = vcfcp_to_hgvsstr(vcf_dict, hgvs_genomic) vcf_dict['str_hgvs'] = str_hgvs vcf_dict['needs_a_push'] = needs_a_push - return vcf_dict - + return vcf_dict # Return dict -def hgvs_ref_alt(hgvs_variant, sf): +def hgvs_ref_alt(hgvs_variant, + sf): edit = hgvs_variant.posedit.edit edit_type = edit.type @@ -2807,53 +2325,47 @@ def hgvs_ref_alt(hgvs_variant, sf): if edit_type == 'identity': ref = edit.ref alt = edit.ref - - # Insertions + # Ins elif edit_type == 'ins': end = hgvs_variant.posedit.pos.end.base start = hgvs_variant.posedit.pos.start.base alt_start = start - 1 - # Recover sequences + # Recover sequence ref_seq = sf.fetch_seq(hgvs_variant.ac, alt_start, end) ins_seq = edit.alt - # Assemble - ref = ref_seq - alt = ref_seq[:1] + ins_seq + ref_seq[-1:] - - # Substitutions + # Assemble vcf + ref = ref_seq # stays equivalent + alt = (ref_seq[:1] + + ins_seq + + ref_seq[-1:]) + # Subs elif edit_type == 'sub': ref = edit.ref alt = edit.alt - - # Deletions + # Dels elif edit_type == 'del': ref = edit.ref - alt = '' - - # Inversions + alt = "" + # Invs elif edit_type == 'inv': ref = edit.ref alt = utils.simple_dna_revcomp(ref) - - # Delins + # Delins variants elif edit_type == 'delins': ref = edit.ref alt = edit.alt - - # Duplications + # Dups elif edit_type == 'dup': ref = edit.ref alt = edit.ref + edit.ref - else: - ref = '' - alt = '' - + else: # Not defined + ref = "" + alt = "" return {'ref': ref, 'alt': alt} - def incomplete_alignment_mapping_t_to_g(validator, variant): output = None mapping_options = variant.map_dat.mapping_options(variant.input_parses.ac,hdp=validator.hdp) diff --git a/VariantValidator/modules/mappers.py b/VariantValidator/modules/mappers.py index 0b820867..4fced4b7 100644 --- a/VariantValidator/modules/mappers.py +++ b/VariantValidator/modules/mappers.py @@ -1,17 +1,21 @@ -import vvhgvs -import re import copy -import vvhgvs.exceptions import logging -from . import hgvs_utils, hgvs_position_utils -from .variant import Variant +import re +from operator import itemgetter + +import vvhgvs +import vvhgvs.exceptions + +from . import gapped_mapping +from . import hgvs_position_utils, hgvs_utils from . import seq_data from . import utils as fn -from . import gapped_mapping from .gapped_mapping import immediate_round_trip_gap_ins_handling -from operator import itemgetter -from VariantValidator.modules.hgvs_utils import hgvs_delins_parts_to_hgvs_obj,\ - unset_hgvs_obj_ref +from .variant import Variant +from VariantValidator.modules.hgvs_utils import ( + hgvs_delins_parts_to_hgvs_obj, + unset_hgvs_obj_ref, +) logger = logging.getLogger(__name__) # Exceptions @@ -34,7 +38,10 @@ def gene_to_transcripts(variant, validator, select_transcripts_dict, batch_list) except vvhgvs.exceptions.HGVSError as e: error = str(e) except KeyError: - error = 'Reference sequence ' + variant.hgvs_genomic.ac + ' is either not supported or does not exist' + error = ( + f'Reference sequence {variant.hgvs_genomic.ac} is either not supported ' + 'or does not exist' + ) if error != 'false': variant.warnings.append(error) logger.info(error) @@ -80,7 +87,7 @@ def gene_to_transcripts(variant, validator, select_transcripts_dict, batch_list) try: hgvs_coding_variant.rel_ac = '' variant.hgvs_genomic = validator.myevm_t_to_g(hgvs_coding_variant, variant.no_norm_evm, - variant.primary_assembly, variant.hn,variant) + variant.primary_assembly, variant.hn, variant) except vvhgvs.exceptions.HGVSError: try_rel_var = [] else: @@ -93,8 +100,8 @@ def gene_to_transcripts(variant, validator, select_transcripts_dict, batch_list) else: continue - # Triple check this assumption by querying the gene position database - if len(rel_var) == 0: + # Triple check this assumption by querying the gene position database. + if not rel_var: logger.info("0 transcripts found, increasing search depth") try: vcf_dict = hgvs_utils.hgvs2vcf(variant.hgvs_genomic, variant.primary_assembly, None, @@ -127,7 +134,7 @@ def gene_to_transcripts(variant, validator, select_transcripts_dict, batch_list) # Settings like mane, mane_select, etc can reset rel_var to empty, and we # need to know this before the rel_var empty detection/handling steps. unrestricted_map_found = False - if len(rel_var): + if rel_var: unrestricted_map_found = True gap_mapper = gapped_mapping.GapMapper(variant, validator) logger.info(f"relevant variants pre gapping: {rel_var}") @@ -141,7 +148,7 @@ def gene_to_transcripts(variant, validator, select_transcripts_dict, batch_list) rel_var = nw_rel_var logger.info(f"relevant variants post gapping: {rel_var}") - if len(rel_var) == 0: + if not rel_var: # Check for NG_ if variant.hgvs_formatted.ac.startswith('NG_'): hgvs_refseqgene =variant.hgvs_formatted @@ -155,8 +162,11 @@ def gene_to_transcripts(variant, validator, select_transcripts_dict, batch_list) variant.output_type_flag = 'intergenic' # set genomic and where available RefSeqGene outputs variant.warnings.append(no_tx_found_error) - error = 'TranscriptIdentificationWarning: Mapping unavailable for RefSeqGene ' + str(variant.hgvs_formatted) + \ - ' using alignment method = ' + validator.alt_aln_method + error = ( + 'TranscriptIdentificationWarning: Mapping unavailable for RefSeqGene ' + f'{variant.hgvs_formatted} using alignment method = ' + f'{validator.alt_aln_method}' + ) variant.warnings.append(error) variant.genomic_r = variant.hgvs_formatted variant.refseqgene_variant = variant.hgvs_formatted @@ -167,18 +177,22 @@ def gene_to_transcripts(variant, validator, select_transcripts_dict, batch_list) genomic_input = refseqgene_data['hgvs_genomic'] # re_submit # Tag the line so that it is not written out - variant.warnings.append(str(variant.hgvs_formatted) + ' automapped to genome position ' + - str(genomic_input)) + variant.warnings.append( + f'{variant.hgvs_formatted} automapped to genome position {genomic_input}' + ) query = Variant(variant.original, quibble=genomic_input, warnings=variant.warnings, primary_assembly=variant.primary_assembly, order=variant.order, selected_assembly=variant.selected_assembly) batch_list.append(query) logger.info('Submitting new variant with format %s', genomic_input) else: - error = 'TranscriptIdentificationWarning: Mapping unavailable for RefSeqGene ' + str(variant.hgvs_formatted) + \ - ' using alignment method = ' + validator.alt_aln_method + error = ( + 'TranscriptIdentificationWarning: Mapping unavailable for RefSeqGene ' + f'{variant.hgvs_formatted} using alignment method = ' + f'{validator.alt_aln_method}' + ) variant.warnings.append(error) - logger.info(str(error)) + logger.info(error) return True # Chromosome build is not supported or intergenic??? @@ -190,7 +204,7 @@ def gene_to_transcripts(variant, validator, select_transcripts_dict, batch_list) except vvhgvs.exceptions.HGVSError as e: error = str(e) variant.warnings.append(error) - logger.info(str(error)) + logger.info(error) return True else: # Map to RefSeqGene if available @@ -201,7 +215,7 @@ def gene_to_transcripts(variant, validator, select_transcripts_dict, batch_list) for data in refseqgene_data: if data['valid'] == 'true': rsg_data.append(unset_hgvs_obj_ref(data['hgvs_refseqgene'])) - if not len(rsg_data): + if not rsg_data: rsg_data = [''] if validator.select_transcripts not in ['all', 'raw', 'select', 'mane_select', 'mane']: @@ -221,14 +235,14 @@ def gene_to_transcripts(variant, validator, select_transcripts_dict, batch_list) variant.warnings.append(error) variant.genomic_g = unset_hgvs_obj_ref(variant.hgvs_genomic) variant.genomic_r = rsg_data[0] - logger.info(str(error)) + logger.info(error) return True else: error = 'Validation will fail if the selected chromosome reference sequence does not corresponds to ' \ 'selected genome build. Please re-submit your query and select an alternate genome build. ' \ 'Note, if you did not specify a genome build, VariantValidator defaults to GRCh38' variant.warnings.append(error) - logger.info(str(error)) + logger.info(error) return True else: @@ -306,7 +320,7 @@ def transcripts_to_gene(variant, validator, select_transcripts_dict_plus_version try: reset_g_origin = False if obj.rel_ac.startswith('NG_'): - reset_g_origin=True + reset_g_origin = True to_g = validator.myevm_t_to_g( obj, variant.no_norm_evm, @@ -316,36 +330,53 @@ def transcripts_to_gene(variant, validator, select_transcripts_dict_plus_version reset_g_origin=reset_g_origin) genomic_ac = to_g.ac + except vvhgvs.exceptions.HGVSDataNotAvailableError as e: - errors = [] - if ('~' in str(e) and 'Alignment is incomplete' in str(e)) or "No relevant genomic mapping options" in str(e): + error = str(e) + errors = [] # Blank list + if ( + ('~' in error and 'Alignment is incomplete' in error) + or 'No relevant genomic mapping options' in error + ): # Unable to map the input variant onto a genomic position - if '~' in str(e) and 'Alignment is incomplete' in str(e): - errors.append('Full alignment data between the specified transcript reference sequence and all GRCh37 ' \ - 'and GRCh38 genomic reference sequences (including alternate chromosome assemblies, ' \ - 'patches and RefSeqGenes) are not available: Consequently the input variant description ' \ - 'cannot be fully validated and is not supported: Use the Gene to Transcripts function to ' \ - 'determine whether an updated transcript reference sequence is available') + if '~' in error and 'Alignment is incomplete' in error: + errors.append( + 'Full alignment data between the specified transcript ' + 'reference sequence and all GRCh37 and GRCh38 genomic ' + 'reference sequences (including alternate chromosome ' + 'assemblies, patches and RefSeqGenes) are not available: ' + 'Consequently the input variant description cannot be fully ' + 'validated and is not supported: Use the Gene to Transcripts ' + 'function to determine whether an updated transcript ' + 'reference sequence is available' + ) else: - errors.append(str(e) + ': Consequently the input variant description cannot be fully validated and is not ' \ - 'supported: Use the Gene to Transcripts function to determine whether an updated ' \ - 'transcript reference sequence is available') - - if 'does not agree with reference sequence' not in str(e): - errors.append('Required information for ' + tx_ac + ' is missing from the Universal Transcript Archive') - errors.append('Query gene2transcripts with search term %s for available transcripts' % tx_ac.split('.')[0]) - - if 'does not agree with reference sequence' in str(e): - errors.append(str(e)) - + errors.append( + f'{error}: Consequently the input variant description ' + 'cannot be fully validated and is not supported: Use the ' + 'Gene to Transcripts function to determine whether an ' + 'updated transcript reference sequence is available' + ) + if 'does not agree with reference sequence' not in error: + errors.append( + f'Required information for {tx_ac} is missing from the ' + 'Universal Transcript Archive' + ) + errors.append( + 'Query gene2transcripts with search term ' + f'{tx_ac.split(".")[0]} for available transcripts' + ) + else: + errors.append(error) variant.warnings.extend(errors) logger.info(str(errors)) return True - + except TypeError: - errors = ['Required information for ' + tx_ac + ' is missing from the Universal Transcript Archive', - 'Query gene2transcripts with search term %s for ' - 'available transcripts' % tx_ac.split('.')[0]] + errors = [ + f'Required information for {tx_ac} is missing from the Universal Transcript Archive', + f'Query gene2transcripts with search term {tx_ac.split(".")[0]} for available transcripts', + ] variant.warnings.extend(errors) logger.info(str(errors)) return True @@ -355,15 +386,19 @@ def transcripts_to_gene(variant, validator, select_transcripts_dict_plus_version ): if 'error' in str(to_g): if validator.alt_aln_method != 'genebuild': - error = "If the following error message does not address the issue and the problem persists please " \ - "contact admin: " + str(to_g) + error = ( + 'If the following error message does not address the issue and the problem persists ' + f'please contact admin: {to_g}' + ) variant.warnings.append(error) logger.info(error) return True else: - error = "If the following error message does not address the issue and the problem persists please " \ - "contact admin: " + str(to_g) + error = ( + 'If the following error message does not address the issue and the problem persists ' + f'please contact admin: {to_g}' + ) variant.warnings.append(error) logger.info(error) return True @@ -419,15 +454,19 @@ def transcripts_to_gene(variant, validator, select_transcripts_dict_plus_version ) if 'error' in str(to_g): if validator.alt_aln_method != 'genebuild': - error = "If the following error message does not address the issue and the problem persists " \ - "please contact admin: " + str(to_g) + error = ( + 'If the following error message does not address the issue and the problem persists ' + f'please contact admin: {to_g}' + ) variant.warnings.append(error) logger.info(error) return True else: - error = "If the following error message does not address the issue and the problem persists " \ - "please contact admin: " + str(to_g) + error = ( + 'If the following error message does not address the issue and the problem persists ' + f'please contact admin: {to_g}' + ) variant.warnings.append(error) logger.info(error) return True @@ -454,7 +493,7 @@ def transcripts_to_gene(variant, validator, select_transcripts_dict_plus_version except vvhgvs.exceptions.HGVSUnsupportedOperationError as error: if 'Unsupported normalization of variants spanning the exon-intron boundary' in str(error): caution = 'This coding sequence variant description spans at least one intron' - variant.warnings.extend([caution]) + variant.warnings.append(caution) logger.info(caution) except vvhgvs.exceptions.HGVSDataNotAvailableError as e: logger.info(str(e)) @@ -467,8 +506,8 @@ def transcripts_to_gene(variant, validator, select_transcripts_dict_plus_version elif 'datums is ill-defined' in str(error): valid = True else: - variant.warnings.append(str(error)) - logger.info(str(error)) + variant.warnings.append(error) + logger.info(error) return True # Tackle intronic offsets @@ -488,7 +527,7 @@ def transcripts_to_gene(variant, validator, select_transcripts_dict_plus_version coding = out_hgvs_obj elif quibble_input_hgvs_obj.type == 'c': coding = validator.coding(out_hgvs_obj) - else:# not actually coding + else: # not actually coding coding = out_hgvs_obj trans_acc = coding.ac @@ -496,7 +535,7 @@ def transcripts_to_gene(variant, validator, select_transcripts_dict_plus_version pre_var = out_hgvs_obj try: pre_var = validator.myevm_t_to_g(pre_var, variant.no_norm_evm, variant.primary_assembly, - variant.hn,variant) + variant.hn, variant) except Exception as e: error = str(e) if error == 'expected from_start_i <= from_end_i': @@ -523,8 +562,8 @@ def transcripts_to_gene(variant, validator, select_transcripts_dict_plus_version post_var = validator.vm.g_to_t(output, tx_ac) variant.hgvs_genomic = output else: - variant.warnings.append(str(error)) - logger.info(str(error)) + variant.warnings.append(error) + logger.info(error) return True test = quibble_input_hgvs_obj @@ -559,39 +598,35 @@ def transcripts_to_gene(variant, validator, select_transcripts_dict_plus_version can_we_autocorrect = True if post_var.posedit.pos.start.base != test.posedit.pos.start.base: - caution = "ExonBoundaryError: Position c.%s has been updated to position to %s ensuring " \ - "correct HGVS numbering for transcript %s" % ( - str(test.posedit.pos.start), - str(post_var.posedit.pos.start), - test.ac - ) - variant.warnings.extend([caution]) + caution = ( + f"ExonBoundaryError: Position c.{test.posedit.pos.start} " + f"has been updated to position to {post_var.posedit.pos.start} " + f"ensuring correct HGVS numbering for transcript {test.ac}" + ) + variant.warnings.append(caution) if post_var.posedit.pos.end.base != test.posedit.pos.end.base: - caution = "ExonBoundaryError: Position c.%s has been updated to position to %s ensuring " \ - "correct HGVS numbering for transcript %s" % ( - str(test.posedit.pos.end), - str(post_var.posedit.pos.end), - test.ac - ) - variant.warnings.extend([caution]) + caution = ( + f"ExonBoundaryError: Position c.{test.posedit.pos.end} " + f"has been updated to position to {post_var.posedit.pos.end} " + f"ensuring correct HGVS numbering for transcript {test.ac}" + ) + variant.warnings.append(caution) # Pass and raise - if can_we_autocorrect is False: + if not can_we_autocorrect: if post_var.posedit.pos.start != test.posedit.pos.start: - caution = "ExonBoundaryError: Position c.%s does not correspond with an exon boundary for " \ - "transcript %s" % ( - test.posedit.pos.start, - test.ac - ) + caution = ( + f"ExonBoundaryError: Position c.{test.posedit.pos.start} " + f"does not correspond with an exon boundary for transcript {test.ac}" + ) elif post_var.posedit.pos.end != test.posedit.pos.end: - caution = "ExonBoundaryError: Position c.%s does not correspond with an exon boundary for " \ - "transcript %s" % ( - test.posedit.pos.end, - test.ac - ) + caution = ( + f"ExonBoundaryError: Position c.{test.posedit.pos.end} " + f"does not correspond with an exon boundary for transcript {test.ac}" + ) - variant.warnings.extend([caution]) + variant.warnings.append(caution) raise MappersError(caution) else: # del not in formatted_variant @@ -599,7 +634,7 @@ def transcripts_to_gene(variant, validator, select_transcripts_dict_plus_version coding = out_hgvs_obj elif quibble_input_hgvs_obj.type == 'c': coding = validator.coding(out_hgvs_obj) - else:# not actually coding + else: # not actually coding coding = out_hgvs_obj trans_acc = coding.ac @@ -612,7 +647,7 @@ def transcripts_to_gene(variant, validator, select_transcripts_dict_plus_version try: post_var = validator.myevm_g_to_t(variant.evm, pre_var, trans_acc) except vvhgvs.exceptions.HGVSError as e: - logger.info(f"Error: {str(e)}. Variant: {pre_var}") + logger.info(f"Error: {e}. Variant: {pre_var}") if "Alignment is incomplete" in str(e): pre_var = hgvs_utils.incomplete_alignment_mapping_t_to_g(validator, variant) if to_g is None: @@ -659,39 +694,35 @@ def transcripts_to_gene(variant, validator, select_transcripts_dict_plus_version can_we_autocorrect = True if post_var.posedit.pos.start.base != test.posedit.pos.start.base: - caution = "ExonBoundaryError: Position c.%s has been updated to position to %s ensuring " \ - "correct HGVS numbering for transcript %s" % ( - str(test.posedit.pos.start), - str(post_var.posedit.pos.start), - test.ac - ) - variant.warnings.extend([caution]) + caution = ( + f"ExonBoundaryError: Position c.{test.posedit.pos.start} " + f"has been updated to position to {post_var.posedit.pos.start} " + f"ensuring correct HGVS numbering for transcript {test.ac}" + ) + variant.warnings.append(caution) if post_var.posedit.pos.end.base != test.posedit.pos.end.base: - caution = "ExonBoundaryError: Position c.%s has been updated to position to %s ensuring " \ - "correct HGVS numbering for transcript %s" % ( - str(test.posedit.pos.end), - str(post_var.posedit.pos.end), - test.ac - ) - variant.warnings.extend([caution]) + caution = ( + f"ExonBoundaryError: Position c.{test.posedit.pos.end} " + f"has been updated to position to {post_var.posedit.pos.end} " + f"ensuring correct HGVS numbering for transcript {test.ac}" + ) + variant.warnings.append(caution) # Pass and raise - if can_we_autocorrect is False: + if not can_we_autocorrect: if post_var.posedit.pos.start != test.posedit.pos.start: - caution = "ExonBoundaryError: Position c.%s does not correspond with an exon boundary for " \ - "transcript %s" % ( - test.posedit.pos.start, - test.ac - ) + caution = ( + f"ExonBoundaryError: Position c.{test.posedit.pos.start} " + f"does not correspond with an exon boundary for transcript {test.ac}" + ) elif post_var.posedit.pos.end != test.posedit.pos.end: - caution = "ExonBoundaryError: Position c.%s does not correspond with an exon boundary for " \ - "transcript %s" % ( - test.posedit.pos.end, - test.ac - ) + caution = ( + f"ExonBoundaryError: Position c.{test.posedit.pos.end} " + f"does not correspond with an exon boundary for transcript {test.ac}" + ) - variant.warnings.extend([caution]) + variant.warnings.append(caution) raise MappersError(caution) elif quibble_input_hgvs_obj.type != 'g': @@ -699,7 +730,7 @@ def transcripts_to_gene(variant, validator, select_transcripts_dict_plus_version test = quibble_input_hgvs_obj if str(query.posedit.pos) != str(test.posedit.pos): - automap = str(test) + ' automapped to ' + str(query) + automap = f'{test} automapped to {query}' variant.warnings.extend([automap]) variant.quibble=out_hgvs_obj @@ -714,7 +745,7 @@ def transcripts_to_gene(variant, validator, select_transcripts_dict_plus_version if fn.valstr(pre_valid) != fn.valstr(post_valid): if variant.reftype != ':g.': if caution == '': - caution = fn.valstr(pre_valid) + ' automapped to ' + fn.valstr(post_valid) + caution = f'{fn.valstr(pre_valid)} automapped to {fn.valstr(post_valid)}' variant.warnings.append(caution) logger.info(caution) @@ -729,7 +760,7 @@ def transcripts_to_gene(variant, validator, select_transcripts_dict_plus_version if fn.valstr(pre_valid) != fn.valstr(post_valid): if variant.reftype == ':g.': if caution == '': - caution = fn.valstr(pre_valid) + ' automapped to ' + fn.valstr(post_valid) + caution = f'{fn.valstr(pre_valid)} automapped to {fn.valstr(post_valid)}' variant.warnings.append(caution) # COLLECT VARIANT DESCRIPTIONS @@ -746,7 +777,7 @@ def transcripts_to_gene(variant, validator, select_transcripts_dict_plus_version gap_compensation = True # If the gene symbol is not in the list, the value False will be returned - gap_compensation = variant.map_dat.is_gapped_map(hgvs_coding.ac,genomic_ac,hdp=validator.hdp) + gap_compensation = variant.map_dat.is_gapped_map(hgvs_coding.ac, genomic_ac,hdp=validator.hdp) # Intron spanning variants if 'boundary' in str(error) or 'spanning' in str(error): @@ -754,19 +785,19 @@ def transcripts_to_gene(variant, validator, select_transcripts_dict_plus_version hgvs_coding = variant.evm._maybe_normalize(hgvs_coding) gap_compensation = False except vvhgvs.exceptions.HGVSError as error: - variant.warnings.append(str(error)) - logger.info(str(error)) + variant.warnings.append(error) + logger.info(error) return True # Warn status - logger.debug("gap_compensation_1 = " + str(gap_compensation)) + logger.debug('gap_compensation_1 = %s', gap_compensation) # Genomic sequence if variant.hgvs_genomic is not None: hgvs_genomic = variant.hgvs_genomic else: hgvs_genomic = validator.myevm_t_to_g(hgvs_coding, variant.no_norm_evm, variant.primary_assembly, - variant.hn,variant) + variant.hn, variant) @@ -775,7 +806,7 @@ def transcripts_to_gene(variant, validator, select_transcripts_dict_plus_version # --- GAP MAPPING 1 --- # Loop out gap finding code under these circumstances! - if gap_compensation is True: + if gap_compensation: # Get orientation of the gene wrt genome and a list of exons mapped to the genome ori = variant.map_dat.tx_exons( tx_ac, genomic_ac, @@ -799,15 +830,15 @@ def transcripts_to_gene(variant, validator, select_transcripts_dict_plus_version # --- GAP MAPPING 2 --- # Loop out gap finding code under these circumstances! - logger.debug("gap_compensation_2 = " + str(gap_compensation)) - if gap_compensation is True: + logger.debug('gap_compensation_2 = %s', gap_compensation) + if gap_compensation: # Get orientation of the gene wrt genome and a list of exons mapped to the genome ori = variant.map_dat.tx_exons( hgvs_coding.ac, reverse_normalized_hgvs_genomic.ac, validator.alt_aln_method, hdp=validator.hdp) - if not hgvs_genomic.posedit.edit.type == 'ins': + if hgvs_genomic.posedit.edit.type != 'ins': hgvs_coding = gap_mapper.g_to_t_gapped_mapping_stage2(ori, hgvs_coding, hgvs_genomic) else: new_hgvs_coding, new_hgvs_genomic = immediate_round_trip_gap_ins_handling( @@ -824,16 +855,15 @@ def transcripts_to_gene(variant, validator, select_transcripts_dict_plus_version for sequence in sequences_for_tx: if sequence[1].startswith('NG_'): recovered_rsg.append(sequence[1]) - recovered_rsg.sort() - recovered_rsg.reverse() + recovered_rsg.sort(reverse=True) - if len(recovered_rsg) > 0 and 'NG_' in recovered_rsg[0]: + if recovered_rsg and 'NG_' in recovered_rsg[0]: refseqgene_ac = recovered_rsg[0] else: refseqgene_ac = '' # Given the difficulties with mapping to and from RefSeqGenes, we now solely rely on UTA - if refseqgene_ac != '': + if refseqgene_ac: try: hgvs_refseq = validator.vm.t_to_g(hgvs_coding, refseqgene_ac) except vvhgvs.exceptions.HGVSError as e: @@ -855,40 +885,40 @@ def transcripts_to_gene(variant, validator, select_transcripts_dict_plus_version except NotImplementedError as e: # import traceback # traceback.print_exc() - logger.info(f"Protein dict creation failed with exception: {str(e)}") + logger.info(f"Protein dict creation failed with exception: {e}") protein_dict = {'hgvs_protein': None, 'error': str(e)} variant.warnings.append(str(e)) except vvhgvs.exceptions.HGVSDataNotAvailableError as e: # import traceback # traceback.print_exc() - logger.info(f"Protein dict creation failed with exception: {str(e)}") + logger.info(f"Protein dict creation failed with exception: {e}") protein_dict = {'hgvs_protein': None, 'error': str(e)} variant.warnings.append(str(e)) else: logger.info(f"Protein dict creation successful: {protein_dict}") - if protein_dict['error'] == '' or protein_dict['error'].startswith('ProteinTranslationInfo:'): + if not protein_dict['error'] or protein_dict['error'].startswith('ProteinTranslationInfo:'): hgvs_protein = protein_dict['hgvs_protein'] if protein_dict['error']: variant.warnings.append(protein_dict['error']) else: error = protein_dict['error'] if not error.startswith('ProteinTranslationError:' ): - variant.warnings.append(str(error)) + variant.warnings.append(error) logger.info(error) return True elif 'Termination' in error and 'reference' in error: error = "TranscriptTypeError: Cannot identify an in-frame Termination codon in the " +\ f"reference mRNA sequence. {hgvs_coding.ac} may not be a valid coding sequence" - variant.warnings.append(str(error)) + variant.warnings.append(error) logger.info(error) return True elif 'reference' in error: - variant.warnings.append(str(error)) + variant.warnings.append(error) logger.info(error) return True else: # for now any non-reference error should not halt variant validation - variant.warnings.append(str(error)) + variant.warnings.append(error) hgvs_protein = protein_dict['hgvs_protein'] # Gene orientation wrt genome @@ -920,7 +950,7 @@ def transcripts_to_gene(variant, validator, select_transcripts_dict_plus_version hgvs_seek_var.posedit.pos.end.base + hgvs_seek_var.posedit.pos.end.offset) > ( hgvs_coding.posedit.pos.end.base + hgvs_coding.posedit.pos.end.offset) and rec_var != 'false': try: - automap = fn.valstr(hgvs_coding) + ' normalized to ' + fn.valstr(hgvs_seek_var) + automap = f'{fn.valstr(hgvs_coding)} normalized to {fn.valstr(hgvs_seek_var)}' hgvs_coding = hgvs_seek_var variant.warnings.append(automap) except NotImplementedError as e: @@ -931,7 +961,7 @@ def transcripts_to_gene(variant, validator, select_transcripts_dict_plus_version try: # Predicted effect on protein protein_dict = validator.myc_to_p(c_for_p, variant.evm, re_to_p=False, hn=variant.hn) - if protein_dict['error'] == '' or protein_dict['error'].startswith('ProteinTranslationInfo:'): + if not protein_dict['error'] or protein_dict['error'].startswith('ProteinTranslationInfo:'): hgvs_protein = protein_dict['hgvs_protein'] if protein_dict['error']: variant.warnings.append(protein_dict['error']) @@ -958,7 +988,7 @@ def transcripts_to_gene(variant, validator, select_transcripts_dict_plus_version re_to_p=False, hn=variant.hn ) - if protein_dict['error'] == '' or protein_dict['error'].startswith('ProteinTranslationInfo:'): + if not protein_dict['error'] or protein_dict['error'].startswith('ProteinTranslationInfo:'): hgvs_protein = protein_dict['hgvs_protein'] if protein_dict['error']: variant.warnings.append(protein_dict['error']) @@ -991,7 +1021,7 @@ def transcripts_to_gene(variant, validator, select_transcripts_dict_plus_version except ValueError as e: logger.debug("Except passed, %s", e) - if update != '': + if update: hgvs_updated = copy.deepcopy(hgvs_coding) hgvs_updated.ac = update try: @@ -1025,21 +1055,23 @@ def transcripts_to_gene(variant, validator, select_transcripts_dict_plus_version # set ref to empty (without re-parsing from text) updated_transcript_variant = unset_hgvs_obj_ref(hgvs_updated) - if validator.alt_aln_method == "genebuild": - variant.warnings.append('TranscriptVersionWarning: A more recent version of the selected reference sequence ' + hgvs_coding.ac + - ' is available for genome build ' + variant.primary_assembly + - ' (' + updated_transcript_variant.ac + ')' + ': ' + - str(updated_transcript_variant) + ' MUST be fully validated prior to ' - 'use in reports: ' - 'select_variants=' + fn.valstr(updated_transcript_variant) + - ', genome_build=' + variant.primary_assembly) - else: - variant.warnings.append('TranscriptVersionWarning: A more recent version of the selected reference sequence ' + hgvs_coding.ac + - ' is available for genome build ' + variant.primary_assembly + - ' (' + updated_transcript_variant.ac + ')' + ': ' + - str(updated_transcript_variant) + ' MUST be fully validated prior to ' - 'use in reports: ' - 'select_variants=' + fn.valstr(updated_transcript_variant)) + if validator.alt_aln_method == 'genebuild': + variant.warnings.append( + 'TranscriptVersionWarning: A more recent version of the selected reference ' + f'sequence {hgvs_coding.ac} is available for genome build ' + f'{variant.primary_assembly} ({updated_transcript_variant.ac}): ' + f'{updated_transcript_variant} MUST be fully validated prior to use in reports: ' + f'select_variants={fn.valstr(updated_transcript_variant)}, ' + f'genome_build={variant.primary_assembly}' + ) + else: # else + variant.warnings.append( + 'TranscriptVersionWarning: A more recent version of the selected reference ' + f'sequence {hgvs_coding.ac} is available for genome build ' + f'{variant.primary_assembly} ({updated_transcript_variant.ac}): ' + f'{updated_transcript_variant} MUST be fully validated prior to use in reports: ' + f'select_variants={fn.valstr(updated_transcript_variant)}' + ) variant.coding = hgvs_coding variant.genomic_r = hgvs_refseq variant.genomic_g = unset_hgvs_obj_ref(hgvs_genomic) @@ -1189,16 +1221,19 @@ def final_tx_to_multiple_genomic(variant, validator, tx_variant, liftover_level= # In this instance, the gap code has generally found an incomplete-alignment rather than a # truly gapped alignment. except KeyError: - warnings = warnings + ': Suspected incomplete alignment between transcript %s and ' \ - 'genomic reference sequence %s' % (variant.hgvs_coding.ac, alt_chr) + warnings += ( + f': Suspected incomplete alignment between transcript ' + f'{variant.hgvs_coding.ac} and genomic reference sequence {alt_chr}' + ) except vvhgvs.exceptions.HGVSError as e: logger.info(str(e)) return multi_g + # Copyright (C) 2016-2026 VariantValidator Contributors # This file is part of VariantValidator and is distributed under the # GNU Affero General Public License, version 3 or (at your option) any # later version. See the LICENSE file in the project root for the full # licence terms. -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: AGPL-3.0-or-later \ No newline at end of file From 2950038a8e6281edfea58bffac9a4849249ce476 Mon Sep 17 00:00:00 2001 From: Peter-J-Freeman Date: Tue, 11 Aug 2026 19:00:10 +0100 Subject: [PATCH 5/5] Final clean of gitignore and utils.py Some small structural changed to utils.py that improve performance very slightly --- .gitignore | 15 +- VariantValidator/modules/utils.py | 591 +++++++++--------- tests/variantvalidator/test_exon_numbering.py | 36 +- .../variantvalidator/test_expanded_repeats.py | 134 ++-- 4 files changed, 378 insertions(+), 398 deletions(-) diff --git a/.gitignore b/.gitignore index ea27c8fa..a4a6575f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,5 @@ # VariantValidator .gitignore -# Development scripts -VariantValidator/vvTest.py - # Python bytecode *.pyc __pycache__/ @@ -21,7 +18,6 @@ dist/ htmlcov/ .pytest_cache/ .mypy_cache/ -VariantValidator/testing/outputs* # MkDocs site/ @@ -31,16 +27,13 @@ site/ # Temporary files *.bak -temp.py +*.tmp +*.swp -# Local databases +# Local databases and data seqrepo/ Users/ *.sql -validator_2021-07-21.sql -VVTA_2021_2_noseq.psql.gz # LOVD HGVS Syntax Checker runtime files -VariantValidator/php/ -# LOVD HGVS Syntax Checker runtime files -VariantValidator/php/ +VariantValidator/php/ \ No newline at end of file diff --git a/VariantValidator/modules/utils.py b/VariantValidator/modules/utils.py index 58ad38a8..1883da44 100644 --- a/VariantValidator/modules/utils.py +++ b/VariantValidator/modules/utils.py @@ -1,10 +1,10 @@ +import re import requests -import functools import logging -import re -import copy from VariantValidator.modules import seq_data +import functools import time +import copy logger = logging.getLogger(__name__) @@ -39,6 +39,7 @@ DNA_TRANS_TBL = str.maketrans("ACTG", "TGAC") + def simple_dna_revcomp(dna): """ Simplest possible reverse compliment, for use on validated input and @@ -51,30 +52,32 @@ def simple_dna_revcomp(dna): """ return dna.upper().translate(DNA_TRANS_TBL)[::-1] -def handleCursor(func): + +def handleCursor( + func): """ - Decorator function for handling opening and closing cursors. + Decorator function for handling opening and closing cursors """ - @functools.wraps(func) - def wrapper(self, *args, **kwargs): - out = func(self, *args, **kwargs) - return out - return wrapper - - -def hgnc_rest(path): + @functools.wraps(func) # Wrapped function + def wrapper(self, + *args, + **kwargs): + out = func(self, + *args, + **kwargs) + return out # return inner + return wrapper # return outer + + +def hgnc_rest( + path): """ Fires requests to the HGNC REST API. """ - data = { - 'record': '', - 'error': 'false' - } + data = {'record': '', 'error': 'false'} - headers = { - 'Accept': 'application/json', - } + headers = {'Accept': 'application/json'} domain = 'http://rest.genenames.org' url = domain + path @@ -228,7 +231,7 @@ def ensembl_rest(id, endpoint, genome, options=False): ) ) logger.warning(data['error']) - return data + return data # return def ensembl_tark(id, endpoint, options=False): @@ -317,10 +320,11 @@ def ensembl_tark(id, endpoint, options=False): return data -def valstr(hgvs_variant): - """ +def valstr( + hgvs_variant): + ''' format nucleotide descriptions to not display reference base and return a string - """ + ''' try: hgvs_variant.ac except AttributeError: @@ -328,20 +332,26 @@ def valstr(hgvs_variant): return str(remove_reference(hgvs_variant)) -def single_letter_protein(hgvs_protein): - """ - format protein description into single letter aa code - """ +def single_letter_protein( + hgvs_protein): + ''' + format protein description into single letter aa code. + ''' - return hgvs_protein.format({'p_3_letter': False}) + return hgvs_protein.format( + {'p_3_letter': False} + ) -def remove_reference(hgvs_nucleotide): - """ +def remove_reference( + hgvs_nucleotide): + ''' format nucleotide descriptions to not display reference base, and return a string - """ - hgvs_nucleotide_refless = hgvs_nucleotide.format({'max_ref_length': 0}) - return hgvs_nucleotide_refless + ''' + hgvs_nucleotide_refless = hgvs_nucleotide.format( + {'max_ref_length': 0} + ) + return hgvs_nucleotide_refless # return def remove_reference_string(variant_string): @@ -367,12 +377,12 @@ def remove_reference_string(variant_string): def user_input(query): - """ + ''' Collect the input from the form and convert to an HGVS-readable string. Removes brackets and contained information where applicable, identifies the variant type, and returns the formatted variant and type. - """ + ''' raw_variant = query.strip() # Identify HGVS variant type @@ -383,7 +393,7 @@ def user_input(query): break if variant_type is not None: - variant = raw_variant + variant = raw_variant # set # Remove redundant gene symbol from nucleotide descriptions if variant_type in (':g.', ':r.', ':n.', ':c.') and '(' in raw_variant: @@ -398,277 +408,255 @@ def user_input(query): return 'invalid' -def pro_inv_info(prot_ref_seq, prot_var_seq): - """ - Function which predicts the protein effect of c. inversions - """ +def pro_inv_info(prot_ref_seq, + prot_var_seq): + ''' + Function which predicts the protein effect of c. inversions. + ''' logger.info("pro_inv_info function called") - info = { - 'variant': 'true', - 'prot_del_seq': '', - 'prot_ins_seq': '', - 'edit_start': 0, - 'edit_end': 0, - 'terminate': 'false', - 'ter_pos': 0, - 'error': 'false' - } - - # Is there actually any variation? - if prot_ref_seq == prot_var_seq: + info = { # Set info + "variant": "true", + "prot_del_seq": "", + "prot_ins_seq": "", + "edit_start": 0, + "edit_end": 0, + "terminate": "false", + "ter_pos": 0, + "error": "false"} + + if prot_ref_seq == prot_var_seq: # Is there any variation? info['variant'] = 'identity' return info - else: - # Deal with terminations - if '*' in prot_var_seq: - # Set the termination reporter to true - info['terminate'] = 'true' - # The termination position will be equal to the length of the variant sequence because it's a TERMINATOR!!! - info['ter_pos'] = len(prot_var_seq) - # cut the ref sequence to == size - prot_ref_seq = prot_ref_seq[0:info['ter_pos']] - prot_var_seq = prot_var_seq[0:info['ter_pos']] - - # Whether terminated or not, the sequences should now be the same length - # Unless the termination codon has been disrupted - if len(prot_var_seq) < len(prot_ref_seq): - info['error'] = 'true' - return info - else: - # Set the counter - aa_counter = 0 - # Make list copies of the sequences to gather the required info - ref = list(prot_ref_seq) - var = list(prot_var_seq) + # Deal with terminations. + if '*' in prot_var_seq: + info["terminate"] = 'true' + info['ter_pos'] = ( + len(prot_var_seq)) - # Loop through ref list to find the first missmatch position - for aa in ref: - if ref[aa_counter] == var[aa_counter]: - aa_counter = aa_counter + 1 - else: - break - - # Enter the start position - info['edit_start'] = aa_counter + 1 - # Remove those elements form the list - del ref[0:aa_counter] - del var[0:aa_counter] - - # the sequences should now be the same length - # Except if the termination codon was removed - if len(ref) > len(var): - info['error'] = 'true' - return info - else: - # Reset the aa_counter but to go backwards - aa_counter = 0 - # reverse the lists - ref = ref[::-1] - var = var[::-1] - - # Reverse loop through ref list to find the first missmatch position - for aa in ref: - if var[aa_counter] == r'\*': - break - if aa == var[aa_counter]: - aa_counter = aa_counter + 1 - else: - break - - # Remove those elements form the list - del ref[0:aa_counter] - del var[0:aa_counter] - # re-reverse the lists - ref = ref[::-1] - var = var[::-1] - - # If the var is > ref, the ter has been removed, need to re-add ter to each - if len(ref) < len(var): - ref.append('*') - if prot_var_seq[-1] == '*': - var.append('*') - # the sequences should now be the same length - # Except if the ter was removed - if len(ref) > len(var): - info['error'] = 'true' - return info - else: - # Enter the sequences - info['prot_del_seq'] = ''.join(ref) - info['prot_ins_seq'] = ''.join(var) - info['edit_end'] = info['edit_start'] + len(ref) - 1 - return info + # Cut the reference and variant sequences to the termination position. + prot_ref_seq = prot_ref_seq[:info['ter_pos']] + prot_var_seq = prot_var_seq[:info['ter_pos']] + + # The sequences should now be the same length unless the + # termination codon has been disrupted. + if (len(prot_var_seq) + < len(prot_ref_seq)): + info['error'] = \ + 'true' + return info # return + + aa_counter = 0 # Find the first mismatch from the start. + + while ( + aa_counter < len(prot_ref_seq) + and prot_ref_seq[aa_counter] == prot_var_seq[aa_counter] + ): + aa_counter += 1 + + info['edit_start'] \ + = aa_counter + 1 + + ref = prot_ref_seq[aa_counter:] + var = prot_var_seq[aa_counter:] + + aa_counter = 0 # Find the first mismatch from the end. + + while aa_counter < len(ref) and aa_counter < len(var): + if var[-(aa_counter + 1)] == r'\*': + break # break + + if ref[-(aa_counter + 1)] == var[-(aa_counter + 1)]: + aa_counter += 1 + else: # else break + break # break + + if aa_counter: + ref = ref[:-aa_counter] + var = var[:-aa_counter] + + # If the variant is longer, the termination has been removed. + if (len(ref) + < len(var)): + ref += '*' + + if (prot_var_seq[-1] + == '*'): + var += '*' + + # The sequences should now be the same length unless the + # termination has been removed. + if (len(ref) > + len(var)): + info['error'] = \ + 'true' + return info # return + + info['prot_del_seq'] = ref + info['prot_ins_seq'] = var + info['edit_end'] = ( + info['edit_start'] + + len(ref) - 1) + + return info # return def pro_delins_info(prot_ref_seq, prot_var_seq, in_frame=False): - logger.info(f"pro_delins_info function called") - info = { - 'variant': 'true', - 'prot_del_seq': '', - 'prot_ins_seq': '', - 'edit_start': 0, - 'edit_end': 0, - 'terminate': 'false', - 'ter_pos': 0, - 'error': 'false' - } - - # Is there actually any variation? - if prot_ref_seq == prot_var_seq: + logger.info('pro_delins_info function called') + + info = { # set info + "variant": "true", + "prot_del_seq": "", + "prot_ins_seq": "", + "edit_start": 0, + "edit_end": 0, + "terminate": "false", + "ter_pos": 0, + "error": "false"} + + if prot_ref_seq == prot_var_seq: # Is there actually any variation? info['variant'] = 'identity' return info - else: - # Deal with terminations (Cannot be used as a marker for the delins pathway because in frame deletions have Ter - if '*' in prot_var_seq: - # Set the termination reporter to true - info['terminate'] = 'true' - # Set the terminal pos dependant on the shortest sequence - # This is where we look for in-frame deletions / delins that can be shortened to a simple del/delins - if len(prot_var_seq) <= len(prot_ref_seq): + # Deal with terminations. + if '*' in prot_var_seq: + info["terminate"] = 'true' + + # Set the terminal position according to the shortest sequence. + if len(prot_var_seq) <= len(prot_ref_seq): + if ( + in_frame is not False + and in_frame == len(prot_var_seq) - len(prot_ref_seq) + ): + info['ter_pos'] = len(prot_ref_seq) + elif prot_var_seq[-1] == '*': + info['ter_pos'] = ( + len(prot_var_seq)) + else: + info['ter_pos'] = len(prot_ref_seq) + else: + info['ter_pos'] = ( + len(prot_var_seq)) - # Look for early termination rather than just deletions. These params may need to be altered. - if in_frame is not False and in_frame == (len(prot_var_seq) - len(prot_ref_seq)): - info['ter_pos'] = len(prot_ref_seq) + prot_ref_seq = prot_ref_seq[:info['ter_pos']] + prot_var_seq = prot_var_seq[:info['ter_pos']] - else: - # This code deals with the early termination out of frame variants - if prot_var_seq[-1] == "*": - info['ter_pos'] = len(prot_var_seq) - # Otherwise, if no termination, we carry on as normal - else: - info['ter_pos'] = len(prot_ref_seq) - else: - info['ter_pos'] = len(prot_var_seq) - - # cut the ref sequence to == size - prot_ref_seq = prot_ref_seq[0:info['ter_pos']] - prot_var_seq = prot_var_seq[0:info['ter_pos']] - - # Set the counter - aa_counter = 0 - # Make list copies of the sequences to gather the required info - ref = list(prot_ref_seq) - var = list(prot_var_seq) - # Loop through ref list to find the first missmatch position - for aa in ref: - if ref[aa_counter] == var[aa_counter]: - aa_counter = aa_counter + 1 - else: - break + aa_counter = 0 # Find the first mismatch from the start. - # Enter the start position - info['edit_start'] = aa_counter + 1 - - # Remove those elements form the list - del ref[0:aa_counter] - del var[0:aa_counter] - - # Reset the aa_counter but to go backwards - aa_counter = 0 - # reverse the lists - ref = ref[::-1] - var = var[::-1] - # Reverse loop through ref list to find the first missmatch position - for aa in ref: - try: - if var[aa_counter] == r'\*': - break - except IndexError: - break - if aa == var[aa_counter]: - aa_counter = aa_counter + 1 - else: - break - # Remove those elements form the list - del ref[0:aa_counter] - del var[0:aa_counter] - # re-reverse the lists - ref = ref[::-1] - var = var[::-1] + while ( + aa_counter < len(prot_ref_seq) + and prot_ref_seq[aa_counter] == prot_var_seq[aa_counter] + ): + aa_counter += 1 - # Enter the sequences - info['prot_del_seq'] = ''.join(ref) - info['prot_ins_seq'] = ''.join(var) - info['edit_end'] = info['edit_start'] + len(ref) - 1 - return info + info['edit_start'] = aa_counter + 1 # increase count + ref = prot_ref_seq[aa_counter:] + var = prot_var_seq[aa_counter:] -def translate(ed_seq, cds_start, modified_aa=None, tolerate_no_stop_cds=False): - """ - Translate c. reference sequences, including those that have been modified - must have the CDS in the specified position - """ - ed_seq = ed_seq.strip() - # Ensure the starting codon is in the correct position - met = ed_seq[cds_start:cds_start + 3] - met = met.upper() #this should be redundant with all inputs upper case + aa_counter = 0 # Find the first mismatch from the end. - """ - >>> mito_table.start_codons - ['ATT', 'ATC', 'ATA', 'ATG', 'GTG'] - """ - if met not in ['ATG', 'TTG', 'CTG', 'GTG', 'ATT', 'ATC', 'ATA', 'ACG']: - translation = 'error' - return translation + while aa_counter < len(ref) and aa_counter < len(var): + if var[-(aa_counter + 1)] == r'\*': + break # break + + if ref[-(aa_counter + 1)] == var[-(aa_counter + 1)]: + aa_counter += 1 + else: # else + break # break + + if aa_counter: + ref = ref[:-aa_counter] + var = var[:-aa_counter] + + info['prot_del_seq'] = ref + info['prot_ins_seq'] = var + info['edit_end'] = ( + info['edit_start'] + len(ref) - 1) + + return info # return + + +_TRANSLATION_START_CODONS = { + 'ATG', + 'TTG', + 'CTG', + 'GTG', + 'ATT', + 'ATC', + 'ATA', + 'ACG', +} + +_TRANSLATION_STOPS = {'TAA', 'TAG', 'TGA'} +_TRANSLATION_STOPS_SEC = {'TAA', 'TAG'} + + +def translate( + ed_seq, + cds_start, + modified_aa=None, + tolerate_no_stop_cds=False, +): + ''' + Translate a c. reference sequence, including modified sequences. + + The CDS must start at the specified position. + ''' + ed_seq = ed_seq.strip() # remove trailing whitespace + met = ed_seq[cds_start:cds_start + + 3] + + if met not in _TRANSLATION_START_CODONS: + return 'error' - # Remove the 5 prime UTR coding_sequence = ed_seq[cds_start:].upper() - if modified_aa == "Sec": + + if modified_aa == 'Sec': use_dict = PROT_TRANSLATION_DICT_SEL - stops = ['TAA', 'TAG'] + stops = _TRANSLATION_STOPS_SEC else: use_dict = PROT_TRANSLATION_DICT - stops = ['TAA', 'TAG', 'TGA'] + stops = _TRANSLATION_STOPS - # Translate - if len(coding_sequence) % 3: - last_codon_end = int(len(coding_sequence)/3) * 3 - else: - last_codon_end = len(coding_sequence) - codon_list = [coding_sequence[i:i+3] for i in range(0, last_codon_end, 3)] + coding_length = len(coding_sequence) - len(coding_sequence) % 3 translation = [] - for codon in codon_list: + + for i in range(0, coding_length, 3): + codon = coding_sequence[i:i + 3] translation.append(use_dict[codon]) + if codon in stops: - break + break # break + if translation[-1] != '*': if not tolerate_no_stop_cds: - # Add Polyadenylation stop codon completing bases to relevant - # transcripts spare_end = len(coding_sequence) % 3 - if spare_end and coding_sequence[-spare_end:] in ['T','TA']: + + if spare_end and coding_sequence[-spare_end:] in ('T', 'TA'): translation.append('*') else: raise IndexError('No stop CDS') + translation.append('X') - return "".join(translation) + return ''.join(translation) _aacode_1_to_3 = { - 'A': 'Ala', 'C': 'Cys', 'D': 'Asp', 'E': 'Glu', - 'F': 'Phe', 'G': 'Gly', 'H': 'His', 'I': 'Ile', - 'K': 'Lys', 'L': 'Leu', 'M': 'Met', 'N': 'Asn', - 'P': 'Pro', 'Q': 'Gln', 'R': 'Arg', 'S': 'Ser', - 'T': 'Thr', 'V': 'Val', 'W': 'Trp', 'Y': 'Tyr', - '*': 'Ter', 'U': 'Sec' + "A": "Ala", "C": "Cys", "D": "Asp", "E": "Glu", + "F": "Phe", "G": "Gly", "H": "His", "I": "Ile", + "K": "Lys", "L": "Leu", "M": "Met", "N": "Asn", + "P": "Pro", "Q": "Gln", "R": "Arg", "S": "Ser", + "T": "Thr", "V": "Val", "W": "Trp", "Y": "Tyr", + "*": "Ter", "U": "Sec" } def one_to_three(seq): """ - Convert single letter amino acid code to 3 letter code + Convert single-letter amino acid codes to three-letter codes. """ - - oned = list(seq) - out = [] - for aa in oned: - get_value = _aacode_1_to_3.get(aa) - out.append(get_value) - - threed_up = ''.join(out) - return threed_up + return ''.join(_aacode_1_to_3.get(aa) for aa in seq) _aacode_3_to_1 = { @@ -680,31 +668,32 @@ def one_to_three(seq): 'Ter': '*', 'Sec': 'U' } def three_to_one(seq): - - threed = [seq[i:i + 3] for i in range(0, len(seq), 3)] - out = [] - - for aa in threed: - get_value = _aacode_3_to_1.get(aa) - out.append(get_value) - - oned_up = ''.join(out) - return oned_up + ''' + Convert three-letter amino acid codes to single-letter codes. + ''' + return ''.join( + _aacode_3_to_1.get(seq[i:i + 3]) + for i in range(0, len(seq), 3) + ) -# n. Inversions - This comes from VariantValidator, not validation!!!! -def n_inversion(ref_seq, del_seq, inv_seq, interval_start, interval_end): - """ - Takes a reference sequence and inverts the specified position - """ - # Use string indexing to check whether the sequences are the same - test = ref_seq[interval_start - 1:interval_end] - if test == del_seq: - sequence = ref_seq[0:interval_start - 1] + inv_seq + ref_seq[interval_end:] - return sequence - else: - sequence = 'error' - return sequence +# n. Inversions - This comes from VariantValidator, not validation +def n_inversion(ref_seq, + del_seq, + inv_seq, + interval_start, + interval_end): + ''' + Take a reference sequence and invert the specified position. + ''' + if ref_seq[interval_start - 1:interval_end] != del_seq: + return 'error' + + return ( + ref_seq[:interval_start - 1] + + inv_seq + + ref_seq[interval_end:] + ) def get_exon_boundary_list(variant, validator): @@ -765,28 +754,34 @@ def get_exon_boundary_list(variant, validator): raise ExonMappingError(f"{transcript} is not a valid transcript reference sequence ID") -# Custom Exceptions -class VariantValidatorError(Exception): - pass +# Custom Exceptions. +class VariantValidatorError( + Exception): + pass # pass -class mergeHGVSerror(Exception): - pass +class mergeHGVSerror( + Exception): + pass # pass -class alleleVariantError(Exception): - pass +class alleleVariantError( + Exception): + pass # pass -class DatabaseConnectionError(Exception): +class DatabaseConnectionError( + Exception): pass -class ObsoleteSeqError(Exception): +class ObsoleteSeqError( + Exception): pass -class ExonMappingError(Exception): +class ExonMappingError( + Exception): pass WARNING_CODE_MAP = { diff --git a/tests/variantvalidator/test_exon_numbering.py b/tests/variantvalidator/test_exon_numbering.py index 063b968c..665bc26d 100644 --- a/tests/variantvalidator/test_exon_numbering.py +++ b/tests/variantvalidator/test_exon_numbering.py @@ -1,13 +1,9 @@ -""" -Exon_numbering_tests -Authors: Katie Williams (@kwi11iams) and Katherine Winfield (@kjwinfield) -This code runs tests on the module exon_numbering.py to check the outputs are as expected -""" from VariantValidator import Validator import time import unittest -class TestExonNumbering(unittest.TestCase): +class TestExonNumbering( + unittest.TestCase): @classmethod def setup_class(cls): @@ -26,11 +22,10 @@ def setup_class(cls): raise last_exc - """ - Class TextExonNumbering automates running the tests, and reports failure if - the output is not what is expected - """ - def test_1(self): + # Class TextExonNumbering automates running the tests, and reports failure if + # the output is not what is expected + def test_1( + self): results = self.vv.validate("NM_007294.3:c.1067A>G", 'GRCh38', 'all').format_as_dict(test=True) results = results['NM_007294.3:c.1067A>G']['variant_exonic_positions'] print(results) @@ -49,7 +44,8 @@ def test_1(self): }, } - def test_2(self): + def test_2( + self): results = self.vv.validate("NM_000088.3:c.642+1G>A", 'GRCh38', 'all').format_as_dict(test=True) results = results['NM_000088.3:c.642+1G>A']['variant_exonic_positions'] print(results) @@ -87,7 +83,8 @@ def test_2b(self): } } - def test_3(self): + def test_3( + self): results = self.vv.validate("NM_000094.3:c.6751-3_6751-2del", 'GRCh38', 'all').format_as_dict(test=True) results = results['NM_000094.3:c.6751-3_6751-2del']['variant_exonic_positions'] print(results) @@ -106,7 +103,8 @@ def test_3(self): } } - def test_4(self): + def test_4( + self): results = self.vv.validate("NM_000088.3:c.589G>T", 'GRCh38', 'all').format_as_dict(test=True) results = results['NM_000088.3:c.589G>T']['variant_exonic_positions'] print(results) @@ -144,7 +142,8 @@ def test_4a(self): } } - def test_5(self): + def test_5( + self): results = self.vv.validate("NM_000088.3:c.642del", 'GRCh38', 'all').format_as_dict(test=True) results = results['NM_000088.3:c.642del']['variant_exonic_positions'] print(results) @@ -163,7 +162,8 @@ def test_5(self): } } - def test_6(self): + def test_6( + self): results = self.vv.validate("NM_000088.3:c.642+5_643-25del", 'GRCh38', 'all').format_as_dict(test=True) results = results['NM_000088.3:c.642+5_643-25del']['variant_exonic_positions'] print(results) @@ -417,8 +417,8 @@ def test_11b(self): } -if __name__ == "__main__": - unittest.main() +if __name__ == "__main__": # Run + unittest.main() # Run # Copyright (C) 2016-2026 VariantValidator Contributors diff --git a/tests/variantvalidator/test_expanded_repeats.py b/tests/variantvalidator/test_expanded_repeats.py index 9b8ec654..bcf2ed4b 100644 --- a/tests/variantvalidator/test_expanded_repeats.py +++ b/tests/variantvalidator/test_expanded_repeats.py @@ -1,63 +1,58 @@ -""" -expanded_repeats_tests -Authors: Robert Wilson (@RSWilson1) and Rebecca Locke (@rklocke) -This code runs tests on the module expanded_repeats.py to check the outputs are as expected. +# expanded_repeats_tests +# This code runs tests on the module expanded_repeats.py to check the outputs are as expected. +# +# It checks known edge-case HGVS compliant variant strings. +# Additional functionality to add: +# - Check error handling +# - Check correct errors for non-HGVS compliant strings. -It checks known edge-case HGVS compliant variant strings. -Additional functionality to add: -- Check error handling -- Check correct errors for non-HGVS compliant strings. - -""" -import unittest from unittest import TestCase from VariantValidator.modules import expanded_repeats from VariantValidator.modules.expanded_repeats import RepeatSyntaxError from VariantValidator import Validator +import unittest vv = Validator() vv.alt_aln_method = "splign" -class TestExpandedRepeats(unittest.TestCase): - """Tests for the internal expanded_repeats.py module, to directly check - that the syntax checker returns the expected results for each variant case. - Including known edge-cases that weren't previously handled. +class TestExpandedRepeats( + unittest.TestCase): + # Tests for the internal expanded_repeats.py module, to directly check + # that the syntax checker returns the expected results for each variant case. + # Including known edge-cases that weren't previously handled. + # + # Attributes + # ---------- + # Variants with known strings and expected results. + # Returns + # ---------- + # Number of tests completed successfully. - Attributes - ---------- - Variants with known strings and expected results. - Returns - ---------- - Number of tests completed successfully. - """ def test_basic_syntax_RSG(self): - """ - Test for handling basic syntax of variant string. - """ + # Test for handling basic syntax of variant string. variant_str = "NG_012232.1:g.4T[20]" my_variant = expanded_repeats.TandemRepeats.parse_repeat_variant(variant_str, "GRCh37", "all", vv) - my_variant.reformat_reference() - my_variant.check_genomic_or_coding() + my_variant.reformat_reference() # feformat + my_variant.check_genomic_or_coding() # check g or c formatted = my_variant.reformat(vv) assert str(formatted) == "NG_012232.1:g.3_6T[20]" assert my_variant.variant_str == "NG_012232.1:g.4T[20]" # checks correct transcript ref assert my_variant.reference == "NG_012232.1" - # checks correct position + # checks correct position. assert str(my_variant.variant_position) == "3_6" - # checks repeat seq + # checks repeat seq. assert my_variant.repeat_sequence == "T" - # checks correct suffix - assert my_variant.copy_number == "20" - # checks number of repeats is str and correct - assert my_variant.after_the_bracket == "" - # checks nothing is after the bracket + # checks correct suffix. + assert my_variant.copy_number == '20' + # checks number of repeats is str and correct. + assert my_variant.after_the_bracket == '' + # checks nothing is after the bracket. def test_basic_syntax_ENSG(self): - """ - Test for handling basic syntax of ENSG variant string. - """ + # Test for handling basic syntax of ENSG variant string. + # changed from previous version of "ENST00000263121.12:c.1082TCT[2]" # (pre-full exon handling) after verifying that coordinates matched by # testing "ENST00000263121.12:c.*62_*67delinsTCTTCT" transformed into @@ -65,51 +60,48 @@ def test_basic_syntax_ENSG(self): variant_str = "ENST00000263121.12:c.*62_*67TCT[2]" my_variant = expanded_repeats.TandemRepeats.parse_repeat_variant( variant_str, "GRCh37", "all", vv) - my_variant.reformat_reference() - my_variant.check_genomic_or_coding() + my_variant.reformat_reference() # reformat + my_variant.check_genomic_or_coding() # check c or g formatted = my_variant.reformat(vv) assert str(formatted) == "ENST00000263121.12:c.*62_*67TCT[2]" assert my_variant.variant_str == "ENST00000263121.12:c.*62_*67TCT[2]" - assert my_variant.prefix == "c" + assert my_variant.prefix == 'c' assert my_variant.reference == "ENST00000263121.12" - # checks correct ref name + # checks correct ref name. assert str(my_variant.variant_position) == "*62_*67" - # checks correct position + # checks correct position. assert my_variant.repeat_sequence == "TCT" - # checks repeat seq - assert my_variant.copy_number == "2" - # checks number of repeats is str and correct - assert my_variant.after_the_bracket == "" - # checks nothing is after the bracket + # checks repeat seq. + assert my_variant.copy_number == '2' + # checks number of repeats is str and correct. + assert my_variant.after_the_bracket == '' + # checks nothing is after the bracket. def test_basic_syntax_NM(self): - """ - Test for handling basic syntax with a NM_ 'c' type variant string. - """ + # Test for handling basic syntax with a NM_ 'c' type variant string. variant_str = "NM_000492.4:c.1210-34TG[11]" my_variant = expanded_repeats.TandemRepeats.parse_repeat_variant(variant_str, "GRCh38", "all", vv) assert str(my_variant.variant_position) == "1210-34" - my_variant.reformat_reference() - my_variant.check_genomic_or_coding() + my_variant.reformat_reference() # reformat + my_variant.check_genomic_or_coding() # check g or c formatted = my_variant.reformat(vv) assert str(formatted) == "NM_000492.4:c.1210-34_1210-13TG[11]" assert my_variant.variant_str == "NM_000492.4:c.1210-34TG[11]" - assert my_variant.prefix == "c" + assert my_variant.prefix == 'c' assert my_variant.reference == "NM_000492.4" - # checks correct ref name + # checks correct ref name. assert str(my_variant.variant_position) == "1210-34_1210-13" - # checks correct position + # checks correct position. assert my_variant.repeat_sequence == "TG" - # checks repeat seq + # checks repeat seq. assert my_variant.copy_number == "11" - # checks number of repeats is str and correct - assert my_variant.after_the_bracket == "" - # checks nothing is after the bracket + # checks number of repeats is str and correct. + assert my_variant.after_the_bracket == '' + # checks nothing is after the bracket. - def test_getting_full_range_from_single_pos(self): - """ - Test to full range is calculated correctly - """ + def test_getting_full_range_from_single_pos( + self): + # Test to full range is calculated correctly variant_str = "NM_003073.5:c.1085AGA[2]" my_variant = expanded_repeats.TandemRepeats.parse_repeat_variant( variant_str, "GRCh37", "all", vv) @@ -117,14 +109,14 @@ def test_getting_full_range_from_single_pos(self): seq_range = expanded_repeats.TandemRepeats.get_range_from_single_or_start_pos(my_variant, vv) self.assertEqual(str(seq_range), "1289_1297") - def test_empty_string(self): - """ - Test for handling empty string. - """ - variant_str = "" + def test_empty_string( + self): + # Test for handling empty string. + variant_str = '' my_variant = expanded_repeats.TandemRepeats.parse_repeat_variant( variant_str, "GRCh37", "all", vv) - assert my_variant == False + assert (my_variant == + False) def test_convert_tandem(self): """ @@ -1371,8 +1363,8 @@ def test_gap_crossing(self): assert results["NM_002111.8:c.54_116GCA[21]"]["validation_warnings"] == ['ExpandedRepeatError: The coordinates for the repeat region are stated incorrectly in the submitted description LRG_763t1:c.54GCA[21]. The corrected description is NM_002111.8:c.54_116GCA[21]', 'ExpandedRepeatWarning: NM_002111.8:c.54_116GCA[21] should only be used as an annotation for the core HGVS descriptions provided', 'GappedAlignmentWarning: Variation described in the context of an imperfect alignment of NM_002111.8 with NC_000004.11 (genome build GRCh37)', 'GappedAlignmentWarning: NM_002111.8 contains 6 extra bases between c.51_58 than NC_000004.11'] -if __name__ == "__main__": - unittest.main() +if __name__ == "__main__": # Run + unittest.main() # Run # Copyright (C) 2016-2026 VariantValidator Contributors