首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Snakemake:可以使用目录作为通配符吗?

Snakemake:可以使用目录作为通配符吗?
EN

Stack Overflow用户
提问于 2019-07-08 10:23:40
回答 1查看 1.4K关注 0票数 3

嗨,我是Snakemake新来的,有个问题。我想对多个数据集运行一个工具。一个数据集代表一个组织,每个组织存在fastq文件,这些文件存储在各自的组织目录中。工具的粗略命令是:

代码语言:javascript
复制
  python TEcount.py -rosette rosettefile -TE te_references -count result/tissue/output.csv -RNA <LIST OF FASTQ FILE FOR THE RESPECTIVE SAMPLE>          

组织应该是通配符。我该怎么做?下面是我的第一次尝试,但没有奏效。

代码语言:javascript
复制
import os                                                                        

#collect data sets                                                               
SAMPLES=os.listdir("data/rnaseq/")                                               


rule all:                                                                        
    input:                                                                       
        expand("results/{sample}/TEtools.{sample}.output.csv", sample=SAMPLES)                   

rule run_TEtools:                                                                
    input:                                                                       
        TEcount='scripts/TEtools/TEcount.py',                                    
        rosette='data/prepared_data/rosette/rosette',                            
        te_references='data/prepared_data/references/all_TE_instances.fa'        
    params:
        #collect the fastq files in the tissue directory                                                              
        fastq_files = os.listdir("data/rnaseq/{sample}")                         
    output:                                                                      
        'results/{sample}/TEtools.{sample}.output.csv'                           
    shell:                                                                       
        'python {input.TEcount} -rosette {input.rosette} -TE                     
{input.te_references} -count {output} -RNA {params.fastq_files}'

在规则run_TEtools中,它不知道{sample}是什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-08 12:29:31

蛇形通配符可以是任何东西。基本上只是一根绳子。

你试图实现你想要的东西的方式有一些问题。

好吧,我就是这样做的。解释如下:

代码语言:javascript
复制
import os                                                                        

#collect data sets
# Beware no other directories or files (than those containing fastqs) should be in that folder                                                        
SAMPLES=os.listdir("data/rnaseq/")                                               

def getFastqFilesForTissu(wildcards):
    fastqs = list()
    # Beware no other files than fastqs should be there
    for s in os.listdir("data/rnaseq/"+wildcards.sample):
        fastqs.append(os.path.join("data/rnaseq",wildcards.sample,s))
    return fastqs

rule all:                                                                        
    input:                                                                       
        expand("results/{sample}/TEtools.{sample}.output.csv", sample=SAMPLES)                   

rule run_TEtools:                                                                
    input:                                                                       
        TEcount='scripts/TEtools/TEcount.py',                                    
        rosette='data/prepared_data/rosette/rosette',                            
        te_references='data/prepared_data/references/all_TE_instances.fa',
        fastq_files = getFastqFilesForTissu        
    output:                                                                      
        'results/{sample}/TEtools.{sample}.output.csv'                           
    shell:                                                                       
        'python {input.TEcount} -rosette {input.rosette} -TE {input.te_references} -count {output} -RNA {input.fastq_files}'

首先,应该将fastq文件定义为输入,以便snakemake知道它们是文件,如果它们被更改,规则必须重新运行。将输入文件定义为params是非常糟糕的做法。params是为参数而设的,通常不是针对文件的。

其次,脚本文件被定义为输入。您必须意识到,每次修改它时,规则都会重新运行。也许这就是你想要的。

我将使用一个定义的函数来获取每个目录中的fastq文件。如果要使用函数(如os.listdir()),则不能直接使用通配符。您必须将它作为python对象注入函数中。您可以定义一个函数,它将接受一个参数,一个包含所有通配符的通配符对象,或者使用lambda关键字(ex:input = lamdba wildcards: myFuntion(wildcards.sample))。

另一个问题是,os.listdir()返回一个没有相对路径的文件列表。还请注意,os.listdir()将返回fastq文件的顺序是未知的。也许这对你的指挥没什么关系。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56932937

复制
相关文章

相似问题

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