如果我理解正确的话,我认为这是一个有趣的情况。如果样本通过了一些检查,则继续分析它。否则,就早点停下来。
在管道的末端,每个样本必须有一个PATH_TO_OUTPUT/{lauch}.{sample}.output
既然这是什么规则all
无论检查结果如何都要求。
您可以让执行检查的规则写入一个包含标志的文件,该标志指示该样本的检查是否通过(例如标志“通过”或“失败”)。然后根据该标志,执行分析的规则要么进行完整分析(如果通过),要么如果标志为失败则写入空文件(或其他任何内容)。要点如下:
rule all:
input:
expand('{sample}.output', sample= samples),
rule checker:
input:
'{sample}.input',
output:
'{sample}.check',
shell:
r"""
if [ some_check_is_ok ]
then
echo "PASS" > {output}
else
echo "FAIL" > {output}
fi
"""
rule do_analysis:
input:
chk= '{sample}.check',
smp= '{sample}.input',
output:
'{sample}.output',
shell:
r"""
if [ {input.chk} contains "PASS"]:
do_long_analysis.sh {input.smp} > {output}
else:
> {output} # Do nothing: empty file
"""
如果您根本不想看到失败的空输出文件,您可以使用成功 https://snakemake.readthedocs.io/en/stable/snakefiles/rules.html#onstart-onsuccess-and-onerror-handlers在管道末尾删除它们的指令:
onsuccess:
for x in expand('{sample}.output', sample= samples):
if os.path.getsize(x) == 0:
print('Removing failed sample %s' % x)
os.remove(x)