snakemake:如何处理规则输出的可变数量

snakemake: how to deal with variable number of output from a rule

我想运行 bcl2fastq 从 bcl 格式生成 fastq 文件。

根据排序模式和索引数量的不同,它可以生成read1、read2、index1或read1、read2、index1、index2等

我想做的是,把读出的输出编号信息放在config.yaml文件里,像这样:

readids: ['I1','I2','R1','R2']

并让规则自动确定它应该生成多少读取输出(fastq.gz 文件)。

如何编写输出部分来实现呢?

下面是我所拥有的,不知何故每次只能从这个规则输出一个文件。所以它实际上 运行 这个规则 4 次,每次针对 I1、I2、R1 和 R2,这不是我想要的。如何在第 45 行修复它?在第 45 行中,{readid} 应该是 I1,I2,R1,R2.

之一
 39 rule bcl2fastq:                                                                                                                                                 
 40     input:
 41         "/data/MiniSeq/test"
 42     params:
 43         prefix="0_fastq"
 44     output:
 45         "0_fastq/{runid}_S0_L001_{readid}_001.fastq.gz"
 46     log:
 47         "0_fastq/bcl2fastq_log.txt"
 48     shell:
 49         """
 50         bcl2fastq -R {input} -o {params.prefix} --create-fastq-for-index-reads --barcode-mismatches 1 --use-bases-mask {config[bcl2mask]} --minimum-trimmed
    -read-length 1 --mask-short-adapter-reads 1 --no-bgzf-compression &> {log}
 52        
 53         """

您正在寻找 expand() function,它基本上填充给定变量,返回输出文件列表。您只需要小心转义应该 "survive the formatting" (使用双大括号)的通配符:

所以在你的情况下

output:
      expand("0_fastq/{{runid}}_S0_L001_{readid}_001.fastq.gz", readid=config['readids'])

这将用配置中给定的值替换 readid['readids'] 并保留 runid 通配符。

安德烈亚斯