У меня есть файлы cram (bam), которые я хочу разделить по группам чтения. Это требует чтения заголовка и извлечения идентификаторов групп чтения.
У меня есть эта функция, которая делает это в моем файле Snakemake:
def identify_read_groups(cram_file):
import subprocess
command = 'samtools view -H ' + cram_file + ' | grep ^@RG | cut -f2 | cut -f2 -d":" '
read_groups = subprocess.check_output(command, shell=True)
read_groups = read_groups.split('\n')[:-1]
return(read_groups)
У меня это правило все:
rule all:
input:
expand('cram/RG_bams/{sample}.RG{read_groups}.bam', read_groups=identify_read_groups('cram/{sample}.bam.cram'))
И это правило для фактического разделения:
rule split_cram_by_rg:
input:
cram_file='cram/{sample}.bam.cram',
read_groups=identify_read_groups('cram/{sample}.bam.cram')
output:
'cram/RG_bams/{sample}.RG{read_groups}.bam'
run:
import subprocess
read_groups = open(input.readGroupIDs).readlines()
read_groups = [str(rg.replace('\n','')) for rg in read_groups]
for rg in read_groups:
command = 'samtools view -b -r ' + str(rg) + ' ' + str(input.cram_file) + ' > ' + str(output)
subprocess.check_output(command, shell=True)
Я получаю эту ошибку при пробном запуске:
[E::hts_open_format] fail to open file 'cram/{sample}.bam.cram'
samtools view: failed to open "cram/{sample}.bam.cram" for reading: No such file or directory
TypeError in line 19 of /gpfs/gsfs5/users/mcgaugheyd/projects/nei/mcgaughey/EGA_EGAD00001002656/Snakefile:
a bytes-like object is required, not 'str'
File "/gpfs/gsfs5/users/mcgaugheyd/projects/nei/mcgaughey/EGA_EGAD00001002656/Snakefile", line 37, in <module>
File "/gpfs/gsfs5/users/mcgaugheyd/projects/nei/mcgaughey/EGA_EGAD00001002656/Snakefile", line 19, in identify_read_groups
{sample} не передается в функцию.
Как мне решить эту проблему? Я открыт для других подходов, если я не делаю это «змеиным» способом.
==============
ИЗМЕНИТЬ 1
Хорошо, в первом наборе примеров, которые я привел, было много проблем.
Вот лучший (?) Набор кода, который, я надеюсь, демонстрирует мою проблему.
import sys
from os.path import join
shell.prefix("set -eo pipefail; ")
def identify_read_groups(wildcards):
import subprocess
cram_file = 'cram/' + wildcards + '.bam.cram'
command = 'samtools view -H ' + cram_file + ' | grep ^@RG | cut -f2 | cut -f2 -d":" '
read_groups = subprocess.check_output(command, shell=True)
read_groups = read_groups.decode().split('\n')[:-1]
return(read_groups)
SAMPLES, = glob_wildcards(join('cram/', '{sample}.bam.cram'))
RG_dict = {}
for i in SAMPLES:
RG_dict[i] = identify_read_groups(i)
rule all:
input:
expand('{sample}.boo.txt', sample=list(RG_dict.keys()))
rule split_cram_by_rg:
input:
file='cram/{sample}.bam.cram',
RG = lambda wildcards: RG_dict[wildcards.sample]
output:
expand('cram/RG_bams/{{sample}}.RG{input_RG}.bam') # I have a problem HERE. How can I get my read groups values applied here? I need to go from one cram to multiple bam files split by RG (see -r in samtools view below). It can't pull the RG from the input.
shell:
'samtools view -b -r {input.RG} {input.file} > {output}'
rule merge_RG_bams_into_one_bam:
input:
rules.split_cram_by_rg.output
output:
'{sample}.boo.txt'
message:
'echo {input}'
shell:
'samtools merge {input} > {output}' #not working
"""
==============
ИЗМЕНИТЬ 2
Становимся НАМНОГО ближе, но в настоящее время изо всех сил пытаемся правильно развернуть, создавая файлы полосы движения и сохраняя подстановочные знаки
Я использую этот цикл для создания промежуточных имен файлов:
for sample in SAMPLES:
for rg_id in list(return_ID(sample)):
out_rg_bam.append("temp/lane_bam/{}.ID{}.bam".format(sample, rg_id))
return_ID
- это функция, которая принимает подстановочный знак образца и возвращает список групп чтения, которые содержит образец.
Если я использую out_rg_bam
в качестве входных данных для правила слияния, то ВСЕ файлы объединяются в объединенный бац вместо того, чтобы разделяться на sample
.
Если я использую expand('temp/realigned/{{sample}}.ID{rg_id}.realigned.bam', sample=SAMPLES, rg_id = return_ID(sample))
, то к каждому образцу применяется rg_id. Итак, если у меня есть два образца (a, b) с группами чтения (0,1) и (0,1,2), я получаю a0, a1, a0, a1, a2 и b0, b1, b0, b1 , Би 2.
expand('cram/RG_bams/{{sample}}.RG{input_RG}.bam')
требуется информация о том, как раскрытьinput_RG
. Это должны быть значения вRG_dict
или что-то в этом роде? - person bli   schedule 16.10.2017samtools view
один раз для каждой группы чтения, то раскрытие относится не к выходным данным правилаsplit_cram_by_rg
, а к следующему правилу. Тогда подстановочный знак группы чтения будет доступен в правилах выше того, где происходит раскрытие. - person bli   schedule 16.10.2017expand
. - person bli   schedule 24.10.2017