Подстановочные знаки в качестве параметров в snakemake?

#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 ? В противном случае отредактируйте свой вопрос, чтобы уточнить свои намерения.