Можно ли снова определить правило все в змейке? - PullRequest
1 голос
/ 26 сентября 2019

Я запускаю параллельную обработку 8 файлов (fastq) с помощью snakemake.Затем каждый из этих файлов демультиплексируется, и я запускаю параллельную обработку демультиплексированных файлов, сгенерированных каждым из этих файлов, снова с помощью snakemake.

Моя первая попытка (которая работает хорошо) состояла в том, чтобы использовать 2 файла змеи.

  • snake-файл для параллельной обработки 8 файлов
  • snake-файл для параллельной обработки сгенерированных демультиплексированных файлов

Я хотел бы использовать только один snakefile.

Здесь решение с 2 змеиными файлами:

snakefile # 1 для параллельной обработки 8 файлов (подстановочный знак {run})

configfile: "config.yaml"

rule all:
    input:
        expand("{folder}{run}_R1.fastq.gz", run=config["fastqFiles"],folder=config["fastqFolderPath"]),
        expand('assembled/{run}/{run}.fastq', run=config["fastqFiles"]),
        expand('assembled/{run}/{run}.ali.fastq', run=config["fastqFiles"]),
        expand('assembled/{run}/{run}.ali.assigned.fastq', run=config["fastqFiles"]),
        expand('assembled/{run}/{run}.unidentified.fastq', run=config["fastqFiles"]),
        expand('log/remove_unaligned/{run}.log',run=config["fastqFiles"]),
        expand('log/illuminapairedend/{run}.log',run=config["fastqFiles"]),
        expand('log/assign_sequences/{run}.log',run=config["fastqFiles"]),
        expand('log/split_sequences/{run}.log',run=config["fastqFiles"])

include: "00-rules/assembly.smk"
include: "00-rules/demultiplex.smk"

snakefile # 2 для обработки сгенерированных демультиплексированныхпараллельные файлы

SAMPLES, = glob_wildcards('samples/{sample}.fasta')

rule all:
    input:
        expand('samples/{sample}.uniq.fasta',sample=SAMPLES),
        expand('samples/{sample}.l.u.fasta',sample=SAMPLES),
        expand('samples/{sample}.r.l.u.fasta',sample=SAMPLES),
        expand('samples/{sample}.c.r.l.u.fasta',sample=SAMPLES),
        expand('log/dereplicate_samples/{sample}.log',sample=SAMPLES),
        expand('log/goodlength_samples/{sample}.log',sample=SAMPLES),
        expand('log/clean_pcrerr/{sample}.log',sample=SAMPLES),
        expand('log/rm_internal_samples/{sample}.log',sample=SAMPLES)

include: "00-rules/filtering.smk"

Это решение работает хорошо.

Возможно ли объединить эти два файла змей в один?

configfile: "config.yaml"

rule all:
    input:
        expand("{folder}{run}_R1.fastq.gz", run=config["fastqFiles"],folder=config["fastqFolderPath"]),
        expand('assembled/{run}/{run}.fastq', run=config["fastqFiles"]),
        expand('assembled/{run}/{run}.ali.fastq', run=config["fastqFiles"]),
        expand('assembled/{run}/{run}.ali.assigned.fastq', run=config["fastqFiles"]),
        expand('assembled/{run}/{run}.unidentified.fastq', run=config["fastqFiles"]),
        expand('log/remove_unaligned/{run}.log',run=config["fastqFiles"]),
        expand('log/illuminapairedend/{run}.log',run=config["fastqFiles"]),
        expand('log/assign_sequences/{run}.log',run=config["fastqFiles"]),
        expand('log/split_sequences/{run}.log',run=config["fastqFiles"])

include: "00-rules/assembly.smk"
include: "00-rules/demultiplex.smk"

SAMPLES, = glob_wildcards('samples/{sample}.fasta')

rule all:
    input:
        expand('samples/{sample}.uniq.fasta',sample=SAMPLES),
        expand('samples/{sample}.l.u.fasta',sample=SAMPLES),
        expand('samples/{sample}.r.l.u.fasta',sample=SAMPLES),
        expand('samples/{sample}.c.r.l.u.fasta',sample=SAMPLES),
        expand('log/dereplicate_samples/{sample}.log',sample=SAMPLES),
        expand('log/goodlength_samples/{sample}.log',sample=SAMPLES),
        expand('log/clean_pcrerr/{sample}.log',sample=SAMPLES),
        expand('log/rm_internal_samples/{sample}.log',sample=SAMPLES)

include: "00-rules/filtering.smk"

Так что мне нужноопределить снова rule all.

и я получил следующее сообщение об ошибке:

The name all is already used by another rule

Это способ получить множество rule all или решение "использование множества файлов змей"единственное возможное?

Я бы хотел использовать змеиный мейк наиболее подходящим способом.

1 Ответ

2 голосов
/ 27 сентября 2019

Вы не ограничены в названии правила верхнего уровня.Вы можете назвать это all или переименовать: единственное, что имеет значение, это порядок их определения.По умолчанию Snakemake принимает первое правило в качестве целевого и затем строит график зависимостей.

Принимая это во внимание, у вас есть несколько вариантов.Во-первых, вы можете объединить оба правила верхнего уровня из рабочих процессов в одно.В конце дня ваши правила all ничего не делают, кроме определения целевых файлов.Затем вы можете переименовать ваши правила в all1 и all2 (позволяя запустить один рабочий процесс, если вы укажете это в командной строке), и предоставить правило all с объединенным вводом.Наконец, вы можете использовать подпроцессы, но если вы намерены объединить два сценария в один, это будет излишним.

Еще один совет, который может помочь: вам не нужно указывать шаблон expand('filename{sample}',sample=config["fastqFiles"]) для каждого файла, если вы определяете отдельный вывод для каждого прогона.Например:

rule sample:
    input:
        'samples/{sample}.uniq.fasta',
        'samples/{sample}.l.u.fasta',
        'samples/{sample}.r.l.u.fasta',
        'samples/{sample}.c.r.l.u.fasta',
        'log/dereplicate_samples/{sample}.log',
        'log/goodlength_samples/{sample}.log',
        'log/clean_pcrerr/{sample}.log',
        'log/rm_internal_samples/{sample}.log'
    output:
        temp('flag_sample_{sample}_complete')

В этом случае правило all становится тривиальным:

rule all:
    input: expand('flag_sample_{sample}_complete', sample=SAMPLES)

Или, как я советовал ранее:

rule all:
    input: expand('flag_run_{run}_complete', run=config["fastqFiles"]),
    input: expand('flag_sample_{sample}_complete', sample=SAMPLES)

rule all1:
    input: expand('flag_run_{run}_complete', run=config["fastqFiles"])

rule all2:
    input: expand('flag_sample_{sample}_complete', sample=SAMPLES)

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