Snakemake: {input: q} не возвращает ввод в кавычках

Я разрабатываю конвейер ATACseq, используя Genrich для работы со Snakemake.

Дело в том, что Genrich позволяет вызывать пики из более чем одной реплики на одном и том же шаге, избегая дополнительных шагов (например, IDR).

В Snakemake я нашел способ вернуть все образцы, которые я хочу (т. Е. Реплицировать из одного условия) в одно и то же время, но Генрих запрашивает файлы, разделенные запятыми, в качестве входных или файлов, разделенных пробелами, если каждый файл указан в кавычках.

Обычно входные данные возвращают список файлов, разделенных пробелами (то есть file1 file2 file3), и, поскольку я не знаю, как заставить его возвращать файлы, разделенные запятыми, я попытался процитировать их.

Теоретически после Snakemake версии 5.8.0 вы можете ссылаться на ввод как {input:q} в команде оболочки правила, чтобы вернуть цитируемый ввод, как сказано здесь.

Однако в моем случае возвращаемый ввод не цитируется.

Я создал тестовое правило, чтобы увидеть, как возвращается ввод:

rule genrich_merge_test:
    input:
        lambda w: expand("{condition}.sorted.bam", condition = SAMPLES.loc[SAMPLES["CONDITION"] == w.condition].NAME),
    output:
        "{condition}_peaks.narrowPeak",
    shell:
        """
        echo {input:q} > {output}     
        """

И возвращаемый ввод, который хранится в выходном файле:

rep1.sorted.bam rep2.sorted.bam

Кто-нибудь знает, как решить эту проблему и вернуть цитируемый ввод или вернуть список файлов, разделенных запятыми, вместо файлов, разделенных пробелами?

Спасибо.


person Adrià Mitjavila Ventura    schedule 26.10.2020    source источник


Ответы (2)


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

rule genrich:
    input:
        t= ['a.bam', 'b.bam'],
    ...
    shell:
        r"""
        Genrich -t '{input.t}' ...
        """

(Обратите внимание на одинарные кавычки вокруг '{input.t}')

person dariober    schedule 27.10.2020

Я думал, что эхо и оболочка может удалять кавычки перед передачей по конвейеру для вывода, но проверка с помощью snakemake -p, чтобы увидеть выполняемую команду, показывает, что их там нет. Кажется, что кавычки отображаются только с отдельными именами файлов, когда присутствуют пробелы.

Ответ Дариобера должен работать, чтобы процитировать список, но для полноты, если вам нужен список файлов, разделенных запятыми, используйте лямбда-функцию в директиве params:

rule genrich_merge_test:
    input:
        lambda w: expand("{condition}.sorted.bam", 
                         condition=SAMPLES.loc[SAMPLES["CONDITION"] == w.condition].NAME),
    params:
        files=lambda wildcards, input: ','.join(input)
    output:
        "{condition}_peaks.narrowPeak",
    shell:
        """
        echo {params.files} > {output}     
        """

РЕДАКТИРОВАТЬ

Вот игрушечный пример, демонстрирующий использование параметров с вводом:

# snakefile
inputs = expand('{wc}.out', wc=range(4))

rule all:
    input: "test_peaks.narrowPeak"

rule genrich:
    input:
        inputs
    params:
        files=lambda wildcards, input: ','.join(input)
    output:
        "test_peaks.narrowPeak",
    shell:
        """
        echo {params.files} > {output}     
        """

rule generator:
    output: touch('{file}.out')
$ snakemake -np
...
rule genrich:
    input: 0.out, 1.out, 2.out, 3.out
    output: test_peaks.narrowPeak
    jobid: 1


        echo 0.out,1.out,2.out,3.out > test_peaks.narrowPeak 
...

Также, как указано, здесь

Обратите внимание, что в отличие от директивы input, директива params может опционально принимать больше аргументов, чем только подстановочные знаки, а именно ввод, вывод, потоки и ресурсы.

person Troy Comi    schedule 27.10.2020
comment
Привет, я думаю, ','.join(input) в директиве params не работает. Директива params имеет доступ к подстановочным знакам, но не к спискам ввода / вывода. - person dariober; 27.10.2020