You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修正Nextflow流程:为多consensus fasta创建独立BLAST进程

解决Nextflow流程中多Consensus序列的BLAST并行问题

我构建了一个以fastq.gz文件为输入的Nextflow流程,其中CONSENSUS_BUILDING流程会生成一个或多个consensus fasta序列,BLAST流程负责对每个序列进行比对。当单个fastq.gz文件仅生成一个consensus序列时流程运行正常,但生成多个序列时会出现错误:BLAST命令将多个fasta文件作为同一-query参数输入,且输出文件名格式错误。

错误命令示例:

blastn -db references/hAdv_filtered.fasta 
  -query consensus_reference_121.fasta consensus_reference_151.fasta consensus_reference_186.fasta \
  -outfmt '6 sseqid stitle pident length mismatch gapopen qstart qend sstart send evalue bitscore' \
  -out [consensus_reference_121, consensus_reference_151, consensus_reference_186].blast 

问题根源

当前CONSENSUS_BUILDING的输出是文件集合通道(当生成多个fasta时,通道元素是包含所有文件的列表),直接传递给BLAST流程时,Nextflow会把整个列表作为单个输入处理,导致命令参数异常。需要将集合通道拆分为单个文件的独立通道,让每个fasta对应一个BLAST进程。

修改方案

1. 扁平化CONSENSUS_BUILDING的输出通道

在流程输出定义中添加flatten: true,将包含多个文件的集合拆分为单个文件的独立通道元素:

process CONSENSUS_BUILDING {

    publishDir "${params.outdir}/consensus", mode: 'copy'

    input:
    path fastq

    output:
    path "${fastq.getSimpleName()}_ID/*.fasta", emit: consensus_fasta, flatten: true

    script:
    """
    gunzip -f ${fastq}
    NGSpeciesID --ont --sample_size 10000 --consensus --racon --racon_iter 3 --fastq ${fastq.getSimpleName()}.fastq --m 650 --s 50 --outfolder ${fastq.getSimpleName()}_ID
    """
}

2. 调整Workflow中的通道映射逻辑

扁平化后的通道每个元素都是单个fasta文件,直接为每个文件生成对应的(文件名, 文件路径)元组:

// Overall workflow
workflow {
    ch_reads = Channel.fromPath( "${params.reads}/*.fastq.gz" )
    ch_consensus = CONSENSUS_BUILDING(ch_reads)
    
    blast_in = ch_consensus.out.consensus_fasta.map{ fasta_file -> 
        tuple(fasta_file.simpleName, fasta_file) 
    }
    
    ch_blast = BLAST(blast_in, db_dir)
}

3. 验证BLAST流程的输入输出

确保BLAST流程处理单个文件输入,输出文件名基于单个fasta文件名生成:

process BLAST {

    publishDir "${params.outdir}/blast", mode: 'copy'
    container  'docker://ncbi/blast'

    input:
    tuple val(sampleID), path(fasta)
    path db

    output:
    path "${sampleID}.blast"

    script:
    """
    blastn -db ${db}/${db_name} -query ${fasta} -outfmt '6 sseqid stitle pident length mismatch gapopen qstart qend sstart send evalue bitscore' -out ${sampleID}.blast
    """
}

修改效果

每个consensus fasta文件会触发独立的BLAST进程,输出对应的[fasta文件名].blast文件,不会再出现多个文件塞进同一-query参数的问题。

内容的提问来源于stack exchange,提问作者ramiro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 21:19:52