Как получить последовательности FASTA в соответствии с информацией о координатах с помощью Python?

Я хотел бы получить последовательности в соответствии с файлом кровати B.bed, которые содержат информацию о координатах последовательностей, сопоставив координаты с файлом fasta, который является A.fasta, и получить соответствующие последовательности в соответствии с файлом B.bed. Файл Fasta представляет собой обычный файл с идентификатором последовательности, за которым следуют его нуклеотиды ATCG. Но я получаю ключевую ошибку ниже. Может кто-нибудь мне помочь?

from Bio import SeqIO
from Bio.Seq import Seq
from Bio.SeqRecord import SeqRecord
from collections import defaultdict

# read names and postions from bed file
positions = defaultdict(list)
with open('B.bed') as f:
    for line in f:
        name, start, stop = line.split()
        positions[name].append((int(start), int(stop)))

# parse faste file and turn into dictionary
records = SeqIO.to_dict(SeqIO.parse(open('A.fasta'), 'fasta'))

# search for short sequences
short_seq_records = []
for name in positions:
    for (start, stop) in positions[name]:        
        long_seq_record = records[name]
        long_seq = long_seq_record.seq
        alphabet = long_seq.alphabet
        short_seq = str(long_seq)[start-1:stop]        
        short_seq_record =SeqRecord(Seq(name))+ '\t'+str(start)+'\t'+str(stop)+'\t' + SeqRecord(Seq(short_seq, alphabet))
    short_seq_records.append(short_seq_record)

# write to file
with open('C.fasta', 'w') as f:
    SeqIO.write(short_seq_records,f, 'fasta')

А.фаста

>chr16:13361561-13361573
TAGTGGGTCAGAC
>chr6_apd_hap1:2165669-2165681
AGATGAGTCATCA
>chr10:112612173-112612185
AAGTGTGTCAGCT

B.bed

chr6_apd_hap1   2165668 2165681
chr10   112612172   112612185

Ожидаемый результат для C.fasta

>chr6_apd_hap1:2165669-2165681
AGATGAGTCATCA
>chr10:112612173-112612185
AAGTGTGTCAGCT

Но я получил ошибку ниже:

long_seq_record = records[name]
KeyError: 'chr6_apd_hap1'

person Xiong89    schedule 08.07.2015    source источник
comment
Вы проверили, что на самом деле находится в records?   -  person jonrsharpe    schedule 08.07.2015


Ответы (1)


В вашем коде positions — это defaultdict, ключами которого являются имена из файла BED:

>>> print positions.keys()
['chr10', 'chr6_apd_hap1']

А records — это словарь, ключами которого являются заголовки файла FASTA, за вычетом > в начале, но они по-прежнему включают двоеточие и положение на хромосоме:

>>> print records.keys()
['chr16:13361561-13361573', 'chr6_apd_hap1:2165669-2165681', 'chr10:112612173-112612185']

Итак, сначала вам нужно преобразовать свои ключи records, чтобы избавиться от дополнительной информации, чтобы вы могли использовать ключи positions для их извлечения. Вы можете сделать это, добавив следующую строку после создания словаря records:

records = {key.split(':')[0]: value for (key, value) in records.iteritems()}

Кроме того, способ, которым вы сейчас строите свой short_seq_record, на самом деле не работает. Замените строки

short_seq = str(long_seq)[start-1:stop]        
short_seq_record =SeqRecord(Seq(name))+ '\t'+str(start)+'\t'+str(stop)+'\t' + SeqRecord(Seq(short_seq, alphabet))

с:

short_seq = Seq(str(long_seq)[start-1:stop], alphabet)
short_seq_id = '{0}\t{1}\t{2}'.format(name, start, stop)
short_seq_record = SeqRecord(short_seq, id=short_seq_id, description='')
person BioGeek    schedule 08.07.2015
comment
По вашему предложению я внес изменения в код и получил это в своем C.fasta›chr10 112612172 112612185 ‹неизвестное описание› ›chr6_apd_hap1 2165668 2165681 ‹неизвестное описание› - person Xiong89; 08.07.2015
comment
Что ж, если вам нужно описание, добавьте его при создании SeqRecord или установите для него пустую строку, если оно вам не нужно. Я обновил свой код, но не забудьте также прочитать документация - person BioGeek; 08.07.2015
comment
Нуклеотиды не найдены в файле. Только заголовок последовательности. - person Xiong89; 08.07.2015
comment
Это действительно так с вашими образцами файлов. Но это имеет смысл. Последовательности в вашем образце A.fasta имеют длину всего 13 нуклеотидов. Позже вы ищете короткие последовательности на основе позиций, найденных в файле BED (например, от позиции 112612172 до 112612185 для chr10). Поскольку эти позиции намного больше, чем длина ваших выборочных последовательностей, они действительно не возвращают найденных нуклеотидов. Но если вы замените образец A.fasta реальным файлом FASTA с длинными последовательностями, вы получите результат с желаемыми последовательностями. - person BioGeek; 08.07.2015
comment
Спасибо за объяснение :) - person Xiong89; 08.07.2015
comment
все еще я не могу получить нуклеотиды, хотя я использую файл fasta большего размера - person Xiong89; 08.07.2015
comment
Вы получаете ошибку? Как долго ваши последовательности? Что вы пытались решить проблему самостоятельно? - person BioGeek; 08.07.2015
comment
Да. Я пробовал с 2000bp вверх и вниз по течению. Мой вывод по-прежнему без нуклеотидов, он возвращает только заголовок последовательности. - person Xiong89; 10.07.2015