Я пытаюсь запустить процесс, только если выполняется комбинация условий, но при проверке того, есть ли у канала путь к файлу, он всегда возвращает его как пустой. Возможно, я что-то делаю не так, в таком случае исправьте мой код. Я попытался выполнить некоторые предложения в этой проблеме, но безуспешно.
Рассмотрим следующий минимальный пример:
process one {
output:
file("test.txt") into _chProcessTwo
script:
"""
echo "Hello world" > "test.txt"
"""
}
// making a copy so I check first if something in the channel or not
// avoids raising exception of MultipleInputChannel
_chProcessTwo.into{
_chProcessTwoView;
_chProcessTwoCheck;
_chProcessTwoUse
}
//print contents of channel
println "Channel contents: " + _chProcessTwoView.toList().view()
process two {
input:
file(myInput) from _chProcessTwoUse
when:
(!_chProcessTwoCheck.toList().isEmpty())
script:
def test = _chProcessTwoUse.toList().isEmpty() ? "I'm empty" : "I'm NOT empty"
println "The outcome is: " + test
}
Я хочу, чтобы процесс два запускался тогда и только тогда, когда в канале _chProcessTwo
есть файл. Если я запустил приведенный выше код, я получу:
marius@dev:~/pipeline$ ./bin/nextflow run test.nf
N E X T F L O W ~ version 19.09.0-edge
Launching `test.nf` [infallible_gutenberg] - revision: 9f57464dc1
[c8/bf38f5] process > one [100%] 1 of 1 ✔
[- ] process > two -
[/home/marius/pipeline/work/c8/bf38f595d759686a497bb4a49e9778/test.txt]
где последняя строка на самом деле является содержимым _chProcessTwoView
Если я удалю директиву when
из второго процесса, я получу:
marius@mg-dev:~/pipeline$ ./bin/nextflow run test.nf
N E X T F L O W ~ version 19.09.0-edge
Launching `test.nf` [modest_descartes] - revision: 5b2bbfea6a
[57/1b7b97] process > one [100%] 1 of 1 ✔
[a9/e4b82d] process > two [100%] 1 of 1 ✔
[/home/marius/pipeline/work/57/1b7b979933ca9e936a3c0bb640c37e/test.txt]
с содержимым второго рабочего .command.log
файла: The outcome is: I'm empty
Я пробовал также без toList()
Что я делаю неправильно? заранее спасибо
Обновление: обходной путь - проверить _chProcessTwoUse.view() != ""
, но это довольно грязно
Обновление 2, как того требует @Steve, я обновил код, чтобы немного лучше отразить фактические условия, которые есть в моем собственном конвейере:
def runProcessOne = true
process one {
when:
runProcessOne
output:
file("inputProcessTwo.txt") into _chProcessTwo optional true
file("inputProcessThree.txt") into _chProcessThree optional true
script:
// this would replace the probability that output is not created
def outputSomething = false
"""
if ${outputSomething}; then
echo "Hello world" > "inputProcessTwo.txt"
echo "Goodbye world" > "inputProcessThree.txt"
else
echo "Sorry. Process one did not write to file."
fi
"""
}
// making a copy so I check first if something in the channel or not
// avoids raising exception of MultipleInputChannel
_chProcessTwo.into{
_chProcessTwoView;
_chProcessTwoCheck;
_chProcessTwoUse
}
//print contents of channel
println "Channel contents: " + _chProcessTwoView.view()
println _chProcessTwoView.view() ? "Me empty" : "NOT empty"
process two {
input:
file(myInput) from _chProcessTwoUse
when:
(runProcessOne)
script:
"""
echo "The outcome is: ${myInput}"
"""
}
process three {
input:
file(defaultInput) from _chUpstreamProcesses
file(inputFromProcessTwo) from _chProcessThree
script:
def extra_parameters = _chProcessThree.isEmpty() ? "" : "--extra-input " + inputFromProcessTwo
"""
echo "Hooray! We got: ${extra_parameters}"
"""
}
Как упомянул @Steve, я не должен даже проверять, пуст ли канал, NextFlow лучше знать, чтобы не инициировать процесс. Но я думаю, что в этой конструкции мне придется.
Мариус
isEmpty()
работает должным образом. Обычно вам не нужно проверять, пуст ли канал. В приведенном выше примере процесс «два» не будет запущен, если_chProcessTwoUse
пуст. Можете ли вы показать, как создается ваш входной канал, и некоторые примеры условий? - person Steve   schedule 01.10.2020