我想要一个管道,可以从名为“input”的文件夹中获取这样的输入。文件格式如下“Gene_KOs1.tsv Gene_KOs2.tsv Mutations1.tsv Mutations2.tsv”。我的 python 脚本将运行每个“对”并产生输出。我希望将该输出放入名为 Gene_Mutation1 的文件夹中,因为每个输出文件都被称为相同的东西。我以为这很简单,但显然事实并非如此。这是我当前的代码,不幸的是,它没有正确保存输出 csv。
我试过这个:
#!/usr/bin/env nextflow nextflow.enable.dsl=2
params.inputDir =“/mnt/scratch-raid/data/l/nextflow_test/input” params.outputDir =“/mnt/scratch-raid/data/l/nextflow_test/output”
工作流程{ inputDir = 文件(params.inputDir)
// List all gene files genesFiles = inputDir.listFiles().findAll { it.name.startsWith('Gene_KOs') } // List all mutation files mutationFiles = inputDir.listFiles().findAll { it.name.startsWith('Mutations') } // Process each gene file genesFiles.each { genesFile -> // Extract the number from the gene file name def geneNumber = genesFile.name.replaceAll("[^0-9]", "") // Find the matching mutation file def mutationFile = mutationFiles.find { it.name.contains("Mutations${geneNumber}") } if (mutationFile) { println "Starting analysis for ${genesFile.name}" genesBaseName = genesFile.name.replaceAll("\\.tsv\$", "") mutationsBaseName = mutationFile.name.replaceAll("\\.tsv\$", "") pairOutputDir = "${params.outputDir}/${genesBaseName}_${mutationsBaseName}" // Create the output directory file(pairOutputDir).mkdirs() // Run your Python script here """ python3 /mnt/scratch-raid/data/l/nextflow_test/Main.py ${genesFile} ${mutationFile} ${pairOutputDir} """ println "Finished processing: ${genesFile.name} and ${mutationFile.name}" } else { println "No matching mutations file found for: ${genesFile.name}" } } }
我希望在各自的目录中看到 csv,但目录是空的,没有运行过 python 脚本的证据
根据定义,这不是 Nextflow 管道。如果您告诉我您使用 ChatGPT,我不会感到惊讶😅。在 Nextflow 管道中,您必须至少有一个进程和工作流块。你也没有。我建议您参加我们的社区基础 nextflow 培训
我还没有测试下面的代码,但它会让你更接近你想要的。将
Main.py
脚本文件放入在管道文件夹中创建的 bin
文件夹中。这样,无论您的计算环境如何,Nextflow 都会对其进行暂存。例如,如果您使用容器,则需要保证您的 Main.py
脚本位于容器内。通过将其放入 bin 文件夹中,Nextflow 将处理该问题。
params.inputDir = '/mnt/scratch-raid/data/l/nextflow_test/input/'
params.outputDir = '/mnt/scratch-raid/data/l/nextflow_test/output/Gene_Mutation1'
process YOUR_PROCESS_NAME {
publishDir "$params.outputDir", mode: "copy"
input:
tuple val(sample_id), path(files)
output:
path "output_folder/"
script:
"""
Main.py ${files[0]} ${files[1]} output_folder/
"""
}
workflow {
Channel
.fromFilePairs("${params.inputDir}/*{1,2}.tsv",
checkIfExists: true)
| YOUR_PROCESS_NAME
}