groovy Nextflow -每个样本进行多个qc处理,而不是一起处理所有样本输出

oyt4ldly  于 6个月前  发布在  其他
关注(0)|答案(1)|浏览(78)

我当前的工作流程为输入列表中的所有样品生成一个multiqc报告,出于某种原因,我想为每个样品生成multiqc报告。以下是我当前的工作流程..MULTIQC过程...感谢任何帮助。输入可以是bamcram的文件input.yaml

samples:
-
 biosample_id: NA12878-chr14-AKT1
 aln: NA12878-chr14-AKT1.bam
-
 biosample_id: NA12878-chr14-AKT2
 aln: NA12878-chr14-AKT2.bam

字符串
main.nf

Channel
        .empty()
        .mix( mosdepth_bam.out.dists )
        .mix( mosdepth_bam.out.summary )
        .mix( mosdepth_cram.out.dists )
        .mix( mosdepth_cram.out.summary )
        .mix( mosdepth_datamash.out.coverage )
        .mix( verifybamid2_bam.out.freemix )
        .mix( verifybamid2_cram.out.freemix )
        .mix( verifybamid2_bam.out.ancestry )
        .mix( verifybamid2_cram.out.ancestry )
        .mix( samtools_stats_bam.out )
        .mix( samtools_stats_cram.out )
        .map { sample, files -> files }
        .collect()
        .set { log_files }

    multiqc( log_files )


modules/multiqc/main.nf

process multiqc {

input:
path 'data/*'

output:
path "multiqc_report.html", emit: report
path "multiqc_data", emit: data
path "multiqc_data/multiqc_data.json", emit: json_data

"""
multiqc \\
    --data-format json \\
    --enable-npm-plugin \\
    .
"""
}


我尝试了下面的multiqc过程报告每个样品.
尝试1. main.nf

Channel
    samples.map { it.biosample_id }
    .set { sample_ids }

multiqc( sample_ids, samtools_stats_bam.out.stats.mix( samtools_stats_cram.out.stats, mosdepth_bam.out.dists, mosdepth_bam.out.summary, mosdepth_cram.out.dists, mosdepth_cram.out.summary, mosdepth_datamash.out.coverage, verifybamid2_bam.out.freemix, verifybamid2_cram.out.freemix, verifybamid2_bam.out.ancestry, verifybamid2_cram.out.ancestry, ).collect() )


modules/multiqc/main.nf

process multiqc {

    tag { sample }

    input:
    tuple val(sample), path('*')
  output:
   
  tuple val(sample), path("${sample}/multiqc_report.html"), emit: report
  tuple val(sample), path("${sample}/multiqc_data"), emit: data
  tuple val(sample), path("${sample}/multiqc_data/multiqc_data.json"), emit: json_data

  """
  multiqc \\
    --data-format json \\
    --enable-npm-plugin \\
    -o ${sample} \\
    .
  """
}

附上完整的工作流程生成单一的多qc报告,以防万一main.nf文件。

// main

workflow {

ref_fasta = file( params.reference )
ref_fasta_idx = file( params.reference + ".fai" )
autosomes_non_gap_regions = file( params.autosomes_non_gap_regions )
vbi2_ud = file( params.vbi2_ud )
vbi2_bed = file( params.vbi2_bed )
vbi2_mean = file( params.vbi2_mean )

inputs = new YamlSlurper().parse(file(params.inputs_list))

Channel
    .fromList(inputs['samples'])
    .ifEmpty { ['biosample_id': params.biosample_id, 'aln': params.aln] }
    .set { samples }

Channel
    samples.branch { rec ->
        def aln_file = rec.aln ? file( rec.aln ) : null

        bam: rec.biosample_id && aln_file?.extension == 'bam'
            def bam_idx = file( "${rec.aln}.bai" )

            return tuple( rec.biosample_id, aln_file, bam_idx )

        cram: rec.biosample_id && aln_file?.extension == 'cram'
            def cram_idx = file( "${rec.aln}.crai" )

            return tuple( rec.biosample_id, aln_file, cram_idx )
    }
    .set { aln_inputs }

samtools_stats_bam( aln_inputs.bam, [] )
samtools_stats_cram( aln_inputs.cram, ref_fasta )

verifybamid2_bam( aln_inputs.bam, ref_fasta, vbi2_ud, vbi2_bed, vbi2_mean )
verifybamid2_cram( aln_inputs.cram, ref_fasta, vbi2_ud, vbi2_bed, vbi2_mean )

mosdepth_bam( aln_inputs.bam, [] )
mosdepth_cram( aln_inputs.cram, ref_fasta )

Channel
    .empty()
    .mix( mosdepth_bam.out.regions )
    .mix( mosdepth_cram.out.regions )
    .set { mosdepth_regions }

mosdepth_datamash( mosdepth_regions, autosomes_non_gap_regions )
//    mosdepth_datamash( autosomes_non_gap_regions, mosdepth_bam.out.regions.mix( mosdepth_cram.out.regions ) )

Channel
    .empty()
    .mix( mosdepth_bam.out.dists )
    .mix( mosdepth_bam.out.summary )
    .mix( mosdepth_cram.out.dists )
    .mix( mosdepth_cram.out.summary )
    .mix( mosdepth_datamash.out.coverage )
    .mix( verifybamid2_bam.out.freemix )
    .mix( verifybamid2_cram.out.freemix )
    .mix( verifybamid2_bam.out.ancestry )
    .mix( verifybamid2_cram.out.ancestry )
    .mix( samtools_stats_bam.out )
    .mix( samtools_stats_cram.out )
    .map { sample, files -> files }
    .collect()
    .set { log_files }

multiqc( log_files )

Channel
    samples.map { it.biosample_id }
    .set { sample_ids }

compile_metrics ( sample_ids, multiqc.out.json_data )    
}

随附参考模块之一modules/mosdepth/main.nf

process mosdepth {

    tag { sample }

    input:
    tuple val(sample), path(bam), path(bai)
    path ref_fasta

    output:
    tuple val(sample), path("*.regions.bed.gz"), emit: regions
    tuple val(sample), path("*.dist.txt"), emit: dists
    tuple val(sample), path("*.summary.txt"), emit: summary

    script:
    def fasta = ref_fasta ? /--fasta "${ref_fasta}"/ : ''

    """
   # run mosdepth    
   # do not output per-base depth and apply 1000bp window-sizes
   # use the reads with mapping quality 20 and above

    mosdepth \\
        --no-per-base \\
        --by 1000 \\
        --mapq 20 \\
        --threads ${task.cpus} \\
        ${fasta} \\
        "${sample}" \\
        "${bam}"
    """
}

gstyhher

gstyhher1#

由于您只提供了main.nfmodules/multiqc/main.nf文件,因此很难看出发生了什么。脚本中似乎存在输入基数错误,但我在查看您的示例时有点迷失。无论如何,我可以提出一些建议。
重要的是,如果不使用join操作符连接输出流,您将冒着错误的样本ID与来自不同文件的数据配对的风险。我相信,当给定通道中有多个项目准备就绪时,nextflow会随机将数据分配给进程。
最简单的解决方案是收集和连接mosdepth、verifybamid2和samtools发出的所有数据。我不使用这些工具,所以我将在示例中创建元组。
modepth:

output:
tuple, val("$sampleID"), path("${sampleID}_bam.dists"), path("${sampleID}_bam.summary"), emit: mosdepth_bam_out

字符串
samtools:

output:
tuple, val("$sampleID"), path("${sampleID}_bam.stats"), emit: samtools_bam_out


verifybamid 2:

output:
tuple, val("$sampleID"), path("${sampleID}_bam.freemix"), path("${sampleID}_bam.ancestry"), emit: verifybamid_bam_out


工作流程main.nf

// Some of the processes just as an example
samtools_stats_bam( aln_inputs.bam, [] )
verifybamid2_bam( aln_inputs.bam, ref_fasta, vbi2_ud, vbi2_bed, vbi2_mean )
mosdepth_bam( aln_inputs.bam, [] )

samtools_stats_bam
  .out
  .samtools_bam_out
  .collect() 
  .join( verifybamid2_bam.out.verifybamid_bam_out.collect(), by: 0 )
  .set { intermediate_ch1 } // I am unsure if you can string multiple joins together. Hence the intermediate channel.

intermediate_ch1
  .join( mosdepth_bam.out.mosdepth_bam_out.collect(), by: 0 )
  .set { multiqc_in }

multiqc( multiqc_in )


您还需要更新multiqc输入基数以反映您加入的输入通道:

input:
tuple, val(sampleID), path(samtools_bam_stats), path(verify_bam_freemix), path(verify_bam_ancestry), path(mosdepth_bam_dists), path(mosdepth_bam_summary)


代码没有测试,你需要检查join保留的顺序,但它是一致的,我只是不记得最初的通道是连接到左边还是右边。
编辑:另外,我从来没有尝试过在同一个命令中使用collect操作符,所以你可能需要创建更多的中间通道。我也不知道这是否完全必要。最后一个注意事项是,你需要更改multiqc的输出文件名,以防止输出目录中的文件名冲突。

相关问题