Nextflow - 如何避免使用 "Join" 或类似运算符在两个或多个通道中输入文件的随机样本 ID?

Nextflow - How to avoid random sample IDs for input files in two or more channels with "Join" or similar operator?

我已经使用 Nextflow 实施了一些 NGS 数据分析工作流程。我在我的一些工作流程中使用了“Paired End”通道(fromFilePairs 方法)。我 运行 遇到了一个我在多次执行工作流程后没有预料到的问题:我的样本 ID 有时会混合,导致它发生的过程的输出不准确。我认为这与 非确定性输入通道问题 (https://www.nextflow.io/blog/2019/troubleshooting-nextflow-resume.html).

有关

假设我将工作流程应用于这些双端文件:sample1_R{1,2}.fastq, sample2_R{1,2}.fastq

process Step1 {
    input:
        tuple pair_ID, file(A) from channelA
        tuple pair_ID, file(B) from channelB
        tuple pair_ID, file(C) from channelC
...
}

对于这种使用多个“元组 pair_ID”作为输入的过程,数据 pair_ID(= 我的样本名称)可能会混淆,我的过程最终会使用 运行domly 输入文件A和Bsample1,以及输入文件Csample2 而不是 所有文件 (A,B,C) same pair_ID(键 = 仅 sample1 或仅 sample2)。 在执行了几次工作流程之后,在发生错误时使用 -resume 之后,以及在完全成功的工作流程运行之后,我遇到了这个 运行domly 混合输入文件名问题(这影响了输出)。

为了在 3 个通道中的每一个发出的输入文件之间具有相同的密钥 (pair_ID),我使用了 join 运算符:

Process Step1 {
    input:
        tuple pair_ID, file(A), file(B), file(C) from channelA.join(channelB).join(channelC)
...
}

这个运算符似乎让一切都按预期工作,我没有看到我的样本 ID 和最终输出有任何混合。在文档 (https://www.nextflow.io/docs/latest/operator.html?highlight=join#join) 中,join 似乎只适合 2 个通道使用,所以我不确定我是否将它正确地用于 3 个通道。

我的方法使用 join 合法吗? 还是它仍然存在一些缺陷? 有没有更好的方法来解决我的问题? 如果我不确定此方法是否正确以避免样本 ID 中的任何混合,我可能会更改为另一个工作流管理系统,例如 Snakemake,但我真的很想解决这个问题并继续使用 Nextflow。

在此先感谢您,如果有什么不清楚的地方,请不要犹豫!

正如您所发现的,您应该避免在输入块中多次使用相同的变量名 (pair_ID)。使用相同的变量名称并不能保证输入将使用此键连接起来。我想无论您从一个输入通道获得的 pair_ID 的任何值都会被您从其他输入通道之一获得的 pair_ID 破坏。您还发现,当您声明两个或多个输入通道时,整体输入顺序在多次执行中可能不一致(例如使用 -resume 时)。

要使用公共密钥加入两个或多个频道,您只需使用 join operator:

join

The join operator creates a channel that joins together the items emitted by two channels for which exits a matching key. The key is defined, by default, as the first element in each item emitted.

请注意,连接运算符会创建 (returns) 一个新频道。因此,这:

joined = channelA.join(channelB).join(channelC)

在功能上等同于:

temp = channelA.join(channelB)
joined = temp.join(channelC)