Страницы

Поиск по вопросам

пятница, 1 марта 2019 г.

Импорт данных секвенирования и обработка SAM-файлов в TDictionary

До сих пор, работая непосредственно с SAM-файлами, мы использовали массивы. Сейчас хотим перейти на TDictionary, поскольку он гораздо удобнее в плане поиска. Возникают вопросы: 1. Иерархия словаря. Как я вижу себе структуру, которая была бы удобна для поиска:
type DataType = record name,qual, info, seq:string; data:array[1..30] of double; paired, structured:boolean; ref:integer; end;
TData3 = TDictionary; // по имени референса TData2 = TDictionary; // по позиции внутри хромосомы TData1 = TDictionary; по хромосомам
var dd: TData1;
тогда я могу достаточно быстро пробежаться вниз по дереву chr->pos->ref и все записи будут уникальны. А для работы с переменной dd создаю свой класс, где будут все рутины. Прав ли я, предполагая такую структуру?
Как правило, в большинстве биоинформатических утилит для обозначения хромосом используются строковый тип ['1'...'22','X','Y','MT']. Формально, я могу TData1 определить как
type TData1 = TDictionary ; по хромосомам
но боюсь, что выигрывая в удобстве, потеряю в скорости поиска. Так ли это?
Спасибо заранее за помощь!


Ответ

Вначале отвечу на второй вопрос. По опыту, разницы в скорости не наблюдается. Более того, удобнее оставлять сведения о хромосоме именно в текстовом виде, так как порой приходится иметь дело со сложными именованиями хромосом, а не все утилиты поддерживают таблицу номерного соответствия. Более того, я предлагаю совместить первый и второй уровень вашего словаря, сделав ключом сразу полную координату {chr, pos} в виде строки формируя её либо так Key:= chr + ',' + IntToStr(pos), либо так Key:= chr + #9 + IntToStr(pos). Первый случай удобен для экспорта в Excel или BED, второй - для SAM/BAM. Скорость поиска возрастёт, неудобств при формировании ключа - минимум. И ещё, отдельный класс создавать, на мой взгляд, не нужно. Наследуйте непосредственно TDictionary, так будет гораздо удобнее. Суммируя всё вышенаписанное, предлагаю сделать так:
type DataType = record name,qual, info, seq:string; data:array[1..30] of double; paired, structured:boolean; ref:integer; end;
TData3 = TDictionary; // по имени референса TData1 = class(TDictionary); по хромосоме и позиции, ключ строится, как описано выше // переменные и методы класса, к данным первого уровня удобно обращаться без разъименования. end;
И встречный вопрос: ключ в TData3 и name в DataType у вас не одно и то же?

Комментариев нет:

Отправить комментарий