Snakemake: Можно ли использовать каталоги в качестве подстановочных знаков? - PullRequest
1 голос
/ 08 июля 2019

Привет, я новичок в Snakemake и у меня есть вопрос.Я хочу запустить инструмент для нескольких наборов данных.Один набор данных представляет одну ткань, и для каждой ткани существуют файлы fastq, которые хранятся в соответствующем каталоге тканей.Грубая команда для инструментов:

  python TEcount.py -rosette rosettefile -TE te_references -count result/tissue/output.csv -RNA <LIST OF FASTQ FILE FOR THE RESPECTIVE SAMPLE>          

Ткани должны быть подстановочными знаками.Как я могу это сделать?Ниже у меня есть первая попытка, которая не сработала.

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}.

1 Ответ

1 голос
/ 08 июля 2019

Подстановочный знак змеиной маки может быть чем угодно. В основном это просто строка.
Есть некоторые проблемы с тем, как вы пытаетесь достичь того, чего хотите.

Хорошо, вот как бы я это сделал. Пояснения следуют:

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 (например: input = lamdba wildcards: myFuntion(wildcards.sample)).
Другая проблема, с которой вы столкнулись, заключается в том, что os.listdir() возвращает список файлов без относительного пути. Также помните, что порядок, в котором os.listdir() вернет вам файл fastq, неизвестен. Может быть, это не имеет значения для вашей команды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...