|
| |||||
|
Рудалёв А.В. Структура и генерация классов системы хранения электрогастроэнтерограмм // Научные труды SWorld. Физика и математика. 2015. Том 7. Выпуск 2(39). С. 52–56.
Структура и генерация классов системы хранения электрогастроэнтерограммА.В. Рудалёв
Северный (Арктический) федеральный университет имени М.В. Ломоносова, Россия, Архангельск, Набережная Северной Двины, 17, 163002
Аннотация. В работе представлены результаты генерации исходного кода классов системы хранения электрогастроэнтерограмм, описаны применяемые методики и программные инструменты, поставлены задачи по дальнейшему развитию разрабатываемой программной системы.
Ключевые слова: автоматическое программирование, автоматизация научных исследований, система хранения, электрогастроэнтерография
STRUCTURE AND GENERATION OF CLASSES STORAGE SYSTEM ELECTROGASTROGRAM
Rudalev A.V.
Northern (Arctic) Federal University named by M.V. Lomonosov, Russia, Arkhangelsk, Severnaya Dvina Emb. 17, 163002
Abstract. In this paper we describe the results of the generation of source code for elektrogastroenterogramm's storage system. Describes applied methods and software tools. Tasked with the further development of the software system. Key words: Automatic programming, research automation, storage system, electrogastroenterography, electrogastrography.
Вступление. В лаборатории измерительных систем и цифровой обработки сигналов института математики, информационных и космических технологий САФУ имени М.В. Ломоносова, одной из основных решаемых задач являются исследования сигналов электрогастроэнтерографии (ЭГЭГ) [2,4]. На данный момент благодаря сотрудничеству с Дальневосточным медицинским университетом накоплена база более чем из 1000 записей. Большая часть входных данных представлена в виде базы данных «Гастраскан ГЭМ». Имеются данные, полученные и с другого оборудования. Стоит задача хранения обработанных вручную и программно сигналов (фильтрация, удаление артефактов). Основными языками программирования в лаборатории являются C++, Python, R, что в комбинации с такими пакетами как IPython, ROOT и Qt, позволяет проводить математические исследования и создавать специализированное прикладное программное обеспечение [1,3]. В некоторых ситуациях вычисления переносятся на высокопроизводительный кластер САФУ. Большой объём данных и различные программные инструменты накладывают определённые требования к организации системы хранения данных. Структура классов должна быть либо универсальной, либо легко изменяемой. Такие стандарты как DICOM и HL7 предлагают универсальные методы передачи информации. Но, с точки зрения конкретной области применения, становятся громоздкими и требуют организации дополнительных уровней абстракции. На первых этапах работы в лаборатории была принята упрощённая модель представления данных SMEP [1], без детализации хранимой информации по полям, что позволило сконцентрироваться на методах обработки сигналов, и иметь способ хранения объектов транслируемых во внешние представления. В данной работе описываются результаты по дальнейшей разработке системы хранения и представления данных ЭГЭГ в рамках лаборатории. Модель представления классов Для работы с одним и тем же набором данных из разных языков программирования можно либо унифицировать и закрепить способ хранения данных (например, чётко зафиксировать структуру реляционной базы данных), либо создать библиотеку классов на одном из языков программирования и решить вопрос использования её из других языков программирования. Был выбран вариант реализации классов на языке программирования C++ с последующей трансляцией на другие языки программирования инструментом SWIG. Для скрытия способа внутреннего хранения и обработки данных был применён шаблон проектирования PIMPL (приватная реализация класса). Большая часть классов генерируется по простым Json-описаниям. Это позволяет не только более гибко экспериментировать со способами хранения информации, но и значительно упростить механизмы связывания объектов C++ с объектами на других языках программирования. В рамках шаблона PIMPL предлагается, что реализация класса разбивается на два класса: публичный и приватный. В публичном классе хранится ссылка на приватный и определены функции-обёртки над функциями приватного класса. Использование «умных» указателей std::shared_ptr в публичных классах позволило за счёт стандартных конструкторов и операторов присваивания организовать модель хранения данных класса по ссылке, что положительно сказалось на потреблении памяти и упростило процесс работы с классами. Негативным моментом использования шаблона PIMPL является необходимость дублирования методов в приватных и публичных классах и, как следствие, потеря производительности на двойных вызовах этих методов. В рамках упрощённой модели данных SMEP [1] предполагается наличие четырёх основных классов: сигнал, сеанс измерения, обследование и пациент. При дальнейшей детализации модели вводятся: каналы данных, оборудование, тип обследования, группы пациентов, исследования, фильтры данных, обработанные сигналы и т.д. Что является предметом исследования в дальнейшей работе. Наличие связи между основными объектами модели данных обуславливает появление дополнительного класса «Хранилище». В его рамках будет происходить манипуляция объектами и организация связей между ними. С другой стороны, для пользователя библиотекой важна простота интерфейса. Так, например, логично выглядит, что если надо обработать сигналы текущего сеанса измерения, то надо вызвать метод getSignals(). Для решения этой задачи предлагается получать объекты в явном и неявном виде только из «Хранилища», а каждый объект должен хранить ссылку на него. В качестве глобального идентификатора объекта был выбран UUID. Генерация классов системы хранения Все рассматриваемые классы содержат поля из небольшого набора типов, которые можно разделить на три класса: базовые (целые и действительные числа, строки, дата и время), массивы (например, массив действительных чисел, определяющий данные сигнала) и дополнительные (например, пол пациента). А также, содержать связи между объектами разных классов. Это позволяет свести описание классов хранимых объектов в формате JSON к виду: {'name': "Patient", 'fields': [ {'name': "FullName", 'type': "TEXT"}, {'name': "Sex", 'type': "PATIENT_SEX"} ], 'link_included' : [], 'link_contains' : [ "Examination" ]}. А по этому описанию, используя шаблоны, генерировать публичные и приватные классы, а также методы обработки в «Хранилище». В качестве инструмента генерации по шаблонам был выбран модуль Mako для языка программирования Python. При реализации были зафиксированы следующие моменты:
Для хранения объектов реализовано два вида классов:
В планах реализовать дополнительные классы для шифрованной передачи данных по компьютерной сети и http-хранилище. Генерация всех классов по упрощённой модели в формате Json позволяет легко организовать процесс разработки детальной модели системы хранения. А код обработки полей разных типов легко унифицируется к словарной подстановке. Исключением являются только массивы, для которых была выбрана более сложная модель хранения (с загрузкой по требованию). Qt интерфейсы В лаборатории в качестве основной библиотеки создания графических приложений была выбрана Qt. В состав этой библиотеки входят классы для работы с различными базами данных и графические элементы отображения и обработки таблиц. Большинство этих классов построено на наследовании и использовании базового класса QAbstractItemModel и его специализации QAbstractTableModel, что позволяет получить большой набор классов для отображения и обработки данных путём наследования от этих классов. В качестве базового класса для табличного представления объектов в «Хранилище» был выбран QAbstractTableModel. Для каждого класса хранимых объектов генерируется Qt-модель данных, в которой определены методы отображения, изменения, добавления и удаления данных. Использование кэширования данных в «Хранилище» позволяет существенно сократить количество SQL-запросов к базе данных, с учётом частых вызовов функций получения данных в приложениях, построенных на основе моделей-данных Qt. Для упрощения работы с массивами чисел была введена дополнительная роль EGEGWBQT_BLOB_ROLE для методов data() и setData(), в рамках которых происходит работа с самими массивами. Тогда как в стандартных ролях эти поля доступны только на чтение и сигнализируют, что содержат BLOB-данные. Такой подход позволяет на первых этапах использовать QSortFilterProxyModel для сортировки и фильтрации данных таблиц без излишнего использования оперативной памяти на хранение массивов чисел. В рамкам последующей работы запланирована реализация генерации делегатов и форм для типовых случаев форматированного представления данных хранимых объектов. Результаты. В рамках разработки системы хранения электрогастроэнтерограмм на базе лаборатории измерительных систем и цифровой обработки сигналов института математики, информационных и космических технологий САФУ имени М.В. Ломоносова выработаны основные подходы и инструменты реализации. На базе выбранных подходов реализована система генерации исходного кода и показана работа с хранимыми объектами в разных языках программирования. Разработанная методика кодогенерации имеет потенциал к использованию не только в рамках создания системы хранения электрогастроэнтерограмм, но может использоваться и в аналогичных прикладных системах хранения связанных данных. Литература:
Научный руководитель: д.т.н., ведущий научный сотрудник лаборатории автоматизации научных исследований СПИИРАН Свиньин С.Ф. Работа выполнена при финансовой поддержке в рамках Государственного задания «Создание вычислительной инфраструктуры для решения наукоемких прикладных задач» (Проект № 3628) Статья отправлена: 14.06.2015 г. © Рудалёв А.В. Назад в раздел Популярно о болезнях ЖКТ читайте в разделе "Пациентам"
| |||||
|
Информация на сайте www.GastroScan.ru предназначена для образовательных и научных целей. Условия использования.
| |||||