Source code for egegrouper.sme_json

# 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/>.

"""Mapping examinations to and from JSON files."""

import json
import numpy as np
import os, shutil
from collections import OrderedDict

from . import sme

[docs]def get_exam(file_name): """Get examination object from JSON file. Parameters ---------- file_name : str Name of JSON file. Return ------ : sme.Examination Examination instance. """ abs_file_name = os.path.expanduser(file_name) abs_data_folder_name = "{}.data".format(abs_file_name) e = sme.Examination() with open(abs_file_name, 'r') as f: data = json.load(f) e.name = data['name'] e.age = data['age'] e.gender = data['gender'] e.diagnosis = data['diagnosis'] e.ms = [] for m_data in data['measurements']: m = sme.Measurement() m.time = m_data['time'] m.ss = [] for s_data in m_data['signals']: s = sme.Signal() s.dt = s_data['dt'] s.x = np.loadtxt( os.path.join( abs_data_folder_name, s_data['file'] ) ) m.ss.append(s) e.ms.append(m) return e
[docs]def put_exam(e, file_name): """Put examination to JSON file. Parameters ---------- e : sme.Examination Examination instance. file_name : str File name. """ abs_file_name = os.path.expanduser(file_name) abs_data_folder_name = "{}.data".format(abs_file_name) if os.path.isfile(abs_file_name): os.remove(abs_file_name) if os.path.isdir(abs_data_folder_name): shutil.rmtree(abs_data_folder_name) os.makedirs(abs_data_folder_name) e_dict = OrderedDict() e_dict['name'] = e.name e_dict['diagnosis'] = e.diagnosis e_dict['age'] = e.age e_dict['gender'] = e.gender e_dict['measurements'] = [] for (m, mn) in zip(e.ms, range(1, len(e.ms)+1)): m_dict = OrderedDict() m_dict['time'] = m.time m_dict['signals'] = [] for (s, sn) in zip(m.ss, range(1, len(m.ss)+1)): s_dict = OrderedDict() s_dict['dt'] = s.dt signal_file_name = 'signal-{}{}.txt'.format(mn, sn) s_dict['file'] = signal_file_name np.savetxt( os.path.join( abs_data_folder_name, signal_file_name ), s.x, fmt='%f' ) m_dict['signals'].append(s_dict) e_dict['measurements'].append(m_dict) s = json.dumps(e_dict, ensure_ascii=False, indent=' ') with open(abs_file_name, 'w') as f: f.write(s)