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

Может ли кто-нибудь помочь мне понять, можно ли получить доступ к деталям образца из файла 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"

А вот пример используемого нами snakefile:

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}

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

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

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

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

person fakechek    schedule 09.01.2018    source источник
comment
Snakemake не заменяет фигурные скобки ни в какой части Snakefile. Только в командах оболочки и вводе / выводе / параметрах, заданных как простые строки. В вашем случае нужно написать tag=lambda wildcards: config[wildcards.sample]["tag"].   -  person Johannes Köster    schedule 10.01.2018
comment
Отлично, спасибо!   -  person fakechek    schedule 10.01.2018


Ответы (2)


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

sample.tab:

Sample     Tag      
1          S1   
2          S2

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

config.yaml:

sample_file: "sample.tab"

Змеиный файл:

configfile: "config.yaml"

sample_file = config["sample_file"]

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

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

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

Удачи!

person rioualen    schedule 09.01.2018
comment
Да, отдельный лист образцов - более масштабируемый способ. Обратите внимание, что вы можете прочитать его однострочно через pandas: pd.read_table(config["samples"]). См. github.com/snakemake-workflows/rna-seq-star-deseq2 для примера. - person Johannes Köster; 10.01.2018
comment
Хороший момент в разделении информации о образце и конфигурации. На данный момент у меня почти нет настроек, сохраненных в файле конфигурации, но по мере того, как я расширяю рабочий процесс, я уверен, что разделение этих вещей станет более очевидным. - person fakechek; 10.01.2018

В разделе 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}
        """
person bli    schedule 10.01.2018