Groovy Nextflow flatmap未按预期执行

Groovy Nextflow flatmap未按预期执行,groovy,workflow,nextflow,Groovy,Workflow,Nextflow,我有一本字典。我需要解析一个进程的键和值对。最终结果应该如下所示: carcode=somename params={minimum=3000, ignore=60, maximum_A=2500, maximum_B=500} carcode=somename2 params={minimum=5000, ignore=100, maximum_A=3500, maximum_B=22500} 我已经编写了这段代码,它使用一个硬编码的值,而不是变量it,我将在代码中指向它 data = [

我有一本字典。我需要解析一个进程的键和值对。最终结果应该如下所示:

carcode=somename
params={minimum=3000, ignore=60, maximum_A=2500, maximum_B=500}
carcode=somename2
params={minimum=5000, ignore=100, maximum_A=3500, maximum_B=22500}
我已经编写了这段代码,它使用一个硬编码的值,而不是变量it,我将在代码中指向它

data = [
    "a" : "A",
    "b" : "B",
    "c" : [
        "somename":[
            "z" : "Z",
            "y" : "Y",
            "params" :[
                "minimum": "3000",
                "ignore": "60",
                "maximum_A": "2500",
                "maximum_B": "500"
            ]
        ],

        "somename2":[
            "z" : "Z",
            "y" : "Y",
            "params" :[
                "minimum": "5000",
                "ignore": "100",
                "maximum_A": "3500",
                "maximum_B": "22500"
            ]
        ]
    ]
]

carcodes = Channel.from(data.c.keySet())
transform_carcodes = carcodes.flatMap { it ->  [it] }
//HERE
results = transform_carcodes.flatMap { it ->  [barcode: it, params: data.c."somename".params] }
//HERE
results.subscribe onNext: { println it }
当前,输出获得正确的键,但使用硬编码键的值:

carcode=somename
params={minimum=3000, ignore=60, maximum_A=2500, maximum_B=500}
carcode=somename2
params={minimum=3000, ignore=60, maximum_A=2500, maximum_B=500}
为什么我做params时它不工作:data.c.it.params

我获取输出:无法获取null对象上的属性“params”

我已经试过了

同样,一旦我获得了输出,我如何将这个k/v对传递给一个进程,并为每个k/v对生成一个新进程

process{
    container "python:3"

    script:
    """
    python3 some_file.py <key> <value>
    """
}
如果执行data.c.it.params,它将被视为嵌套映射中的另一个键。一旦不存在这样的密钥,params密钥就会为null

构建所需结果的代码可能如下所示

def data = [....]

data.c.each{ k, v -> 
  "python3 some_file.py $k {${v.params.collect{ "$it.key=$it.value" }join(', ')}}".execute().text
}
每个字符串都呈现为

python3 some_file.py somename {minimum=3000, ignore=60, maximum_A=2500, maximum_B=500}
python3 some_file.py somename2 {minimum=5000, ignore=100, maximum_A=3500, maximum_B=22500}

在Nextflow中,我就是这样处理这个问题的:

诀窍是使用c[it],而不是c

快跑

导入系统 打印优先: printsys.argv[1] 打印秒: printsys.argv[2] 以及输出:

[15/aec54c] process > A (1) [100%] 2 of 2 ✔
First:
somename
Second:
[minimum=3000, ignore=60, maximum_A=2500, maximum_B=500]

First:
somename2
Second:
[minimum=5000, ignore=100, maximum_A=3500, maximum_B=22500]

嗯。那么我该如何修复它呢?所以我在查看平面图之前就有了这个。如何将这些值传递给流程?params=Channel.fromresult,然后在我的过程中,如果我输入:val x from params,我会得到输出:[af/d5fa1c]过程>1的[100%]1✔ [:]看起来您只需要根据数据结构运行两个命令,而无需收集任何中间结果。因此updateThis中的代码是groovy代码吗?原因Nextflow关闭输入和输出。我需要每个k/v对作为流程的输入。请看这里[举一个Nextflow工作流的快速示例,突出显示流程/输入/输出/脚本更新…我认为参数应该是json,现在它们以您需要的格式打印出来了
carcodes = Channel.from(data.c.keySet())
transform_carcodes = carcodes.flatMap { it ->  [it] }
results = transform_carcodes.flatMap { it ->  [ [it, data.c[it].params] ] }

process A{
    echo true

    input:
    set x,y from results

    script:
    """
    python3.7 run_me.py ${x} \'${y}\'
    """

}
[15/aec54c] process > A (1) [100%] 2 of 2 ✔
First:
somename
Second:
[minimum=3000, ignore=60, maximum_A=2500, maximum_B=500]

First:
somename2
Second:
[minimum=5000, ignore=100, maximum_A=3500, maximum_B=22500]