1

我目前正在从事这个项目,我正在努力解决这个问题。

我当前的目录结构是

 /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'

任何帮助,将不胜感激

4

1 回答 1

0

您只是在规则 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. 输入指令中的示例变量现在需要双 {},因为这是在扩展中识别通配符的方式。
  2. dir 不再是通配符,它​​被显式设置为指向由 glob_wildcard 调用确定的目录列表并分配给我假设您在脚本中较早创建的变量“dirs”,因为分配了一个变量已经成功,在您的规则中所有输入“sample=files”。
  3. 我喜欢并推荐易于区分的变量名称。我不喜欢使用变量名“dir”和“dirs”。这使您容易出现迂腐的拼写错误。考虑将其更改为“dirLIST”和“dir”......或其他任何东西。我只是担心有一天有人会在某个地方错过一个“s”,调试起来会很沮丧。我个人有罪,因此有点伪君子,因为我确实在我的核心 Snakefile 中使用了“sample=samples”。它给我带来了轻微的压力,因此我提出了这个建议。也使其他人也更容易阅读您的代码。

编辑1;添加响应,因为我最初错过了对 dir 和 sample 的键值匹配的要求

我建议将路径和示例名称分开保存在不同的变量中。我能想到的两种方法:

  1. 继续使用 glob_wildcards 对所有可能的变量进行全面搜索,然后使用 python 函数验证哪些路径+文件组合是合法的。
  2. 放弃 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
于 2017-08-21T21:14:44.350 回答