Nextflow Channel создать с условием

[Kasumi_H3K36, Kasumi_IgG, /mnt/Data/cut_and_tag/work/d0/3db2bde9eb1bdb0578073fb128bc4c/Kasumi_H3K36.no0.bedgraph]
[Kasumi_JMJD1C, Kasumi_IgG, /mnt/Data/cut_and_tag/work/b1/dffe2120acda5b05860e1a3bb0c1bf/Kasumi_JMJD1C.no0.bedgraph]
[Kasumi_NCOR1, Kasumi_IgG, /mnt/Data/cut_and_tag/work/9f/7c3680a1ff0ae0a5a27f42e1a27225/Kasumi_NCOR1.no0.bedgraph]
[Kasumi_IgG, Kasumi_IgG, /mnt/Data/cut_and_tag/work/21/1038cd4ecbc5b3f88da23ad1ee3147/Kasumi_IgG.no0.bedgraph]
[Kasumi_H4K5, Kasumi_IgG, /mnt/Data/cut_and_tag/work/3d/7b5239ab9dc83b00f992fea8926630/Kasumi_H4K5.no0.bedgraph]

Это один из моих просмотров канала. Я пытаюсь создать новый канал управления, когда первый и второй идентификаторы совпадают, а остальные - как образец канала.


person Shikan    schedule 20.12.2020    source источник


Ответы (1)


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

nextflow.enable.dsl=2

Channel
    .of(
        ['Kasumi_H3K36', 'Kasumi_IgG', file('/mnt/Data/cut_and_tag/work/d0/3db2bde9eb1bdb0578073fb128bc4c/Kasumi_H3K36.no0.bedgraph')],
        ['Kasumi_JMJD1C', 'Kasumi_IgG', file('/mnt/Data/cut_and_tag/work/b1/dffe2120acda5b05860e1a3bb0c1bf/Kasumi_JMJD1C.no0.bedgraph')],
        ['Kasumi_NCOR1', 'Kasumi_IgG', file('/mnt/Data/cut_and_tag/work/9f/7c3680a1ff0ae0a5a27f42e1a27225/Kasumi_NCOR1.no0.bedgraph')],
        ['Kasumi_IgG', 'Kasumi_IgG', file('/mnt/Data/cut_and_tag/work/21/1038cd4ecbc5b3f88da23ad1ee3147/Kasumi_IgG.no0.bedgraph')],
        ['Kasumi_H4K5', 'Kasumi_IgG', file('/mnt/Data/cut_and_tag/work/3d/7b5239ab9dc83b00f992fea8926630/Kasumi_H4K5.no0.bedgraph')],
    ) \
    .branch { sample1, sample2, bedgraph ->
        controls: sample1 == sample2
            return tuple( sample1, sample2, bedgraph )
        others: true
            return tuple( sample1, sample2, bedgraph )
    } \
    .set { inputs } 

inputs.controls.view { "controls: $it" } 
inputs.others.view { "others: $it" }

Полученные результаты:

others: [Kasumi_H3K36, Kasumi_IgG, /mnt/Data/cut_and_tag/work/d0/3db2bde9eb1bdb0578073fb128bc4c/Kasumi_H3K36.no0.bedgraph]
controls: [Kasumi_IgG, Kasumi_IgG, /mnt/Data/cut_and_tag/work/21/1038cd4ecbc5b3f88da23ad1ee3147/Kasumi_IgG.no0.bedgraph]
others: [Kasumi_JMJD1C, Kasumi_IgG, /mnt/Data/cut_and_tag/work/b1/dffe2120acda5b05860e1a3bb0c1bf/Kasumi_JMJD1C.no0.bedgraph]
others: [Kasumi_NCOR1, Kasumi_IgG, /mnt/Data/cut_and_tag/work/9f/7c3680a1ff0ae0a5a27f42e1a27225/Kasumi_NCOR1.no0.bedgraph]
others: [Kasumi_H4K5, Kasumi_IgG, /mnt/Data/cut_and_tag/work/3d/7b5239ab9dc83b00f992fea8926630/Kasumi_H4K5.no0.bedgraph]

Обновление из комментариев:

Channel
    .of(
        ['Kasumi_H3K36', 'Kasumi_IgG', file('/path/to/Kasumi_H3K36.no0.bedgraph')],
        ['Kasumi_JMJD1C', 'Kasumi_IgG', file('/path/to/Kasumi_JMJD1C.no0.bedgraph')],
        ['Kasumi_NCOR1', 'Kasumi_IgG', file('/path/to/Kasumi_NCOR1.no0.bedgraph')],
        ['Kasumi_IgG', 'Kasumi_IgG', file('/path/to/Kasumi_IgG.no0.bedgraph')],
        ['Kasumi_H4K5', 'Kasumi_IgG', file('/path/to/Kasumi_H4K5.no0.bedgraph')],
        ['NB4_H3K36', 'NB4_IgG', file('/path/to/NB4_H3K36.no0.bedgraph')],
        ['NB4_JMJD1C', 'NB4_IgG', file('/path/to/NB4_JMJD1C.no0.bedgraph')],
        ['NB4_NCOR1', 'NB4_IgG', file('/path/to/NB4_NCOR1.no0.bedgraph')],
        ['NB4_IgG', 'NB4_IgG', file('/path/to/NB4_IgG.no0.bedgraph')],
        ['NB4_H4K5', 'NB4_IgG', file('/path/to/NB4_H4K5.no0.bedgraph')],
    ) \
    .branch { test_sample, control_sample, bedgraph ->
        control_samples: test_sample == control_sample
            return tuple( control_sample, tuple( test_sample, bedgraph ) )
        test_samples: true
            return tuple( control_sample, tuple( test_sample, bedgraph ) )
    } \
    .set { inputs }

inputs.test_samples
    .combine( inputs.control_samples, by: 0 ) \
    .map { group, test_tuple, control_tuple ->
        tuple( *test_tuple, *control_tuple )
    } \
    .view()

Полученные результаты:

[Kasumi_H3K36, /path/to/Kasumi_H3K36.no0.bedgraph, Kasumi_IgG, /path/to/Kasumi_IgG.no0.bedgraph]
[Kasumi_JMJD1C, /path/to/Kasumi_JMJD1C.no0.bedgraph, Kasumi_IgG, /path/to/Kasumi_IgG.no0.bedgraph]
[Kasumi_NCOR1, /path/to/Kasumi_NCOR1.no0.bedgraph, Kasumi_IgG, /path/to/Kasumi_IgG.no0.bedgraph]
[Kasumi_H4K5, /path/to/Kasumi_H4K5.no0.bedgraph, Kasumi_IgG, /path/to/Kasumi_IgG.no0.bedgraph]
[NB4_H3K36, /path/to/NB4_H3K36.no0.bedgraph, NB4_IgG, /path/to/NB4_IgG.no0.bedgraph]
[NB4_JMJD1C, /path/to/NB4_JMJD1C.no0.bedgraph, NB4_IgG, /path/to/NB4_IgG.no0.bedgraph]
[NB4_NCOR1, /path/to/NB4_NCOR1.no0.bedgraph, NB4_IgG, /path/to/NB4_IgG.no0.bedgraph]
[NB4_H4K5, /path/to/NB4_H4K5.no0.bedgraph, NB4_IgG, /path/to/NB4_IgG.no0.bedgraph]
person Steve    schedule 21.12.2020
comment
Большое спасибо! - person Shikan; 21.12.2020
comment
Сегодня я создаю новую среду conda для моего конвейера. Код прошел вчера с использованием базовой среды, но сегодня произошла ошибка при использовании новой среды. ошибка: [разминка] исполнитель ›локальная ОШИБКА ~ Нет сигнатуры метода: groovyx.gpars.dataflow.DataflowQueue.branch () применима для типов аргументов: (_nf_script_a5c6c25c $ _run_closure11) значения: [_nf_script_a5c6c25c $ _run_closure11] Возможные решения: каждый (groovy.lang.Closure), mean (), print (), any (), bind (java.lang.Object), любой (groovy.lang.Closure) - person Shikan; 21.12.2020
comment
@Shikan: не беспокойтесь, какую версию Nextflow вы используете? Филиалу требуется 19.08.0-edge или новее. - person Steve; 22.12.2020
comment
Версия Nextflow - 19.01.0 - person Shikan; 22.12.2020
comment
@Shikan: да, вам понадобится более новая версия, чтобы использовать оператор ветки. Попробуйте nextflow self-update - person Steve; 22.12.2020
comment
Извините, у меня есть еще вопросы. На самом деле я использую nextflow для написания конвейера. Я применяю SEACR к своему конвейеру. Вы видели эту ошибку? Ошибка в read.table (argsL $ exp): на входе нет доступных строк Выполнение остановлено - person Shikan; 22.12.2020
comment
@Shikan: Я думаю, это похоже на проблему с командой R, используемой SEACR. Убедитесь, что ваш входной файл правильно локализован в рабочем каталоге процесса и не пуст. «Нет доступных строк» ​​означает, что файл локализуется, но это просто пустой файл. HTH. - person Steve; 22.12.2020
comment
Я проверил, есть ли файлы и они не пустые - person Shikan; 22.12.2020
comment
Я просмотрел файлы постельного белья. В четвертом столбце все нули. Я думаю, что это, вероятно, вызывает проблему - person Shikan; 22.12.2020
comment
Я использую эти входы (изменение, чтобы вернуть только два элемента, sample_id и bedgraph) input: set val (sample_id), file (bed_samples) из samples_controls_ch.samples set val (sample_id_control), file (bed_controls) из samples_controls_ch.controls, однако, когда я запускаю сценарий bash SEACR_1.3.sh $ {bed_samples} $ {bed_controls} нестрогий $ {sample_id}, он запускает только один образец - person Shikan; 22.12.2020
comment
Если ваш канал «control» должен быть каналом значений, вы можете просто вызвать «collect», то есть set val(sample_id_control), file(bed_controls) from samples_controls_ch.controls.collect(). См. Понять, как несколько входных каналов работа. - person Steve; 22.12.2020
comment
В приведенном выше примере у меня есть образец Касуми для сравнения с элементом управления Касуми. Если у меня есть более одного набора сравнений. как и другой образец группы NB4 с контролем NB4. Как мне настроить правильный ввод, чтобы сравнение соответствовало друг другу? - person Shikan; 22.12.2020
comment
Если у меня есть два входа с разным количеством файлов, как мне ввести эти файлы. Это дало мне ошибку (неожиданный EOF при поиске соответствия '') - person Shikan; 22.12.2020
comment
@Shikan: Я обновил свой ответ тем, что я думаю вы ищете в своем первом вопросе. Извините, я не понимаю вашего второго. Вы можете задать другой вопрос и добавить дополнительные сведения. - person Steve; 23.12.2020