侧边栏壁纸
  • 累计撰写 218 篇文章
  • 累计创建 59 个标签
  • 累计收到 5 条评论
HPC

Snakemake 笔记 - 聚合 & expand 函数

barwe
2023-05-29 / 0 评论 / 1 点赞 / 1,454 阅读 / 1,478 字
温馨提示:
本文最后更新于 2023-06-07,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Aggregation

列表推导式

input 字段可以是逐一声明的文件列表:

input:
    "fq/{sample}.{index}-1.fq",
    "fq/{sample}.{index}-2.fq",

也可以是一个列表推导式:

input:
    [f'fq/{{sample}}.{{index}}-{k}.fq' for k in [1,2]]

有几点需要注意的:

  • f'' 语法仍然是有效的,当然 ''.format() 也可以。%s 形式的不支持
  • {{...}} 表示通配符

expand 函数

对于多层的循环生成列表,Snakemake 提供了 expand 函数。例如上面的例子用 expand 表示为:

input:
    expand('fq/{{sample}}.{{index}}-{k}.fq', k=[1,2])

与列表推导式类似,{} 表示格式占位符,{{}} 表示通配符。

与 Python 字符串格式化类似,{} 填充的数据可以是任意的 Python 基础数据类型。

多规则

expand 函数的第一个 位置参数 可以是单个规则,也可以是规则列表。

当指定规则列表时,expand 默认将分别处理每一个规则,然后使用 reduce 方法合并所有规则分别生成的文件列表。

expand(["{ds}-1.{ext}", "{ds}-2.{ext}"], ds=["a","b"], ext=["csv", "txt"])

上面的例子指定了两个规则,先处理第一个规则:

a-1.csv a-1.txt b-1.csv b-1.txt

再处理第二个规则:

a-2.csv a-2.txt b-2.csv b-2.txt

然后合并:

a-1.csv a-1.txt b-1.csv b-1.txt a-2.csv a-2.txt b-2.csv b-2.txt

将第二个 位置参数 设为 "zip" 可以在每次循环时同时处理所有规则,其行为与 Python 的 zip 函数类似。

expand(["{ds}-1.{ext}", "{ds}-2.{ext}"], zip, ds=["a","b"], ext=["csv", "txt"])

上面的例子,expand 将在每一次循环时生成两个路径:

  • 取出 "a"
    • 取出 "csv" 生成 ["a-1.csv", "a-2.csv"]
    • 取出 "txt" 生成 ["a-1.txt", "a-2.txt"]
  • 取出 "b"
    • 取出 "csv" 生成 ["b-1.csv", "b-2.csv"]
    • 取出 "txt" 生成 ["b-1.txt", "b-2.txt"]

最后合并:

a-1.csv a-2.csv a-1.txt a-2.txt b-1.csv b-2.csv b-1.txt b-2.txt

multiext 函数

如果只是需要通过 文件扩展名 匹配多种类型的文件,可以使用 multiext 函数:

multiext('a', '.csv', '.txt')

上述例子将生成:

a.csv a.txt

References

1

评论区