2017-01-20 9 views
1

Я только начинаю с snakemake и задавался вопросом, что такое «правильный» способ запускать набор параметров в одном файле и как это будет работать для цепочки правил?использовать несколько параметров в snakemake

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

Я начал делать это:

INFILES = ["mytable"] 

rule preprocess: 
input: 
    bam=expand("data/{sample}.csv", sample=INFILES, param=config["normmethod"]) 

output: 
    bamo=expand("results/{sample}_pp_{param}.csv", sample=INFILES, param=config["normmethod"]) 

script: 
    "scripts/preprocess.py" 

А затем вызывается скрипт с помощью:

snakemake --config normmethod = Median

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

normmethods= ["Median", "Quantile"] 
kclusters= [1,3,5,7,10] 
+0

Расширение на вашем входе содержит 'param', который не отображается в строке, которая должна быть расширена. Как он себя ведет? – bli

+0

Выполняется код выше. Если я делаю «snakemake --config normmethod = Median», используется метод «Медиана». Если я запускаю рабочий процесс с помощью «snakemake --config normmethod = Mean», используется среднее значение. Соответственно, выходные файлы несут «normmethod param» в их имени файла. –

ответ

4

Вы хорошо использовали функцию expand() в своем правиле.

Для параметров я рекомендую использовать файл конфигурации, содержащий все ваши параметры. Snakemake работает с YAML & Файлы JSON. Здесь вы получили всю информацию об этих двух форматах:

В вашем случае вы просто в YAML файл, чтобы написать это:

INFILES : "mytables" 

normmethods : ["Median", "Quantile"] 
or 
normmethods : - "Median" 
       - "Quantile" 

kclusters : [1,3,5,7,10] 
or 
kclusters : - 1 
      - 3 
      - 5 
      - 7 
      - 10 

Напиши свое правило следующим образом:

rule preprocess: 
input: 
    bam = expand("data/{sample}.csv", 
       sample = config["INFILES"]) 

params : 
    kcluster = config["kcluster"] 

output: 
    bamo = expand("results/{sample}_pp_{method}_{cluster}.csv", 
        sample = config["INFILES"], 
        method = config["normmethod"], 
        cluster = config["kcluster"]) 

script: 
    "scripts/preprocess.py {input.bam} {params.kcluster}" 

Тогда вы просто должны завтракать, как это:

snakemake --configfile path/to/config.yml 

Для работы с другими параметрами, которые вы должны изменить файл конфигурации, а не ваш snakefile (делает меньше ошибок) и лучше читабельность и красоту кода.

EDIT:

rule preprocess: 
    input: 
     bam = "data/{sample}.csv" 

Просто, чтобы исправить свою собственную ошибку, вам не нужно использовать расширения здесь на входе, так как вы просто хотите запустить правило один файл .csv по одному. Так что просто положите подстановочный знак, и Snakemake сделает свою часть.

+0

Супер гладкий. Большое спасибо! –

+0

Привет, хороший ответ. Не могли бы вы также предоставить пример файла сценария (preprocess.py), пожалуйста? – anilbey

4

Кажется, вы не передали параметры своему сценарию. Как насчет чего-то вроде следующего?

import re 
import os 
import glob 
normmethods= ["Median", "Quantile"] # can be set from config['normmethods']  
kclusters= [1,3,5,7,10]    # can be set from config['kclusters'] 
INFILES = ['results/' + re.sub('\.csv$', '_pp_' + m + '-' + str(k) + '.csv', re.sub('data/', '', file)) for file in glob.glob("data/*.csv") for m in normmethods for k in kclusters] 

rule cluster: 
    input: INFILES 

rule preprocess: 
    input: 
     bam="data/{sample}.csv" 
    output: 
     bamo="results/{sample}_pp_{m}-{k}.csv" 
    run:  
     os.system("scripts/preprocess.py %s %s %s %s" % (input.bame, output.bamo, wildcards.m, wildcards.k)) 
+0

Спасибо за ваш ответ! Мне это не кажется очень изящным, но он выполняет работу для более сложных случаев использования! Так что спасибо! ;) –