Мне интересно, как извлечь содержимое канала Nextflow и сделать его строкой в блоке рабочего процесса.
Мне нужно это, например, чтобы:
Я уже пробовал .toString(), .map{}, .view() и все, что смог найти в документации.
Мне интересно, как извлечь содержимое канала Nextflow и сделать это строкой
Лучше не пытаться это сделать. Если вы просто хотите выбрать ключ карты на основе вывода процесса, вы можете просто объявить свою карту в блоке рабочего процесса и использовать ее по мере необходимости. Например:
process test {
input:
val myval
output:
path "${myval}.txt"
"""
touch "${myval}.txt"
"""
}
workflow {
def foobarbaz = ['foo': 1, 'bar': 2, 'baz': 3]
Channel.of('foo', 'bar', 'baz')
| test
| map { tuple( foobarbaz[ it.baseName ], it ) }
| view()
}
Результаты:
$ nextflow run main.nf
N E X T F L O W ~ version 22.10.0
Launching `main.nf` [high_faggin] DSL2 - revision: 43aaa56eee
executor > local (3)
[0e/0fd6dc] process > test (3) [100%] 3 of 3 ✔
[1, /path/to/work/a7/d501cb2a8426c5639117d14e8fb7fe/foo.txt]
[2, /path/to/work/22/df9cc4f1d34b9cca0d0331fac5c150/bar.txt]
[3, /path/to/work/0e/0fd6dc0519a34c52903b990755f450/baz.txt]
Обратите внимание, что вам не нужен фабричный метод watchPath для просмотра выходного пути предыдущего процесса. Просто определите выходные данные предыдущего процесса в блоке вывода и объявите их как входы в блоке ввода нижестоящего процесса. Например:
process foo {
input:
val myval
output:
path "${myval}.txt"
"""
echo "value: ${myval}" > "${myval}.txt"
"""
}
process bar {
input:
path myfile
output:
stdout
"""
echo "Contents of ${myfile}:"
cat "${myfile}"
"""
}
workflow {
Channel.of('foo', 'bar', 'baz')
| foo
| bar
| view()
}
Результаты:
$ nextflow run main.nf
N E X T F L O W ~ version 22.10.0
Launching `main.nf` [clever_lovelace] DSL2 - revision: c388bd26af
executor > local (6)
[ac/1be228] process > foo (2) [100%] 3 of 3 ✔
[11/7b3c6e] process > bar (1) [100%] 3 of 3 ✔
Contents of foo.txt:
value: foo
Contents of bar.txt:
value: bar
Contents of baz.txt:
value: baz
@LucaForlani Правильно - watchPath()
- это метод фабрики каналов, поэтому он не подходит для этого. Обычно он просто используется для наблюдения за каталогом, в который другой (внешний) процесс будет записывать файлы в какой-то момент. И обычно вы склонны заранее знать, что это за каталог. Поэтому я подозреваю, что у вас есть проблема с дизайном, но я не знаю достаточно деталей, чтобы дать какое-либо руководство на данный момент. Если вы хотите изложить проблему с некоторыми подробностями (задав еще один вопрос), я был бы рад взглянуть.
Не волнуйтесь, я тоже это понял: если кажется, что вы не можете что-то сделать в nextflow, возможно, вы должны были сделать это по-другому. Спасибо за помощь, это было бесценно :)
Спасибо, это действительно полезно. Только одна вещь о watchPath: я думал о том, чтобы получить путь для просмотра из предыдущего процесса, поскольку он является переменным, а не фиксированным, но кажется, что watchPath() принимает только строки в качестве аргумента.