-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathexaspim_userinterface.py
160 lines (128 loc) · 7.42 KB
/
exaspim_userinterface.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
import napari
from qtpy.QtWidgets import QDockWidget, QTabWidget,QPlainTextEdit, QDialog, QFrame, QToolButton, QMenu, QWidgetAction, QAction
from PyQt5 import QtWidgets
import exaspim.exaspim as exaspim
from widgets.instrument_parameters import InstrumentParameters
from widgets.volumeteric_acquisition import VolumetericAcquisition
from widgets.livestream import Livestream
from widgets.lasers import Lasers
from widgets.tissue_map import TissueMap
import logging
class UserInterface:
def __init__(self, config_filepath: str,
log_filename: str = 'debug.log',
console_output: bool = True,
console_output_level: str = 'info',
simulated: bool = False):
self.instrument = exaspim.Exaspim(config_filepath=config_filepath, simulated=simulated)
self.simulated = simulated
self.cfg = self.instrument.cfg
self.viewer = napari.Viewer(title='exaSPIM control', ndisplay=2, axis_labels=('x', 'y'))
self.log = logging.getLogger(f"{__name__}.{self.__class__.__name__}")
# Set up laser sliders and tabs
self.laser_widget()
# Set up automatically generated widget labels and inputs
instr_params_window = self.instrument_params_widget()
# Set up main window on gui which combines livestreaming and volumeteric imaging
main_window = QDockWidget()
main_window.setWindowTitle('Main')
main_widgets = {
'main_block': self.instrument_params.create_layout(struct='V',
live = self.livestream_widget(),
vol = self.volumeteric_acquisition_widget()),
'stage_slider': self.livestream_parameters.move_stage_widget(),
}
main_window.setWidget(self.vol_acq_params.create_layout(struct='H', **main_widgets))
# Set up laser window combining laser sliders and selection
laser_window = QDockWidget()
laser_widget = {
'laser_slider': self.laser_slider,
'laser_select': self.laser_wl_select,
}
laser_window.setWidget(self.laser_parameters.create_layout(struct='H', **laser_widget))
# Set up tissue map widget
self.tissue_map_window = self.tissue_map_widget()
# Add dockwidgets to viewer
tabbed_widgets = QTabWidget() # Creating tab object
tabbed_widgets.setTabPosition(QTabWidget.South)
tabbed_widgets.addTab(main_window, 'Main Window') # Adding main window tab
tabbed_widgets = self.laser_parameters.add_wavelength_tabs(tabbed_widgets) # Generate laser wl tabs
tabbed_widgets.addTab(self.tissue_map_window, 'Tissue Map') # Adding tissue map tab
self.tissue_map.set_tab_widget(tabbed_widgets) # Passing in tab widget to tissue map
self.livestream_parameters.set_tab_widget(tabbed_widgets) # Passing in tab widget to livestream
self.vol_acq_params.set_tab_widget(tabbed_widgets)
tabbed_widgets.setMinimumHeight(600)
liveview_widget = self.livestream_parameters.create_layout(struct='V',
wv = self.livestream_parameters.liveview_widget(),
progress_bar = self.vol_acq_params.progress_bar_widget())
liveview_widget.setMaximumHeight(70)
self.viewer.window.add_dock_widget(self.livestream_parameters.create_layout(struct='V',
live=liveview_widget,
tab=tabbed_widgets), name=' ') # Adding tabs to window
self.viewer.window.add_dock_widget(instr_params_window, name='Instrument Parameters', area='left')
self.viewer.window.add_dock_widget(laser_window, name="Laser Current", area='bottom')
self.viewer.scale_bar.visible = True
self.viewer.scale_bar.unit = "um"
def instrument_params_widget(self):
self.instrument_params = InstrumentParameters(self.simulated, self.instrument, self.cfg)
tabbed_widgets = QTabWidget() # Creating tab object
tabbed_widgets.setTabPosition(QTabWidget.North)
tabbed_widgets.addTab(self.instrument_params.joystick_remap_tab(), 'Joystick')
tabbed_widgets.addTab(self.instrument_params.brain_orientation_widget(), 'Brain Orientation')
x_game_mode = True
widgets = {
'config_properties': self.instrument_params.scan_config(self.cfg, x_game_mode),
}
instrument_params_widget = self.instrument_params.create_layout('V', **widgets)
scroll_box = self.instrument_params.scroll_box(instrument_params_widget)
instrument_params_dock = QDockWidget()
instrument_params_dock.setWidget(scroll_box)
tabbed_widgets.addTab(instrument_params_dock, 'Parameters')
tabbed_widgets.setCurrentIndex(2)
return tabbed_widgets
def livestream_widget(self):
self.livestream_parameters = Livestream(self.viewer, self.cfg, self.instrument, self.simulated)
widgets = {
'screenshot': self.livestream_parameters.screenshot_button(),
'position': self.livestream_parameters.sample_stage_position(),
}
return self.livestream_parameters.create_layout(struct='V', **widgets)
def volumeteric_acquisition_widget(self):
self.vol_acq_params = VolumetericAcquisition(self.viewer, self.cfg, self.instrument, self.simulated)
widgets = {
'limits_button': QToolButton(),
'volumetric_image': self.vol_acq_params.volumeteric_imaging_button(),
'waveform': self.vol_acq_params.waveform_graph(),
}
vol_imaging_widget = self.vol_acq_params.create_layout(struct='V', **widgets)
widgets['limits_button'].setText('Calculate Limits')
menu = QMenu(widgets['limits_button'])
# Create a QAction to put scan table in menu
table = QWidgetAction(vol_imaging_widget)
limits_widget = self.vol_acq_params.limit_widget()
table.setDefaultWidget(self.vol_acq_params.limit_widget())
menu.addAction(table)
# Set menu
widgets['limits_button'].setMenu(menu)
widgets['limits_button'].setPopupMode(QToolButton.MenuButtonPopup)
return vol_imaging_widget
def tissue_map_widget(self):
self.tissue_map = TissueMap(self.instrument, self.viewer)
# Connect quick scan to progress bar
widgets = {
'graph': self.tissue_map.graph(),
'functions': self.tissue_map.mark_graph(),
}
widgets['functions'].setMaximumHeight(75)
return self.tissue_map.create_layout(struct='V', **widgets)
def laser_widget(self):
self.laser_parameters = Lasers(self.viewer, self.cfg, self.instrument, self.simulated)
widgets = {
'power': self.laser_parameters.laser_power_slider(),
}
self.laser_wl_select = self.laser_parameters.laser_wl_select()
self.laser_slider = self.laser_parameters.create_layout(struct='H', **widgets)
self.laser_slider = self.laser_parameters.laser_power_slider()
def close_instrument(self):
self.instrument.cfg.save()
self.instrument.close()