#bioinformatics #nextflow
Вопрос:
У меня есть tsv
файл с различными столбцами. Одна из колонок, представляющих для меня интерес, — это run_accession
колонка. Он содержит идентификатор присоединения различных образцов данных генома. Я хочу написать конвейер, в Nextflow
котором считываются идентификаторы присоединения из этого файла, используя следующую команду:
cut -f4 datalist.tsv | sed -n 2,11p
Выход:
ERR2512385
ERR2512386
ERR2512387
ERR2512388
ERR2512389
ERR2512390
ERR2512391
ERR2512392
ERR2512393
ERR2512394
и введите этот список идентификаторов в Channel.fromSRA
метод. До сих пор я пробовал это:
#!/home/someuser/bin nextflow
nextflow.enable.dsl=2
params.datalist = "$baseDir/datalist.tsv"
process fetchRunAccession {
input:
path dlist
output:
file accessions
"""
cut -f4 $dlist | sed -n 2,11p
"""
}
process displayResult {
input:
file accessions
output:
stdout
"""
echo "$accessions"
"""
}
workflow {
accessions_p = fetchRunAccession(params.datalist)
result = displayResult(accessions_p)
result.view { it }
}
И я получаю эту ошибку:
Error executing process > 'fetchRunAccession'
Caused by:
Missing output file(s) `accessions` expected by process `fetchRunAccession
Если я запущу только первый процесс, он будет работать хорошо и напечатает 10 строк, как и ожидалось. Второй процесс-это просто заполнитель для фактической fromSRA
реализации, но я не смог использовать выходные данные первого процесса в качестве входных данных второго. Я очень новичок в Nextflow, и в моем коде, вероятно, есть несколько глупых ошибок. Я был бы признателен за любую помощь в этом вопросе.
Ответ №1:
Функция fromSRA на самом деле является фабричным методом. Для этого требуется либо идентификатор проекта/исследования, либо один или несколько номеров присоединения, которые должны быть указаны в виде списка. Канал, выдающий присоединительные номера (как в вашем примере кода), здесь не будет работать. Кроме того, было бы лучше избегать создания отдельного задания/процесса только для анализа небольшого файла CSV. Вместо этого просто позвольте вашему основному процессу Nextflow сделать это. Есть много способов сделать это, но для ввода CSV я нахожу, что использование класса CsvSplitter Nextflow упрощает это:
import nextflow.splitter.CsvSplitter
nextflow.enable.dsl=2
def fetchRunAccessions( tsv ) {
def splitter = new CsvSplitter().options( header:true, sep:'t' )
def reader = new BufferedReader( new FileReader( tsv ) )
splitter.parseHeader( reader )
List<String> run_accessions = []
Map<String,String> row
while( row = splitter.fetchRecord( reader ) ) {
run_accessions.add( row['run_accession'] )
}
return run_accessions
}
workflow {
accessions = fetchRunAccessions( params.filereport )
Channel
.fromSRA( accessions )
.view()
}
Обратите внимание, что URL-адрес загрузки ENA Nextflow был недавно обновлен. Вам понадобится последняя версия Nextflow (21.07.0-edge), чтобы легко запустить ее:
NXF_VER=21.07.0-edge nextflow run test.nf --filereport filereport.tsv
Комментарии:
1. Спасибо вам за помощь. Да, мне потребовалось некоторое время, чтобы понять, что мне нужно использовать
edge
release для использованияfromSRA
. Вы также правы , заявив, что мне не нужен выделенный блок процессов только для чтения столбцов изcsv
, еще раз спасибо вам за то, что указали на это. Ваше решение-это именно то, что я хотел сделать. Я не знал, что мы могли использоватьList
иMap
откудаJava
!