Shell 是否可以使用不同的路径/通配符定义snakemake输入规则

Shell 是否可以使用不同的路径/通配符定义snakemake输入规则,shell,bioinformatics,snakemake,qsub,Shell,Bioinformatics,Snakemake,Qsub,我想知道是否可以定义一个依赖于不同通配符的输入规则 为了详细说明,我使用qsub在不同的fastq文件上运行这个Snakemake管道,qsub将每个作业提交到不同的节点: 原始fastq上的fastqc-对其他作业没有下游依赖性 适配器/质量修剪以生成修剪过的fastq 经过修剪的fastq(步骤2的输出)上的fastqc_,且无下游依赖关系 修剪后的fastq上的star rsem管道(以上步骤2的输出) rsem和tximport(步骤4的输出) 运行多重质量控制 MultiQC--在结果

我想知道是否可以定义一个依赖于不同通配符的输入规则

为了详细说明,我使用qsub在不同的fastq文件上运行这个Snakemake管道,qsub将每个作业提交到不同的节点:

  • 原始fastq上的fastqc-对其他作业没有下游依赖性
  • 适配器/质量修剪以生成修剪过的fastq
  • 经过修剪的fastq(步骤2的输出)上的fastqc_,且无下游依赖关系
  • 修剪后的fastq上的star rsem管道(以上步骤2的输出)
  • rsem和tximport(步骤4的输出)
  • 运行多重质量控制
  • MultiQC--在结果文件夹上运行,该文件夹包含来自fastqc、star、rsem等的结果。但是,由于每个作业在不同的节点上运行,有时步骤3(fastqc和/或fastqc_后)仍在节点上运行,而其他步骤完成运行(步骤2、4和5),反之亦然

    目前,我可以创建一个MultiQc规则,它等待步骤2、4、5的结果,因为它们通过输入/输出规则相互链接

    我已将我的管道作为png附加到此帖子。任何建议都会有帮助

    我需要的是:我想创建一个“排序”步骤,让MultiQC等待所有步骤(从1到5)完成。换言之,以我随附的png为指南,我想为MultiQC定义多个输入规则,这些规则也会等待来自fastqc的结果

    提前谢谢

    注意:根据我在原始帖子后从“”和“”收到的评论,我在此处共享了不同规则的代码

    步骤1-快速质量控制

    rule fastqc:
        input:  "raw_fastq/{sample}.fastq"
        output: "results/fastqc/{sample}_fastqc.zip"
        log: "results/logs/fq_before/{sample}.fastqc.log"
        params: ...
        shell: ...
    
    步骤2-bbduk

    rule bbduk:
        input: R1 = "raw_fastq/{sample}.fastq"
        output: R1 = "results/bbduk/{sample}_trimmed.fastq",
        params: ...
        log: "results/logs/bbduk/{sample}.bbduk.log"
        priority:95
        shell: ....
    
    第3步-快速质量控制

    rule fastqc_after:
        input:  "results/bbduk/{sample}_trimmed.fastq"
        output: "results/bbduk/{sample}_trimmed_fastqc.zip"
        log: "results/logs/fq_after/{sample}_trimmed.fastqc.log"
        priority: 70
        params: ...
        shell: ...
    
    步骤4-星形对齐

    rule star_align:
        input: R1 = "results/bbduk/{sample}_trimmed.fastq"
        output:
            out_1 = "results/bam/{sample}_Aligned.toTranscriptome.out.bam",
            out_2 = "results/bam/{sample}_ReadsPerGene.out.tab"
        params: ...
        log: "results/logs/star/{sample}.star.log"
        priority:90
        shell: ...
    
    步骤5-rsem_标准

    rule rsem_norm:
        input:
            bam = "results/bam/{sample}_Aligned.toTranscriptome.out.bam"
        output:
            genes = "results/quant/{sample}.genes.results"
        params: ...
        threads = 16
        priority:85
        shell: ...
    
    步骤6-rsem_模型

    rule rsem_model:
        input: "results/quant/{sample}.genes.results"
        output: "results/quant/{sample}_diagnostic.pdf"
        params: ...      
        shell: ...
    
    步骤7-tximport_rsem

    rule tximport_rsem:
            input: expand("results/quant/{sample}_diagnostic.pdf",sample=samples)
            output: "results/rsem_tximport/RSEM_GeneLevel_Summarization.csv"
            shell: ...
    
    步骤8-多重质量控制

    rule multiqc:
        input: expand("results/quant/{sample}.genes.results",sample=samples)
        output: "results/multiqc/project_QS_STAR_RSEM_trial.html"
        log: "results/log/multiqc"
        shell: ...
    

    如果希望规则
    multiqc
    仅在
    fastqc
    完成后发生,可以将
    fastqc
    的输出添加到
    multiqc
    的输入中:

    rule multiqc:
        input:
            expand("results/quant/{sample}.genes.results",sample=samples),
            expand("results/fastqc/{sample}_fastqc.zip", sample=samples)
        output: "results/multiqc/project_QS_STAR_RSEM_trial.html"
        log: "results/log/multiqc"
        shell: ...
    
    或者,如果您需要能够在
    shell
    部分中参考
    rsem\u norm
    的输出:

    rule multiqc:
        input:
            rsem_out = expand("results/quant/{sample}.genes.results",sample=samples),
            fastqc_out = expand("results/fastqc/{sample}_fastqc.zip", sample=samples)
        output: "results/multiqc/project_QS_STAR_RSEM_trial.html"
        log: "results/log/multiqc"
        shell: "... {input.rsem_out} ..."
    
    在您的一条评论中,您写道:

    MultiQC需要目录作为输入-我在shell命令中为它指定“results”目录


    如果我理解正确,这意味着
    results/quant/{sample}.genes.results
    是目录,而不是普通文件。如果是这种情况,您应该确保没有下游规则在这些目录中写入文件。否则,在输出
    multiqc
    后,目录将被视为已更新,并且每次运行管道时都会重新运行
    multiqc

    我不太理解您的问题。你说步骤1和步骤3没有下游依赖关系,但你不想让MultiQC在它们完成之前运行?这听起来像是一种依赖。如果这些规则创建MultiQC所需的输出,则应将这些输出文件指定为MultiQC规则的输入文件。如果没有,那么在执行MultiQC步骤之前,不应该有理由需要完成这些步骤。您可能至少应该显示当前的
    MultiQC
    规则的
    input
    部分和
    fastqc
    规则的
    output
    部分。@Colin dag/png列出了当前的依赖项。如果我需要进一步解释,请告诉我。现在,我告诉“rulemultiqc”等待“rsem_norm”的输出(它将数据输出到results/quant/{sample})。我希望multiqc还可以等待“fastqc”和“fastqc_after”的输出,这两个输出分别输出到“results/fastqc”和“results/bbduk”。这就是我需要帮助的地方——因此首先是最初的问题。正如您在这里看到的,重要的目录是“results”目录及其子文件夹-MultiQC将在这个顶级目录上工作。@bli我为我的问题添加了不同的规则。MultiQC需要目录作为输入-我在shell命令中为它指定“results”目录。所有步骤的日志文件都位于“结果”下的不同文件夹/子文件夹中,MultiQC能够深入所有步骤并提供报告。这里发生的事情是这样的:由于每个作业都由qsub提交到不同的节点,所以当前面的步骤(我编码的方式)完成时,MultiQC步骤完成运行。。这就引出了我最初的问题:我如何才能为MultiQC规则提供3个不同的文件夹路径作为输入谢谢@bli您的解决方案奏效了。我最初在“没有扩展”的情况下尝试了它,但它不起作用。最初我的
    multiqc
    输入为:
    'results/quant/{sample}.genes.results'
    'results/fastqc/{sample}\u fastqc.zip'
    ——然而,使用您建议的扩展方式帮助解决了问题
    results/quant/{sample}.genes.results
    是实际的文件-因此,如果我将samsake、sampleB、sampleC作为我的起始材料,我将得到results/quant/samsack.genes.results、results/quant/sampleB.genes.results、results/quant/sampleC.genes.results作为输出