Skip to content

Commit

Permalink
copied and impemented setup_docks
Browse files Browse the repository at this point in the history
  • Loading branch information
seb5g committed Jun 19, 2024
1 parent 32224ed commit 5fd60f0
Showing 1 changed file with 248 additions and 0 deletions.
248 changes: 248 additions & 0 deletions src/pymodaq_plugins_teaching/app/beam_profiler_step.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,248 @@
from collections import OrderedDict
import datetime
import numpy as np

from pymodaq.utils.logger import set_logger, get_module_name
from pymodaq.utils.gui_utils.custom_app import CustomApp
from pymodaq.utils.gui_utils.dock import DockArea, Dock
from pymodaq.utils.gui_utils.file_io import select_file
from pymodaq.utils.config import Config

from qtpy import QtWidgets
from qtpy.QtCore import Slot, QDate, QThread

from pymodaq.utils import daq_utils as utils
from pymodaq.utils.parameter import ioxml
from pymodaq.control_modules.daq_viewer import DAQ_Viewer
from pymodaq.utils.plotting.data_viewers.viewer0D import Viewer0D

from pymodaq.utils.h5modules.browsing import H5Browser
from pymodaq.utils.h5modules.saving import H5Saver
from pymodaq.utils.h5modules.data_saving import DataToExportSaver
from pymodaq.utils.data import DataToExport
from pymodaq.utils.gui_utils.widgets.lcd import LCD

config = Config()
logger = set_logger(get_module_name(__file__))


class CustomAppExample(CustomApp):

# list of dicts enabling the settings tree on the user interface
params = [
{'title': 'Main settings:', 'name': 'main_settings', 'type': 'group', 'children': [
{'title': 'Save base path:', 'name': 'base_path', 'type': 'browsepath',
'value': config('data_saving', 'h5file', 'save_path')},
{'title': 'File name:', 'name': 'target_filename', 'type': 'str', 'value': "", 'readonly': True},
{'title': 'Date:', 'name': 'date', 'type': 'date', 'value': QDate.currentDate()},
{'title': 'Do something, such as showing data:', 'name': 'do_something', 'type': 'bool', 'value': False},
{'title': 'Something done:', 'name': 'something_done', 'type': 'led', 'value': False, 'readonly': True},
{'title': 'Infos:', 'name': 'info', 'type': 'text', 'value': ""},
{'title': 'push:', 'name': 'push', 'type': 'bool_push', 'value': False}
]},
{'title': 'Other settings:', 'name': 'other_settings', 'type': 'group', 'children': [
{'title': 'List of stuffs:', 'name': 'list_stuff', 'type': 'list', 'value': 'first',
'limits': ['first', 'second', 'third'], 'tip': 'choose a stuff from the list'},
{'title': 'List of integers:', 'name': 'list_int', 'type': 'list', 'value': 0,
'limits': [0, 256, 512], 'tip': 'choose a stuff from this int list'},
{'title': 'one integer:', 'name': 'an_integer', 'type': 'int', 'value': 500, },
{'title': 'one float:', 'name': 'a_float', 'type': 'float', 'value': 2.7, },
]},
]

def __init__(self, dockarea):

super().__init__(dockarea)

# init the object parameters
self.raw_data: DataToExport = None
self.setup_ui()

def setup_actions(self):
'''
subclass method from ActionManager
'''
logger.debug('setting actions')
self.add_action('quit', 'Quit', 'close2', "Quit program", toolbar=self.toolbar)
self.add_action('grab', 'Grab', 'camera', "Grab from camera", checkable=True, toolbar=self.toolbar)
self.add_action('load', 'Load', 'Open', "Load target file (.h5, .png, .jpg) or data from camera",
checkable=False, toolbar=self.toolbar)
self.add_action('save', 'Save', 'SaveAs', "Save current data", checkable=False, toolbar=self.toolbar)
self.add_action('show', 'Show/hide', 'read2', "Show Hide DAQViewer", checkable=True, toolbar=self.toolbar)

logger.debug('actions set')

def setup_docks(self):
'''
subclass method from CustomApp
'''
logger.debug('setting docks')
# create a dock containing a viewer object, could be 0D, 1D or 2D depending what kind of data one want to plot here a 0D
dock_viewer_2D = Dock('Viewer dock', size=(350, 350))
self.dockarea.addDock(dock_viewer_2D,)
target_widget = QtWidgets.QWidget()
self.target_viewer = Viewer2D(target_widget)
dock_viewer_2D.addWidget(target_widget)

dock_lcd_position = Dock('Beam position', size=(350, 350))
self.dockarea.addDock(dock_lcd_position, 'right', dock_viewer_2D)
lcd_widget_position = QtWidgets.QWidget()
dock_lcd_position.addWidget(lcd_widget_position)
self.lcd_position = LCD(lcd_widget_position, Nvals=2, labels=['x', 'y'])

self.daq_viewer_area = DockArea()
self.detector = DAQ_Viewer(self.daq_viewer_area, title="A detector")

# set its type to 'BSCamera'
self.detector.daq_type = 'DAQ2D'
self.detector.detector = 'BSCamera'
# init the detector and wait 1000ms for the completion
self.detector.init_hardware()
self.detector.settings.child('main_settings', 'wait_time').setValue(100)
QtWidgets.QApplication.processEvents()
QThread.msleep(1000)

logger.debug('docks are set')

def connect_things(self):
'''
subclass method from CustomApp
'''
logger.debug('connecting things')
self.log_signal[str].connect(self.add_log) # connect together this custom signal with the add_log method

self.detector.grab_done_signal.connect(self.data_done)
self.connect_action('quit', self.quit_function)
self.connect_action('load', self.load_file)
self.connect_action('save', self.save_data)

self.connect_action('grab', self.detector.grab)
self.connect_action('show', self.show_detector)
logger.debug('connecting done')

def show_detector(self, status):
self.dock_detector.setVisible(status)
self.dock_detector_settings.setVisible(status)

def setup_menu(self):
'''
subclass method from CustomApp
'''
logger.debug('settings menu')
file_menu = self.mainwindow.menuBar().addMenu('File')
self.affect_to('quit', file_menu)
file_menu.addSeparator()
self.affect_to('load', file_menu)
self.affect_to('save', file_menu)

self.affect_to('quit', file_menu)

logger.debug('menu set')

def value_changed(self, param):
logger.debug(f'calling value_changed with param {param.name()}')
if param.name() == 'do_something':
if param.value():
self.log_signal.emit('Do something')
self.detector.grab_done_signal.connect(self.show_data)
self.raw_data = [] # init the data to be finally saved
self.settings.child('main_settings', 'something_done').setValue(True)
else:
self.log_signal.emit('Stop Doing something')
self.detector.grab_done_signal.disconnect()
self.settings.child('main_settings', 'something_done').setValue(False)

logger.debug(f'Value change applied')

def data_done(self, data):
# print(data)
pass

def show_data(self, data: DataToExport):
"""
do stuff with data from the detector if its grab_done_signal has been connected
Parameters
----------
data: DataToExport
"""
self.raw_data = data
data0D = data.get_data_from_dim('Data0D')

self.target_viewer.show_data(data0D.data[0])

def load_file(self):
# init the data browser module
widg = QtWidgets.QWidget()
self.data_browser = H5Browser(widg)
widg.show()

def quit_function(self):
# close all stuff that need to be
self.detector.quit_fun()
QtWidgets.QApplication.processEvents()
self.mainwindow.close()

def run_detector(self):
self.detector.ui.grab_pb.click()

def save_data(self):
try:
path = select_file(start_path=self.settings.child('main_settings', 'base_path').value(), save=True,
ext='h5')
if path is not None:
# init the file object with an addhoc name given by the user
h5saver = H5Saver(save_type='custom')
h5saver.init_file(update_h5=True, addhoc_file_path=path)
datasaver = DataToExportSaver(h5saver)


# save all metadata
settings_str = ioxml.parameter_to_xml_string(self.settings)
settings_str = b'<All_settings>' + settings_str
settings_str += ioxml.parameter_to_xml_string(self.detector.settings) + ioxml.parameter_to_xml_string(
h5saver.settings) + b'</All_settings>'

datasaver.add_data(h5saver.root(), self.raw_data, settings_as_xml=settings_str)

h5saver.close_file()

st = 'file {:s} has been saved'.format(str(path))
self.add_log(st)
self.settings.child('main_settings', 'info').setValue(st)

except Exception as e:
logger.exception(str(e))

@Slot(str)
def add_log(self, txt):
"""
Add a log to the logger list from the given text log and the current time
================ ========= ======================
**Parameters** **Type** **Description**
*txt* string the log to be added
================ ========= ======================
"""
now = datetime.datetime.now()
new_item = QtWidgets.QListWidgetItem(str(now) + ": " + txt)
self.logger_list.addItem(new_item)
logger.info(txt)


def main():
import sys
app = QtWidgets.QApplication(sys.argv)
mainwindow = QtWidgets.QMainWindow()
dockarea = DockArea()
mainwindow.setCentralWidget(dockarea)

prog = CustomAppExample(dockarea)

mainwindow.show()
sys.exit(app.exec_())


if __name__ == '__main__':
main()

0 comments on commit 5fd60f0

Please sign in to comment.