Source code for egegrouper.importers
# EGEGrouper - Software for grouping electrogastroenterography examinations.
# Copyright (C) 2017-2018 Aleksandr Popov
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from abc import ABC, abstractmethod
import os
import sqlite3
import numpy as np
from . import sme
from . import sme_json
from . import sme_sqlite3
[docs]class BaseImporter(ABC):
"""Base class for importers."""
def __init__(self, controller):
"""Constructor.
Set controller to work with.
"""
self.controller = controller
[docs] def do_work(self, source):
"""Try import data from source and ask controller to put data into storage.
Parameters
----------
source : str
Name of data source.
"""
abs_file_name = os.path.expanduser(source)
es = self._get_exams(abs_file_name)
self.controller.import_exams(es)
@abstractmethod
def _get_exams(self, source):
"""Return exams from data source or None.
Parameters
----------
source : str
Name of data source.
Returns
-------
list of sme.Examination
List of examinations.
"""
pass
[docs]class JsonFileImporter(BaseImporter):
"""Importer from JSON file."""
def _get_exams(self, source):
exam = sme_json.get_exam(source)
return [exam, ]
[docs]class SmeSqliteImporter(BaseImporter):
"""Importer from SME sqlite3 database."""
def _get_exams(self, source):
abs_file_name = os.path.expanduser(source)
conn = sqlite3.connect(abs_file_name)
c = conn.cursor()
c.execute("SELECT exam_id from examination;")
exams = []
for r in c.fetchall():
exam_id = r[0]
exam = sme_sqlite3.get_exam(conn, exam_id)
exams.append(exam)
conn.close()
return exams
[docs]class GsSqliteImporter(BaseImporter):
"""Importer from Gastroscan sqlite3 database."""
def _get_exams(self, source):
abs_file_name = os.path.expanduser(source)
conn = sqlite3.connect(abs_file_name)
c = conn.cursor()
exams = []
c.execute("""SELECT id, name, diagnosis, age, sex, date FROM record;""")
for record_row in c.fetchall():
e = sme.Examination()
record_id = record_row[0]
e.name = record_row[1]
e.diagnosis = record_row[2]
e.age = record_row[3]
e.gender = record_row[4]
m = sme.Measurement()
m.time = record_row[5]
m.ss = []
c.execute("""
SELECT signal
FROM waveform
WHERE (record_id = ?) and (edited = 0);""", (record_id, ))
for signal_row in c.fetchall():
s = sme.Signal()
s.dt = 0.5
s.x = np.array(np.frombuffer(signal_row[0]))
m.ss.append(s)
e.ms = [m]
exams.append(e)
conn.close()
# try to join examinations
joined_exams = exams
# TODO
return joined_exams