Snakemake Использование расширения со словарем - PullRequest
0 голосов
/ 14 ноября 2018

Я пишу это правило:

rule process_files:
    input: 
        dataout=expand("{{dataset}}/{{sample}}.{{ref}}.{{state}}.{{case}}.myresult.{name}.tsv", name=my_list[wildcards.ref]) 
    output:
        "{dataset}/{sample}.{ref}.{state}.{case}.endresult.tsv"
    shell:
        do something ...

Были expand получит значение из словаря my_dictionary на основе значения ref.Я использовал wildcards, как это my_dictionary[wildcards.ref].Но это заканчивается этой ошибкой name 'wildcards' is not defined

my_dictionary что-то вроде: {A:[1,2,3], B:[s1,s2..].....}

Я мог бы использовать

def myfun(wildcards):
    return expand("{{dataset}}/{{sample}}.{{ref}}.{{state}}.{{case}}.myresult.{name}.tsv", name=my_dictionary[wildcards.ref])

и использовать myfun в качестве ввода, но это не отвечает, почему я не могу использовать расширение на месте напрямую

Любое предложение, как это исправить?

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Как упомянул @dariober, есть объекты wildcards, но они доступны только в части run / shell, но доступ к ним можно получить с помощью функции ввода в input.

Вот пример реализации, которая расширит ввод на основе wildcards.ref:

rule all:
    input: expand("{dataset}/{sample}.{ref}.{state}.{case}.endresult.tsv", dataset=["D1", "D2"], sample=["S1", "S2"], ref=["R1", "R2"], state=["STATE1", "STATE2"], case=["C1", "C2"])


my_list = {"R1": [1, 2, 3], "R2": ["s1", "s2"]}

rule process_files:
    input:
        lambda wildcards: expand(
            "{{dataset}}/{{sample}}.{{ref}}.{{state}}.{{case}}.myresult.{name}.tsv", name=my_list[wildcards.ref])
    output:
        "{dataset}/{sample}.{ref}.{state}.{case}.endresult.tsv"
    shell:
        "echo '{input}' > {output}"

Если вы реализуете его как пример функции lambda выше, это должно решить проблему, о которой вы упомянули:

Функция работала, но не смогла разрешить переменную между двойными фигурными скобками, поэтому запросит ввод для {dataset} / {sample}. {Ref}. {State}. {Case} и выдаст ошибку.

0 голосов
/ 14 ноября 2018

Ваш вопрос похож на подстановочные знаки snakemake или команду расширения , и нижняя строка в том, что wildcards не определено во входных данных. Таким образом, ваше решение использовать функцию ввода (или лямбда-функцию) кажется правильным.

(Что касается , почему wildcards не определено во вводе, я не знаю ...)

...