Проблемы с динамическим вводом и правилом динамического вывода - PullRequest
0 голосов
/ 05 ноября 2018

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

Вот правила, которые доставляют мне неприятности:

rule all:
input: dynamic("carvemeOut/{species}.xml")
shell:"snakemake --dag | dot -Tpng > pipemap.png"

rule speciesProt:
input:"evaluation-output/clustering_gt1000_scg.tab"
output: dynamic("carvemeOut/{species}.txt")
shell:
    """
    cd {config[paths][concoct_run]}
    mkdir -p {config[speciesProt_params][dir]}
    cp {input} {config[paths][concoct_run]}/{config[speciesProt_params][dir]}
    cd {config[speciesProt_params][dir]}
    sed -i '1d' {config[speciesProt_params][infile]} #removes first row
    awk '{{print $2}}' {config[speciesProt_params][infile]} > allspecies.txt #extracts node information
    sed '/^>/ s/ .*//' {config[speciesProt_params][metaFASTA]} > {config[speciesProt_params][metaFASTAcleanID]} #removes annotation to protein ID
    Rscript {config[speciesProt_params][scriptdir]}multiFASTA2speciesFASTA.R
    sed -i 's/"//g' species*
    sed -i '/k99/s/^/>/' species*
    sed -i 's/{config[speciesProt_params][tab]}/{config[speciesProt_params][newline]}/' species*
    cd {config[paths][concoct_run]}
    mkdir -p {config[carveme_params][dir]}
    cp {config[paths][concoct_run]}/{config[speciesProt_params][dir]}/species* {config[carveme_params][dir]}
    cd {config[carveme_params][dir]}
    find . -name "species*" -size -{config[carveme_params][cutoff]} -delete #delete files with little information, these cause trouble
    """

rule carveme:
input: dynamic("carvemeOut/{species}.txt")
output: dynamic("carvemeOut/{species}.xml")
shell:
    """
    set +u;source activate concoct_env;set -u
    cd {config[carveme_params][dir]}
    echo {input}
    echo {output}
    carve $(basename {input})
    """

Ранее я использовал две разные карты виджета для ввода и вывода правила carveme:

input: dynamic("carvemeOut/{species}.txt")
output: dynamic("carvemeOut/{gem}.xml")

Я хочу, чтобы snakemake запускал правило carveme несколько раз, чтобы создать выходной файл .xml для каждого входного файла .txt. Однако вместо этого snakemake запускает правило один раз, используя список входов для создания одного вывода, как показано ниже:

rule carveme:
input: carvemeOut/species2.txt, carvemeOut/species5.txt, carvemeOut/species1.txt, carvemeOut/species10.txt, carvemeOut/species4.txt, carvemeOut/species17.txt, carvemeOut/species13.txt, carvemeOut/species8.txt, carvemeOut/species14.txt
output: {*}.xml (dynamic)
jobid: 28

После изменения моих правил для использования того же подстановочного знака, как предложено @stovfl и показано в первом поле кода, я получаю следующее сообщение об ошибке:

$ snakemake all
Building DAG of jobs...
WildcardError in line 174 of /c3se/NOBACKUP/groups/c3-c3se605-17-8/projects_francisco/binning/snakemake-concot/Snakefile:
Wildcards in input files cannot be determined from output files:
species

Есть предложения о том, как решить эту проблему?

Заранее спасибо, ФЗ

1 Ответ

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

Вы хотите, чтобы в вашем правиле были все динамические и правило, в котором динамический вывод создавался, но не был в вашем последнем выводе.

Вот рабочий пример. В качестве примера приведен входной файл вида species_example.txt:

SpeciesA
SpeciesB
SpeciesC
SpeciesD

Следующий Snakefile будет динамически создавать 4 выходных файла

#Snakefile
rule all:
input: 
    dynamic("carvemeOut/{species}.xml"),

rule speciesProt:
    input: "species_example.txt"
    output: dynamic("carvemeOut/{species}.txt")
shell:  
    """
    awk '{{gsub(/\\r/,"",$1);print  > "carvemeOut/"$1".txt";}}' {input}
    """


rule carveme:
    input: "carvemeOut/{species}.txt"
    output: "carvemeOut/{species}.xml"
    shell: "cat {input} > {output}"

Dynamic имеет множество ограничений в настоящее время в Snakemake ( разрешен только один динамический подстановочный знак см. Комментарий Франциско ниже, нет смешения нединамических и динамических выходов в одном и том же правиле), поэтому я избегаю его, если это возможно. Например, вместо того, чтобы сделать этот пример динамическим, я бы использовал функцию pyhton, чтобы создать список возможных названий видов перед выполнением какого-либо правила, и использовал бы его для расширения подстановочных знаков в правиле all. Вы уверены, что вам нужен динамический вывод?

Кроме того, вам следует избегать записи таких длинных частей оболочки непосредственно в Snakefile и использовать либо внешние сценарии, либо разбивать эту команду оболочки на несколько правил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...