Как загрузить список файлов «FastQ` в» Nextflow` с помощью функции «fromSRA»?

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