您只是在规则 bam_to_fq 的输入指令中缺少“dir”的分配。在您的代码中,您试图让 Snakemake 从同一规则的输出中确定“{dir}”,因为您将其设置为通配符。由于它不存在,作为输出指令中的变量,您收到了错误。
input:
"{dir}/{sample}.bam"
output:
left="/results/{sample}_1.fastq",
right="/results/{sample}_2.fastq",
经验法则:输入和输出通配符必须匹配
rule all:
input:
expand("/results/{sample}_{end}.fastq.gz", sample=files, end=END)
rule bam_to_fq:
input:
expand("{dir}/{{sample}}.bam", dir=dirs)
output:
left="/results/{sample}_1.fastq",
right="/results/{sample}_2.fastq"
shell:
"/shared/packages/bam2fastq/bam2fastq --force -o /results/{sample}.fastq {input}
笔记
- 输入指令中的示例变量现在需要双 {},因为这是在扩展中识别通配符的方式。
- dir 不再是通配符,它被显式设置为指向由 glob_wildcard 调用确定的目录列表并分配给我假设您在脚本中较早创建的变量“dirs”,因为分配了一个变量已经成功,在您的规则中所有输入“sample=files”。
- 我喜欢并推荐易于区分的变量名称。我不喜欢使用变量名“dir”和“dirs”。这使您容易出现迂腐的拼写错误。考虑将其更改为“dirLIST”和“dir”......或其他任何东西。我只是担心有一天有人会在某个地方错过一个“s”,调试起来会很沮丧。我个人有罪,因此有点伪君子,因为我确实在我的核心 Snakefile 中使用了“sample=samples”。它给我带来了轻微的压力,因此我提出了这个建议。也使其他人也更容易阅读您的代码。
编辑1;添加响应,因为我最初错过了对 dir 和 sample 的键值匹配的要求
我建议将路径和示例名称分开保存在不同的变量中。我能想到的两种方法:
- 继续使用 glob_wildcards 对所有可能的变量进行全面搜索,然后使用 python 函数验证哪些路径+文件组合是合法的。
- 放弃 glob_wildcards 的使用。在整个规则中将目录名称作为通配符变量 {dir} 传播。只需将其设置为“结果”的子目录即可。使用pandas将文件中列出的已知键值对传递给规则 all。最初我建议手动生成键值对文件,但最终,它的生成可能只是其他规则的上游。
稍微概括 bam_to_fq ......利用外部配置,比如......
从熊猫导入 read_table
rule all:
input:
expand("/results/{{sample[1][dir]}}/{sample[1][file]}_{end}.fastq.gz", sample=read_table(config["sampleFILE"], " ").iterrows(), end=['1','2'])
rule bam_to_fq:
input:
"{dir}/{sample}.bam"
output:
left="/results/{dir}/{sample}_1.fastq",
right="/results/{dir}/{sample}_2.fastq"
shell:
"/shared/packages/bam2fastq/bam2fastq --force -o /results/{sample}.fastq {input}
样本文件
dir file
dir1 file1
dir2 file2
dir3 file3