Учебная страница курса биоинформатики,
год поступления 2019
Формат FASTA
FASTA – наиболее популярный формат представления последовательностей. Сочетает удобство парсинга и человекочитаемость.
Появился вместе с одноименной программой в 1988 году, но с тех пор немножко изменился в сторону упрощения. Старый формат (FASTA/Pearson) сейчас не понимают практически никакие программы.
Главная проблема формата – отсутствие какой-либо общепринятой спецификации. Поэтому все программы и базы понимают формат немножко по-разному.
FASTA – формат текстовый в узком смысле, т.е. подразумевает использование однобайтовой кодировки ASCII. Поэтому, например, никаких русских букв в заголовках FASTA быть не должно.
Основная часть записи – последовательность. Записывается в однобуквенном обозначении IUPAC (+ еще некоторые символы, в википедии более-менее правда) от 5'-конца к 3'-концу (в случае нуклеотидов) и от N-конца к C-концу (в случае аминокислот). Принято разбивать последовательность на несколько строк, чтобы файл целиком в ширину помещался на экран для удобства просмотра. Кроме того, обычно парсеры игнорируют пробельные символы в последовательностях, поэтому некоторые любят разделять последовательность на столбцы по ~10 остатков пробелами. Но я не советую этого делать. А ещё NCBI BLAST, по крайней мере формально, не допускает в FASTA пустых строк. Уж точно в последовательности не должно быть цифр, хотя некоторые парсеры и их игнорируют.
Кроме самой последовательности файл должен содержать заголовок – одну строку, начинающуюся с символа '>' и расположенную непосредственно перед последовательностью.
Внутренний формат заголовка – самая большая проблема формата. Единственное правило, которое обычно соблюдается (но не всегда, посмотрите хотя бы на FASTA файлы из PDB) – сразу после '>' и до первого пробела или переноса строки расположен идентификатор последовательности. Он должен быть уникальным хотя бы в пределах файла.
В некоторых базах идентификаторы записей FASTA обладают дополнительно внутренней структурой. Наиболее часто встречается структура, которая изначально появилась в NCBI, когда идентификатор FASTA включает несколько полей, разделенных символами '|'. Это, опять же, никакой не общепринятый стандарт. Можно изучить табличку с сайта NCBI, но смысла особого нет, в таком виде идентификаторы используются почти только в выдаче BLAST, и то я не уверен. Но вообще формат >что-то|что-то|что-то какое-то описание встречается достаточно часто, чтобы под него даже парсер в EMBOSS написали.
FASTA в EMBOSS
В списке форматов последовательностей EMBOSS аж 4 варианта формата FASTA для входных последовательностей: fasta/ncbi, gifasta, pearson, dbid. Они, на сколько мне известно, различаются только форматом заголовка. Причем то, что называется fasta (и обычно используется по-умолчанию), предполагает еще 3 разных варианта формата заголовка, какой вариант использовать программа пытаются угадать, не всегда удачно.
А еще есть 3 формата FASTA для вывода последовательностей (fasta/pearson, ncbi, gifasta), которые по логике не должны бы отличаться от соответствующих входных форматов, но отличаются (пусть и в деталях)! Всех тонкостей того, как это работает, я не знаю, и знать не хочу. Но один забавный пример покажу (следите за скобочками).
kodomo:~$ seqret 'sw:B3EWH2' -filter >AON_AZEFE B3EWH2 Azemiopsin {ECO:0000303|PubMed:22613724} DNWWPKPPHQGPRPPRPRPKP kodomo:~$ seqret 'sw:B3EWH2' 'ncbi::stdout' -filter >gnl|sw|AON_AZEFE (B3EWH2) Azemiopsin {ECO:0000303|PubMed:22613724} DNWWPKPPHQGPRPPRPRPKP kodomo:~$ seqret 'sw:B3EWH2' 'ncbi::stdout' -filter | seqret -filter >AON_AZEFE (B3EWH2) Azemiopsin {ECO:0000303|PubMed:22613724} DNWWPKPPHQGPRPPRPRPKP
kodomo:~$ seqret 'sw:B3EWH2' -filter | infoseq -filter -only -name -desc -acc Name Accession Description AON_AZEFE B3EWH2 Azemiopsin {ECO:0000303|PubMed:22613724} kodomo:~$ seqret 'sw:B3EWH2' 'ncbi::stdout' -filter | infoseq -filter -only -name -desc -acc Name Accession Description AON_AZEFE - (B3EWH2) Azemiopsin {ECO:0000303|PubMed:22613724}
kodomo:~$ seqret 'sw:B3EWH2' -filter | descseq -filter -name NAME -desc DESC >NAME B3EWH2 DESC DNWWPKPPHQGPRPPRPRPKP kodomo:~$ seqret 'sw:B3EWH2' 'ncbi::stdout' -filter | descseq -filter -name NAME -desc DESC >NAME DESC DNWWPKPPHQGPRPPRPRPKP
kodomo:~$ seqret 'sw:B3EWH2' 'ncbi::stdout' -filter >gnl|sw|AON_AZEFE (B3EWH2) Azemiopsin {ECO:0000303|PubMed:22613724} DNWWPKPPHQGPRPPRPRPKP kodomo:~$ seqret 'sw:B3EWH2' 'ncbi::stdout' -filter | seqret 'pearson::stdin' -filter >gnl|sw|AON_AZEFE B3EWH2 Azemiopsin {ECO:0000303|PubMed:22613724} DNWWPKPPHQGPRPPRPRPKP kodomo:~$ seqret 'sw:B3EWH2' 'ncbi::stdout' -filter | seqret 'pearson::stdin' -filter | seqret 'ncbi::stdin' -filter >AON_AZEFE B3EWH2 Azemiopsin {ECO:0000303|PubMed:22613724} DNWWPKPPHQGPRPPRPRPKP
И есть совсем уж баги.
kodomo:~$ descseq 'sw:B3EWH2' -filter -name 'gb|U00096' -desc DESC >gb|U00096 B3EWH2 DESC DNWWPKPPHQGPRPPRPRPKP kodomo:~$ descseq 'sw:B3EWH2' -filter -name 'gb|U00096' -desc DESC | seqret -filter >U00096 U00096 B3EWH2 DESC DNWWPKPPHQGPRPPRPRPKP kodomo:~$ descseq 'sw:B3EWH2' -filter -name 'gd|U00096' -desc DESC >gd|U00096 B3EWH2 DESC DNWWPKPPHQGPRPPRPRPKP kodomo:~$ descseq 'sw:B3EWH2' -filter -name 'gd|U00096' -desc DESC | seqret -filter >EMBOSS_001 B3EWH2 DESC DNWWPKPPHQGPRPPRPRPKP
Последняя команда выполняется несколько минут, причем seqret усиленно грузит процессор, что-то считает)