【问题标题】:Snakemake rule for analysis where a single result file is produced for diff parameters, and parameter is coming from another rule output content用于分析的 Snakemake 规则,其中为不同的参数生成单个结果文件,并且参数来自另一个规则输出内容
【发布时间】:2021-04-16 08:26:11
【问题描述】:

我有以下基本的 snakemake 设置:

rule step1:
    """
    The output will contain a list of GENEs in a txt file.
    """

    input: "input1.txt"

    output: "output1.txt"

    shell:
        """
        analysis1.R {input} {output}
        """

rule step2:
    """
    Analysis step2.
    """

    input: "input2.txt"

    output: "output2.txt"

    shell:
        """
        analysis2.py {input} {output}
        """

rule step3:
    """
    GENE should be coming from the step1 output file, with a GENE name on each
    line.
    """

    input: rules.step2.output

    output: "output3-GENE.txt"

    shell:
        """
        analysis3.py -i {input} -o {output} -p GENE
        """

我在步骤 1 中为步骤 3 生成一个包含基因(参数)列表的文件,在步骤 2 中生成另一个文件。我想做的是将 step3 运行的次数与我在 output1.txt 中的行一样多,其中行的内容是 step3 的参数,它也应该是输出文件名的一部分,但我不能换行我的头绕着它。有任何想法吗?感谢您的帮助!

【问题讨论】:

    标签: python snakemake


    【解决方案1】:

    您可以使用checkpoints

    如果您知道step3 文件应生成的文件列表,您可以定义aggregate 规则:

    rule aggregate:
        input:
            # List of files that step3 needs to generate
    

    这将允许您根据需要多次运行rule step3

    棘手的部分是定义这些文件的列表。那应该是rule step1的结果的功能:

    def aggregate_input(wildcards):
        with checkpoints.rile1.get().output[0].open() as f:
            return f.readlines()
    
    rule aggregate:
        input:
            aggregate_input
    

    在这种情况下,rule step1 应成为检查点:

    checkpoint step1:
        """
        The output will contain a list of GENEs in a txt file.
        """
    
        input: "input1.txt"
    
        output: "output1.txt"
    
        shell:
            """
            analysis1.R {input} {output}
            """
    

    在我的示例中,我将函数 aggregate_input 简化为仅返回 step1 的输出行。如果您需要更复杂的功能,您可以自己设计一个。

    【讨论】:

    • 是的,一个检查点和一个函数做到了。尽管我在规则 1 的末尾添加了 split -l 语句,因此每个基因名称都有自己的文件,并且该函数列出/修改了所有这些文件以用于聚合规则输入。
    猜你喜欢
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多