Snakemake, RNA-seq: Как я могу выполнить одну часть конвейера или другую часть в зависимости от характеристик анализируемого образца?

Я использую snakemake для разработки конвейера анализа данных RNAseq. Хотя мне это удалось, я хочу сделать свой конвейер максимально адаптируемым и сделать его способным работать с данными одиночного чтения (SE) или данными парного конца (PE) в рамках одного и того же анализа, вместо анализа данных SE в одном прогоне и данных PE в другом.

Предполагается, что мой конвейер будет выглядеть так:

  • загрузка набора данных, который дает 1 файл (данные SE) или 2 файла (данные PE) - ›
  • набор правил для 1 файла ИЛИ набор правил B для 2 файлов - ›
  • правило, которое берет 1 или 2 входных файла и объединяет их / их в один выходной - ›
  • окончательный набор правил.

Примечание: все правила A имеют 1 вход и 1 выход, все правила B имеют 2 входа и 2 выхода, и их соответствующие команды выглядят так:

  • 1 ввод: somecommand -i {input} -o {output}
  • 2 входа: somecommand -i1 {input1} -i2 {input2} -o1 {output1} -o2 {output2}

Примечание 2: кроме различий во входах / выходах, все правила наборов A и B имеют одинаковые команды, параметры / и т. Д.

Другими словами, я хочу, чтобы мой конвейер имел возможность переключаться между выполнением набора правил A или набора правил B в зависимости от образца, либо предоставляя ему информацию об образце в файле конфигурации в начале (образец 1 является SE, образец 2 - PE ... это известно заранее) или запрос snakemake подсчитывает количество файлов после загрузки набора данных, чтобы выбрать правильный следующий набор правил для каждого образца. Если вы видите другой способ сделать это, можете рассказать об этом.

Я думал об использовании контрольных точек, функций ввода и оператора if / else, но мне не удалось решить с ними свою проблему.

Есть ли у вас какие-нибудь подсказки / советы / способы сделать это переключение возможным?


person athiebaut    schedule 09.08.2020    source источник


Ответы (1)


Если вы заранее знаете макет, то самым простым способом было бы сохранить его в какой-нибудь переменной, примерно так (или, в качестве альтернативы, вы читаете это из файла конфигурации в словаре):

layouts = {"sample1": "paired", "sample2": "single", ... etc}

Затем вы можете объединить свое правило следующим образом (я предполагаю, что вы говорите об обрезке и выравнивании, так что это мой пример):

ruleorder: B > A

rule A:
    input:
        {sample}.fastq.gz
    output:
        trimmed_{sample}.fastq.gz
    shell:
        "somecommand -i {input} -o {output}"

rule B:
    input:
        input1={sample}_R1.fastq.gz,
        input2={sample}_R2.fastq.gz
    output:
        output1=trimmed_{sample}_R1.fastq.gz,
        output2=trimmed_{sample}_R2.fastq.gz
    shell:
        "somecommand -i1 {input.input1} -i2 {input.input2} -o1 {output.output1} -o2 {output.output2}"


def get_fastqs(wildcards):
    output = dict()
    if layouts[wildcards.sample] == "single":
        output["input"] = "trimmed_sample2.fastq.gz"
    elif layouts[wildcards.sample] == "paired":
        output["input1"] = "trimmed_sample1_R1.fastq.gz"
        output["input2"] = "trimmed_sample1_R2.fastq.gz"
    return output


rule alignment:  
    def input:
        unpack(get_fastqs)
    def output:
        somepath/{sample}.bam
    shell:
        ...

Здесь много чего происходит.

  • Прежде всего вам нужен порядок правил, чтобы snakemake знал, как обрабатывать неоднозначные случаи.
  • Правило A и B должны существовать (если только вы не взломаете выходные файлы).
  • Правилу выравнивания нужна функция ввода, чтобы определить, какой ввод требуется.

Немного саморекламы: я создал конвейер snakemake, который выполняет множество функций, включая RNA-seq, загрузку образцов в Интернете и автоматическое определение их макета (односторонний или парный). Посмотрите, решит ли это вашу проблему: https://vanheeringen-lab.github.io/seq2science/content/workflows/rna_seq.html


ИЗМЕНИТЬ:

  1. Когда вы говорите «правила слияния», вы имеете в виду правило A, B и выравнивание?

Для меня это была непонятная формулировка. С помощью слияния я имел в виду объединить логику одностороннего, парного и парного концов вместе, чтобы вы могли продолжить работу с одним правилом (например, таблицей подсчета, вы ее называете).

  1. Порядок правил: почему вы выбрали B ›A? Чтобы убедиться, что парные образцы не попадают в односторонние правила?

Точно! Когда правилу требуется trimmed_sample1_R1.fastq.gz, как Snakemake узнает имя вашего образца? Это имя образца, sample1, или это sample1_R1? Это может быть и то, и другое, и это заставляет snakemake жаловаться, что он не знает, как решить эту проблему. Когда вы добавляете порядок правил, вы говорите Snakemake, когда он неясен, разрешайте в этом порядке.

  1. Команде в правиле выравнивания требуется 1 или 2 входа. Я намерен использовать директиву if / else в params для выбора входных данных. Правильно ли я так думаю? (Я думаю, что вы тоже это сделали в своем конвейере)

Да, мы так и решили. Мы сделали это таким образом, потому что хотим, чтобы у каждого правила была собственная среда. Если вы не используете отдельную среду conda для выравнивания, вы можете сделать ее чище / красивее, например

rule alignment:  
    input:
        unpack(get_fastqs)
    output:
        somepath/{sample}.bam
    run:
        if layouts[wildcards.sample] == "single":
            shell("single-end command")
        if layouts[wildcards.sample] == "paired":
            shell("paired-end command")

Мне кажется, этот вариант намного понятнее, чем то, что мы делали в конвейере seq2science. Однако в конвейере seq2science мы поддерживаем много разных выравнивателей, и все они имеют разную среду conda, поэтому директиву run использовать нельзя.

person Maarten-vd-Sande    schedule 09.08.2020
comment
Спасибо за ваш ответ. Я внимательно рассмотрю все это сегодня и буду держать вас в курсе, но это кажется очень многообещающим! (И вы хорошо догадались об обрезке, выравнивании и многом другом!). - person athiebaut; 10.08.2020
comment
Хорошо, я посмотрел на ваш ответ (а также на ваш конвейер, действительно отличная работа, это мне очень поможет!), И мне нужно немного больше пояснений: 1. Когда вы говорите «правила слияния», вы имеете в виду правило А, В и выравнивание? Или просто править А и Б? Или еще правила? 2. Порядок правил: почему вы выбрали B ›A? Чтобы убедиться, что парные образцы не попадают в односторонние правила? 3. Для команды в правиле выравнивания требуется 1 или 2 входа. Я намерен использовать директиву if / else в параметрах для выбора входных данных. Правильно ли я так думаю? (Я думаю, что вы тоже это сделали в своем конвейере). - person athiebaut; 10.08.2020
comment
Если да, не могли бы вы отредактировать свой ответ, чтобы упомянуть об этом? Таким образом, ваш ответ будет идеальным, и я смогу закрыть этот пост !!! Большое спасибо за Вашу помощь ! - person athiebaut; 10.08.2020
comment
@athiebaut Я ответил на ваши вопросы в редакции. Рад помочь! - person Maarten-vd-Sande; 10.08.2020
comment
@ Maarten-vd-Sande Что это за def в разделах ввода и вывода ваших правил? Я впервые вижу это в змеином файле. Кроме того, я никогда не слышал о unpack. - person bli; 11.08.2020
comment
@bli тех деф не должно быть! Я их удалил. Распаковывает, распаковывает словарь, см .: snakemake .readthedocs.io / en / stable / snakefiles / - person Maarten-vd-Sande; 11.08.2020