From 2f3b53b421bebdbafdfdbd0b0a75a95ec4cf1a89 Mon Sep 17 00:00:00 2001 From: Adam English Date: Sat, 4 Jan 2025 20:56:56 -0500 Subject: [PATCH 01/10] first pass it worked, but realized I don't need a subcommand. So reworking it now. --- truvari/__main__.py | 3 + truvari/bench.py | 10 ++ truvari/bndbench.py | 244 ++++++++++++++++++++++++++++++++++++++++++++ truvari/matching.py | 13 ++- 4 files changed, 267 insertions(+), 3 deletions(-) create mode 100644 truvari/bndbench.py diff --git a/truvari/__main__.py b/truvari/__main__.py index e079d05e..bf17f7ee 100755 --- a/truvari/__main__.py +++ b/truvari/__main__.py @@ -16,6 +16,7 @@ from truvari.divide import divide_main from truvari.vcf2df import vcf2df_main from truvari.refine import refine_main +from truvari.bndbench import bndbench_main from truvari.collapse import collapse_main from truvari.stratify import stratify_main from truvari.segmentation import segment_main @@ -41,6 +42,7 @@ def flat_version(args): "phab": phab_main, "refine": refine_main, "ga4gh": make_ga4gh_main, + "bndbench": bndbench_main, "version": flat_version} USAGE = f"""\ @@ -58,6 +60,7 @@ def flat_version(args): [bold][cyan]phab[/][/] Variant harmonization using MSA [bold][cyan]refine[/][/] Automated bench result refinement with phab [bold][cyan]ga4gh[/][/] Convert Truvari result to GA4GH + [bold][cyan]bndbench[/][/] BND Performance metrics [bold][cyan]version[/][/] Print the Truvari version and exit """ diff --git a/truvari/bench.py b/truvari/bench.py index aba26022..1a374f4a 100644 --- a/truvari/bench.py +++ b/truvari/bench.py @@ -16,6 +16,7 @@ import numpy as np import truvari +import truvari.bndbench as bnd ############## # Parameters # @@ -516,6 +517,8 @@ def compare_chunk(self, chunk): result = self.compare_calls( chunk_dict["base"], chunk_dict["comp"], chunk_id) self.check_refine_candidate(result) + # Check BNDs separately + results.extend(self.bnd_compare(chunk_dict['base_BND'], chunk_dict['comp_BND'])) return result def compare_calls(self, base_variants, comp_variants, chunk_id=0): @@ -607,6 +610,13 @@ def check_refine_candidate(self, result): start = max(0, min(*pos) - buf) self.refine_candidates.append(f"{chrom}\t{start}\t{max(*pos) + buf}") + def bnd_compare(self, base_variants, comp_variants, chunk_id): + """ + Special handling of BND variants + """ + matches = bnd.build_matches(chunk['base'], chunk['comp'], args.refdist, chunk_id) + picked = pick_single_matches(matches) + return matches ################# # Match Pickers # diff --git a/truvari/bndbench.py b/truvari/bndbench.py new file mode 100644 index 00000000..86a2fc6d --- /dev/null +++ b/truvari/bndbench.py @@ -0,0 +1,244 @@ +""" +BND SV benchmarking tool +Given baseline and comparison sets of variants, calculate the recall/precision/f-measure +""" +import os +import re +import sys +import logging +import argparse + +import pysam +import numpy as np + +import truvari +from truvari.bench import BenchOutput, pick_single_matches + +def parse_args(args): + """ + Parse list of command line arguments + """ + parser = argparse.ArgumentParser(prog="bndbench", description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter) + + parser.add_argument("-b", "--base", type=str, required=True, + help="Baseline truth-set calls") + parser.add_argument("-c", "--comp", type=str, required=True, + help="Comparison set of calls") + parser.add_argument("-o", "--output", type=str, required=True, + help="Output directory") + parser.add_argument("--includebed", type=str, default=None, + help="Bed file of regions to analyze. Only calls within regions are counted") + parser.add_argument("--debug", action="store_true", default=False, + help="Verbose logging") + parser.add_argument("-r", "--refdist", type=truvari.restricted_int, default=100, + help="Max reference distance (%(default)s)") + parser.add_argument("--bSample", type=str, default=None, + help="Baseline calls' sample to use (first)") + parser.add_argument("--cSample", type=str, default=None, + help="Comparison calls' sample to use (first)") + parser.add_argument("--passonly", action="store_true", + help="Only consider calls with FILTER == PASS") + parser.add_argument("--no-ref", default=None, choices=['a', 'b', 'c'], + help="Exclude 0/0 or ./. GT calls from all (a), base (b), or comp (c) vcfs (%(default)s)") + args = parser.parse_args(args) + args.base = os.path.abspath(args.base) + args.comp = os.path.abspath(args.comp) + args.includebed = os.path.abspath( + args.includebed) if args.includebed else args.includebed + return args + +def check_params(args): + """ + Checks parameters, True if an error + """ + return False + +# def annotate_entry(entry, match, header): +# def edit_header(my_vcf): + +def bnd_direction_strand(bnd: str) -> tuple: + """ + Parses a BND ALT string to determine its direction and strand. + ALT Meaning + t[p[ piece extending to the right of p is joined after t + t]p] reverse comp piece extending left of p is joined after t + ]p]t piece extending to the left of p is joined before t + [p[t reverse comp piece extending right of p is joined before t + + Note that direction of 'left' means the piece is anchored on the left of the breakpoint + + Args: + bnd (str): The BND ALT string. + + Returns: + tuple: A tuple containing the direction ("left" or "right") and strand ("direct" or "complement"). + """ + if bnd.startswith('[') or bnd.endswith('['): + direction = "left" + elif bnd.startswith(']') or bnd.endswith(']'): + direction = "right" + else: + raise ValueError(f"Invalid BND ALT format: {bnd}") + + # Determine strand based on the position of the base letter + if bnd[0] not in '[]': # Base letter is at the start (before brackets) + strand = "direct" + elif bnd[-1] not in '[]': # Base letter is at the end (after brackets) + strand = "complement" + else: + raise ValueError(f"Invalid BND ALT format: {bnd}") + + return direction, strand + +def bnd_position(bnd): + """ + Extracts the chromosome and position from a BND ALT string. + + Args: + bnd (str): The BND ALT string. + + Returns: + tuple: A tuple containing the chromosome (str) and position (int). + """ + + # Regular expression to match the BND format and extract chrom:pos + match = re.search(r'[\[\]]([^\[\]:]+):(\d+)[\[\]]', bnd) + if not match: + raise ValueError(f"Invalid BND ALT format: {bnd}") + + chrom = match.group(1) # Extract the chromosome + pos = int(match.group(2)) # Extract the position as an integer + + return chrom, pos + +def build_matches(base_variants, comp_variants, refdist, chunk_id): + """ + Builds a match matrix for calls + """ + # All FPs + if len(base_variants) == 0: + fps = [] + for cid, c in enumerate(comp_variants): + ret = truvari.MatchResult() + ret.comp = c + ret.matid = ["", f"{chunk_id}.{cid}"] + fps.append(ret) + logging.debug("All FP -> %s", ret) + return fps + + # All FNs + if len(comp_variants) == 0: + fns = [] + for bid, b in enumerate(base_variants): + ret = truvari.MatchResult() + ret.base = b + ret.matid = [f"{chunk_id}.{bid}", ""] + logging.debug("All FN -> %s", ret) + fns.append(ret) + return fns + + match_matrix = [] + for bid, base in enumerate(base_variants): + base_matches = [] + for cid, comp in enumerate(comp_variants): + mat = truvari.MatchResult() + mat.base = base + mat.comp = comp + + mat.matid = [f"{chunk_id}.{bid}", f"{chunk_id}.{cid}"] + mat.state = True + + bstart = base.pos + cstart = comp.pos + mat.st_dist = bstart - cstart + mat.state &= mat.score < refdist + + b_bnd = bnd_direction_strand(base.alts[0]) + c_bnd = bnd_direction_strand(comp.alts[0]) + mat.state &= b_bnd == c_bnd + + b_pos2 = bnd_position(base.alts[0]) + c_pos2 = bnd_position(comp.alts[0]) + dist2 = abs(b_pos2[1] - c_pos2[1]) + mat.state &= b_pos2[0] == c_pos2[0] + mat.state &= dist2 < refdist + + mat.score = abs(mat.st_dist + dist2) / 2 + logging.debug("Made mat -> %s", mat) + base_matches.append(mat) + + match_matrix.append(base_matches) + + return np.array(match_matrix) + +def bnd_filter(variants): + """ + Only yield variants which are BNDs + """ + for i in variants: + if i.alleles_variant_types[1] == 'BND': + yield i + +def bndbench_main(cmdargs): + """ + Main entry point + """ + args = parse_args(cmdargs) + if check_params(args): + sys.stderr.write("Couldn't run Truvari. Please fix parameters\n") + sys.exit(100) + + matcher = truvari.Matcher() + matcher.params.pctseq = 0 + matcher.params.sizemin = 0 + matcher.params.sizefilt = 0 + matcher.params.refdist = args.refdist + matcher.params.passonly = args.passonly + matcher.params.bSample = args.bSample + matcher.params.cSample = args.cSample + matcher.params.sizemax = sys.maxsize + + #output = BenchOutput(self, self.matcher) + # beware annotate_entry, and edit_header + + base = pysam.VariantFile(args.base) + comp = pysam.VariantFile(args.comp) + + region_tree = truvari.build_region_tree(base, comp, args.includebed) + truvari.merge_region_tree_overlaps(region_tree) + + base_i = bnd_filter(truvari.region_filter(base, region_tree)) + comp_i = bnd_filter(truvari.region_filter(comp, region_tree)) + + chunks = truvari.chunker(matcher, ('base', base_i), ('comp', comp_i)) + + tp = 0 + fp = 0 + fn = 0 + for chunk, m_id in chunks: + matches = build_matches(chunk['base'], chunk['comp'], args.refdist, m_id) + if isinstance(matches, list): + for i in matches: + if i.base: + fn += 1 + else: + fp += 1 + print('no match', i) + continue + picked = pick_single_matches(matches) + for i in picked: + if i.state: + tp += 1 + else: + if i.base: + fn += 1 + else: + fp += 1 + print(i) + #output.write_match(match) + print(f"TP: {tp}; FP: {fp}, FN: {fn}") + #output.close_outputs() + #logging.info("Stats: %s", json.dumps(output.stats_box, indent=4)) + logging.info("Finished bndbench") + diff --git a/truvari/matching.py b/truvari/matching.py index e92d2988..8cec5709 100644 --- a/truvari/matching.py +++ b/truvari/matching.py @@ -308,6 +308,10 @@ def chunker(matcher, *files): cur_chunk = defaultdict(list) unresolved_warned = False for key, entry in file_zipper(*files): + if matcher.bnd_filter(entry): + cur_chunk[f'{key}_BND'].append(entry) + continue + if matcher.filter_call(entry, key == 'base'): cur_chunk['__filtered'].append(entry) call_counts['__filtered'] += 1 @@ -356,9 +360,12 @@ def resolve_sv(entry, ref, dup_to_ins=False): if ref is None or entry.alts[0] in ['', ''] or entry.start > ref.get_reference_length(entry.chrom): return False - if entry.alleles_variant_types[1] == 'BND' and "SVTYPE" in entry.info \ - and truvari.entry_variant_type(entry) == truvari.SV.DEL: - entry.alts = [''] + # BNDs which describe a deletion can be resolved + if entry.alleles_variant_types[1] == 'BND': + if "SVTYPE" in entry.info and entry.info['SVTYPE'] == 'DEL': + entry.alts = [''] + else: + return False seq = ref.fetch(entry.chrom, entry.start, entry.stop) if entry.alts[0] == '': From 98dcc1409c0d67db8fbf233d6d54840f6eac9973 Mon Sep 17 00:00:00 2001 From: Adam English Date: Sat, 4 Jan 2025 21:49:14 -0500 Subject: [PATCH 02/10] beginning to integrate bnds --- truvari/__main__.py | 3 - truvari/bench.py | 11 ++-- truvari/bndbench.py | 157 +++++--------------------------------------- 3 files changed, 23 insertions(+), 148 deletions(-) diff --git a/truvari/__main__.py b/truvari/__main__.py index bf17f7ee..e079d05e 100755 --- a/truvari/__main__.py +++ b/truvari/__main__.py @@ -16,7 +16,6 @@ from truvari.divide import divide_main from truvari.vcf2df import vcf2df_main from truvari.refine import refine_main -from truvari.bndbench import bndbench_main from truvari.collapse import collapse_main from truvari.stratify import stratify_main from truvari.segmentation import segment_main @@ -42,7 +41,6 @@ def flat_version(args): "phab": phab_main, "refine": refine_main, "ga4gh": make_ga4gh_main, - "bndbench": bndbench_main, "version": flat_version} USAGE = f"""\ @@ -60,7 +58,6 @@ def flat_version(args): [bold][cyan]phab[/][/] Variant harmonization using MSA [bold][cyan]refine[/][/] Automated bench result refinement with phab [bold][cyan]ga4gh[/][/] Convert Truvari result to GA4GH - [bold][cyan]bndbench[/][/] BND Performance metrics [bold][cyan]version[/][/] Print the Truvari version and exit """ diff --git a/truvari/bench.py b/truvari/bench.py index 1a374f4a..27a38de8 100644 --- a/truvari/bench.py +++ b/truvari/bench.py @@ -518,7 +518,7 @@ def compare_chunk(self, chunk): chunk_dict["base"], chunk_dict["comp"], chunk_id) self.check_refine_candidate(result) # Check BNDs separately - results.extend(self.bnd_compare(chunk_dict['base_BND'], chunk_dict['comp_BND'])) + result.extend(self.bnd_compare(chunk_dict['base_BND'], chunk_dict['comp_BND'], chunk_id)) return result def compare_calls(self, base_variants, comp_variants, chunk_id=0): @@ -610,13 +610,14 @@ def check_refine_candidate(self, result): start = max(0, min(*pos) - buf) self.refine_candidates.append(f"{chrom}\t{start}\t{max(*pos) + buf}") - def bnd_compare(self, base_variants, comp_variants, chunk_id): + def bnd_compare(self, base, comp, chunk_id): """ Special handling of BND variants """ - matches = bnd.build_matches(chunk['base'], chunk['comp'], args.refdist, chunk_id) - picked = pick_single_matches(matches) - return matches + match_matrix = bnd.build_matches(base, comp, self.matcher, chunk_id) + if isinstance(match_matrix, list): + return match_matrix + return PICKERS[self.matcher.params.pick](match_matrix) ################# # Match Pickers # diff --git a/truvari/bndbench.py b/truvari/bndbench.py index 86a2fc6d..6db1890c 100644 --- a/truvari/bndbench.py +++ b/truvari/bndbench.py @@ -2,60 +2,10 @@ BND SV benchmarking tool Given baseline and comparison sets of variants, calculate the recall/precision/f-measure """ -import os import re -import sys import logging -import argparse - -import pysam import numpy as np - import truvari -from truvari.bench import BenchOutput, pick_single_matches - -def parse_args(args): - """ - Parse list of command line arguments - """ - parser = argparse.ArgumentParser(prog="bndbench", description=__doc__, - formatter_class=argparse.RawDescriptionHelpFormatter) - - parser.add_argument("-b", "--base", type=str, required=True, - help="Baseline truth-set calls") - parser.add_argument("-c", "--comp", type=str, required=True, - help="Comparison set of calls") - parser.add_argument("-o", "--output", type=str, required=True, - help="Output directory") - parser.add_argument("--includebed", type=str, default=None, - help="Bed file of regions to analyze. Only calls within regions are counted") - parser.add_argument("--debug", action="store_true", default=False, - help="Verbose logging") - parser.add_argument("-r", "--refdist", type=truvari.restricted_int, default=100, - help="Max reference distance (%(default)s)") - parser.add_argument("--bSample", type=str, default=None, - help="Baseline calls' sample to use (first)") - parser.add_argument("--cSample", type=str, default=None, - help="Comparison calls' sample to use (first)") - parser.add_argument("--passonly", action="store_true", - help="Only consider calls with FILTER == PASS") - parser.add_argument("--no-ref", default=None, choices=['a', 'b', 'c'], - help="Exclude 0/0 or ./. GT calls from all (a), base (b), or comp (c) vcfs (%(default)s)") - args = parser.parse_args(args) - args.base = os.path.abspath(args.base) - args.comp = os.path.abspath(args.comp) - args.includebed = os.path.abspath( - args.includebed) if args.includebed else args.includebed - return args - -def check_params(args): - """ - Checks parameters, True if an error - """ - return False - -# def annotate_entry(entry, match, header): -# def edit_header(my_vcf): def bnd_direction_strand(bnd: str) -> tuple: """ @@ -65,7 +15,7 @@ def bnd_direction_strand(bnd: str) -> tuple: t]p] reverse comp piece extending left of p is joined after t ]p]t piece extending to the left of p is joined before t [p[t reverse comp piece extending right of p is joined before t - + Note that direction of 'left' means the piece is anchored on the left of the breakpoint Args: @@ -94,10 +44,10 @@ def bnd_direction_strand(bnd: str) -> tuple: def bnd_position(bnd): """ Extracts the chromosome and position from a BND ALT string. - + Args: bnd (str): The BND ALT string. - + Returns: tuple: A tuple containing the chromosome (str) and position (int). """ @@ -106,22 +56,22 @@ def bnd_position(bnd): match = re.search(r'[\[\]]([^\[\]:]+):(\d+)[\[\]]', bnd) if not match: raise ValueError(f"Invalid BND ALT format: {bnd}") - + chrom = match.group(1) # Extract the chromosome pos = int(match.group(2)) # Extract the position as an integer - + return chrom, pos -def build_matches(base_variants, comp_variants, refdist, chunk_id): +def build_matches(base_variants, comp_variants, matcher, chunk_id): """ Builds a match matrix for calls """ # All FPs if len(base_variants) == 0: fps = [] - for cid, c in enumerate(comp_variants): + for cid, comp in enumerate(comp_variants): ret = truvari.MatchResult() - ret.comp = c + ret.comp = comp ret.matid = ["", f"{chunk_id}.{cid}"] fps.append(ret) logging.debug("All FP -> %s", ret) @@ -130,9 +80,9 @@ def build_matches(base_variants, comp_variants, refdist, chunk_id): # All FNs if len(comp_variants) == 0: fns = [] - for bid, b in enumerate(base_variants): + for bid, base in enumerate(base_variants): ret = truvari.MatchResult() - ret.base = b + ret.base = base ret.matid = [f"{chunk_id}.{bid}", ""] logging.debug("All FN -> %s", ret) fns.append(ret) @@ -146,23 +96,21 @@ def build_matches(base_variants, comp_variants, refdist, chunk_id): mat.base = base mat.comp = comp - mat.matid = [f"{chunk_id}.{bid}", f"{chunk_id}.{cid}"] + mat.matid = [f"{chunk_id}.{bid}", f"{chunk_id}.{cid}"] mat.state = True - - bstart = base.pos - cstart = comp.pos - mat.st_dist = bstart - cstart - mat.state &= mat.score < refdist - + + mat.st_dist = base.pos - comp.pos + mat.state &= mat.score < matcher.params.refdist + b_bnd = bnd_direction_strand(base.alts[0]) c_bnd = bnd_direction_strand(comp.alts[0]) mat.state &= b_bnd == c_bnd - + b_pos2 = bnd_position(base.alts[0]) c_pos2 = bnd_position(comp.alts[0]) dist2 = abs(b_pos2[1] - c_pos2[1]) mat.state &= b_pos2[0] == c_pos2[0] - mat.state &= dist2 < refdist + mat.state &= dist2 < matcher.params.refdist mat.score = abs(mat.st_dist + dist2) / 2 logging.debug("Made mat -> %s", mat) @@ -171,74 +119,3 @@ def build_matches(base_variants, comp_variants, refdist, chunk_id): match_matrix.append(base_matches) return np.array(match_matrix) - -def bnd_filter(variants): - """ - Only yield variants which are BNDs - """ - for i in variants: - if i.alleles_variant_types[1] == 'BND': - yield i - -def bndbench_main(cmdargs): - """ - Main entry point - """ - args = parse_args(cmdargs) - if check_params(args): - sys.stderr.write("Couldn't run Truvari. Please fix parameters\n") - sys.exit(100) - - matcher = truvari.Matcher() - matcher.params.pctseq = 0 - matcher.params.sizemin = 0 - matcher.params.sizefilt = 0 - matcher.params.refdist = args.refdist - matcher.params.passonly = args.passonly - matcher.params.bSample = args.bSample - matcher.params.cSample = args.cSample - matcher.params.sizemax = sys.maxsize - - #output = BenchOutput(self, self.matcher) - # beware annotate_entry, and edit_header - - base = pysam.VariantFile(args.base) - comp = pysam.VariantFile(args.comp) - - region_tree = truvari.build_region_tree(base, comp, args.includebed) - truvari.merge_region_tree_overlaps(region_tree) - - base_i = bnd_filter(truvari.region_filter(base, region_tree)) - comp_i = bnd_filter(truvari.region_filter(comp, region_tree)) - - chunks = truvari.chunker(matcher, ('base', base_i), ('comp', comp_i)) - - tp = 0 - fp = 0 - fn = 0 - for chunk, m_id in chunks: - matches = build_matches(chunk['base'], chunk['comp'], args.refdist, m_id) - if isinstance(matches, list): - for i in matches: - if i.base: - fn += 1 - else: - fp += 1 - print('no match', i) - continue - picked = pick_single_matches(matches) - for i in picked: - if i.state: - tp += 1 - else: - if i.base: - fn += 1 - else: - fp += 1 - print(i) - #output.write_match(match) - print(f"TP: {tp}; FP: {fp}, FN: {fn}") - #output.close_outputs() - #logging.info("Stats: %s", json.dumps(output.stats_box, indent=4)) - logging.info("Finished bndbench") - From 5dfa309b202be635204204374113186473ab5461 Mon Sep 17 00:00:00 2001 From: Adam English Date: Sat, 4 Jan 2025 23:02:54 -0500 Subject: [PATCH 03/10] progress pick ac vs pick multi is giving weird differences in comp count But otherwise, we're on the right track --- imgs/pylint.svg | 12 ++++++------ truvari/bench.py | 2 ++ truvari/bndbench.py | 26 ++++++++++++++++++-------- truvari/matching.py | 32 +++++++++++++++++++------------- 4 files changed, 45 insertions(+), 27 deletions(-) diff --git a/imgs/pylint.svg b/imgs/pylint.svg index c25bad4e..296d4c8d 100644 --- a/imgs/pylint.svg +++ b/imgs/pylint.svg @@ -1,23 +1,23 @@ - + - + - - + + pylint pylint - 10 - 10 + 9.99 + 9.99 diff --git a/truvari/bench.py b/truvari/bench.py index 27a38de8..05deeb91 100644 --- a/truvari/bench.py +++ b/truvari/bench.py @@ -60,6 +60,8 @@ def parse_args(args): help="Number of matches reported per-call (%(default)s)") thresg.add_argument("--dup-to-ins", action="store_true", help="Assume DUP svtypes are INS (%(default)s)") + thresg.add_argument("-B", "--bnddist", type=truvari.restricted_int, default=defaults.bnddist, + help="Maximum distance allowed between BNDs") thresg.add_argument("-C", "--chunksize", type=truvari.restricted_int, default=defaults.chunksize, help="Max reference distance to compare calls (%(default)s)") diff --git a/truvari/bndbench.py b/truvari/bndbench.py index 6db1890c..81a59f7d 100644 --- a/truvari/bndbench.py +++ b/truvari/bndbench.py @@ -97,23 +97,33 @@ def build_matches(base_variants, comp_variants, matcher, chunk_id): mat.comp = comp mat.matid = [f"{chunk_id}.{bid}", f"{chunk_id}.{cid}"] - mat.state = True + mat.state = base.chrom == comp.chrom mat.st_dist = base.pos - comp.pos - mat.state &= mat.score < matcher.params.refdist - + mat.state &= abs(mat.st_dist) < matcher.params.bnddist b_bnd = bnd_direction_strand(base.alts[0]) c_bnd = bnd_direction_strand(comp.alts[0]) mat.state &= b_bnd == c_bnd b_pos2 = bnd_position(base.alts[0]) c_pos2 = bnd_position(comp.alts[0]) - dist2 = abs(b_pos2[1] - c_pos2[1]) + mat.ed_dist = b_pos2[1] - c_pos2[1] mat.state &= b_pos2[0] == c_pos2[0] - mat.state &= dist2 < matcher.params.refdist - - mat.score = abs(mat.st_dist + dist2) / 2 - logging.debug("Made mat -> %s", mat) + mat.state &= mat.ed_dist < matcher.params.bnddist + + # not dry + if "GT" in base.samples[matcher.params.bSample]: + mat.base_gt = base.samples[matcher.params.bSample]["GT"] + mat.base_gt_count = sum(1 for _ in mat.base_gt if _ == 1) + if "GT" in comp.samples[matcher.params.cSample]: + mat.comp_gt = comp.samples[matcher.params.cSample]["GT"] + mat.comp_gt_count = sum(1 for _ in mat.comp_gt if _ == 1) + mat.gt_match = abs(mat.base_gt_count - mat.comp_gt_count) + + # Score is percent of allowed distance needed to find this match + mat.score = (1 - ((abs(mat.st_dist) + abs(mat.ed_dist)) / 2) / matcher.params.bnddist) * 100 + # I think I'm missing GT stuff here + logging.debug("BND match -> %s", mat) base_matches.append(mat) match_matrix.append(base_matches) diff --git a/truvari/matching.py b/truvari/matching.py index 8cec5709..c8a5140c 100644 --- a/truvari/matching.py +++ b/truvari/matching.py @@ -108,6 +108,7 @@ def make_match_params(): params.bSample = 0 params.cSample = 0 params.dup_to_ins = False + params.bnddist = 100 params.sizemin = 50 params.sizefilt = 30 params.sizemax = 50000 @@ -136,6 +137,7 @@ def make_match_params_from_args(args): ret.bSample = args.bSample if args.bSample else 0 ret.cSample = args.cSample if args.cSample else 0 ret.dup_to_ins = args.dup_to_ins if "dup_to_ins" in args else False + ret.bnddist = args.bnddist # filtering properties ret.sizemin = args.sizemin ret.sizefilt = args.sizefilt @@ -149,7 +151,7 @@ def make_match_params_from_args(args): def filter_call(self, entry, base=False): """ - Returns True if the call should be filtered + Returns True if the call should be filtered based on parameters or truvari requirements Base has different filtering requirements, so let the method know """ if self.params.check_monref and (not entry.alts or entry.alts[0] in (None, '*')): # ignore monomorphic reference @@ -159,19 +161,9 @@ def filter_call(self, entry, base=False): raise ValueError( f"Cannot compare multi-allelic records. Please split\nline {str(entry)}") - # Don't compare BNDs, ever - #if entry.alleles_variant_types[1] == 'BND': - # return True - if self.params.passonly and truvari.entry_is_filtered(entry): return True - size = truvari.entry_size(entry) - if (size > self.params.sizemax) \ - or (base and size < self.params.sizemin) \ - or (not base and size < self.params.sizefilt): - return True - prefix = 'b' if base else 'c' if self.params.no_ref in ["a", prefix] or self.params.pick == 'ac': samp = self.params.bSample if base else self.params.cSample @@ -180,6 +172,15 @@ def filter_call(self, entry, base=False): return False + def size_filter(self, entry, base=False): + """ + Returns True if entry should be filtered due to its size + """ + size = truvari.entry_size(entry) + return (size > self.params.sizemax) \ + or (base and size < self.params.sizemin) \ + or (not base and size < self.params.sizefilt) + def build_match(self, base, comp, matid=None, skip_gt=False, short_circuit=False): """ Build a MatchResult @@ -308,11 +309,16 @@ def chunker(matcher, *files): cur_chunk = defaultdict(list) unresolved_warned = False for key, entry in file_zipper(*files): - if matcher.bnd_filter(entry): + if matcher.filter_call(entry, key == 'base'): + cur_chunk['__filtered'].append(entry) + call_counts['__filtered'] += 1 + continue + + if entry.alleles_variant_types[1] == 'BND': cur_chunk[f'{key}_BND'].append(entry) continue - if matcher.filter_call(entry, key == 'base'): + if matcher.size_filter(entry, key=='base'): cur_chunk['__filtered'].append(entry) call_counts['__filtered'] += 1 continue From 8b3f48ba65cead88fcf81f467bd43a29cde98bec Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 5 Jan 2025 04:05:15 +0000 Subject: [PATCH 04/10] Update pylint score --- imgs/pylint.svg | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/imgs/pylint.svg b/imgs/pylint.svg index 296d4c8d..c25bad4e 100644 --- a/imgs/pylint.svg +++ b/imgs/pylint.svg @@ -1,23 +1,23 @@ - + - + - - + + pylint pylint - 9.99 - 9.99 + 10 + 10 From f7845a91791fda4124e943c3f40cde5f4fd42380 Mon Sep 17 00:00:00 2001 From: Adam English Date: Sat, 4 Jan 2025 23:24:22 -0500 Subject: [PATCH 05/10] bnd progress allow bnd to be turned off. stop bnd from breaking collapse --- truvari/bench.py | 7 ++++--- truvari/matching.py | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/truvari/bench.py b/truvari/bench.py index 05deeb91..b74071cc 100644 --- a/truvari/bench.py +++ b/truvari/bench.py @@ -60,8 +60,8 @@ def parse_args(args): help="Number of matches reported per-call (%(default)s)") thresg.add_argument("--dup-to-ins", action="store_true", help="Assume DUP svtypes are INS (%(default)s)") - thresg.add_argument("-B", "--bnddist", type=truvari.restricted_int, default=defaults.bnddist, - help="Maximum distance allowed between BNDs") + thresg.add_argument("-B", "--bnddist", type=int, default=defaults.bnddist, + help="Maximum distance allowed between BNDs (%(default)s; -1=off)") thresg.add_argument("-C", "--chunksize", type=truvari.restricted_int, default=defaults.chunksize, help="Max reference distance to compare calls (%(default)s)") @@ -520,7 +520,8 @@ def compare_chunk(self, chunk): chunk_dict["base"], chunk_dict["comp"], chunk_id) self.check_refine_candidate(result) # Check BNDs separately - result.extend(self.bnd_compare(chunk_dict['base_BND'], chunk_dict['comp_BND'], chunk_id)) + if self.matcher.params.bnddist != -1: + result.extend(self.bnd_compare(chunk_dict['base_BND'], chunk_dict['comp_BND'], chunk_id)) return result def compare_calls(self, base_variants, comp_variants, chunk_id=0): diff --git a/truvari/matching.py b/truvari/matching.py index c8a5140c..9880c97f 100644 --- a/truvari/matching.py +++ b/truvari/matching.py @@ -137,7 +137,7 @@ def make_match_params_from_args(args): ret.bSample = args.bSample if args.bSample else 0 ret.cSample = args.cSample if args.cSample else 0 ret.dup_to_ins = args.dup_to_ins if "dup_to_ins" in args else False - ret.bnddist = args.bnddist + ret.bnddist = args.bnddist if 'bnddist' in args else -1 # filtering properties ret.sizemin = args.sizemin ret.sizefilt = args.sizefilt From a4c7014cfd845509e89246f27d6ae565c5d0a621 Mon Sep 17 00:00:00 2001 From: Adam English Date: Sun, 5 Jan 2025 00:05:52 -0500 Subject: [PATCH 06/10] fixed counting I wasn't chunking correctly. But now it's looking consistent Also, I might have test coverage for cmd_exe keyboard interrupt --- truvari/matching.py | 14 ++++++++------ truvari/utils.py | 2 ++ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/truvari/matching.py b/truvari/matching.py index 9880c97f..f4a88805 100644 --- a/truvari/matching.py +++ b/truvari/matching.py @@ -314,17 +314,15 @@ def chunker(matcher, *files): call_counts['__filtered'] += 1 continue - if entry.alleles_variant_types[1] == 'BND': - cur_chunk[f'{key}_BND'].append(entry) - continue + is_bnd = entry.alleles_variant_types[1] == 'BND' - if matcher.size_filter(entry, key=='base'): + if not is_bnd and matcher.size_filter(entry, key=='base'): cur_chunk['__filtered'].append(entry) call_counts['__filtered'] += 1 continue # check symbolic, resolve if needed/possible - if matcher.params.pctseq != 0 and (entry.alleles_variant_types[-1] == 'BND' or entry.alts[0].startswith('<')): + if not is_bnd and matcher.params.pctseq != 0 and entry.alts[0].startswith('<'): was_resolved = resolve_sv(entry, matcher.reference, matcher.params.dup_to_ins) @@ -348,7 +346,11 @@ def chunker(matcher, *files): cur_chrom = entry.chrom cur_end = max(entry.stop, cur_end) - cur_chunk[key].append(entry) + + if is_bnd: + cur_chunk[f'{key}_BND'].append(entry) + else: + cur_chunk[key].append(entry) call_counts[key] += 1 chunk_count += 1 diff --git a/truvari/utils.py b/truvari/utils.py index 1afc794d..1b88dec0 100644 --- a/truvari/utils.py +++ b/truvari/utils.py @@ -179,6 +179,8 @@ def cmd_exe(cmd, stdin=None, timeout=-1, cap_stderr=True, pipefail=False): >>> ret = truvari.cmd_exe("sleep 5", pipefail=True, timeout=2/60) # Error logged is caught >>> ret.ret_code 214 + >>> import truvari + >>> ret = truvari.cmd_exe("(sleep 1 && kill -SIGINT $$) &") # Keyboard Interruptable """ cmd_result = namedtuple("cmd_result", "ret_code stdout stderr run_time") t_start = time.time() From f074635b75787ba6f38285877bee07a6e9528fd9 Mon Sep 17 00:00:00 2001 From: Adam English Date: Sun, 5 Jan 2025 00:09:44 -0500 Subject: [PATCH 07/10] keyboard interrupt didn't work --- truvari/utils.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/truvari/utils.py b/truvari/utils.py index 1b88dec0..1afc794d 100644 --- a/truvari/utils.py +++ b/truvari/utils.py @@ -179,8 +179,6 @@ def cmd_exe(cmd, stdin=None, timeout=-1, cap_stderr=True, pipefail=False): >>> ret = truvari.cmd_exe("sleep 5", pipefail=True, timeout=2/60) # Error logged is caught >>> ret.ret_code 214 - >>> import truvari - >>> ret = truvari.cmd_exe("(sleep 1 && kill -SIGINT $$) &") # Keyboard Interruptable """ cmd_result = namedtuple("cmd_result", "ret_code stdout stderr run_time") t_start = time.time() From c16ddb91db7c71cccc2cce42c157f30a3f875011 Mon Sep 17 00:00:00 2001 From: Adam English Date: Sun, 5 Jan 2025 00:56:08 -0500 Subject: [PATCH 08/10] keeping it dry BND comparison is now just a flag inside of some Bench methods. Don't need the extra module either. --- truvari/bench.py | 39 ++++++------- truvari/bndbench.py | 131 -------------------------------------------- truvari/matching.py | 124 +++++++++++++++++++++++++++++++++++++---- 3 files changed, 131 insertions(+), 163 deletions(-) delete mode 100644 truvari/bndbench.py diff --git a/truvari/bench.py b/truvari/bench.py index b74071cc..6a56b174 100644 --- a/truvari/bench.py +++ b/truvari/bench.py @@ -16,7 +16,6 @@ import numpy as np import truvari -import truvari.bndbench as bnd ############## # Parameters # @@ -500,7 +499,7 @@ def run(self): if (self.extend and (match.comp is not None) and not match.state - and not truvari.entry_within_tree(match.comp, region_tree)): + and not truvari.entry_within_tree(match.comp, region_tree)): match.comp = None output.write_match(match) @@ -521,13 +520,15 @@ def compare_chunk(self, chunk): self.check_refine_candidate(result) # Check BNDs separately if self.matcher.params.bnddist != -1: - result.extend(self.bnd_compare(chunk_dict['base_BND'], chunk_dict['comp_BND'], chunk_id)) + result.extend(self.compare_calls(chunk_dict['base_BND'], + chunk_dict['comp_BND'], chunk_id, True)) return result - def compare_calls(self, base_variants, comp_variants, chunk_id=0): + def compare_calls(self, base_variants, comp_variants, chunk_id=0, bnds=False): """ Builds MatchResults, returns them as a numpy matrix if there's at least one base and one comp variant. Otherwise, returns a list of the variants placed in MatchResults + sends to build_matrix if not bnd, else bnd_build_matrix """ # All FPs if len(base_variants) == 0: @@ -564,16 +565,17 @@ def compare_calls(self, base_variants, comp_variants, chunk_id=0): cnt += 1 pos.extend(truvari.entry_boundaries(i)) chrom = i.chrom - logging.warning("Skipping region %s:%d-%d with %d variants", chrom, min(*pos), max(*pos), cnt) + logging.warning( + "Skipping region %s:%d-%d with %d variants", chrom, min(*pos), max(*pos), cnt) return [] match_matrix = self.build_matrix( - base_variants, comp_variants, chunk_id) + base_variants, comp_variants, chunk_id, bnds) if isinstance(match_matrix, list): return match_matrix return PICKERS[self.matcher.params.pick](match_matrix) - def build_matrix(self, base_variants, comp_variants, chunk_id=0, skip_gt=False): + def build_matrix(self, base_variants, comp_variants, chunk_id=0, skip_gt=False, bnds=False): """ Builds MatchResults, returns them as a numpy matrix """ @@ -584,9 +586,9 @@ def build_matrix(self, base_variants, comp_variants, chunk_id=0, skip_gt=False): for bid, b in enumerate(base_variants): base_matches = [] for cid, c in enumerate(comp_variants): - mat = self.matcher.build_match( - b, c, [f"{chunk_id}.{bid}", f"{chunk_id}.{cid}"], - skip_gt, self.short_circuit) + matcher = self.matcher.build_match if not bnds else self.matcher.bnd_build_match + mat = matcher( + b, c, [f"{chunk_id}.{bid}", f"{chunk_id}.{cid}"], skip_gt, self.short_circuit) logging.debug("Made mat -> %s", mat) base_matches.append(mat) match_matrix.append(base_matches) @@ -609,22 +611,17 @@ def check_refine_candidate(self, result): chrom = match.comp.chrom pos.extend(truvari.entry_boundaries(match.comp)) if has_unmatched and pos: - buf = 10 # min(10, self.matcher.params.chunksize) need to make sure the refine covers the region + # min(10, self.matcher.params.chunksize) need to make sure the refine covers the region + buf = 10 start = max(0, min(*pos) - buf) - self.refine_candidates.append(f"{chrom}\t{start}\t{max(*pos) + buf}") - - def bnd_compare(self, base, comp, chunk_id): - """ - Special handling of BND variants - """ - match_matrix = bnd.build_matches(base, comp, self.matcher, chunk_id) - if isinstance(match_matrix, list): - return match_matrix - return PICKERS[self.matcher.params.pick](match_matrix) + self.refine_candidates.append( + f"{chrom}\t{start}\t{max(*pos) + buf}") ################# # Match Pickers # ################# + + def pick_multi_matches(match_matrix): """ Given a numpy array of MatchResults diff --git a/truvari/bndbench.py b/truvari/bndbench.py deleted file mode 100644 index 81a59f7d..00000000 --- a/truvari/bndbench.py +++ /dev/null @@ -1,131 +0,0 @@ -""" -BND SV benchmarking tool -Given baseline and comparison sets of variants, calculate the recall/precision/f-measure -""" -import re -import logging -import numpy as np -import truvari - -def bnd_direction_strand(bnd: str) -> tuple: - """ - Parses a BND ALT string to determine its direction and strand. - ALT Meaning - t[p[ piece extending to the right of p is joined after t - t]p] reverse comp piece extending left of p is joined after t - ]p]t piece extending to the left of p is joined before t - [p[t reverse comp piece extending right of p is joined before t - - Note that direction of 'left' means the piece is anchored on the left of the breakpoint - - Args: - bnd (str): The BND ALT string. - - Returns: - tuple: A tuple containing the direction ("left" or "right") and strand ("direct" or "complement"). - """ - if bnd.startswith('[') or bnd.endswith('['): - direction = "left" - elif bnd.startswith(']') or bnd.endswith(']'): - direction = "right" - else: - raise ValueError(f"Invalid BND ALT format: {bnd}") - - # Determine strand based on the position of the base letter - if bnd[0] not in '[]': # Base letter is at the start (before brackets) - strand = "direct" - elif bnd[-1] not in '[]': # Base letter is at the end (after brackets) - strand = "complement" - else: - raise ValueError(f"Invalid BND ALT format: {bnd}") - - return direction, strand - -def bnd_position(bnd): - """ - Extracts the chromosome and position from a BND ALT string. - - Args: - bnd (str): The BND ALT string. - - Returns: - tuple: A tuple containing the chromosome (str) and position (int). - """ - - # Regular expression to match the BND format and extract chrom:pos - match = re.search(r'[\[\]]([^\[\]:]+):(\d+)[\[\]]', bnd) - if not match: - raise ValueError(f"Invalid BND ALT format: {bnd}") - - chrom = match.group(1) # Extract the chromosome - pos = int(match.group(2)) # Extract the position as an integer - - return chrom, pos - -def build_matches(base_variants, comp_variants, matcher, chunk_id): - """ - Builds a match matrix for calls - """ - # All FPs - if len(base_variants) == 0: - fps = [] - for cid, comp in enumerate(comp_variants): - ret = truvari.MatchResult() - ret.comp = comp - ret.matid = ["", f"{chunk_id}.{cid}"] - fps.append(ret) - logging.debug("All FP -> %s", ret) - return fps - - # All FNs - if len(comp_variants) == 0: - fns = [] - for bid, base in enumerate(base_variants): - ret = truvari.MatchResult() - ret.base = base - ret.matid = [f"{chunk_id}.{bid}", ""] - logging.debug("All FN -> %s", ret) - fns.append(ret) - return fns - - match_matrix = [] - for bid, base in enumerate(base_variants): - base_matches = [] - for cid, comp in enumerate(comp_variants): - mat = truvari.MatchResult() - mat.base = base - mat.comp = comp - - mat.matid = [f"{chunk_id}.{bid}", f"{chunk_id}.{cid}"] - mat.state = base.chrom == comp.chrom - - mat.st_dist = base.pos - comp.pos - mat.state &= abs(mat.st_dist) < matcher.params.bnddist - b_bnd = bnd_direction_strand(base.alts[0]) - c_bnd = bnd_direction_strand(comp.alts[0]) - mat.state &= b_bnd == c_bnd - - b_pos2 = bnd_position(base.alts[0]) - c_pos2 = bnd_position(comp.alts[0]) - mat.ed_dist = b_pos2[1] - c_pos2[1] - mat.state &= b_pos2[0] == c_pos2[0] - mat.state &= mat.ed_dist < matcher.params.bnddist - - # not dry - if "GT" in base.samples[matcher.params.bSample]: - mat.base_gt = base.samples[matcher.params.bSample]["GT"] - mat.base_gt_count = sum(1 for _ in mat.base_gt if _ == 1) - if "GT" in comp.samples[matcher.params.cSample]: - mat.comp_gt = comp.samples[matcher.params.cSample]["GT"] - mat.comp_gt_count = sum(1 for _ in mat.comp_gt if _ == 1) - mat.gt_match = abs(mat.base_gt_count - mat.comp_gt_count) - - # Score is percent of allowed distance needed to find this match - mat.score = (1 - ((abs(mat.st_dist) + abs(mat.ed_dist)) / 2) / matcher.params.bnddist) * 100 - # I think I'm missing GT stuff here - logging.debug("BND match -> %s", mat) - base_matches.append(mat) - - match_matrix.append(base_matches) - - return np.array(match_matrix) diff --git a/truvari/matching.py b/truvari/matching.py index f4a88805..500c0a7f 100644 --- a/truvari/matching.py +++ b/truvari/matching.py @@ -1,6 +1,7 @@ """ Comparison engine """ +import re import types import logging from collections import Counter, defaultdict @@ -178,8 +179,20 @@ def size_filter(self, entry, base=False): """ size = truvari.entry_size(entry) return (size > self.params.sizemax) \ - or (base and size < self.params.sizemin) \ - or (not base and size < self.params.sizefilt) + or (base and size < self.params.sizemin) \ + or (not base and size < self.params.sizefilt) + + def compare_gts(self, match, base, comp): + """ + Given a MatchResult, populate the genotype specific comparisons in place + """ + if "GT" in base.samples[self.params.bSample]: + match.base_gt = base.samples[self.params.bSample]["GT"] + match.base_gt_count = sum(1 for _ in match.base_gt if _ == 1) + if "GT" in comp.samples[self.params.cSample]: + match.comp_gt = comp.samples[self.params.cSample]["GT"] + match.comp_gt_count = sum(1 for _ in match.comp_gt if _ == 1) + match.gt_match = abs(match.base_gt_count - match.comp_gt_count) def build_match(self, base, comp, matid=None, skip_gt=False, short_circuit=False): """ @@ -219,13 +232,7 @@ def build_match(self, base, comp, matid=None, skip_gt=False, short_circuit=False return ret if not skip_gt: - if "GT" in base.samples[self.params.bSample]: - ret.base_gt = base.samples[self.params.bSample]["GT"] - ret.base_gt_count = sum(1 for _ in ret.base_gt if _ == 1) - if "GT" in comp.samples[self.params.cSample]: - ret.comp_gt = comp.samples[self.params.cSample]["GT"] - ret.comp_gt_count = sum(1 for _ in ret.comp_gt if _ == 1) - ret.gt_match = abs(ret.base_gt_count - ret.comp_gt_count) + self.compare_gts(ret, base, comp) ret.ovlpct = truvari.entry_reciprocal_overlap(base, comp) if ret.ovlpct < self.params.pctovl: @@ -236,7 +243,8 @@ def build_match(self, base, comp, matid=None, skip_gt=False, short_circuit=False return ret if self.params.pctseq > 0: - ret.seqsim = truvari.entry_seq_similarity(base, comp, self.params.no_roll) + ret.seqsim = truvari.entry_seq_similarity( + base, comp, self.params.no_roll) if ret.seqsim < self.params.pctseq: logging.debug("%s and %s sequence similarity is too low (%.3ff)", str(base), str(comp), ret.seqsim) @@ -251,6 +259,38 @@ def build_match(self, base, comp, matid=None, skip_gt=False, short_circuit=False return ret + def bnd_build_match(self, base, comp, matid=None, **_kwargs): + """ + Build a MatchResult for bnds + """ + ret = truvari.MatchResult() + ret.base = base + ret.comp = comp + + ret.matid = matid + ret.state = base.chrom == comp.chrom + + ret.st_dist = base.pos - comp.pos + ret.state &= abs(ret.st_dist) < self.matcher.params.bnddist + b_bnd = bnd_direction_strand(base.alts[0]) + c_bnd = bnd_direction_strand(comp.alts[0]) + ret.state &= b_bnd == c_bnd + + b_pos2 = bnd_position(base.alts[0]) + c_pos2 = bnd_position(comp.alts[0]) + ret.ed_dist = b_pos2[1] - c_pos2[1] + ret.state &= b_pos2[0] == c_pos2[0] + ret.state &= ret.ed_dist < self.matcher.params.bnddist + + self.compare_gts(ret, base, comp) + + # Score is percent of allowed distance needed to find this match + ret.score = (1 - ((abs(ret.st_dist) + abs(ret.ed_dist)) / + 2) / self.matcher.params.bnddist) * 100 + # I think I'm missing GT stuff here + logging.debug("BND match -> %s", ret) + return ret + ############################ # Parsing and set building # ############################ @@ -316,7 +356,7 @@ def chunker(matcher, *files): is_bnd = entry.alleles_variant_types[1] == 'BND' - if not is_bnd and matcher.size_filter(entry, key=='base'): + if not is_bnd and matcher.size_filter(entry, key == 'base'): cur_chunk['__filtered'].append(entry) call_counts['__filtered'] += 1 continue @@ -358,9 +398,14 @@ def chunker(matcher, *files): sum(call_counts.values()), call_counts) yield cur_chunk, chunk_count +#################### +# Helper functions # +#################### + RC = str.maketrans("ATCG", "TAGC") + def resolve_sv(entry, ref, dup_to_ins=False): """ Attempts to resolve an SV's REF/ALT sequences @@ -390,3 +435,60 @@ def resolve_sv(entry, ref, dup_to_ins=False): return False return True + + +def bnd_direction_strand(bnd: str) -> tuple: + """ + Parses a BND ALT string to determine its direction and strand. + ALT Meaning + t[p[ piece extending to the right of p is joined after t + t]p] reverse comp piece extending left of p is joined after t + ]p]t piece extending to the left of p is joined before t + [p[t reverse comp piece extending right of p is joined before t + + Note that direction of 'left' means the piece is anchored on the left of the breakpoint + + Args: + bnd (str): The BND ALT string. + + Returns: + tuple: A tuple containing the direction ("left" or "right") and strand ("direct" or "complement"). + """ + if bnd.startswith('[') or bnd.endswith('['): + direction = "left" + elif bnd.startswith(']') or bnd.endswith(']'): + direction = "right" + else: + raise ValueError(f"Invalid BND ALT format: {bnd}") + + # Determine strand based on the position of the base letter + if bnd[0] not in '[]': # Base letter is at the start (before brackets) + strand = "direct" + elif bnd[-1] not in '[]': # Base letter is at the end (after brackets) + strand = "complement" + else: + raise ValueError(f"Invalid BND ALT format: {bnd}") + + return direction, strand + + +def bnd_position(bnd): + """ + Extracts the chromosome and position from a BND ALT string. + + Args: + bnd (str): The BND ALT string. + + Returns: + tuple: A tuple containing the chromosome (str) and position (int). + """ + + # Regular expression to match the BND format and extract chrom:pos + match = re.search(r'[\[\]]([^\[\]:]+):(\d+)[\[\]]', bnd) + if not match: + raise ValueError(f"Invalid BND ALT format: {bnd}") + + chrom = match.group(1) # Extract the chromosome + pos = int(match.group(2)) # Extract the position as an integer + + return chrom, pos From 36b87470ddf71ca7f5cf6cd0199ed2f3873b081e Mon Sep 17 00:00:00 2001 From: Adam English Date: Sun, 5 Jan 2025 01:09:56 -0500 Subject: [PATCH 09/10] adding func tests --- .../bench/bench_bnd/candidate.refine.bed | 64 ++++++++++++++++++ .../answer_key/bench/bench_bnd/fn.vcf.gz | Bin 0 -> 2819 bytes .../answer_key/bench/bench_bnd/fn.vcf.gz.tbi | Bin 0 -> 1532 bytes .../answer_key/bench/bench_bnd/fp.vcf.gz | Bin 0 -> 12672 bytes .../answer_key/bench/bench_bnd/fp.vcf.gz.tbi | Bin 0 -> 4650 bytes repo_utils/answer_key/bench/bench_bnd/log.txt | 61 +++++++++++++++++ .../answer_key/bench/bench_bnd/params.json | 1 + .../answer_key/bench/bench_bnd/summary.json | 26 +++++++ .../answer_key/bench/bench_bnd/tp-base.vcf.gz | Bin 0 -> 9187 bytes .../bench/bench_bnd/tp-base.vcf.gz.tbi | Bin 0 -> 4507 bytes .../answer_key/bench/bench_bnd/tp-comp.vcf.gz | Bin 0 -> 10812 bytes .../bench/bench_bnd/tp-comp.vcf.gz.tbi | Bin 0 -> 4500 bytes repo_utils/sub_tests/bench.sh | 7 ++ .../test_files/variants/bnd.base.vcf.gz | Bin 0 -> 9615 bytes .../test_files/variants/bnd.base.vcf.gz.tbi | Bin 0 -> 5876 bytes .../test_files/variants/bnd.comp.vcf.gz | Bin 0 -> 21006 bytes .../test_files/variants/bnd.comp.vcf.gz.tbi | Bin 0 -> 7258 bytes 17 files changed, 159 insertions(+) create mode 100644 repo_utils/answer_key/bench/bench_bnd/candidate.refine.bed create mode 100644 repo_utils/answer_key/bench/bench_bnd/fn.vcf.gz create mode 100644 repo_utils/answer_key/bench/bench_bnd/fn.vcf.gz.tbi create mode 100644 repo_utils/answer_key/bench/bench_bnd/fp.vcf.gz create mode 100644 repo_utils/answer_key/bench/bench_bnd/fp.vcf.gz.tbi create mode 100644 repo_utils/answer_key/bench/bench_bnd/log.txt create mode 100644 repo_utils/answer_key/bench/bench_bnd/params.json create mode 100644 repo_utils/answer_key/bench/bench_bnd/summary.json create mode 100644 repo_utils/answer_key/bench/bench_bnd/tp-base.vcf.gz create mode 100644 repo_utils/answer_key/bench/bench_bnd/tp-base.vcf.gz.tbi create mode 100644 repo_utils/answer_key/bench/bench_bnd/tp-comp.vcf.gz create mode 100644 repo_utils/answer_key/bench/bench_bnd/tp-comp.vcf.gz.tbi create mode 100644 repo_utils/test_files/variants/bnd.base.vcf.gz create mode 100644 repo_utils/test_files/variants/bnd.base.vcf.gz.tbi create mode 100644 repo_utils/test_files/variants/bnd.comp.vcf.gz create mode 100644 repo_utils/test_files/variants/bnd.comp.vcf.gz.tbi diff --git a/repo_utils/answer_key/bench/bench_bnd/candidate.refine.bed b/repo_utils/answer_key/bench/bench_bnd/candidate.refine.bed new file mode 100644 index 00000000..c5259f82 --- /dev/null +++ b/repo_utils/answer_key/bench/bench_bnd/candidate.refine.bed @@ -0,0 +1,64 @@ +chr1 181135 181156 +chr1 6005049 6006670 +chr1 224013761 224013782 +chr10 1238267 1238288 +chr10 39478703 39478724 +chr10 132505641 132506422 +chr11 964817 964838 +chr11 44662925 44662946 +chr11 48880455 48880476 +chr11 48888289 48888310 +chr11 68232223 68232244 +chr11 80583401 80583422 +chr11 105902622 105902643 +chr12 2572354 2572375 +chr12 10428997 10444441 +chr12 26566549 26566649 +chr12 106703356 106718437 +chr12 132242311 132242332 +chr13 56380894 56381040 +chr13 114073358 114074122 +chr14 102919538 102919632 +chr15 74894096 74894117 +chr16 1025231 1025252 +chr16 49626994 49627100 +chr16 89536459 89536480 +chr17 31964205 32004138 +chr17 77850848 77850938 +chr17 83120464 83120485 +chr17 83127668 83127689 +chr18 70465189 70465210 +chr18 78390326 78390347 +chr19 395626 395835 +chr19 3477781 3477868 +chr19 29439299 29439424 +chr19 38981201 38983536 +chr19 55068010 55068465 +chr2 9737589 9737610 +chr2 138335007 138335083 +chr2 157917136 157917157 +chr2 238119351 238119427 +chr20 16410045 16410066 +chr20 38428231 38428252 +chr20 62755268 62755289 +chr20 63443033 63443054 +chr22 31903282 31903303 +chr22 45328219 45328240 +chr22 47732364 47732476 +chr22 49494347 49494368 +chr3 112164423 112164444 +chr3 184714589 184714610 +chr4 1429347 1434609 +chr4 8631479 8637158 +chr5 71009525 71015235 +chr5 176031036 176031057 +chr7 23502979 23503000 +chr7 68922678 68950323 +chr7 75988853 75988924 +chr7 158151440 158151461 +chr8 48193098 48193205 +chr8 77023596 77040442 +chr8 143669349 143669370 +chr9 104414084 104414105 +chr9 136535716 136535737 +chrX 125901244 125901387 \ No newline at end of file diff --git a/repo_utils/answer_key/bench/bench_bnd/fn.vcf.gz b/repo_utils/answer_key/bench/bench_bnd/fn.vcf.gz new file mode 100644 index 0000000000000000000000000000000000000000..a3fc44a610bd07d3d93dfb7d9552dcc1c29a463a GIT binary patch literal 2819 zcmV+e3;gsSiwFb&00000{{{d;LjnMX1-)0xa@t4~U6ZfqiWk{n(EE`Zr3wSKned8* zUCD|PqJb_8wWhm;hkX6qmOy||Y*J2*H@4MB_uPB#t95m?AQ4_rwhn~%)V|#q4gJH_ z)orgo={|UW^*Y|T<@@yx<{=}AAT;(qwxS5ZTLLqVl7MqO|M&&oVR(TVjzjFNgh=@3 zW^*BuYr%pLH{x(c8gaC4#AMZ2(oOSW5B7s~5@Ft4l3>tLd_r(fH{zg4HP z2)GCu%b(zGNMk{kS%~3^sr3lQOR@4a!*NZ^(6ldS80~=3R981O_Z*||F{;hxDx&avd9OD!i!&G(0(yeohTVQlY zcMV&$&oQcU0O_`CSBj{r2au^amQ@MTjx1@msVfzssRyl9L$?fFb1Fawu@ze}bX%4CO^jA`Y>J3F!R*b*NZnWud~C>>P?C8L&)_P+M3(+?9$|BVWBBq&AHgWG=50 z2)xB?0~!U4rjT*4P)8Ac!K}iz_6KaINpfx*O7fk4%c8FK8&2NocV@f7@B7ieT!=6i{V;0V~nmMl=wmU_t?*>DLAZrPuvI}>61tq(q-If(E z6v1)CKf%1u^Dc0ym3#pkp#w!1fS8wLc#qwaWK%)1eBuZ?H7_f zWDx!Nu@j%a4+rB>Fz7Bi;dp2lyZ4>&bTW>i+e!!M2GOVo*}$%R7!L>0C>_MnA2b*S zNp#xl(w71)I^p0vPNFkfnBLxfUCox)yfc}u;@Q9P{IB`#&2qlFr(d#5^Y63r+SzP6 z{x)0Q-uy#z`+?s4^JhC;-7HtV`PbFWVmhOFwD^>p^^@VvYWjsn$?`6q{=Kw|Zt3(> z7m&5svDZ)9lXyU{u?Ig`o5%q_0uWqs6ygYuTWx;a`eo`!`$B_|1|4bcC0=rsqP7Q= zk^HKW^y%oLnJ~);Lq_-nGQ=!H3>o5}fLPWb7KcU*CB*DkXt&x0oQi?NDZPFsT)VD0 z$jdP3KMm*;B&*&gPk4Z*RiT#(qNGnN+=J;8`CG(^56aWZFvY31#+vE&GU+#4>&xjA z-{j?vjq=RuQOZ+zLB=yHV3)yx3l+j!tW)CW>Xh`5G2~h^3z|#PZD?&kwn0j*wbA;y zYydYlfE63S3~-qD0f9Ay@xX+6#Rq>`UYUaZkQWt zp8Nh(qEea}?tJ zRG}Zr7oRPD1#=4`F?|W@yK#j zVaRG2vX%f@;>flf0f4g-ONk%~I8mTr8>FyB3Vh2{N@8l?*^a{Rz;Y&yi}^}Z%zsD9 zD-b(l-h;gYbh2v;i6-LB>pD?N7Xjxwl6 zb_sH%In%x)%_&B$TT_GJ`_vg+CCxc1ISbnFgF!F~quxu!|GEgUCv(;^03_)*x_o1d>7*`b;{3V;;MOoA$S+%-!zD0lAw!Z)iOScIrtB-0l29@aVw* z1ac(gN;A%tt9~>gS1E z{e~W*0`mcFa+KUbr9YuHH5L0pg(}spQNWgKKS`1>2*Z9tqo5y#K@I91Y1pVr;%HF^ z3R~zWz=guHIfMOYiUy5JNwe7lmW#z|vkA)HuCZ?o8)1B3^R(q4cHYPvSt~wYT>pNG znrR`vkt^FaSz1djZAQ_R?d&=8#z6(#7>A8VCV(hKY6F62+>o`=SAt3SpW)I?u4!=@ z9}qCbC33Cpo((N>+jHB?n$Ez9~6%4ee{v^UF_IbM%lAJ%K)o z^m%~9^}RsSnmu3?6YgfY^&i0okSyyT001A02m}BC00030 V1^_}s0stET0{{R300000003cmWElVe literal 0 HcmV?d00001 diff --git a/repo_utils/answer_key/bench/bench_bnd/fn.vcf.gz.tbi b/repo_utils/answer_key/bench/bench_bnd/fn.vcf.gz.tbi new file mode 100644 index 0000000000000000000000000000000000000000..ca63a5c627c3807d0aa0ddbe7cfe14600abd25e5 GIT binary patch literal 1532 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 literal 0 HcmV?d00001 diff --git a/repo_utils/answer_key/bench/bench_bnd/fp.vcf.gz.tbi b/repo_utils/answer_key/bench/bench_bnd/fp.vcf.gz.tbi new file mode 100644 index 0000000000000000000000000000000000000000..2179aaebc68da950e82f9c08b2fad4a0f24772ad GIT binary patch literal 4650 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

y-`~9Y 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 literal 0 HcmV?d00001 diff --git a/repo_utils/answer_key/bench/bench_bnd/tp-base.vcf.gz.tbi b/repo_utils/answer_key/bench/bench_bnd/tp-base.vcf.gz.tbi new file mode 100644 index 0000000000000000000000000000000000000000..403bcffc94a75661b212bda8f922c8d78763af28 GIT binary patch literal 4507 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 literal 0 HcmV?d00001 diff --git a/repo_utils/answer_key/bench/bench_bnd/tp-comp.vcf.gz b/repo_utils/answer_key/bench/bench_bnd/tp-comp.vcf.gz new file mode 100644 index 0000000000000000000000000000000000000000..31fe05ccc4dce3b7c1f5c235423fe380abe7e01a GIT binary patch literal 10812 zcmV-CD#O(uiwFb&00000{{{d;LjnMH4ZT}gbK6D|epY@3Dt^drl_|}ARIO4aiZh7yy(v`Ssi2ff)d!F_UbqUjz$Z_w;mseGCA-d-t5A<~c8xadrB5 ze(}nV$#?JGU5u|DM)#-x7!ObH&L)%hLsQO*WK|`3cKZEUnnoa1nWBtVaao%A_dkM6 znXikPIh~kSQ>@EZbc{Eu&hzCm&gNH1W=^BQpo)tZQw^TtWppx+tN7$oo-Xs3yvSd# z;-{0#j|i!g%j6H2t3_OzW9Qy+t#2@x0i)( z6VUz&$_GzozEl0hlwa0mOip$?KB@1QCyO;~clz=Ed_mPT%cpT#P2((1e=C!6TAJ#( zDxQyPErTke1k~2cCE3g1b@qIa(SX|-J4@rFpeIWME}iD-I3-MJE*K#{_Ata^2-cJn-N(>9 z25Ut$=iGx~7J~?80P16SgHf1MMSOZhgONxfuB8Vf8w}T!0fzQ5s=+XhsS;H5F}lG} zMKzOH_AwY)5S3bbortjoaioOsf{3GuNKTPwYuNf4Gb$J*$^){_MiMb9u@7Xujj+}j zE8lXByEUTV1m=kvZrrUX;gT`z!8Gnxh)OWpr>Ai@R{~3cJrN;|w*`ZLSa>2r8fP;h zk=Du+ebV?E!hsbN9tZu)vPd9?AVd0?Um7)%5XrCya^0vAT=-l({WK;L;v`=2w15ho zFD=D6^5sb*B6}i~AnN1RUPAR3AyTN2i0+99p#*wc0;8S;LlDq_1nx@^f(^`)MJ+PGI}q;`V!b%1;}24_stR*Dn~%X6L$`k#8+phAFrT4fM+}+oNA9@Y%2n- z;gxhm2-4D5V)$+q4_7o1zAB;jTj}$WAtXHHY9#t=P^juGAkn8I1YY^VxECRPK2nXi zk6ru7`#g*g^_3*txLA8!jJ+=2%MjA%3&9xs8WzaxZ1YfGGyi^e>%e`F3})VX)U4Cb z7pkzY#95L4GE{q8y%q6fj3mmN`;AOLWuVDX-)8t;#6wM{VD9ntyuFO4SSrxu8%wa< zXASSM04tb?d`(gA7wU7GD5Sg_+RM;BsWB#;`zp=8)KFjDK+>0PR;JH3Xmh?gYeo9R z!7v#~-*nl?cnB)Em(*6KPaOu#33|X&Y!%idxJ;iq7{M&$p^laD)J{#MClRbjp9Jtb z-=Or%PJ(&r8l<3SFQ2om2t^RhhGH0#NE`)x>+E zvsmSln?Mf<+2DYg_pG&ta<^^}?@6zLBJC2;v6~r;*X*qStg?&#WEYvXoW{MEfSzlxC@5n497#(3d%LdB}qvQ0`#Bf;?1inbp37 ziG{iyoCl+&9A?$&9)L>6uP`KpsvK7i7UqH=xwSi*2;V$s)jC0_pGt0ycTyn!88JziAgF$eVr7mM>C}k*hwnap6jB+~-7!cIz z<^l6Phi#w?9So&z=|-UnOR1AG(CI>xtZ)-ip#Za}a7QB*YKc_1Lj=^Y5Y*Y0qM>F_ zr8+nSvQ3wet!~O<5*)jAYmQWbc0}E(RX?>0X?2-}Lvtk6E(eqfIm=CMpg@Q&+6kx|-y>P8)ZLX15?i^WY3S5N z-IC2nXn=(Co68m7t0@b0(^c>wl(bwG%)wUU4$YcWx+h;q-VoG1Ose2u?hYAJ>(D$x z+#WC9c>1t=4B9$N5%osf+CIr^O}kR#H)_W2L2j$ZL5U5RLEO_PXcnOa37qzQ4@xc8*`5$AbX=0m zEzMd<8lanW>85G$*@0v(FJNx^fqe7ApkGXI&nukiI}cGY1Eu#}w~d`!0+sN-Gq9S) zt9>Oeg$QSpY83#?JhQ;)!=u#)^{4Bu>$5xZiB4ym$NYqFso(?!7otAVH?QlV%J<&a zemcMT39Cl3jxoXYg;LDE=!bKQ?uP!;^#eJt1pzOGk_e-zloWIOs+~at=tip%!+a_b zshcbOgmqE#fdYfLbpvO`=oB*sDJ%tCa8$Pk`}k7zo&mH43C4=)`hqB71+nPA%V-HA z@CRk}1pt-(Oaf|2Zysn1LQRuO)E646YV*YdgQ+(t2!0fl%lZNi9;*2ag271s4M8|s z%Z;E06-_WGgulz1j#rTa0@fE$s*tpMl)dw>6=YKiCuzpW6sCGOuxKj=IznOs&dNYN zI5!|>KfM6A^iCNrXSjyA!S;YV5>9>2YQ6KJW$08v-4Gf!2b~*J7^2;l8<5lWdsr#t zwEp&}p0Dk5N6~xw+|CGCkQ4X`{e*~CaSn(nfdv&Desb84EvJxHZ-!ta#x$fF{8Ug+ zh!gT&2eo35cLD$u@(>0IEQCYqw<)#}Qxw-?5<|n&Hgc#p#=Bw|j+z3-?)m~ml`Rvf z{}`Yn$R!rKzEE1(vPAbU7S667Hd4dURr^cFp-D}B^}UN4-*mo*9A~8|da&W=yNWIgF6_h2unqfAnD~pywjWnh5>L`fFq)dKF7@p6@#(yJJH#q|8P>w@d}-+7T#ztw7A<06T( zDgyK7WweN2O|;GmlP2*~YNBPlTE$OE3Sh5((0%il762AxW>!o2HvpbFzkQtEK3tCO zJMPK9Ho9l^=aTV@@jGRFb8)-Tcy~WKA5TW_Z#GUnMeiSeTba{~G=6ETo;*fhlWGyI z3NuSe6Ft?jTjfbsm9SJ^%#$pxOc}-5Jle9ez0UahkFJy~|Lj_m$A@3;nuYLop-ELF zS!b#G#)d~#v7S}yB2M@2>ngk&-E{Pgv&y`fqRY?Pnp!1zJeoYV)tq16lLM?eUljQ= zFY~2|p7SCa-3*;ww>84OL(Ce1qgHvD)cfdhCypwj9XOq!n^f2zm&*z)#xSB0$MVk+!OH)PT z;f5NU|Ifiq9qpHQ2id+?yZunS_WL*Vo?m^QKq)%N=<{@4R#0_7W#amI`clNJZgIGo zOh#RQ`;<0~Diq1G8_I{#^e{gIa_@qtU2iITmX3#`>Eq4A{UP~6tG2GkorX9~ zVWx_ni!A|r8(lcs=$qOuo0Kb8(Bz(zS!3c^XMyN%m+1W^et${+-lhw%Yck6VbBHGZ zTkDU?T3|!)GFc{Ryq`#xbuH+Ws97~JzfKz1w_OAhHZL9h`xLDf!2kU=>*k%*4L!}F zrd4lQko<1`un8dZKU)6Y%x<@Tb#lPcrkI%x#b(K>$Y(H2?EYdUTJ3J_+EMj2k2ZgL z@`F3hblPzh7u7H+s~DVlNQC#;{UT3L!Z)k@P)1P4fKT}nmRqjC0VPz8-L0}-r!!P! z^Z&!b`?=rl7{WG8o}a(%=^C{w4p93x;fA$0>(*hd*V_8Gy}-wZO~*TAPai?QV z>GO@cGJ1|vSZfXqsmh})&j!m{e7TzeYRxd7-d-O;^Enz1kM2hoM{saE`uX$O)zS6@ za#XK;v@LZ|k8%K8i%>0$L zlzKm?On^#j(ksBL)oR*;1H%v$SsM%S+8bHBzy|v9xvy$=bDG_(8II%-HpOW+i_KHF z?yJtd{r1NXdS|SOCYZGQ_1)j!efZn2umA1&QytuEy?efU{{7n@Klr^j(M9X?_q(8W zFUrl$?#0XN?%B=tlbct=f4sQ9f{#4;Lm94LKYMz0G>mz2GrTO%pWa;k?sss`i$7fj z_2k9x%gy!8^#G^C*BceR{p5{T)@A?X_b;yWlNWD4-n{#toA-Zt|I?cf??3+IO3|VB z|NCxoj81#`?(HAp8-IH9SNI!Gc>4a&e}>ahM(6MJfT-nF!EBJrc5BvU4`&Z@P_dnv()0g|FuXgI6 z_1y1T7#^;jtz&Ryns^$Yk~d%!m#zVJlCGU9a-Z0`+% z?W@FsUJQb@i5j$-nVK1=LwIefoiQNZ$yueXZ#6VDke*ta`Aoe3`R}hket5Ge*~zKk zqyChPhqd5O&PclBjGUf~M|LjkcF8JDCnMuz9sD=+-GKl1T^afw z55VD4`T_nN3LJ#D;8FTgIyeX3>fliZI1S#0XFP8h3Lb|+Iy?X$?@ufF8<`{UNf+IU z7;^v@?ejXUdKrE6So4a@s`fdfYEZeV=CDr;J~*t}XRqx{igRdiCSoKZmXWfW3NhgL z?CJIESI>u+SHsJ1t`~y<4Nz)hTbzG%CE|j65zXb?i|i3rf2MXoSYzB8lczCdi1B7 zQzAH$-pGllPjD5+hmhSVZ}g6S)5S6*5JnNqtKO(H4znb_dQN^Hs>o)eQ-ZZPLs=(B zD1V0_<1Arv$m;K&w}OlV>C=JPN;nWms+0euv&t5%k~%d5cg(?D%yR{Ei8BDt`t%Ig zoG=e#B_4q2%u_hvz<0G)2c>7m$wLHirg0*dtYbSsz8EU$YKcgBPmNet_^i`rZeSZC z#%CDVgpt!m-rT@1;NXBK@E2E8)RTQ6?~qTYr>-MgMplU}9-1Q@nG6oPm3Un}n!>K5 zKgWN1_8##+G`sj3EnPpbF{Tp{0~(vJps@WK#C8t+`GIXP`K9=}!z)CrdNFK-3mh&3 z8@^7??F*kn*GTRwe-C~$+3B7x1>IdXn-$1joaDk5o7`naN^t7L*p8N%0N^VJ)ah+R zpT3`cY?@s>jeaPN4I}lP*l-z}ee(v^UrA8(aN-Dc_h)qaw0~+Jx2(9A|pZiudvRcE2Ojd*YXkkAYC%) zg+dyW!;zkpCPfwOsdo}~cik8|^rU^*xkoU1QbVX~I>xHw7(}8K4&PaWh~62x`cnqh zN2KUbXVT9Wz1)eCEo?RDdnqMAYH1J?L03qT30*h6frh7N9OO5nKI3-=wjzjPoq7Iw zeBoV{D!Dwm1im)5XY|FS{@6u|3C3Jn?j9 z;oylCG+%N@VI55->vBd}Yz+a%i|9zEb|$!auTzRM2~TF@&Kk z3Xx?JCJ7EHGOQskPeflcH1s8%1e0_nC~!sIWGhuzuxQ#Dik=M^9g&m|VOChC#~&#x zw=fQ+0z$uTVCj`exUh_}M?oJi{2S@Z#Va6vLW2s{JW|hN(`u9VcshGA;C;snfdr>c zR5j_MT-bZ!St_zPB(=qO@^9{oz`z&7E2!HxuiAh`C|^H&-h+4i;*U31s6h8VMGxxL zKf)If>MUo#w9%OFNv$#9(#9GX=5wvbwh^Y-#H`0Ayn`Dg1Ptlm8Cz#l4n7_k5AVTv zl$zWa4s%Nr0D{(Y{&D=Lh{MUEz#h*a4rgCPC6W5-`>Li$P9??3o^3h!x+IXDh~mLB z?gw5Vl46mJOwGfzJ+=kL7`G@4)+XztZA`3Wy(A2JnpwG@ELcqN)ANcW5v@36Bnno- zRKIi1E35rn5L~t(2&C^s5y48NSVh)r&n~~HSu%j^adf;qMRQPgtB4@gl`Y1)XMbBl zs=mHBazOgqN0%O#imm8nf0x+mo}rb%N`lS?g5!-+bBeSHK&DizjRYp_PSu4vtgVQi zzep_Ez?z=$Dq=T!u@N$1GR5Nf-RrTv=zK~`i_Ym3AV6qba><^~3f)ulT1~4>uWkcH z%t=^#*obhJmm4yHk`A+t2p_yTKmGwjMH>+~kkM%)`a$}L^{G*1LD;#l?O^V`m*yuh zQfkMpQjmOBQy8_j!fWum%GWxkbR9C7`^x&d3#Dr-eYr^K`r-*oOL<|tnioDr>+-vp zb%co0%tSNBmOZk>q%IsN+2$>>nBZexskTTRcf%I8$nH&In#w9g>UK3!*M6GuF!&$B z8g?#(n7y5Cpa<<5Hqea^OiqEJl2IqvaubyqKXPSd zu1kU=h^JSKV^kprH)kCNqgpaY#;|8d9j#}9{jJm-9jLpKB7jVRb_r!6! zsLAHI6`KP%2HYf5HH+!N9bz1{hu;pr-_Fdq$zfz{fwj`OO{l@zf8V@Gh9ljkY#l{) z#{1-q$)Av-V*q9$9^Kv#`_i0k?Z^ z#`Y~q9O-UblJKQ5!5q5>n}d}-$+`a3TYHj#zNR@?*^_i06-P*w8}9a=<{<8ZQ!eS5 zj}^elYB6G(y(}0hD7$II3^*n_ULt*!@5DMfp*B3_Ec{B&0>UPTDC$(*e*;K{5yqtR zF^uVa7=x=ICfplp^i=PJYFMI*J2iDwj}t+U+#J?rj?F|kJq4$JB{)_4$aF4UVYNXx z_i?AQ&LP^_?i}jg^Ko^CT~!<@>N&DY3qPxnAeL*C&$#5Ot~yz*n{%FgRew%+Y9MxNV9EWBnL0$H851t&TN*~ScptjYW2SClJ|A~Ccqh5 zl>7m|;ty0O7NhK$a=2XVbNsWYfV+ae6Q9LUcY_uVM zQapsws3!?6bTA$GM+{f=Dp(ub9Ij*=>R$eA|A6!0Qc ziILe|H@Jj{A}j~le(rgXYhc#5Y;`e(LH5)KB98U41rPt6!RAhJIW%%0)tI{atQqE0 zQc7k#td|S0lvabIjfIH6N@>h4<}lxGOi>xycb2*9?#x*FJYxO-n|oP43oBy~?nz-b z)M0_iV0=Eavnsi>D`VwG>Fax?$k#F4vcBY`Gj_UcUtQI;&W8GGI*MO&FqHngRm&;3@LXuqL zu$n64y)a+vO}vp*nN~a8Hnld*JrmUsV|Xo_HaJr9n?P!a7J~K7nVN@oOps@^$}&2t zhYo&keFf2b?Twj6!8aNA9++fA)WmJwxy&Q#J~xj@n052*)8RY&ko0e0%^z}sk?h1lAI0Edgn~W zU1B>k0Fl^E8^uy*JvydgGk;ww6gY$671mOz#dN(i?}dYJL7=8IxMKnra*wHw z>Qd0u@o*9i@<+KIK%$S42w7?KLq&m$DmwXchITYVo!G-p$^!YH-?mCV>^i$sdAws2I)}Qx?C^P^Lk-lh>I$y z!d{9N>%4F!#vsvcksnRd-gC)}csX)NavVbAl}LCb^s?~Ml`@yO6M)Ih;M$C?)WW|HHV zsqFz|p6P80qa{I6YL%h%9iULV>qZxGkYXiXhg=0Th{s5u>FQ-OAyf=NDy{EmTupzEZdyVfw)-B^~E?QRB~<3;OO11xE64& zn(WOnCV^Wm&e2uhwSya`;4ad6zGQX#BXi_knMJfG`=S7}`D(qs-FaX6JSfYUO*Mjc z_Sl{$&K!PioNCBYK*T_fYW4|WQ(M$h_(o6}+_RyDhW5}|3WIK{Ik$@qwPp$jl`wLi zZV{uZP6+#vJaso-)V*}Vm*zZ~@K}Fk)@kJ@7*B|9SwN)9rtj)*~aL~6T0hnLLLwVyjLsy76ebTLTbGH<_x(kM`RA0Yd zUO&lQ)~%{Q> z%jazqw>;}qp0!b(6)5xLMgpAKha|JEL$KI&V?OQ12F_V?IMLT|Qi{oIXuLN4C6`+ScxWF+WCJrR8J;K8-2 zi5M69aKtI$C)_KTpfa@eDm2+|JM3qJ%WFkkoWhbEJ@>#|ORML|i9#MIFVlI?4ZXrr z)!w}uk4?Zr+hkX5lT8Sgt6j0f7#o;fvPNsC=k1sjSY>Wl^57c}oc)sw7bh@ygPHqt zNJXu5?x64G;D3-!9&Ud?8KsWf4|ZG+-;vTEq#r}iy&E|DAzh9nYeB1(%|=aZP$r_E zWZJk{L(fbS-qV+AT^UZ2p8R>)RhlcK2iHcIS4L-S-A!1n_1Hkr*9)Nq<|Seo%0+tzf*wsq%_ZO7^kycd8KAhGp4 zwxO8;nVKlya!&;qNkeqBg<}Glvd%Q#Q(>{`@dX^2366AkkM$DT<9jNYn$fVku{G+g z2CCy7W$b?JvU;cfsayAyIqILfl*#zg?FgtcbgeM-boW$nsDsKn`T6ZX3@F_85-%Dk zZq;}Mm8{FAvBV=SWigVwcO}xn=XU6GyY+k!Z@{OK5t#QO9AJbMIB$FoFgB1vykv-J zq`Xy@*C`~g#2W8^G#aT2Xifuk$SNt`d)JZAPGVs=3OrOIe5D z+>H2Zn(8*CmWu}RMz`Xcl7p#?jr&3mU(H3uTevQiFjIYQ40}x><`sHw6!VyRv!OV(^uTv84po>6IHE z{qVQHzQ(PyU*G-LU*7%vaS=?T!267?HRbLkXS6JIt|G#XCo6w^g+5!SIEcTe*r4&iSX}r1jb)X@gjE zx!Hr2Cm_=fBK~ZHo@ZWivf~~wwjaQI6@un%-UFtAW_!R(q-5|^HORszgN?17H}^?u zt*{jIDOi^?DFJO$Xz4WSlXPuDSd+sFYdeQECxVsl$(4Nq#TZh19tFoS&H1d`p;G+9 zo4ygvR9sJ11Mh+Mszypq8W90jT0_{ar=2gpc>xhVx5fJA#c2?~c`-JP zO||z0_GrnI-WRtLeDI5Yc=wmrV8VWS|Mtzt_rLsnqAQM9;OU+U@a^66-7%jQT?p}} zxWk|8YByqp8rOG)s2`@OzN>?%z>mNi6@!`X3cUj0?fGs(FsGe_wLTdS2Cve71>U(- zhsFJbscMMegyB;aEk=Bb1#>?P z?Bp?(^pVf=o;g}Ow|EOsGm~J07@HAef@wt;W5{4eH3HFCsJfUO1eInOTTWY@hp`6Z ze>Z^!HLjyJt-W&N?GzTk98bHukLGvrfeQ{BLY$D4flq8@Dn?tGnA-U%hP|mm49+LG z^^<#fqoT$_&9fCX!j#0{)iES@Z$<5`!rrC%w@{*=aEla7vF*k*9H zLjdTu(8p{x72J@K@39q3G-F3acT3*H^tQnHmSUJ&wGC$?VeE@fEA7cNbttNu7HLFs z*Hnd-*hz(XCAPyTt-&X&Kw=ALuhMoUcJvNZ*XI?&Q-zFN$#~ME)fhC8rHTjqWE&jd zb1ExbnREDJ1F<=Kq1C`ZF>ZFuRUX2v&{z(dmhKUh@&%LsT2URNTHmQUDt3SnH)sLU z<6TExJ_0hg^vbd|<%&(WQrHR(;53~e;%m)YFJuDo;N^N{DXL^ts|{acm{r$mH{On3 z?=U)#e!dHhyP!>Xpp=dPFjCrXt)M&v#m&6hu#{#Amu&gUWyK0z-M2d=g!p7;JNvL~8}d~K zsX3H6hoO?$+)K3<`#rSY5IHaPYn^3I?CRZ3H~Zm7GVXD`OToOyXw=fB;9H0^lfzo9 zIgF+OM(kkA@feJh^OmO$r`eR)ZCwCMaZ-*yU<%MfhN^K-iYDqMI z4KbYiu^^h?=(zHHUgOgBzv&{E#mCsO=ki?S#in8b{Ryw`vu$(11wx&~*3#j)kC?~C zoYGEG76?TR;Q7y$OK4FpK1AWW1g|JGU+24|Xgn5n{KhDkn$p{PJ-i|UgdR!%c*CY=LL+>_XN2xGKqA>6~17;`&R23s;oGU|1C zcZ<`c4%0+=FTIiYVhYVj@KU3^Yh?SznAJ?+b7<%&ujRJHJXF@r92)!}M4U}@g@<#R z6FDbo#W?{04H{TA(l>EC?f(G4jNg%QkpKW6iwFb&00000{{{d;LjnLB00RI300000 G00013%mjk~ literal 0 HcmV?d00001 diff --git a/repo_utils/answer_key/bench/bench_bnd/tp-comp.vcf.gz.tbi b/repo_utils/answer_key/bench/bench_bnd/tp-comp.vcf.gz.tbi new file mode 100644 index 0000000000000000000000000000000000000000..3452be0f6fea291a96d44e2260ca0b81273b32e4 GIT binary patch literal 4500 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 KVE!x2!tY<|kVoIEz1vwW^5N!2 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 literal 0 HcmV?d00001 diff --git a/repo_utils/test_files/variants/bnd.base.vcf.gz.tbi b/repo_utils/test_files/variants/bnd.base.vcf.gz.tbi new file mode 100644 index 0000000000000000000000000000000000000000..316860d09ef856165d23cb747b2599338e856815 GIT binary patch literal 5876 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 N0{{R300000004c_Ff9N8 literal 0 HcmV?d00001 diff --git a/repo_utils/test_files/variants/bnd.comp.vcf.gz.tbi b/repo_utils/test_files/variants/bnd.comp.vcf.gz.tbi new file mode 100644 index 0000000000000000000000000000000000000000..51a529b8dc383317b31312da346d9178237b1c78 GIT binary patch literal 7258 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 literal 0 HcmV?d00001 From 957e16a94b4849ca8635be628f1c2cc7121255f4 Mon Sep 17 00:00:00 2001 From: Adam English Date: Sun, 5 Jan 2025 02:10:19 -0500 Subject: [PATCH 10/10] prototype complete --- imgs/coverage.svg | 4 +- .../answer_key/bench/bench_bnd/fn.vcf.gz | Bin 2819 -> 2980 bytes .../answer_key/bench/bench_bnd/fn.vcf.gz.tbi | Bin 1532 -> 1880 bytes repo_utils/answer_key/bench/bench_bnd/log.txt | 54 +++++++++--------- .../answer_key/bench/bench_bnd/params.json | 2 +- .../answer_key/bench/bench_bnd/summary.json | 32 +++++------ .../answer_key/bench/bench_bnd/tp-base.vcf.gz | Bin 9187 -> 9041 bytes .../bench/bench_bnd/tp-base.vcf.gz.tbi | Bin 4507 -> 4455 bytes .../answer_key/bench/bench_bnd/tp-comp.vcf.gz | Bin 10812 -> 10623 bytes .../bench/bench_bnd/tp-comp.vcf.gz.tbi | Bin 4500 -> 4450 bytes repo_utils/sub_tests/bench.sh | 2 +- truvari/bench.py | 20 +++---- truvari/matching.py | 9 ++- 13 files changed, 60 insertions(+), 63 deletions(-) diff --git a/imgs/coverage.svg b/imgs/coverage.svg index a9915353..ea71b13a 100644 --- a/imgs/coverage.svg +++ b/imgs/coverage.svg @@ -17,7 +17,7 @@ coverage - 89% - 89% + 90% + 90% diff --git a/repo_utils/answer_key/bench/bench_bnd/fn.vcf.gz b/repo_utils/answer_key/bench/bench_bnd/fn.vcf.gz index a3fc44a610bd07d3d93dfb7d9552dcc1c29a463a..1dcb017f325407b3680a0561f6eed363284615ae 100644 GIT binary patch delta 1569 zcmV++2HyFD7Ni%jmj!l8hqK}7aMX`KerkV@&)-M=;UMgH?%L7t z)Gc-%+R@2qIEGF$9iSh?gDzwPxAI|l+K&h6U>yHJgVQjHPr4oYP@qLS>YtC3_>2~& z-|oN9Z)R7#J(|wPH~)-p|GfQnJ-eMh&>y*_+kbD$YiBpp;g6fyx9h)Y?k?!we)-~t z^Xu8Xd;5KUeK&u-p?Q4wxiIS`r`Pl8R~jX=`|Wd&lfZ^TeS%zlMdv$cX#G4MEL(93^>>((^~If=sF%YeQ>vg$B- z!XrGL3WHP-C4D;K?oFS_4-qFmDo-cF6sKAmYo^;t(yO=Dx6>ycZ;*N<1%4$p9Hct~GO@xg_02&IV))q|{nltzXLqFt-6*vjNNiM@1hH zSV0)~OqhSK`M}Ryw;4_2gFaUa)fQkrqS`k!RZ%6^1AqyeVdm5V|M@9Ir8G0hlVq1L zlLAa$74Y{C)7B|-6((l!KBKAGPWO4zE7GirPX|DAqcj!KB$TMFPoJc4G@Uj9T7Xh1 z5L!(3UP$SkgnhPx6>_X>iPhRAS7At{{p*`QOK6#At6XOKu6sUeCE=hOpZ-Qv zb6y!*I$c2PX5$OLcP&HJCRQD~rBD`af%QYq`ff|sYb03(N!An~OElS%CIE0&A}SHY z3RDy*SPmAJV1X~eN=brs$6BzQN$YDUrKyH`N85UZXk)=7BkQ(($pjW;HDX3qGEN_) zitK;(S-?}-GA8Qa8hZY#a7kFW3Rf!>Pk@WHa7{oKid-@8uNu8-<9@YV<9<=DG)tj2 zKpC)}D&0&l!SQYNx>G|{<Fn3q)jd@kF z`ufZp$SSBSkY+P=YiyA^I_j_mb!|L#PBp@!?_v>*p|bZfsV@?ev#|9(?1zIW?!HxR zTb19wwdUC)sRM!L8)!G(?*cDSgrl&(a1upPuD4LNKf^)U7s}dK37ZNBSc_)8XeECu zvpdPk8gfY5HrJ^uop>dB-<&A*9cQaw_nx>kRREUwG)X2}%u8J@c>7=gMH_ub~inPs@Ks;b^= zj%%!eq&rcTrk>aV=Xq+%*Lqw$kJVL8u3geI<*&39=piF|0u73E zmr7i`d?Bs56IL(^)iwGG6000000RIL6 TLPG)o8vp|U0000000000wH58B delta 1380 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 jp8xAi55$TF_ zN1j6ZApMb3x&1oTw%)EV2%~FooTNtd_LsW3FdNfX`#)5_AhPL*-e4+qq2h5Kxe~JQ z=_^@E-ZEpw)k9!N-B@8+ z;u&%fKA+C_I4JP$OHaN^qw6>ck>mHj@^O^xP#uERZ@wU|2O6qZllOZolm;4_QD?MX zIv-y#B^neHfmuq#yuo!j58jBkc(8Vo{aLNNVXd5$x!1Y z%9TMoKJnd$fhmw(6Rbv5b;tIBOm@nA1Q1$`HyMWr@eb9MrS0_^<#}(S;z^JwS2;QR ztUoT3df@uz3t9^!Cx$Y?h`(xm{_-$LRv;fc@-Kk&=JqLkPw$oGxcy&z*1%)x85o_j z(wm~^h;&15g*OuZ0O2F&yGP-ZMdnej4t_<@p)KJ;glBU-s&FE?4_x)5EQ}G!-Yy+Q zb`)~}gtsMI0YX9mwG4TG-*Gq)*AR$waC@D%GcL2)Ojyv9bY!L$7fTxB zw66)4h%pe^#ZJUu8&uvh6i^Fo&^px@9js9e`d|shKqS@24GM|$4+Rwpq$uF=f~FH= zT~1;76Rl5+#*kPP|8fNog(oD}&%o%MZ%A30kTu0Pj+(naiG(g1|smW`b1LV)(Y{#@}poa2(}Rc?85 zh@6y*CV47K8Mt1Ay=}Pl@uL_mPIln3cACBh1*w%*mEY@p#DAsI6h*<_b2|(E_ERoM z$F|kmh*Ju#&p@P9qSHOH)Z0i&N38nM_A@o~UV}H0!c>w0CAXn4wFZbOlN=0VRff`r z(H2-N46b4fczA8S)>t5=k1bZhSd8$~wb`Qv&`TohVn?0~Aatp3Vv^@>-}}rn$ou#G zcb${=ZjLW@c6N=*dpTz)GVta`Vv^}u)!lb%jfl5xH7v8LERe61S216eGPcoO6F+iO zH-#MGJYT%&JpN`?q5gENN?}QUBL!?b6}!_MMja))T`7Xe zThi}QKxM>Y*peNo1bO~LmHobn9^La8mX`u$`Z zQVfEB3mH5XI`u?yp>?z-q6lWZVmeL_nWx3H&>vE!Iai7OpTlO`DDIa$q954_K?e}} zN|@a*3~0AMdY0F?{lok5P1;B6taL&|eorVXDLKm(pjgfQOrN%)$f5YC`|d~zkYcG| z(bGJBE+=bAisc*1_5o4amHsN|xXaUW*F!3*^`<}~-1|+n!>fEVdeyaWr2^2AcMs=Z z80z`DREOB~GImN3_9f4U+eV?nzdYHqE*qS00Z@942aa*PaE(#kl4wAR|AA|m%Xx$U z19tQ|SqH73{eMR8+^Kt>z5#xFoTE9-%`TfmOW_HgB@eVon;iG^n7A3l1rAH{K@WfH z zC~aORAFt~3*ki|Fm}2MOC<>S^hSB`Kj2V8l_CHEr>O#T-R&)U~mzU-kqIdoEo>ThU z8VAG-w@H0e6gvqRtPT*UR}Lc`KJ#o8W4p_n&CD+Z=A>UPe_t z?}QArgpqYeBY_CS=BsIWQTqm>y+XjZ!E;q-U0kP`9>k(flfScF-g`@Np`E8lD+eNl2>J1nk;XKw^*{L zqSbY6HT^kk9=xs;+jM5OtSwggt$Kzjz~qf$R!L| zE*3uE*nE0JkU?BR=03ML>$9AKLrQK$ic7ItiHu7OFgqq25nC`22=OWCw`(E>Tm3|W z%P+Bq=9Jk9`t#m>q2QCWyTbt zC+D1e7ABSSf2*EBUz@G;m@0cBn@=5`k1Xn8y;UMK5tXbJtHF4?GTKs;H#1JdW`DpT zPoFeMrG`ki;N?TJP{Y*SM4kMaK=iG5c(`(<%5*|A813Y(eFa{ydS@bNL?2oT$hs*< z=^syJrl<9&9_|#_$4<&4%4XdG0C^bMQW0DC{w=17e5v*KR)kG#&rVdz*XkA=pR*^-GB;g>IT`{drpD zc~f-yd7tzx_~8i~TqWI4!YA((T5-%!ax^-6s&U>ei<&QG217NIb*QwqK5Yc~ZguOA zjd23a$WHswN38!GKlH1gZ}&7m7{Tag5&U4E7dv3tHx}gkvqAR{4(Bf07nP-LfdIHH zyjt0*>A*Y?%WMVg<_8$HJ`qaRNP69IPE2CA0v+j_96)%ncvfW{Z3$@9>0jUT7z`!p V`N^B9ht_^8kOXjj|FXjR`v*!Cvh4r> literal 4507 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 diff --git a/repo_utils/answer_key/bench/bench_bnd/tp-comp.vcf.gz b/repo_utils/answer_key/bench/bench_bnd/tp-comp.vcf.gz index 31fe05ccc4dce3b7c1f5c235423fe380abe7e01a..a7c2e365b220f834b1d7a917f88034eed3d86644 100644 GIT binary patch delta 7198 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 delta 7388 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 O0Kkmjk#UieVJRLZt$mIF diff --git a/repo_utils/answer_key/bench/bench_bnd/tp-comp.vcf.gz.tbi b/repo_utils/answer_key/bench/bench_bnd/tp-comp.vcf.gz.tbi index 3452be0f6fea291a96d44e2260ca0b81273b32e4..b77233a14bdd253b0ca593247dd07f7f8056286a 100644 GIT binary patch literal 4450 zcmbtYc|4Ts7awccN+r3W5t7Q9Cdo2J*-|t_BSm$SWJ@K>VA`ZhvK5!i=&HD`b((A$ z6e{}^mtl-u{9?vv2GeT>cM#Vyb^rLy=l#5&=Xu}roO8bCoaa2>dBNdp`9ZV489|WI zAzqLi50#{ASz#z4@DUp;c?1Dcxv8mWXt8FqfYI2#>xW&VUW!UqShlVY_S$Qd?yB5i zb}e#WFfqB)%9mMTzRNj@nXBE>*4cq~>dJ?l4=a377=|#;RLEBFl=r;$O3GE2paLeWRTMiT-2kKski$l z4-+E^C>ktA(R|s}F-_B4{$z!~+;sY+w!(i)Ehw%oWAS||$}9!VfI#3C0ouw#CF@@{ zf{P1&99*BcGfc!RR_XO^x$|BdPDaV%8|AwN8(WXG$ft);j8ESQS$_}av14PD))k#P z?Q1>R-PwZ1XKDw+mb!>54xOTd4c8m4cH1`WrG?}$qHThDFlFdfR2amsYouU z!p#hY4Ey&-1doC5jB5O*$GqyODo-fs&fqL%7jF=p#BtoAN| z`92? zTj9S8sAQtcbxyx^R+;Kqn<&8B%j)(cdpkLpRtJ-Q;869gk~*`wcRJ6TlU5-4*_4I3 zyj&&fgL%TRQp#?FL_8#Xth5$ckR1QztEA@SBr2=XdkklAp={U(MWCix%&h~Ur96oz z=r-ISCV;5#utFd?QIG~WD&+%dCLrN9^!}ljib&nvjrkt!|KEkWD*9s$)Pfw>_EIl& zw98R$o(+Mh9ate=n7F`4+kG2jbq{aSQGHW6T>iHsUg?4RyHk{RN4MOAiK@Km6H{3~ z-C)VLiIS_5r&e#cJXWhSZXP3ZixFU1V4d3RBHeZa+)(2?9%`-B{6T5ti5fmfp1>sf z_!*dBf^?Y8#+fsSNX8I&x-4XObTwL|j= zA5229+uV%u>VC+6O|#SFr{}-OHj?}V)uZ;V(Xc(`)oqNwX-D!Cu+y-+87F16Nk{5{{q!Ee8`J}Sk2n)YOBZsAlqcx0x=fx}#wb>o?d`H%iVDyj(0;}>5dCRD&c@YQ@GQ{v zDRX+Q3dFe`mD* zypEf^Uac(k95&tqHD$iIZUR-{{^MF+T+J-uGbpVBxVgy&QAwPF)|3E!RQ5wZKD+0B z)}Ma8>pZ<9_K>&bdv^1l?-4zCv%+sw>}rY}LP%YF+ssZV;34M&h5QQ5T3Sk+tR^G& zF%FugHx;5yNAPQPhpSFHSBBd9$(WWROp=J&#gAS`JhMll)bl=gNR0!Sz=qGCOtT47 zNlFBnSxv$8@neS;QUqiH>o+ae&o!^K%p(g+xJ%Qw(5x%zR@}gU15ukbg?TkOyIDCC z{rGW6MC<+R$2DqeCnUGQMkU()gd=-o@ri{R{No_`A?dY|fMV=**U9v(zL(p%8=H59 z?n23P(=<2ae6}}REx7?-!$WO{3-iD^dwV-( zbi}!(+g@l_jB#s-lJjO9*s8|F{msS)4P-%rFksoiYA%{d+MKjY(BAf4;bPC}zXRM= z1T6A1u4QH0eLg2y!q6i>`Z`T2a{;@NJoc{072C4d9tTdGFk%ho#_FHc2}6IH+S_TB zF=|air_zw&qliHpwfc^A&yugYcB*+@T;3c2%ch2{9B4C5V>I3+5LX!CKCQM2;42jI z)#Vn4DG-$m6NbU0){Opv@aB7gIA!kutu7Y{^|#06V!e4kE06RE)@0-eS=8JPwrR?t zK^gURLa9Tk0q$YT=*4%_sPfuJUAbon=k~lXp=LeEMBFQO>_^-Gon~ApYZ~lm9CRj> z1@A9{<`5!xL6RG)Sq@)(WCTAY)2e9+W8f0*02TnV>)3;<=@lF0wPQhI$@)?k?ELJ4 z-x^7aua~)@=i`v9@8y5#oPu3g#BFrePH_)+$_f4uf$);sxy(^v$9hsj&3nW98Ec|c z1NnNQg;0}*X3Zj4yC-3R$c|MzuR4`dnJ07aV_4@zIuWW!j29<;VyRIHX$Kkh1bEFL zx%YRQh=^q3SyINVz|YC)BngEHf6}!3E_#>Tg-lS9+b38fF0lHZY}c5+xNRGT6OLW zBLc3-z_0N1F}uHd&y@HooGuf^l7g%jtxlJOx7I7&l@EZXX1d3WiR9s}uNd($X$XBg6llu7ojX4pq;+^(5uvTF0X(q(}NzeH}>s zmhBQw18Nzw=8_(&pJ_UW;szcMqSj!AZW@a7zaf$M;2YLu$C#HqnN~rgpv~N|G>o+Eaynkw%SpJ zZ|3H_IESBX_q+|`@Zeiz8zs`y|IGT|<|_wAV9KtaWKu@7^=01v@yRUisFI;I(QtRC zVr=}>4HvK6w)z97WVcAiu$!~T@sU#d(`xJ1WsD`AAu=5*p8^bTq~}zke?4)U0>u2B zQO$>;vwc$Q){n8#9S!m@%ncO-=N`A+K;Q6oh>gDwV@zo=Svl9coE?V~olFLNyy~eY z@ejBwnRzn4KM{rNd>T9Vo({)=(wk3kC2VH%gbgkZ`slSER{8v;*|WEM{KUTUW8N6S zVaLq$jJN8FtnU`1Tn)eJ^0ihY6D#h{o8i^X_=aPoImVrvxqjlZihA0DAJe}eea<|v zXiLw|k@vkSi&5(Xm~0m+@xZoMkOi6VrEtdkIFSmgGZ{$gpE}kmV?0e&n}`k77~F#k zhKTsqUesgu22Ru((2n)voG>Wae0@%~0bK@quGkq4DnCd*8#++tIQOo9f=bNum11J| zF{;q2UXd%^sE!xgn4WS-lD^wLbH#}TcuM`a6rNenbcY%Up zQr4z$t1S3zUz}&YzhU9IoA|N9i03$Qud~ANSFg5M$^C9*ykomioU6OO^+UM{M?-P) zXy9RDjfo^%@FH}eE1|99hW}Ai)(Pt9U$Z@8y2!$|t4sNXE#N2H#yIAu5y2V{G+??R zogC{{(1`kLc|$vg;e3U@(rsgE?s*D?ueCvb*kAk~7T+0l)uz{mO2uDoK|3Maqa)u( z6O?+|?fQ$R1Ensa&$sLxFxc}MiKJFeo{ndMsfRIyYNpOKyMe4-#(agVnx_=QEi(yA z&ekWcErs)i6~lJLP#5~GE9T2;QiY;jIyxW9{atN$S5yFJ%3dD~f~k7?aEqwzEEyJ? z`$H#sHr`(D&qIw9bv$cKS^EZ*eM1*{>g)hDb#Rg1at0GD2VUN9n+hJ9uKq|M4dR>o Is4{!|2Wo$)lK=n! literal 4500 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 KVE!x2!tY<|k %s", mat) base_matches.append(mat) match_matrix.append(base_matches) diff --git a/truvari/matching.py b/truvari/matching.py index 500c0a7f..070b6be5 100644 --- a/truvari/matching.py +++ b/truvari/matching.py @@ -259,7 +259,7 @@ def build_match(self, base, comp, matid=None, skip_gt=False, short_circuit=False return ret - def bnd_build_match(self, base, comp, matid=None, **_kwargs): + def bnd_build_match(self, base, comp, matid=None, *_args, **_kwargs): """ Build a MatchResult for bnds """ @@ -271,7 +271,7 @@ def bnd_build_match(self, base, comp, matid=None, **_kwargs): ret.state = base.chrom == comp.chrom ret.st_dist = base.pos - comp.pos - ret.state &= abs(ret.st_dist) < self.matcher.params.bnddist + ret.state &= abs(ret.st_dist) < self.params.bnddist b_bnd = bnd_direction_strand(base.alts[0]) c_bnd = bnd_direction_strand(comp.alts[0]) ret.state &= b_bnd == c_bnd @@ -280,15 +280,14 @@ def bnd_build_match(self, base, comp, matid=None, **_kwargs): c_pos2 = bnd_position(comp.alts[0]) ret.ed_dist = b_pos2[1] - c_pos2[1] ret.state &= b_pos2[0] == c_pos2[0] - ret.state &= ret.ed_dist < self.matcher.params.bnddist + ret.state &= ret.ed_dist < self.params.bnddist self.compare_gts(ret, base, comp) # Score is percent of allowed distance needed to find this match ret.score = (1 - ((abs(ret.st_dist) + abs(ret.ed_dist)) / - 2) / self.matcher.params.bnddist) * 100 + 2) / self.params.bnddist) * 100 # I think I'm missing GT stuff here - logging.debug("BND match -> %s", ret) return ret ############################