Расширить пути из канала

Мои данные структурированы как образцы, которые запускаются партиями. Итак, у меня есть такая иерархия каталогов:

/path/to/dir/batch_1/sample_1
/path/to/dir/batch_1/sample_2
/path/to/dir/batch_1/...
/path/to/dir/batch_2/sample_1
/path/to/dir/batch_2/sample_2
/path/to/dir/batch_2/...
/path/to/dir/...

Я хочу применить процесс к каждому образцу для данного подмножества пакетов. Один из эффективных подходов - создать канал, в котором перечислены образцы:

path_to_samples= Channel
    .fromPath(['/path/to/dir/batch_2/sample_*',
               '/path/to/dir/batch_322/sample_*'], type: 'dir' )

process my_process{

    input:
    path(sample) from path_to_samples

    """
    do stuff
    """
}

Теперь я хотел бы указать имена пакетов отдельно, и пусть сценарий найдет соответствующие образцы. Что-то подобное:

params.root_dir = '/path/to/dir/'
params.batch_names = Channel.from('batch_2', 'batch_322')

// make samples channel: incorrect
path_to_samples = params.batch_names
                        .map { params.root_dir + it + 'sample_*' }
                        .toPath()

process my_process{

    input:
    path(sample) from path_to_samples

    """
    do stuff
    """
}

Значит, я неправильно думаю о каналах? Есть ли способ сгладить список сэмплов с помощью операций с каналом? Или правильный подход - сделать более сложное замыкание Groovy, которое будет перечислять файлы в каждом каталоге пакета и возвращать его в виде кортежа или списка?


person Alexlok    schedule 06.11.2020    source источник


Ответы (1)


Не уверен, как вы хотите предоставить имена своих входных пакетов, но вы можете создать свой список шаблонов глобусов, используя простое закрытие, а затем использовать их для создания своего входного канала:

params.root_dir = '/path/to/dir'
params.batch_names = /path/to/batch_names.txt'

batch_names = file(params.batch_names)
sample_dirs = batch_names.readLines().collect { "${params.root_dir}/${it}/sample_*" }

samples = Channel.fromPath( sample_dirs, type: 'dir' )

process my_process{

    input:
    path(sample) from samples

    """
    ls -l "${sample}"
    """
}

Однако я был бы склонен просто оставить шаблон входного глобуса в качестве параметра. Этот подход предлагает максимальную гибкость, но может не соответствовать вашему варианту использования:

params.samples = '/path/to/dir/batch_{2,322}/sample_*'

samples = Channel.fromPath( params.samples, type: 'dir' )
person Steve    schedule 07.11.2020
comment
Спасибо! Мне не нравится решение с глобусом в моем случае, поскольку root_dir - это длинный путь, полный случайных строк, а сами имена пакетов на самом деле являются случайными строками; так что это не кажется подходящим для пользовательского ввода. - person Alexlok; 07.11.2020