Skip to content

Commit 0627c13

Browse files
committed
feat: use all-sites quality filter for the evolutionary rate calculation
1 parent 395696c commit 0627c13

2 files changed

Lines changed: 61 additions & 4 deletions

File tree

workflow/rules/distances.smk

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,50 @@
1+
rule compile_fail_sites_vcf:
2+
params:
3+
header = ("#CHROM", "POS", "ID", "REF", "ALT", "QUAL", "FILTER", "INFO"),
4+
filter_text = "mask",
5+
sub_text = "NA",
6+
exc_text = "site_qual"
7+
input:
8+
sites = OUTDIR / f"{OUTPUT_NAME}.fail_sites.tsv",
9+
output:
10+
sites = temp(OUTDIR / f"{OUTPUT_NAME}.fail_sites.vcf"),
11+
run:
12+
import pandas as pd
13+
sites = (
14+
pd.read_table(input.sites, sep="\t")
15+
.drop_duplicates(subset=("CHROM", "POS", "REF"))
16+
.rename(columns={"CHROM": "#CHROM"})
17+
)
18+
sites["ID"] = "."
19+
sites["ALT"] = "."
20+
sites["QUAL"] = "."
21+
sites["FILTER"] = params.filter_text
22+
sites["INFO"] = f"SUB={params.sub_text};EXC={params.exc_text}"
23+
sites[list(params.header)].to_csv(output.sites, sep="\t", index=False)
24+
25+
26+
rule merge_sites:
27+
params:
28+
header = ("#CHROM", "POS", "ID", "REF", "ALT", "QUAL", "FILTER", "INFO")
29+
input:
30+
lambda wildcards: select_problematic_vcf(),
31+
OUTDIR / f"{OUTPUT_NAME}.fail_sites.vcf",
32+
output:
33+
sites = temp(OUTDIR / "all_mask_sites.vcf"),
34+
run:
35+
import pandas as pd
36+
(
37+
pd.concat(
38+
[pd.read_table(path, sep="\t", comment="#", names=params.header) for path in input],
39+
axis="rows",
40+
ignore_index=True
41+
)
42+
.drop_duplicates(subset=("#CHROM", "POS", "FILTER"), keep="first")
43+
.sort_values(list(params.header))
44+
.to_csv(output.sites, sep="\t", index=False)
45+
)
46+
47+
148
rule extract_afwdist_variants:
249
conda: "../envs/biopython.yaml"
350
params:
@@ -8,7 +55,7 @@ rule extract_afwdist_variants:
855
mask_class = ["mask"],
956
input:
1057
variants = OUTDIR/f"{OUTPUT_NAME}.variants.tsv",
11-
mask_vcf = lambda wildcards: select_problematic_vcf(),
58+
mask_vcf = OUTDIR / "all_mask_sites.vcf",
1259
ancestor = OUTDIR/f"{OUTPUT_NAME}.ancestor.fasta",
1360
reference = OUTDIR/"reference.fasta",
1461
output:

workflow/rules/vaf.smk

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,8 @@ rule filter_mpileup_all_sites:
237237
input:
238238
OUTDIR / "all_sites" / "{sample}.query.tsv",
239239
output:
240-
temp(OUTDIR / "all_sites" / "{sample}.filtered_sites.tsv"),
240+
sites_pass = temp(OUTDIR / "all_sites" / "{sample}.filtered_sites.tsv"),
241+
sites_fail = temp(OUTDIR / "all_sites" / "{sample}.fail_sites.tsv"),
241242
log:
242243
LOGDIR / "filter_mpileup_all_sites" / "{sample}.txt"
243244
run:
@@ -248,11 +249,13 @@ rule filter_mpileup_all_sites:
248249
df["TOTAL_AD"] = df.AD.str.split(",").apply(lambda values: sum(int(n) for n in values))
249250
df["TOTAL_ADF"] = df.ADF.str.split(",").apply(lambda values: sum(int(n) for n in values))
250251
df["TOTAL_ADR"] = df.ADR.str.split(",").apply(lambda values: sum(int(n) for n in values))
251-
df[
252+
mask = (
252253
(df.TOTAL_AD >= params.min_total_AD) &
253254
(df.TOTAL_ADF >= params.min_total_ADF) &
254255
(df.TOTAL_ADR >= params.min_total_ADR)
255-
].to_csv(output[0], sep="\t", index=False)
256+
)
257+
df[mask].to_csv(output.sites_pass, sep="\t", index=False)
258+
df[~mask].to_csv(output.sites_fail, sep="\t", index=False)
256259

257260

258261
use rule concat_vcf_fields as merge_filtered_mpileup_all_sites with:
@@ -262,6 +265,13 @@ use rule concat_vcf_fields as merge_filtered_mpileup_all_sites with:
262265
OUTDIR / f"{OUTPUT_NAME}.filtered_sites.tsv",
263266

264267

268+
use rule concat_vcf_fields as merge_fail_mpileup_all_sites with:
269+
input:
270+
expand(OUTDIR / "all_sites" / "{sample}.fail_sites.tsv", sample=iter_samples()),
271+
output:
272+
OUTDIR / f"{OUTPUT_NAME}.fail_sites.tsv",
273+
274+
265275
rule fill_all_sites:
266276
conda: "../envs/renv.yaml"
267277
input:

0 commit comments

Comments
 (0)