【问题标题】:Nextflow: add unique ID, hash, or row number to tupleNextflow:向元组添加唯一 ID、哈希或行号
【发布时间】:2021-11-19 15:53:34
【问题描述】:
ch_files = Channel.fromPath("myfiles/*.csv")
ch_parameters = Channel.from(['A','B, 'C', 'D'])
ch_samplesize = Channel.from([4, 16, 128])

process makeGrid {
 input:
  path input_file from ch_files
  each parameter from ch_parameters
  each samplesize from ch_samplesize
 output:
  tuple path(input_file), parameter, samplesize, path("config_file.ini") into settings_grid

 """
 echo "parameter=$parameter;sampleSize=$samplesize" > config_file.ini
 """

}

给了我一个 number_of_files * 4 * 3 网格的设置文件,所以我可以为每个参数组合和输入文件运行一些脚本。

如何在此网格的每一行中添加一些 ID?行 ID 可以,但我什至更喜欢一些没有“含义”的唯一 6 位字母数字代码,因为表中的顺序无关紧要。我可以提取出每个进程看似唯一的工作文件夹的最后一部分;但我认为依赖sed$PWD 并不理想,而且我没有看到它作为运行时元数据变量提供程序提供。 (加上它有点长但还可以)。在以前的设置中,我有一个来自 LSF 集群系统的作业 ID 用于此目的,但我希望它是可移植的。

不保证每个组合都是唯一的(例如,在输入通道中有两次参数'A' 应该是有效的)。

说清楚,我想要这个输出

file1.csv A 4 pathto/config.ini 1ac5r
file1.csv A 16 pathto/config.ini 7zfge
file1.csv A 128 pathto/config.ini ztgg4
file2.csv A 4 pathto/config.ini 123js

等等

【问题讨论】:

    标签: nextflow


    【解决方案1】:

    考虑到输入声明,它使用each 限定符作为input repeater,如果不进行一些重构以使用combinecross 运算符,将很难将一些唯一的ID 附加到网格。如果输入只是文件或简单值(如您的示例代码中),那么重构没有多大意义。

    要获得唯一的代码,简单的选项是:

    1. 就像你提到的,不幸的是,没有办法访问唯一的任务哈希而不需要一些破解来解析$PWD。虽然,可以使用 BASH 参数替换来避免 sed/awk/cut(当然假设 BASH 是您的 shell...)您可以尝试使用:"${PWD##*/}"

    2. 您可能更喜欢使用${task.index},它是同一任务中的唯一索引。尽管任务索引不能保证在执行过程中是唯一的,但在大多数情况下应该足够了。也可以格式化为例如:

    process example {
    
        ...
    
        script:
        def idx = String.format("%06d", task.index)
    
        """
        echo "${idx}"
        """
    }
    
    1. 或者,创建您自己的 UUID。您可能能够获取前 N 个字符,但这当然会降低 ID 唯一的可能性(无论如何都不能保证)。尽管对于一小部分有限的输入,这可能并不重要:
    process example {
    
        ...
    
        script:
        def uuid = UUID.randomUUID().toString()
    
        """
        echo "${uuid}"
        echo "${uuid.take(6)}"
        echo "${uuid.takeBefore('-')}"
        """
    }
    

    【讨论】:

    • 超级,我稍微修改了一下:idx = workflow.sessionId.toString().take(digits_session_format) + String.format(digits_grid_format, task.index)digits_session_format = 4digits_grid_format = '%04d'。不过,它只有在没有“def”的情况下才对我有用
    • task 有记录吗?找不到任何关于它的信息。
    • @meow 啊,是的 - 我应该提到上述的一些组合。添加(部分)工作流会话 ID 应该使它更有可能在执行中是唯一的 - 好主意。如果没有def,该变量将成为一个全局变量,例如可以在输出定义中访问。我在文档中也看不到太多任务。这是一个TaskConfig 实例。您可以使用echo "${task.properties}" 之类的内容查看其他任务属性。 HTH。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    • 2012-01-07
    • 1970-01-01
    • 2011-02-15
    • 2021-05-06
    • 1970-01-01
    • 2013-12-21
    相关资源
    最近更新 更多