#groovy #nextflow
#groovy #nextflow
Вопрос:
у меня есть процесс, который генерирует значение. Я хочу переслать это значение в канал вывода значения. но, похоже, я не могу заставить его работать за один раз — мне всегда придется генерировать файл для вывода, а затем определять новый канал из первого:
process calculate{
input:
file div from json_ch.collect()
path "metadata.csv" from meta_ch
output:
file "dir/file.txt" into inter_ch
script:
"""
echo ${div} > alljsons.txt
mkdir dir
python3 $baseDir/scripts/calculate.py alljsons.txt metadata.csv dir/
"""
}
ch = inter_ch.map{file(it).text}
ch.view()
как мне это исправить?
Спасибо!
лучше всего, т. Е.
Ответ №1:
Если ваш скрипт выполняет нетривиальное вычисление, запись результата в файл, как вы сделали, абсолютно прекрасна — в этом подходе нет ничего плохого. Однако, поскольку канал ‘inter_ch’ уже выдает файлы (или пути), вы могли бы просто использовать:
ch = inter_ch.map { it.text }
Не совсем понятно, какова здесь цель. Если вы хотите уменьшить количество создаваемых каналов, рассмотрите возможность переключения на новый DSL 2. Это не позволит вам избежать записи вычисленного результата в файл, но это может означать, что вы можете избежать промежуточного канала, потенциально.
С другой стороны, если ваш скрипт на Python действительно выполняет что-то довольно тривиальное и может быть переработан, возможно, можно назначить (глобальную) переменную (под script:
ключевым словом), чтобы на нее можно было ссылаться в вашем объявлении вывода, как в строке x = ...
в примере ниже:
Допустимыми выходными значениями являются литералы значений, идентификаторы входных значений, переменные, доступные в области процесса, и выражения значений. Например:
process foo { input: file fasta from 'dummy' output: val x into var_channel val 'BB11' into str_channel val "${fasta.baseName}.out" into exp_channel script: x = fasta.name """ cat $x > file """ }
Кроме этого, ваши возможности ограничены. Возможно, вы рассматривали возможность использования квалификатора вывода env, но это просто добавляет некоторый синтаксический сахар в ваш сценарий оболочки во время выполнения, так что выходной файл все равно создается:
Содержимое test.nf
:
process test {
output:
env myval into out_ch
script:
'''
myval=$(calc.py)
'''
}
out_ch.view()
Содержимое bin/calc.py
(chmod x):
#!/usr/bin/env python
print('foobarbaz')
Запуск с:
$ nextflow run test.nf
N E X T F L O W ~ version 21.04.3
Launching `test.nf` [magical_bassi] - revision: ba61633d9d
executor > local (1)
[bf/48815a] process > test [100%] 1 of 1 ✔
foobarbaz
$ cat work/bf/48815aeefecdac110ef464928f0471/.command.sh
#!/bin/bash -ue
myval=$(calc.py)
# capture process environment
set u
echo myval=$myval > .command.env
Комментарии:
1. Большое вам спасибо за этот подробный ответ! Мой конвейер работает — но то, как я это делал, казалось очень не лучшим -> отсюда вопрос. Спасибо — я поиграю с классификатором вывода env!