Структура и генерация классов системы хранения электрогастроэнтерограмм

Результаты генерации исходного кода классов системы хранения электрогастроэнтерограмм. Описание методик и программных инструментов. Использование "умных" указателей std::shared_ptr в публичных классах за счёт стандартных конструкторов и операторов.

Рубрика Программирование, компьютеры и кибернетика
Вид статья
Язык русский
Дата добавления 02.03.2020
Размер файла 16,9 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru//

Структура и генерация классов системы хранения электрогастроэнтерограмм

А.В. Рудалёв

Аннотация

В работе представлены результаты генерации исходного кода классов системы хранения электрогастроэнтерограмм, описаны применяемые методики и программные инструменты, поставлены задачи по дальнейшему развитию разрабатываемой программной системы.

Ключевые слова: автоматическое программирование, автоматизация научных исследований, система хранения, электрогастроэнтерография

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. При реализации были зафиксированы следующие моменты:

строковые типы во внешнем ABI представлены как std::string в кодировке UTF-8;

множества объектов представлены как std::vector;

идентификатор объекта: UUID;

массивы чисел загружаются в память объектов из «Хранилища» только в момент первого использования;

внутри ссылки используют std::shared_ptr и std::weak_ptr;

внешнее ABI не использует ссылок (публичные объекты сами являются «активными» ссылками);

из публичной реализации «Хранилища» можно получить любой объект по его UUID;

объекты предоставляют методы для получения связанных с ним объектов;

текстовая сериализация объектов реализована в отдельном классе Json;

для каждого хранимого класса создаётся специальный кэш-класс, позволяющий кэшировать объекты на стороне «Хранилища»;

приватный класс «Хранилища» является виртуальным и реализуется в специализированных потомках;

конструктор базового класса «Хранилище» скрыт, а создание его объекта возможно в классах-потомках (например, StrogeSql или StorageMemory).

Для хранения объектов реализовано два вида классов:

StorageMemory -- для создания «Хранилища» в оперативной памяти,

StorageSql -- для хранения объектов в реляционных СУБД через библиотеку SOCI.

В планах реализовать дополнительные классы для шифрованной передачи данных по компьютерной сети и http-хранилище.

Генерация всех классов по упрощённой модели в формате Json позволяет легко организовать процесс разработки детальной модели системы хранения. А код обработки полей разных типов легко унифицируется к словарной подстановке. Исключением являются только массивы, для которых была выбрана более сложная модель хранения (с загрузкой по требованию).

Qt интерфейсы

В лаборатории в качестве основной библиотеки создания графических приложений была выбрана Qt. В состав этой библиотеки входят классы для работы с различными базами данных и графические элементы отображения и обработки таблиц. Большинство этих классов построено на наследовании и использовании базового класса QAbstractItemModel и его специализации QAbstractTableModel, что позволяет получить большой набор классов для отображения и обработки данных путём наследования от этих классов. В качестве базового класса для табличного представления объектов в «Хранилище» был выбран QAbstractTableModel. Для каждого класса хранимых объектов генерируется Qt-модель данных, в которой определены методы отображения, изменения, добавления и удаления данных.

Использование кэширования данных в «Хранилище» позволяет существенно сократить количество SQL-запросов к базе данных, с учётом частых вызовов функций получения данных в приложениях, построенных на основе моделей-данных Qt.

Для упрощения работы с массивами чисел была введена дополнительная роль EGEGWBQT_BLOB_ROLE для методов data() и setData(), в рамках которых происходит работа с самими массивами. Тогда как в стандартных ролях эти поля доступны только на чтение и сигнализируют, что содержат BLOB-данные. Такой подход позволяет на первых этапах использовать QSortFilterProxyModel для сортировки и фильтрации данных таблиц без излишнего использования оперативной памяти на хранение массивов чисел.

В рамкам последующей работы запланирована реализация генерации делегатов и форм для типовых случаев форматированного представления данных хранимых объектов.

Результаты. В рамках разработки системы хранения электрогастроэнтерограмм на базе лаборатории измерительных систем и цифровой обработки сигналов института математики, информационных и космических технологий САФУ имени М.В. Ломоносова выработаны основные подходы и инструменты реализации. На базе выбранных подходов реализована система генерации исходного кода и показана работа с хранимыми объектами в разных языках программирования. Разработанная методика кодогенерации имеет потенциал к использованию не только в рамках создания системы хранения электрогастроэнтерограмм, но может использоваться и в аналогичных прикладных системах хранения связанных данных.

Литература

Попов А.И., Рудалёв А.В., Тюльпин А.А. Сервис-ориентированная информационная система для сотрудничества исследователей в области электрогастроэнтерографии: представление данных // Научные труды SWorld. -2012. - Т. 14. № 4. - С. 38-43.

Свиньин С.Ф., Попов А.И., Рудалев А.В. Вейвлет-анализ и информационные технологии в задачах обработки электрогастроэнтерограмм // ТРУДЫ СПИИРАН . - 2013. - №4 (27). - С. 129-143.

Попов А.И., Тюльпин А.А., Рудалёв А.В. Программная библиотека для цифровой обработки сигналов электрогастроэнтерографии // Информационно-измерительные и управляющие системы. - 2014. - Т. 12. № 6. - С. 40-45.

Попов А.И. О состоянии исследований в области электрогастроэнтерографии в северном (арктическом) федеральном университете на 2014 год // Региональная информатика (РИ-2014). XIV Санкт-Петербургская международная конференция «Региональная информатика (РИ-2014)». Санкт-Петербург, 29-31 октября 2014 г.: Материалы конференции. \ СПОИСУ. - СПб, 2014. - С. 391-392

Размещено на Allbest.ru

...

Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.