【发布时间】:2021-11-18 05:38:16
【问题描述】:
我的工作流输出一个主目录,我从使用 DSL2 的进程中发出该主目录。我将此输出提供给 python 脚本,该脚本可以轻松地循环遍历子目录及其各自的文件,提取信息并将其编译成 .tsv
python 脚本获取的两个重要信息是子目录的名称以及子目录中哪个文件实际上很重要。
我想将我的进程输出(“根目录”)+ 子目录(来自文件)+ 重要文件名(来自文件)并使其成为新的生成器路径以提供给另一个进程。
我只是使用了一个糟糕的方法吗?有没有更好的方法来访问生成器?在我看到的文档中订阅,但我没有运气使用这个功能。提前谢谢你。
示例 .tsv 文件(第 1 列和第 3 列是我要附加到生成器的内容)
GCF_000005845.2 Escherichia coli str. K-12 substr. MG1655, complete genome GCF_000005845.2_ASM584v2_genomic.fna
GCF_000008865.2 Escherichia coli O157:H7 str. Sakai DNA, complete genome GCF_000008865.2_ASM886v2_genomic.fna
工作目录结构
├── c6
│ └── 6598d4838f61d0421f03216990465c
│ ├── ecoli
│ │ ├── README.md
│ │ └── ncbi_dataset
│ │ ├── data
│ │ │ ├── GCF_000005845.2
│ │ │ │ ├── GCF_000005845.2_ASM584v2_genomic.fna
│ │ │ │ ├── genomic.gff
│ │ │ │ ├── protein.faa
│ │ │ │ └── sequence_report.jsonl
│ │ │ ├── GCF_000008865.2
│ │ │ │ ├── GCF_000008865.2_ASM886v2_genomic.fna
│ │ │ │ ├── genomic.gff
│ │ │ │ ├── protein.faa
│ │ │ │ └── sequence_report.jsonl
│ │ │ ├── assembly_data_report.jsonl
│ │ │ └── dataset_catalog.json
│ │ └── fetch.txt
这是我的 nextflow 脚本(非常欢迎建设性的批评):
#!/usr/bin/env Nextflow
nextflow.enable.dsl=2
workflow {
//ref_genome_ch = Channel.fromPath("$params.ref_genome")
println([params.taxon, params.zipName, params.unzippedDir])
DOWNLOAD_ZIP(params.taxon, params.zipName)
UNZIP(DOWNLOAD_ZIP.out.zipFile)
REHYDRATE(UNZIP.out.unzippedDir)
COLLECT_NAMES(REHYDRATE.out.dataDir)
// I want to get the dir name and file name out of
// relations.txt
//thing = Channel.from( )
//thing.view()
//organism_genomes = REHYDRATE.out.dataDir.subscribe { println("$it/")}
}
process DOWNLOAD_ZIP {
errorStrategy 'ignore'
input:
val taxonName
val zipName
output:
path "${zipName}" , emit: zipFile
script:
def reference = params.reference
"""
datasets download genome \\
taxon '${taxonName}' \\
--dehydrated \\
--filename ${zipName} \\
${reference} \\
--exclude-genomic-cds
"""
}
process UNZIP {
input:
path zipFile
output:
path "${zipFile.baseName}" , emit: unzippedDir
script:
"""
unzip $zipFile -d ${zipFile.baseName}
"""
}
process REHYDRATE {
input:
path unzippedDir
output:
path "$unzippedDir/ncbi_dataset/data" , emit: dataDir
script:
"""
datasets rehydrate \\
--directory $unzippedDir
"""
}
process COLLECT_NAMES {
publishDir params.results
input:
path dataDir
output:
path "relations.txt" , emit: org_names
script:
"""
python "$baseDir/bin/collect_org_names.py" $dataDir
"""
}
编辑:用户@Steve 推荐频道运营商。我还没有完全理解 groovy {thing -> stuff} 语法,但我尝试过这样做:
thing = REHYDRATE.out.dataDir.map{"$it/*"}
thing.view()
我明白了
/mnt/c/Users/mkozubov/Desktop/nextflow_tutorial/tRNA_stuff/work/d0/long_hash/ecoli/ncbi_dataset/data/*
printed... 但是当我将它输入到只有一个脚本的进程中时: println(input) 我收到一条错误消息,指出执行的命令为空,命令输出为(空)并且目标“*”为不是目录。
我的问题是,为什么 .map 运算符没有像在频道中输入“PATH/*”那样扩展 *?
Edit2:我觉得我几乎拥有了一些东西。我更改了 COLLECT_NAMES 脚本的输出以包含文件的路径。我现在想解析这个文件并将内容读入一个频道。为此我做到了
organism_genome_files = Channel.from()
COLLECT_NAMES.out.org_names.map {
new File(it.toString()).eachLine { line ->
organism_genome_files << line.split('\t')[3] }
}
如果我将organism_genome_files << line.split('\t')[3] 替换为println line.split('\t')[3],我可以看到我想要的内容,但我似乎无法找到提取此信息的方法。
我也尝试了将organism_genome_files 作为列表,但似乎没有任何效果,我似乎无法从频道中提取信息并有效地对其进行变异。
.splitCSV() 方法似乎很有用,但我仍然不明白如何让一个通道作为另一个通道的输入 :(
【问题讨论】: