snakemake PICARD объединить файлы BAM

Я новичок в использовании snakemake, у меня проблема при использовании PICARD MergeSamFiles для объединения файлов BAM в один файл BAM. Я хотел бы объединить 1_sorted.bam 2_sorted.bam ... 10_sorted.bam в один файл bam с именем каталога.

import snakemake.io 
import os.path

PICARD="/data/src/picard.jar"
(SAMPLES,)=glob_wildcards("bam/{sample}_sorted.bam")
NAME=os.path.dirname

def bam_inputs(wildcards):
    files = expand("bam/{sample}_sorted.bam", sample=SAMPLES)
    INPUT = "I="+files 
    return INPUT

rule all:
    input: "bam/{NAME}.bam"

rule merge_bams:
    input: bam_inputs
    output: "bam/{NAME}.bam"
    params: mrkdup_jar="/data/src/picard.jar"
    shell: "java -Xmx16G -jar {params.mrkdup_jar} MergeSamFiles \
    {input} \
    O={output} \
    SORT_ORDER=coordinate \
    ASSUME_SORTED=false \
    USE_THREADING=true"

Ошибка:

Building DAG of jobs...
WildcardError in line 12 of /data/data/Samples/snakemake-example/WGS-test/step3.smk:
Wildcards in input files cannot be determined from output files:
'NAME'

Я не знаю, как объединить все файлы BAM в один, и не знаю, как установить имя каталога в качестве переменной для окончательного файла BAM. Пожалуйста посоветуй.

ОБНОВИТЬ:

import snakemake.io

PICARD="/data/src/picard.jar"
(SAMPLES,)=glob_wildcards("bam/{sample}_sorted.bam")
#NAME=os.path.dirname
NAME="test"

rule all:
    input: "bam/{name}.bam".format(name=NAME)

rule merge_bams:
    input: expand("bam/{sample}_sorted.bam",sample=SAMPLES)
    output: "bam/{name}.bam".format(name=NAME)
    params: mrkdup_jar="/data/src/picard.jar"
    shell: """java -Xmx16G -jar {params.mrkdup_jar} MergeSamFiles \
    {"I=" + input} \
    O={output} \
    SORT_ORDER=coordinate \
    ASSUME_SORTED=false \
    USE_THREADING=true """

ERROR:

RuleException in line 11 of /data/data/Samples/snakemake-example/WGS-test/step3.smk:
NameError: The name '"I=" + input' is unknown in this context. Please make sure that you defined that variable. Also note that braces not used for variable access have to be escaped by repeating them, i.e. {{print $1}}

MergeSamFiles \
I= sub1_sorted.bam I=sub2_sorted.bam I=sub3_sorted.bam \
O= sub.bam \
SORT_ORDER=coordinate \
        ASSUME_SORTED=false \
        USE_THREADING=true

person Peter Chung    schedule 24.05.2019    source источник
comment
Я не очень разбираюсь в змеевике, но думаю, "I="+files просто добавляет I=' to a list of files while you need to add a suffix I = `в КАЖДЫЙ файл bam. Другое решение - создать файл с требуемым суффиксом .list, содержащим путь к BAM, и использовать I=my.list   -  person Pierre    schedule 24.05.2019
comment
ваша первая проблема заключается в том, что NAME не является строкой: import os, NAME=os.path.dirname, NAME, <function dirname at 0x7f6e0e4ab7b8> `   -  person Russ Hyde    schedule 24.05.2019
comment
Вам необходимо определить подстановочный знак {NAME} в rule all, чтобы snakemake знал ожидаемые целевые файлы будет создан. Это то, на что указывает сообщение об ошибке.   -  person Manavalan Gajapathy    schedule 24.05.2019
comment
Теперь вы можете увидеть ошибку даже при выделении синтаксиса stackoverflow. В строке 12 нет заключительной цитаты.   -  person Dmitry Kuzminov    schedule 27.05.2019
comment
Ой ну спасибо. как я могу добавить I = в каждый ввод * _sorted.bam во ввод snakemake   -  person Peter Chung    schedule 27.05.2019
comment
"I=".join(input) работает?   -  person Dmitry Kuzminov    schedule 27.05.2019
comment
оболочка: java -Xmx16G -jar {params.mrkdup_jar} MergeSamFiles \ {I = + .join (input)} \ O = {output} \ SORT_ORDER = как это координировать в оболочке? не работает та же ошибка   -  person Peter Chung    schedule 27.05.2019
comment
Не "I=" + .join, а "I=".join(input). В любом случае, это не сработает :). Попробуйте " ".join(["I=" + s for s in input]) Если строка не будет сцепляться с элементом из ввода, можно использовать еще более простое решение: " ".join(["I=" + str(s) for s in input])   -  person Dmitry Kuzminov    schedule 27.05.2019
comment
RuleException: CalledProcessError в строке 15 /data/data/Samples/snakemake-example/WGS-test/step3.smk: Command 'set -euo pipefail; java -Xmx16G -jar /data/src/picard.jar MergeSamFiles .join ([I = + s для s на входе]) O = bam / test.bam SORT_ORDER = координата ASSUME_SORTED = false USE_THREADING = true 'вернул ненулевой выход статус 1.   -  person Peter Chung    schedule 27.05.2019
comment
Я обновил свой ответ. Обратите особое внимание на то, что я сделал струну ф-струной. Это означает, что выражение в {} будет вычислено первым, а выражения в {{}} будут заменены выражениями из snakemake.   -  person Dmitry Kuzminov    schedule 27.05.2019
comment
Давайте продолжим это обсуждение в чате.   -  person Dmitry Kuzminov    schedule 27.05.2019


Ответы (1)


Рассмотрим rule all. Вам нужно показать змейке, какой файл вы на самом деле собираетесь создать в качестве цели. Никаких подстановочных знаков: просто что-то однозначное. Вы сказали, что это должен быть бам-файл с именем каталога?

rule all:
    input: f"bam/{NAME}.bam"

Обратите внимание, что с помощью f-строки я преобразовал {NAME} из подстановочного знака в точное строковое значение, полученное из переменной NAME. Вы можете выбрать любой другой способ сделать это, например "bam/{name}.bam".format(name=NAME)

Далее, имейте в виду, что теперь {NAME} в правиле «all» и {NAME} в правиле «merge_bams» - это разные сущности, поэтому у них нет ничего общего. Более того, подстановочный знак не обязательно равен переменной NAME, которую вы определили в строке 6. Я бы назвал подстановочный знак как-то иначе, чтобы избежать недоразумений.

Еще одно: я не уверен, что вы делаете в функции bam_inputs:

INPUT = "I="+files 

Результат функции расширения должен быть достаточным, чтобы указать ввод для правила merge_bams. Если вам нужно добавить «I =» для каждого файла в списке, попробуйте сделать это прямо в разделе shell::

rule merge_bams:
    input: bam_inputs
    output: "bam/{NAME}.bam"
    params: mrkdup_jar="/data/src/picard.jar"
    shell: f"""java -Xmx16G -jar {{params.mrkdup_jar}} MergeSamFiles 
        {" ".join(["I=" + s for s in input])} 
        O={{output}} 
        SORT_ORDER=coordinate 
        ASSUME_SORTED=false 
        USE_THREADING=true"""
person Dmitry Kuzminov    schedule 24.05.2019
comment
import snakemake.io PICARD = / data / src / picard.jar (SAMPLES,) = glob_wildcards (bam / {sample} _sorted.bam) # NAME = os.path.dirname NAME = test rule all: input: bam / {name } .bam.format (name = NAME) rule merge_bams: input: expand (bam / {sample} _sorted.bam, sample = SAMPLES) output: bam / {name} .bam.format (name = NAME) params: mrkdup_jar = /data/src/picard.jar оболочка: java -Xmx16G -jar {params.mrkdup_jar} MergeSamFiles \ {I = + input} \ O = {output} \ SORT_ORDER = координата \ ASSUME_SORTED = false \ USE_THREADING = true - person Peter Chung; 27.05.2019
comment
Но ОШИБКА: SyntaxError в строке 12 /data/data/Samples/snakemake-example/WGS-test/step3.smk: EOL при сканировании строкового литерала - person Peter Chung; 27.05.2019
comment
bam_inputs: я хочу составить список всех файлов bam в этом каталоге, а затем объединить их. Я изменил на раскрытие (bam / {sample} _sorted.bam, sample = SAMPLES) - person Peter Chung; 27.05.2019
comment
@PeterChung Ошибка связана с синтаксической проблемой. К сожалению, комментарий не допускает правильного форматирования, поэтому проверить синтаксис невозможно. Пожалуйста, укажите этот код как обновление вопроса. И опишите, пожалуйста, в какой строке стоит номер 12. - person Dmitry Kuzminov; 27.05.2019