В настоящее время я создаю конвейер обработки для кДНК, и процесс в моем конвейере выводит 7 разных файлов fastq в массиве с 7 элементами идентификатора, которые являются метаданными, мне нужно, чтобы он был отформатирован таким образом, чтобы идентификатор был связан с fastq файл с тем же идентификатором, и в настоящее время я получаю идентификаторы в паре с файлами fastq в том порядке, в котором они были созданы на предыдущем шаге.
Рассматриваемый канал до использования функции транспонирования выглядит так:
[
[
[id:L5ad_T1, single_end:true],
[id:L5Cd_T1, single_end:true],
[id:L5Ac_T1, single_end:true],
[id:L5Cc_T1, single_end:true],
[id:L5Ab_T1, single_end:true],
[id:L5Aa_T1, single_end:true],
[id:L5Ca_T1, single_end:true]
],
[/flexbar_trimmed_NNNACTCAGC_L5Cc.fastq,
/flexbar_trimmed_NNNATTAGC_L5Ab.fastq,
/flexbar_trimmed_NNNCGCTTAGC_L5ad.fastq,
/flexbar_trimmed_NNNCTAGC_L5Ca.fastq,
/flexbar_trimmed_NNNGACTTAGC_L5Cd.fastq,
/flexbar_trimmed_NNNGCGCAGC_L5Ac.fastq,
/flexbar_trimmed_NNNTAAGC_L5Aa.fastq
]
]
Перед использованием функции транспонирования данных в канале:
[[id:L5ad_T1, single_end:true], /flexbar_trimmed_NNNACTCAGC_L5Cc.fastq][[id:L5Cd_T1, single_end:true], /flexbar_trimmed_NNNATTAGC_L5Ab.fastq][[id:L5Ac_T1, single_end:true], /flexbar_trimmed_NNNCGCTTAGC_L5ad.fastq][[id:L5Cc_T1, single_end:true], /flexbar_trimmed_NNNCTAGC_L5Ca.fastq]
[[id:L5Ab_T1, single_end:true], /flexbar_trimmed_NNNGACTTAGC_L5Cd.fastq]
[[id:L5Aa_T1, single_end:true], /flexbar_trimmed_NNNGCGCAGC_L5Ac.fastq]
[[id:L5Ca_T1, single_end:true], /flexbar_trimmed_NNNTAAGC_L5Aa.fastq]
Хотя это правильный формат, метаданные идентификатора теперь связаны с неправильным файлом fastq, идеальным результатом будет, например, первая пара:
[[id:L5ad_T1, single_end:true], /flexbar_trimmed_NNNCGCTTAGC_L5ad.fastq]
Есть ли способ связать правильный идентификатор с правильным файлом?
Один из способов — создать карту метаданных и карту файлов FASTQ, где каждая карта имеет одинаковые ключи. Затем мы можем просто просмотреть одну из карт и найти значение ключа в другой. Оператор flatMap можно использовать для выравнивания вывода, чтобы каждый элемент испускался отдельно. Например:
ch = Channel.of(
[
[
[id:'L5ad_T1', single_end:true],
[id:'L5Cd_T1', single_end:true],
[id:'L5Ac_T1', single_end:true],
[id:'L5Cc_T1', single_end:true],
[id:'L5Ab_T1', single_end:true],
[id:'L5Aa_T1', single_end:true],
[id:'L5Ca_T1', single_end:true]
],
[
file('/dir/flexbar_trimmed_NNNACTCAGC_L5Cc.fastq'),
file('/dir/flexbar_trimmed_NNNATTAGC_L5Ab.fastq'),
file('/dir/flexbar_trimmed_NNNCGCTTAGC_L5ad.fastq'),
file('/dir/flexbar_trimmed_NNNCTAGC_L5Ca.fastq'),
file('/dir/flexbar_trimmed_NNNGACTTAGC_L5Cd.fastq'),
file('/dir/flexbar_trimmed_NNNGCGCAGC_L5Ac.fastq'),
file('/dir/flexbar_trimmed_NNNTAAGC_L5Aa.fastq')
]
]
)
workflow {
ch.flatMap { meta_list, fastq_list ->
def meta_map = meta_list.collectEntries { meta ->
[ meta.id.split('_').first(), meta ]
}
def fastq_map = fastq_list.collectEntries { fastq ->
[ fastq.simpleName.split('_').last(), fastq ]
}
meta_map.collect { k, v -> [v, fastq_map[k]] }
}
.view()
}
Полученные результаты:
$ nextflow run main.nf
N E X T F L O W ~ version 23.04.1
Launching `main.nf` [happy_waddington] DSL2 - revision: 345d777205
[[id:L5ad_T1, single_end:true], /dir/flexbar_trimmed_NNNCGCTTAGC_L5ad.fastq]
[[id:L5Cd_T1, single_end:true], /dir/flexbar_trimmed_NNNGACTTAGC_L5Cd.fastq]
[[id:L5Ac_T1, single_end:true], /dir/flexbar_trimmed_NNNGCGCAGC_L5Ac.fastq]
[[id:L5Cc_T1, single_end:true], /dir/flexbar_trimmed_NNNACTCAGC_L5Cc.fastq]
[[id:L5Ab_T1, single_end:true], /dir/flexbar_trimmed_NNNATTAGC_L5Ab.fastq]
[[id:L5Aa_T1, single_end:true], /dir/flexbar_trimmed_NNNTAAGC_L5Aa.fastq]
[[id:L5Ca_T1, single_end:true], /dir/flexbar_trimmed_NNNCTAGC_L5Ca.fastq]
Большое спасибо за подробное объяснение и помощь, с небольшой адаптацией, которая сделала то, что мне было нужно в моем конвейере.
Transpose предполагает, что у вас есть оба списка в одном и том же порядке, что не похоже на это... Так что в какой-то момент вам придется сортировать тот или иной из ваших списков.