Как правильно использовать пакетный флаг в snakemake для подмножества DAG - PullRequest
2 голосов
/ 07 ноября 2019

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

При таком количестве входных файлов генерация DAG очень медленная для последующих правил, вплоть до невозможности их использования. Раньше я решал эту проблему, перебирая циклы bash по заданным файлам конфигурации, где закомментированы все символы, кроме одного. Например, в моем случае у меня был один шаблон (праймер), который имел 12 возможных значений. Итеративно выполняя snakemake для каждого значения «учебника для начинающих», он разделял рабочий процесс на удобоваримые куски (~ 5000 входных файлов). С этой стратегией создание DAG происходит быстро, и рабочий процесс идет хорошо.

Теперь я заинтересован в использовании нового флага --batch, доступного в snakemake 5.7.4, так как Йоханнес предложил мне в твиттере, что он должен в основном делатьТо же самое я сделал с циклами bash и подконфигурированными файлами конфигурации.

Однако я сталкиваюсь с ошибкой, которая меня смущает. Я не знаю, является ли это проблемой, которую я должен публиковать на трекере проблем github, или я просто упускаю что-то базовое.

Правило, по которому мой рабочий процесс терпит неудачу, таково:

rule get_fastq_for_subset:
    input:
        fasta="compute-workflow-intermediate/06-subsetted/{sample}.SSU.{direction}.{group}_pyNAST_{primer}.fasta",
        fastq="compute-workflow-intermediate/04-sorted/{sample}.{direction}.SSU.{group}.fastq"
    output:
        fastq=temp("compute-workflow-intermediate/07-subsetted-fastq/{sample}.SSU.{direction}.{group}_pyNAST_{primer}.full.fastq"),
        fastq_revcomp="compute-workflow-intermediate/07-subsetted-fastq/{sample}.SSU.{direction}.{group}_pyNAST_{primer}.full.revcomped.fastq"
    conda:
        "envs/bbmap.yaml"
    shell:
        "filterbyname.sh names={input.fasta} include=t in={input.fastq} out={output.fastq} ; "
        "revcompfastq_according_to_pyNAST.py --inpynast {input.fasta} --infastq {output.fastq} --outfastq {output.fastq_revcomp}"

Я установил цель в своем правиле all, чтобы сгенерировать вывод, указанный в правиле, затем попытался запустить snakemake с флагом пакета следующим образом:

snakemake --configfile config/config.yaml --batch get_fastq_for_subset=1/20 --snakefile Snakefile-compute.smk --cores 40 --use-conda 

Затем произойдет сбой с этим сообщением:

WorkflowError:
Batching rule get_fastq_for_subset has less input files than batches. Please choose a smaller number of batches.

Теперь меня смущает то, что мои входные данные для этого правила должны быть порядка 60000 файлов. Тем не менее, кажется, что змея делает менее 20 входных файлов. Возможно, это только счет 2, как в количестве входных файлов, которые указаны в правиле? Но это на самом деле не имеет смысла для меня ...

Исходный код для snakemake здесь, показывая, как snakemake считает вещи, но это немного за мной:

https://snakemake.readthedocs.io/en/stable/_modules/snakemake/dag.html

Если кто-нибудь знает, что происходит, я буду очень признателен за вашу помощь!

Лучше, Джесси

...