Nextflow - Как избежать случайных идентификаторов выборки для входных файлов в двух или более каналах с помощью оператора Join или аналогичного?

Я реализовал некоторые рабочие процессы анализа данных NGS с помощью Nextflow. Я использовал парные конечные каналы (метод fromFilePairs) для некоторых своих рабочих процессов. У меня возникла проблема, которой я не ожидал после выполнения нескольких рабочих процессов: мои идентификаторы образцов иногда смешивались, что приводило к неточным выводам для процессов, в которых это произошло. Я думаю, это связано с проблемой недетерминированных входных каналов (https://www.nextflow.io/blog/2019/troubleshooting-nextflow-resume.html).

Предположим, я применил свой рабочий процесс к этим файлам с парным концом: sample1_R {1,2} .fastq, sample2_R {1,2} .fastq

process Step1 {
    input:
        tuple pair_ID, file(A) from channelA
        tuple pair_ID, file(B) from channelB
        tuple pair_ID, file(C) from channelC
...
}

Для этого типа процесса с более чем одним кортежем pair_ID в качестве входных данных пара_ID данных (= имена моих образцов) может быть перепутана, и мой процесс в конечном итоге будет использовать случайные входные файлы A и B из < strong> sample1 и входной файл C из sample2 вместо всех файлов (A, B, C) из тот же pair_ID (ключ = only sample1 или only sample2). У меня возникла эта проблема со случайно смешанными именами входных файлов (которая повлияла на выходные данные) после нескольких выполнений рабочего процесса, после использования -resume при возникновении ошибки, но также после полного успешного выполнения рабочего процесса.

Чтобы иметь один и тот же ключ (pair_ID) между входными файлами, испускаемыми каждым из 3 каналов, я использовал оператор join:

Process Step1 {
    input:
        tuple pair_ID, file(A), file(B), file(C) from channelA.join(channelB).join(channelC)
...
}

Этот оператор, кажется, заставляет все работать так, как ожидалось, я не вижу никакого смешения в своих идентификаторах образцов и в моих окончательных результатах. В документе (https://www.nextflow.io/docs/latest/operator.html?highlight=join#join), join, похоже, подходит только для двух каналов, поэтому я не уверен, правильно ли я использую его для трех каналов.

Подходит ли мой метод join? Или все еще есть недостатки? Есть ли лучший способ исправить мою проблему? Если я не уверен, что этот метод является правильным, чтобы избежать смешения в моем идентификаторе образцов, я мог бы перейти на другую систему управления рабочим процессом, такую ​​как Snakemake, но я бы действительно хотел бы решить эту проблему и продолжить использование Nextflow.

Заранее спасибо, не сомневайтесь, если что-то непонятно!


person Neul Hyo    schedule 17.09.2020    source источник
comment
Если вы не получили здесь ответа, подумайте о том, чтобы спросить на канале nextflow chat / nextflow gitter: gitter.im/ nextflow-io / nextflow, который кажется намного более активным. В группах Google также есть список рассылки nextflow: groups.google.com/g/nextflow.   -  person Timur Shtatland    schedule 17.09.2020
comment
Спасибо, я уже спрашивал об этом в gitter, и я только что спросил об этом в группе Google, благодаря вашему совету.   -  person Neul Hyo    schedule 17.09.2020


Ответы (1)


Как вы обнаружили, вам следует избегать использования одного и того же имени переменной (pair_ID) более одного раза в вашем блоке ввода. Использование одного и того же имени переменной не гарантирует, что входы будут объединены с помощью этого ключа. Я предполагаю, что любое значение, которое вы получите для pair_ID из одного входного канала, будет просто заторможено идентификатором pair_ID, который вы получите из одного из ваших других входных каналов. Вы также обнаружили, что когда вы объявляете два или более входных канала, общий порядок входных данных может быть непоследовательным при нескольких выполнениях (например, при использовании -resume).

Чтобы объединить два или более каналов с общим ключом, вы можете просто использовать оператор соединения.:

присоединиться

Оператор соединения создает канал, который объединяет элементы, передаваемые двумя каналами, для которых выходит совпадающий ключ. По умолчанию ключ определяется как первый элемент в каждом отправляемом элементе.

Обратите внимание, что оператор соединения создает (возвращает) новый канал. Следовательно, это:

joined = channelA.join(channelB).join(channelC)

Функционально аналогичен:

temp = channelA.join(channelB)
joined = temp.join(channelC)
person Steve    schedule 21.09.2020