Skip to content

Commit

Permalink
Finish v0.0.0b2
Browse files Browse the repository at this point in the history
  • Loading branch information
cimbi committed Oct 8, 2019
2 parents 91a9bea + 111081f commit aa4783a
Show file tree
Hide file tree
Showing 12 changed files with 235 additions and 652 deletions.
4 changes: 2 additions & 2 deletions docs/conf.py
Expand Up @@ -26,7 +26,7 @@
# The short X.Y version
version = ''
# The full version, including alpha/beta/rc tags
release = '0.0a8'
release = '0.0b1'


# -- General configuration ---------------------------------------------------
Expand Down Expand Up @@ -74,7 +74,7 @@
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = 'alabaster'
html_theme = 'sphinx_rtd_theme'

# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
Expand Down
7 changes: 4 additions & 3 deletions pysigview/app/main_window.py
Expand Up @@ -485,9 +485,10 @@ def open_data_source(self, path):

ann_groups = sm.ODS.get_annotations()

for ann_group in ann_groups.items():
self.annotations.add_annotation_set(ann_group[1],
ann_group[0])
if ann_groups is not None:
for ann_group in ann_groups.items():
self.annotations.add_annotation_set(ann_group[1],
ann_group[0])

# Fork for buffer usage
if CONF.get('data_management', 'use_memory_buffer'):
Expand Down
5 changes: 2 additions & 3 deletions pysigview/core/file_formats/formats.py
Expand Up @@ -23,7 +23,7 @@
# Local imports
from .mefd import mefdHandler
from .d import dHandler

from .h5 import h5Handler

def extension_evaluator(path):
"""
Expand All @@ -39,7 +39,6 @@ def extension_evaluator(path):
extension = path[path.rindex('.'):]

formats = get_available_file_formats()

file_handler = [x for x in formats if x.extension == extension][0]

if file_handler == []:
Expand All @@ -56,6 +55,6 @@ def get_available_file_formats():
"""

# TODO do this automatically in the future
supported_file_formats = [mefdHandler(), dHandler()]
supported_file_formats = [mefdHandler(), dHandler(), h5Handler()]

return supported_file_formats
149 changes: 149 additions & 0 deletions pysigview/core/file_formats/h5.py
@@ -0,0 +1,149 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Apr 12 13:49:27 2018
Ing.,Mgr. (MSc.) Jan Cimbálník, PhD.
Biomedical engineering
International Clinical Research Center
St. Anne's University Hospital in Brno
Czech Republic
&
Mayo systems electrophysiology lab
Mayo Clinic
200 1st St SW
Rochester, MN
United States
"""

# Std imports

# Third pary imports
import numpy as np
import pandas as pd

import h5py

# Local imports
from ..source_manager import FileDataSource


class h5Handler(FileDataSource):
def __init__(self):
super(h5Handler, self).__init__()

self.name = 'SignalPlant HDF'
self.extension = '.h5'

self.hf = None

def load_metadata(self):

if self.hf is None:
self.hf = h5py.File(self._path, 'r')

try:
dataset = self.hf['Data']
except:
dataset = self.hf['data']

nsamp = dataset.shape[1]

if self.hf.attrs.get('time_info'):
rec_start = int(self.hf.attrs['time_info'] * 1e6)
else:
rec_start = 0
rec_stop = int(rec_start + (nsamp / self.hf.attrs['Fs']) * 1e6)
rec_dur = rec_stop - rec_start

# Get information about the recording
self.recording_info = {}
self.recording_info['recording_start'] = rec_start
self.recording_info['recording_end'] = rec_stop
self.recording_info['recording_duration'] = rec_dur
self.recording_info['extension'] = '.h5'
self.recording_info['nchan'] = len(self.hf['Info'])

# Get information about channels

channel_list = [x for x in self.hf['Info']]

dmap = np.zeros(len(channel_list),
dtype=[('fsamp', np.float, 1),
('nsamp', np.int32, 1),
('ufact', np.float, 1),
('unit', np.object, 1),
('channels', np.object, 1),
('discontinuities', np.ndarray, 1),
('ch_set', np.bool, 1),
('uutc_ss', np.int64, 2)])

for i, channel_info in enumerate(self.hf['Info']):
fsamp = self.hf.attrs['Fs']
if self.hf.attrs.get('unit'):
ufact = 1/self.hf.attrs['unit']
else:
ufact = 1
unit = channel_info[2].decode('UTF-8')
start_time = rec_start
end_time = rec_stop
disconts = np.c_[rec_start, rec_start]

dmap[i] = (fsamp, nsamp, ufact, unit,
channel_info[0].decode('UTF-8'), disconts,
True, [start_time, end_time])

self.data_map.setup_data_map(dmap)

def get_annotations(self):
"""
Returns:
--------
Annotations - in form of pandas DataFrame(s)
"""

return None

def get_data(self, data_map):
"""
Parameters:
-----------
data_map - DataMap instance for loading
Returns:
--------
The data in a list specified by channel_map
"""

channel_map = data_map.get_active_channels()
uutc_ss = data_map.get_active_largest_ss()

if self.hf is None:
self.hf = h5py.File(self._path, 'r')

channels = [x[0].decode('UTF-8') for x in self.hf['Info']]

if self.hf.attrs.get('time_info') is not None:
rec_start = int(self.hf.attrs['time_info'] * 1e6)
else:
rec_start = 0
samp_ss = [int(((x-rec_start)/1e6)*self.hf.attrs['Fs'])
for x in uutc_ss]

channel_idxs = [i for i, x in enumerate(channels)
if x in channel_map]

try:
dataset = self.hf['Data']
except:
dataset = self.hf['data']
dmat = dataset.value[channel_idxs, samp_ss[0]: samp_ss[1]]

data_out = np.empty(len(data_map), object)
for i in range(len(data_map)):
data_out[i] = np.array([], dtype='float32')
for i, ch in enumerate(channel_map):
ch_pos = np.argwhere(data_map['channels'] == ch)[0][0]
data_out[ch_pos] = dmat[i]

return data_out
14 changes: 7 additions & 7 deletions pysigview/core/file_formats/mefd.py
Expand Up @@ -69,13 +69,13 @@ def load_metadata(self):
self.recording_info['nchan'] = len(channel_list)

dmap = np.zeros(len(channel_list),
dtype=[('fsamp', np.float, 1),
('nsamp', np.int32, 1),
('ufact', np.float, 1),
('unit', np.object, 1),
('channels', np.object, 1),
('discontinuities', np.ndarray, 1),
('ch_set', np.bool, 1),
dtype=[('fsamp', np.float),
('nsamp', np.int32),
('ufact', np.float),
('unit', np.object),
('channels', np.object),
('discontinuities', np.ndarray),
('ch_set', np.bool),
('uutc_ss', np.int64, 2)])

for i, channel in enumerate(channel_list):
Expand Down
4 changes: 2 additions & 2 deletions pysigview/core/source_manager.py
Expand Up @@ -35,8 +35,8 @@ class DataMap:
def __init__(self):
super(DataMap, self).__init__()

self._map = np.array([], dtype=[('channels', object, 1),
('ch_set', np.bool, 1),
self._map = np.array([], dtype=[('channels', object),
('ch_set', np.bool),
('uutc_ss', np.int64, 2)])

def __getitem__(self, item):
Expand Down
31 changes: 14 additions & 17 deletions pysigview/plugins/measurement.py
Expand Up @@ -61,7 +61,6 @@ def __init__(self, parent):

# Setup camera
self.signal_camera = SignalCamera()
self.spectrogram_camera = SignalCamera()
self.spectrum_camera = SignalCamera()

self.canvas = scene.SceneCanvas(show=True, keys='interactive',
Expand Down Expand Up @@ -147,13 +146,14 @@ def set_spect_type(self, stype):
if stype == 'spectrum':
self.spectrum_line.visible = True
self.spectrogram.visible = False
self.spectrum_xaxis.axis._axis_label.text = 'Frequency [Hz]'
self.spectrum_view.camera = self.spectrum_camera
self.spectrum_xaxis.axis.axis_label = 'Frequency [Hz]'
self.spectrum_yaxis.axis.axis_label = 'Amplitude'

elif stype == 'spectrogram':
self.spectrogram.visible = True
self.spectrum_line.visible = False
self.spectrum_xaxis.axis._axis_label.text = 'Time [s]'
self.spectrum_view.camera = self.spectrogram_camera
self.spectrum_xaxis.axis.axis_label = 'Time [s]'
self.spectrum_yaxis.axis.axis_label = 'Frequency [Hz]'

self.update_signals()

Expand Down Expand Up @@ -315,17 +315,14 @@ def update_signals(self):
scale = [s_x, s_y, s_z]
self.spectrogram.transform = STTransform(scale)

# Adjust camera limits
pos = (0, 0)
size = (len(data) * 10 / self.curr_pc.fsamp, freqs[-1])
self.spectrogram_camera.limit_rect = pos, size

# Adjust camera view
freqs = freqs[low_lim_idx:high_lim_idx-1]
pos = (0, freqs[0])
size = (len(data) / self.curr_pc.fsamp, freqs[-1] - freqs[0])
self.spectrogram_camera.rect = pos, size
self.spectrum_camera.rect = pos, size

# Adjust camera limits
self.spectrum_camera.limit_rect = pos, size

class GeneralTools(QWidget):

Expand Down Expand Up @@ -526,11 +523,11 @@ def set_clim_low_s(self, val):
# Adjust text
self.clim_low_le.setText(str(low))

if self.spectrogram.data is None:
if self.spectrogram._data is None:
return

d_min = np.min(self.spectrogram.data)
d_max = np.max(self.spectrogram.data)
d_min = np.min(self.spectrogram._data)
d_max = np.max(self.spectrogram._data)
d_diff = d_max - d_min
low = ((low/100) * d_diff) + d_min
high = ((high/100) * d_diff) + d_min
Expand All @@ -546,11 +543,11 @@ def set_clim_high_s(self, val):
# Adjust text
self.clim_high_le.setText(str(high))

if self.spectrogram.data is None:
if self.spectrogram._data is None:
return

d_min = np.min(self.spectrogram.data)
d_max = np.max(self.spectrogram.data)
d_min = np.min(self.spectrogram._data)
d_max = np.max(self.spectrogram._data)
d_diff = d_max - d_min
low = ((low/100) * d_diff) + d_min
high = ((high/100) * d_diff) + d_min
Expand Down

0 comments on commit aa4783a

Please sign in to comment.