«Только входные файлы могут быть указаны как функции» в snakemake - PullRequest
0 голосов
/ 17 марта 2020

Я новичок в змейке. Я пытаюсь применить это правило, но у меня возникли проблемы.

SOAPnuke принимает входной файл считывания и обратного чтения в качестве входных данных, фильтрует файлы чтения и вывода «Clean_DP8400007518BR_L01_557_1.fq.gz» и «Clean_DP8400007518BR_L01_557_2.fq.gz». .

SOAPnuke -1 DP8400007518BR_L01_557_1.fq.gz -2 DP8400007518BR_L01_557_1.fq.gz

Snakemake жалуется, что «в качестве функций можно указывать только входные файлы» в строке оболочки.

Есть предложения, чтобы это исправить? Спасибо.

"config.yaml" похож на это.

outdir: ./test
SOAPnuke: /path/to/SOAPnuke
filter:
    l: 10
    rate: 0.1
    m: 20
    n: 0.001
    Q: 2
    f: AAGTCGGAGGCCAAGCGGTCTTAGGAAGACAA
    r: AAGTCGGATCGTAGCCATGTCGTTCTGTGAGCCAAGGAGTTG
samples:
/path/to/A: sample_A
/path/to/B: sample_A
/path/to/C: sample_B

Под путями есть несколько файлов fq.gz, принадлежащих соответствующему образцу. Дерево каталогов выглядит следующим образом.

|-- A
|   |-- DP8400007518BR_L01_557_1.fq.gz
|   |-- DP8400007518BR_L01_557_2.fq.gz
|   |-- DP8400007518BR_L01_558_1.fq.gz
|   |-- DP8400007518BR_L01_558_2.fq.gz
|   |-- DP8400007518BR_L01_559_1.fq.gz
|   |-- DP8400007518BR_L01_559_2.fq.gz
|   |-- DP8400007518BR_L01_560_1.fq.gz
|   `-- DP8400007518BR_L01_560_2.fq.gz
|-- A
|   |-- DP8400007587BR_L01_559_1.fq.gz
|   |-- DP8400007587BR_L01_559_2.fq.gz
|   |-- DP8400007587BR_L01_560_1.fq.gz
|   `-- DP8400007587BR_L01_560_2.fq.gz
`-- B
    |-- DP8400008089TR_L01_543_1.fq.gz
    |-- DP8400008089TR_L01_543_2.fq.gz
    |-- DP8400008089TR_L01_544_1.fq.gz
    `-- DP8400008089TR_L01_544_2.fq.gz

Это мой snakefile

configfile: "config.yaml"

import os

outdir = os.path.abspath(config["outdir"])

def get_name(path):
    samples, = glob_wildcards(path+"/{id}_1.fq.gz")

rule filter:
    input:
        p1 = lambda wildcards: expand("{path}/{id}_1.fq.gz", path=config["samples"].keys(), id=get_name(path)),
        p2 = lambda wildcards: expand("{path}/{id}_2.fq.gz", path=config["samples"].keys(), id=get_name(path))

    output:
        f"{outdir}/{config['samples']}{{path}}/filter/Clean_{{id}}_1.fq.gz",
        f"{outdir}/{config['samples']}{{path}}/filter/Clean_{{id}}_2.fq.gz"

    params:
        SOAPnuke = config["SOAPnuke"],
        l = config["filter"]["l"],
        rate = config["filter"]["rate"],
        m = config["filter"]["m"],
        n = config["filter"]["n"],
        Q = config["filter"]["Q"],
        f = config["filter"]["f"],
        r = config["filter"]["r"]

    shell:
        """
        {params.SOAPnuke} filter -1 {input.p1} -2 {input.p2} -l {params.l} -q {params.q} -m {params.m} -n {params.n} -G -Q {params.Q} 
        -f {params.f} -r {params.r} -o f"{outdir}/{config['samples']}{{wildcards.path}}/filter/"
        """            

Ожидаемый результат:

|-- A
|   `-- filter
|       |-- Clean_DP8400007518BR_L01_557_1.fq.gz
|       |-- Clean_DP8400007518BR_L01_557_2.fq.gz
|       |-- Clean_DP8400007518BR_L01_558_1.fq.gz
|       |-- Clean_DP8400007518BR_L01_558_2.fq.gz
|       |-- Clean_DP8400007518BR_L01_559_1.fq.gz
|       |-- Clean_DP8400007518BR_L01_559_2.fq.gz
|       |-- Clean_DP8400007518BR_L01_560_1.fq.gz
|       |-- Clean_DP8400007518BR_L01_560_2.fq.gz
|       |-- Clean_DP8400007587BR_L01_559_1.fq.gz
|       |-- Clean_DP8400007587BR_L01_559_2.fq.gz
|       |-- Clean_DP8400007587BR_L01_560_1.fq.gz
|       `-- Clean_DP8400007587BR_L01_560_2.fq.gz
`-- B
    `-- filter
        |-- Clean_DP8400008089TR_L01_543_1.fq.gz
        |-- Clean_DP8400008089TR_L01_543_2.fq.gz
        |-- Clean_DP8400008089TR_L01_544_1.fq.gz
        `-- Clean_DP8400008089TR_L01_544_2.fq.gz

1 Ответ

1 голос
/ 17 марта 2020

То, что вы хотите, выглядит примерно так:

rule filter:
    input:
        p1 = lambda wildcards: expand("{path}/{id}_1.fq.gz", path=config["samples"].keys(), id=get_name(wildcards.path)),
        p2 = lambda wildcards: expand("{path}/{id}_2.fq.gz", path=config["samples"].keys(), id=get_name(wildcards.path))
    output:
        f"{outdir}/{config['samples']}{{path}}/filter/Clean_{{id}}_1.fq.gz",
        f"{outdir}/{config['samples']}{{path}}/filter/Clean_{{id}}_2.fq.gz"
...