From 200ee4e74315f559f764fa78e2d9a7faa92da5e6 Mon Sep 17 00:00:00 2001 From: Domenico Simone Date: Tue, 30 Jun 2020 15:42:41 +0200 Subject: [PATCH 01/31] modules/genome_db.py: circular genome --- modules/genome_db.py | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/modules/genome_db.py b/modules/genome_db.py index f40f7cd..8dfd867 100644 --- a/modules/genome_db.py +++ b/modules/genome_db.py @@ -42,24 +42,34 @@ def get_gmap_build_nuclear_mt_input(n_genome_file=None, mt_genome_file=None, n_m mt_n_fasta.close() #return True +def get_mt_header(mt_genome_file=None): + """Gets seq id of a single-contig fasta file""" + mt_handle = SeqIO.read(mt_genome_file, 'fasta') + return mt_handle.id + def run_gmap_build(mt_n_genome_file=None, mt_genome_file=None, - gmap_db_dir=None, gmap_db=None, log=None): + gmap_db_dir=None, gmap_db=None, log=None, mt_is_circular=True): """ gmap_build -D {params.gmap_db_dir} -d {params.gmap_db} -g -s none {output.mt_n_fasta} 2> /dev/null | gmap_build -D {params.gmap_db_dir} -d {params.gmap_db} -s none {output.mt_n_fasta} &> {log} """ #print("Input files provided: n_genome_file={}, mt_genome_file={}".format(n_genome_file, mt_genome_file)) # nuclear + mt db + c_flag = "" + g_flag = "" + if mt_is_circular: + mt_id = get_mt_header(mt_genome_file=mt_genome_file) + c_flag = "-c {}".format(mt_id) if mt_n_genome_file: #get_gmap_build_nuclear_mt_input(n_genome_file=n_genome_file, mt_genome_file=mt_genome_file, n_mt_file=n_mt_file) - shell("gmap_build -D {gmap_db_dir} -d {gmap_db} -s none {input_fasta} &> {log}".format(gmap_db_dir=gmap_db_dir, - gmap_db=gmap_db, input_fasta=mt_n_genome_file, + shell("gmap_build -D {gmap_db_dir} -d {gmap_db} {c_flag} -s none {input_fasta} &> {log}".format(gmap_db_dir=gmap_db_dir, + gmap_db=gmap_db, c_flag=c_flag, input_fasta=mt_n_genome_file, log=log)) # mt db else: if is_compr_file(mt_genome_file): g_flag = "-g" - else: - g_flag = "" - shell("gmap_build -D {gmap_db_dir} -d {gmap_db} {g_flag} -s none {input_fasta} &> {log}".format(gmap_db_dir=gmap_db_dir, + # else: + # g_flag = "" + shell("gmap_build -D {gmap_db_dir} -d {gmap_db} {g_flag} {c_flag} -s none {input_fasta} &> {log}".format(gmap_db_dir=gmap_db_dir, gmap_db=gmap_db, input_fasta=mt_genome_file, - log=log, g_flag=g_flag)) + log=log, g_flag=g_flag, c_flag=c_flag)) From a4923d9a318cfb3d46c0487a626bf98bde73be29 Mon Sep 17 00:00:00 2001 From: Domenico Simone Date: Tue, 30 Jun 2020 15:44:52 +0200 Subject: [PATCH 02/31] New function and rule sam_to_ids, with aux function to check bitwise flags A more generalized function to parse reads from mt alignment, now we can keep hardclipped reads derived from alignment against a circular genome --- modules/general.py | 98 ++++++++++++++++++++++++++++ modules/tests/test_general.py | 22 ++++++- snakefiles/variant_calling.snakefile | 17 ++++- 3 files changed, 133 insertions(+), 4 deletions(-) diff --git a/modules/general.py b/modules/general.py index 00896c5..0d1de0c 100644 --- a/modules/general.py +++ b/modules/general.py @@ -7,12 +7,16 @@ import resource import sys from typing import Union +from types import SimpleNamespace +from snakemake import shell from Bio import SeqIO from Bio.Seq import reverse_complement from modules.constants import CLEV, COV, DIUPAC, GLEN, MQUAL +shell.prefix("set -euo pipefail;") + def is_compr_file(f): with gzip.open(f, 'r') as fh: try: @@ -498,3 +502,97 @@ def sam_to_fastq(samfile=None, outmt1=None, outmt2=None, outmt=None, dics = {l[0]: [l]} return sclipped + +#b = [0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] + +def collect_bitwise_flags(n, b=[0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048]): + """ + | Integer | Binary | Description (Paired Read Interpretation) | +|:--------: |:------------: |:-----------------------------------------------------------------------------------------------------: | +| 1 | 1 | template having multiple templates in sequencing (read is paired) | +| 2 | 10 | each segment properly aligned according to the aligner (read mapped in proper pair) | +| 4 | 100 | segment unmapped (read1 unmapped) | +| 8 | 1000 | next segment in the template unmapped (read2 unmapped) | +| 16 | 10000 | SEQ being reverse complemented (read1 reverse complemented) | +| 32 | 100000 | SEQ of the next segment in the template being reverse complemented (read2 reverse complemented) | +| 64 | 1000000 | the first segment in the template (is read1) | +| 128 | 10000000 | the last segment in the template (is read2) | +| 256 | 100000000 | not primary alignment | +| 512 | 1000000000 | alignment fails quality checks | +| 1024 | 10000000000 | PCR or optical duplicate | +| 2048 | 100000000000 | supplementary alignment (e.g. aligner specific, could be a portion of a split read or a tied region) | + """ + flags = [] + for i in b: + if n & i == 0 and n == 0: + flags.append(0) + if n & i != 0: + flags.append(i) + return set(flags) +#gzip.open(outmt2, "wb") as mtoutfastq2, \ + +def sam_to_ids(samfile=None, outmt1=None, outmt=None, keep_orphans=True, return_dict=False, return_files=True): + """Parses sam file and collect read ids. + + Args: + samfile: a gzip-compressed SAM file + outmt: file with list of SE reads + outmt1: file with list of PE reads + keep_orphans: wanna keep PE reads who lost their mate? + return_dict: wanna return read dict (for debugging)? + return_files: wanna return output files (for the pipeline)? + + Return: + if return_dict: read dict + """ + # TODO: + # - set a better log + # - test! + c = 0 + f = gzip.open(samfile, "rt") + if return_dict: + read_bitwiseflag_decomp = {} + if return_files: + mtoutfastq = gzip.open(outmt, "wt") + mtoutfastq1 = gzip.open(outmt1, "wt") + for i in f: + bitwise_status = True + c += 1 + if c % 100000 == 0: + print("{} SAM entries processed.".format(c)) + if i.strip() == "" or i.startswith("@"): + continue + l = (i.strip()).split("\t") + if l[2] == "*": + continue + bitwise_flags = collect_bitwise_flags(int(l[1])) + if 2048 in bitwise_flags: # skip supplementary alignments, we've already met this read + continue + elif set([1, 64]).issubset(bitwise_flags): # read paired and first in pair + paired_status = "PE" + if return_files: + mtoutfastq1.write("{}\n".format(l[0])) + elif 0 in bitwise_flags: # unpaired, mapped + paired_status = "SE" + if return_files: + mtoutfastq.write("{}\n".format(l[0])) + elif keep_orphans: + if set([1, 8]).issubset(bitwise_flags): # orphan left from alignment stage + paired_status = "SE" + if return_files: + mtoutfastq.write("{}\n".format(l[0])) + else: + print("Couldn't find assignment for {} with bitwise flag {}".format(l[0], l[1])) + bitwise_status = False + if return_dict: + read_bitwiseflag_decomp[l[0]] = SimpleNamespace(readID=l[0], bitwise_flag=int(l[1]), + bitwise_decomp=bitwise_flags, bitwise_status=bitwise_status, paired_status=paired_status) + if return_files: + mtoutfastq.close() + mtoutfastq1.close() + f.close() + if return_dict: + return read_bitwiseflag_decomp + +def run_seqtk_subset(seqfile=None, id_list=None, outseqfile=None): + shell("seqtk subseq {seqfile} {id_list} > {outseqfile}") \ No newline at end of file diff --git a/modules/tests/test_general.py b/modules/tests/test_general.py index 0aa7ab1..91b3bee 100644 --- a/modules/tests/test_general.py +++ b/modules/tests/test_general.py @@ -1,9 +1,15 @@ #!/usr/bin/env python # -*- coding: UTF-8 -*- import unittest +import os +from modules.general import memory_usage_resource, s_encoding, sam_to_ids -from modules.general import memory_usage_resource, s_encoding - +OUT_MT = os.path.join( + os.path.dirname(os.path.realpath(__file__)), + "data", + "general", + "SAMD00077852_1_MT_outmt.sam.gz" +) class TestMemoryUsageResource(unittest.TestCase): def test_memory_usage_resource(self): @@ -45,3 +51,15 @@ def test_s_encoding_invalid(self): # Then self.assertRaises(TypeError, s_encoding, s) + +class TestProcessAlignments(unittest.TestCase): + def test_sam_to_ids(self): + # Given/When + r = sam_to_ids(samfile=OUT_MT, return_files=False, return_dict=True) + # Then + self.assertIsInstance(r, dict) + self.assertEqual(len(r), 7060) + self.assertEqual(len([i for i in r if r[i].bitwise_status == True]), 7060) + self.assertEqual(len([i for i in r if r[i].paired_status == "PE"]), 4822) + self.assertEqual(len([i for i in r if r[i].paired_status == "SE"]), 2238) + diff --git a/snakefiles/variant_calling.snakefile b/snakefiles/variant_calling.snakefile index e4ffcce..b9da593 100644 --- a/snakefiles/variant_calling.snakefile +++ b/snakefiles/variant_calling.snakefile @@ -156,7 +156,7 @@ rule make_mt_gmap_db: #conda: "envs/environment.yaml" run: run_gmap_build(mt_genome_file=input.mt_genome_fasta, gmap_db_dir=params.gmap_db_dir, - gmap_db=params.gmap_db, log=log) + gmap_db=params.gmap_db, log=log, mt_is_circular=True) # shell: # """ # gmap_build -D {params.gmap_db_dir} -d {params.gmap_db} -s none -g {input.mt_genome_fasta} 2> /dev/null | gmap_build -D {params.gmap_db_dir} -d {params.gmap_db} -s none {input.mt_genome_fasta} &> {log} @@ -199,7 +199,7 @@ rule make_mt_n_gmap_db: log: "logs/gmap_build/{ref_genome_mt}_{ref_genome_n}.log" run: run_gmap_build(mt_n_genome_file=input.mt_n_fasta, # n_mt_file=output.mt_n_fasta, - gmap_db_dir=params.gmap_db_dir, gmap_db=params.gmap_db, log=log) + gmap_db_dir=params.gmap_db_dir, gmap_db=params.gmap_db, log=log, mt_is_circular=True) rule fastqc_filtered: input: @@ -313,6 +313,19 @@ rule sam2fastq: outmt2=output.outmt2, outmt=output.outmt, do_softclipping=True) print("{} reads with soft-clipping > 1/3 of their length".format(sclipped)) +rule sam_to_ids: + input: + outmt_sam = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.sam.gz" + output: + outmt1 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt1.ids", + outmt2 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt2.ids", + outmt = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.ids", + message: + "Getting ids of mapped reads from {input.outmt_sam}" + run: + sam_to_ids(samfile=input.outmt_sam, outmt1=output.outmt1, + outmt=output.outmt, keep_orphans=True, return_dict=False, return_files=True) + rule map_nuclear_MT_SE: input: outmt = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.fastq.gz", From 54e6610b5722e7cc29d4e9fb7d0d463fc8c2aaf8 Mon Sep 17 00:00:00 2001 From: Domenico Simone Date: Wed, 1 Jul 2020 08:49:20 +0200 Subject: [PATCH 03/31] keep_orphans --- modules/config_parsers.py | 12 +++ modules/general.py | 42 ++++++--- snakefiles/variant_calling.snakefile | 134 ++++++++++++++++++++++----- 3 files changed, 152 insertions(+), 36 deletions(-) diff --git a/modules/config_parsers.py b/modules/config_parsers.py index 9d7e8c6..ab7b905 100644 --- a/modules/config_parsers.py +++ b/modules/config_parsers.py @@ -373,3 +373,15 @@ def fastqc_outputs(datasets_tab: pd.DataFrame, ) ) return fastqc_out + +def get_inputs_for_rule_map_nuclear_MT_SE(sample=None, library=None, ref_genome_n=None, ref_genome_mt=None, keep_orphans=True): + outpaths = [] + outpaths.append("results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.fastq.gz") + if keep_orphans: + outpaths.append( + "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt_U1.fastq.gz" + ) + outpaths.append( + "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt_U2.fastq.gz" + ) + return outpaths diff --git a/modules/general.py b/modules/general.py index 0d1de0c..4aa30c7 100644 --- a/modules/general.py +++ b/modules/general.py @@ -531,7 +531,7 @@ def collect_bitwise_flags(n, b=[0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, return set(flags) #gzip.open(outmt2, "wb") as mtoutfastq2, \ -def sam_to_ids(samfile=None, outmt1=None, outmt=None, keep_orphans=True, return_dict=False, return_files=True): +def sam_to_ids(samfile=None, outmt_PE=None, outmt_U1=None, outmt_U2=None, outmt_SE=None, keep_orphans=True, return_dict=False, return_files=True): """Parses sam file and collect read ids. Args: @@ -553,10 +553,14 @@ def sam_to_ids(samfile=None, outmt1=None, outmt=None, keep_orphans=True, return_ if return_dict: read_bitwiseflag_decomp = {} if return_files: - mtoutfastq = gzip.open(outmt, "wt") - mtoutfastq1 = gzip.open(outmt1, "wt") + mtoutfastq_SE = gzip.open(outmt_SE, "wt") + mtoutfastq_PE = gzip.open(outmt_PE, "wt") + if keep_orphans: + mtoutfastq_U1 = gzip.open(outmt_U1, 'wt') + mtoutfastq_U2 = gzip.open(outmt_U2, 'wt') for i in f: bitwise_status = True + paired_status = "" c += 1 if c % 100000 == 0: print("{} SAM entries processed.".format(c)) @@ -568,19 +572,29 @@ def sam_to_ids(samfile=None, outmt1=None, outmt=None, keep_orphans=True, return_ bitwise_flags = collect_bitwise_flags(int(l[1])) if 2048 in bitwise_flags: # skip supplementary alignments, we've already met this read continue - elif set([1, 64]).issubset(bitwise_flags): # read paired and first in pair - paired_status = "PE" - if return_files: - mtoutfastq1.write("{}\n".format(l[0])) elif 0 in bitwise_flags: # unpaired, mapped paired_status = "SE" if return_files: - mtoutfastq.write("{}\n".format(l[0])) + mtoutfastq_SE.write("{}\n".format(l[0])) elif keep_orphans: if set([1, 8]).issubset(bitwise_flags): # orphan left from alignment stage - paired_status = "SE" - if return_files: - mtoutfastq.write("{}\n".format(l[0])) + if 64 in bitwise_flags: # first in pair + paired_status = "PE_orphan_1" + if return_files: + mtoutfastq_U1.write("{}\n".format(l[0])) + elif 128 in bitwise_flags: # second in pair + paired_status = "PE_orphan_2" + if return_files: + mtoutfastq_U2.write("{}\n".format(l[0])) + else: + print("Couldn't find assignment for {} with bitwise flag {}".format(l[0], l[1])) + # paired_status = "SE" + # if return_files: + # mtoutfastq.write("{}\n".format(l[0])) + elif set([1, 64]).issubset(bitwise_flags): # read paired and first in pair + paired_status = "PE" + if return_files: + mtoutfastq_PE.write("{}\n".format(l[0])) else: print("Couldn't find assignment for {} with bitwise flag {}".format(l[0], l[1])) bitwise_status = False @@ -588,8 +602,10 @@ def sam_to_ids(samfile=None, outmt1=None, outmt=None, keep_orphans=True, return_ read_bitwiseflag_decomp[l[0]] = SimpleNamespace(readID=l[0], bitwise_flag=int(l[1]), bitwise_decomp=bitwise_flags, bitwise_status=bitwise_status, paired_status=paired_status) if return_files: - mtoutfastq.close() - mtoutfastq1.close() + mtoutfastq_SE.close() + mtoutfastq_PE.close() + mtoutfastq_U1.close() + mtoutfastq_U2.close() f.close() if return_dict: return read_bitwiseflag_decomp diff --git a/snakefiles/variant_calling.snakefile b/snakefiles/variant_calling.snakefile index b9da593..25d16c2 100644 --- a/snakefiles/variant_calling.snakefile +++ b/snakefiles/variant_calling.snakefile @@ -23,7 +23,7 @@ from modules.config_parsers import ( fastqc_outputs, get_bed_files, get_datasets_for_symlinks, get_fasta_files, get_genome_files, get_genome_single_vcf_files, get_genome_single_vcf_index_files, get_genome_vcf_files, get_mt_genomes, get_mt_fasta, - get_sample_bamfiles, get_symlinks, parse_config_tabs + get_sample_bamfiles, get_symlinks, parse_config_tabs, get_inputs_for_rule_map_nuclear_MT_SE ) from modules.filter_alignments import filter_alignments from modules.general import ( @@ -37,6 +37,7 @@ source_dir = Path(os.path.dirname(workflow.snakefile)).parent #source_dir = os.path.abspath(os.path.join(".", os.pardir)) #localrules: bam2pileup, index_genome, pileup2mt_table, make_single_VCF localrules: index_genome, merge_VCF, index_VCF, dict_genome, symlink_libraries, symlink_libraries_uncompressed, get_gmap_build_nuclear_mt_input +ruleorder: sam_to_ids_keep_orphans > sam_to_ids # fields: sample ref_genome_mt ref_genome_n analysis_tab, reference_tab, datasets_tab = parse_config_tabs(analysis_tab_file="data/analysis.tab", reference_tab_file="data/reference_genomes.tab", datasets_tab_file="data/datasets.tab") @@ -46,6 +47,7 @@ res_dir = config["results"] map_dir = config["map_dir"] log_dir = config["log_dir"] gmap_db_dir = config["map"]["gmap_db_dir"] +keep_orphans = config["keep_orphans"] # if species is not defined by config.yaml, should be parsed for each analysis species = config["species"] @@ -296,40 +298,124 @@ rule map_MT_PE_SE: print("PE + SE mode") shell("gsnap -D {params.gmap_db_dir} -d {params.gmap_db} -o {params.uncompressed_output} -A sam --gunzip --nofails --pairmax-dna=500 --query-unk-mismatch=1 {params.RG_tag} -n 1 -Q -O -t {threads} {input[0]} {input[1]} {input[2]} &> {log} && gzip {params.uncompressed_output} &>> {log}") -rule sam2fastq: +# rule sam2fastq: +# input: +# outmt_sam = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.sam.gz" +# #outmt_sam = "results/OUT_{sample}_{ref_genome_mt}_{ref_genome_n}/map/{sample}_{ref_genome_mt}_outmt.sam.gz" +# output: +# outmt1 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt1.fastq.gz", +# outmt2 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt2.fastq.gz", +# outmt = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.fastq.gz", +# #log = "results/OUT_{sample}_{ref_genome_mt}_{ref_genome_n}/map/sam2fastq.done" +# #conda: "envs/environment.yaml" +# message: +# "Converting {input.outmt_sam} to FASTQ" +# run: +# sclipped = sam_to_fastq(samfile=input.outmt_sam, outmt1=output.outmt1, +# outmt2=output.outmt2, outmt=output.outmt, do_softclipping=True) +# print("{} reads with soft-clipping > 1/3 of their length".format(sclipped)) + +rule sam_to_ids: input: outmt_sam = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.sam.gz" - #outmt_sam = "results/OUT_{sample}_{ref_genome_mt}_{ref_genome_n}/map/{sample}_{ref_genome_mt}_outmt.sam.gz" output: - outmt1 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt1.fastq.gz", - outmt2 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt2.fastq.gz", - outmt = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.fastq.gz", - #log = "results/OUT_{sample}_{ref_genome_mt}_{ref_genome_n}/map/sam2fastq.done" - #conda: "envs/environment.yaml" + outmt1 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt1.ids", + #outmt2 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt2.ids", + outmt = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.ids", message: - "Converting {input.outmt_sam} to FASTQ" + "Getting ids of mapped reads from {input.outmt_sam}" run: - sclipped = sam_to_fastq(samfile=input.outmt_sam, outmt1=output.outmt1, - outmt2=output.outmt2, outmt=output.outmt, do_softclipping=True) - print("{} reads with soft-clipping > 1/3 of their length".format(sclipped)) + sam_to_ids(samfile=input.outmt_sam, outmt_PE=output.outmt1, + outmt_SE=output.outmt, keep_orphans=False, return_dict=False, return_files=True) -rule sam_to_ids: +rule sam_to_ids_keep_orphans: input: outmt_sam = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.sam.gz" output: outmt1 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt1.ids", - outmt2 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt2.ids", + #outmt2 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt2.ids", outmt = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.ids", + outmt_U1 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt_U1.ids", + outmt_U2 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt_U2.ids", message: "Getting ids of mapped reads from {input.outmt_sam}" run: - sam_to_ids(samfile=input.outmt_sam, outmt1=output.outmt1, - outmt=output.outmt, keep_orphans=True, return_dict=False, return_files=True) - + sam_to_ids(samfile=input.outmt_sam, outmt_PE=output.outmt1, + outmt_SE=output.outmt, keep_orphans=True, return_dict=False, return_files=True) + +rule ids_to_fastq_PE: + input: + outmt1 = rules.sam_to_ids_keep_orphans.output.outmt1 if config["keep_orphans"] \ + else rules.sam_to_ids.output.outmt1, + R1 = rules.trimmomatic.output.out1P, + R2 = rules.trimmomatic.output.out2P, + #outmt = rules.sam_to_ids.output.outmt, + output: + outmt1 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt1.fastq.gz", + outmt2 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt2.fastq.gz", + #outmt = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.fastq.gz", + message: + "Fetching reads in {input.outmt1}" + params: + out1_temp = lambda wildcards, output: output.outmt1.replace(".gz", ""), + out2_temp = lambda wildcards, output: output.outmt2.replace(".gz", "") + run: + run_seqtk_subset(seqfile=input.R1, id_list=input.outmt1, outseqfile=params.out1_temp) + run_seqtk_subset(seqfile=input.R2, id_list=input.outmt1, outseqfile=params.out2_temp) + shell("gzip {params.out1_temp}") + shell("gzip {params.out2_temp}") + +rule ids_to_fastq_SE: + input: + outmt = rules.sam_to_ids_keep_orphans.output.outmt if config["keep_orphans"] \ + else rules.sam_to_ids.output.outmt, + U1 = rules.trimmomatic.output.out1U, + #U2 = rules.trimmomatic.output.out2U, + #outmt = rules.sam_to_ids.output.outmt, + output: + outmt1 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.fastq.gz", + #outmt2 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt_PE_2.fastq.gz", + #outmt = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.fastq.gz", + message: + "Fetching reads in {input.outmt}" + params: + out1_temp = lambda wildcards, output: output.outmt1.replace(".gz", ""), +# out2_temp = lambda wildcards, output: output.outmt2.replace(".gz", "") + run: + run_seqtk_subset(seqfile=input.U1, id_list=input.outmt1, outseqfile=params.out1_temp) +# run_seqtk_subset(seqfile=input.R2, id_list=input.outmt1, outseqfile=params.out2_temp) + shell("gzip {params.out1_temp}") +# shell("gzip {params.out2_temp}") + +rule ids_to_fastq_orphans: + input: + outmt_U1 = rules.sam_to_ids_keep_orphans.output.outmt_U1, + outmt_U2 = rules.sam_to_ids_keep_orphans.output.outmt_U2, + R1 = rules.trimmomatic.output.out1P, + R2 = rules.trimmomatic.output.out2P, + #outmt = rules.sam_to_ids.output.outmt, + output: + outmt1 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt_U1.fastq.gz", + outmt2 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt_U2.fastq.gz", + #outmt = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.fastq.gz", + message: + "Fetching reads in {input.outmt_U1} and {input.outmt_U2}" + params: + out1_temp = lambda wildcards, output: output.outmt1.replace(".gz", ""), + out2_temp = lambda wildcards, output: output.outmt2.replace(".gz", "") + run: + run_seqtk_subset(seqfile=input.R1, id_list=input.outmt_U1, outseqfile=params.out1_temp) + run_seqtk_subset(seqfile=input.R2, id_list=input.outmt_U2, outseqfile=params.out2_temp) + shell("gzip {params.out1_temp}") + shell("gzip {params.out2_temp}") + rule map_nuclear_MT_SE: input: - outmt = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.fastq.gz", - gmap_db = gmap_db_dir + "/{ref_genome_mt}_{ref_genome_n}/{ref_genome_mt}_{ref_genome_n}.chromosome" + lambda wildcards: get_inputs_for_rule_map_nuclear_MT_SE(sample=wildcards.sample, library=wildcards.library, + ref_genome_mt=wildcards.ref_genome_mt, ref_genome_n=wildcards.ref_genome_n, + keep_orphans=keep_orphans), + gmap_db = gmap_db_dir + "/{ref_genome_mt}_{ref_genome_n}/{ref_genome_mt}_{ref_genome_n}.chromosome", + #outmt = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.fastq.gz", output: outS = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_{ref_genome_n}_outS.sam.gz" params: @@ -350,15 +436,17 @@ rule map_nuclear_MT_SE: "Mapping onto complete human genome (nuclear + mt)... SE reads" run: if os.path.isfile(input.outmt): - shell("gsnap -D {params.gmap_db_dir} -d {params.gmap_db} -o {params.uncompressed_output} --gunzip -A sam --nofails --query-unk-mismatch=1 -O -t {threads} {input.outmt} &> {log.logS} && gzip {params.uncompressed_output} &>> {log.logS}") + shell("gsnap -D {params.gmap_db_dir} -d {params.gmap_db} -o {params.uncompressed_output} --gunzip -A sam --nofails --query-unk-mismatch=1 -O -t {threads} {input[:-1]} &> {log.logS} && gzip {params.uncompressed_output} &>> {log.logS}") else: open(output.outS, 'a').close() rule map_nuclear_MT_PE: input: - outmt1 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt1.fastq.gz", - outmt2 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt2.fastq.gz", - gmap_db = gmap_db_dir + "/{ref_genome_mt}_{ref_genome_n}/{ref_genome_mt}_{ref_genome_n}.chromosome" + gmap_db = gmap_db_dir + "/{ref_genome_mt}_{ref_genome_n}/{ref_genome_mt}_{ref_genome_n}.chromosome", + outmt1 = rules.ids_to_fastq_PE.output.outmt1, + outmt2 = rules.ids_to_fastq_PE.output.outmt2, + # outmt1 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt_PE_1.fastq.gz", + # outmt2 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt_PE_2.fastq.gz", output: outP = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_{ref_genome_n}_outP.sam.gz" params: From f7b4e743e15d41745a430dcd600ef8db801d6c8c Mon Sep 17 00:00:00 2001 From: Domenico Simone Date: Wed, 1 Jul 2020 09:06:31 +0200 Subject: [PATCH 04/31] Fixed keywords --- config.yaml | 1 + snakefiles/variant_calling.snakefile | 40 ++++++++++++++-------------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/config.yaml b/config.yaml index 5df392a..7ccc35a 100644 --- a/config.yaml +++ b/config.yaml @@ -19,6 +19,7 @@ map: gmap_threads: 4 gmap_remap_threads: 4 +keep_orphans: True mark_duplicates: False trimBam: False diff --git a/snakefiles/variant_calling.snakefile b/snakefiles/variant_calling.snakefile index 25d16c2..636995d 100644 --- a/snakefiles/variant_calling.snakefile +++ b/snakefiles/variant_calling.snakefile @@ -37,7 +37,7 @@ source_dir = Path(os.path.dirname(workflow.snakefile)).parent #source_dir = os.path.abspath(os.path.join(".", os.pardir)) #localrules: bam2pileup, index_genome, pileup2mt_table, make_single_VCF localrules: index_genome, merge_VCF, index_VCF, dict_genome, symlink_libraries, symlink_libraries_uncompressed, get_gmap_build_nuclear_mt_input -ruleorder: sam_to_ids_keep_orphans > sam_to_ids +#ruleorder: sam_to_ids_keep_orphans > sam_to_ids # fields: sample ref_genome_mt ref_genome_n analysis_tab, reference_tab, datasets_tab = parse_config_tabs(analysis_tab_file="data/analysis.tab", reference_tab_file="data/reference_genomes.tab", datasets_tab_file="data/datasets.tab") @@ -315,20 +315,20 @@ rule map_MT_PE_SE: # outmt2=output.outmt2, outmt=output.outmt, do_softclipping=True) # print("{} reads with soft-clipping > 1/3 of their length".format(sclipped)) -rule sam_to_ids: - input: - outmt_sam = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.sam.gz" - output: - outmt1 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt1.ids", - #outmt2 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt2.ids", - outmt = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.ids", - message: - "Getting ids of mapped reads from {input.outmt_sam}" - run: - sam_to_ids(samfile=input.outmt_sam, outmt_PE=output.outmt1, - outmt_SE=output.outmt, keep_orphans=False, return_dict=False, return_files=True) +# rule sam_to_ids: +# input: +# outmt_sam = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.sam.gz" +# output: +# outmt1 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt1.ids", +# #outmt2 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt2.ids", +# outmt = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.ids", +# message: +# "Getting ids of mapped reads from {input.outmt_sam}" +# run: +# sam_to_ids(samfile=input.outmt_sam, outmt_PE=output.outmt1, +# outmt_SE=output.outmt, keep_orphans=False, return_dict=False, return_files=True) -rule sam_to_ids_keep_orphans: +rule sam_to_ids: input: outmt_sam = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.sam.gz" output: @@ -345,8 +345,8 @@ rule sam_to_ids_keep_orphans: rule ids_to_fastq_PE: input: - outmt1 = rules.sam_to_ids_keep_orphans.output.outmt1 if config["keep_orphans"] \ - else rules.sam_to_ids.output.outmt1, + outmt1 = rules.sam_to_ids.output.outmt1,# if config["keep_orphans"] \ + #else rules.sam_to_ids.output.outmt1, R1 = rules.trimmomatic.output.out1P, R2 = rules.trimmomatic.output.out2P, #outmt = rules.sam_to_ids.output.outmt, @@ -367,8 +367,8 @@ rule ids_to_fastq_PE: rule ids_to_fastq_SE: input: - outmt = rules.sam_to_ids_keep_orphans.output.outmt if config["keep_orphans"] \ - else rules.sam_to_ids.output.outmt, + outmt = rules.sam_to_ids.output.outmt,# if config["keep_orphans"] \ + #else rules.sam_to_ids.output.outmt, U1 = rules.trimmomatic.output.out1U, #U2 = rules.trimmomatic.output.out2U, #outmt = rules.sam_to_ids.output.outmt, @@ -389,8 +389,8 @@ rule ids_to_fastq_SE: rule ids_to_fastq_orphans: input: - outmt_U1 = rules.sam_to_ids_keep_orphans.output.outmt_U1, - outmt_U2 = rules.sam_to_ids_keep_orphans.output.outmt_U2, + outmt_U1 = rules.sam_to_ids.output.outmt_U1, + outmt_U2 = rules.sam_to_ids.output.outmt_U2, R1 = rules.trimmomatic.output.out1P, R2 = rules.trimmomatic.output.out2P, #outmt = rules.sam_to_ids.output.outmt, From d2742bba92a3309988e557766ab39cf760a56ed7 Mon Sep 17 00:00:00 2001 From: Domenico Simone Date: Thu, 2 Jul 2020 09:04:08 +0200 Subject: [PATCH 05/31] Fixed keywords --- modules/general.py | 2 +- snakefiles/variant_calling.snakefile | 74 ++++++++++++++++++++++++---- 2 files changed, 65 insertions(+), 11 deletions(-) diff --git a/modules/general.py b/modules/general.py index 4aa30c7..3042cf3 100644 --- a/modules/general.py +++ b/modules/general.py @@ -124,7 +124,7 @@ def get_SAM_header(samfile): comment_count = 0 header_lines = [] l = s_encoding(samhandle.readline()) - print(l) + #print(l) while l[0] == "@": header_lines.append(l) comment_count += 1 diff --git a/snakefiles/variant_calling.snakefile b/snakefiles/variant_calling.snakefile index 636995d..53e4228 100644 --- a/snakefiles/variant_calling.snakefile +++ b/snakefiles/variant_calling.snakefile @@ -28,7 +28,7 @@ from modules.config_parsers import ( from modules.filter_alignments import filter_alignments from modules.general import ( check_tmp_dir, gapped_fasta2contigs, get_seq_name, sam_to_fastq, sam_cov_handle2gapped_fasta, - trimmomatic_input + trimmomatic_input, sam_to_ids ) from modules.genome_db import run_gmap_build, get_gmap_build_nuclear_mt_input from modules.mtVariantCaller import mtvcf_main_analysis, VCFoutput @@ -182,6 +182,10 @@ rule get_gmap_build_nuclear_mt_input: rule make_mt_n_gmap_db: input: mt_n_fasta = rules.get_gmap_build_nuclear_mt_input.output.mt_n_fasta, + mt_fasta = lambda wildcards: expand("data/genomes/{ref_genome_mt_file}", + ref_genome_mt_file=get_genome_files(reference_tab, + wildcards.ref_genome_mt, + "ref_genome_mt_file"))[0], # mt_genome_fasta = lambda wildcards: expand("data/genomes/{ref_genome_mt_file}", # ref_genome_mt_file=get_genome_files(reference_tab, # wildcards.ref_genome_mt, @@ -200,7 +204,7 @@ rule make_mt_n_gmap_db: message: "Generating gmap db for mt + n genome: {input.mt_n_fasta}" log: "logs/gmap_build/{ref_genome_mt}_{ref_genome_n}.log" run: - run_gmap_build(mt_n_genome_file=input.mt_n_fasta, # n_mt_file=output.mt_n_fasta, + run_gmap_build(mt_n_genome_file=input.mt_n_fasta, mt_genome_file=input.mt_fasta, gmap_db_dir=params.gmap_db_dir, gmap_db=params.gmap_db, log=log, mt_is_circular=True) rule fastqc_filtered: @@ -473,23 +477,73 @@ rule map_nuclear_MT_PE: else: open(output.outP, 'a').close() +# def get_map_nuclear_MT_PE_SE_params(basename=None, sample=None, library=None, ref_genome_mt=None, ref_genome_n=None): +# concordant_uniq = "{}.concordant_uniq".format(basename) +# concordant_circular = "{}.concordant_circular".format(basename) +# unpaired_uniq = "{}.unpaired_uniq".format(basename) +# unpaired_circular = "{}.unpaired_circular".format(basename) +# return concordant_uniq, concordant_circular, unpaired_uniq, unpaired_circular + +rule map_nuclear_MT_PE_SE: + input: + lambda wildcards: get_inputs_for_rule_map_nuclear_MT_SE(sample=wildcards.sample, library=wildcards.library, + ref_genome_mt=wildcards.ref_genome_mt, ref_genome_n=wildcards.ref_genome_n, + keep_orphans=keep_orphans), + outmt1 = rules.ids_to_fastq_PE.output.outmt1, + outmt2 = rules.ids_to_fastq_PE.output.outmt2, + gmap_db = gmap_db_dir + "/{ref_genome_mt}_{ref_genome_n}/{ref_genome_mt}_{ref_genome_n}.chromosome", + output: + concordant_uniq = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_{ref_genome_n}_out_mt_n.concordant_uniq", + concordant_circular = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_{ref_genome_n}_out_mt_n.concordant_circular", + unpaired_uniq = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_{ref_genome_n}_out_mt_n.unpaired_uniq", + unpaired_circular = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_{ref_genome_n}_out_mt_n.unpaired_circular", + # outmt_n = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_{ref_genome_n}_out_mt_n.sam.gz" + params: + out_basename = lambda wildcards, output: output.concordant_uniq.replace(".concordant_uniq", "") + # concordant_uniq, concordant_circular, unpaired_uniq, unpaired_circular = lambda wildcards, output: get_map_nuclear_MT_PE_SE_params(output.replace(".sam.gz", "")) + run: + shell("gsnap -D {params.gmap_db_dir} -d {params.gmap_db} --split-output={params.out_basename} -A sam --gunzip --nofails --pairmax-dna=500 --query-unk-mismatch=1 -n 1 -Q -O -t {threads} {input[:-1]} &> {log} && gzip {params.uncompressed_output} &>> {log}") + +def cat_alignment(samfile=None, outfile=None, ref_mt_fasta_header=None): + samhandle = gzip.open(samfile, 'rt') + outhandle = gzip.open(outfile, 'at') + for l in samhandle: + if l.startswith("@") == False and l.split()[2] == ref_mt_fasta_header: + outhandle.write(l) + samhandle.close() + outhandle.close() + +def cat_alignments(*samfiles, outfile=None, ref_mt_fasta_header=None): + header = get_SAM_header(samfiles[0])[0] + outhandle = gzip.open(outfile, 'at') + for l in header: + outhandle.write(l) + outhandle.close() + for samfile in samfiles: + cat_alignment(samfile, outfile, ref_mt_fasta_header=ref_mt_fasta_header) + rule filtering_mt_alignments: input: - outmt = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.sam.gz", - outS = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_{ref_genome_n}_outS.sam.gz", - outP = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_{ref_genome_n}_outP.sam.gz" + rules.map_nuclear_MT_PE_SE.output, + # outmt = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.sam.gz", + # outS = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_{ref_genome_n}_outS.sam.gz", + # outP = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_{ref_genome_n}_outP.sam.gz" output: sam = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_{ref_genome_n}_OUT.sam.gz" params: - ref_mt_fasta = lambda wildcards: "data/genomes/{ref_genome_mt_file}".format( + ref_mt_fasta_header = lambda wildcards: get_seq_name("data/genomes/{ref_genome_mt_file}".format( ref_genome_mt_file=get_mt_fasta(reference_tab, wildcards.ref_genome_mt, "ref_genome_mt_file") - ) + )) + # # ref_mt_fasta = lambda wildcards: "data/genomes/{ref_genome_mt_file}".format( + # # ref_genome_mt_file=get_mt_fasta(reference_tab, wildcards.ref_genome_mt, "ref_genome_mt_file") + # # ) #conda: "envs/environment.yaml" threads: 1 - message: "Filtering alignments in file {input.outmt} by checking alignments in {input.outS} and {input.outP}" + message: "Filtering alignments in files {input}" run: - filter_alignments(outmt=input.outmt, outS=input.outS, outP=input.outP, OUT=output.sam, - ref_mt_fasta=params.ref_mt_fasta) + cat_alignments(input, outfile=output.sam, ref_mt_fasta_header=params.ref_mt_fasta_header) + # filter_alignments(outmt=input.outmt, outS=input.outS, outP=input.outP, OUT=output.sam, + # ref_mt_fasta=params.ref_mt_fasta) rule sam2bam: input: From 899a95b66629c9e094f50a924334980f3a10b37c Mon Sep 17 00:00:00 2001 From: Domenico Simone Date: Thu, 2 Jul 2020 10:06:05 +0200 Subject: [PATCH 06/31] Fixed function import and keywords --- snakefiles/variant_calling.snakefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/snakefiles/variant_calling.snakefile b/snakefiles/variant_calling.snakefile index 53e4228..1fad46f 100644 --- a/snakefiles/variant_calling.snakefile +++ b/snakefiles/variant_calling.snakefile @@ -28,7 +28,7 @@ from modules.config_parsers import ( from modules.filter_alignments import filter_alignments from modules.general import ( check_tmp_dir, gapped_fasta2contigs, get_seq_name, sam_to_fastq, sam_cov_handle2gapped_fasta, - trimmomatic_input, sam_to_ids + trimmomatic_input, sam_to_ids, run_seqtk_subset ) from modules.genome_db import run_gmap_build, get_gmap_build_nuclear_mt_input from modules.mtVariantCaller import mtvcf_main_analysis, VCFoutput @@ -344,7 +344,7 @@ rule sam_to_ids: message: "Getting ids of mapped reads from {input.outmt_sam}" run: - sam_to_ids(samfile=input.outmt_sam, outmt_PE=output.outmt1, + sam_to_ids(samfile=input.outmt_sam, outmt_PE=output.outmt1, outmt_U1=output.outmt_U1, outmt_U2=output.outmt_U2, outmt_SE=output.outmt, keep_orphans=True, return_dict=False, return_files=True) rule ids_to_fastq_PE: @@ -386,7 +386,7 @@ rule ids_to_fastq_SE: out1_temp = lambda wildcards, output: output.outmt1.replace(".gz", ""), # out2_temp = lambda wildcards, output: output.outmt2.replace(".gz", "") run: - run_seqtk_subset(seqfile=input.U1, id_list=input.outmt1, outseqfile=params.out1_temp) + run_seqtk_subset(seqfile=input.U1, id_list=input.outmt, outseqfile=params.out1_temp) # run_seqtk_subset(seqfile=input.R2, id_list=input.outmt1, outseqfile=params.out2_temp) shell("gzip {params.out1_temp}") # shell("gzip {params.out2_temp}") From 4382614bb152319a96e253094b7fd6d52e7860a7 Mon Sep 17 00:00:00 2001 From: Domenico Simone Date: Fri, 3 Jul 2020 10:23:47 +0200 Subject: [PATCH 07/31] modules/filter_alignments.py: added functions cat_alignment, cat_alignments --- modules/filter_alignments.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/modules/filter_alignments.py b/modules/filter_alignments.py index aba6937..d934bb0 100644 --- a/modules/filter_alignments.py +++ b/modules/filter_alignments.py @@ -5,6 +5,7 @@ import pandas as pd from sqlalchemy import create_engine +from types import SimpleNamespace from modules.general import get_SAM_header, memory_usage_resource @@ -118,3 +119,31 @@ def filter_alignments(outmt=None, outS=None, outP=None, OUT=None, os.system("gzip {}".format(OUT_uncompressed)) print("OUT.sam compressed, memory: {} MB".format(memory_usage_resource())) print("Total alignments extracted: {}".format(n_extracted_alignments)) + +def cat_alignment(samfile=None, outfile=None, ref_mt_fasta_header=None): + #samhandle = gzip.open(samfile, 'rt') + samhandle = open(samfile, 'r') + outhandle = gzip.open(outfile, 'at') + total_alignments = 0 + filtered_alignments = 0 + for l in samhandle: + total_alignments += 1 + if l.startswith("@") == False and l.split()[2] == ref_mt_fasta_header: + filtered_alignments += 1 + outhandle.write(l) + samhandle.close() + outhandle.close() + return total_alignments, filtered_alignments + +def cat_alignments(*samfiles, outfile=None, ref_mt_fasta_header=None): + filtering_report = {} + header_lines, comment_count = get_SAM_header(samfiles[0][0]) + outhandle = gzip.open(outfile, 'at') + for l in header_lines: + outhandle.write(l) + outhandle.close() + for samfile in samfiles[0]: + print(samfile) + total_alignments, filtered_alignments = cat_alignment(samfile=samfile, outfile=outfile, ref_mt_fasta_header=ref_mt_fasta_header) + filtering_report[samfile] = SimpleNamespace(samfile=samfile, total_alignments=total_alignments, filtered_alignments=filtered_alignments, ref=ref_mt_fasta_header) + return filtering_report \ No newline at end of file From 67641c51656043d1bd174e9f407371d2e74893f0 Mon Sep 17 00:00:00 2001 From: Domenico Simone Date: Fri, 3 Jul 2020 10:25:49 +0200 Subject: [PATCH 08/31] Function sam_to_ids fixed --- modules/general.py | 96 +++++++++++++++++++++++++++++++++------------- 1 file changed, 70 insertions(+), 26 deletions(-) diff --git a/modules/general.py b/modules/general.py index 3042cf3..531ec03 100644 --- a/modules/general.py +++ b/modules/general.py @@ -215,6 +215,7 @@ def freq(d): def get_seq_name(fasta): + """Return tuple of seq id and length""" mt_genome = SeqIO.index(fasta, 'fasta') if len(mt_genome) != 1: sys.exit(("Sorry, but MToolBox at the moment only accepts " @@ -553,14 +554,17 @@ def sam_to_ids(samfile=None, outmt_PE=None, outmt_U1=None, outmt_U2=None, outmt_ if return_dict: read_bitwiseflag_decomp = {} if return_files: - mtoutfastq_SE = gzip.open(outmt_SE, "wt") - mtoutfastq_PE = gzip.open(outmt_PE, "wt") + mtoutfastq_SE = open(outmt_SE, "w") + mtoutfastq_PE = open(outmt_PE, "w") + # mtoutfastq_SE = gzip.open(outmt_SE, "wt") + # mtoutfastq_PE = gzip.open(outmt_PE, "wt") if keep_orphans: - mtoutfastq_U1 = gzip.open(outmt_U1, 'wt') - mtoutfastq_U2 = gzip.open(outmt_U2, 'wt') + mtoutfastq_U1 = open(outmt_U1, 'w') + mtoutfastq_U2 = open(outmt_U2, 'w') for i in f: bitwise_status = True paired_status = "" + write_to_dict = False c += 1 if c % 100000 == 0: print("{} SAM entries processed.".format(c)) @@ -572,34 +576,41 @@ def sam_to_ids(samfile=None, outmt_PE=None, outmt_U1=None, outmt_U2=None, outmt_ bitwise_flags = collect_bitwise_flags(int(l[1])) if 2048 in bitwise_flags: # skip supplementary alignments, we've already met this read continue - elif 0 in bitwise_flags: # unpaired, mapped + elif 0 in bitwise_flags or bitwise_flags == set([16]): # unpaired, mapped paired_status = "SE" + write_to_dict = True if return_files: mtoutfastq_SE.write("{}\n".format(l[0])) - elif keep_orphans: - if set([1, 8]).issubset(bitwise_flags): # orphan left from alignment stage - if 64 in bitwise_flags: # first in pair - paired_status = "PE_orphan_1" - if return_files: - mtoutfastq_U1.write("{}\n".format(l[0])) - elif 128 in bitwise_flags: # second in pair - paired_status = "PE_orphan_2" + elif 1 in bitwise_flags: # read paired + if 8 in bitwise_flags: # orphan + if keep_orphans: + if 64 in bitwise_flags: + paired_status = "PE_orphan_1" + write_to_dict = True + if return_files: + mtoutfastq_U1.write("{}\n".format(l[0])) + elif 128 in bitwise_flags: + paired_status = "PE_orphan_2" + write_to_dict = True + if return_files: + mtoutfastq_U2.write("{}\n".format(l[0])) + else: + print("Couldn't find assignment for {} with bitwise flag {}".format(l[0], l[1])) + bitwise_status = False + else: # properly paired + if 64 in bitwise_flags: + paired_status = "PE" + write_to_dict = True if return_files: - mtoutfastq_U2.write("{}\n".format(l[0])) + mtoutfastq_PE.write("{}\n".format(l[0])) + elif 128 in bitwise_flags: + write_to_dict = False else: print("Couldn't find assignment for {} with bitwise flag {}".format(l[0], l[1])) - # paired_status = "SE" - # if return_files: - # mtoutfastq.write("{}\n".format(l[0])) - elif set([1, 64]).issubset(bitwise_flags): # read paired and first in pair - paired_status = "PE" - if return_files: - mtoutfastq_PE.write("{}\n".format(l[0])) - else: - print("Couldn't find assignment for {} with bitwise flag {}".format(l[0], l[1])) - bitwise_status = False + bitwise_status = False if return_dict: - read_bitwiseflag_decomp[l[0]] = SimpleNamespace(readID=l[0], bitwise_flag=int(l[1]), + if write_to_dict: + read_bitwiseflag_decomp[l[0]] = SimpleNamespace(readID=l[0], bitwise_flag=int(l[1]), bitwise_decomp=bitwise_flags, bitwise_status=bitwise_status, paired_status=paired_status) if return_files: mtoutfastq_SE.close() @@ -611,4 +622,37 @@ def sam_to_ids(samfile=None, outmt_PE=None, outmt_U1=None, outmt_U2=None, outmt_ return read_bitwiseflag_decomp def run_seqtk_subset(seqfile=None, id_list=None, outseqfile=None): - shell("seqtk subseq {seqfile} {id_list} > {outseqfile}") \ No newline at end of file + shell("seqtk subseq {seqfile} {id_list} > {outseqfile}") + +# +# +# +# ### +# elif set([1, 64]).issubset(bitwise_flags): # read paired and first in pair +# +# write_to_dict = True +# paired_status = "PE" +# if return_files: +# mtoutfastq_PE.write("{}\n".format(l[0])) +# elif keep_orphans: +# if set([1, 8]).issubset(bitwise_flags): # orphan left from alignment stage +# if 64 in bitwise_flags: # first in pair +# paired_status = "PE_orphan_1" +# write_to_dict = True +# if return_files: +# mtoutfastq_U1.write("{}\n".format(l[0])) +# elif 128 in bitwise_flags: # second in pair +# paired_status = "PE_orphan_2" +# write_to_dict = True +# if return_files: +# mtoutfastq_U2.write("{}\n".format(l[0])) +# else: +# print("Couldn't find assignment for {} with bitwise flag {}".format(l[0], l[1])) +# # paired_status = "SE" +# # if return_files: +# # mtoutfastq.write("{}\n".format(l[0])) +# # elif set([1, 128]).issubset(bitwise_flags): # read paired and second in pair, don't need it +# # continue +# else: +# print("Couldn't find assignment for {} with bitwise flag {}".format(l[0], l[1])) +# bitwise_status = False From 3918a6fccda21a04c30c2721264229f21f6675f1 Mon Sep 17 00:00:00 2001 From: Domenico Simone Date: Fri, 3 Jul 2020 10:36:50 +0200 Subject: [PATCH 09/31] Fixed new alignment filtering workflow --- snakefiles/variant_calling.snakefile | 107 ++++----------------------- 1 file changed, 16 insertions(+), 91 deletions(-) diff --git a/snakefiles/variant_calling.snakefile b/snakefiles/variant_calling.snakefile index 1fad46f..98a74b3 100644 --- a/snakefiles/variant_calling.snakefile +++ b/snakefiles/variant_calling.snakefile @@ -28,7 +28,7 @@ from modules.config_parsers import ( from modules.filter_alignments import filter_alignments from modules.general import ( check_tmp_dir, gapped_fasta2contigs, get_seq_name, sam_to_fastq, sam_cov_handle2gapped_fasta, - trimmomatic_input, sam_to_ids, run_seqtk_subset + trimmomatic_input, sam_to_ids, run_seqtk_subset, get_SAM_header ) from modules.genome_db import run_gmap_build, get_gmap_build_nuclear_mt_input from modules.mtVariantCaller import mtvcf_main_analysis, VCFoutput @@ -116,15 +116,9 @@ rule fastqc_raw: input: R1 = lambda wildcards: trimmomatic_input(datasets_tab=datasets_tab, sample=wildcards.sample, library=wildcards.library)[0], R2 = lambda wildcards: trimmomatic_input(datasets_tab=datasets_tab, sample=wildcards.sample, library=wildcards.library)[1] - # R1 = "data/reads/{sample}_{library}.R1.fastq.gz", - # R2 = "data/reads/{sample}_{library}.R2.fastq.gz", - # R1 = "data/reads/{dataset_basename}_R1_001.fastq.gz", - # R2 = "data/reads/{dataset_basename}_R2_001.fastq.gz" output: html_report_R1 = "results/fastqc_raw/{sample}_{library}.R1_fastqc.html", html_report_R2 = "results/fastqc_raw/{sample}_{library}.R2_fastqc.html", - # html_report_R1 = "results/fastqc_raw/{dataset_basename}_R1_001_fastqc.html", - # html_report_R2 = "results/fastqc_raw/{dataset_basename}_R2_001_fastqc.html", params: outDir = "results/fastqc_raw/", threads: @@ -186,20 +180,10 @@ rule make_mt_n_gmap_db: ref_genome_mt_file=get_genome_files(reference_tab, wildcards.ref_genome_mt, "ref_genome_mt_file"))[0], - # mt_genome_fasta = lambda wildcards: expand("data/genomes/{ref_genome_mt_file}", - # ref_genome_mt_file=get_genome_files(reference_tab, - # wildcards.ref_genome_mt, - # "ref_genome_mt_file"))[0], - # n_genome_fasta = lambda wildcards: expand("data/genomes/{ref_genome_n_file}", - # ref_genome_n_file=get_genome_files(reference_tab, - # wildcards.ref_genome_mt, - # "ref_genome_n_file"))[0] output: gmap_db = gmap_db_dir + "/{ref_genome_mt}_{ref_genome_n}/{ref_genome_mt}_{ref_genome_n}.chromosome", - # mt_n_fasta = "data/genomes/{ref_genome_mt}_{ref_genome_n}.fasta.gz" params: gmap_db_dir = config["map"]["gmap_db_dir"], - # gmap_db = lambda wildcards, output: os.path.split(output.gmap_db)[1].split(".")[0] gmap_db = lambda wildcards, output: os.path.split(output.gmap_db)[1].replace(".chromosome", "") message: "Generating gmap db for mt + n genome: {input.mt_n_fasta}" log: "logs/gmap_build/{ref_genome_mt}_{ref_genome_n}.log" @@ -302,36 +286,6 @@ rule map_MT_PE_SE: print("PE + SE mode") shell("gsnap -D {params.gmap_db_dir} -d {params.gmap_db} -o {params.uncompressed_output} -A sam --gunzip --nofails --pairmax-dna=500 --query-unk-mismatch=1 {params.RG_tag} -n 1 -Q -O -t {threads} {input[0]} {input[1]} {input[2]} &> {log} && gzip {params.uncompressed_output} &>> {log}") -# rule sam2fastq: -# input: -# outmt_sam = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.sam.gz" -# #outmt_sam = "results/OUT_{sample}_{ref_genome_mt}_{ref_genome_n}/map/{sample}_{ref_genome_mt}_outmt.sam.gz" -# output: -# outmt1 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt1.fastq.gz", -# outmt2 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt2.fastq.gz", -# outmt = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.fastq.gz", -# #log = "results/OUT_{sample}_{ref_genome_mt}_{ref_genome_n}/map/sam2fastq.done" -# #conda: "envs/environment.yaml" -# message: -# "Converting {input.outmt_sam} to FASTQ" -# run: -# sclipped = sam_to_fastq(samfile=input.outmt_sam, outmt1=output.outmt1, -# outmt2=output.outmt2, outmt=output.outmt, do_softclipping=True) -# print("{} reads with soft-clipping > 1/3 of their length".format(sclipped)) - -# rule sam_to_ids: -# input: -# outmt_sam = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.sam.gz" -# output: -# outmt1 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt1.ids", -# #outmt2 = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt2.ids", -# outmt = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.ids", -# message: -# "Getting ids of mapped reads from {input.outmt_sam}" -# run: -# sam_to_ids(samfile=input.outmt_sam, outmt_PE=output.outmt1, -# outmt_SE=output.outmt, keep_orphans=False, return_dict=False, return_files=True) - rule sam_to_ids: input: outmt_sam = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.sam.gz" @@ -477,20 +431,13 @@ rule map_nuclear_MT_PE: else: open(output.outP, 'a').close() -# def get_map_nuclear_MT_PE_SE_params(basename=None, sample=None, library=None, ref_genome_mt=None, ref_genome_n=None): -# concordant_uniq = "{}.concordant_uniq".format(basename) -# concordant_circular = "{}.concordant_circular".format(basename) -# unpaired_uniq = "{}.unpaired_uniq".format(basename) -# unpaired_circular = "{}.unpaired_circular".format(basename) -# return concordant_uniq, concordant_circular, unpaired_uniq, unpaired_circular - rule map_nuclear_MT_PE_SE: input: - lambda wildcards: get_inputs_for_rule_map_nuclear_MT_SE(sample=wildcards.sample, library=wildcards.library, - ref_genome_mt=wildcards.ref_genome_mt, ref_genome_n=wildcards.ref_genome_n, - keep_orphans=keep_orphans), outmt1 = rules.ids_to_fastq_PE.output.outmt1, outmt2 = rules.ids_to_fastq_PE.output.outmt2, + outmt_SE = lambda wildcards: get_inputs_for_rule_map_nuclear_MT_SE(sample=wildcards.sample, library=wildcards.library, + ref_genome_mt=wildcards.ref_genome_mt, ref_genome_n=wildcards.ref_genome_n, + keep_orphans=keep_orphans), gmap_db = gmap_db_dir + "/{ref_genome_mt}_{ref_genome_n}/{ref_genome_mt}_{ref_genome_n}.chromosome", output: concordant_uniq = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_{ref_genome_n}_out_mt_n.concordant_uniq", @@ -498,52 +445,31 @@ rule map_nuclear_MT_PE_SE: unpaired_uniq = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_{ref_genome_n}_out_mt_n.unpaired_uniq", unpaired_circular = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_{ref_genome_n}_out_mt_n.unpaired_circular", # outmt_n = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_{ref_genome_n}_out_mt_n.sam.gz" + threads: 4 + log: + log = log_dir + "/{sample}/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/map/{sample}_{library}_{ref_genome_mt}_{ref_genome_n}_map_nuclear_MT_PE_SE.log" params: - out_basename = lambda wildcards, output: output.concordant_uniq.replace(".concordant_uniq", "") - # concordant_uniq, concordant_circular, unpaired_uniq, unpaired_circular = lambda wildcards, output: get_map_nuclear_MT_PE_SE_params(output.replace(".sam.gz", "")) + gmap_db_dir = config["map"]["gmap_db_dir"], + gmap_db = lambda wildcards, input: os.path.split(input.gmap_db)[1].replace(".chromosome", ""), + out_basename = lambda wildcards, output: output.concordant_uniq.replace(".concordant_uniq", ""), + RG_tag = '--read-group-id=sample --read-group-name=sample --read-group-library=sample --read-group-platform=sample', run: - shell("gsnap -D {params.gmap_db_dir} -d {params.gmap_db} --split-output={params.out_basename} -A sam --gunzip --nofails --pairmax-dna=500 --query-unk-mismatch=1 -n 1 -Q -O -t {threads} {input[:-1]} &> {log} && gzip {params.uncompressed_output} &>> {log}") - -def cat_alignment(samfile=None, outfile=None, ref_mt_fasta_header=None): - samhandle = gzip.open(samfile, 'rt') - outhandle = gzip.open(outfile, 'at') - for l in samhandle: - if l.startswith("@") == False and l.split()[2] == ref_mt_fasta_header: - outhandle.write(l) - samhandle.close() - outhandle.close() - -def cat_alignments(*samfiles, outfile=None, ref_mt_fasta_header=None): - header = get_SAM_header(samfiles[0])[0] - outhandle = gzip.open(outfile, 'at') - for l in header: - outhandle.write(l) - outhandle.close() - for samfile in samfiles: - cat_alignment(samfile, outfile, ref_mt_fasta_header=ref_mt_fasta_header) + input_files = input[:-1] + shell("gsnap -D {params.gmap_db_dir} -d {params.gmap_db} --split-output={params.out_basename} -A sam --gunzip --nofails --pairmax-dna=500 --query-unk-mismatch=1 {params.RG_tag} -n 1 -Q -O -t {threads} {input_files} &> {log}")#" && gzip {params.uncompressed_output} &>> {log}") rule filtering_mt_alignments: input: rules.map_nuclear_MT_PE_SE.output, - # outmt = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_outmt.sam.gz", - # outS = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_{ref_genome_n}_outS.sam.gz", - # outP = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_{ref_genome_n}_outP.sam.gz" output: sam = "results/{sample}/map/OUT_{sample}_{library}_{ref_genome_mt}_{ref_genome_n}/{sample}_{library}_{ref_genome_mt}_{ref_genome_n}_OUT.sam.gz" params: ref_mt_fasta_header = lambda wildcards: get_seq_name("data/genomes/{ref_genome_mt_file}".format( ref_genome_mt_file=get_mt_fasta(reference_tab, wildcards.ref_genome_mt, "ref_genome_mt_file") - )) - # # ref_mt_fasta = lambda wildcards: "data/genomes/{ref_genome_mt_file}".format( - # # ref_genome_mt_file=get_mt_fasta(reference_tab, wildcards.ref_genome_mt, "ref_genome_mt_file") - # # ) - #conda: "envs/environment.yaml" - threads: 1 + ))[0] message: "Filtering alignments in files {input}" run: - cat_alignments(input, outfile=output.sam, ref_mt_fasta_header=params.ref_mt_fasta_header) - # filter_alignments(outmt=input.outmt, outS=input.outS, outP=input.outP, OUT=output.sam, - # ref_mt_fasta=params.ref_mt_fasta) + filtering_report = cat_alignments(input, outfile=output.sam, ref_mt_fasta_header=params.ref_mt_fasta_header) + print(filtering_report) rule sam2bam: input: @@ -573,7 +499,6 @@ rule sort_bam: shell: """ samtools sort -o {output.sorted_bam} -T {params.TMP} {input.bam} &> {log} - # samtools sort -o {output.sorted_bam} -T ${{TMP}} {input.bam} """ rule mark_duplicates: From 6d776ee9e506d97eb812075826155e1e4dcad25b Mon Sep 17 00:00:00 2001 From: Domenico Simone Date: Mon, 24 Aug 2020 16:06:44 +0200 Subject: [PATCH 10/31] Update install.sh --- install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.sh b/install.sh index e8809b6..7675180 100644 --- a/install.sh +++ b/install.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# conda env create -n mtoolbox -f envs/mtoolbox.yaml +conda env create -n mtoolbox -f envs/mtoolbox.yaml # create alias for env activation and running echo 'alias mtoolbox-activate="export PATH='`pwd`':'`pwd`'/scripts:$(conda run -n mtoolbox echo $PATH); conda activate mtoolbox"' >> ~/.bash_profile From 2eba6049cee89003ac6dca5df1212dbc346efa3e Mon Sep 17 00:00:00 2001 From: Domenico Simone Date: Tue, 25 Aug 2020 11:38:06 +0200 Subject: [PATCH 11/31] install.sh: new alias command --- install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.sh b/install.sh index 7675180..48a1543 100644 --- a/install.sh +++ b/install.sh @@ -3,4 +3,4 @@ conda env create -n mtoolbox -f envs/mtoolbox.yaml # create alias for env activation and running -echo 'alias mtoolbox-activate="export PATH='`pwd`':'`pwd`'/scripts:$(conda run -n mtoolbox echo $PATH); conda activate mtoolbox"' >> ~/.bash_profile +echo 'alias mtoolbox-activate="export PATH='`pwd`':'`pwd`'/scripts:$(conda run -n mtoolbox python -c "import os; print(os.environ.get('PATH'))"); conda activate mtoolbox"' >> ~/.bash_profile From c73fd6f252ff22966e10764d1fa71a4f2d096edd Mon Sep 17 00:00:00 2001 From: Domenico Simone Date: Tue, 25 Aug 2020 18:25:16 +0200 Subject: [PATCH 12/31] install.sh: updated alias --- install.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/install.sh b/install.sh index 48a1543..3441128 100644 --- a/install.sh +++ b/install.sh @@ -1,6 +1,9 @@ #!/usr/bin/env bash -conda env create -n mtoolbox -f envs/mtoolbox.yaml +#conda env create -n mtoolbox -f envs/mtoolbox.yaml # create alias for env activation and running -echo 'alias mtoolbox-activate="export PATH='`pwd`':'`pwd`'/scripts:$(conda run -n mtoolbox python -c "import os; print(os.environ.get('PATH'))"); conda activate mtoolbox"' >> ~/.bash_profile +#echo 'alias mtoolbox-activate="export PATH='`pwd`':'`pwd`'/scripts:$(conda run -n mtoolbox python -c "import os; print(os.environ.get(\"PATH\"))"); conda activate mtoolbox"' >> ~/.bash_profile +unalias mtoolbox-activate 2> /dev/null +echo 'alias mtoolbox-activate="export PATH='`pwd`':'`pwd`'/scripts:$PATH && conda activate mtoolbox"' >> ~/.bash_profile + From c4cb79d6f3ecd7c1e7c9c4acaa2eb07c0605b659 Mon Sep 17 00:00:00 2001 From: Domenico Simone Date: Tue, 25 Aug 2020 18:38:47 +0200 Subject: [PATCH 13/31] doc/installation.rst: updates --- doc/installation.rst | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/doc/installation.rst b/doc/installation.rst index 90bf02b..fd16714 100644 --- a/doc/installation.rst +++ b/doc/installation.rst @@ -8,12 +8,10 @@ Install Anaconda To this purpose, please follow instructions at http://docs.anaconda.com/anaconda/install/linux/ (hint: download the Anaconda installer in your personal directory with `wget https://repo.continuum.io/archive/Anaconda3-2018.12-Linux-x86_64.sh`). -**Note on installation**: step 11 (verify installation by opening `anaconda-navigator`) is not compulsory. However, if you wish to do so, please make sure you have logged in the grid with either the `-X` or the `-Y` option. - Install MToolBox ---------------- -MToolBox is hosted on `GitHub`_. You can get a copy by running this commands: +MToolBox is hosted on `GitHub`_. You can get a copy of the repository by running this commands: .. code-block:: bash @@ -25,16 +23,17 @@ MToolBox is hosted on `GitHub`_. You can get a copy by running this commands: # fetch repo git clone https://github.com/mitoNGS/MToolBox_snakemake.git -The MToolBox repo comes with a setup script ``install.sh``, which will: - -- install the ``mtoolbox`` conda environment with all the required dependencies -- install the ``bamUtils`` suite (a third-party tool used in one of the steps of the pipeline which is not available as conda package) -- create a command (``mtoolbox_activate``) which will be used to activate the MToolBox conda environment and add the folders of MToolBox executables and utilities to your ``PATH``. +Installing MToolBox is as easy as running .. code-block:: bash - cd MToolBox_snakemake - bash install.sh + cd MToolBox_snakemake + bash install.sh + +The setup script ``install.sh`` will: + +- install the ``mtoolbox`` conda environment with all the required dependencies +- create a command (``mtoolbox-activate``) which will be used to activate the MToolBox conda environment and add the folders of MToolBox executables and utilities to your ``PATH``. .. _`MToolBox_snakemake`: https://github.com/mitoNGS/MToolBox_snakemake .. _`MToolBox pipeline`: https://github.com/mitoNGS/MToolBox From fd92e071fe19c07e46ab343c6a33fd3e18623833 Mon Sep 17 00:00:00 2001 From: Domenico Simone Date: Wed, 26 Aug 2020 14:32:11 +0200 Subject: [PATCH 14/31] envs/mtoolbox.yaml, added seqtk. Fixes #2 --- envs/mtoolbox.yaml | 746 ++++++++++++++++++++++----------------------- 1 file changed, 373 insertions(+), 373 deletions(-) diff --git a/envs/mtoolbox.yaml b/envs/mtoolbox.yaml index 09b2bfc..c0c1b0f 100644 --- a/envs/mtoolbox.yaml +++ b/envs/mtoolbox.yaml @@ -1,381 +1,381 @@ -name: /crex/proj/uppstore2018116/domenico/conda_envs/mtoolbox channels: - conda-forge - bioconda - defaults dependencies: - - _libgcc_mutex=0.1=main - - _r-mutex=1.0.0=anacondar_1 - - aioeasywebdav=2.2.0=py36_0 - - aiohttp=3.4.4=py36h14c3975_1000 - - appdirs=1.4.3=py_1 - - asn1crypto=0.24.0=py36_1003 - - async-timeout=3.0.1=py_1000 - - atomicwrites=1.3.0=py_0 - - attrs=18.2.0=py_0 - - backcall=0.1.0=py_0 - - bamutil=1.0.14=h635df5c_3 - - bbmap=38.22=h14c3975_1 - - bcftools=1.9=ha228f0b_3 - - bcrypt=3.1.4=py36h470a237_0 - - binutils_impl_linux-64=2.31.1=h6176602_1 - - binutils_linux-64=2.31.1=h6176602_8 - - biopython=1.72=py36h14c3975_1000 - - blas=1.0=openblas - - bleach=3.1.0=py_0 - - boto3=1.9.35=py_0 - - botocore=1.12.35=py_0 - - bwidget=1.9.11=0 - - bzip2=1.0.6=h14c3975_1002 - - ca-certificates=2020.6.20=hecda079_0 - - cachetools=2.1.0=py_0 - - cairo=1.14.12=h8948797_3 - - certifi=2020.6.20=py36h9f0ad1d_0 - - cffi=1.11.5=py36h9745a5d_1001 - - chardet=3.0.4=py36_1003 - - click=7.1.2=py_0 - - configargparse=0.13.0=py_1 - - cryptography=2.4.1=py36h1ba5d50_1 - - curl=7.64.0=h646f8bb_2 - - datrie=0.7.1=py36h14c3975_0 - - decorator=4.3.0=py_0 - - defusedxml=0.6.0=py_0 - - docutils=0.14=py36_1001 - - dropbox=9.1.0=py_0 - - entrypoints=0.3=py36_1000 - - expat=2.2.6=he6710b0_0 - - fastqc=0.11.8=1 - - filechunkio=1.6=py36_0 - - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - - fontconfig=2.13.0=h9420a91_0 - - freetype=2.9.1=he983fc9_1006 - - fribidi=1.0.5=h516909a_1002 - - ftputil=3.2=py36_0 - - gatk-framework=3.6.24=5 - - gcc_impl_linux-64=7.3.0=habb00fd_1 - - gcc_linux-64=7.3.0=h553295d_8 - - gettext=0.19.8.1=hc5be6a0_1002 - - gfortran_impl_linux-64=7.3.0=hdf63c60_1 - - gfortran_linux-64=7.3.0=h553295d_8 - - gitdb2=2.0.5=py_0 - - gitpython=2.1.11=py_0 - - glib=2.56.2=had28632_1001 - - gmap=2018.07.04=pl526he4cf2ce_0 - - gmp=6.1.2=hf484d3e_1000 - - google-auth=1.2.1=py_0 - - google-auth-httplib2=0.0.3=py_2 - - google-cloud-core=0.24.1=py36_0 - - google-cloud-storage=1.1.1=py36_0 - - google-resumable-media=0.0.2=py36_0 - - googleapis-common-protos=1.5.5=py_0 - - graphite2=1.3.12=hf484d3e_1001 - - graphviz=2.40.1=h21bd128_2 - - gsl=2.4=h294904e_1006 - - gxx_impl_linux-64=7.3.0=hdf63c60_1 - - gxx_linux-64=7.3.0=h553295d_8 - - harfbuzz=1.8.8=hffaf4a1_0 - - httplib2=0.12.0=py36_1000 - - icu=58.2=hf484d3e_1000 - - idna=2.7=py36_1002 - - idna_ssl=1.1.0=py36_1000 - - importlib_metadata=0.18=py36_0 - - intel-openmp=2019.1=144 - - ipykernel=5.1.2=py36h5ca1d4c_0 - - ipython=7.2.0=py36h24bf2e0_1000 - - ipython_genutils=0.2.0=py_1 - - jedi=0.13.2=py36_1000 - - jinja2=2.10.1=py_0 - - jmespath=0.9.3=py_1 - - jpeg=9b=h024ee3a_2 - - jsonschema=2.6.0=py36_1002 - - jupyter_client=5.3.1=py_0 - - jupyter_core=4.5.0=py_0 - - krb5=1.16.3=h05b26f9_1001 - - libblas=3.8.0=12_openblas - - libcblas=3.8.0=12_openblas - - libcurl=7.64.0=h541490c_2 - - libdeflate=1.0=h14c3975_1 - - libedit=3.1.20170329=hf8c457e_1001 - - libffi=3.2.1=he1b5a44_1006 - - libgcc=7.2.0=h69d50b8_2 - - libgcc-ng=8.2.0=hdf63c60_1 - - libgfortran-ng=7.3.0=hdf63c60_0 - - libiconv=1.15=h516909a_1005 - - liblapack=3.8.0=12_openblas - - libopenblas=0.3.7=h6e990d7_1 - - libpng=1.6.35=h84994c4_1002 - - libprotobuf=3.6.1=hdbcaa40_1001 - - libsodium=1.0.16=h14c3975_1001 - - libssh2=1.8.0=h90d6eec_1004 - - libstdcxx-ng=8.2.0=hdf63c60_1 - - libtiff=4.0.9=he6b73bb_1 - - libuuid=1.0.3=h1bed415_2 - - libxcb=1.13=h14c3975_1002 - - libxml2=2.9.8=h143f9aa_1005 - - line_profiler=2.1.2=py36h516909a_1003 - - make=4.2.1=h14c3975_2004 - - markupsafe=1.1.0=py36h14c3975_1000 - - memory_profiler=0.55.0=py_0 - - mistune=0.8.4=py36h14c3975_1000 - - mkl=2018.0.3=1 - - mkl_fft=1.0.6=py36_0 - - mkl_random=1.0.1=py36_0 - - more-itertools=7.2.0=py_0 - - multidict=4.4.2=py36h14c3975_1000 - - muscle=3.8.1551=h6bb024c_4 - - nbconvert=5.5.0=py_0 - - nbformat=4.4.0=py_1 - - ncurses=6.1=hf484d3e_1002 - - networkx=2.2=py_1 - - notebook=6.0.0=py36_0 - - numpy=1.15.4=py36h99e49ec_0 - - numpy-base=1.15.4=py36h2f8d375_0 - - openblas=0.3.7=h6e990d7_1 - - openjdk=8.0.152=h46b5887_1 - - openssl=1.1.1g=h516909a_0 - - packaging=19.0=py_0 - - pandas=0.23.4=py36h637b7d7_1000 - - pandoc=2.2.3.2=0 - - pandocfilters=1.4.2=py_1 - - pango=1.42.4=h049681c_0 - - paramiko=2.4.2=py36_1000 - - parso=0.3.1=py_0 - - pcre=8.42=h439df22_0 - - perl=5.26.2=h516909a_1006 - - pexpect=4.6.0=py36_1000 - - picard=2.18.16=0 - - pickleshare=0.7.5=py36_1000 - - pip=18.1=py36_1000 - - pixman=0.34.0=h14c3975_1003 - - pluggy=0.12.0=py_0 - - prettytable=0.7.2=py_3 - - prometheus_client=0.7.1=py_0 - - prompt_toolkit=2.0.7=py_0 - - protobuf=3.6.1=py36hf484d3e_1001 - - psutil=5.4.8=py36h14c3975_1000 - - pthread-stubs=0.4=h14c3975_1001 - - ptyprocess=0.6.0=py_1001 - - py=1.8.0=py_0 - - pyasn1=0.4.4=py_1 - - pyasn1-modules=0.0.5=py36_0 - - pycparser=2.19=py36_1 - - pygments=2.3.1=py_0 - - pygraphviz=1.3.1=py36_0 - - pynacl=1.3.0=py36h14c3975_1000 - - pyopenssl=18.0.0=py36_1000 - - pyparsing=2.4.2=py_0 - - pysftp=0.2.9=py36_0 - - pysocks=1.6.8=py36_1002 - - pytest=5.0.1=py36_1 - - python=3.6.7=h0371630_0 - - python-dateutil=2.7.5=py_0 - - python-irodsclient=0.7.0=py_0 - - python_abi=3.6=1_cp36m - - pytz=2018.7=py_0 - - pyvcf=0.6.7=py36_0 - - pyyaml=3.13=py36h14c3975_1001 - - pyzmq=17.1.2=py36h6afc9c9_1001 - - r-abind=1.4_5=r35h6115d3f_1002 - - r-assertthat=0.2.0=r351h6115d3f_1001 - - r-backports=1.1.2=r351h96ca727_1001 - - r-base=3.5.1=h1e0a451_2 - - r-base64enc=0.1_3=r35hcdcec82_1003 - - r-bh=1.66.0_1=r351_2001 - - r-bindr=0.1.1=r35h6115d3f_1002 - - r-bindrcpp=0.2.2=r35h0357c0b_1002 - - r-bookdown=0.7=r351h6115d3f_1 - - r-boot=1.3_20=r351_1000 - - r-broom=0.5.0=r351h6115d3f_1002 - - r-callr=2.0.4=r351h6115d3f_0 - - r-caret=6.0_80=r351h96ca727_1001 - - r-cellranger=1.1.0=r35h6115d3f_1002 - - r-class=7.3_14=r351h96ca727_1002 - - r-classint=0.3_3=r35h9bbef5b_2 - - r-cli=1.0.0=r351h6115d3f_1001 - - r-clipr=0.4.1=r351h6115d3f_1001 - - r-cluster=2.0.7_1=r351ha65eedd_1000 - - r-codetools=0.2_15=r351h6115d3f_1001 - - r-colorspace=1.3_2=r351h96ca727_1002 - - r-crayon=1.3.4=r35h6115d3f_1002 - - r-crosstalk=1.0.0=r35h6115d3f_1002 - - r-curl=3.2=r351h96ca727_1002 - - r-cvst=0.2_2=r35h6115d3f_1001 - - r-data.table=1.11.4=r351h96ca727_1002 - - r-dbi=1.0.0=r35h6115d3f_1002 - - r-dbplyr=1.2.2=r351h6115d3f_1001 - - r-ddalpha=1.3.4=r351h80f5a37_1001 - - r-deoptimr=1.0_8=r35h6115d3f_1002 - - r-dichromat=2.0_0=r35_2001 - - r-digest=0.6.15=r351h96ca727_0 - - r-dimred=0.1.0=r351h6115d3f_1002 - - r-dplyr=0.7.6=r351h29659fb_1001 - - r-drr=0.0.3=r35h6115d3f_1002 - - r-dt=0.4=r351h6115d3f_1001 - - r-e1071=1.7_2=r35h0357c0b_1 - - r-essentials=3.5.1=r351_0 - - r-evaluate=0.11=r351h6115d3f_1000 - - r-fansi=0.2.3=r351h96ca727_0 - - r-forcats=0.3.0=r351h6115d3f_1001 - - r-foreach=1.4.4=r35h6115d3f_1002 - - r-foreign=0.8_71=r35hcdcec82_1003 - - r-formatr=1.5=r351h6115d3f_1001 - - r-funr=0.3.2=r35_1001 - - r-geometry=0.3_6=r351h96ca727_1002 - - r-ggplot2=3.0.0=r351h6115d3f_1 - - r-glmnet=2.0_16=r351ha65eedd_1001 - - r-glue=1.3.0=r351h14c3975_1002 - - r-gower=0.1.2=r351h96ca727_1002 - - r-gtable=0.2.0=r351h6115d3f_1001 - - r-haven=1.1.2=r351h29659fb_1002 - - r-hexbin=1.27.2=r351ha65eedd_1002 - - r-highr=0.7=r351h6115d3f_1001 - - r-hms=0.4.2=r351h6115d3f_1000 - - r-htmltools=0.3.6=r35he1b5a44_1003 - - r-htmlwidgets=1.2=r351h6115d3f_1000 - - r-httpuv=1.4.5.1=r351hf484d3e_1000 - - r-httr=1.3.1=r351h6115d3f_1001 - - r-ipred=0.9_6=r351h96ca727_0 - - r-irdisplay=0.5.0=r351h6115d3f_0 - - r-irkernel=0.8.12=r351_0 - - r-iterators=1.0.10=r35h6115d3f_1002 - - r-jsonlite=1.5=r351h96ca727_1002 - - r-kernlab=0.9_26=r351h80f5a37_0 - - r-kernsmooth=2.23_15=r35h9bbef5b_1004 - - r-knitr=1.20=r351h6115d3f_1001 - - r-labeling=0.3=r35h6115d3f_1002 - - r-labelled=1.1.0=r351h6115d3f_0 - - r-later=0.7.3=r351h29659fb_1000 - - r-lattice=0.20_35=r351h96ca727_1000 - - r-lava=1.6.2=r351h6115d3f_0 - - r-lazyeval=0.2.1=r351h96ca727_1002 - - r-lubridate=1.7.4=r35h0357c0b_1002 - - r-magic=1.5_8=r351h6115d3f_1000 - - r-magrittr=1.5=r35h6115d3f_1002 - - r-maps=3.3.0=r35hcdcec82_1003 - - r-markdown=0.8=r351h96ca727_1003 - - r-mass=7.3_50=r351h96ca727_1002 - - r-matrix=1.2_14=r351h96ca727_1002 - - r-mgcv=1.8_24=r351h96ca727_1002 - - r-mime=0.5=r351h96ca727_1002 - - r-miniui=0.1.1.1=r35h6115d3f_1001 - - r-modelmetrics=1.1.0=r351h29659fb_1002 - - r-modelr=0.1.2=r351h6115d3f_1001 - - r-munsell=0.5.0=r35h6115d3f_1002 - - r-nlme=3.1_137=r351ha65eedd_1000 - - r-nnet=7.3_12=r35hcdcec82_1003 - - r-numderiv=2016.8_1.1=r35h6115d3f_1 - - r-openssl=1.0.2=r351h96ca727_1 - - r-pbdzmq=0.3_3=r351h193a840_1000 - - r-pillar=1.3.0=r351h6115d3f_0 - - r-pkgconfig=2.0.1=r351h6115d3f_0 - - r-plogr=0.2.0=r35h6115d3f_1002 - - r-pls=2.6_0=r351h6115d3f_0 - - r-plyr=1.8.4=r35h0357c0b_1003 - - r-praise=1.0.0=r35h6115d3f_1002 - - r-prettydoc=0.2.1=r35_1002 - - r-processx=3.1.0=r351h29659fb_0 - - r-prodlim=2018.04.18=r35h0357c0b_1003 - - r-promises=1.0.1=r35h0357c0b_1001 - - r-purrr=0.2.5=r351h96ca727_1002 - - r-quantmod=0.4_13=r351h6115d3f_1000 - - r-questionr=0.7.0=r35h6115d3f_1 - - r-r6=2.2.2=r351h6115d3f_1001 - - r-randomforest=4.6_14=r35h9bbef5b_1002 - - r-rbokeh=0.6.3=r351_0 - - r-rcolorbrewer=1.1_2=r35h6115d3f_1002 - - r-rcpp=0.12.18=r351h29659fb_0 - - r-rcpproll=0.3.0=r35h0357c0b_1001 - - r-readr=1.1.1=r351h29659fb_1002 - - r-readxl=1.1.0=r351h29659fb_1002 - - r-recipes=0.1.3=r351h6115d3f_1001 - - r-recommended=3.5.1=r35_1003 - - r-rematch=1.0.1=r35h6115d3f_1002 - - r-repr=0.15.0=r351h6115d3f_0 - - r-reprex=0.2.0=r351h6115d3f_1001 - - r-reshape2=1.4.3=r35h0357c0b_1004 - - r-reticulate=1.12=r35h0357c0b_1 - - r-rlang=0.2.1=r351h470a237_2 - - r-rmarkdown=1.10=r351h6115d3f_1001 - - r-rmdformats=0.3.5=r35h6115d3f_1 - - r-robustbase=0.93_2=r351ha65eedd_1000 - - r-rpart=4.1_13=r351h96ca727_1002 - - r-rprojroot=1.3_2=r35h6115d3f_1002 - - r-rstudioapi=0.7=r351h6115d3f_1001 - - r-rvest=0.3.2=r351h6115d3f_1001 - - r-scales=0.5.0=r351h29659fb_0 - - r-selectr=0.4_1=r35h6115d3f_1001 - - r-sfsmisc=1.1_2=r351h6115d3f_1000 - - r-shiny=1.1.0=r351_0 - - r-sourcetools=0.1.7=r35he1b5a44_1001 - - r-spatial=7.3_11=r35hcdcec82_1003 - - r-squarem=2017.10_1=r35h6115d3f_1002 - - r-stringi=1.2.4=r351h29659fb_1001 - - r-stringr=1.3.1=r351h6115d3f_1001 - - r-survival=2.42_6=r351h96ca727_1001 - - r-testthat=2.0.0=r351h9d2a408_3 - - r-tibble=1.4.2=r351h96ca727_1002 - - r-tidyr=0.8.1=r351h29659fb_1002 - - r-tidyselect=0.2.4=r351h29659fb_1003 - - r-tidyverse=1.2.1=r35h6115d3f_1002 - - r-timedate=3043.102=r35h6115d3f_1001 - - r-tinytex=0.6=r351h6115d3f_0 - - r-ttr=0.23_3=r351ha65eedd_0 - - r-utf8=1.1.4=r35hcdcec82_1001 - - r-uuid=0.1_2=r35hcdcec82_1002 - - r-viridislite=0.3.0=r35h6115d3f_1002 - - r-whisker=0.3_2=r35h6115d3f_1002 - - r-withr=2.1.2=r35h6115d3f_1001 - - r-xfun=0.3=r351h6115d3f_1001 - - r-xml2=1.2.0=r35h0357c0b_1003 - - r-xtable=1.8_2=r351h6115d3f_0 - - r-xts=0.11_0=r351h96ca727_0 - - r-yaml=2.2.0=r35hcdcec82_1002 - - r-zoo=1.8_3=r351h96ca727_1000 - - ratelimiter=1.2.0=py36_1000 - - readline=7.0=hf8c457e_1001 - - requests=2.20.1=py36_1000 - - rsa=3.1.4=py36_0 - - s3transfer=0.1.13=py36_1001 - - samtools=1.9=h8571acd_11 - - scipy=1.3.1=py36h921218d_2 - - send2trash=1.5.0=py_0 - - setuptools=40.6.2=py36_0 - - six=1.11.0=py36_1001 - - smmap2=2.0.5=py_0 - - snakemake=5.4.3=0 - - snakemake-minimal=5.4.3=py_1 - - sqlalchemy=1.2.16=py36h14c3975_1000 - - sqlite=3.25.3=h67949de_1000 - - terminado=0.8.2=py36_0 - - testpath=0.4.2=py_1001 - - tk=8.6.9=hed695b0_1002 - - tktable=2.10=h555a92e_1 - - tornado=6.0.3=py36h516909a_0 - - traitlets=4.3.2=py36_1000 - - trimmomatic=0.38=1 - - urllib3=1.23=py36_1001 - - wcwidth=0.1.7=py_1 - - webencodings=0.5.1=py_1 - - wheel=0.32.3=py36_0 - - wrapt=1.10.11=py36h14c3975_1001 - - xmlrunner=1.7.7=py_0 - - xorg-kbproto=1.0.7=h14c3975_1002 - - xorg-libice=1.0.10=h516909a_0 - - xorg-libsm=1.2.2=h470a237_5 - - xorg-libx11=1.6.8=h516909a_0 - - xorg-libxau=1.0.9=h14c3975_0 - - xorg-libxdmcp=1.1.3=h516909a_0 - - xorg-libxext=1.3.4=h516909a_0 - - xorg-libxrender=0.9.10=h516909a_1002 - - xorg-renderproto=0.11.1=h14c3975_1002 - - xorg-xextproto=7.3.0=h14c3975_1002 - - xorg-xproto=7.0.31=h14c3975_1007 - - xz=5.2.4=h14c3975_1001 - - yaml=0.1.7=h14c3975_1001 - - yarl=1.2.6=py36h14c3975_1000 - - zeromq=4.2.5=hf484d3e_1006 - - zipp=0.5.2=py_0 - - zlib=1.2.11=h516909a_1005 + - _libgcc_mutex=0.1 + - _r-mutex=1.0.0 + - aioeasywebdav=2.2.0 + - aiohttp=3.4.4 + - appdirs=1.4.3 + - asn1crypto=0.24.0 + - async-timeout=3.0.1 + - atomicwrites=1.3.0 + - attrs=18.2.0 + - backcall=0.1.0 + - bamutil=1.0.14 + - bbmap=38.22 + - bcftools=1.9 + - bcrypt=3.1.4 + - binutils_impl_linux-64=2.31.1 + - binutils_linux-64=2.31.1 + - biopython=1.72 + - blas=1.0 + - bleach=3.1.0 + - boto3=1.9.35 + - botocore=1.12.35 + - bwidget=1.9.11 + - bzip2=1.0.6 + - ca-certificates=2020.6.20 + - cachetools=2.1.0 + - cairo=1.14.12 + - certifi=2020.6.20 + - cffi=1.11.5 + - chardet=3.0.4 + - click=7.1.2 + - configargparse=0.13.0 + - cryptography=2.4.1 + - curl=7.64.0 + - datrie=0.7.1 + - decorator=4.3.0 + - defusedxml=0.6.0 + - docutils=0.14 + - dropbox=9.1.0 + - entrypoints=0.3 + - expat=2.2.6 + - fastqc=0.11.8 + - filechunkio=1.6 + - font-ttf-dejavu-sans-mono=2.37 + - fontconfig=2.13.0 + - freetype=2.9.1 + - fribidi=1.0.5 + - ftputil=3.2 + - gatk-framework=3.6.24 + - gcc_impl_linux-64=7.3.0 + - gcc_linux-64=7.3.0 + - gettext=0.19.8.1 + - gfortran_impl_linux-64=7.3.0 + - gfortran_linux-64=7.3.0 + - gitdb2=2.0.5 + - gitpython=2.1.11 + - glib=2.56.2 + - gmap=2018.07.04 + - gmp=6.1.2 + - google-auth=1.2.1 + - google-auth-httplib2=0.0.3 + - google-cloud-core=0.24.1 + - google-cloud-storage=1.1.1 + - google-resumable-media=0.0.2 + - googleapis-common-protos=1.5.5 + - graphite2=1.3.12 + - graphviz=2.40.1 + - gsl=2.4 + - gxx_impl_linux-64=7.3.0 + - gxx_linux-64=7.3.0 + - harfbuzz=1.8.8 + - httplib2=0.12.0 + - icu=58.2 + - idna=2.7 + - idna_ssl=1.1.0 + - importlib_metadata=0.18 + - intel-openmp=2019.1 + - ipykernel=5.1.2 + - ipython=7.2.0 + - ipython_genutils=0.2.0 + - jedi=0.13.2 + - jinja2=2.10.1 + - jmespath=0.9.3 + - jpeg=9b + - jsonschema=2.6.0 + - jupyter_client=5.3.1 + - jupyter_core=4.5.0 + - krb5=1.16.3 + - libblas=3.8.0 + - libcblas=3.8.0 + - libcurl=7.64.0 + - libdeflate=1.0 + - libedit=3.1.20170329 + - libffi=3.2.1 + - libgcc=7.2.0 + - libgcc-ng=8.2.0 + - libgfortran-ng=7.3.0 + - libiconv=1.15 + - liblapack=3.8.0 + - libopenblas=0.3.7 + - libpng=1.6.35 + - libprotobuf=3.6.1 + - libsodium=1.0.16 + - libssh2=1.8.0 + - libstdcxx-ng=8.2.0 + - libtiff=4.0.9 + - libuuid=1.0.3 + - libxcb=1.13 + - libxml2=2.9.8 + - line_profiler=2.1.2 + - make=4.2.1 + - markupsafe=1.1.0 + - memory_profiler=0.55.0 + - mistune=0.8.4 + - mkl=2018.0.3 + - mkl_fft=1.0.6 + - mkl_random=1.0.1 + - more-itertools=7.2.0 + - multidict=4.4.2 + - muscle=3.8.1551 + - nbconvert=5.5.0 + - nbformat=4.4.0 + - ncurses=6.1 + - networkx=2.2 + - notebook=6.0.0 + - numpy=1.15.4 + - numpy-base=1.15.4 + - openblas=0.3.7 + - openjdk=8.0.152 + - openssl=1.1.1g + - packaging=19.0 + - pandas=0.23.4 + - pandoc=2.2.3.2 + - pandocfilters=1.4.2 + - pango=1.42.4 + - paramiko=2.4.2 + - parso=0.3.1 + - pcre=8.42 + - perl=5.26.2 + - pexpect=4.6.0 + - picard=2.18.16 + - pickleshare=0.7.5 + - pip=18.1 + - pixman=0.34.0 + - pluggy=0.12.0 + - prettytable=0.7.2 + - prometheus_client=0.7.1 + - prompt_toolkit=2.0.7 + - protobuf=3.6.1 + - psutil=5.4.8 + - pthread-stubs=0.4 + - ptyprocess=0.6.0 + - py=1.8.0 + - pyasn1=0.4.4 + - pyasn1-modules=0.0.5 + - pycparser=2.19 + - pygments=2.3.1 + - pygraphviz=1.3.1 + - pynacl=1.3.0 + - pyopenssl=18.0.0 + - pyparsing=2.4.2 + - pysftp=0.2.9 + - pysocks=1.6.8 + - pytest=5.0.1 + - python=3.6.7 + - python-dateutil=2.7.5 + - python-irodsclient=0.7.0 + - python_abi=3.6 + - pytz=2018.7 + - pyvcf=0.6.7 + - pyyaml=3.13 + - pyzmq=17.1.2 + - r-abind=1.4_5 + - r-assertthat=0.2.0 + - r-backports=1.1.2 + - r-base=3.5.1 + - r-base64enc=0.1_3 + - r-bh=1.66.0_1 + - r-bindr=0.1.1 + - r-bindrcpp=0.2.2 + - r-bookdown=0.7 + - r-boot=1.3_20 + - r-broom=0.5.0 + - r-callr=2.0.4 + - r-caret=6.0_80 + - r-cellranger=1.1.0 + - r-class=7.3_14 + - r-classint=0.3_3 + - r-cli=1.0.0 + - r-clipr=0.4.1 + - r-cluster=2.0.7_1 + - r-codetools=0.2_15 + - r-colorspace=1.3_2 + - r-crayon=1.3.4 + - r-crosstalk=1.0.0 + - r-curl=3.2 + - r-cvst=0.2_2 + - r-data.table=1.11.4 + - r-dbi=1.0.0 + - r-dbplyr=1.2.2 + - r-ddalpha=1.3.4 + - r-deoptimr=1.0_8 + - r-dichromat=2.0_0 + - r-digest=0.6.15 + - r-dimred=0.1.0 + - r-dplyr=0.7.6 + - r-drr=0.0.3 + - r-dt=0.4 + - r-e1071=1.7_2 + - r-essentials=3.5.1 + - r-evaluate=0.11 + - r-fansi=0.2.3 + - r-forcats=0.3.0 + - r-foreach=1.4.4 + - r-foreign=0.8_71 + - r-formatr=1.5 + - r-funr=0.3.2 + - r-geometry=0.3_6 + - r-ggplot2=3.0.0 + - r-glmnet=2.0_16 + - r-glue=1.3.0 + - r-gower=0.1.2 + - r-gtable=0.2.0 + - r-haven=1.1.2 + - r-hexbin=1.27.2 + - r-highr=0.7 + - r-hms=0.4.2 + - r-htmltools=0.3.6 + - r-htmlwidgets=1.2 + - r-httpuv=1.4.5.1 + - r-httr=1.3.1 + - r-ipred=0.9_6 + - r-irdisplay=0.5.0 + - r-irkernel=0.8.12 + - r-iterators=1.0.10 + - r-jsonlite=1.5 + - r-kernlab=0.9_26 + - r-kernsmooth=2.23_15 + - r-knitr=1.20 + - r-labeling=0.3 + - r-labelled=1.1.0 + - r-later=0.7.3 + - r-lattice=0.20_35 + - r-lava=1.6.2 + - r-lazyeval=0.2.1 + - r-lubridate=1.7.4 + - r-magic=1.5_8 + - r-magrittr=1.5 + - r-maps=3.3.0 + - r-markdown=0.8 + - r-mass=7.3_50 + - r-matrix=1.2_14 + - r-mgcv=1.8_24 + - r-mime=0.5 + - r-miniui=0.1.1.1 + - r-modelmetrics=1.1.0 + - r-modelr=0.1.2 + - r-munsell=0.5.0 + - r-nlme=3.1_137 + - r-nnet=7.3_12 + - r-numderiv=2016.8_1.1 + - r-openssl=1.0.2 + - r-pbdzmq=0.3_3 + - r-pillar=1.3.0 + - r-pkgconfig=2.0.1 + - r-plogr=0.2.0 + - r-pls=2.6_0 + - r-plyr=1.8.4 + - r-praise=1.0.0 + - r-prettydoc=0.2.1 + - r-processx=3.1.0 + - r-prodlim=2018.04.18 + - r-promises=1.0.1 + - r-purrr=0.2.5 + - r-quantmod=0.4_13 + - r-questionr=0.7.0 + - r-r6=2.2.2 + - r-randomforest=4.6_14 + - r-rbokeh=0.6.3 + - r-rcolorbrewer=1.1_2 + - r-rcpp=0.12.18 + - r-rcpproll=0.3.0 + - r-readr=1.1.1 + - r-readxl=1.1.0 + - r-recipes=0.1.3 + - r-recommended=3.5.1 + - r-rematch=1.0.1 + - r-repr=0.15.0 + - r-reprex=0.2.0 + - r-reshape2=1.4.3 + - r-reticulate=1.12 + - r-rlang=0.2.1 + - r-rmarkdown=1.10 + - r-rmdformats=0.3.5 + - r-robustbase=0.93_2 + - r-rpart=4.1_13 + - r-rprojroot=1.3_2 + - r-rstudioapi=0.7 + - r-rvest=0.3.2 + - r-scales=0.5.0 + - r-selectr=0.4_1 + - r-sfsmisc=1.1_2 + - r-shiny=1.1.0 + - r-sourcetools=0.1.7 + - r-spatial=7.3_11 + - r-squarem=2017.10_1 + - r-stringi=1.2.4 + - r-stringr=1.3.1 + - r-survival=2.42_6 + - r-testthat=2.0.0 + - r-tibble=1.4.2 + - r-tidyr=0.8.1 + - r-tidyselect=0.2.4 + - r-tidyverse=1.2.1 + - r-timedate=3043.102 + - r-tinytex=0.6 + - r-ttr=0.23_3 + - r-utf8=1.1.4 + - r-uuid=0.1_2 + - r-viridislite=0.3.0 + - r-whisker=0.3_2 + - r-withr=2.1.2 + - r-xfun=0.3 + - r-xml2=1.2.0 + - r-xtable=1.8_2 + - r-xts=0.11_0 + - r-yaml=2.2.0 + - r-zoo=1.8_3 + - ratelimiter=1.2.0 + - readline=7.0 + - requests=2.20.1 + - rsa=3.1.4 + - s3transfer=0.1.13 + - samtools=1.9 + - scipy=1.3.1 + - send2trash=1.5.0 + - seqtk=1.3 + - setuptools=40.6.2 + - six=1.11.0 + - smmap2=2.0.5 + - snakemake=5.4.3 + - snakemake-minimal=5.4.3 + - sqlalchemy=1.2.16 + - sqlite=3.25.3 + - terminado=0.8.2 + - testpath=0.4.2 + - tk=8.6.9 + - tktable=2.10 + - tornado=6.0.3 + - traitlets=4.3.2 + - trimmomatic=0.38 + - urllib3=1.23 + - wcwidth=0.1.7 + - webencodings=0.5.1 + - wheel=0.32.3 + - wrapt=1.10.11 + - xmlrunner=1.7.7 + - xorg-kbproto=1.0.7 + - xorg-libice=1.0.10 + - xorg-libsm=1.2.2 + - xorg-libx11=1.6.8 + - xorg-libxau=1.0.9 + - xorg-libxdmcp=1.1.3 + - xorg-libxext=1.3.4 + - xorg-libxrender=0.9.10 + - xorg-renderproto=0.11.1 + - xorg-xextproto=7.3.0 + - xorg-xproto=7.0.31 + - xz=5.2.4 + - yaml=0.1.7 + - yarl=1.2.6 + - zeromq=4.2.5 + - zipp=0.5.2 + - zlib=1.2.11 - pip: - apybiomart==0.5.2 - asyncio==3.4.3 From a929f27626ff0184ab1d7e9bbe22a0ca907c6449 Mon Sep 17 00:00:00 2001 From: Domenico Simone Date: Wed, 26 Aug 2020 15:52:22 +0200 Subject: [PATCH 15/31] variant_calling.snakefile: fixed function import --- snakefiles/variant_calling.snakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/snakefiles/variant_calling.snakefile b/snakefiles/variant_calling.snakefile index 98a74b3..3e9250a 100644 --- a/snakefiles/variant_calling.snakefile +++ b/snakefiles/variant_calling.snakefile @@ -25,7 +25,7 @@ from modules.config_parsers import ( get_genome_single_vcf_index_files, get_genome_vcf_files, get_mt_genomes, get_mt_fasta, get_sample_bamfiles, get_symlinks, parse_config_tabs, get_inputs_for_rule_map_nuclear_MT_SE ) -from modules.filter_alignments import filter_alignments +from modules.filter_alignments import filter_alignments, cat_alignments from modules.general import ( check_tmp_dir, gapped_fasta2contigs, get_seq_name, sam_to_fastq, sam_cov_handle2gapped_fasta, trimmomatic_input, sam_to_ids, run_seqtk_subset, get_SAM_header From 1f47c7b33d8a551c10f13340ca8ba4ef5b3648ae Mon Sep 17 00:00:00 2001 From: domenico-simone Date: Thu, 10 Sep 2020 09:08:38 +0200 Subject: [PATCH 16/31] New documentation: a beginning --- doc/_build/.buildinfo | 2 +- doc/_build/.doctrees/environment.pickle | Bin 11128 -> 15304 bytes doc/_build/.doctrees/index.doctree | Bin 4849 -> 8401 bytes doc/_build/.doctrees/installation.doctree | Bin 0 -> 10564 bytes doc/_build/.doctrees/run-the-pipeline.doctree | Bin 0 -> 26910 bytes doc/_build/_sources/index.rst.txt | 17 +- doc/_build/_sources/installation.rst.txt | 42 + doc/_build/_sources/run-the-pipeline.rst.txt | 138 + doc/_build/doctrees/environment.pickle | Bin 0 -> 14083 bytes doc/_build/doctrees/index.doctree | Bin 0 -> 4994 bytes doc/_build/doctrees/installation.doctree | Bin 0 -> 9271 bytes doc/_build/doctrees/run-the-pipeline.doctree | Bin 0 -> 10645 bytes doc/_build/genindex.html | 6 +- doc/_build/html/.buildinfo | 4 + doc/_build/html/_sources/index.rst.txt | 25 + doc/_build/html/_sources/installation.rst.txt | 40 + .../html/_sources/run-the-pipeline.rst.txt | 74 + doc/_build/html/_static/ajax-loader.gif | Bin 0 -> 673 bytes doc/_build/html/_static/basic.css | 676 + doc/_build/html/_static/classic.css | 261 + doc/_build/html/_static/comment-bright.png | Bin 0 -> 756 bytes doc/_build/html/_static/comment-close.png | Bin 0 -> 829 bytes doc/_build/html/_static/comment.png | Bin 0 -> 641 bytes doc/_build/html/_static/default.css | 1 + doc/_build/html/_static/doctools.js | 315 + .../html/_static/documentation_options.js | 296 + doc/_build/html/_static/down-pressed.png | Bin 0 -> 222 bytes doc/_build/html/_static/down.png | Bin 0 -> 202 bytes doc/_build/html/_static/file.png | Bin 0 -> 286 bytes doc/_build/html/_static/jquery-3.2.1.js | 10253 ++++++++++++++++ doc/_build/html/_static/jquery.js | 4 + doc/_build/html/_static/minus.png | Bin 0 -> 90 bytes doc/_build/html/_static/plus.png | Bin 0 -> 90 bytes doc/_build/html/_static/pygments.css | 69 + doc/_build/html/_static/searchtools.js | 482 + doc/_build/html/_static/sidebar.js | 159 + doc/_build/html/_static/underscore-1.3.1.js | 999 ++ doc/_build/html/_static/underscore.js | 31 + doc/_build/html/_static/up-pressed.png | Bin 0 -> 214 bytes doc/_build/html/_static/up.png | Bin 0 -> 203 bytes doc/_build/html/_static/websupport.js | 808 ++ doc/_build/html/genindex.html | 80 + doc/_build/html/index.html | 124 + doc/_build/html/installation.html | 140 + doc/_build/html/objects.inv | 6 + doc/_build/html/run-the-pipeline.html | 164 + doc/_build/html/search.html | 92 + doc/_build/html/searchindex.js | 1 + doc/_build/index.html | 39 +- doc/_build/installation.html | 140 + doc/_build/objects.inv | 6 +- doc/_build/run-the-pipeline.html | 256 + doc/_build/search.html | 6 +- doc/_build/searchindex.js | 2 +- doc/index.rst | 13 +- doc/installation.rst | 18 +- doc/run-the-pipeline.rst | 80 +- 57 files changed, 15821 insertions(+), 48 deletions(-) create mode 100644 doc/_build/.doctrees/installation.doctree create mode 100644 doc/_build/.doctrees/run-the-pipeline.doctree create mode 100644 doc/_build/_sources/installation.rst.txt create mode 100644 doc/_build/_sources/run-the-pipeline.rst.txt create mode 100644 doc/_build/doctrees/environment.pickle create mode 100644 doc/_build/doctrees/index.doctree create mode 100644 doc/_build/doctrees/installation.doctree create mode 100644 doc/_build/doctrees/run-the-pipeline.doctree create mode 100644 doc/_build/html/.buildinfo create mode 100644 doc/_build/html/_sources/index.rst.txt create mode 100644 doc/_build/html/_sources/installation.rst.txt create mode 100644 doc/_build/html/_sources/run-the-pipeline.rst.txt create mode 100644 doc/_build/html/_static/ajax-loader.gif create mode 100644 doc/_build/html/_static/basic.css create mode 100644 doc/_build/html/_static/classic.css create mode 100644 doc/_build/html/_static/comment-bright.png create mode 100644 doc/_build/html/_static/comment-close.png create mode 100644 doc/_build/html/_static/comment.png create mode 100644 doc/_build/html/_static/default.css create mode 100644 doc/_build/html/_static/doctools.js create mode 100644 doc/_build/html/_static/documentation_options.js create mode 100644 doc/_build/html/_static/down-pressed.png create mode 100644 doc/_build/html/_static/down.png create mode 100644 doc/_build/html/_static/file.png create mode 100644 doc/_build/html/_static/jquery-3.2.1.js create mode 100644 doc/_build/html/_static/jquery.js create mode 100644 doc/_build/html/_static/minus.png create mode 100644 doc/_build/html/_static/plus.png create mode 100644 doc/_build/html/_static/pygments.css create mode 100644 doc/_build/html/_static/searchtools.js create mode 100644 doc/_build/html/_static/sidebar.js create mode 100644 doc/_build/html/_static/underscore-1.3.1.js create mode 100644 doc/_build/html/_static/underscore.js create mode 100644 doc/_build/html/_static/up-pressed.png create mode 100644 doc/_build/html/_static/up.png create mode 100644 doc/_build/html/_static/websupport.js create mode 100644 doc/_build/html/genindex.html create mode 100644 doc/_build/html/index.html create mode 100644 doc/_build/html/installation.html create mode 100644 doc/_build/html/objects.inv create mode 100644 doc/_build/html/run-the-pipeline.html create mode 100644 doc/_build/html/search.html create mode 100644 doc/_build/html/searchindex.js create mode 100644 doc/_build/installation.html create mode 100644 doc/_build/run-the-pipeline.html diff --git a/doc/_build/.buildinfo b/doc/_build/.buildinfo index d7f9af5..bc17b75 100644 --- a/doc/_build/.buildinfo +++ b/doc/_build/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: ef1168243bada5412d7a59954a1116df +config: 81d0878501cab97830171f774c10fe0f tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/doc/_build/.doctrees/environment.pickle b/doc/_build/.doctrees/environment.pickle index 65d048c5fdf863b3d19368f65e3efce9e218e82f..2797da009011cddd7bc95d1265a774a4edea69e2 100644 GIT binary patch literal 15304 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

lDYPz;Y z=^;i~=2sgN?07dOP}~qsqxMDx$3wWd77L=R%q&~~fXbTldm3aC$OPGHQ?txwjK(zT zDZXGP6oR21Vbq_bW`XP$DC}#v3Ro%4^uQ>-m!o=;s{_icPkWRan(4SlpNi4q`o)b? zsDaRMuthb)?P~>}L_yCp=je+QC*2$MV)Pv6+0eJ-tt=K;^WdYnzkD~jOW&<6mfu#~ zLykD&^0FMcnV`bmq`C;%ej<%We9eXmjD7j0S@P2lRTH|8lC4pJm<7j01L*C#CP6r) zbh_N!L?8*V3mM`FrsX@7dh=(v{--0g7z^4>9rZA0W@IiEdHXE={hURne^E~ee#DeT zl#|pOs9|=HIs+uxIb16Z8#e)V#aYj%Z_MbkK5)2DzEMTZBUAWBO`+pVBxZ*Ac8~9> zg97WK9xJ~lwD&t^#krrjQHpjVDBerr-93b(wcuyKHcM!T{&3I1y*wjOpbA#$7|{!k zRDw>jISYS--fM>XE%-U+Fg*Bcdiopu`>c3U^l-N^Q-0=xFZ;%O>(v|TtG@!;+M&7l zERnzeX`f8}?;6yn?EQD}j~G0OYS`%g7R)K8=)wIEq~R)kNA;Fmx> zyb%o3@|K4ug&aMqdY1oTX8;qXP)&vC6ki{pke;*U5?^DP<#%woL2CWI$bWcCIshmJ zeq8jR@S%k7;9rQ5gmk|{aX#?2gbhB{5u K^8+;Rb^Z@t^Y88e diff --git a/doc/_build/.doctrees/index.doctree b/doc/_build/.doctrees/index.doctree index ae84c3d97fd87b581e4dfd938f618cfd450e6d59..28c16efa12498cb3cc9f165ad5c9abac76fa3495 100644 GIT binary patch literal 8401 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 d_is7ED$Zz!HD zn)?!%EgteN_nwucOqZ19I+fAc%*Ty^CF*y~pX!f*B;W{23aydjiX_LSY@`pX7%2&e z=nT@=fuI8((651(x+rn8 zmg7hfjT`2`Zm;+*XT`TzamYKfCNgbCDz38JWPvfN$6<;-F0Vgua}{jS0=u(eT>xLC z_KMw=@V4NQ&4Eoi4EO0oAe1w^lsDT3@5pv$6KCZNpWroP2A;87AhD5|-0&Qt@M4|) z3TE-uI{Rkir5Tyn%6{G`DQjna+J|$GV0fEhajbF?@49p@TcG@DRTn68Yaemt87b6}ET%H(syT>y7!@AJWUR#NMoDHk%L@D*+NBvSAYwgcB}V_4G{FxO&{v z-RZ9O4^kuo3V2cFlm>C;h&Yi0*W4mSiiF^vYfjvdkbncJZ0a}PTANURa?uUjsqp-y9)vDSGC4;LJr;=UoowyR?2T+y)?#Nb3DdaE zGC6?}ZSMJQ%!2H0#wX-#!rHlM^jl;01 zEw)bx2YTPi6afIZEN3DIC`HDX_#{6mX9|Kg<&^IQEZa<5j+}Rdh`m-Sun;2rq~|6e zQqH!0CrQwV_vygtMk`33oOgNHrVaNOR_ z#&c|!`C;S*+l`mD!q9&<+_#g!*Q0SfCmg`4~$@qu5$;`zhi>}C9};CB_jN3bxyrWW*QKAc|z zNz)){Le{`tXFGNxUX|6~n@88yw69xEV5O1k2xf&HOK@hHaaQC-j08f%yu@-@Ll@gqDwTDl26)0~tLxN-}avshb=IM$UkqH1;yN&V`7QjYeY|j7eMdcGzq5JP~d_ z|KlNAsKos&Fn?Rl#ViT^UFK$YCL!+?d2WahOL~WQ6Qru1@$VVMeaP^}u(M>%SL zS7L&vIL}`jhciQ<@GW^|433n1;I9_T|N3~!S<)%TopFRo6LOCABJLz!Qq`uJT=BK~ zOpzIs=oDMTD7KI($AnCY^R3T@0U3ptpAmuvrNKtJ#;5oN*cAUAH2iISI2mq3?%#@NkKUQ?(T)mLn|EOqeRRf~4*g{#;qC{?I!_1O77I zZ&<6`3&e)yhI@e@I`DLGPI@Cy(BTPLOrG=ro3RzKI0*xIOxKIC1BdZJ?k}z8-Zsn8 zldFhX6ap<=V34N0x)(N_7#sL5YiQVyuiw1!*sc0wH`iYzLe}?hJ!wDrL_OinHSH5u zWa9x>U+VIMPX+tmzK^51@t|DQ2KL|+jWR1^{Ou@XG#;A&j_i_r?%T>PUpO|QR`_|0 zK#y>GLY`3(n>}<3{K4_5mX^!y<5Jd=K}ueK93?Lj(jSbFPC(6#uqAyBvSmECQNy&t zZIlz_QW0*fYqQTB9hR9s1XM-5=Tt*A0$9YJCR7^{J)SROAxrPK>n0%8+#WT=uz>#+ zc>hv0z)y}SKdeNQ3w>_$)t@j6{weGs-lOQP^lwMWv|0yN+YbXBnuVQ?*GA|D08wa# zfz^E86Svb=)80@kT16!D;&H;S=)v*A1xG)sa-bSm zMQC(xNN8k2p^r=`G`UgYk@y&-v{YrSwpA6?TPCGRN(UhO33=N01dAQtZuwz*ryBOW zcg1?yYwsXj!LI3IH$#k`Z)b&>sI+kY3M|4UsrycwS&hgMydlCNF>b!)d1Aipjv6)( zh#e-{Txrrg!e^ytOl{I*2h?@U(=z(}FQl}0#NgfO$%%=P3Rc_i`5Q?Dd7uIiA)jFJ zF1`9ru$?;Fc%5oF2}iO`>0b~g**&?)y>0H}Cu}F)rkos}w|f$(ib!jzqBdou_4}9e zz$yp@+aT>g;+Xm_GQlLI9CDWh9&$SWV5BcW2-Z~b8tB=fbQE;~axiX4?gfwt@Scb4 zvgai#W3<}bLDEM~3W1#m_z1`tvSK8o|P1l|LI=&Bn>H2*a`r6q3;gyLibNuO>Ek85_pjMPrXRHtb8Fl zf!jQ0aT;Tg#|?Ri2*z`%Umj{3{trn*Np-oi%W^N~TC4D)I&VOYgq&v@fO!#f*Hj)s z8z^$#yd*{XuQy*S;mWpJ%yJS^`vdwPrvYukS||RuNR2GI¥(?|x@Mg-3@YdP}-c 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 literal 0 HcmV?d00001 diff --git a/doc/_build/_sources/index.rst.txt b/doc/_build/_sources/index.rst.txt index 3c2533b..b002b92 100644 --- a/doc/_build/_sources/index.rst.txt +++ b/doc/_build/_sources/index.rst.txt @@ -1,16 +1,21 @@ -.. MToolBox-Ark documentation master file, created by +.. MToolBox documentation master file, created by sphinx-quickstart on Thu Jul 25 14:43:49 2019. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Welcome to MToolBox-Ark's documentation! -======================================== +Welcome to the MToolBox-snakemake documentation! +================================================ + +**MToolBox** is a pipeline for SNP calling and annotation in mitochondrial genomes. `Since its first publication in 2014`_, it has been used in **>30 peer-reviewed clinical studies**. We have developed a **new snakemake implementation** (available `here`_) in order to facilitate its usage and to offer an integrated and user-friendly tool, with the aim of providing results, tables and plots ready to be discussed and used to drive downstream analyses and wet-lab experiments. + +And with this new implementation, MToolBox is also capable of analysing also mt data from **other species**! .. toctree:: :maxdepth: 2 - :caption: Contents: + :caption: Eager to use MToolBox? Follow our tutorials to install and run the pipeline! - feature-a + installation + run-the-pipeline Indices and tables @@ -20,3 +25,5 @@ Indices and tables * :ref:`modindex` * :ref:`search` +.. _`here`: https://github.com/mitoNGS/MToolBox_snakemake +.. _`Since its first publication in 2014`: https://pubmed.ncbi.nlm.nih.gov/25028726 \ No newline at end of file diff --git a/doc/_build/_sources/installation.rst.txt b/doc/_build/_sources/installation.rst.txt new file mode 100644 index 0000000..07c482e --- /dev/null +++ b/doc/_build/_sources/installation.rst.txt @@ -0,0 +1,42 @@ +Installation +============ + +Install Anaconda +---------------- + +`MToolBox_snakemake`_, an update of the `MToolBox pipeline`_, is deployed in a conda environment, *i.e.* a virtual environment with all the needed tools/modules. Installing Anaconda is therefore essential, before installing the pipeline. + +To this purpose, please follow instructions at http://docs.anaconda.com/anaconda/install/linux/ (hint: download the Anaconda installer in your personal directory with `wget https://repo.continuum.io/archive/Anaconda3-2018.12-Linux-x86_64.sh`). + +Install MToolBox-snakemake +-------------------------- + +We recommend to download MToolBox-snakemake by cloning the official repo on `GitHub`_: + +.. code-block:: bash + + # Pick a folder for your installation + # and replace /path/to/MToolBox_snakemake with it + cd /path/to/MToolBox_snakemake + + # fetch repo + git clone https://github.com/mitoNGS/MToolBox_snakemake.git + +Please note: you could also conveniently download MToolBox-snakemake at `this link`_, but by doing so you will miss the chance to easily integrate future updates! + +Once you have cloned (or downloaded and unzipped) the repo, installing MToolBox should be as easy as running + +.. code-block:: bash + + cd MToolBox_snakemake + bash install.sh + +The setup script ``install.sh`` will: + +- install the ``mtoolbox`` conda environment with all the required dependencies +- create a command (``mtoolbox-activate``) which will be used to activate the MToolBox conda environment and add the folders of MToolBox executables and utilities to your ``PATH``. + +.. _`MToolBox_snakemake`: https://github.com/mitoNGS/MToolBox_snakemake +.. _`MToolBox pipeline`: https://github.com/mitoNGS/MToolBox +.. _`GitHub`: https://github.com/ +.. _`this link`: https://github.com/mitoNGS/MToolBox_snakemake/archive/master.zip \ No newline at end of file diff --git a/doc/_build/_sources/run-the-pipeline.rst.txt b/doc/_build/_sources/run-the-pipeline.rst.txt new file mode 100644 index 0000000..4ea6eb9 --- /dev/null +++ b/doc/_build/_sources/run-the-pipeline.rst.txt @@ -0,0 +1,138 @@ +Run MToolBox +============ + +MToolBox is made by several snakemake workflows which can be run independently. We provide wrappers for the most common tasks and analyses. Using these wrappers will save a lot of typing and headache for the lazy users (probably *you*). Cool, isn't it? :) + +All the wrappers accepts snakemake arguments and parse automatically the `config.yaml` configuration file required by snakemake. + +Before starting... +------------------ + +Hints on functional annotation. + +Setting up a working directory +------------------------------ + +Replace :code:`/path/to/MToolBox/dir/` with the MToolBox installation path and :code:`/path/to/analysis/dir` with the folder where you wish to run your analysis. + +.. code-block:: bash + + export MTOOLBOX_DIR=/path/to/MToolBox/dir/ + + cd /path/to/analysis/dir + + # create folders needed by the workflow + mkdir -p data/reads + mkdir -p data/genomes + mkdir -p logs/cluster_jobs + + # copy configuration files you will edit later + cp $MTOOLBOX_DIR/config.yaml . + cp $MTOOLBOX_DIR/cluster.yaml . + cp $MTOOLBOX_DIR/data/*.tab data + +At this point, if you run the command :code:`tree` the structure of your directory should look like + +.. code-block:: bash + + . + ├── cluster.yaml + ├── config.yaml + ├── data + │   ├── analysis.tab + │   ├── datasets.tab + │   ├── genomes + │   ├── reads + │   └── reference_genomes.tab + └── logs + └── cluster_jobs + +Compiling configuration files +----------------------------- + +An MToolBox-snakemake run is managed with these configuration files: + +- :code:`data/analysis.tab` +- :code:`data/reference_genomes.tab` +- :code:`data/datasets.tab` +- :code:`config.yaml` +- :code:`cluster.yaml` + +Sounds a pain, huh? The good news is that they will help you in setting up and keeping track of your analyses very efficiently. Plus, the :code:`config.yaml` and :code:`cluster.yaml` files should work the way they are. **Please read the "Notes on configuration files" at the end of this section**. + +Let's see how to compile the configuration files in detail. + +- :code:`data/analysis.tab` + +For each sample you are going to analyse, in this table you provide info about which mitochondrial and nuclear reference genomes to use. Example: + ++----------+---------------+-----------------+ +| sample | ref_genome_mt | ref_genome_n | ++==========+===============+=================+ +| sample_1 | NC_001323.1 | GCF_000002315.5 | ++----------+---------------+-----------------+ +| sample_2 | NC_001323.1 | GCF_000002315.5 | ++----------+---------------+-----------------+ + +In this example, the first row specifies that variant calling will be performed on :code:`sample_1` using the mitochondrial reference genome :code:`NC_001323.1`, by discarding those reads aligning on the nuclear reference genome :code:`GCF_000002315.5`. Please note that the names used in this table will be used in the workflow execution and are case-sensitive. Actual files related to samples and reference genomes will be provided in the :code:`data/reference_genomes.tab` and in the :code:`data/datasets.tab` files. + +- :code:`data/reference_genomes.tab` + +Structure (strictly **tab-separated**): + ++---------------+-----------------------+--------------------+-----------------------+---------+ +| ref_genome_mt | ref_genome_n | ref_genome_mt_file | ref_genome_n_file | species | ++===============+=======================+====================+=======================+=========+ +| NC_001323.1 | GCF_000002315.5.fasta | NC_001323.1.fasta | GCF_000002315.5.fasta | ggallus | ++---------------+-----------------------+--------------------+-----------------------+---------+ + +This table contains explicit names for reference genome files used in the workflow. Names in the columns :code:`ref_genome_mt` and :code:`ref_genome_n` must be consistent with the ones in the same columns in the :code:`data/analysis.tab` table. Genome files must be located in the :code:`data/genomes` folder. + +The name in the column :code:`species` should be consistent with the `species available in mtoolnote`_ for the variant functional annotation. + +How to run the MToolBox wrappers +-------------------------------- + +Running the wrappers is as simple as this: + +.. code-block:: bash + + export PATH=/path/to/MToolBox/dir/:$PATH + + MToolBox- + +*E.g.* if you want to run the MToolBox-variant-calling wrapper and print the commands it will execute, you can run + +.. code-block:: bash + + export PATH=/path/to/MToolBox/dir/:$PATH + + MToolBox-variant-calling -p + +You can also display a graphical representation of the workflow by running + +.. code-block:: bash + + export PATH=/path/to/MToolBox/dir/:$PATH + + MToolBox-variant-calling --dag | display + +This will show the workflow in a browser. Alternatively, you can save the workflow representation in a file by running + +.. code-block:: bash + + export PATH=/path/to/MToolBox/dir/:$PATH + + MToolBox-variant-calling --dag > workflow.svg + +Available wrappers +------------------ + +- `MToolBox-variant-calling`_ + +MToolBox-variant-calling +^^^^^^^^^^^^^^^^^^^^^^^^ + +Performs QC, quality trimming of raw reads, read alignment, alignment filtering, variant calling. The final output is a VCF file. + +.. _`species available in mtoolnote`: https://github.com/mitoNGS/mtoolnote#features \ No newline at end of file diff --git a/doc/_build/doctrees/environment.pickle b/doc/_build/doctrees/environment.pickle new file mode 100644 index 0000000000000000000000000000000000000000..f3115d2980021696e8cffbd6c5b0d5f555300912 GIT binary patch literal 14083 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 D21y`b literal 0 HcmV?d00001 diff --git a/doc/_build/doctrees/index.doctree b/doc/_build/doctrees/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..87044bf3ece1e281c5b5373b50bcaf080225a0df GIT binary patch literal 4994 zcmds5-ESO85x3*4y}ORrjuVFf2^u8g^F_DbO9<%B(t-F85=3Vt2p}GER>(1A;jaLV}ZkXZR0J$2&p@35jR^5cpNk%zh;}ekRgJ?&|95>Z)IT z%?~fXe|Bxj{j;4=1-X%t-cMA>bzz%Ch&1EOL7`sO30qA#nFSBqmts>F+#HaznNGUBgzLB^Tkq1PX`bt+^s z>b{-J;6xji84t{lMDBefkG%Vz^X@%3c<|YS2d{hgU%mJGe*60>_X3u9EM%$ijF8%i z^q@%^al@mrXOuUF&R!%>WHNlk>*vOk#?wOOQRp$_MI5@c1CgOj0Z-Z^8G@rJudLl%a8bo?DGHiyq^}%(V`(%?P|*4T2qMiyw7Z#8Iwua4$vSd ztjJKq?eKZTv<4A>Hxd??e>KBAoi6$;ILY|H@w7&9bf8m45Nf6w*E~DrMQ+y&8`6nF zw8V~B5zAu5uGU!ld{3yD_gEO;?|qe@@<^p{Wv_;ouM>8{WBhsmSx+V*AMIz_6!vl? z6J9)Qf7dl{OJ-BTNh@Zn)n_b z+M|bxJBQ+>Ls(hdfN8}|KOgaSa9oj20K>~>)mv4&qibK1V_eGg6N)LBH*?evr))XBZ`NYfO4c4f{tx{1$hGZ=mVf@7^!~o)UFB{ zhRA|X?M5YQLTDy=+~*k&i-$|L?J%ZQ5{<#zMl!9%3P~RRc4fbH*zcQ*aIl+|X}V|d zcFMDYEh6O2+U}(sAc{}SX78MpaPAuAY!Dmd<-Qtq=khXyR?xG%)qxuS^?^nFvssYt zK?N7Q)l&$hFPGJ08g2VE!ES#&31z^w$CA)9tWO?rDR%3*TT^8I1o!;-;>e`fd3Ppu zt~+F|_wxuv!jB|!MP1~kYA)Fp?fBC0cxKyf9w3<=91VHmaCcN{{Dt~a;@9p4-?CRy zj@Knae+2#+0TsiNU6qML;mp6>UO<0RHdNb$k&V zzsKnh7EjMI*)^Oq;}nT`g(RTb^FgR$6vaaP*{);7M`gJF#UY$TcBS2vi3#ot60Gis0z>c z>hI21zpMF0x&Fh#8vdvyEcoMJi`wmpKV8Tb|6DwHVORWn!4=}e8STVJ;w|x)Ig5V` z_W8$ox6N9dnE&=7=5sCHDWgMkmIdOdy$~FBV{W_LotXc)vAne8JTmdXl(dC@zzLmq z!EqaB7B#-07mnASbM~T+IKGa<&-$WP@;RQkDRz!mUU1{AGr%wYv-q@G^@#adXH1iR zoy+SCZCA^TSJ>sduBZ6fOjNr3I9D>Z5i^vXyU5PnDmzc>L%lnjyU(o!NV?~#RyBKK zmtM7OJ3*dN|LIqB6!er)p?yST1FjmEgJ+XD;=i86d< z^Wn1Hphgpg-yaQB78js&G#ZoCujV5Sk)JFnJmNGlY5zVOct z_6i=O5dvk43)EC>e%;I3PRdiCDmOw2k&KJcm85_xt|n|-PZ*QxgI@3K>})?B8=;bY zl?{6#Kkb22_X@j1CrBcl@X-vx%EpavJni0j^#RP%$p*o~HAIxf!@? zgoz_u(L#1X2!zyaH|=czD)uL_HBsL$=fk5Ft6nU4o;PdTMuqNU;+i)2xhq z%te@xX}W%5S9o$-pt-TlG7}*5fFjD!^l`#3doed+U&Td0g+W4uZ7|r-#BR6esO4}D zGNcVA3+mozt_OXMh~?jV;vF$QegiRjd_dL9wrGz!MfWK{ymRO_4|8#o#@Dg9>-faG zx!ss`qLaIU_R+zW;8Id3&}zQ&0kf2n4__DH%DAth2`(J#^#$UDyEP}VRp06kZO_Sf zUzsRL?<~ryc9v`tX<)+E!NiT|!Iut=3{wi6MEe|heL{B5YKN47s#v9lHSh2L7nd?; ATmS$7 literal 0 HcmV?d00001 diff --git a/doc/_build/doctrees/installation.doctree b/doc/_build/doctrees/installation.doctree new file mode 100644 index 0000000000000000000000000000000000000000..85a7ff01ce470d7e2334605eba7b0a3f13a84bf4 GIT binary patch literal 9271 zcmdT~?Q0yz8JBG7q?4tyEJtZ^WU|3=B0JWdlcvF#q%<$oN!^G-l|Uis-rVh+X3u-O zo84KxdnAW#ZzKQ$Cu2owVSP+Iz>^!Lo(%Nzpg z72N4|UY_Tf=WTxT%zk(7$5$So(SNGpMcqvLLD~!>kEgj>q=o?xW&Wf5()aRr^G#Jx z*nS#iNtfqp1|zz{54?nj`P;deQ41;WN^#kuS^dGj**&?Yk$RC}F$UkV4lqIrazdmtpC?6ftA zye!~p(-~?EcCbn#z7Pt=j1ul}7(SFf3$8ewqGf0pnnJQ0iJMy4p zt984`($H_&su zz?aeXjc-lxLT&Ds!1*g`G2v+x>~Sx@ISYHQtFse~Sjs!On?F-h& z|GpC;Um&-{SrSJnzv9FJXDN4jQ4mD?$Z)AlGQAb14wDXfCPEckLE2=)e6AzbJeVD# zg?yPEw46=hhw{4PMf+h8F=RRd1sVp-g&+&De=~l13pirspTvfurQG$d^ug zf0q~RDODsqj=&ZvFwC++(~nv#!3Ms^TZZ8YYVsj^MfnUFWu4U}<>iu%oQbF2Yzc|ibWTc;4Bb|VoTVpGF8duA7 zX`_y5!?aOOP^&|@v1P(OX9kwpJ^-pA-eXm$Mg)i0(?Ydr(4*OJjgBp>v>kT2;q0_$M%U82b+ig1EjxwhU_(&Ow@L+ssASC6f z6j%mntaIojSr`@o4U_v}<(fG-bEW>hib-9})!A6J)K0Wozer%_z35WFO- zUF(zMT+0ACGZh%+>;#NrG0DdklYI4aYsXqueSTWwdMZ8IcyHBH&CW@uCG8$?iy5^N z_>w0qa63WNy;Vg&x4WLxikTEG8BIX0OG_8b0Ru>PsW>(az3WvOA2`x@H zh(fOS+^O+#6Z4Fv9~^14P z4*n0r)@bz}X4qx-H%N|i{d4qBpS!0y)fxvpS4!TW0|krTF2duC(B=7UiF9MI6%daR ze9F;QXl<)a@H@^{{j(U*e~7-;@ijC|{|oqir~gHKAF;zmxtama(i(ah zbdS>zx#5e%yAVM`sM>HjR@ch3Ob~RsEcIALtuyLWCj+jQZs4OvQ=a!B@UVterydu} zA5^;4>n0x&OmDXbRF~*P2T=c!D#vIYBjN94K zW+6{SN)p*@uu9ifa81TC7%o-Ay=^zX-x;Y~pN|dfs9<1n!}`-M-}P z3m@AQMI_2kPL}ElmSaZfGoDFH6BG&5<1nu{3gVdQ;mAjL$r40(%4EeUvEBaWi#xBj+s&mh7gN9b|67Az0^z^4qq3K-Jh2xx{h>DhXn3qoG@FT& zGbT=~NlPv|V1A}aP8Bc(cgX(z|GiU`t9T%!xr=QUjqe(B%#kaXvTFV4ojZj4d2bx0bOLlu>L-{gnmSPRnCN{-7fNlU4cqe}=eJO&*o|F)jCv;=DUi z@ngc(a0o#uzamlDQmXNv6)`p^icvb1ttxC8%TuMjpsq`0~( z%NXPBV+2o@8!26Y-91~{OFeNJ>lL%A(ajRN^mFZH-?C|;(@egt7J-9N*~B46ov}BW zJ=`uyK&xEU-ef@rbY)>(V_VgCd5BXfDh-%lr&}!CM-E~=c4nu6pb zMGFtOZgJ_l%QaV(;5eKxyt~|1%XHdJfK=)3F~502EeRIb$9Z*zANbIfWHL+5pm{a# z@lLi2c8z_OP*DXVfL;b@smlZhM_N>VTQ&SJ&ZG-G8hIF%t9mATTi3QyAHO$7J6)b6 zQQ`_<4wR&!XA-q5b9Fk(h9C7_}}ABI=V2^bppa11_y`)YL-mGUU@+!5%#t!jYmJuDL%@jVx(=$?O&i<)Y% zOh#_mq)zy7sueFA#IAKbC{{P1c+V5mQZsXj$r#1CO^ZUVRp7 zX(YYw7#nIS*=(3Pn7+bo`ds!j8zBb)Sk!@I5dxkR`OQUj9u75dZEV@i!YyhYchtjL z8XS#yLT?hlZ%IcU9QhPpSFn!=yw&tDl|2BtEJpdq#q3*IOcfR6o}zAEg!>&hN!0bj9!zcGe~mIinsr9U zt@1&KdkD!x@Ddzb`W>~7VivpQ;#C4aZ~^~O)uERcZmW~HI;S@s=suS+0YVR6mavZdqofmfKCuvenvEvC$t zg{Mzgrf);&%?prTAiBlx&3+vr-ml?Hd?-HX&(hPsv5WTqL|=cTuTSaguk`gV`uYdH zGF2xU@-T)9@Lq$avMoN`)&#con$Icmfp|(Y5g!#C{$M%$#c=5V zO|x04I-3@LrRyV?k^-TiqJT9C)H$c>`oxdEbAF%s(+h6sB+Bz;GYDNSQ+=2k`aDqS57YB+q_3yv^mNQN zWthYcPxU_ZaD?Z(F%QyLQn61TlH5^V7?l0Rq?i(iUP;g4<)reI&ug#r+|?wozI-hV z{YS&Cl=`9D#5KM}3`gF6D>VXu;Bh?_F|bsrI4bswgL*0#XjM=6Ucl4Uq|NjUQ!4h_ ziNZuk@PnQ!A*4R!_)JPP;`e00`q{6;ZW2`wZRV`UyhD8weMqq`y-LM`I3Z?B+hw zOd5=2?qN|M1Yjy%!MmIg7hvz=G>lx_2@i4?K6m4D4?g$8fW>+71!4sTi~7@bsJ(an z$0gV*?Jw55)X+F0Eg#GAbK;~}f`LyIE(6?`GZ!i*_4SJ|95TDo4w>WdNXeRAv$$(q zZ)S<`5U@O!sIbqJ=P)0pLj=~GFz9&Q=79D6H5f2GBr&?cjys+YKfqs2yqLSjc@#dW zS=!cm!Kb-?Gw*&z6E-+ zGMU4Ls1=lS)rMJqyRH;CwL`wAXw$9(^~|V%#eA}P7OQdl&Gk^@yj>5-@qj_eB z%0}Je_ef}i@$zXjzbO7UDjH*NYWQ-;r zs5G$`kd)@3KOlio4eibc%wm`^F0A4{J)Z;4Zu_CLUWeU3`BoIh3NiOH&piF;GheYE zd-CeTrAmh|I5Xq8R{5%~?HMPs&ekckYW~$~-sH8PNLYZ`r11W3%ZWKt6d02ANh{#o z&2}iWC*}d|On)85YBeIuWs0>h#FZm$T^=9^ueJJNSGJsto!txDvcSzJZ{j5q%|7>= z_kq6_BI)U^zP}wY{nM%-#y3y~ubnPNp%kL@-_ z@P$n9LQRF}b4K*MwPIt0|JUw?-`}jpYCMbzvO9P684N4j)mx>?XYaNo%o$-8HYrmK zSkyypLy+#x?ccX=oZ#XQ;*a7_Ida9HZ-}>tA$qbBqLNyl0VpX7OZL zWNFuqVO#HPIl{dM`sN@gK~@f1ng* zH{ut0*k>{EVj2*?0^QYoM|}3;waeS=gezz1<;+a62#tsGwCxe=p{fp3=4+1>)BGq% zm+BzH?OlQ{K8y*R9o9Cm<8%)aBOU_*u%R9C8UIbTrtMOMX^Vt zfL^LAp`0X9*g;f<)R%8@6dL)mAx;G=RI7~E&WQ(0cQBR7P-t_4B&wW`ng2^W%s0Lio|-BM8op^b^20+pqsR1l>q zPae@y4F*UjZ&_;L7LqKr(EBE>{)yi85fF^`^aTj+8=igzf|qU?2pTTyTHh!%Sm@#- zqhBh!*Up#x-nmnS+yp_V4=Adq9oVj!~yaB4l0kkq-p`2@Vbhl^Zm* z^r2xRfHG7}UGM!+`d_gxwcGny2D_hrAlR)8tF?mN%eNMGkCf)vlpCcTezZ(V6&V2j z@JwXVi#olkr5hg~x1o`&q*>>XlT-m;d zIPj!W>kNp{FMyi|3~Lj$*+_V>n9Vdw(O@PW0ZzKYbYWfY9IIZhB?^ zIOY^=6?@3z82r~Age5+I$@siO|4d3ki$}+|+a9jysccPCy}w~ZeVfK+hb_dlz`=NY zZm;m&uSoCM0i&cN^lwl3)Lc2jVD&O&tpN4LvpmL$X~33U?7wJ@q2<6WqEe{qe%8 zor z3PQzeFR$#^^K?5UNc#2`85rD|UXU=X$fg7pLnTO_%v!k5O^ZzjPIhr+1RV1L`5lr~ zJ%<1sE$hYk<7|# zR3;6TRG%JsGeV-*fwk#{jBX{vjFIZQ^PifFPxyqnLv*%Z2)n@0-~kE$bV5^s)LkRx-Ou#NaksYtH0 zTAQ1j&1j%R7&ODU+j99v3q55k)r&NODAEWUK@7C4sBDk+#yy|EA8J{MJI)9jYN^JsLUw6erN^_gqk|jzb|Z}!AjhE_2tXX^ z$OVvRv1yf$FubF3fFya#E)NlK#Nda7@HyFMu%}lOn6Jdh+st$JXyZJKXkWJw-xGwIOd?+X2-w? zs8G0K2i>@IzwCARs-f2G4jP(4ty4a1zcIa%_9!T1QcsbE;EEf@9-@KS?{mE`!G?Pe z)7M?-*gHdCZ_(GU=<5Q#c!0iI^hNt&qNiy*ZgN5YxKv{(teVlQX5^|FwQ5GJCgM)& zLkz^Mp)Qh)G?iO3(iD>!(q{W5 - Index — MToolBox-Ark documentation + Index — MToolBox documentation @@ -25,7 +25,7 @@

Navigation

  • index
  • - + @@ -69,7 +69,7 @@

    Navigation

  • index
  • - + +
    @@ -69,12 +68,13 @@

    Navigation

  • index
  • - + + \ No newline at end of file diff --git a/doc/_build/index.html b/doc/_build/index.html index d7b8130..a01c999 100644 --- a/doc/_build/index.html +++ b/doc/_build/index.html @@ -1,19 +1,19 @@ - + - + - - + + Welcome to the MToolBox-snakemake documentation! — MToolBox documentation - - - - + + + + + @@ -28,7 +28,8 @@

    Navigation

  • next |
  • - + + @@ -64,13 +65,14 @@

    Welcome to the MToolBox-snakemake documentation!

    Indices and tables

    +
    @@ -93,17 +95,15 @@

    This Page

    - +
    @@ -117,12 +117,13 @@

    Navigation

  • next |
  • - + + \ No newline at end of file diff --git a/doc/_build/installation.html b/doc/_build/installation.html index 3a24099..bad6a5b 100644 --- a/doc/_build/installation.html +++ b/doc/_build/installation.html @@ -1,22 +1,24 @@ - + - + - - + + Installation — MToolBox documentation - - - - + + + + + - + + + @@ -59,13 +68,14 @@

    Install MToolBox-snakemakeinstall.sh will:

      -
    • install the mtoolbox conda environment with all the required dependencies
    • -
    • create a command (mtoolbox-activate) which will be used to activate the MToolBox conda environment and add the folders of MToolBox executables and utilities to your PATH.
    • +
    • install the mtoolbox conda environment with all the required dependencies

    • +
    • create a command (mtoolbox-activate) which will be used to activate the MToolBox conda environment and add the folders of MToolBox executables and utilities to your PATH.

    +
    @@ -80,6 +90,12 @@

    Table of Contents

    +

    Previous topic

    +

    Welcome to the MToolBox-snakemake documentation!

    +

    Next topic

    +

    Run MToolBox

    This Page

      @@ -88,17 +104,15 @@

      This Page

    - +
    @@ -109,12 +123,19 @@

    Navigation

  • index
  • - +
  • + next |
  • +
  • + previous |
  • + + \ No newline at end of file diff --git a/doc/_build/mtoolbox-variant-calling.html b/doc/_build/mtoolbox-variant-calling.html new file mode 100644 index 0000000..5d47c3f --- /dev/null +++ b/doc/_build/mtoolbox-variant-calling.html @@ -0,0 +1,147 @@ + + + + + + + + MToolBox-variant-calling — MToolBox documentation + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    +

    MToolBox-variant-calling

    +

    This wrapper performs QC, quality trimming of raw reads, read alignment, alignment filtering, variant calling. The final output is a VCF file.

    +
    +

    What should I look to, here?

    +

    TL;DR

    +
      +
    • the VCF file in the results/vcf folder

    • +
    • the BED file(s) in the results/<sample> folder.

    • +
    +

    Both file formats can be imported in a genome browser (eg IGV) to visually inspect your results.

    +
    +

    The VCF output

    +

    The VCF (variant call format) file is roughly a table where, after a ton of comment lines (starting with ##), rows are variants and columns are samples. You can find a detailed description of the VCF format here, although MToolBox-snakemake provides a slightly different version to report the allele heteroplasmy frequency. To spare you some headache, we’ll give you a brief summary of the genotype info you’ll find for each sample.

    +

    The FORMAT field lists data types and order that are available for samples (following fields). Each sample has colon-separated data corresponding to the types specified in the FORMAT.

    +
      +
    • GT (genotype) reports all the alleles found for that sample, where 0 is the reference allele (REF field) and 1, 2, … are the alleles in the same order as in the ALT field.

    • +
    • DP (depth) reports the total coverage depth for that site in the genome, i.e. the number of reads mapping on it.

    • +
    • HF (heteroplasmic frequency) reports, for each allele in GT (excluding REF), the HF.

    • +
    • CILOW (confidence interval, lower bound) reports, for each allele in GT (excluding REF), the lower bound of the CI.

    • +
    • CIUP (confidence interval, upper bound) reports, for each allele in GT (excluding REF), the upper bound of the CI.

    • +
    • SDP (strand read depth) reports, for each allele in GT (excluding REF), the number of times the allele was observed on the plus strand and on the minus strand, semi-colon separated.

    • +
    +

    If you consider this example:

    +
    #CHROM       POS    ID  REF  ALT  QUAL  FILTER  INFO       FORMAT                   Scer_mt_500K                     Scer_mt_100K
    +NC_001224.1  50000  .   A    C    .     PASS    AN=4;AC=2  GT:DP:HF:CILOW:CIUP:SDP  0/1:359:0.46:0.409:0.511:90;75   0/1:75:0.387:0.284:0.5:11;18
    +NC_001224.1  69045  .   C    T    .     PASS    AN=2;AC=1  GT:DP:HF:CILOW:CIUP:SDP  0/1:365:0.033:0.018:0.057:0;12   ./.:.:.:.:.:.
    +
    +
    +

    sample Scer_mt_500K, in mt position 50000, has 359 aligned reads and one variant allele (C) with HF=0.46. The CI for this HF is 0.409 to 0.511. The variant allele is supported by 90 reads on the plus strand and 75 reads on the minus strand.

    +
    +
    +

    The BED output

    +

    The BED (browser extensible data) file is a useful and intuitive way to inspect the variant calling results through a genome browser. Once you import this file in a genome browser, variants will be colour-coded (blue for mutations, green for insertions, red for deletions) and shaded according to the HF (the darker the shade, the higher the HF).

    +
    +
    +

    What to do next?

    +

    Once you have run the wrapper, you will notice that the results folder includes a ton of files. A guide to these files is coming soon.

    +
    +
    +
    + + +
    +
    +
    +
    + +
    +
    + + + + \ No newline at end of file diff --git a/doc/_build/objects.inv b/doc/_build/objects.inv index f693aaa1706e161b7460d6e24ae540d92374d36b..020e73599e7009585847402ec82b5fffa33651ea 100644 GIT binary patch delta 247 zcmVJ)_UJ?s?H%iv1eS0=I zp>Fv*Sh8owGoKBPSkN)K*Fs(*6C?+uBFqOnNw^K{t-G=CxAnT0oa`O3l_&}CO@|aI z;NdeP!5-6`vZ~eoIB(6#wp2Ba7fhZrTG8Ad?PkZE9{AuUf^av?x~$$Q8L3iSY1kx? z(l`88U&~L5$sB&59gc1t)H@pvCE>!IMPc>|^A2MK66ZB8QrFi0=2_y_=UhxpQ~VFn x_9(r+^bBk)wF6xnh$66(GAssc#;4B delta 207 zcmV;=05JdM0=)u|c7J_Oy=ucS5Z?6^>H}P$YY82?WeAiukojs|Y|+!5i6n5|K5}Kp zPFgw$r0-t{qKQBSPFb4dRgeLtfH*#EOzy>LW8vB2|I$sD0^6;qO+GQbnwG?iqv0om z@r!s&nb9iWjaReCrmB_VNZe>3n@Vm+c7IUiHyt1fep4vN7D!JHBz47835yAtf6ZUx zbNPappze>g{RL*CdiLrv)3p1X1 + - + - - + + Run MToolBox — MToolBox documentation - - - - + + + + + + @@ -85,174 +90,168 @@

    Setting up a working directory

    An MToolBox-snakemake run is managed with these configuration files:

      -
    • data/analysis.tab
    • -
    • data/reference_genomes.tab
    • -
    • data/datasets.tab
    • -
    • config.yaml
    • -
    • cluster.yaml
    • +
    • data/analysis.tab

    • +
    • data/reference_genomes.tab

    • +
    • data/datasets.tab

    • +
    • config.yaml

    • +
    • cluster.yaml

    Sounds a pain, huh? The good news is that they will help you in setting up and keeping track of your analyses very efficiently. Plus, the config.yaml and cluster.yaml files should work the way they are, with little to no edit needed. Please read the “Notes on configuration files” at the end of this section.

    Let’s see how to compile the configuration files in detail.

      -
    • data/analysis.tab
    • +
    • data/analysis.tab

    For each sample you are going to analyse, in this table you provide info about which mitochondrial and nuclear reference genomes to use. Example:

    - +
    ---+++ - - - - + + + + - - - - + + + + - - - + + +
    sampleref_genome_mtref_genome_n

    sample

    ref_genome_mt

    ref_genome_n

    sample_1NC_001323.1GCF_000002315.5

    sample_1

    NC_001323.1

    GCF_000002315.5

    sample_2NC_001323.1GCF_000002315.5

    sample_2

    NC_001323.1

    GCF_000002315.5

    In this example, the first row specifies that variant calling will be performed on sample_1 using the mitochondrial reference genome NC_001323.1, by discarding those reads aligning on the nuclear reference genome GCF_000002315.5. Please note that the names used in this table will be used in the workflow execution and are case-sensitive. Actual files related to samples and reference genomes will be provided in the data/reference_genomes.tab and in the data/datasets.tab files.

      -
    • data/reference_genomes.tab
    • +
    • data/reference_genomes.tab

    Structure (strictly tab-separated):

    - +
    -----+++++ - - - - - - + + + + + + - - - - - - + + + + + +
    ref_genome_mtref_genome_nref_genome_mt_fileref_genome_n_filespecies

    ref_genome_mt

    ref_genome_n

    ref_genome_mt_file

    ref_genome_n_file

    species

    NC_001323.1GCF_000002315.5NC_001323.1.fastaGCF_000002315.5.fastaggallus

    NC_001323.1

    GCF_000002315.5

    NC_001323.1.fasta

    GCF_000002315.5.fasta

    ggallus

    This table contains explicit names for reference genome files used in the workflow. Names in the columns ref_genome_mt and ref_genome_n must be consistent with the ones in the same columns in the data/analysis.tab table. Genome files must be located in the data/genomes folder.

    The name in the column species should be one of the species available in mtoolnote for variant functional annotation.

      -
    • data/datasets.tab
    • +
    • data/datasets.tab

    Fill this table with as many read (paired) datasets are available per sample. Each read dataset will be processed independently and merged with the others from the same sample before the variant calling stage. Read dataset files must be located in the data/reads folder.

    Example:

    - +
    ----++++ - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - + + + +
    samplelibraryR1R2

    sample

    library

    R1

    R2

    sample_11sample_1_R1_001.fastq.gzsample_1_R2_001.fastq.gz

    sample_1

    1

    sample_1_R1_001.fastq.gz

    sample_1_R2_001.fastq.gz

    sample_12sample_1_R1_002.fastq.gzsample_1_R2_002.fastq.gz

    sample_1

    2

    sample_1_R1_002.fastq.gz

    sample_1_R2_002.fastq.gz

    sample_21sample_2_R1.fastq.gzsample_2_R2.fastq.gz

    sample_2

    1

    sample_2_R1.fastq.gz

    sample_2_R2.fastq.gz

    In this case, sample_1 is represented by two PE libraries, while sample_2 is represented by one.

      -
    • config.yaml
    • +
    • config.yaml

    This file contains basic configuration for the whole workflow. Default configuration should fit most cases; you might want to check the following options:

      -
    • mark_duplicates: remove duplicate alignments with Picard MarkDuplicates. Default is False.
    • -
    • keep_orphans: the first alignment round might leave some reads “orphan”, i.e. their mate has been discarded. This can happen for two reasons: 1) the discarded read has so many sequencing errors it couldn’t be properly mapped or 2) the discarded read maps only on the nuclear genome: this could mean that the whole read pair represents a nuclear region overlapping a NumtS (nuclear sequences of mitochondrial origin). Either case, you might want to discard these “orphan reads” since they could represent a source of error/noise for downstream analyses. Default is to keep them (True).
    • -
    • trimBam: read aligners sometime struggle to properly align reads at their ends when they contain an indel or when they encompass low-complexity regions or homopolymeric stretches. Despite all the post-processing efforts we could implement (e.g. read re-alignment around indels), misalignments could still make it to the variant calling step and introduce noise (e.g. variants with very low heteroplasmy fraction which eat into the HF of a properly called variant). To prevent this, you can choose to “mask” (soft-clip) 10 nucleotides at each alignment end. Default is True (mask the alignment ends). Please note that, at the moment, the number of nts you can mask at each end (10) cannot be modified.
    • +
    • mark_duplicates: remove duplicate alignments with Picard MarkDuplicates. Default is False.

    • +
    • keep_orphans: the first alignment round might leave some reads “orphan”, i.e. their mate has been discarded. This can happen for two reasons: 1) the discarded read has so many sequencing errors it couldn’t be properly mapped or 2) the discarded read maps only on the nuclear genome: this could mean that the whole read pair represents a nuclear region overlapping a NumtS (nuclear sequences of mitochondrial origin). Either case, you might want to discard these “orphan reads” since they could represent a source of error/noise for downstream analyses. Default is to keep them (True).

    • +
    • trimBam: read aligners sometime struggle to properly align reads at their ends when they contain an indel or when they encompass low-complexity regions or homopolymeric stretches. Despite all the post-processing efforts we could implement (e.g. read re-alignment around indels), misalignments could still make it to the variant calling step and introduce noise (e.g. variants with very low heteroplasmy fraction which eat into the HF of a properly called variant). To prevent this, you can choose to “mask” (soft-clip) 10 nucleotides at each alignment end. Default is True (mask the alignment ends). Please note that, at the moment, the number of nts you can mask at each end (10) cannot be modified.

      -
    • cluster.yaml
    • +
    • cluster.yaml

    -

    TODO: add stuff

    +

    If you are analysing huge datasets, it would be a good idea to run MToolBox-snakemake on a computing cluster. The file cluster.yaml contains settings for this scenario, which should work well as they are.

    A recap

    alternate text -

    An overview of MToolBox-snakemake configuration files

    +

    An overview of MToolBox-snakemake configuration files

    How to run the MToolBox wrappers

    Running the wrappers is as simple as this:

    -
    export PATH=/path/to/MToolBox/dir/:$PATH
    -
    -MToolBox-<wrapper> <snakemake arguments>
    +
    MToolBox-<wrapper> <snakemake arguments>
     
    -

    E.g. if you want to run the MToolBox-variant-calling wrapper and print the commands it will execute, you can run

    -
    export PATH=/path/to/MToolBox/dir/:$PATH
    -
    -MToolBox-variant-calling -p
    +

    E.g. if you want to run the MToolBox-variant-calling wrapper and print the commands it will execute, you can run

    +
    MToolBox-variant-calling -p
     

    You can also display a graphical representation of the workflow by running

    -
    export PATH=/path/to/MToolBox/dir/:$PATH
    -
    -MToolBox-variant-calling --dag | display
    +
    MToolBox-variant-calling --dag | display
     

    This will show the workflow in a browser. Alternatively, you can save the workflow representation in a file by running

    -
    export PATH=/path/to/MToolBox/dir/:$PATH
    -
    -MToolBox-variant-calling --dag > workflow.svg
    +
    MToolBox-variant-calling --dag > workflow.svg
     

    Available wrappers

    -
    +
    @@ -268,10 +267,7 @@

    Table of Contents

  • How to run the MToolBox wrappers
  • -
  • Available wrappers -
  • +
  • Available wrappers
  • @@ -279,6 +275,9 @@

    Table of Contents

    Previous topic

    Installation

    +

    Next topic

    +

    MToolBox-variant-calling

    This Page

      @@ -287,17 +286,15 @@

      This Page

    - +
    @@ -308,15 +305,19 @@

    Navigation

  • index
  • +
  • + next |
  • previous |
  • - + +
    \ No newline at end of file diff --git a/doc/_build/search.html b/doc/_build/search.html index 25f3bb8..2fdaa8b 100644 --- a/doc/_build/search.html +++ b/doc/_build/search.html @@ -1,29 +1,25 @@ - + - + - - + + Search — MToolBox documentation - - - - + + + + + - + - - - + @@ -33,7 +29,8 @@

    Navigation

  • index
  • - + +
    @@ -44,20 +41,18 @@

    Navigation

    Search

    - +

    Please activate JavaScript to enable the search functionality.

    - From here you can search these documents. Enter your search - words into the box below and click "search". Note that the search - function will automatically search for all of the words. Pages - containing fewer words won't appear in the result list. + Searching for multiple words only shows matches that contain + all words.

    - +
    @@ -66,6 +61,7 @@

    Search

    +
    @@ -81,12 +77,13 @@

    Navigation

  • index
  • - + + \ No newline at end of file diff --git a/doc/_build/searchindex.js b/doc/_build/searchindex.js index fb08224..8fe1682 100644 --- a/doc/_build/searchindex.js +++ b/doc/_build/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["a-note-on-functional-annotation","index","installation","run-the-pipeline"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:55},filenames:["a-note-on-functional-annotation.rst","index.rst","installation.rst","run-the-pipeline.rst"],objects:{},objnames:{},objtypes:{},terms:{"5517_hypo":[],"5517_liver":[],"case":3,"default":3,"export":3,"final":3,"function":[1,3],"new":[1,3],"public":1,"true":3,"while":3,And:1,For:3,The:[2,3],Using:3,_ie_:[],_only_:[],about:3,accept:3,activ:2,actual:3,add:[2,3],aim:1,align:3,all:[2,3],also:[1,2,3],altern:3,ambigu:3,anaconda3:2,anaconda:1,analys:[1,3],analysi:3,annot:[1,3],archiv:2,argument:3,around:3,automat:3,avail:1,base:3,bash:2,basic:3,been:[1,3],befor:[2,3],blah:[],browser:3,call:1,can:3,cannot:3,capabl:1,carefulli:3,chanc:2,check:3,choos:3,clinic:1,clip:3,clone:2,cluster:3,cluster_job:3,code:[],column:3,com:2,command:[2,3],comment:[],common:3,compil:1,complex:3,conda:2,config:3,configur:1,consist:3,contain:3,content:1,continuum:2,conveni:2,cool:3,copi:3,could:[2,3],couldn:3,creat:[2,3],dag:3,data:[1,3],dataset:3,depend:2,deploi:2,despit:3,detail:3,develop:1,dir:3,directori:[1,2],discard:3,discuss:1,displai:3,doc:2,document:[],doing:2,download:2,downstream:[1,3],drive:1,duplic:3,each:3,eager:1,easi:2,easili:2,eat:3,edit:3,effici:3,effort:3,either:3,empti:[],encompass:3,end:3,environ:2,error:3,essenti:2,everi:[],exampl:3,excit:[],execut:[2,3],experi:1,explicit:3,explicitli:3,facilit:1,fals:3,fasta:3,fastq:3,featur:[],fetch:2,file:1,fill:3,filter:3,first:[1,3],fit:3,folder:[2,3],follow:[1,2,3],fraction:3,friendli:1,from:[1,3],futur:2,gcf_000002315:3,genom:[1,3],get:[],ggallu:3,git:2,github:2,going:3,good:3,graphic:3,grasshopp:[],hand:3,happen:3,has:[1,3],have:[1,2,3],headach:3,help:3,here:1,heteroplasmi:3,hint:2,homopolimer:[],homopolymer:3,host:[],how:1,http:2,huh:3,implement:[1,3],includ:1,indel:3,independ:3,index:1,info:3,instal:[1,3],instead:[],instruct:2,integr:[1,2],interest:3,introduc:3,isn:3,item:[],its:1,keep:3,keep_orphan:3,lab:1,later:3,lazi:3,leav:3,let:3,librari:3,like:3,line:[],link:2,linux:2,list:[],littl:3,locat:3,log:3,look:3,lot:3,low:3,made:3,make:3,manag:3,mani:3,map:3,mark_dupl:3,markdupl:3,mask:3,master:[],mate:3,mean:3,merg:3,might:3,misalign:3,miss:2,mitochondri:[1,3],mitong:2,mkdir:3,modifi:3,modul:[1,2],moment:3,more:3,most:3,mtoolbox_dir:3,mtoolbox_snakemak:2,mtoolnot:[1,3],must:3,name:3,nc_001323:3,need:[2,3],nest:[],nois:3,non:[],note:[2,3],now:3,nts:3,nuclear:3,nucleotid:3,number:3,numt:3,offer:1,offici:2,onc:2,one:3,ones:3,onli:3,option:3,order:1,origin:3,orphan:3,other:[1,3],our:1,out:3,output:3,overlap:3,overview:1,page:1,pain:3,pair:3,pars:3,path:[2,3],peer:1,per:3,perform:3,person:2,picard:3,pick:[2,3],pipelin:[1,2,3],pleas:[2,3],plot:1,plu:3,point:3,post:3,prepend:[],prevent:3,print:3,probabl:3,process:3,properli:3,provid:[1,3],purpos:[2,3],qualiti:3,raw:3,read:3,readi:1,realign:[],reason:3,recap:[],recommend:2,ref_genome_mt:3,ref_genome_mt_fil:3,ref_genome_n:3,ref_genome_n_fil:3,refer:3,reference_genom:3,region:3,relat:3,reli:[],remov:3,replac:[2,3],repo:2,repositori:[],repres:3,represent:3,requir:[2,3],result:[1,3],review:1,rock:[],round:3,row:3,run:[1,2],same:3,sampl:3,sample_1:3,sample_1_r1_001:3,sample_1_r1_002:3,sample_1_r2_001:3,sample_1_r2_002:3,sample_2:3,sample_2_r1:3,sample_2_r2:3,save:3,script:2,search:1,section:3,see:3,sensit:3,separ:3,sequenc:3,set:1,setup:2,sever:3,should:[2,3],show:3,simpl:3,sinc:[1,3],skip:[],snakemak:3,snp:1,soft:3,some:3,sometim:3,sound:3,sourc:3,speci:[1,3],specif:[],specifi:3,stage:3,start:[],step:3,still:3,stretch:3,strictli:3,structur:3,struggl:3,studi:1,stuff:3,subsect:[],surround:[],svg:3,tab:3,tabl:3,task:3,tell:3,thei:3,them:3,therefor:2,thi:[1,2,3],thing:3,those:3,three:[],through:3,todo:3,tool:[1,2],track:3,tree:3,trim:3,trimbam:3,tutori:1,two:3,type:3,unzip:2,updat:2,usag:1,use:[1,3],used:[1,2,3],user:[1,3],using:3,util:2,variant:1,vcf:3,veri:3,virtual:2,wai:3,want:3,wet:1,wget:2,when:3,where:3,which:[1,2,3],whole:3,wish:3,wonder:3,work:1,workflow:3,world:[],wrapper:1,x86_64:2,yaml:3,you:[2,3],your:[2,3],zip:[]},titles:["<no title>","Welcome to the MToolBox-snakemake documentation!","Installation","Run MToolBox"],titleterms:{anaconda:2,analysi:[],ark:[],avail:3,befor:[],call:3,compil:3,configur:3,data:[],directori:3,document:1,featur:[],file:3,how:3,indic:1,instal:2,mtoolbox:[1,2,3],overview:3,recap:3,run:3,set:3,snakemak:[1,2],start:[],subsect:[],tab:[],tabl:1,variant:3,welcom:1,work:3,wrapper:3}}) \ No newline at end of file +Search.setIndex({docnames:["a-note-on-functional-annotation","index","installation","mtoolbox-variant-calling","run-the-pipeline"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["a-note-on-functional-annotation.rst","index.rst","installation.rst","mtoolbox-variant-calling.rst","run-the-pipeline.rst"],objects:{},objnames:{},objtypes:{},terms:{"018":3,"033":3,"057":3,"066":[],"091":[],"126":[],"129":[],"163":[],"2014":1,"2018":2,"204":[],"284":3,"359":3,"361":[],"365":3,"368":[],"387":3,"39600":[],"409":3,"42200":[],"50000":3,"511":3,"69045":3,"case":4,"default":4,"export":4,"final":[3,4],"function":[1,4],"import":3,"new":[1,4],"public":1,"true":4,"while":4,And:1,For:4,POS:3,The:[2,4],Using:4,about:4,accept:4,accord:3,activ:2,actual:4,add:2,after:3,aim:1,align:[3,4],all:[2,3,4],allel:3,also:[1,2,4],alt:3,altern:4,although:3,ambigu:4,anaconda3:2,anaconda:1,analys:[1,4],analysi:4,annot:[1,4],archiv:2,argument:4,around:4,automat:4,avail:[1,3],base:4,bash:2,basic:4,bed:[],been:[1,4],befor:[2,4],blue:3,both:3,bound:3,brief:3,browser:[3,4],call:[1,4],can:[3,4],cannot:4,capabl:1,carefulli:4,chanc:2,check:4,choos:4,chrom:3,cilow:3,ciup:3,clinic:1,clip:4,clone:2,cluster:4,cluster_job:4,code:3,colon:3,colour:3,column:[3,4],com:2,come:3,command:[2,4],comment:3,common:4,compil:1,complex:4,comput:4,conda:2,confid:3,config:4,configur:1,consid:3,consist:4,contain:4,content:1,continuum:2,conveni:2,cool:4,copi:4,correspond:3,could:[2,4],couldn:4,coverag:3,creat:[2,4],dag:4,darker:3,data:[1,3,4],dataset:4,delet:3,depend:2,deploi:2,depth:3,descript:3,despit:4,detail:[3,4],develop:1,differ:3,dir:4,directori:[1,2],discard:4,discuss:1,displai:4,doc:2,doing:2,download:2,downstream:[1,4],drive:1,duplic:4,each:[3,4],eager:1,easi:2,easili:2,eat:4,edit:4,effici:4,effort:4,either:4,encompass:4,end:4,environ:2,error:4,essenti:2,exampl:[3,4],exclud:3,execut:[2,4],experi:1,explicit:4,explicitli:4,extens:3,extrem:[],facilit:1,fals:4,fasta:4,fastq:4,fetch:2,field:3,file:[1,3],fill:4,filter:[3,4],find:3,first:[1,4],fit:4,folder:[2,3,4],follow:[1,2,3,4],format:3,found:3,fraction:4,frequenc:3,friendli:1,from:[1,4],futur:2,gcf_000002315:4,genom:[1,3,4],genotyp:3,ggallu:4,git:2,github:2,give:3,going:4,good:4,graphic:4,green:3,guid:3,hand:4,happen:4,has:[1,3,4],have:[1,2,3,4],headach:[3,4],help:4,here:[1,4],heteroplasm:3,heteroplasmi:[3,4],higher:3,hint:2,homopolymer:4,how:1,http:2,huge:4,huh:4,idea:4,igv:3,implement:[1,4],includ:[1,3],indel:4,independ:4,index:1,info:[3,4],insert:3,inspect:3,instal:[1,4],instruct:2,integr:[1,2],interest:4,internationalgenom:[],interv:3,introduc:4,intuit:3,isn:4,its:1,keep:4,keep_orphan:4,lab:1,later:4,lazi:4,leav:4,let:4,librari:4,like:4,line:3,link:2,linux:2,list:3,littl:4,locat:4,log:4,look:4,lot:4,low:4,lower:3,made:4,make:4,manag:4,mani:4,map:[3,4],mark_dupl:4,markdupl:4,mask:4,mate:4,mean:4,merg:4,might:4,minu:3,misalign:4,miss:2,mitochondri:[1,4],mitong:2,mkdir:4,modifi:4,modul:[1,2],moment:4,more:4,most:4,mtoolbox_dir:4,mtoolbox_snakemak:2,mtoolnot:[1,4],must:4,mutat:3,name:4,nc_001224:3,nc_001323:4,need:[2,4],next:[],nois:4,note:[2,4],notic:3,now:4,nts:4,nuclear:4,nucleotid:4,number:[3,4],numt:4,observ:3,offer:1,offici:2,onc:[2,3],one:[3,4],ones:4,onli:4,option:4,order:[1,3],org:[],origin:4,orphan:4,other:[1,4],our:1,out:4,output:[],overlap:4,overview:1,page:1,pain:4,pair:4,pars:4,pass:3,path:[2,4],peer:1,per:4,perform:[3,4],person:2,picard:4,pick:[2,4],pipelin:[1,2,4],pleas:[2,4],plot:1,plu:[3,4],point:4,posit:3,post:4,prevent:4,print:4,probabl:4,process:4,properli:4,provid:[1,3,4],purpos:[2,4],qual:3,qualiti:3,raw:3,read:[3,4],readi:1,reason:4,recommend:2,red:3,ref:3,ref_genome_mt:4,ref_genome_mt_fil:4,ref_genome_n:4,ref_genome_n_fil:4,refer:[3,4],reference_genom:4,region:4,relat:4,remov:4,replac:[2,4],repo:2,report:3,repres:4,represent:4,requir:[2,4],result:[1,3,4],review:1,roughli:3,round:4,row:[3,4],run:[1,2,3],same:[3,4],sampl:[3,4],sample_1:4,sample_1_r1_001:4,sample_1_r1_002:4,sample_1_r2_001:4,sample_1_r2_002:4,sample_2:4,sample_2_r1:4,sample_2_r2:4,save:4,scenario:4,scer_mt_100k:3,scer_mt_500k:3,script:2,sdp:3,search:1,section:4,see:4,semi:3,sensit:4,separ:[3,4],sequenc:4,set:1,setup:2,sever:4,shade:3,should:[2,4],show:4,simpl:4,sinc:[1,4],site:3,slightli:3,snakemak:[3,4],snp:1,soft:4,some:[3,4],sometim:4,soon:3,sound:4,sourc:4,spare:3,speci:[1,4],specifi:[3,4],stage:4,start:3,step:4,still:4,strand:3,stretch:4,strictli:4,structur:4,struggl:4,studi:1,summari:3,support:3,svg:4,tab:4,tabl:[3,4],task:4,tell:4,thei:4,them:4,therefor:2,thi:[1,2,3,4],thing:4,those:4,through:[3,4],time:3,ton:3,tool:[1,2],total:3,track:4,tree:4,trim:3,trimbam:4,tutori:1,two:4,type:[3,4],unzip:2,updat:2,upper:3,usag:1,use:[1,4],used:[1,2,4],useful:3,user:[1,4],using:4,util:2,variant:[1,4],vcf4:[],vcf:[],veri:4,version:3,virtual:2,visual:3,wai:[3,4],want:4,well:4,wet:1,wget:2,what:4,when:4,where:[3,4],which:[1,2,4],whole:4,wiki:[],wish:4,wonder:4,work:1,workflow:4,would:4,wrapper:[1,3],www:[],x86_64:2,yaml:4,you:[2,3,4],your:[2,3,4]},titles:["<no title>","Welcome to the MToolBox-snakemake documentation!","Installation","MToolBox-variant-calling","Run MToolBox"],titleterms:{The:3,anaconda:2,avail:4,bed:3,call:3,compil:4,configur:4,directori:4,document:1,file:4,here:3,how:4,indic:1,instal:2,look:3,mtoolbox:[1,2,3,4],next:3,output:3,overview:4,recap:4,run:4,set:4,should:3,snakemak:[1,2],tabl:1,variant:3,vcf:3,welcom:1,what:3,work:4,wrapper:4}}) \ No newline at end of file diff --git a/doc/mtoolbox-variant-calling.rst b/doc/mtoolbox-variant-calling.rst new file mode 100644 index 0000000..98ce602 --- /dev/null +++ b/doc/mtoolbox-variant-calling.rst @@ -0,0 +1,51 @@ +MToolBox-variant-calling +======================== + +This wrapper performs QC, quality trimming of raw reads, read alignment, alignment filtering, variant calling. The final output is a VCF file. + +What should I look to, here? +---------------------------- + +**TL;DR** + +- the VCF file in the :code:`results/vcf` folder +- the BED file(s) in the :code:`results/` folder. + +Both file formats can be imported in a genome browser (*eg* IGV) to visually inspect your results. + +The VCF output +^^^^^^^^^^^^^^ + +The VCF (variant call format) file is roughly a table where, after a ton of comment lines (starting with :code:`##`), rows are variants and columns are samples. You can find a detailed description of the VCF format `here`_, although MToolBox-snakemake provides a slightly different version to report the allele heteroplasmy frequency. To spare you some headache, we'll give you a brief summary of the genotype info you'll find for each sample. + +The :code:`FORMAT` field lists data types and order that are available for samples (following fields). Each sample has colon-separated data corresponding to the types specified in the :code:`FORMAT`. + +- :code:`GT` (genotype) reports all the alleles found for that sample, where :code:`0` is the reference allele (:code:`REF` field) and :code:`1`, :code:`2`, ... are the alleles in the same order as in the :code:`ALT` field. +- :code:`DP` (depth) reports the total coverage depth for that site in the genome, *i.e.* the number of reads mapping on it. +- :code:`HF` (heteroplasmic frequency) reports, for each allele in :code:`GT` (excluding :code:`REF`), the HF. +- :code:`CILOW` (confidence interval, lower bound) reports, for each allele in :code:`GT` (excluding :code:`REF`), the lower bound of the CI. +- :code:`CIUP` (confidence interval, upper bound) reports, for each allele in :code:`GT` (excluding :code:`REF`), the upper bound of the CI. +- :code:`SDP` (strand read depth) reports, for each allele in :code:`GT` (excluding :code:`REF`), the number of times the allele was observed on the plus strand and on the minus strand, semi-colon separated. + +If you consider this example: + +.. code-block:: bash + + #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT Scer_mt_500K Scer_mt_100K + NC_001224.1 50000 . A C . PASS AN=4;AC=2 GT:DP:HF:CILOW:CIUP:SDP 0/1:359:0.46:0.409:0.511:90;75 0/1:75:0.387:0.284:0.5:11;18 + NC_001224.1 69045 . C T . PASS AN=2;AC=1 GT:DP:HF:CILOW:CIUP:SDP 0/1:365:0.033:0.018:0.057:0;12 ./.:.:.:.:.:. + +sample Scer_mt_500K, in mt position 50000, has 359 aligned reads and one variant allele (:code:`C`) with HF=0.46. The CI for this HF is 0.409 to 0.511. The variant allele is supported by 90 reads on the plus strand and 75 reads on the minus strand. + +The BED output +^^^^^^^^^^^^^^ + +The `BED (browser extensible data) file`_ is a useful and intuitive way to inspect the variant calling results through a genome browser. Once you import this file in a genome browser, variants will be colour-coded (blue for mutations, green for insertions, red for deletions) and shaded according to the HF (the darker the shade, the higher the HF). + +What to do next? +^^^^^^^^^^^^^^^^ + +Once you have run the wrapper, you will notice that the :code:`results` folder includes a ton of files. A guide to these files is coming soon. + +.. _`here`: https://www.internationalgenome.org/wiki/Analysis/vcf4.0 +.. _`BED (browser extensible data) file`: https://m.ensembl.org/info/website/upload/bed.html \ No newline at end of file diff --git a/doc/run-the-pipeline.rst b/doc/run-the-pipeline.rst index c20ff4a..a29d77d 100644 --- a/doc/run-the-pipeline.rst +++ b/doc/run-the-pipeline.rst @@ -142,42 +142,32 @@ Running the wrappers is as simple as this: .. code-block:: bash - export PATH=/path/to/MToolBox/dir/:$PATH - MToolBox- -*E.g.* if you want to run the MToolBox-variant-calling wrapper and print the commands it will execute, you can run +*E.g.* if you want to run the :code:`MToolBox-variant-calling` wrapper and print the commands it will execute, you can run .. code-block:: bash - export PATH=/path/to/MToolBox/dir/:$PATH - MToolBox-variant-calling -p You can also display a graphical representation of the workflow by running .. code-block:: bash - export PATH=/path/to/MToolBox/dir/:$PATH - MToolBox-variant-calling --dag | display This will show the workflow in a browser. Alternatively, you can save the workflow representation in a file by running .. code-block:: bash - export PATH=/path/to/MToolBox/dir/:$PATH - MToolBox-variant-calling --dag > workflow.svg Available wrappers ------------------ -- `MToolBox-variant-calling`_ - -MToolBox-variant-calling -^^^^^^^^^^^^^^^^^^^^^^^^ - -Performs QC, quality trimming of raw reads, read alignment, alignment filtering, variant calling. The final output is a VCF file. +.. toctree:: + :maxdepth: 2 + + mtoolbox-variant-calling .. _`species available in mtoolnote`: https://github.com/mitoNGS/mtoolnote#features \ No newline at end of file From 8246200df3b438d9aa47cd105c10b714558d5962 Mon Sep 17 00:00:00 2001 From: domenico-simone Date: Tue, 15 Sep 2020 11:11:35 +0200 Subject: [PATCH 27/31] Documentation: fix --- doc/run-the-pipeline.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/run-the-pipeline.rst b/doc/run-the-pipeline.rst index a29d77d..0a9017e 100644 --- a/doc/run-the-pipeline.rst +++ b/doc/run-the-pipeline.rst @@ -166,7 +166,7 @@ Available wrappers ------------------ .. toctree:: - :maxdepth: 2 + :maxdepth: 1 mtoolbox-variant-calling From 631436624fd88c5a1747d3f33942dad1f4cc340a Mon Sep 17 00:00:00 2001 From: domenico-simone Date: Tue, 15 Sep 2020 12:32:01 +0200 Subject: [PATCH 28/31] Documentation: more about running the pipeline --- doc/run-the-pipeline.rst | 38 ++++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/doc/run-the-pipeline.rst b/doc/run-the-pipeline.rst index 0a9017e..1288264 100644 --- a/doc/run-the-pipeline.rst +++ b/doc/run-the-pipeline.rst @@ -144,23 +144,48 @@ Running the wrappers is as simple as this: MToolBox- -*E.g.* if you want to run the :code:`MToolBox-variant-calling` wrapper and print the commands it will execute, you can run +The :code:`MToolBox` wrapper scripts embed `snakemake`_ workflows, which allow an efficient and powerful management of all steps required to get the desired output files. In other words, with (roughly) the same command, you can run a full analysis, resume it or check its status. This is extremely useful in many settings, *e.g.* when you are running MToolBox-snakemake on a lot of samples. + +**Graphical representation of the workflow** + +Before running the workflow, it's good practice to check if the provided setup is correct. You can run .. code-block:: bash - MToolBox-variant-calling -p + MToolBox-variant-calling -nrp + +to execute a dry run (*i.e.* simulate to run the workflow) and get a list of the files that will be created and the commands that will be run. -You can also display a graphical representation of the workflow by running +A graphical - and probably more user-friendly - representation of the workflow can be obtained by running .. code-block:: bash - MToolBox-variant-calling --dag | display + MToolBox-variant-calling --dag | dot -Tsvg > my_workflow.svg + +The graph in file `my_workflow.svg` will report all the workflow steps (for each sample in the `analysis.tab` configuration file). Steps in dashed lines are to be run (because their outputs are not present), whereas outputs for steps in solid lines are already present. A graphical representation of the workflow as per the `analysis.tab` file in this repo is reported as follows. + +TODO: insert image. + +**Ok, gotcha! How do I actually run the workflow then?** + +.. code-block:: bash + + MToolBox-variant-calling -pk -j 8 + +This will run the :code:`MToolBox-variant-calling` wrapper, printing the commands that get executed and using at most 8 cores at the same time (TL;DR: allowing to run multiple commands at the same time *with no excessive risk* of blowing up your machine). + +Running on a computing cluster +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -This will show the workflow in a browser. Alternatively, you can save the workflow representation in a file by running +If you wish to run MToolBox-snakemake on a huge number of samples and/or your datasets are of a considerable size, you might want to run the workflow on a computing cluster. In this case, you should instruct the job scheduler you're using on how to do it. with the :code:`--cluster` option. You might also want to run the process in background and redirect the standard error and output (*i.e.* all the messages printed on the screen) to a log file: .. code-block:: bash - MToolBox-variant-calling --dag > workflow.svg + MToolBox-variant-calling \ + -rpk \ + -j 100 \ + --cluster cluster.yaml \ + --cluster 'sbatch -A snic2018-8-310 -p core -n {cluster.threads} -t {cluster.time} -o {cluster.stdout}' &> logs/mtoolbox_run.log & Available wrappers ------------------ @@ -170,4 +195,5 @@ Available wrappers mtoolbox-variant-calling +.. _`snakemake`: https://snakemake.readthedocs.io/en/stable/ .. _`species available in mtoolnote`: https://github.com/mitoNGS/mtoolnote#features \ No newline at end of file From 8f5b60b0df1d4d6eb3e2fe3af1c1443abff6de6d Mon Sep 17 00:00:00 2001 From: domenico-simone Date: Tue, 15 Sep 2020 12:34:05 +0200 Subject: [PATCH 29/31] Documentation: more about running the pipeline --- doc/run-the-pipeline.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/run-the-pipeline.rst b/doc/run-the-pipeline.rst index 1288264..1238c4d 100644 --- a/doc/run-the-pipeline.rst +++ b/doc/run-the-pipeline.rst @@ -172,7 +172,7 @@ TODO: insert image. MToolBox-variant-calling -pk -j 8 -This will run the :code:`MToolBox-variant-calling` wrapper, printing the commands that get executed and using at most 8 cores at the same time (TL;DR: allowing to run multiple commands at the same time *with no excessive risk* of blowing up your machine). +This will run the :code:`MToolBox-variant-calling` wrapper, printing the commands that get executed and using at most 8 cores at the same time (*i.e.* allowing to run multiple commands at the same time *with no excessive risk* of blowing up your machine). Running on a computing cluster ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From 8d90713b4023712e704280c04196fc12bad9428c Mon Sep 17 00:00:00 2001 From: domenico-simone Date: Tue, 15 Sep 2020 17:08:09 +0200 Subject: [PATCH 30/31] Documentation: more about running the pipelines --- doc/_build/.doctrees/environment.pickle | Bin 19490 -> 21420 bytes .../mtoolbox-variant-annotation.doctree | Bin 0 -> 6459 bytes .../mtoolbox-variant-calling.doctree | Bin 19036 -> 19552 bytes doc/_build/.doctrees/run-the-pipeline.doctree | Bin 43533 -> 53328 bytes .../mtoolbox-variant-annotation.rst.txt | 12 +++ .../_sources/mtoolbox-variant-calling.rst.txt | 2 + doc/_build/_sources/run-the-pipeline.rst.txt | 63 ++++++++--- doc/_build/index.html | 2 +- doc/_build/mtoolbox-variant-annotation.html | 102 ++++++++++++++++++ doc/_build/mtoolbox-variant-calling.html | 24 +++-- doc/_build/objects.inv | Bin 357 -> 455 bytes doc/_build/run-the-pipeline.html | 70 +++++++----- doc/_build/searchindex.js | 2 +- doc/mtoolbox-variant-annotation.rst | 12 +++ doc/mtoolbox-variant-calling.rst | 2 + doc/run-the-pipeline.rst | 25 +++-- 16 files changed, 259 insertions(+), 57 deletions(-) create mode 100644 doc/_build/.doctrees/mtoolbox-variant-annotation.doctree create mode 100644 doc/_build/_sources/mtoolbox-variant-annotation.rst.txt create mode 100644 doc/_build/mtoolbox-variant-annotation.html create mode 100644 doc/mtoolbox-variant-annotation.rst diff --git a/doc/_build/.doctrees/environment.pickle b/doc/_build/.doctrees/environment.pickle index 025c6d9d59ddbe55c9b39be3b3f19aa1a34b2e2e..6725976cdf417ddba0c77c479a443679b3c54870 100644 GIT binary patch literal 21420 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 XeCE;69#2ie$kR}Cbse>FW$FI_<-YUL literal 19490 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

    J7#3q6!D&*k@)bw?+4HVCg=AKNh^C zd0XGg4Z-7>d{qxGbBS{QbW~8snqE*tC^cd`4Fm@GHmw2X4P%lH zqnd!nEU@OsY!UZKBBq$8oMeb?`FbQ(PY+h+wahU(mouqjI6_$I+N|*IAzE$_hx1># z3=8|MzI_%hu5*PJWd0j4VGND}r@iceJGx)T)P5bTtqadfwzy*YjSAP@M4et{uK|M5 zC;BGOA@x(8xCow54jV_nMpa{_o%scGHYkXX<{*SG{d3qQA<3eW zea*vu>|Pv{-<@Gh*)zL;kW1~)_f3|)IZF}Oo|e}wxcFM%YxQvP3k+gk8@qVVm1a(d ziIo-Kq$9N1sWQFYBCy}+d#i^etD1+xuxW?FXpDN)<+uA@y@$|W8x%yLF25nX+E1rVy+(ao;`&6^NZ z)N=q31s0zhbR*ix@Hq(&$PBYGbxLl_qZ$5`VexeI1s>V;9Y;tlvY-*ZW?yhnQ+m5QQ4-4hW(% zmnLKs-WK7=!G2fos6gictsFFntvnZOQ%)WCqaAtm$~JOyC`0W!nIAk{HvGqZ6YsEc z^Y)8)*P|K-Rbb3Fx_MliW85Q9f7mxRJp%RngMv6T2M4yR3oBc=`sCM^auReH)4c`= zn|{#ut`5tl6BlvWELc@@ta=#pkA1J-!nKz4V+rsQYxj`&(}RLIk}J%s!lnK6V$fKV$^Fdb)%|%<>J(ml zz3>5dZJIm}3)#z`qexeAEMVnWf%t;m4o%y`jVMV@^yF zj87w|5=OoD=TG}yyoVv*8Wcn~LyGv|VCSc?_&0bvp`uv90YDU3{LG*mDX+M zeMwD7E6F`S)!e8#UF3k56u7!T3UR1R0mTWW3Im3YL^y}%iJIdq56ZGp%*iiqQ}HPe zNBJM)^#)fa6i+mfp6Gyp3czV9N5Fjki5V{Ro6o8bI$H57G*s!z1%OyW9j$Yj>m>bd zgAwhtY60rbuK=bRxh_vxl^+Wd$}1uVFJ$}8l^PPmRIjR^pTTd}Y~%Sj*Tv%tN+eOK zCkZz^qQsV~qw#gtiC(tKy}N4MC>0H=X~RUN_obqYkgA-68vT$A(bK)m>`L%MGI=30 z?PXLymWPbhvvOu4s7%B>-N-DP&Yq}{mRb@ujCVeWF75*((4ZHvoLj-SPExq{MH-i|21IpKe*U6^qQ|%*YYPeBxb+z<1jdG9cla+kU@mJU-bH`>)C z3h$f6>zNroBSjNum*xU400Hvk<)q}eYR>32QUym3Rn&xitM)bHQkLGjU| z+r(%!ix&kywUfW_XrU*sAg7lyeJjKp>gqU3NAO-^jA~VP6Z2e;{{+gJFwZbJf%}{_T;<{?NBd&`0$9&hF2maX*lg*ZC#j%1e0J za8G>ilpuB>*^RO~@e-HdS2~dVA`}A!W~gAwS-^DH#J`)mF&5~Cg=RupV~(evqo>c~ zkA2}TJg#Oue&I&{gaLk>M}A+6-+@tc&*H6aDrozN@7!9Ia%*H)+|NJ?bNg4k#ZSfl z<>KhOX+)z^toH_tNW+tKy8AjB)buKT90Ilc4O%0Tx-_+bpC`ausd!0-5ke`y18KwW Y<>1Gq3~e{nBuoV@MK8>uH>oZCAF3*&RR910 diff --git a/doc/_build/.doctrees/mtoolbox-variant-annotation.doctree b/doc/_build/.doctrees/mtoolbox-variant-annotation.doctree new file mode 100644 index 0000000000000000000000000000000000000000..22314cfadaf927c752e7589f60b9b2d0956536f8 GIT binary patch literal 6459 zcmcgxTW=gm6}IE+IQGQxZuUafq!TvMY!uHd5lAZ&A?<}MEAJW!LKGgNcFlCnRNLKM zO;xq+k%$BmixR0GkZ7Lx8wdeH`?!z%0R8~4Jn+tbr}{GON!D@L>_(dLRMn|-s!pBj zmtW8S@$J`V+&_Ckry@*_yDSJ28E~E3L8%C;0;`wu#<^k?xiZ77bG)KG`l7tk>;&er%+S`tsO6WGZBd@mZ2c!%QfX?OZH9 z$n6RfZNyLdLwug7{YN10_>jr1t?o zy@Wc(evbee{uIy%gCf4x=VguY>#^)7$ zUc={G5AsZWTXaBvy&xCY#Fd?ScaIj7$3}{!qH)~&@6FE4+!dkrj51wD%RdG zOWeI#U>)pkony{iLtor`ot&j#OwF7w(lz9D(A zr`t{Q6Ek)-6+xEOJTXSyr3QSUp9{y%jlVLr7y1+|8+aoG+sLube_N73TI$VN9yGd%Y1NK-TXL zWZa8GBX>XiSrMt7G`hN?v)g63zl;uffYjjb|L#|g6pg#Q0A^2U_)d|tVd`h|l8tjpMI2%xPKJ@^Yu>3!r-SWl3bKCp-wY`6Z$X!Pc`$E`Fzd1iOQ*SqX z*kx>&spp-cH#{�vyZCW0B%47<+;pa*w(6gY+7kIwjw9WN|nW#v8~)hXFD=vRawI zDXn?^u@{62HBB_844EK^pG>!fi~pdqJ@JpC*y-85ulpDc_xt)~;iW!VIa?aIvMOLRuu0hYeCyL#&psV@ZcH};>rD~zDJgLS%+?y0l zH_m>HhPIw(7nJbt69vp9694qY->h(;N$}ozfoiMr@2%(OInkXflKwkwI%mxU|C!!+ zmQ3)!(=)-NMh%2a@amUXjcaeJ!e@nE)g}I>7m0sOKla(YiMUlE_g=FG;OQZc_>BL6)G5AWmZ%>lRI_9CiUXqMJ-#l zf}PWQ>&a@}g-!Z9aA`D>-@zGNt6iq4dHXu5R-_JpavZ-u_FXCWFyHT@nG~zqzWP)u zbo~!=u?d2#KRJJO>Pl|i)r)Hszh-TFkSXf={j%HNwX4;PYan**GOWcQx&R=#SOXqI zB@=@lCAW+BSd;;ls1s^u*S1DH;ffilats0nRKu`1#o&A)#s}{M3|GowrXq~ij2!rc zX3#3cE#O>goZF3|l!mf)V-a}88bJq17W>E4QWJvF)&NmbAEhm!I2tT37c)HKZpNqf z*RL=YNGvy$APX*EblrYL_(r~S&aMa+nQFLTFY@CMx&n5S>B;Ou!28(<;@Z?_P$ULl z&SK28jA8>$mqPo|4ihx(K3V`t-Cb^5nHg@qv!z4)e&gh#&y|wO7c2=PuApZ+>cHgo zLeVZaxGXp>x!s&vnPRbj9|mOG1>eaT7Jh#B&el7Se{x}Jvt6eG#+4l4!D?o3B`|8fgf<{VId}jaqQYf6ih>06B-EvAK1b$JkG_UZL`cse==py z5qz~4WO3@(h6lyEi4ZoYfEWZw%oERgWE;!YDLnk$0n zU~#0Q0ET=XuxLGml{5MbygAOQ9uV%3S+0;I(>xDD$;BV!THX~gGTyGETrUkc&?8&{dOOSGey>lD#{ zbAJmyynlnf-lVUq_{waH2nhjk;ISip z18(AMooua`Aup}yirY753OYd4u!FcSquQt(>C01-HFfI*$5tiPZQ3}&9|2bxitv}F zd6g?Ob{R3G9GtUlps{d0z~vg@sbE-#ism$+vbG*;cw03)Nn|AuJ*nsmU>Z=+yFZ4m z6=f-}FbMBj1+F~>m%c{TKGGKu-KxrH^d(d+?*ENm;u*N}Ht7EH3_80|CazgKUm#-h rAMM`x31yGsKQR!^D!d>0fB(+~KYPAb4pI%$azHV>40lx7126gl46Bd# literal 0 HcmV?d00001 diff --git a/doc/_build/.doctrees/mtoolbox-variant-calling.doctree b/doc/_build/.doctrees/mtoolbox-variant-calling.doctree index 9eb5c780d76a045e80ff99b039458ae70645630a..a3f157d7c7343d79868bc6719dd7baee388a6e36 100644 GIT binary patch literal 19552 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 diff --git a/doc/_build/_sources/mtoolbox-variant-annotation.rst.txt b/doc/_build/_sources/mtoolbox-variant-annotation.rst.txt new file mode 100644 index 0000000..c239364 --- /dev/null +++ b/doc/_build/_sources/mtoolbox-variant-annotation.rst.txt @@ -0,0 +1,12 @@ +.. _mtoolbox_variant_annotation: + +MToolBox-variant-annotation +=========================== + +This wrapper performs functional annotation of variants reported in the VCF file (the output of the :ref:`mtoolbox_variant_calling` workflow) with `mtoolnote`_. If the VCF file is not present, the wrapper will first run the :ref:`mtoolbox_variant_calling` workflow to produce it. The final output is an annotated VCF file. + +.. note:: If you already have a VCF of mt variants, you might consider to annotate it by directly running `mtoolnote`_. + +The setup of this workflow is detailed in :ref:`the setup of the MToolBox-variant-calling workflow`. + +.. _`mtoolnote`: https://github.com/mitoNGS/mtoolnote \ No newline at end of file diff --git a/doc/_build/_sources/mtoolbox-variant-calling.rst.txt b/doc/_build/_sources/mtoolbox-variant-calling.rst.txt index 98ce602..ac857f5 100644 --- a/doc/_build/_sources/mtoolbox-variant-calling.rst.txt +++ b/doc/_build/_sources/mtoolbox-variant-calling.rst.txt @@ -1,3 +1,5 @@ +.. _mtoolbox_variant_calling: + MToolBox-variant-calling ======================== diff --git a/doc/_build/_sources/run-the-pipeline.rst.txt b/doc/_build/_sources/run-the-pipeline.rst.txt index a29d77d..d6428ac 100644 --- a/doc/_build/_sources/run-the-pipeline.rst.txt +++ b/doc/_build/_sources/run-the-pipeline.rst.txt @@ -1,24 +1,30 @@ -Run MToolBox -============ +.. _mtoolbox_workflows: -MToolBox is made by several snakemake workflows which can be run independently. We provide wrappers for the most common tasks and analyses. Using these wrappers will save a lot of typing and headache for the lazy users (probably *you*). Cool, isn't it? :) +The MToolBox-snakemake workflows +================================ + +MToolBox-snakemake includes several workflows, written in snakemake and conveniently embedded in wrappers. Using these wrappers will save a lot of typing and headache for the lazy users (probably *you*). Cool, isn't it? :) All the wrappers accepts snakemake arguments and parse automatically the `config.yaml` configuration file required by snakemake. An overview ----------- -You are going to analyse one or more **samples**, be represented by one or more read **datasets** (*ie*, libraries). -For this purpose, you're going to provide a **reference mitochondrial genome**. Choose it carefully, as your final results will be based on it! You also have to pick a **reference nuclear genome** that will be used as reference to filter out ambiguous reads. +The MToolBox-snakemake main workflow is **MToolBox-variant-calling**. At the moment, all the other MToolBox-snakemake workflows rely or + +You are going to analyse one or more **samples**, represented by one or more read **datasets** (*ie*, libraries). +For this purpose, you are going to provide a **reference mitochondrial genome**. Choose it carefully, as your final results will be based on it! You also have to pick a **reference nuclear genome** that will be used as reference to filter out ambiguous reads. If you are interested in performing functional annotation of mt variants, you will also explicitly provide **species**. -Now you'll be wondering: *how do I tell all these things to the pipeline?* In the following sections, we'll see how to do that through a handful of configuration files! +Now you'll be wondering: *how do I tell all these things to the pipeline*? In the following sections, we'll see how to do that through a handful of configuration files! + +.. _setup_working_directory: Setting up a working directory ------------------------------ -**Note:** Replace :code:`/path/to/MToolBox/dir/` with the MToolBox installation path and :code:`/path/to/analysis/dir` with the folder where you wish to run your analysis. +.. note:: Replace :code:`/path/to/MToolBox/dir/` with the MToolBox installation path and :code:`/path/to/analysis/dir` with the folder where you wish to run your analysis. .. code-block:: bash @@ -55,7 +61,7 @@ At this point, if you run the command :code:`tree` the structure of your directo Compiling configuration files ----------------------------- -An MToolBox-snakemake run is managed with these configuration files: +An MToolBox-snakemake workflow run is managed with these configuration files: - data/analysis.tab - data/reference_genomes.tab @@ -144,30 +150,57 @@ Running the wrappers is as simple as this: MToolBox- -*E.g.* if you want to run the :code:`MToolBox-variant-calling` wrapper and print the commands it will execute, you can run +The :code:`MToolBox` wrapper scripts embed `snakemake`_ workflows, which allow an efficient and powerful management of all steps required to get the desired output files. In other words, with (roughly) the same command, you can run a full analysis, resume it or check its status. This is extremely useful in many settings, *e.g.* when you are running MToolBox-snakemake on a lot of samples. + +**Graphical representation of the workflow** + +Before running the workflow, it's good practice to check if the provided setup is correct. You can run + +.. code-block:: bash + + MToolBox-variant-calling -nrp + +to execute a dry run (*i.e.* simulate to run the workflow) and get a list of the files that will be created and the commands that will be run. + +A graphical - and probably more user-friendly - representation of the workflow can be obtained by running .. code-block:: bash - MToolBox-variant-calling -p + MToolBox-variant-calling --dag | dot -Tsvg > my_workflow.svg + +The graph in file `my_workflow.svg` will report all the workflow steps (for each sample in the `analysis.tab` configuration file). Steps in dashed lines are to be run (because their outputs are not present), whereas outputs for steps in solid lines are already present. A graphical representation of the workflow as per the `analysis.tab` file in this repo is reported as follows. -You can also display a graphical representation of the workflow by running +TODO: insert image. + +**Ok, gotcha! How do I actually run the workflow then?** .. code-block:: bash - MToolBox-variant-calling --dag | display + MToolBox-variant-calling -pk -j 8 + +This will run the :code:`MToolBox-variant-calling` wrapper, printing the commands that get executed and using at most 8 cores at the same time (*i.e.* allowing to run multiple commands at the same time *with no excessive risk* of blowing up your machine). + +Running on a computing cluster +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -This will show the workflow in a browser. Alternatively, you can save the workflow representation in a file by running +If you wish to run a MToolBox-snakemake workflow on a huge number of samples and/or your datasets are of a considerable size, you might want to run the workflow on a computing cluster. In this case, you should instruct the job scheduler you're using on how to do it. with the :code:`--cluster` option. You might also want to run the process in background and redirect the standard error and output (*i.e.* all the messages printed on the screen) to a log file: .. code-block:: bash - MToolBox-variant-calling --dag > workflow.svg + MToolBox-variant-calling \ + -rpk \ + -j 100 \ + --cluster cluster.yaml \ + --cluster 'sbatch -A snic2018-8-310 -p core -n {cluster.threads} -t {cluster.time} -o {cluster.stdout}' &> logs/mtoolbox_run.log & Available wrappers ------------------ .. toctree:: - :maxdepth: 2 + :maxdepth: 1 mtoolbox-variant-calling + mtoolbox-variant-annotation +.. _`snakemake`: https://snakemake.readthedocs.io/en/stable/ .. _`species available in mtoolnote`: https://github.com/mitoNGS/mtoolnote#features \ No newline at end of file diff --git a/doc/_build/index.html b/doc/_build/index.html index a01c999..bd2c211 100644 --- a/doc/_build/index.html +++ b/doc/_build/index.html @@ -51,7 +51,7 @@

    Welcome to the MToolBox-snakemake documentation!Install MToolBox-snakemake -
  • Run MToolBox @@ -42,20 +42,24 @@

    Navigation

    -
    -

    Run MToolBox

    -

    MToolBox is made by several snakemake workflows which can be run independently. We provide wrappers for the most common tasks and analyses. Using these wrappers will save a lot of typing and headache for the lazy users (probably you). Cool, isn’t it? :)

    +
    +

    The MToolBox-snakemake workflows

    +

    MToolBox-snakemake includes several workflows, written in snakemake and conveniently embedded in wrappers. Using these wrappers will save a lot of typing and headache for the lazy users (probably you). Cool, isn’t it? :)

    All the wrappers accepts snakemake arguments and parse automatically the config.yaml configuration file required by snakemake.

    An overview

    -

    You are going to analyse one or more samples, be represented by one or more read datasets (ie, libraries). -For this purpose, you’re going to provide a reference mitochondrial genome. Choose it carefully, as your final results will be based on it! You also have to pick a reference nuclear genome that will be used as reference to filter out ambiguous reads.

    +

    The MToolBox-snakemake main workflow is MToolBox-variant-calling. At the moment, all the other MToolBox-snakemake workflows rely or

    +

    You are going to analyse one or more samples, represented by one or more read datasets (ie, libraries). +For this purpose, you are going to provide a reference mitochondrial genome. Choose it carefully, as your final results will be based on it! You also have to pick a reference nuclear genome that will be used as reference to filter out ambiguous reads.

    If you are interested in performing functional annotation of mt variants, you will also explicitly provide species.

    -

    Now you’ll be wondering: how do I tell all these things to the pipeline? In the following sections, we’ll see how to do that through a handful of configuration files!

    +

    Now you’ll be wondering: how do I tell all these things to the pipeline? In the following sections, we’ll see how to do that through a handful of configuration files!

    -

    Setting up a working directory

    -

    Note: Replace /path/to/MToolBox/dir/ with the MToolBox installation path and /path/to/analysis/dir with the folder where you wish to run your analysis.

    +

    Setting up a working directory

    +
    +

    Note

    +

    Replace /path/to/MToolBox/dir/ with the MToolBox installation path and /path/to/analysis/dir with the folder where you wish to run your analysis.

    +
    export MTOOLBOX_DIR=/path/to/MToolBox/dir/
     
     cd /path/to/analysis/dir
    @@ -88,7 +92,7 @@ 

    Setting up a working directory

    Compiling configuration files

    -

    An MToolBox-snakemake run is managed with these configuration files:

    +

    An MToolBox-snakemake workflow run is managed with these configuration files:

    -

    E.g. if you want to run the MToolBox-variant-calling wrapper and print the commands it will execute, you can run

    -
    MToolBox-variant-calling -p
    +

    The MToolBox wrapper scripts embed snakemake workflows, which allow an efficient and powerful management of all steps required to get the desired output files. In other words, with (roughly) the same command, you can run a full analysis, resume it or check its status. This is extremely useful in many settings, e.g. when you are running MToolBox-snakemake on a lot of samples.

    +

    Graphical representation of the workflow

    +

    Before running the workflow, it’s good practice to check if the provided setup is correct. You can run

    +
    MToolBox-variant-calling -nrp
    +
    +
    +

    to execute a dry run (i.e. simulate to run the workflow) and get a list of the files that will be created and the commands that will be run.

    +

    A graphical - and probably more user-friendly - representation of the workflow can be obtained by running

    +
    MToolBox-variant-calling --dag | dot -Tsvg > my_workflow.svg
     
    -

    You can also display a graphical representation of the workflow by running

    -
    MToolBox-variant-calling --dag | display
    +

    The graph in file my_workflow.svg will report all the workflow steps (for each sample in the analysis.tab configuration file). Steps in dashed lines are to be run (because their outputs are not present), whereas outputs for steps in solid lines are already present. A graphical representation of the workflow as per the analysis.tab file in this repo is reported as follows.

    +

    TODO: insert image.

    +

    Ok, gotcha! How do I actually run the workflow then?

    +
    MToolBox-variant-calling -pk -j 8
     
    -

    This will show the workflow in a browser. Alternatively, you can save the workflow representation in a file by running

    -
    MToolBox-variant-calling --dag > workflow.svg
    +

    This will run the MToolBox-variant-calling wrapper, printing the commands that get executed and using at most 8 cores at the same time (i.e. allowing to run multiple commands at the same time with no excessive risk of blowing up your machine).

    +
    +

    Running on a computing cluster

    +

    If you wish to run a MToolBox-snakemake workflow on a huge number of samples and/or your datasets are of a considerable size, you might want to run the workflow on a computing cluster. In this case, you should instruct the job scheduler you’re using on how to do it. with the --cluster option. You might also want to run the process in background and redirect the standard error and output (i.e. all the messages printed on the screen) to a log file:

    +
    MToolBox-variant-calling \
    +-rpk \
    +-j 100 \
    +--cluster cluster.yaml \
    +--cluster 'sbatch -A snic2018-8-310 -p core -n {cluster.threads} -t {cluster.time} -o {cluster.stdout}' &> logs/mtoolbox_run.log &
     
    +
    @@ -259,14 +278,17 @@

    Available wrappers

    Table of Contents