0

假设我有两个过程。

Channel
    .fromFilePairs("${params.dir}/{SPB_50k_exome_seq,FE_50k_exome_seq}.{bed,bim,fam}",size:3) {
        file -> file.baseName
    }
    .filter { key, files -> key in params.pops }
    .set { plink_data }

process pling_1 {
    publishDir "${params.outputDir}/filtered"

    input:
    set pop, file(pl_files) from plink_data

    output:
    file "${pop}_filtered.{bed,fam,bim}" into pling1_results

    script:
    output_file = "${pop}_filtered"
    base        = pl_files[0].baseName

     """
        plink2 \
        --bfile $pop \
        --hwe 0.00001 \
        --make-bed \
        --out ${output_file} \
     """
}
process pling_2 {
    publishDir "${params.outputDir}/filtered_vcf"

    input:
    set file(bed), file(bim), file(fam) from pling1_results.collect()
    file(fam1) from fam_for_plink2

    output:
    file("${base}.vcf.gz") into pling2_results

    script:

    base          = bed.baseName
    output_file   = "${base}"

     """
     plink2 \
     --bfile $base \
     --keep-fam ${params.fam}/50k_exome_seq_filtered_for_VEP_ID.txt \
     --recode vcf-iid bgz --out ${output_file}
     """
}

pling_1 进程的结果是两个元素列表,

[/work/SPB_50k_exome_seq.bed, /work/SPB_50k_exome_seq.bim,/work/SPB_50k_exome_seq.fam]
[/work/FE_50k_exome_seq.bed, /work/FE_50k_exome_seq.bim,/work/FE_50k_exome_seq.fam]

因此,ping_2不是我无法一口气处理。仅从第二个列表中获取和省略。在这种情况下,我怎样才能同时传递和传递给进程?SPB_50k_exome_seqFE_50k_exome_seqbase = bed.baseNameSPB_50k_exome_seqFE_50k_exome_seqSPB_50k_exome_seqFE_50k_exome_seqpling_2

非常感谢任何帮助或建议。

谢谢

4

1 回答 1

0

经过大量的实验,我找到了解决方案。将帮助正在寻找解决方案的人。

问题的原因是该过程pling_1产生了太多的文件作为输出,所有这些文件都输出到同一个通道中。因此,您需要将这些文件分解并重新组合成格式的元组。为此,我使用了以下频道,您可以在其中使用combine&等运算符flatten

pling1_results
    .collect()
   .flatten()
    .map { file -> tuple(file.baseName, file)}
    .groupTuple(by: 0)
    .map { input -> tuple(input[0], input[1][0], input[1][1], input[1][2])}
    .set { pl1 }

然后将通道pl1用作下一个过程的输入。除此之外,您应该通过通道将所有项目作为单个输入传递到流程中。像下面这样,

set val(pop1),file(bed), file(bim), file(fam),file(fam1) from pl1.combine(fam_for_plink2)

通过这两个更改,现在工作流正在为元组中的每个样本/输入运行。而不是只运行一个。谢谢

于 2020-08-05T14:09:32.887 回答