Учебная страница курса биоинформатики,
год поступления 2012
BioPython
Python активно используется биоинформатиками. Для работы с биоинформатическими данными создан пакет BioPhython. В нем есть много полезных модулей для работы с последовательностями, геномами, филогенитическими деревьями. Сегодня разберем некоторые его возможности для работы с последовательностями. Ссылка на станицу BioPython:
http://biopython.org/wiki/Main_Page
Seq
Модуль для работы с последовательностями. В Biopython последовательности представлены в виде объектов Seq, которые содержат строку последовательности и алфавит, из которого составлена строка:
В данном примере мы не задали алфавит при создании последовательности, поэтому, в переменной alphabet лежит алфавит по-умолчанию. Можно при создании последовательности указать конкретный алфавит, например, ДНК, РНК или белковая последовательность:
1 >>> from Bio.Seq import Seq
2 >>> from Bio.Alphabet import generic_dna, generic_protein
3 >>> my_seq = Seq("AGTACACTGGT")
4 >>> my_seq
5 Seq('AGTACACTGGT', Alphabet())
6 >>> my_dna = Seq("AGTACACTGGT", generic_dna)
7 >>> my_dna
8 Seq('AGTACACTGGT', DNAAlphabet())
9 >>> my_protein = Seq("AGTACACTGGT", generic_protein)
10 >>> my_protein
11 Seq('AGTACACTGGT', ProteinAlphabet())
Зачем это нужно и почему это важно? При работе с биологическими последовательностями использование алфавита является дополнительным контролем, это позволяет отслеживать ошибки. Например, не позволит объединять в одну последовательности ДНК и белка:
Кроме того, например, Biopython не позволит применить методы, используемые только для последовательностей ДНК (такие как трансляция) к белковым последовательностям.
Основные методы
Объект Seq имеет набор методов, которые работают также как методы для строк в Python. Например, метод find:
Есть также метод для посчета количества вхождений:
Однако, будьте осторожны, также как и в методе для строк в Python, count считает число неперекрывающихся строк!
Методы для нуклеотидных последовательностей
Для нуклеотидных последовательностей, например, можно построить комплементарную и обратную комплементарную последовательность:
1 >>> from Bio.Seq import Seq
2 >>> from Bio.Alphabet import generic_dna
3 >>> my_dna = Seq("AGTACACTGGT", generic_dna)
4 >>> my_dna
5 Seq('AGTACACTGGT', DNAAlphabet())
6 >>> my_dna.complement()
7 Seq('TCATGTGACCA', DNAAlphabet())
8 >>> my_dna.reverse_complement()
9 Seq('ACCAGTGTACT', DNAAlphabet())
Трансляция и обратная трансляция
Можно преобразовать последовательность ДНК в РНК:
А можно наоборот, преобразовать РНК в ДНК:
Трансляция
Можно транслировать RNA:
Или ДНК - которая предполагается на кодирующей цепи:
Можно установить опцию - транслировать до стоп кодона:
Отметим, что если применить методы для нуклеотидных последовательностей к белковым, то это вызовет исключение:
SeqIO
Данный модуль в Bio.SeqIO позволяет осуществлять ввод и вывод последовательностей в различных форматах (включая множественные выравнивания). Последовательности преобразуются в объекты SeqRecord.
Форматы файлов:
опция |
формат файла |
clustal |
выравнивания в формате Clustal X и Clustal W |
fasta |
Fasta |
stockholm |
PFAM |
swiss |
Swiss-Prot |
И многие другие (см. http://biopython.org/wiki/SeqIO )
Ввод последовательности
Для загрузки последовательности используется функция Bio.SeqIO.parse() которая берет на вход файл и имя формата, и возвращает итератор SeqRecord (штука, позволяющая перебирать последовательности одну за другой). Например:
Итератор удобен, когда последовательности нужно перебрать одну за другой в порядке, в котором они идут в файле.Для некоторых задач бывает полезно получить все записи в виде списка:
Другая распространенная задача - извлечь последовательность по id. Для работы с маленькими файлами используется функция Bio.SeqIO.to_dict(), которая преобразует список в словарь:
Для файлов большого размера может не хватить памяти, в этом случае используется Bio.SeqIO.index().
Для записи последовательностей в файл используется функция Bio.SeqIO.write(), которая берет на вход SeqRecord итератор (или список), выходной файл и формат:
Преобразование форматов
Предположим, у нас есть файл в формате genbank, мы хотим преобразовать его в fasta формат:
1 from Bio import SeqIO
2
3 input_handle = open("cor6_6.gb")
4 output_handle = open("cor6_6.fasta", "w")
5
6 sequences = SeqIO.parse(input_handle, "genbank")
7 count = SeqIO.write(sequences, output_handle, "fasta")
8
9 output_handle.close()
10 input_handle.close()
11
12 print "Converted {0} records".format(count)
Или еще более коротко, с использованием функции Bio.SeqIO.convert():
Бывает необходимо произвести какие-нибудь манипуляции с последовательностями, отфильтровать по какому-то признаку (например, по длине):
Или еще короче (применяем сокращенную запись из предыдущего занятия):
Можно вырезать часть последовательности и сделать из нее новую, чтобы затем записать в файл:
1 >>>from Bio.SeqRecord import SeqRecord
2 >>> handle=open("copy.fasta")
3 >>> records = list(SeqIO.parse(handle, "fasta"))
4 >>> seq=records[0].seq[0:20]
5 >>> records[0]=SeqRecord(seq, id=records[0].id, name=records[0].name, description=records[0].description)
6 >>> print records[0]
7 ID: 2a06_C
8 Name: 2a06_C
9 Description: 2a06_C
10 Number of features: 0
11 Seq('MTNIRKSHPLMKIVNNAFID', SingleLetterAlphabet())
AlignIO
Модуль Bio.SeqIO работает с одной или несколькими записями как с объектами SeqRecord. Аналогично устроен модуль Bio.AlignIO, который предназначен для работы с выравниваниями последовательностей как с объектами Alignment. Bio.AlignIO использует такие же функции, как Bio.SeqIO, и такие же имена для поддерживаемых форматов.
Ввод
Есть две функции для ввода последовательностей. Это Bio.AlignIO.read() для тех случаев, когда файл содержит только одно выравнивание, и более общая Bio.AlignIO.parse(), когда файл содержит несколько отдельных выравниваний. Обе этих функции принимают на вход файл и формат. Например, у нас есть выравнивание в формате PFAM или Stockholm. Файл содержит одно выравнивание, можем использовать метод Bio.AlignIO.read():
Также как и в Bio.SeqIO, для вывода существует единственная функция Bio.AlignIO.write().
Метод format() возвращает выравнивание в виде строки в указанном формате:
Точно также, как в Bio.SeqIO, можно преобразовать один формат в другой:
Срезы
Можно получить конкретную букву из конкретной последовательности:
1 alignment[0].seq[2]
или
1 alignment[0,2]
а можно выбрать диапозон последовательностей и диапозон колонок (кусок выравнивания):
1 alignment[0:10,2:10]
столбец:
1 alignment[:,2]