«Нет значений для ошибки с подстановочными знаками» в змейке

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

Я думал, что сработает следующий код:

dwn_lnks = {
    '1': 'https://molb7621.github.io/workshop/_downloads/sample.fa',
    '2': 'https://molb7621.github.io/workshop/_downloads/sample.fa'       
    }
import os

# association between chromosomes and their links
def chromo2link(wildcards):
    return dwn_lnks[wildcards.chromo]

rule all:
    input:
        os.path.join('genome_dir', 'human_en37_sm.fa')

rule download:
    output:
        expand(os.path.join('chr_dir', '{chromo}')),
    params:
        link=chromo2link,
    shell:
        "wget {params.link} -O {output}"


rule merger:
    input:
        expand(os.path.join('chr_dir', "{chromo}"), chromo=dwn_lnks.keys())
    output:
        os.path.join('genome_dir', 'human_en37_sm.fa')
    run:
        txt = open({output}, 'a+')
        with open (os.path.join('chr_dir', "{chromo}") as file:
                    line = file.readline()
                    while line:
                        txt.write(line)
                        line = file.readline()
        txt.close()

Этот код возвращает ошибку: No values given for wildcard 'chromo'. in line 20

Также в правиле слияния код python внутри прогона не работает.

Учебник в пакете dragonmake не содержит достаточного количества примеров, чтобы изучить детали для тех, кто не занимается информатикой. Если кто-нибудь знает хороший ресурс, чтобы узнать, как работать со змейкой, я был бы признателен, если бы они могли поделиться :).


person user3015703    schedule 22.06.2017    source источник
comment
link=chromo2link это ошибка, я думаю. chromo2linkявляется функцией и ожидает подстановочный знак в качестве параметра   -  person BoilingFire    schedule 22.06.2017
comment
Нет, это нормально. Передача имен функций — это способ выполнения кода, зависящего от значений подстановочных знаков в Snakemake. Snakemake вызовет эту функцию с объектом подстановочных знаков, и функция может вернуть то, что она ищет в словаре.   -  person Johannes Köster    schedule 23.06.2017
comment
Задавая вопросы здесь, вы вносите свой вклад в создание обучающего ресурса для змейки. Надеемся, что эти вопросы и ответы на stackoverflow помогут другим в будущем. Продолжайте спрашивать, можете ли вы, и если вы найдете ответы самостоятельно, вы также можете поделиться проблемой и решением здесь, в stackoverflow.   -  person bli    schedule 23.06.2017


Ответы (1)


Проблема в том, что у вас есть функция expand в выходных данных правила download, которая не определяет значение подстановочного знака {chromo}. Я думаю, что вы действительно хотите здесь

rule download:
output:
    'chr_dir/{chromo}',
params:
    link=chromo2link,
shell:
    "wget {params.link} -o {output}"

без expand. Функция expand нужна только для объединения по подстановочным знакам, как вы делаете это в правиле merger.

Также взгляните на официальное руководство Snakemake, в котором это подробно объясняется.

person Johannes Köster    schedule 23.06.2017