修正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
相关产品推荐
相关产品推荐

