另一种方法,一种不使用“动态”的方法。
并不是您不知道要使用多少个文件,而是您只使用了您将开始使用的文件的子集。由于您能够生成所有潜在文件的“samples.txt”列表,我将假设您有一个坚定的起点。
我做了类似的事情,我有一些我想要处理有效性的初始文件,(在我的例子中,我正在提高质量~排序、索引等)。然后,我想忽略除结果文件之外的所有内容。
我建议,为了避免创建第二个示例文件列表,创建第二个数据目录 (reBamDIR),data2 (BamDIR)。在 data2 中,您对所有有效文件进行符号链接。这样,Snake 就可以处理 data2 目录中的所有内容。使管道向下移动更容易,管道可以停止依赖样本列表,它可以使用通配符处理所有内容(更容易编码)。这是可能的,因为当我进行符号链接时,我会标准化名称。我在输出规则中列出了符号链接文件,以便 Snakemake 了解它们,然后它可以创建 DAG。
`-- output
|-- bam
| |-- Pfeiffer2.bam -> /home/tboyarski/share/projects/tboyarski/gitRepo-LCR-BCCRC/Snakemake/buildArea/output/reBam/Pfeiffer2_realigned_sorted.bam
| `-- Pfeiffer2.bam.bai -> /home/tboyarski/share/projects/tboyarski/gitRepo-LCR- BCCRC/Snakemake/buildArea/output/reBam/Pfeiffer2_realigned_sorted.bam.bai
|-- fastq
|-- mPile
|-- reBam
| |-- Pfeiffer2_realigned_sorted.bam
| `-- Pfeiffer2_realigned_sorted.bam.bai
在这种情况下,您所需要的只是“验证器”中的返回值,以及响应它的条件运算符。
我认为你已经在某个地方有了这个,因为你必须在验证步骤中使用条件。不要使用它将文件名写入 txt 文件,只需将文件符号链接到最终位置并继续。
我的原始数据在 reBamDIR 中。我存储在 BamDIR 中的最终数据。我只将管道中这个阶段的文件符号链接到 bamDIR。reBamDIR 中还有其他文件,但我不希望管道的其余部分看到它们,所以我将它们过滤掉。
我不完全确定如何实现“验证器”和你的条件,因为我不知道你的情况,我也在学习。只是试图提供替代的观点//方法。
from time import gmtime, strftime
rule indexBAM:
input:
expand("{outputDIR}/{reBamDIR}/{{samples}}{fileTAG}.bam", outputDIR=config["outputDIR"], reBamDIR=config["reBamDIR"], fileTAG=config["fileTAG"])
output:
expand("{outputDIR}/{reBamDIR}/{{samples}}{fileTAG}.bam.bai", outputDIR=config["outputDIR"], reBamDIR=config["reBamDIR"], fileTAG=config["fileTAG"]),
expand("{outputDIR}/{bamDIR}/{{samples}}.bam.bai", outputDIR=config["outputDIR"], bamDIR=config["bamDIR"]),
expand("{outputDIR}/{bamDIR}/{{samples}}.bam", outputDIR=config["outputDIR"], bamDIR=config["bamDIR"])
params:
bamDIR=config["bamDIR"],
outputDIR=config["outputDIR"],
logNAME="indexBAM." + strftime("%Y-%m-%d.%H-%M-%S", gmtime())
log:
"log/" + config["reBamDIR"]
shell:
"samtools index {input} {output[0]} " \
" 2> {log}/{params.logNAME}.stderr " \
"&& ln -fs $(pwd)/{output[0]} $(pwd)/{params.outputDIR}/{params.bamDIR}/{wildcards.samples}.bam.bai " \
"&& ln -fs $(pwd)/{input} $(pwd)/{params.outputDIR}/{params.bamDIR}/{wildcards.samples}.bam"