#parameters #wildcard #snakemake
#параметры #подстановочный знак #snakemake
Вопрос:
Я только что попал в snakemake, и я застрял с этим на некоторое время: у меня есть это правило, в котором я хотел бы использовать элементы списка (сохраненные из файла) в качестве параметров. Это самое близкое, что я получил, но это не работает.
#configfile: 'config.yaml'
proteins = list(x.strip().split()[1] for x in open(config['protein_ids']))
rule links:
params:
prot = lambda wildcards: proteins[wildcards.protein]
shell:
'esearch -db protein -query {params.prot} | elink -db assembly -target nuccore | efetch -format docsum | xtract -pattern DocumentSummary -element Caption,Title >> genomes.txt'
Ошибка:
AttributeError: 'Wildcards' object has no attribute 'protein'
Wildcards:
Любой намек был бы очень признателен!
Лучше всего,
D.
Ответ №1:
Добро пожаловать в Snakemake.
По крайней мере, часть вашей проблемы не определяет вывод. Может быть, что-то вроде этого сработало бы:
# configfile: 'config.yaml'
proteins = list(x.strip().split()[1] for x in open(config['protein_ids']))
rule links:
output: '{protein}_genomes.txt'
params:
prot = lambda wildcards: proteins[wildcards.protein]
shell:
'esearch -db protein -query {params.prot} | '
'elink -db assembly -target nuccore | '
'efetch -format docsum | '
'xtract -pattern DocumentSummary -element Caption,Title '
'> {output}'
Это выдаст ошибку, proteins
потому что это список, и кажется, что вы используете его как dict.
Как правило, добавление к файлам с помощью snakemake не является хорошей идеей, потому что snakemake работает с файлами и временем изменения. Невозможно узнать, нужно ли перестраивать файл при добавлении к нему. Лучше добавить другое правило для объединения всех файлов.
Наконец, для длинных команд мне нравится разбивать директиву оболочки на несколько строк, чтобы ее было легче читать и изменять. Содержимое оболочки обрабатывается так, как будто оно находится в блоке, и объединяется вместе.
Комментарии:
1. Спасибо за все советы! Я также попытался изменить строку параметров, чтобы теперь я использовал список:
prot = lambda wildcards: proteins
но тогда команда попытается выполнить весь список сразу (Command 'esearch -db protein -query WP_136129796.1 WP_136130620.1 WP_159990234.1 WP_136132112.1 WP_136131313.1 WP_095034915.1 WP_006708696.1 PAV05377.1 WP_015873789.1 WP_100096494.1 | elink -db assembly -target nuccore | efetch -format docsum | xtract -pattern DocumentSummary -element Caption,Title > genomes.txt' returned non-zero exit status 255
) есть идеи?2. Я также безуспешно пытался использовать
prot = expand('{protein}', protein=proteins)
. Он также пытается использовать весь список сразу.3. Вы просто хотите запросить белок?
prot = lambda wildcards: wildcards.protein
? В противном случае отредактируйте свой вопрос, чтобы уточнить свои намерения.