首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从子目录中收集文件以运行Snakemake中的作业?

如何从子目录中收集文件以运行Snakemake中的作业?
EN

Stack Overflow用户
提问于 2017-08-21 20:42:37
回答 1查看 1.2K关注 0票数 1

我目前正在这个项目上工作,在这个项目中,我正在努力解决这个问题。

我的当前目录结构是

代码语言:javascript
运行
复制
 /shared/dir1/file1.bam
 /shared/dir2/file2.bam
 /shared/dir3/file3.bam

我希望将各种.bam文件转换为结果目录中的fastq文件。

代码语言:javascript
运行
复制
  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  

我有以下代码:

代码语言:javascript
运行
复制
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}"

这将输出以下错误:

代码语言:javascript
运行
复制
Wildcards in input files cannot be determined from output files:
'dir'

如能提供任何帮助,将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2017-08-21 21:14:44

您只是在规则bam_to_fq的输入指令中缺少了"dir“的赋值。在您的代码中,您试图让Snakemake从相同规则的输出中确定"{dir}“,因为您将它设置为通配符。因为它不存在,所以作为输出指令中的变量,您收到了一个错误。

代码语言:javascript
运行
复制
    input:  
         "{dir}/{sample}.bam"
    output: 
         left="/results/{sample}_1.fastq", 
         right="/results/{sample}_2.fastq",

经验法则:输入和输出通配符必须与匹配

代码语言:javascript
运行
复制
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‘,而调试将会令人沮丧。我个人是有罪的,一个轻微的伪君子,因为我在我的核心蛇形使用"sample=samples“。这给我带来了小小的压力,所以我提出这个建议。此外,它也使其他人更容易阅读您的代码。

编辑1;添加到响应中,因为我最初忽略了dir和示例的键值匹配要求。

我建议在不同的变量中分离路径和示例名。我可以想到两种方法:

  1. 继续使用glob_wildcards搜索所有可能的变量,然后使用python函数验证哪些path+file组合是合法的。
  2. 放弃使用glob_wildcards。将目录名作为通配符变量{dir}传播到整个规则中。只需将其设置为“结果”的子目录。使用pandas将文件中列出的已知键值对传递给所有规则。最初,我建议手动生成键值对文件,但最终,它的生成可能只是其他文件的上游规则。

对bam_to_fq进行了一些推广.利用外部配置,就像.

从熊猫进口read_table

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
dir file
dir1 file1
dir2 file2
dir3 file3
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45805217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档