Вопрос:

Snakemake: Как сохранить и получить доступ к деталям примера в файле config.yml?

python snakemake

405 просмотра

2 ответа

119 Репутация автора

Кто-нибудь может помочь мне понять, возможно ли получить доступ к деталям примера из файла config.yml, когда имена образцов не записаны в рабочем процессе snakemake? Это позволяет мне повторно использовать рабочий процесс для разных проектов и настраивать только файл конфигурации. Позволь мне привести пример:

У меня есть четыре образца, которые принадлежат друг другу и должны анализироваться вместе. Они называются sample1-4. Каждый образец содержит больше информации, но для простоты, скажем, это просто тег имени, такой как S1, S2 и т. Д.

Мой файл config.yml может выглядеть так:

samples: ["sample1","sample2","sample3","sample4"]

sample1:
  tag: "S1"
sample2:
  tag: "S2"
sample3:
  tag: "S3"
sample4:
  tag: "S4"

И вот пример файла змеи, который мы используем:

configfile: "config.yaml"

rule final: 
  input: expand("{sample}.txt", sample=config["samples"])

rule rule1:
  output:  "{sample}.txt"
  params:  tag=config["{sample}"]["tag"]
  shell:   """
           touch {output}
           echo {params.tag} > {output}

То, что пытается сделать rule1, - это создать файл с именем после каждого образца, сохраненный в samplesпеременной в файле конфигурации. Пока проблем нет. Затем я хотел бы напечатать образец тега в этот файл. Поскольку код написан выше, выполнение snakemakeзавершится неудачей, потому config["{sample}"]что буквально будет искать {sample}переменную в файле конфигурации, которая не существует, потому что вместо этого мне нужно заменить ее на текущий пример, для которого выполняется правило, например sample1.

Кто-нибудь знает, возможно ли это как-то сделать, и если да, то как я могу это сделать?

В идеале я хотел бы сжать информацию еще больше (см. Ниже), но это еще не все.

samples:
    sample1:
        tag: "S1"
    sample2:
        tag: "S2"
    sample3:
        tag: "S3"
    sample4:
        tag: "S4"
Автор: fakechek Источник Размещён: 09.01.2018 06:16

Ответы (2)


4 плюса

546 Репутация автора

Решение

Я бы предложил использовать файл с разделителями табуляции для хранения образцов информации.

sample.tab:

Sample     Tag      
1          S1   
2          S2

Вы можете сохранить путь к этому файлу в файле конфигурации и прочитать его в своем Snakefile.

config.yaml:

sample_file: "sample.tab"

Snakefile:

configfile: "config.yaml"

sample_file = config["sample_file"]

samples = read_table(sample_file)['Sample']
tags    = read_table(sample_file)['Tag']

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

Кроме того, в Snakemake обычно вы можете избежать фигурных скобок, удвоив их, может быть, вы могли бы попробовать это.

Удачи!

Автор: rioualen Размещён: 09.01.2018 07:55

2 плюса

2867 Репутация автора

В paramsразделе вам необходимо указать функцию wildcards. Следующая модификация вашего рабочего процесса, кажется, работает:

configfile: "config.yaml"

rule final: 
    input: expand("{sample}.txt", sample=config["samples"])

rule rule1:
    output:
        "{sample}.txt"
    params:
        tag = lambda wildcards: config[wildcards.sample]["tag"]
    shell:
        """
        touch {output}
        echo {params.tag} > {output}
        """
Автор: bli Размещён: 10.01.2018 11:41
Вопросы из категории :
32x32