diff --git a/Dockerfile b/Dockerfile index 280cc51..b1fb939 100644 --- a/Dockerfile +++ b/Dockerfile @@ -50,6 +50,7 @@ ENV PATH="$VIRTUAL_ENV/bin:$PATH" COPY annotate/ annotate/ COPY README.md setup.py requirements.txt requirements_dev.txt run_tests.sh ./ +RUN pip install setuptools==57.5.0 RUN pip install --no-cache-dir -r requirements_dev.txt COPY tests/ tests/ #COPY .coveragerc . diff --git a/README.md b/README.md index 1632308..7bc1dea 100644 --- a/README.md +++ b/README.md @@ -22,31 +22,34 @@ This project hosts scripts to annotate VCF files using user defined driver genes ## Design -Uses [bcftools], [tabix] and [bgzip] in user's path , these are part of [htslib] or can be installed separately +Uses [bcftools], [tabix] and [bgzip] in user's path, which are part of +[htslib] and [bcftools], and can be installed separately. ## Tools `annotateVcf` has multiple command line options, listed with `annotateVcf --help`. ### annotateVcf -Takes vcf file as input along with driver gene information, and optional unmatched normal panel vcf and outputs VCF with added DRV INFO field. + +Takes vcf file as input along with driver gene information, and optional +unmatched normal panel vcf and outputs VCF with added DRV INFO field. Various exceptions can occur for malformed input files. ### inputFormat - * ```input_vcf.gz``` snv or indel vcf file annotated using [VAGrENT] - * ```normal_panel.vcf.gz``` normal panel to tag germline variants - * ```lof_genes.txt ``` list of known loss of function [LoF] genes along with previous gene symbols ( to make sure all gene synonyms were matched with input vcf) - * ```cpg_variants.tsv.gz``` list of variants in cancer predisposition genes to tag germline predisposition variants - * ```filters.json``` filters to be applied during driver annotations ( see default file ```filters.josn``` in config folder) - * ```driver_mutations.tsv.gz``` tab separated driver mutations along with consequence type - * ```info.header``` vcf header INFO line showing driver and cancer predisposition annotations... + * `input_vcf.gz` snv or indel vcf file annotated using [VAGrENT] + * `normal_panel.vcf.gz` normal panel to tag germline variants + * `lof_genes.txt ` list of known loss of function [LoF] genes along with previous gene symbols (to make sure all gene synonyms were matched with input vcf) + * `cpg_variants.tsv.gz` list of variants in cancer predisposition genes to tag germline predisposition variants + * `filters.json` filters to be applied during driver annotations ( see default file `filters.josn` in config folder) + * `driver_mutations.tsv.gz` tab separated driver mutations along with consequence type + * `info.header` vcf header INFO line showing driver and cancer predisposition annotations... ### outputFormat - * ```_drv.vcf.gz ``` output vcf file with DRV info field and consequence type if known, LoF in case annotated using LoF gene list, -CPV info field is added if variants in cancer predisposition genes are provided. + * `_drv.vcf.gz` output vcf file with DRV info field and type of driver + instance (germline and/or somatic) overlapping with variant location. ## INSTALL Installing via `pip install`. Simply execute with the path to the compiled 'whl' found on the [release page][annotateVcf-releases]: @@ -55,25 +58,26 @@ Installing via `pip install`. Simply execute with the path to the compiled 'whl' pip install annotateVcf.X.X.X-py3-none-any.whl ``` -Release `.whl` files are generated as part of the release process and can be found on the [release page][annotateVcf-releases] +Release `.whl` files are generated as part of the release process and can be +found on the [release page][annotateVcf-releases] ## Development environment -This project uses git pre-commit hooks. As these will execute on your system it -is entirely up to you if you activate them. +This project uses git pre-commit hooks. As these will execute on your system +it is entirely up to you if you activate them. -If you want tests, coverage reports and lint-ing to automatically execute before -a commit you can activate them by running: +If you want tests, coverage reports and lint-ing to automatically execute +before a commit you can activate them by running: ``` git config core.hooksPath git-hooks ``` -Only a test failure will block a commit, lint-ing is not enforced (but please consider -following the guidance). +Only a test failure will block a commit, lint-ing is not enforced (but please +consider following the guidance). -You can run the same checks manually without a commit by executing the following -in the base of the clone: +You can run the same checks manually without a commit by executing the +following in the base of the clone: ```bash ./run_tests.sh @@ -102,6 +106,7 @@ source env/bin/activate # if not already in env pip install pytest pip install radon pip install pytest-cov +pip install pyvcf3 ``` __Also see__ [Package Dependancies](#package-dependancies) @@ -132,8 +137,9 @@ pip install --find-links=~/wheels annotateVcf [htslib]: https://github.com/samtools/htslib [bcftools]: https://github.com/samtools/bcftools + [pyvcf3]: https://github.com/dridk/PyVCF3 [tabix]: https://github.com/samtools/tabix - [VAGrENT]: https://github.com/cancerit/VAGrENT + [VAGrENT]: https://github.com/cancerit/VAGrENT [travis-master-badge]: https://travis-ci.org/cancerit/annotateVCF.svg?branch=master [travis-develop-badge]: https://travis-ci.org/cancerit/annotateVCF.svg?branch=develop [travis-repo]: https://travis-ci.org/cancerit/annotateVCF diff --git a/annotate/commandline.py b/annotate/commandline.py index 76b800f..62c22b4 100644 --- a/annotate/commandline.py +++ b/annotate/commandline.py @@ -49,8 +49,6 @@ def main(): - usage = "\n %prog [options] -vcf input.vcf [-filter -np -gt -g -m -lof -hl -o ]" - optParser = argparse.ArgumentParser(prog='annotateVcf', formatter_class=argparse.ArgumentDefaultsHelpFormatter) optional = optParser._action_groups.pop() @@ -90,14 +88,12 @@ def main(): optional.add_argument("-q", "--quiet", action="store_false", dest="verbose", required=False, default=True) optParser._action_groups.append(optional) - if len(sys.argv) == 0: - optParser.print_help() - sys.exit(1) opts = optParser.parse_args() if not opts.vcf_file: - sys.exit('\nERROR Arguments required\n\tPlease run: annotateVcf --help\n') - print("Annotating VCF file") + optParser.print_help() + sys.exit('\nMissing ivcf/--vcf_file argument\n') + print("Annotating VCF file") # vars function returns __dict__ of Namespace instance my_formatter = formatter.IO_Formatter(**vars(opts)) outdir_path = my_formatter.format(['outdir']) diff --git a/annotate/config/filters.json b/annotate/config/filters.json index 2668ccb..df73bca 100644 --- a/annotate/config/filters.json +++ b/annotate/config/filters.json @@ -9,9 +9,11 @@ "INFO": "INFO/VC=\"stop_lost,start_lost,ess_splice,frameshift,nonsense\"", "INFO_FLAG_GERMLINE": "NPGL" }, - + "driver_type": { + "DRV": "somatic", + "CPV": "germline" + }, "exclude": { "None": null } -} - +} \ No newline at end of file diff --git a/annotate/config/info.header b/annotate/config/info.header index 6cf0f2b..263fb98 100644 --- a/annotate/config/info.header +++ b/annotate/config/info.header @@ -1,2 +1,2 @@ -##INFO= -##INFO= +##INFO= +##INFO= \ No newline at end of file diff --git a/annotate/io_formatter.py b/annotate/io_formatter.py index 8cadb40..55bda4f 100644 --- a/annotate/io_formatter.py +++ b/annotate/io_formatter.py @@ -84,6 +84,8 @@ def _get_formatter(self, input_type): return self._check_input elif input_type == 'vcf_filters': return self._get_filters + elif input_type == 'drv_type': + return self._get_driver_type else: raise ValueError(input_type) @@ -94,7 +96,7 @@ def _check_input(self): """ input_status = check_inputs({'vcf_file': self.vcf_file, 'normal_panel': self.np_vcf, 'mutations': self.muts_file, 'lof_genes': self.genes_file, - 'cancer_predisposition': self.cpv_file}) + 'cancer_predisposition': self.cpv_file}) if input_status['vcf_file'] is None: sys.exit("Please provide input vcf file") return input_status @@ -106,10 +108,17 @@ def _get_filters(self): """ load parameters from json config file """ - inc_filters = ['FORMAT', 'FILTER', 'INFO', 'INFO_FLAG_GERMLINE'] - formatted_filters = parse_filters(self.json_file, 'include', inc_filters) + formatted_filters = parse_filters(self.json_file, 'include') return formatted_filters + def _get_driver_type(self): + """ + get driver types from user provided json file + :return: driver type dictionary + """ + driver_type = parse_filters(self.json_file, 'driver_type') + return driver_type + def _get_outdir_path(self): """ formatter function: add default output directory @@ -119,8 +128,6 @@ def _get_outdir_path(self): os.makedirs(outputPath, exist_ok=True) return outputPath - # generic functions .... - def check_inputs(file_dict): """ @@ -150,7 +157,7 @@ def get_file_metadata(full_file_name): return file_metadata -def parse_filters(json_file, filter_type, filters): +def parse_filters(json_file, filter_type): """ load filtering parameters from json config file """ @@ -160,7 +167,7 @@ def parse_filters(json_file, filter_type, filters): sys.exit('Json configuration file must be provided') with open(json_file, 'r') as cfgfile: filter_cfg = json.load(cfgfile) - for filter in filters: + for filter in filter_cfg[filter_type]: filter_param_dict[filter] = filter_cfg[filter_type][filter] except json.JSONDecodeError as jde: sys.exit('json error:{}'.format(jde.args[0])) diff --git a/annotate/vcf_annotator.py b/annotate/vcf_annotator.py index fac5ec7..8c33422 100644 --- a/annotate/vcf_annotator.py +++ b/annotate/vcf_annotator.py @@ -35,11 +35,15 @@ import re import io import copy +import vcf + +from vcf import utils +from collections import defaultdict from subprocess import Popen, PIPE, STDOUT, TimeoutExpired import pkg_resources ''' - This code runs bcftools to annotates driver gene and variant sites + This code runs bcftools and pyvcf to annotates user provided driver gene and variant sites ''' @@ -61,6 +65,7 @@ def __init__(self, f, basedir): self._set_input_vcf(self.input_data) self.drv_header = f.header_line self.merge_vcf_dict = {} + self.annotated_vcf_list = [] self.keepTmp = f.keepTmp # run analysis self._runAnalysis(f) @@ -78,6 +83,9 @@ def _runAnalysis(self, f): self.format_filters = vcf_filter_params['FORMAT'] self.filter_filters = vcf_filter_params['FILTER'] self.flag_germline = vcf_filter_params['INFO_FLAG_GERMLINE'] + drv_type = f.format(['drv_type']) + self.drv_type_dict = drv_type.get('drv_type', None) + run_status = False a_type = ['normal_panel', 'mutations', 'lof_genes', 'cancer_predisposition'] @@ -161,9 +169,9 @@ def annot_drv_muts(self, muts_file): f" -a {muts_file} -h {self.drv_header} " \ f"-c CHROM,FROM,TO,INFO/DRV {self.vcf_path} " \ f" | bcftools annotate -i 'INFO/DRV!=\".\" && INFO/DRV[*]==INFO/VC' " \ - f" | bgzip -c >{muts_outfile} && tabix -f -p vcf {muts_outfile}" + f" | bcftools sort | bgzip -c >{muts_outfile} && tabix -f -p vcf {muts_outfile}" _run_command(cmd) - self.merge_vcf_dict['a'] = muts_outfile + self.annotated_vcf_list.append(muts_outfile) def annotate_lof_genes(self, genes_file): """ @@ -194,7 +202,9 @@ def annotate_lof_genes(self, genes_file): # write matching LoF genes.... if gene.upper() in lof_gene_list: lof_fh.write(line) - self.merge_vcf_dict['b'] = compress_vcf(lof_outfile) + # compress and store vcf + lof_outfile_gz = compress_vcf(lof_outfile, sort_it=True) + self.annotated_vcf_list.append(lof_outfile_gz) def annotate_cpv(self, cpv_file): """ @@ -210,12 +220,78 @@ def annotate_cpv(self, cpv_file): f" -a {cpv_file} -h {self.drv_header} " \ f"-c CHROM,FROM,TO,INFO/CPV {self.vcf_path} " \ f" | bcftools annotate -i 'INFO/CPV!=\".\" && INFO/CPV[*]==INFO/VC' " \ - f" | bgzip -c >{cpv_outfile} && tabix -f -p vcf {cpv_outfile}" + f" | bcftools sort | bgzip -c >{cpv_outfile} && tabix -f -p vcf {cpv_outfile}" _run_command(cmd) - self.merge_vcf_dict['c'] = cpv_outfile + self.annotated_vcf_list.append(cpv_outfile) + + def _get_vcf_readers(self): + """ + create vcf file readers for each annotated vcf file + :return: list of vcf file readers + """ + vcf_readers = [] + for my_vcf in self.annotated_vcf_list: + vcf_readers.append(vcf.Reader(filename=my_vcf)) + return vcf_readers + + def walk_and_write_vcf(self, vcf_readers, vcf_writer): + """ + walk through each line of vcf files, matching records will be walked together + get_key paramter val will determine the matching of sorted VCF lines + vcf record e.g., 'chr17_7675139_C_[A]': {'somatic': , + 'germline': } + :return collection as above + """ + for record in walk_together_iterator(vcf_readers): + # print(f"{tuple(map(str,record))}") + drv_type = set() + vcf_line = "" + # filtered_record = list(filter(None, record)) + # iterate through vcf record from each file... + for vcf_line in record: + # get driver type from info line ... + drv_type_info = self.get_driver_type(vcf_line) + drv_type.add(drv_type_info) + vcf_line = self.set_driver_type(vcf_line, drv_type) + vcf_writer.write_record(vcf_line) + vcf_writer.close() + + def get_driver_type(self, vcf_line): + """ + get driver type for given vcf line + :return: + """ + for drv_type in self.drv_type_dict.keys(): + if vcf_line.INFO.get(drv_type, None): + return drv_type + + def set_driver_type(self, vcf_line, drv_type_info): + """ + set driver type for vcf line to False + :return: + """ + for drv_type in self.drv_type_dict.keys(): + if drv_type in drv_type_info: + vcf_line.INFO[drv_type] = True + else: + vcf_line.INFO[drv_type] = False + return vcf_line def concat_results(self): + """ + process and concatenate the annotated vcf files... + :return: + """ + annotated_vcfs = self.annotated_vcf_list concat_drv_out = self.outfile_name.format('_drv.vcf.gz') + # combine annotated vcf files... + vcf_readers = self._get_vcf_readers() + tmp_header = f"{self.outdir}/tmp_header_file" + (vcf_writer, combined_vcf) = _get_vcf_writer(annotated_vcfs[0], tmp_header) + self.walk_and_write_vcf(vcf_readers, vcf_writer) + combined_vcf_gz = compress_vcf(combined_vcf, sort_it=True) + + self.merge_vcf_dict['a'] = combined_vcf_gz self.merge_vcf_dict['f'] = self.input_data['vcf_file']['path'] vcf_files = ([self.merge_vcf_dict[myvcf] for myvcf in sorted(self.merge_vcf_dict.keys())]) @@ -256,13 +332,15 @@ def get_drv_gene_list(drv_genes): return lof_gene_list -def compress_vcf(vcf): +def compress_vcf(vcf, sort_it=None): """ :param vcf: :return: """ outfile = vcf + '.gz' - cmd = f"bgzip -c <{vcf} >{outfile} && tabix -f -p vcf {outfile}" + cmd = f"bgzip -c {vcf} >{outfile} && tabix -f -p vcf {outfile}" + if sort_it: + cmd = f"bcftools sort {vcf}| bgzip -c >{outfile} && tabix -f -p vcf {outfile}" _run_command(cmd) return outfile @@ -278,6 +356,58 @@ def create_dummy_genome(input_vcf, genome_loc): _run_command(cmd) +def ace_tuple(string): + # Split on runs of digits, keeping the digit strings + digit_split = re.split(r'(\d+)', string) + return tuple( + # Convert odd indexed elements from strings to integers + int(ele) if i % 2 else ele for i, ele in enumerate(digit_split) + ) + + +def vcf_key(r): + return ace_tuple(r.CHROM), r.POS, r.REF, r.ALT + + +def walk_together_iterator(arg_Readers): + """ + re-written by James to replace utils.walk_together from pyvcf + iterator to return matching vcf lines based on the vcf_key + Input: vcf readrs + """ + + vcf_Readers = [*arg_Readers] + nexts = [None for _ in vcf_Readers] + rkeys = [*nexts] + + while True: + # Fetch records into nexts[] + for i, reader in enumerate(vcf_Readers): + if reader is None: + continue + rec = nexts[i] + if rec is None: + try: + nxt = next(reader) + nexts[i] = nxt + rkeys[i] = vcf_key(nxt) + except StopIteration: + vcf_Readers[i] = None + # Exit loop when there are no records left + if not any(rec is not None for rec in nexts): + break + # Get the smallest key in the list + min_key = min(k for k in rkeys if k is not None) + # Return the records which match smallest key + matching = [] + for i, key in enumerate(rkeys): + if key == min_key: + matching.append(nexts[i]) + nexts[i] = None + rkeys[i] = None + yield matching + + def unheader_vcf(header_vcf, unheader_vcf): """ This is used for testing purpose only... @@ -290,6 +420,19 @@ def unheader_vcf(header_vcf, unheader_vcf): return unheader_vcf +def _get_vcf_writer(my_vcf_file, tmp_header): + """ + :param my_vcf_file: + :param my_vcf_header_file: + :return: my_vcf_header file + """ + cmd = f"bcftools view -h {my_vcf_file} >{tmp_header}.vcf" + _run_command(cmd) + vcf_reader = vcf.Reader(filename=f"{tmp_header}.vcf") + vcf_writer = vcf.Writer(open(f"{tmp_header}_combined.vcf", 'w'), vcf_reader) + return vcf_writer, f"{tmp_header}_combined.vcf" + + def _run_command(cmd): """ : runs external command @@ -301,24 +444,21 @@ def _run_command(cmd): raise ValueError("Must supply at least one argument") try: - # To capture standard error in the result, use stderr=subprocess.STDOUT: - cmd_obj = Popen(cmd, stdin=None, stdout=PIPE, stderr=PIPE, - shell=True, universal_newlines=True, bufsize=-1, - close_fds=True, executable='/bin/bash') + # Need to set pipefail on shell to capture non-zero exit of intermediate commands in pipe + cmd_obj = Popen(['bash', '-o', 'pipefail', '-c', cmd], stdout=PIPE, stderr=PIPE, text=True) (out, error) = cmd_obj.communicate() exit_code = cmd_obj.returncode - if (exit_code == 0): - logging.debug(f"Command run successfully:\n{cmd}" - f"OUT:{out} Error:{error} Exit:{exit_code}\n") + msg = f"\nSTDOUT:\n{out}\nSTDERR:\n{error}\nEXIT:{exit_code}" + if exit_code == 0: + logging.info(f"Command run successfully:\n{cmd}" + msg) else: - logging.info("Error: command exited with non zero exit \ - status, please check logging file for more details") - logging.error(f"OUT:{out}:Error:{error}:Exit:{exit_code}") + logging.error(msg) if exit_code != 0: sys.exit("Exiting...") return except TimeoutExpired: cmd_obj.kill() (out, error) = cmd_obj.communicate() - logging.error(f"Unable to run command:{cmd}: Out:{out} : Error:{error}") - sys.exit(f"Unable to run command:{cmd}: Out:{out} : Error:{error}") + msg = f"Timeout running command:\n{cmd}\nSTDOUT:\n{out}\nSTDERR:\n{error}" + logging.error(msg) + sys.exit(msg) diff --git a/requirements.txt b/requirements.txt index e4afd41..9469fa0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,3 +12,4 @@ toml==0.10.2 tomli==1.2.2 tzdata==2021.5 tzlocal==4.1 +pyvcf==0.6.8 diff --git a/requirements_dev.txt b/requirements_dev.txt index 3c51098..fa0b000 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -12,6 +12,7 @@ pyparsing==2.4.7 pytest==6.2.5 pytest-cov==3.0.0 pytz-deprecation-shim==0.1.0.post0 +pyvcf==0.6.8 radon==5.1.0 six==1.16.0 toml==0.10.2 diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100755 index e69de29..0000000 diff --git a/tests/test_celline_vcf_input.py b/tests/test_celline_vcf_input.py index a750a5d..fcc5405 100755 --- a/tests/test_celline_vcf_input.py +++ b/tests/test_celline_vcf_input.py @@ -11,6 +11,7 @@ ''' class TestClass(): + configdir = os.path.join(os.path.dirname(os.path.realpath(__file__))) test_dir = configdir + '/test_input/' test_out = configdir + '/test_output/' @@ -36,11 +37,15 @@ class TestClass(): format_filter= "FORMAT/VAF[*] > 0.15" filters_filter= "FILTER=\"PASS\"" info_flag_germline="NPGL" + driver_type = { + "DRV": "somatic", + "CPV": "germline" + } # celline output muts_vcf = f"{test_out}/celline_muts.vcf.gz" lof_vcf = f"{test_out}/celline_genes_lof.vcf.gz" drv_vcf = f"{test_out}/celline_drv.vcf.gz" - my_formatter=formatter.IO_Formatter(**options_vcf_celline) + my_formatter=formatter.IO_Formatter(**options_vcf_celline) outdir_path=my_formatter.format(['outdir']) def test_celline_vcf_input(self): @@ -78,7 +83,7 @@ def test_celline_info_flag_germline(self): assert self.info_flag_germline == vcf_filter_params['INFO_FLAG_GERMLINE'],'test_INFO_FLAG_GERMLINE test OK' def chek_celline_outdir(slef): - self.test_dir + 'tmpout' == self.outdir_path + self.test_dir + 'tmpout' == self.outdir_path def test_celline_vcf_formatter(self): f = self.my_formatter diff --git a/tests/test_input/filters.json b/tests/test_input/filters.json index e6b985c..6ea0411 100644 --- a/tests/test_input/filters.json +++ b/tests/test_input/filters.json @@ -9,7 +9,10 @@ "INFO": "INFO/VC=\"stop_lost,start_lost,ess_splice,frameshift,nonsense\"", "INFO_FLAG_GERMLINE": "NPGL" }, - + "driver_type": { + "DRV": "somatic", + "CPV": "germline" + }, "exclude": { "None": "NA" } diff --git a/tests/test_input_lof/filters.json b/tests/test_input_lof/filters.json index e6b985c..6ea0411 100644 --- a/tests/test_input_lof/filters.json +++ b/tests/test_input_lof/filters.json @@ -9,7 +9,10 @@ "INFO": "INFO/VC=\"stop_lost,start_lost,ess_splice,frameshift,nonsense\"", "INFO_FLAG_GERMLINE": "NPGL" }, - + "driver_type": { + "DRV": "somatic", + "CPV": "germline" + }, "exclude": { "None": "NA" } diff --git a/tests/test_input_no_vaf_vcf/filters.json b/tests/test_input_no_vaf_vcf/filters.json index 5dd082c..dc243bc 100644 --- a/tests/test_input_no_vaf_vcf/filters.json +++ b/tests/test_input_no_vaf_vcf/filters.json @@ -9,7 +9,10 @@ "INFO": "INFO/VC=\"stop_lost,start_lost,ess_splice,frameshift,nonsense\"", "INFO_FLAG_GERMLINE": "NPGL" }, - + "driver_type": { + "DRV": "somatic", + "CPV": "germline" + }, "exclude": { "None": "NA" } diff --git a/tests/test_input_no_vaf_vcf_cpg/filters.json b/tests/test_input_no_vaf_vcf_cpg/filters.json index 5dd082c..dc243bc 100644 --- a/tests/test_input_no_vaf_vcf_cpg/filters.json +++ b/tests/test_input_no_vaf_vcf_cpg/filters.json @@ -9,7 +9,10 @@ "INFO": "INFO/VC=\"stop_lost,start_lost,ess_splice,frameshift,nonsense\"", "INFO_FLAG_GERMLINE": "NPGL" }, - + "driver_type": { + "DRV": "somatic", + "CPV": "germline" + }, "exclude": { "None": "NA" } diff --git a/tests/test_output/celline_drv.vcf.gz b/tests/test_output/celline_drv.vcf.gz index 1521a89..5854134 100644 Binary files a/tests/test_output/celline_drv.vcf.gz and b/tests/test_output/celline_drv.vcf.gz differ diff --git a/tests/test_output/celline_drv.vcf.gz.tbi b/tests/test_output/celline_drv.vcf.gz.tbi index 6e33dd9..f80ac2a 100644 Binary files a/tests/test_output/celline_drv.vcf.gz.tbi and b/tests/test_output/celline_drv.vcf.gz.tbi differ diff --git a/tests/test_output/input_drv.vcf.gz b/tests/test_output/input_drv.vcf.gz index 9dccb4b..bc07411 100644 Binary files a/tests/test_output/input_drv.vcf.gz and b/tests/test_output/input_drv.vcf.gz differ diff --git a/tests/test_output/input_drv.vcf.gz.tbi b/tests/test_output/input_drv.vcf.gz.tbi index c04143c..93c061f 100644 Binary files a/tests/test_output/input_drv.vcf.gz.tbi and b/tests/test_output/input_drv.vcf.gz.tbi differ diff --git a/tests/test_output/input_genes_lof.vcf.gz b/tests/test_output/input_genes_lof.vcf.gz index bed1231..1ca72b6 100644 Binary files a/tests/test_output/input_genes_lof.vcf.gz and b/tests/test_output/input_genes_lof.vcf.gz differ diff --git a/tests/test_output/input_genes_lof.vcf.gz.tbi b/tests/test_output/input_genes_lof.vcf.gz.tbi index d7bcf5b..e52b4c6 100644 Binary files a/tests/test_output/input_genes_lof.vcf.gz.tbi and b/tests/test_output/input_genes_lof.vcf.gz.tbi differ diff --git a/tests/test_output/input_muts.vcf.gz b/tests/test_output/input_muts.vcf.gz index ea1cc4e..b7049f1 100644 Binary files a/tests/test_output/input_muts.vcf.gz and b/tests/test_output/input_muts.vcf.gz differ diff --git a/tests/test_output/input_muts.vcf.gz.tbi b/tests/test_output/input_muts.vcf.gz.tbi index 1d5e00c..b3b47ea 100644 Binary files a/tests/test_output/input_muts.vcf.gz.tbi and b/tests/test_output/input_muts.vcf.gz.tbi differ diff --git a/tests/test_output_lof/input_drv.vcf.gz b/tests/test_output_lof/input_drv.vcf.gz index fd52a5b..7ab19f3 100644 Binary files a/tests/test_output_lof/input_drv.vcf.gz and b/tests/test_output_lof/input_drv.vcf.gz differ diff --git a/tests/test_output_lof/input_drv.vcf.gz.tbi b/tests/test_output_lof/input_drv.vcf.gz.tbi index eec9523..120870c 100644 Binary files a/tests/test_output_lof/input_drv.vcf.gz.tbi and b/tests/test_output_lof/input_drv.vcf.gz.tbi differ diff --git a/tests/test_output_lof/input_genes_lof.vcf.gz b/tests/test_output_lof/input_genes_lof.vcf.gz index a6b37d2..49aa53d 100644 Binary files a/tests/test_output_lof/input_genes_lof.vcf.gz and b/tests/test_output_lof/input_genes_lof.vcf.gz differ diff --git a/tests/test_output_lof/input_genes_lof.vcf.gz.tbi b/tests/test_output_lof/input_genes_lof.vcf.gz.tbi index 983ac03..643c83a 100644 Binary files a/tests/test_output_lof/input_genes_lof.vcf.gz.tbi and b/tests/test_output_lof/input_genes_lof.vcf.gz.tbi differ diff --git a/tests/test_output_no_vaf_vcf/input_drv.vcf.gz b/tests/test_output_no_vaf_vcf/input_drv.vcf.gz index 4d83284..701192c 100644 Binary files a/tests/test_output_no_vaf_vcf/input_drv.vcf.gz and b/tests/test_output_no_vaf_vcf/input_drv.vcf.gz differ diff --git a/tests/test_output_no_vaf_vcf/input_drv.vcf.gz.tbi b/tests/test_output_no_vaf_vcf/input_drv.vcf.gz.tbi index a576936..68bfc2f 100644 Binary files a/tests/test_output_no_vaf_vcf/input_drv.vcf.gz.tbi and b/tests/test_output_no_vaf_vcf/input_drv.vcf.gz.tbi differ diff --git a/tests/test_output_no_vaf_vcf/input_genes_lof.vcf.gz b/tests/test_output_no_vaf_vcf/input_genes_lof.vcf.gz index 7c0e10b..3ad70b5 100644 Binary files a/tests/test_output_no_vaf_vcf/input_genes_lof.vcf.gz and b/tests/test_output_no_vaf_vcf/input_genes_lof.vcf.gz differ diff --git a/tests/test_output_no_vaf_vcf/input_genes_lof.vcf.gz.tbi b/tests/test_output_no_vaf_vcf/input_genes_lof.vcf.gz.tbi index e9182b3..0095113 100644 Binary files a/tests/test_output_no_vaf_vcf/input_genes_lof.vcf.gz.tbi and b/tests/test_output_no_vaf_vcf/input_genes_lof.vcf.gz.tbi differ diff --git a/tests/test_output_no_vaf_vcf_cpg/input_cpv.vcf.gz b/tests/test_output_no_vaf_vcf_cpg/input_cpv.vcf.gz index eb2410e..965acc9 100644 Binary files a/tests/test_output_no_vaf_vcf_cpg/input_cpv.vcf.gz and b/tests/test_output_no_vaf_vcf_cpg/input_cpv.vcf.gz differ diff --git a/tests/test_output_no_vaf_vcf_cpg/input_cpv.vcf.gz.tbi b/tests/test_output_no_vaf_vcf_cpg/input_cpv.vcf.gz.tbi index efd9492..f8f9b01 100644 Binary files a/tests/test_output_no_vaf_vcf_cpg/input_cpv.vcf.gz.tbi and b/tests/test_output_no_vaf_vcf_cpg/input_cpv.vcf.gz.tbi differ diff --git a/tests/test_output_no_vaf_vcf_cpg/input_drv.vcf.gz b/tests/test_output_no_vaf_vcf_cpg/input_drv.vcf.gz index 0c6502c..4323db3 100644 Binary files a/tests/test_output_no_vaf_vcf_cpg/input_drv.vcf.gz and b/tests/test_output_no_vaf_vcf_cpg/input_drv.vcf.gz differ diff --git a/tests/test_output_no_vaf_vcf_cpg/input_drv.vcf.gz.tbi b/tests/test_output_no_vaf_vcf_cpg/input_drv.vcf.gz.tbi index 614236a..db60ebc 100644 Binary files a/tests/test_output_no_vaf_vcf_cpg/input_drv.vcf.gz.tbi and b/tests/test_output_no_vaf_vcf_cpg/input_drv.vcf.gz.tbi differ diff --git a/tests/test_output_no_vaf_vcf_cpg/input_genes_lof.vcf.gz b/tests/test_output_no_vaf_vcf_cpg/input_genes_lof.vcf.gz index 83cfea0..25e2045 100644 Binary files a/tests/test_output_no_vaf_vcf_cpg/input_genes_lof.vcf.gz and b/tests/test_output_no_vaf_vcf_cpg/input_genes_lof.vcf.gz differ diff --git a/tests/test_output_no_vaf_vcf_cpg/input_genes_lof.vcf.gz.tbi b/tests/test_output_no_vaf_vcf_cpg/input_genes_lof.vcf.gz.tbi index b53a42c..43b6adc 100644 Binary files a/tests/test_output_no_vaf_vcf_cpg/input_genes_lof.vcf.gz.tbi and b/tests/test_output_no_vaf_vcf_cpg/input_genes_lof.vcf.gz.tbi differ