Skip to content

Commit f8ec7e0

Browse files
committed
introduce 2nd hash layer in filter-align to allow separate hashes for trimming and filtering
1 parent 11b3def commit f8ec7e0

File tree

3 files changed

+59
-41
lines changed

3 files changed

+59
-41
lines changed

bin/libphylociraptor/hashing.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ def collect_hashes(mode, config, configfi, debug=False, check=True, wd=""):
182182
return hashes
183183

184184
#filter-alignment
185-
hashes['filter-align'] = {"global": "", "per": {}}
185+
hashes['filter-align'] = {"global": "", "per-trimming": {}, "per": {}}
186186
if not os.path.isfile("results/alignments/full/parameters.align."+hashes['align']["global"]+".yaml") and not check:
187187
if debug:
188188
print("Please doublecheck if the stage 'align' was run with the parameters currently specified in "+configfi)
@@ -192,8 +192,10 @@ def collect_hashes(mode, config, configfi, debug=False, check=True, wd=""):
192192
hashes['filter-align']["global"] = get_hash(hashes['align']["global"], "trimming,method trimming,options trimming,min_parsimony_sites trimming,max_rcv_score", configfi, debug=debug, wd=wd)
193193
for t in config["trimming"]["method"]:
194194
hashes['filter-align']["per"][t] = {}
195+
hashes['filter-align']["per-trimming"][t] = {}
195196
for a in hashes['align']["per"].keys():
196-
hashes['filter-align']["per"][t][a] = get_hash(hashes['align']["per"][a], "trimming,options,"+t, configfi, debug=debug, wd=wd)
197+
hashes['filter-align']["per-trimming"][t][a] = get_hash(hashes['align']["per"][a], "trimming,options,"+t, configfi, debug=debug, wd=wd)
198+
hashes['filter-align']["per"][t][a] = get_hash(hashes['align']["per"][a], "trimming,options,"+t+" trimming,min_parsimony_sites trimming,max_rcv_score", configfi, debug=debug, wd=wd)
197199

198200
if mode == "filter-align":
199201
if debug:

rules/filter-align.smk

+49-33
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ filter_orthology_hash = hashes['filter-orthology']["global"]
1616
aligner_hashes = hashes['align']["per"]
1717
previous_hash = hashes['align']["global"]
1818
current_hash = hashes['filter-align']["global"]
19-
trimmer_hashes = hashes['filter-align']["per"]
19+
trimmed_hashes = hashes['filter-align']["per-trimming"]
20+
filtered_hashes = hashes['filter-align']["per"]
2021

2122
BUSCOS, = glob_wildcards("results/orthology/busco/busco_sequences_deduplicated."+filter_orthology_hash+"/{busco}_all.fas")
2223

@@ -27,7 +28,9 @@ def previous_params_per(wildcards):
2728
return "results/alignments/full/"+wildcards.aligner+"."+aligner_hashes[wildcards.aligner]+"/parameters.align."+wildcards.aligner+"."+aligner_hashes[wildcards.aligner]+".yaml"
2829

2930
def compare_filter_align(wildcards):
30-
return [trigger("results/alignments/trimmed/{aligner}-{alitrim}.{hash}/parameters.filter-align.{aligner}-{alitrim}.{hash}.yaml".format(aligner=wildcards.aligner, alitrim=wildcards.alitrim, hash=wildcards.hash), configfi)]
31+
return [trigger("results/alignments/filtered/{aligner}-{alitrim}.{hash}/parameters.filter-align.{aligner}-{alitrim}.{hash}.yaml".format(aligner=wildcards.aligner, alitrim=wildcards.alitrim, hash=wildcards.hash), configfi)]
32+
def compare_trimmed_align(wildcards):
33+
return [trigger("results/alignments/trimmed/{aligner}-{alitrim}.{hash}/parameters.filter-align.{aligner}-{alitrim}.{hash}.yaml".format(aligner=wildcards.aligner, alitrim=wildcards.alitrim, hash=wildcards.trimhash), configfi)]
3134

3235
def per_aligner(wildcards):
3336
# print(wildcards)
@@ -37,7 +40,7 @@ def per_trimmer(wildcards):
3740
lis = []
3841
# print(wildcards)
3942
for b in BUSCOS:
40-
lis.append("results/alignments/trimmed/"+wildcards.aligner+"-"+wildcards.alitrim+"."+trimmer_hashes[wildcards.alitrim][wildcards.aligner]+"/"+str(b)+"_aligned_trimmed.fas")
43+
lis.append("results/alignments/trimmed/"+wildcards.aligner+"-"+wildcards.alitrim+"."+trimmed_hashes[wildcards.alitrim][wildcards.aligner]+"/"+str(b)+"_aligned_trimmed.fas")
4144
return lis
4245

4346
def determine_concurrency_limit():
@@ -58,21 +61,36 @@ batches = determine_concurrency_limit()
5861
aligners = get_aligners()
5962
trimmers = get_trimmers()
6063

64+
rule read_params_per_trimmer:
65+
input:
66+
trigger = compare_trimmed_align,
67+
previous = previous_params_per
68+
output:
69+
"results/alignments/trimmed/{aligner}-{alitrim}.{trimmhash}/parameters.filter-align.{aligner}-{alitrim}.{trimhash}.yaml"
70+
params:
71+
configfile = configfi
72+
shell:
73+
"""
74+
bin/read_write_yaml.py {input.trigger} {output} trimming,options,{wildcards.alitrim}
75+
cat {input.previous} >> {output}
76+
"""
77+
78+
6179
rule read_params_per:
6280
input:
6381
trigger = compare_filter_align,
6482
previous = previous_params_per
6583
output:
66-
"results/alignments/trimmed/{aligner}-{alitrim}.{hash}/parameters.filter-align.{aligner}-{alitrim}.{hash}.yaml"
84+
"results/alignments/filtered/{aligner}-{alitrim}.{hash}/parameters.filter-align.{aligner}-{alitrim}.{hash}.yaml"
6785
shell:
6886
"""
69-
bin/read_write_yaml.py {input.trigger} {output} trimming,options,{wildcards.alitrim} trimming,min_parsimony_sites
87+
bin/read_write_yaml.py {input.trigger} {output} trimming,options,{wildcards.alitrim} trimming,min_parsimony_sites trimming,max_rcv_score
7088
cat {input.previous} >> {output}
7189
"""
7290

7391
rule read_params_global:
7492
input:
75-
trigger = compare("results/alignments/trimmed/parameters.filter-align."+current_hash+".yaml", configfi),
93+
trigger = compare("results/alignments/filtered/parameters.filter-align."+current_hash+".yaml", configfi),
7694
previous = previous_params_global
7795
output:
7896
"results/alignments/trimmed/parameters.filter-align."+current_hash+".yaml"
@@ -85,11 +103,11 @@ def return_aligner_checkpoint(wildcards):
85103
return "results/checkpoints/"+wildcards.aligner+"_aggregate_align."+aligner_hashes[wildcards.aligner]+".done"
86104

87105
def return_bmge_params(wildcards):
88-
return "results/alignments/trimmed/"+wildcards.aligner+"-bmge."+trimmer_hashes["bmge"][wildcards.aligner]+"/parameters.filter-align."+wildcards.aligner+"-bmge."+trimmer_hashes["bmge"][wildcards.aligner]+".yaml"
106+
return "results/alignments/trimmed/"+wildcards.aligner+"-bmge."+trimmed_hashes["bmge"][wildcards.aligner]+"/parameters.filter-align."+wildcards.aligner+"-bmge."+trimmed_hashes["bmge"][wildcards.aligner]+".yaml"
89107
def return_trimal_params(wildcards):
90-
return "results/alignments/trimmed/"+wildcards.aligner+"-trimal."+trimmer_hashes["trimal"][wildcards.aligner]+"/parameters.filter-align."+wildcards.aligner+"-trimal."+trimmer_hashes["trimal"][wildcards.aligner]+".yaml"
108+
return "results/alignments/trimmed/"+wildcards.aligner+"-trimal."+trimmed_hashes["trimal"][wildcards.aligner]+"/parameters.filter-align."+wildcards.aligner+"-trimal."+trimmed_hashes["trimal"][wildcards.aligner]+".yaml"
91109
def return_aliscore_params(wildcards):
92-
return "results/alignments/trimmed/"+wildcards.aligner+"-aliscore."+trimmer_hashes["aliscore"][wildcards.aligner]+"/parameters.filter-align."+wildcards.aligner+"-aliscore."+trimmer_hashes["aliscore"][wildcards.aligner]+".yaml"
110+
return "results/alignments/trimmed/"+wildcards.aligner+"-aliscore."+trimmed_hashes["aliscore"][wildcards.aligner]+"/parameters.filter-align."+wildcards.aligner+"-aliscore."+trimmed_hashes["aliscore"][wildcards.aligner]+".yaml"
93111

94112
rule bmge:
95113
input:
@@ -220,19 +238,21 @@ rule get_trimmed_statistics:
220238
def pull_trimmer(wildcards):
221239
lis = []
222240
for i in range(1, config["concurrency"] + 1):
223-
lis.append("results/statistics/trim-"+wildcards.aligner+"-"+wildcards.alitrim+"."+trimmer_hashes[wildcards.alitrim][wildcards.aligner]+"/stats_trimmed_"+wildcards.alitrim+"_"+wildcards.aligner+"-"+str(i)+"-"+str(config["concurrency"])+".txt")
241+
lis.append("results/statistics/trim-"+wildcards.aligner+"-"+wildcards.alitrim+"."+trimmed_hashes[wildcards.alitrim][wildcards.aligner]+"/stats_trimmed_"+wildcards.alitrim+"_"+wildcards.aligner+"-"+str(i)+"-"+str(config["concurrency"])+".txt")
224242
return lis
225243

226244
def get_aligner_hash(wildcards):
227245
return aligner_hashes[wildcards.aligner]
228246

247+
def get_trimmer_hash(wildcards):
248+
return trimmed_hashes[wildcards.alitrim][wildcards.aligner]
249+
229250
rule filter_alignments:
230251
input:
231-
# expand("results/statistics/trim-{{aligner}}-{{alitrim}}/stats_trimmed_{{alitrim}}_{{aligner}}-{batch}-"+str(config["concurrency"])+".txt", aligner=config["alignment"]["method"], alitrim=config["trimming"]["method"], batch=batches)
232-
pull_trimmer
252+
pull_trimmer,
253+
"results/alignments/filtered/{aligner}-{alitrim}.{hash}/parameters.filter-align.{aligner}-{alitrim}.{hash}.yaml"
233254
output:
234255
filter_info = "results/statistics/filter-{aligner}-{alitrim}.{hash}/alignment_filter_information_{alitrim}_{aligner}.txt",
235-
trim_info = "results/statistics/trim-{aligner}-{alitrim}.{hash}/statistics_trimmed_{alitrim}_{aligner}.txt"
236256
benchmark:
237257
"results/statistics/benchmarks/align/filter_alignments_{alitrim}_{aligner}.{hash}.txt"
238258
singularity:
@@ -244,47 +264,43 @@ rule filter_alignments:
244264
min_pars_sites = config["trimming"]["min_parsimony_sites"],
245265
max_rcv_score = config["trimming"]["max_rcv_score"],
246266
aligner_hash = get_aligner_hash,
267+
trimmer_hash = get_trimmer_hash,
247268
target_dir = "results/alignments/filtered/{aligner}-{alitrim}.{hash}"
248269
shell:
249270
"""
250-
if [[ -d {params.target_dir} ]]; then
251-
rm -rf {params.target_dir}
252-
fi
253-
mkdir -p {params.target_dir}
254271
255272
# concatenate the statistics files from the individual batches (for some reason snakemake complained if I did it all in one step, so this looks a bit ugly now, but it runs)
256-
cat results/statistics/trim-{wildcards.aligner}-{wildcards.alitrim}.{wildcards.hash}/stats_trimmed_{wildcards.alitrim}_{wildcards.aligner}-* > results/statistics/trim-{wildcards.aligner}-{wildcards.alitrim}.{wildcards.hash}/statistics_trimmed_temp-{wildcards.alitrim}_{wildcards.aligner}.txt
257-
head -n 1 results/statistics/trim-{wildcards.aligner}-{wildcards.alitrim}.{wildcards.hash}/statistics_trimmed_temp-{wildcards.alitrim}_{wildcards.aligner}.txt > results/statistics/trim-{wildcards.aligner}-{wildcards.alitrim}.{wildcards.hash}/statistics_trimmed_{wildcards.alitrim}_{wildcards.aligner}.txt
273+
cat results/statistics/trim-{wildcards.aligner}-{wildcards.alitrim}.{params.trimmer_hash}/stats_trimmed_{wildcards.alitrim}_{wildcards.aligner}-* > results/statistics/trim-{wildcards.aligner}-{wildcards.alitrim}.{params.trimmer_hash}/statistics_trimmed_temp-{wildcards.alitrim}_{wildcards.aligner}.txt
274+
head -n 1 results/statistics/trim-{wildcards.aligner}-{wildcards.alitrim}.{params.trimmer_hash}/statistics_trimmed_temp-{wildcards.alitrim}_{wildcards.aligner}.txt > results/statistics/trim-{wildcards.aligner}-{wildcards.alitrim}.{params.trimmer_hash}/statistics_trimmed_{wildcards.alitrim}_{wildcards.aligner}.txt
258275
259276
260277
echo "\\n ######## BEFORE #######"
261-
grep -v "^alignment" results/statistics/trim-{wildcards.aligner}-{wildcards.alitrim}.{wildcards.hash}/statistics_trimmed_temp-{wildcards.alitrim}_{wildcards.aligner}.txt >> {output.trim_info}
278+
grep -v "^alignment" results/statistics/trim-{wildcards.aligner}-{wildcards.alitrim}.{params.trimmer_hash}/statistics_trimmed_temp-{wildcards.alitrim}_{wildcards.aligner}.txt >> results/statistics/trim-{wildcards.aligner}-{wildcards.alitrim}.{params.trimmer_hash}/statistics_trimmed_{wildcards.alitrim}_{wildcards.aligner}.txt
262279
echo "\\n ######## AFTER #######"
263-
rm results/statistics/trim-{wildcards.aligner}-{wildcards.alitrim}.{wildcards.hash}/statistics_trimmed_temp-{wildcards.alitrim}_{wildcards.aligner}.txt
264-
for file in results/alignments/trimmed/{wildcards.aligner}-{wildcards.alitrim}.{wildcards.hash}/*.fas;
280+
rm results/statistics/trim-{wildcards.aligner}-{wildcards.alitrim}.{params.trimmer_hash}/statistics_trimmed_temp-{wildcards.alitrim}_{wildcards.aligner}.txt
281+
for file in results/alignments/trimmed/{wildcards.aligner}-{wildcards.alitrim}.{params.trimmer_hash}/*.fas;
265282
do
266283
if [[ -s {params.wd}/$file ]]; then
267284
if [[ "$(cat {params.wd}/$file | grep ">" -c)" -lt {params.minsp} ]]; then
268285
echo -e "$file\tTOO_FEW_SEQUENCES" 2>&1 | tee -a {output.filter_info}
269286
echo "$(date) - File $file contains less than {params.minsp} sequences after trimming with {params.trimming_method}. This file will not be used for tree reconstruction." >> {params.wd}/results/statistics/runlog.txt
270287
continue
271288
fi
272-
if [[ $(grep "$(basename $file)" {output.trim_info} | cut -f 6) -ge {params.min_pars_sites} && $(grep "$(basename $file)" {output.trim_info} | cut -f 9 | awk '{{ if ($1 <= {params.max_rcv_score}) {{print "OK"}} }}') == "OK" ]]; then
289+
if [[ $(grep "$(basename $file)" results/statistics/trim-{wildcards.aligner}-{wildcards.alitrim}.{params.trimmer_hash}/statistics_trimmed_{wildcards.alitrim}_{wildcards.aligner}.txt | cut -f 6) -ge {params.min_pars_sites} && $(grep "$(basename $file)" results/statistics/trim-{wildcards.aligner}-{wildcards.alitrim}.{params.trimmer_hash}/statistics_trimmed_{wildcards.alitrim}_{wildcards.aligner}.txt | cut -f 9 | awk '{{ if ($1 <= {params.max_rcv_score}) {{print "OK"}} }}') == "OK" ]]; then
273290
echo -e "$file\tPASS" 2>&1 | tee -a {output.filter_info}
274-
ln -s {params.wd}/$file {params.wd}/{params.target_dir}/
291+
ln -s -f {params.wd}/$file {params.wd}/{params.target_dir}/
275292
continue
276-
elif [[ $(grep "$(basename $file)" {output.trim_info} | cut -f 6) -lt {params.min_pars_sites} ]]; then # case if alignment has too few pars inf sites
293+
elif [[ $(grep "$(basename $file)" results/statistics/trim-{wildcards.aligner}-{wildcards.alitrim}.{params.trimmer_hash}/statistics_trimmed_{wildcards.alitrim}_{wildcards.aligner}.txt | cut -f 6) -lt {params.min_pars_sites} ]]; then # case if alignment has too few pars inf sites
277294
echo -e "$file\tNOT_INFORMATIVE" 2>&1 | tee -a {output.filter_info}
278295
continue
279-
elif [[ $(grep "$(basename $file)" {output.trim_info} | cut -f 9 | awk '{{ if ($1 <= {params.max_rcv_score}) {{print "OK"}} }}') != "OK" ]]; then # case if rcv is too high
296+
elif [[ $(grep "$(basename $file)" results/statistics/trim-{wildcards.aligner}-{wildcards.alitrim}.{params.trimmer_hash}/statistics_trimmed_{wildcards.alitrim}_{wildcards.aligner}.txt | cut -f 9 | awk '{{ if ($1 <= {params.max_rcv_score}) {{print "OK"}} }}') != "OK" ]]; then # case if rcv is too high
280297
echo -e "$file\tRCV_TOO_HIGH" 2>&1 | tee -a {output.filter_info}
281298
continue
282299
else # should not happen!
283300
echo -e "$file\tINVALID" 2>&1 | tee -a {output.filter_info}
284301
continue
285302
fi
286303
287-
# python bin/filter_alignments.py --alignments {params.wd}/$file --outdir "{params.wd}/{params.target_dir}" --statistics-file results/statistics/trim-{wildcards.aligner}-{wildcards.alitrim}.{wildcards.hash}/statistics_trimmed_{wildcards.alitrim}_{wildcards.aligner}.txt --min-parsimony {params.min_pars_sites} --minsp {params.minsp} >> {output.filter_info}
288304
else #do nothing if file is empty (happens rarely when ALICUT fails)
289305
continue
290306
fi
@@ -320,18 +336,18 @@ rule get_filter_statistics:
320336

321337
def pull_filtered_stats(wildcards):
322338
lis = []
323-
for t in trimmer_hashes.keys():
324-
for a in trimmer_hashes[t].keys():
339+
for t in filtered_hashes.keys():
340+
for a in filtered_hashes[t].keys():
325341
for i in range(1, config["concurrency"] + 1):
326-
lis.append("results/statistics/filter-"+a+"-"+t+"."+trimmer_hashes[t][a]+"/statistics_filtered_"+t+"_"+a+"-"+str(i)+"-"+str(config["concurrency"])+".txt")
342+
lis.append("results/statistics/filter-"+a+"-"+t+"."+filtered_hashes[t][a]+"/statistics_filtered_"+t+"_"+a+"-"+str(i)+"-"+str(config["concurrency"])+".txt")
327343
return lis
328344

329345
def pull_algn_info(wildcards):
330346
lis = []
331-
for t in trimmer_hashes.keys():
332-
for a in trimmer_hashes[t].keys():
347+
for t in filtered_hashes.keys():
348+
for a in filtered_hashes[t].keys():
333349
for i in range(1, config["concurrency"] + 1):
334-
lis.append("results/statistics/filter-"+a+"-"+t+"."+trimmer_hashes[t][a]+"/alignment_filter_information_"+t+"_"+a+".txt")
350+
lis.append("results/statistics/filter-"+a+"-"+t+"."+filtered_hashes[t][a]+"/alignment_filter_information_"+t+"_"+a+".txt")
335351
return lis
336352

337353
rule filter_align:

rules/modeltest.smk

+6-6
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ hashes = collect_hashes("modeltest", config, configfi, wd=os.getcwd())
1414

1515
filter_orthology_hash = hashes['filter-orthology']["global"]
1616
aligner_hashes = hashes['align']["per"]
17-
trimmer_hashes = hashes['filter-align']["per"]
17+
filtered_hashes = hashes['filter-align']["per"]
1818
previous_hash = hashes['filter-align']["global"]
1919

2020
modeltest_hashes = hashes['modeltest']["per"]
@@ -25,7 +25,7 @@ BUSCOS, = glob_wildcards("results/orthology/busco/busco_sequences_deduplicated."
2525
def previous_params_global(wildcards):
2626
return "results/alignments/trimmed/parameters.filter-align."+previous_hash+".yaml"
2727
def previous_params_per(wildcards):
28-
return "results/alignments/trimmed/"+wildcards.aligner+"-"+wildcards.alitrim+"."+trimmer_hashes[wildcards.alitrim][wildcards.aligner]+"/parameters.filter-align."+wildcards.aligner+"-"+wildcards.alitrim+"."+trimmer_hashes[wildcards.alitrim][wildcards.aligner]+".yaml"
28+
return "results/alignments/filtered/"+wildcards.aligner+"-"+wildcards.alitrim+"."+filtered_hashes[wildcards.alitrim][wildcards.aligner]+"/parameters.filter-align."+wildcards.aligner+"-"+wildcards.alitrim+"."+filtered_hashes[wildcards.alitrim][wildcards.aligner]+".yaml"
2929

3030
aligners = get_aligners()
3131
trimmers = get_trimmers()
@@ -69,15 +69,15 @@ bscuts = get_bootstrap_cutoffs()
6969
def return_target_modeltest_check(wildcards):
7070
lis = []
7171
for busco in BUSCOS:
72-
if os.path.isfile("results/alignments/filtered/"+wildcards.aligner+"-"+wildcards.alitrim+"."+trimmer_hashes[wildcards.alitrim][wildcards.aligner]+"/"+str(busco)+"_aligned_trimmed.fas"):
72+
if os.path.isfile("results/alignments/filtered/"+wildcards.aligner+"-"+wildcards.alitrim+"."+filtered_hashes[wildcards.alitrim][wildcards.aligner]+"/"+str(busco)+"_aligned_trimmed.fas"):
7373
# lis.append("results/modeltest/"+wildcards.aligner+"-"+wildcards.alitrim+"."+modeltest_hashes["iqtree"][wildcards.alitrim][wildcards.aligner]+"/"+busco+"/"+busco+".log")
7474
lis.append("results/checkpoints/modeltest/"+wildcards.aligner+"-"+wildcards.alitrim+"."+modeltest_hashes["iqtree"][wildcards.alitrim][wildcards.aligner]+"/"+str(busco)+"_modeltest_"+wildcards.aligner+"_"+wildcards.alitrim+".done")
7575
return lis
7676

7777
def return_genes(wildcards):
7878
lis = []
7979
for busco in BUSCOS:
80-
if os.path.isfile("results/alignments/filtered/"+wildcards.aligner+"-"+wildcards.alitrim+"."+trimmer_hashes[wildcards.alitrim][wildcards.aligner]+"/"+str(busco)+"_aligned_trimmed.fas"):
80+
if os.path.isfile("results/alignments/filtered/"+wildcards.aligner+"-"+wildcards.alitrim+"."+filtered_hashes[wildcards.alitrim][wildcards.aligner]+"/"+str(busco)+"_aligned_trimmed.fas"):
8181
# lis.append("results/modeltest/"+wildcards.aligner+"-"+wildcards.alitrim+"."+modeltest_hashes["iqtree"][wildcards.alitrim][wildcards.aligner]+"/"+busco+"/"+busco+".log")
8282
lis.append(busco)
8383
return lis
@@ -109,10 +109,10 @@ rule read_params_global:
109109
"""
110110

111111
def alignments_in(wildcards):
112-
return "results/alignments/filtered/"+wildcards.aligner+"-"+wildcards.alitrim+"."+trimmer_hashes[wildcards.alitrim][wildcards.aligner]+"/"+wildcards.busco+"_aligned_trimmed.fas"
112+
return "results/alignments/filtered/"+wildcards.aligner+"-"+wildcards.alitrim+"."+filtered_hashes[wildcards.alitrim][wildcards.aligner]+"/"+wildcards.busco+"_aligned_trimmed.fas"
113113

114114
def return_trimmer_checkpoint(wildcards):
115-
return "results/statistics/filter-"+wildcards.aligner+"-"+wildcards.alitrim+"."+trimmer_hashes[wildcards.alitrim][wildcards.aligner]+"/alignment_filter_information_"+wildcards.alitrim+"_"+wildcards.aligner+".txt"
115+
return "results/statistics/filter-"+wildcards.aligner+"-"+wildcards.alitrim+"."+filtered_hashes[wildcards.alitrim][wildcards.aligner]+"/alignment_filter_information_"+wildcards.alitrim+"_"+wildcards.aligner+".txt"
116116

117117
rule iqtree_mt:
118118
input:

0 commit comments

Comments
 (0)