我目前正在这个项目上工作,在这个项目中,我正在努力解决这个问题。
我的当前目录结构是
/shared/dir1/file1.bam
/shared/dir2/file2.bam
/shared/dir3/file3.bam我希望将各种.bam文件转换为结果目录中的fastq文件。
results/file1_1.fastq.gz
results/file1_2.fastq.gz
results/file2_1.fastq.gz
results/file2_2.fastq.gz
results/file3_1.fastq.gz
results/file3_2.fastq.gz 我有以下代码:
END=["1","2"]
(dirs, files) = glob_wildcards("/shared/{dir}/{file}.bam")
rule all:
input: expand( "/results/{sample}_{end}.fastq.gz",sample=files, end=END)
rule bam_to_fq:
input: {dir}/{sample}.bam"
output: left="/results/{sample}_1.fastq", right="/results/{sample}_2.fastq"
shell: "/shared/packages/bam2fastq/bam2fastq --force -o /results/{sample}.fastq {input}"这将输出以下错误:
Wildcards in input files cannot be determined from output files:
'dir'如能提供任何帮助,将不胜感激。
发布于 2017-08-21 21:14:44
您只是在规则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}注意到
编辑1;添加到响应中,因为我最初忽略了dir和示例的键值匹配要求。
我建议在不同的变量中分离路径和示例名。我可以想到两种方法:
对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}sampleFILE
dir file
dir1 file1
dir2 file2
dir3 file3https://stackoverflow.com/questions/45805217
复制相似问题