Как вызвать пересылку значения переменной, созданной в скрипте в Nextflow, в канал вывода значения?

#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!