Snakemake: извлеките информацию о конкретном образце из таблицы конфигурации

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

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

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

Вот как я пытался это решить:

  params:  reference=lambda wildcards: table_samples['reference'][wildcards.sample],
           chrom_sizes=config[reference]['chrom_sizes']

Однако, когда я пытаюсь запустить его таким образом, я получаю сообщение об ошибке (непосредственно при запуске Snakemake) о том, что reference в строке chrom_sizes=... не определено.

У кого-нибудь есть идея обходного пути?

РЕДАКТИРОВАТЬ: Еще немного информации, потому что я думаю, не совсем понятно, что я имел в виду. Вот соответствующая часть моего файла конфигурации.

hg19:
  bwa: 'path/to/hg19/bwa/reference'
  samtools: 'path/to/hg19/samtools/reference'
  chrom_sizes: '...'

mm9:
  bwa: 'path/to/mm9/bwa/reference'
  samtools: 'path/to/mm9/samtools/reference'
  chrom_sizes: '...'

А вот и образец бланка.

name    path            reference
sample1 path/to/sample1 mm9

Итак, в строке reference=lambda wildcards: table_samples['reference'][wildcards.sample] я загружаю соответствующую ссылку, которая будет использоваться для текущего образца. Затем в chrom_sizes=config[reference]['chrom_sizes'] мне нужно использовать reference в качестве переменной, чтобы получить chrom_sizes для правильного эталонного генома.

Надеюсь, это проясняет ситуацию.


person fakechek    schedule 22.02.2018    source источник
comment
Значит, reference в config[reference]['chrom_sizes'] должна быть переменной или строкой? Похоже, это должна быть строка.   -  person Manavalan Gajapathy    schedule 22.02.2018
comment
Предполагается, что это переменная, потому что она зависит от образца. Я также добавил дополнительную информацию в исходную ветку, чтобы сделать ее более понятной.   -  person fakechek    schedule 23.02.2018


Ответы (3)


Это, вероятно, уродливое решение, но оно должно сработать.

params:
    reference = table_samples['reference']['{sample}']
    chrom_sizes = config[table_samples['reference']['{sample}']]['chrom_sizes']

Вы определяли переменную в params и пытались передать ее значение в самом параметре; Я не уверен, что Snakemake сможет это сделать.

person Manavalan Gajapathy    schedule 23.02.2018
comment
Думаю, я уже пробовал это, и это не сработало, но обязательно проверю еще раз. Спасибо! Кстати, '{sample}' и '{wildcards.sample}' работают точно так же, как я думаю? - person fakechek; 23.02.2018

Вы забыли заключить в кавычки клавишу reference. Как вы его пишете, Python интерпретирует его как переменную.

chrom_sizes=config['reference']['chrom_sizes']
person Johannes Köster    schedule 23.02.2018
comment
Извините, я не совсем прояснил это, так как слово reference используется слишком часто. На самом деле, в строке, которую вы разместили, reference должен быть переменной. Это очень важно, потому что ссылка зависит от образца и, следовательно, может отличаться при каждом выполнении правила. - person fakechek; 23.02.2018
comment
Я добавил дополнительную информацию в исходный пост. - person fakechek; 23.02.2018

Хорошо, взяв информацию из ваших комментариев, мне удалось заставить ее работать. Пришлось их немного доработать.

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

Как предложил @JeeYem, я попытался сделать следующее:

chrom_sizes = config[table_samples['reference']['{sample}']]['chrom_sizes']

Однако использование {sample} в этом контексте кажется невозможным. Вместо этого я изменил его так:

chrom_sizes = lambda wildcards: config[table_samples['reference'][wildcards.sample]]['chrom_sizes']

На данный момент это работает! Спасибо всем за вклад!

person fakechek    schedule 23.02.2018