我认为我有一个简单的问题,但我不知道如何解决。
我的输入文件夹包含以下文件:
AAAAA_S1_R1_001.fastq
AAAAA_S1_R2_001.fastq
BBBBB_S2_R1_001.fastq
BBBBB_S2_R2_001.fastq
我的snakemake代码:
import glob
samples = [os.path.basename(x) for x in sorted(glob.glob("input/*.fastq"))]
name = []
for x in samples:
if "_R1_" in x:
name.append(x.split("_R1_")[0])
NAME = name
rule all:
input:
expand("output/{sp}_mapped.bam", sp=NAME),
rule bwa:
input:
R1 = "input/{sample}_R1_001.fastq",
R2 = "input/{sample}_R2_001.fastq"
output:
mapped = "output/{sample}_mapped.bam"
params:
ref = "refs/AF086833.fa"
run:
shell("bwa mem {params.ref} {input.R1} {input.R2} | samtools sort > {output.mapped}")
输出文件名为:
AAAAA_S1_mapped.bam
BBBBB_S2_mapped.bam
我希望输出文件为:
AAAAA_mapped.bam
BBBBB_mapped.bam
如何在bwa规则之前或之后更改输出名称或重命名文件。
答案 0 :(得分:1)
尝试一下:
import pathlib
indir = pathlib.Path("input")
paths = indir.glob("*_S?_R?_001.fastq")
samples = set([x.stem.split("_")[0] for x in paths])
rule all:
input:
expand("output/{sample}_mapped.bam", sample=samples)
def find_fastqs(wildcards):
fastqs = [str(x) for x in indir.glob(f"{wildcards.sample}_*.fastq")]
return sorted(fastqs)
rule bwa:
input:
fastqs = find_fastqs
output:
mapped = "output/{sample}_mapped.bam"
params:
ref = "refs/AF086833.fa"
shell:
"bwa mem {params.ref} {input.fastqs} | samtools sort > {output.mapped}"
使用输入函数为rule bwa
查找正确的样本。可能会有一个更优雅的解决方案,但我现在看不到。我认为这应该可以。
(已编辑,以反映OP的编辑。)
答案 1 :(得分:0)
不幸的是,我也遇到了具有以下逻辑的文件名问题:{batch}/{seq_run}_{index}_{flowcell}_{lane}_{read_orientation}.fastq.gz
。
我认为核心问题是各个通配符都不是唯一的。同样,并非所有通配符的所有值都可以合并; seq_run1在lane1而不是lane2上运行。因此,expand()不起作用。
在Snakemake中多次尝试(见下文)之后,我的解决方案是使用mv
/ sed
/ rename
标准化输入。删除{batch}
,{flowcell}
和{lane}
可以使用{sample}
,这是{seq_run}
和{index}
的唯一组合。
不起作用的工作原理(但在相同情况下尝试其他人也值得):
output
:
output: "_".join(re.split("[/_]", "{full_filename}")[1,2]+".fastq.gz"