You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Snakemake中能否为ruleorder指定函数?遇UnknownRuleException报错

解决Snakemake中ruleorder无法使用自定义函数的问题

首先明确:Snakemake的ruleorder是全局静态配置,不支持通过自定义函数动态生成优先级规则。你直接写ruleorder: determine_ruleorder会被Snakemake误认为是一个规则名称,所以才会抛出UnknownRuleException错误。

你的核心需求是根据样本的单端/双端类型,控制fasterq_dump_se和fasterq_dump_pe两个规则的触发逻辑,这里提供更合理的替代方案:

方案1:使用规则的condition参数(推荐)

通过给规则添加condition判断,让每个样本仅触发对应类型的规则,从根源上避免规则冲突,无需依赖ruleorder。

步骤1:定义辅助函数获取样本类型

import pandas as pd

def get_sample_layout(sra_id, config):
    # 读取样本配置文件
    samples_df = pd.read_table(config['sample_file'], sep='\t')
    # 提取当前样本的layout信息
    layout = samples_df.loc[samples_df['sample'] == sra_id, 'layout'].values[0]
    if layout not in ("single", "paired"):
        raise ValueError(f"SRA {sra_id} 存在未知布局类型: {layout}")
    return layout

步骤2:给规则添加条件判断

rule fasterq_dump_se:
    # 仅当样本为单端时触发该规则
    condition: lambda wildcards, config: get_sample_layout(wildcards.sra, config) == "single"
    input:
        # 你的输入定义
    output:
        # 你的单端输出文件定义
    shell:
        # 单端数据的fasterq_dump命令

rule fasterq_dump_pe:
    # 仅当样本为双端时触发该规则
    condition: lambda wildcards, config: get_sample_layout(wildcards.sra, config) == "paired"
    input:
        # 你的输入定义
    output:
        # 你的双端输出文件定义
    shell:
        # 双端数据的fasterq_dump命令

这样每个样本只会触发对应的规则,完全不需要设置ruleorder,逻辑更清晰。

方案2:动态生成规则(复杂场景备选)

如果你的场景必须保留两个规则的触发可能性,也可以通过动态生成规则的方式,为每个样本创建专属的规则,但这种方式会增加Snakefile的复杂度,仅推荐在特殊场景使用。

示例代码

import pandas as pd

samples_df = pd.read_table(config['sample_file'], sep='\t')

for _, row in samples_df.iterrows():
    sra_id = row['sample']
    layout = row['layout']
    
    if layout == "single":
        rule_name = f"fasterq_dump_{sra_id}"
        globals()[rule_name] = rule(
            name=rule_name,
            input=...,
            output=...,
            shell="你的单端处理命令"
        )
    elif layout == "paired":
        rule_name = f"fasterq_dump_{sra_id}"
        globals()[rule_name] = rule(
            name=rule_name,
            input=...,
            output=...,
            shell="你的双端处理命令"
        )

这种方式直接为每个样本生成独立规则,彻底避免规则冲突,但维护成本较高。


内容的提问来源于stack exchange,提问作者vini8cs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 21:24:54