如何收集与输入函数匹配通配符的Snakemake输入文件?

2024-01-20

我有一组使用 BWA-MEM 生成并使用 GATK IndelRealigner 等进一步处理的 BAM 文件。我正在以较小的块对 BAM 文件进行预处理,以加快处理速度。然而,我必须在变体调用之前将这些单独的文件合并到一个 BAM 文件中,这一直是我的 Snakemake 管道的一个主要问题。

我的输入文件遵循这种命名约定

# Sample 1 BAM files
OVCA-1-FRESH-1_S16_L001_realigned.bam
OVCA-1-FRESH-1_S16_L002_realigned.bam
OVCA-1-FRESH-1_S16_L003_realigned.bam
OVCA-1-FRESH-1_S16_L004_realigned.bam

# Sample 2 BAM files
OVCA-2-FRESH-1_S16_L001_realigned.bam
OVCA-2-FRESH-1_S16_L002_realigned.bam
OVCA-2-FRESH-1_S16_L003_realigned.bam
OVCA-2-FRESH-1_S16_L004_realigned.bam

有问题的管道是这样的:

# Map start input files
RUN_ID, LINE = glob_wildcards('{run_id}_L{line}_realigned.bam')

rule all:
   input:
      expand('{run_id}_realigned.bam', run_id=RUN_ID)

# Map input files for merging. This function should collect all
# BAM files that match the {run_id} wildcard.
def samtools_merge_inputs(wildcards):
   files = expand('{run_id}_L{line}_realigned.bam', run_id=RUN_ID, line=LINES)
   return files

# Perform BAM merging.
rule samtools_merge:
   input:
      samtools_merge_inputs
   output:
      '{run_id}_realigned.bam
   shell:
      'samtools merge -h {input} {output}'

我尝试构建一个输入函数,该函数收集与当前处理的通配符匹配的所有可用输入文件。当我对管道执行预运行时,我可以看到该函数samtools_merge_inputs无法正常工作,因为它会收集所有可用的 BAM 文件并重复多次:

rule samtools_merge:
   input:
      OVCA-1-FRESH-1_S16_L001_realigned.bam,
      OVCA-1-FRESH-1_S16_L002_realigned.bam,
      OVCA-1-FRESH-1_S16_L003_realigned.bam,
      OVCA-1-FRESH-1_S16_L004_realigned.bam,
      OVCA-1-FRESH-1_S16_L001_realigned.bam,
      OVCA-1-FRESH-1_S16_L002_realigned.bam,
      OVCA-1-FRESH-1_S16_L003_realigned.bam,
      OVCA-1-FRESH-1_S16_L004_realigned.bam,
      OVCA-1-FRESH-1_S16_L001_realigned.bam,
      OVCA-1-FRESH-1_S16_L002_realigned.bam,
      OVCA-1-FRESH-1_S16_L003_realigned.bam,
      OVCA-1-FRESH-1_S16_L004_realigned.bam,
      OVCA-1-FRESH-1_S16_L001_realigned.bam,
      OVCA-1-FRESH-1_S16_L002_realigned.bam,
      OVCA-1-FRESH-1_S16_L003_realigned.bam,
      OVCA-1-FRESH-1_S16_L004_realigned.bam,
      OVCA-2-FRESH-1_S4_L001_realigned.bam,
      OVCA-2-FRESH-1_S4_L002_realigned.bam,
      OVCA-2-FRESH-1_S4_L003_realigned.bam,
      OVCA-2-FRESH-1_S4_L004_realigned.bam,
      OVCA-2-FRESH-1_S4_L001_realigned.bam,
      OVCA-2-FRESH-1_S4_L002_realigned.bam,
      OVCA-2-FRESH-1_S4_L003_realigned.bam,
      OVCA-2-FRESH-1_S4_L004_realigned.bam,
      OVCA-2-FRESH-1_S4_L001_realigned.bam,
      OVCA-2-FRESH-1_S4_L002_realigned.bam,
      OVCA-2-FRESH-1_S4_L003_realigned.bam,
      OVCA-2-FRESH-1_S4_L004_realigned.bam,
      OVCA-2-FRESH-1_S4_L001_realigned.bam,
      OVCA-2-FRESH-1_S4_L002_realigned.bam,
      OVCA-2-FRESH-1_S4_L003_realigned.bam,
      OVCA-2-FRESH-1_S4_L004_realigned.bam
   output:
      OVCA-1-FRESH-1_S16_realigned.bam
   jobid:
      18
   wildcards:
      run_id=OVCA-1-FRESH-1_S16

它应该看起来像这样:

rule samtools_merge:
   input:
      OVCA-1-FRESH-1_S16_L001_realigned.bam,
      OVCA-1-FRESH-1_S16_L002_realigned.bam,
      OVCA-1-FRESH-1_S16_L003_realigned.bam,
      OVCA-1-FRESH-1_S16_L004_realigned.bam
   output:
      OVCA-1-FRESH-1_S16_realigned.bam
   jobid:
      18
   wildcards:
      run_id=OVCA-1-FRESH-1_S16

我应该如何编辑 samtools_merge_inputs 函数来收集所需的输入文件?我确实意识到我可以简单地忘记输入函数,只需使用通配符向 samtools_merge 输入四个输入文件,但我真的很想学习如何在这种情况下使用输入函数,因为我在其他管道中面临类似的问题以及。我试图从其他帖子中寻求帮助,但到目前为止我还没有找到适合我目的的答案。

感谢您的帮助!


您的函数此处不使用通配符。它应该是这样的:

def samtools_merge_inputs(wildcards):
    files = expand(wildcards.run_id+'_L{line}_realigned.bam', line=LINES)
    return files

当然,如果您在所有泳道上都有所有样本。当您调用函数时,所有通配符都会作为对象传递到wildcards你的函数的参数。

您还可以这样做:

files = expand('{run_id}_L{line}_realigned.bam', run_id=wildcards.run_id, line=LINES)  

你有很多东西在你的蛇文件中不起作用。
首先,您的 samtools 合并规则中缺少“'”:

rule samtools_merge:
    input:
        samtools_merge_inputs
    output:
        '{run_id}_realigned.bam'<-----
    shell:
        'samtools merge -h {input} {output}'

并注意变量名称(LINE 与 LINES)

二、功能glob_wildcards()将返回找到的所有值的列表,这意味着您的两个变量将如下:

RUN_ID, LINES = glob_wildcards('{run_id}_L{line}_realigned.bam')

print(RUN_ID)
['OVCA-2-FRESH-1_S16', 'OVCA-2-FRESH-1_S16', 'OVCA-1-FRESH-1_S16', 'OVCA-1-FRESH-1_S16', 'OVCA-1-FRESH-1_S16', 'OVCA-1-FRESH-1_S16', 'OVCA-2-FRESH-1_S16', 'OVCA-2-FRESH-1_S16']

print(LINES)
['002', '001', '001', '002', '004', '003', '003', '004']

我确信这不是你想要的。解决方案是使用正确的结构来描述您的样本。例如(同样,如果所有样本都位于所有泳道上):

RUN_ID = ["OVCA-1-FRESH-1_S16","OVCA-2-FRESH-1_S16"]
LINES = ["1","2","3","4"]

最后一件事:您的输入和输出无法通过通配符区分,这意味着您最终会遇到错误Cyclic dependency on rule samtools_merge or RecursionError: maximum recursion depth exceeded in comparison。我建议您为输出选择不同的名称。全部放在一起:

# Map start input files
RUN_ID = ["OVCA-1-FRESH-1_S16","OVCA-2-FRESH-1_S16"]
LINES = ["001","002","003","004"]

rule all:
   input:
      expand('{run_id}_realignedFinal.bam', run_id=RUN_ID)

# Map input files for merging. This function should collect all
# BAM files that match the {run_id} wildcard.
def samtools_merge_inputs(wildcards):
   files = expand('{run_id}_L{line}_realigned.bam', run_id=wildcards.run_id, line=LINES)
   return files

# Perform BAM merging.
rule samtools_merge:
   input:
      samtools_merge_inputs
   output:
      '{run_id}_realignedFinal.bam'
   shell:
      'samtools merge -h {input} {output}'

还没有检查你的 shell 命令,但我的文档说:
Usage: samtools merge [-nurlf] [-h inh.sam] [-b <bamlist.fofn>] <out.bam> <in1.bam> [<in2.bam> ... <inN.bam>]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何收集与输入函数匹配通配符的Snakemake输入文件? 的相关文章

随机推荐

  • 如何在不注册机器人帐户的情况下以编程方式从维基共享资源下载图像?

    机器人帐户获得批准的唯一方法似乎是添加或编辑维基媒体上已有的信息 如果您尝试在没有机器人帐户的情况下使用某些 api 库下载任何图像 您会收到错误消息而不是图像 似乎他们阻止了任何不从浏览器进入的人 其他人有这方面的经验吗 我在这里错过了什
  • 提交触发后 Bitbucket 构建错误

    我试图在使用 BitBucket 插件提交时自动触发构建 我似乎使用 Web Hook 正确设置了内容 并选中项目中的 将更改推送到 BitBucket 时构建 框 当我提交时 我在 BitBucket Hook Log 中看到一条消息 显
  • 继承对象的 XML 反序列化

    我有一个对象InputFile它有数组和对象来保存文件的内容 我也有ABCFile and XYZFile两者都继承自InputFile它将读取不同类型的文件并将它们存储到的投影成员中InputFile 由于这两个对象的序列化和反序列化与父
  • Flutter Web 中的分段文件上传

    有没有办法将文件分段上传到 Flutter Web 原生的服务器 因为 Flutter iOS 和 Android 有很多方法可以做到这一点 对于 Android IOS 我们使用 multiPFile await MultipartFil
  • 无法使用 AKS 和 ACR 提取新映像

    我突然在使用 AKS 从 Azure 容器注册表中提取最新映像时遇到问题 之前工作正常 If I run kubectl describe pod
  • CodeIgniter htaccess 修改为半 https 且无 www 版本

    htaccess 修改与核心 PHP 中不同 因此 经过一番搜索 我得到了以下代码 在那之前 我的要求是我的项目的标准 整个网站严禁使用 www 即直接重定向到非 www 版本 HTTPS 适用于某些页面 结帐 登录页面 其他页面严格采用
  • Android 自定义对话框的昏暗背景

    正如标题所示 我似乎无法调暗我制作的自定义对话框的背景 网上无数的解决方案都提到了下面第一个片段中的最后 3 行代码 这对对话框的 UI 没有影响 请看下面的代码 Dialog dialog new Dialog MainActivity
  • iOS SDK中逐行读取文件

    我有一个文本文件如下 line1 line2 line3 line4 line5 我想从文件读入两个字符串数组 以便line1 line3 line 5 进入array1 and line 2 line 4 line 6 进入array2
  • 将 ISO 8601 日期时间字符串反序列化为 C# DateTime

    我正在尝试使用 JsonConvert DeserializeObject
  • 按钮动画像ios游戏中心按钮

    我正在尝试让我的按钮像 ios 游戏中心中的按钮一样具有动画效果 它们似乎像气泡一样在屏幕上摇摆和漂浮 我尝试过在屏幕上随机移动按钮 使它们同时以恒定的圆形路径移动 但效果不一样 我需要一种摇摆效果 任何想法表示赞赏 结合几个CAKeyfr
  • Scenebuilder 2.0 中的自定义组件

    在 Scenebuilder 1 1 中 您可以将整个自定义组件作为一个整体导入 然而 在 2 0 中 它将组件作为单独的部分 容器和节点 导入 由于我的自定义组件依赖于与其控制器和 ID 的统一工作 因此这会破坏它 到目前为止我能做些什么
  • 动态编译依赖于特定类加载器加载的类的java代码

    我们有能力即时动态编译 Java 代码 我至少知道Java 运行时编译器 https github com OpenHFT Java Runtime Compiler and 内存Java编译器 https github com trung
  • WCErrorCodeDeliveryFailed:无法交付有效负载

    我正在开发一款在 iPhone 和 Apple Watch 之间共享数据的应用程序 使用WCSession方法sendMessage replyHandler errorHandler 实施该方法后 我收到如下错误 WCSession on
  • GitHub SSH 密钥声称未使用

    为什么 在我的 GitHub 帐户上的 设置 gt SSH 密钥 下 它显示 由 GitHub for Mac 于 2014 年 10 月 24 日添加 从未使用过 没用过 我用过 我的个人资料中显示了很多贡献 从that机器 我还有另一把
  • Android:使用 onTouchListener() 循环执行线程

    您好 我的应用程序中有 8 个按钮 每个按钮都配置为 onclickListener 当单击该按钮时 字符串将写入套接字 现在我希望当我按住按钮时 字符串必须循环写入 这就是我正在尝试做的事情 bLeft setOnTouchListene
  • 在 Ubuntu 上安装 Java 7

    Note 这个问题是在 Oracle 将 OpenJDK 作为 Oracle JDK 的免费版本之前提出的 历史答案反映了这一点 从 2022 年起 您不应使用 Java 7 除非您必须使用无法在 OpenJDK 8 上运行的项目 为了安装
  • ELK 未将元数据从 filebeat 传递到 Logstash

    通过以下方式安装 ELK 服务器 https www digitalocean com community tutorials how to install elasticsearch logstash and kibana elk sta
  • R 编程:从数据框中查找所有因子

    我正在尝试获取数据框列的类类型 我正在做的是 sapply mydata class 但现在 我只想找到那些作为因素的列名 我尝试了以下方法 sapply data is factor 但它给了我 ResponseFlag Gender M
  • ANTLR 隐式乘法

    我是 ANTLR 的新手 我正在尝试扩展所提供的简单计算器的示例here https stackoverflow com a 1932664 具体来说 我尝试添加一些简单的函数 负数等 以熟悉 ANTLR 然而 我在尝试实现 隐式 乘法时遇
  • 如何收集与输入函数匹配通配符的Snakemake输入文件?

    我有一组使用 BWA MEM 生成并使用 GATK IndelRealigner 等进一步处理的 BAM 文件 我正在以较小的块对 BAM 文件进行预处理 以加快处理速度 然而 我必须在变体调用之前将这些单独的文件合并到一个 BAM 文件中