From 4a7ae6239184063491d190a50760a33aa2887968 Mon Sep 17 00:00:00 2001 From: Susanna Kiwala Date: Mon, 23 Sep 2024 12:12:52 -0500 Subject: [PATCH 1/5] Write regions file as VCF is being processed instead of saving in memory --- definitions/tools/bam_readcount.wdl | 52 +++++++++-------------------- 1 file changed, 15 insertions(+), 37 deletions(-) diff --git a/definitions/tools/bam_readcount.wdl b/definitions/tools/bam_readcount.wdl index 9cf761f..df9269f 100644 --- a/definitions/tools/bam_readcount.wdl +++ b/definitions/tools/bam_readcount.wdl @@ -36,15 +36,6 @@ task bamReadcount { import csv from subprocess import Popen, PIPE - def generate_region_list(hash): - fh = tempfile.NamedTemporaryFile("w", delete=False) - writer = csv.writer(fh, delimiter="\t") - for chr, positions in hash.items(): - for pos in sorted(positions.keys()): - writer.writerow([chr, pos, pos]) - fh.close() - return fh.name - def filter_sites_in_hash(region_list, bam_file, ref_fasta, prefixed_sample, output_dir, insertion_centric, map_qual, base_qual): bam_readcount_cmd = ["/usr/bin/bam-readcount", "-f", ref_fasta, "-l", region_list, "-w", "0", "-b", str(base_qual), "-q", str(map_qual)] if insertion_centric: @@ -73,8 +64,10 @@ task bamReadcount { vcf_file = VCF(vcf_filename) sample_index = vcf_file.samples.index(sample) - rc_for_indel = {} - rc_for_snp = {} + snv_region_fh = tempfile.NamedTemporaryFile("w", delete=False) + snv_region_writer = csv.writer(fh, delimiter="\t") + indel_region_fh = tempfile.NamedTemporaryFile("w", delete=False) + indel_region_writer = csv.writer(fh, delimiter="\t") for variant in vcf_file: ref = variant.REF chr = variant.CHROM @@ -90,42 +83,27 @@ task bamReadcount { elif len(ref) > len(var): #it is a deletion pos += 1 - unmodified_ref = ref - ref = unmodified_ref[1] - var = "-%s" % unmodified_ref[1:] - else: - #it is an insertion - var = "+%s" % var[1:] - if chr not in rc_for_indel: - rc_for_indel[chr] = {} - if pos not in rc_for_indel[chr]: - rc_for_indel[chr][pos] = {} - if ref not in rc_for_indel[chr][pos]: - rc_for_indel[chr][pos][ref] = {} - rc_for_indel[chr][pos][ref] = variant + indel_region_writer.writerow([chr, pos, pos]) else: #it is a SNP - if chr not in rc_for_snp: - rc_for_snp[chr] = {} - if pos not in rc_for_snp[chr]: - rc_for_snp[chr][pos] = {} - if ref not in rc_for_snp[chr][pos]: - rc_for_snp[chr][pos][ref] = {} - rc_for_snp[chr][pos][ref] = variant + snv_region_writer.writerow([chr, pos, pos]) + snv_region_fh.close() + indel_region_fh.close() - if len(rc_for_snp.keys()) > 0: - region_file = generate_region_list(rc_for_snp) - filter_sites_in_hash(region_file, bam_file, ref_fasta, prefixed_sample, output_dir, False, min_mapping_qual, min_base_qual) + if os.path.getsize(snv_region_fh.name) > 0: + filter_sites_in_hash(snv_region_fh.name, bam_file, ref_fasta, prefixed_sample, output_dir, False, min_mapping_qual, min_base_qual) else: output_file = os.path.join(output_dir, prefixed_sample + "_bam_readcount_snv.tsv") open(output_file, "w").close() - if len(rc_for_indel.keys()) > 0: - region_file = generate_region_list(rc_for_indel) - filter_sites_in_hash(region_file, bam_file, ref_fasta, prefixed_sample, output_dir, True, min_mapping_qual, min_base_qual) + if os.path.getsize(indel_region_fh.name) > 0: + filter_sites_in_hash(indel_region_fh, bam_file, ref_fasta, prefixed_sample, output_dir, True, min_mapping_qual, min_base_qual) else: output_file = os.path.join(output_dir, prefixed_sample + "_bam_readcount_indel.tsv") open(output_file, "w").close() + + os.remove(snv_region_fh.name) + os.remove(indel_region_fh.name) ' > ~{stdout_file} >>> From 726fe35a5b5bfa60d2a0c2d64fb35abf8f591b11 Mon Sep 17 00:00:00 2001 From: Susanna Kiwala Date: Wed, 2 Oct 2024 11:04:11 -0500 Subject: [PATCH 2/5] Update definitions/tools/bam_readcount.wdl --- definitions/tools/bam_readcount.wdl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/definitions/tools/bam_readcount.wdl b/definitions/tools/bam_readcount.wdl index df9269f..3c3e4a7 100644 --- a/definitions/tools/bam_readcount.wdl +++ b/definitions/tools/bam_readcount.wdl @@ -97,7 +97,7 @@ task bamReadcount { open(output_file, "w").close() if os.path.getsize(indel_region_fh.name) > 0: - filter_sites_in_hash(indel_region_fh, bam_file, ref_fasta, prefixed_sample, output_dir, True, min_mapping_qual, min_base_qual) + filter_sites_in_hash(indel_region_fh.name, bam_file, ref_fasta, prefixed_sample, output_dir, True, min_mapping_qual, min_base_qual) else: output_file = os.path.join(output_dir, prefixed_sample + "_bam_readcount_indel.tsv") open(output_file, "w").close() From 3c26eecf245bbe49afee836dd166cee30c918d9c Mon Sep 17 00:00:00 2001 From: Susanna Kiwala Date: Wed, 2 Oct 2024 11:58:17 -0500 Subject: [PATCH 3/5] Update workflows.zip archive --- workflows.zip | Bin 181255 -> 181067 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/workflows.zip b/workflows.zip index 4ebdcf148fdce1e819f22c1e6c0ca9f3dd1483f2..1890cb5fe26b800be71bb05630ae15372b351aea 100644 GIT binary patch delta 4917 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%0Do0Q&8}~wKdUK4CJuvEXY7M3#-n8t-$|* za$u|65(g@5)9T3J&<(x;!I5Dmzow*#WYx>b{yHq>F}NIp;fW-6l*2aY8IG&ZktMNM8YIKW0WLMs=mII?$uWT2mB0}Fj{fBR&;?TCUCOxS647Y90Gt60 z4#U1QpBy)^QJ)W5Lr*r46V?oMKy{75=vps>Cf?=~PwrZP^h9E_pATkCz|wi&K8cYW z+epB=LjwM&gYz%KxB>f`m~&BJfeUCn7PRoqJ~BmK>XYKgUji92t~i%SJ1b)BCGcm> z91o~rM7o&SBI7R;#g9gS4aP+A)Ty6I?!Qd3XfqLbQIQ!^coMKROW&M{bv#;EkdByQ zg(0NqXgnDduuy>HTVqcJ+34anfX{5ent2c~^b}PR!$%zie2>8=l^`{kgVYtl{+*6` zS70N{aTXwF_CPKjf}=bq{B{LG>1h~T1@WwpE+pvr#4YIvE?QQTJeIpNN^IQ5p+{g` z_0RDh@$O9bQ?kbkM^cpO5FVd+2m%p3ia4lrmGqk4Qo!#^K?miwk_W~X0c5*^NrY^J zt1uJ3twzZj*ueVeLqhO{@j@zZ)sP@xZxC|vqlP?(qJjVy1QV*68J=>DoIeS{;%kJN z(P4mZ!$2RU2Kw3SItHTk5=$-!^?xLT BtW5v_ delta 5246 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 B-`oHI From 5bc13c7699bbde13d27559a245b4df3908050b8e Mon Sep 17 00:00:00 2001 From: Susanna Kiwala Date: Wed, 2 Oct 2024 14:45:57 -0500 Subject: [PATCH 4/5] Fix bugs --- definitions/tools/bam_readcount.wdl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/definitions/tools/bam_readcount.wdl b/definitions/tools/bam_readcount.wdl index 3c3e4a7..4c8ae8e 100644 --- a/definitions/tools/bam_readcount.wdl +++ b/definitions/tools/bam_readcount.wdl @@ -65,9 +65,9 @@ task bamReadcount { sample_index = vcf_file.samples.index(sample) snv_region_fh = tempfile.NamedTemporaryFile("w", delete=False) - snv_region_writer = csv.writer(fh, delimiter="\t") + snv_region_writer = csv.writer(snv_region_fh, delimiter="\t") indel_region_fh = tempfile.NamedTemporaryFile("w", delete=False) - indel_region_writer = csv.writer(fh, delimiter="\t") + indel_region_writer = csv.writer(indel_region_fh, delimiter="\t") for variant in vcf_file: ref = variant.REF chr = variant.CHROM From b810745d7c403610f0dd8c78d36bd5fd7643f899 Mon Sep 17 00:00:00 2001 From: Susanna Kiwala Date: Wed, 2 Oct 2024 14:48:22 -0500 Subject: [PATCH 5/5] Update workflows.zip archive --- workflows.zip | Bin 181067 -> 181071 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/workflows.zip b/workflows.zip index 1890cb5fe26b800be71bb05630ae15372b351aea..c9bd32218a049114e480bc7d6d0d82258373b5bc 100644 GIT binary patch delta 2775 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 KSI1Bsl>Y%VCvJ}b delta 2840 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 Vz&8w>_hG@M7b$0Qc{D{8{|iy8Z|?vA