Страницы

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

суббота, 11 января 2020 г.

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

#delphi #generics #биоинформатика


До сих пор, работая непосредственно с 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 ; по хромосомам



но боюсь, что выигрывая в удобстве, потеряю в скорости поиска. Так ли это?

Спасибо заранее за помощь!
    


Ответы

Ответ 1



Вначале отвечу на второй вопрос. По опыту, разницы в скорости не наблюдается. Более того, удобнее оставлять сведения о хромосоме именно в текстовом виде, так как порой приходится иметь дело со сложными именованиями хромосом, а не все утилиты поддерживают таблицу номерного соответствия. Более того, я предлагаю совместить первый и второй уровень вашего словаря, сделав ключом сразу полную координату {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 у вас не одно и то же?

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

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