Как обеспечить зависимость правила snakemake при отправке через qsub - PullRequest
0 голосов
/ 03 июня 2019

Я использую Snakemake для отправки работ в кластер. Я сталкиваюсь с ситуацией, когда я хотел бы заставить определенное правило запускаться только после выполнения всех других правил - это потому, что входные файлы для этого задания (сценарий R) еще не готовы.

Я случайно увидел это на странице документации Snakemake, где говорится, что можно принудительно выполнить порядок выполнения правил - https://snakemake.readthedocs.io/en/stable/snakefiles/rules.html#flag-files

У меня разные правила, но для простоты я показываю свой Snakefile и последние 2 правила ниже (rsem_model и tximport_rsem). В моем рабочем процессе кластера qsub я хочу, чтобы tximport_rsem выполнялся только после того, как rsem_model завершил , и я попробовал метод "touchfile", но не смог заставить его работать успешно.

# Snakefile
rule all:
   input:
       expand("results/fastqc/{sample}_fastqc.zip",sample=samples),
       expand("results/bbduk/{sample}_trimmed.fastq",sample=samples),
       expand("results/bbduk/{sample}_trimmed_fastqc.zip",sample=samples),
       expand("results/bam/{sample}_Aligned.toTranscriptome.out.bam",sample=samples),
       expand("results/bam/{sample}_ReadsPerGene.out.tab",sample=samples),
       expand("results/quant/{sample}.genes.results",sample=samples),
       expand("results/quant/{sample}_diagnostic.pdf",sample=samples),
       expand("results/multiqc/project_QS_STAR_RSEM_trial.html"),
       expand("results/rsem_tximport/RSEM_GeneLevel_Summarization.csv"),
       expand("mytask.done")

rule clean:
     shell: "rm -rf .snakemake/"

include: 'rules/fastqc.smk'
include: 'rules/bbduk.smk'
include: 'rules/fastqc_after.smk'
include: 'rules/star_align.smk'
include: 'rules/rsem_norm.smk'
include: 'rules/rsem_model.smk'
include: 'rules/tximport_rsem.smk'
include: 'rules/multiqc.smk'
rule rsem_model:
    input:
        'results/quant/{sample}.genes.results'
    output:
        'results/quant/{sample}_diagnostic.pdf'
    params:
        plotmodel = config['rsem_plot_model'],
        prefix = 'results/quant/{sample}',
        touchfile = 'mytask.done'
    threads: 16
    priority: 60
    shell:"""
          touch {params.touchfile}
          {params.plotmodel} {params.prefix} {output}
        """
rule tximport_rsem:
    input: 'mytask.done'
    output:
        'results/rsem_tximport/RSEM_GeneLevel_Summarization.csv'
    priority: 50
    shell: "Rscript scripts/RSEM_tximport.R"

Вот ошибка, которую я получаю, когда пытаюсь выполнить пробный прогон

snakemake -np
Building DAG of jobs...
MissingInputException in line 1 of /home/yh6314/rsem/tutorials/QS_Snakemake/rules/tximport_rsem.smk:
Missing input files for rule tximport_rsem:
mytask.done

Одна важная вещь, на которую следует обратить внимание : если я попытаюсь запустить это на головном узле, мне не нужно делать «touch file», и все работает нормально.

Буду признателен за предложения и помогу найти обходной путь.

Заранее спасибо.

1 Ответ

1 голос
/ 03 июня 2019

Правило tximport_rsem будет выполнено только после того, как все задания из правила rsem_model будут выполнены (на основе комментариев). Следовательно, промежуточный файл mytask.done не нужен в этом сценарии. Использование выходных файлов правила rsem_model для всех образцов для правила tximport_rsem будет достаточно.

rule rsem_model:
    input:
        'results/quant/{sample}.genes.results'
    output:
        'results/quant/{sample}_diagnostic.pdf',
    shell:
        """
        {params.plotmodel} {params.prefix} {output.pdf}
        """

rule tximport_rsem:
    input: 
         expand('results/quant/{sample}_diagnostic.pdf', sample=sample_names)
    output:
        'results/rsem_tximport/RSEM_GeneLevel_Summarization.csv'
    shell: 
        "Rscript scripts/RSEM_tximport.R"
...