Я новичок в использовании 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
"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.2019NAME
не является строкой:import os
,NAME=os.path.dirname
,NAME
,<function dirname at 0x7f6e0e4ab7b8>
` - person Russ Hyde   schedule 24.05.2019{NAME}
вrule all
, чтобы snakemake знал ожидаемые целевые файлы будет создан. Это то, на что указывает сообщение об ошибке. - person Manavalan Gajapathy   schedule 24.05.2019"I=".join(input)
работает? - person Dmitry Kuzminov   schedule 27.05.2019"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