Skip to content
This repository has been archived by the owner on Nov 26, 2023. It is now read-only.

Commit

Permalink
mesc navigator class and UI
Browse files Browse the repository at this point in the history
  • Loading branch information
kushalkolar committed Jul 27, 2020
1 parent e2f0da2 commit 6d5adf4
Show file tree
Hide file tree
Showing 3 changed files with 423 additions and 1 deletion.
113 changes: 112 additions & 1 deletion mesmerize/viewer/modules/femtonics_mesc.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
Module for importing data from MESc HDF5 files created from Femtonics microscopes.
"""

from PyQt5 import QtCore, QtWidgets
from .pytemplates.femtonics_mesc_template import *
import h5py
from datetime import datetime
import os
Expand All @@ -13,6 +13,117 @@
from re import sub as regex_sub


# Navigator object which helps control the
# user's file navigation through the .mesc file
class MEScNavigator(QtCore.QObject):
def __init__(self, parent, list_widgets: List[ListWidget]):
"""
:param parent: parent dockWidget
:param list_widgets: list of ListWidget ui objects, in the following order:
[sessions_list_widget, units_list_widget, channels_list_widget]
"""
QtCore.QObject.__init__(parent)

self.path: str = ''
self.file: h5py.File = None

self.session: str = '' # currently selected MSession
self.sessions: List[str] = list(self.file.keys()) # list of MSession options available in current file
self.listw_sessions = list_widgets[0] # ui list of MSession options

self.unit: str = '' # currently selected MUnit
self.units: List[str] = [] # list of MUnit options available in current MSession
self.listw_units = list_widgets[1] # ui list of MUnit options

self.channel: str = '' # currently selected Channel
self.channels: List[str] = [] # list of Channel options available in current MUnit
self.listw_channels = list_widgets[2] # ui list of Channel options

def set_file_path(self, path: str):
"""
set the path to the .mesc file
:param path: path to the .mesc hdf5 file
"""
f = h5py.File(path, mode='r')

# Check if "MSession_X" keys exist in the file
has_session_key = any(
k.startswith('MSession') for k in f.keys()
)

if not has_session_key:
raise TypeError(
"The chosen file does not appear to be a valid "
"`.mesc` file since it does not contain any "
"'MSession_X' data group(s)."
)

self.path = path
self.file = f

# just clear out everything
self.session: str = ''
self.sessions: List[str] = list(self.file.keys())
self.listw_sessions.setItems(self.sessions)

self.unit: str = ''
self.units: List[str] = []
self.listw_units.clear()

self.channel: str = ''
self.channels: List[str] = []
self.listw_units.clear()

def set_session(self, key: str):
if key not in self.sessions:
raise KeyError("Session not found in current file")

self.session = key

self.unit = ''
self.units = list(self.file[self.session].keys())
self.listw_units.setItems(self.units)

self.channel = ''
self.channels: List[str] = []
self.listw_channels.clear()

def set_unit(self, key: str):
if key not in self.units:
raise KeyError("Unit not found in current session")

self.unit = key

self.channel = ''
self.channels = list(self.file[self.session][self.unit].keys())
self.listw_channels.setItems(self.channels)

def get_hdf_path(self, astype: type) -> Union[str, list, dict]:
"""
get the current hdf path
:param astype: one of `str`, `list`, or `dict`
:return: the hdf path as the chosen data type
"""
path = [self.session, self.unit, self.channel]

if astype is str:
return '/'.join(
filter(None, path)
)

elif astype is list:
return path

elif astype is dict:
return {
'session': self.session,
'unit': self.unit,
'channels': self.channel
}


class ModuleGUI(QtWidgets.QDockWidget):
def __init__(self, parent, viewer_ref: ViewerUtils): # when a ModuleGUI() is instantiated the
# Viewer Window passes the viewer reference (viewer_ref)
Expand Down
122 changes: 122 additions & 0 deletions mesmerize/viewer/modules/pytemplates/femtonics_mesc_template.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file './ui_files/femtonics_mesc_template.ui'
#
# Created by: PyQt5 UI code generator 5.9.2
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_DockWidget(object):
def setupUi(self, DockWidget):
DockWidget.setObjectName("DockWidget")
DockWidget.resize(1050, 846)
self.dockWidgetContents = QtWidgets.QWidget()
self.dockWidgetContents.setObjectName("dockWidgetContents")
self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.dockWidgetContents)
self.verticalLayout_4.setObjectName("verticalLayout_4")
self.tabWidget = QtWidgets.QTabWidget(self.dockWidgetContents)
self.tabWidget.setObjectName("tabWidget")
self.tab_mesc_file = QtWidgets.QWidget()
self.tab_mesc_file.setObjectName("tab_mesc_file")
self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.tab_mesc_file)
self.verticalLayout_5.setObjectName("verticalLayout_5")
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.pushButton_open_file = QtWidgets.QPushButton(self.tab_mesc_file)
self.pushButton_open_file.setObjectName("pushButton_open_file")
self.horizontalLayout.addWidget(self.pushButton_open_file)
self.label_current_file_name = QtWidgets.QLabel(self.tab_mesc_file)
self.label_current_file_name.setText("")
self.label_current_file_name.setObjectName("label_current_file_name")
self.horizontalLayout.addWidget(self.label_current_file_name)
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem)
self.verticalLayout_5.addLayout(self.horizontalLayout)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.verticalLayout = QtWidgets.QVBoxLayout()
self.verticalLayout.setObjectName("verticalLayout")
self.label = QtWidgets.QLabel(self.tab_mesc_file)
font = QtGui.QFont()
font.setBold(True)
font.setWeight(75)
self.label.setFont(font)
self.label.setObjectName("label")
self.verticalLayout.addWidget(self.label)
self.listWidget_session = ListWidget(self.tab_mesc_file)
self.listWidget_session.setObjectName("listWidget_session")
self.verticalLayout.addWidget(self.listWidget_session)
self.horizontalLayout_2.addLayout(self.verticalLayout)
self.verticalLayout_2 = QtWidgets.QVBoxLayout()
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.label_2 = QtWidgets.QLabel(self.tab_mesc_file)
font = QtGui.QFont()
font.setBold(True)
font.setWeight(75)
self.label_2.setFont(font)
self.label_2.setObjectName("label_2")
self.verticalLayout_2.addWidget(self.label_2)
self.listWidget_unit = ListWidget(self.tab_mesc_file)
self.listWidget_unit.setObjectName("listWidget_unit")
self.verticalLayout_2.addWidget(self.listWidget_unit)
self.horizontalLayout_2.addLayout(self.verticalLayout_2)
self.verticalLayout_3 = QtWidgets.QVBoxLayout()
self.verticalLayout_3.setObjectName("verticalLayout_3")
self.label_3 = QtWidgets.QLabel(self.tab_mesc_file)
font = QtGui.QFont()
font.setBold(True)
font.setWeight(75)
self.label_3.setFont(font)
self.label_3.setObjectName("label_3")
self.verticalLayout_3.addWidget(self.label_3)
self.listWidget_channel = ListWidget(self.tab_mesc_file)
self.listWidget_channel.setObjectName("listWidget_channel")
self.verticalLayout_3.addWidget(self.listWidget_channel)
self.horizontalLayout_2.addLayout(self.verticalLayout_3)
self.verticalLayout_5.addLayout(self.horizontalLayout_2)
self.label_4 = QtWidgets.QLabel(self.tab_mesc_file)
font = QtGui.QFont()
font.setPointSize(14)
font.setBold(True)
font.setWeight(75)
self.label_4.setFont(font)
self.label_4.setObjectName("label_4")
self.verticalLayout_5.addWidget(self.label_4)
self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.pushButton = QtWidgets.QPushButton(self.tab_mesc_file)
self.pushButton.setObjectName("pushButton")
self.horizontalLayout_3.addWidget(self.pushButton)
self.pushButton_2 = QtWidgets.QPushButton(self.tab_mesc_file)
self.pushButton_2.setObjectName("pushButton_2")
self.horizontalLayout_3.addWidget(self.pushButton_2)
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout_3.addItem(spacerItem1)
self.verticalLayout_5.addLayout(self.horizontalLayout_3)
self.tabWidget.addTab(self.tab_mesc_file, "")
self.tab_stimulus_mapping = QtWidgets.QWidget()
self.tab_stimulus_mapping.setObjectName("tab_stimulus_mapping")
self.tabWidget.addTab(self.tab_stimulus_mapping, "")
self.verticalLayout_4.addWidget(self.tabWidget)
DockWidget.setWidget(self.dockWidgetContents)

self.retranslateUi(DockWidget)
self.tabWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(DockWidget)

def retranslateUi(self, DockWidget):
_translate = QtCore.QCoreApplication.translate
DockWidget.setWindowTitle(_translate("DockWidget", "Doc&kWidget"))
self.pushButton_open_file.setText(_translate("DockWidget", "Open .mesc file"))
self.label.setText(_translate("DockWidget", "Session"))
self.label_2.setText(_translate("DockWidget", "Unit"))
self.label_3.setText(_translate("DockWidget", "Channel"))
self.label_4.setText(_translate("DockWidget", "Import:"))
self.pushButton.setText(_translate("DockWidget", "Image"))
self.pushButton_2.setText(_translate("DockWidget", "Stim Map"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_mesc_file), _translate("DockWidget", "MESc File"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_stimulus_mapping), _translate("DockWidget", "Stimulus Mapping"))

from ....pyqtgraphCore.widgets.ListWidget import ListWidget

0 comments on commit 6d5adf4

Please sign in to comment.