microeye 2.3.5__tar.gz → 2.3.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {microeye-2.3.5/src/microeye.egg-info → microeye-2.3.6}/PKG-INFO +29 -17
- {microeye-2.3.5 → microeye-2.3.6}/README.md +28 -16
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/_version.py +1 -1
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/camera_panel.py +6 -1
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/lasers/io_matchbox.py +140 -42
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/lasers/io_single_laser.py +129 -28
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/display.py +23 -26
- {microeye-2.3.5 → microeye-2.3.6/src/microeye.egg-info}/PKG-INFO +29 -17
- {microeye-2.3.5 → microeye-2.3.6}/LICENSE +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/MANIFEST.in +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/pyproject.toml +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/setup.cfg +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/setup.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/checklist_dialog.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/cmosMaps.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/filters/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/filters/base.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/filters/spatial.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/filters/temporal.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/fit.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/nena.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/phasor_fit.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/processing.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/psf/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/psf/extract.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/psf/rubost_mean.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/psf/spline.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/psf/stats/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/psf/stats/core.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/psf/stats/curve_fit.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/psf/stats/io.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/psf/stats/slope_fit.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/psf/temp.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/psf/test.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/pyfit3Dcspline/CPU/CPUfunctions.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/pyfit3Dcspline/CPU/CPUmleFit_LM.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/pyfit3Dcspline/CPU/CPUsplineLib.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/pyfit3Dcspline/CPU/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/pyfit3Dcspline/GPU/GPUfunctions.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/pyfit3Dcspline/GPU/GPUmleFit_LM_EMCCD.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/pyfit3Dcspline/GPU/GPUmleFit_LM_sCMOS.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/pyfit3Dcspline/GPU/GPUsplineLib.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/pyfit3Dcspline/GPU/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/pyfit3Dcspline/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/pyfit3Dcspline/constants.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/pyfit3Dcspline/mainfunctions.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/results.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/results_stats.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/tardis.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/multi_viewer.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/processing/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/processing/frc.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/rendering/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/rendering/base.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/rendering/cloud.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/rendering/core.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/rendering/volumetric.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/tools/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/tools/kymograms.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/tools/roi_selectors.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/utils/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/utils/coordinates.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/utils/images.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/utils/windows.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/viewer/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/viewer/image_options_widget.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/viewer/images.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/viewer/layers_widget.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/viewer/localizations.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/viewer/psf.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/viewer/volume.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/camera_calibration.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/camera_list.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/camera_options.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/dummy/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/dummy/dummy_panel.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/jobs.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/line_profiler.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/linescan/IR_Cam.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/linescan/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/micam.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/pco/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/pco/enums.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/pco/pco_cam.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/pco/pco_panel.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/shortcuts.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/thorlabs/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/thorlabs/thorlabs.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/thorlabs/thorlabs_panel.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/ueye/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/ueye/ueye_camera.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/ueye/ueye_panel.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/vimba/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/vimba/vimba_cam.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/vimba/vimba_panel.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/device.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/lasers/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/lasers/io_params.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/lasers/laser_relay.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/mieye/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/mieye/acquisition_manager.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/mieye/devices_manager.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/mieye/miEye.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/misc/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/misc/acquisition_view.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/misc/reglo.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/misc/temp.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/port_config.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/protocols/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/protocols/actions.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/protocols/actions_items.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/protocols/designer.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/protocols/scene_manager.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/protocols/serialization.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/pycromanager/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/pycromanager/core.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/pycromanager/devices.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/pycromanager/enums.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/pycromanager/headless.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/pycromanager/utils.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/pycromanager/widgets/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/pycromanager/widgets/bridges.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/pycromanager/widgets/headless_manager.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/pycromanager/widgets/headless_options.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/pycromanager/widgets/pycro_panel.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/elliptec/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/elliptec/baseDevice.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/elliptec/device.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/elliptec/deviceID.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/elliptec/devicePort.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/elliptec/deviceStatus.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/elliptec/devicesView.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/elliptec/ellDevices.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/elliptec/messageUpdater.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/elliptec/motorInfo.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/elliptec/stage.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/elliptec/test.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/kinesis/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/kinesis/kdc101/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/kinesis/kdc101/enums.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/kinesis/kdc101/factory.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/kinesis/kdc101/kdc101.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/kinesis/kinesis.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/piezo_concept.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/stabilizer.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/stage.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/widgets/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/widgets/controller.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/widgets/devices.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/widgets/focusWidget.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/widgets/qlist_slider.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/widgets/scan_acquisition.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/icons/1024.png +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/icons/128.png +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/icons/16.png +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/icons/24.png +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/icons/256.png +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/icons/32.png +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/icons/48.png +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/icons/512.png +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/icons/64.png +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/icons/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/icons/close.svg +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/icons/mieye.png +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/icons/min.svg +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/icons/viewer.png +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/launcher.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/qt.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/tools/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/tools/microscopy.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/enum_encoder.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/expandable_groupbox.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/gui_helper.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/hid_utils/__init__.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/hid_utils/controller.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/hid_utils/device.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/hid_utils/enums.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/hid_utils/utils.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/labelled_slider.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/metadata.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/metadata_tree.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/micro_launcher.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/parameter_tree.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/pyscripting.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/retry_exec.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/start_gui.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/thread_worker.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/uImage.py +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microeye.egg-info/SOURCES.txt +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microeye.egg-info/dependency_links.txt +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microeye.egg-info/entry_points.txt +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microeye.egg-info/requires.txt +0 -0
- {microeye-2.3.5 → microeye-2.3.6}/src/microeye.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: microeye
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.6
|
|
4
4
|
Summary: A python toolkit for fluorescence microscopy that features hardware control, data analysis and vizualization for super-resolution single-molecule localization microscopy and single-partical tracking.
|
|
5
5
|
Home-page: https://github.com/samhitech/microEye
|
|
6
6
|
Author: Mohammad Nour Alsamsam
|
|
@@ -95,11 +95,11 @@ This toolkit is compatible with the [hardware](#hardware) used in our microscope
|
|
|
95
95
|

|
|
96
96
|
|
|
97
97
|
```bash
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
98
|
+
__ ____ ____ ___ ____ ____
|
|
99
|
+
/ |/ (_)__________ / __/_ _____ _ __|_ | |_ / / __/
|
|
100
|
+
/ /|_/ / / __/ __/ _ \/ _// // / -_) | |/ / __/_ _/_ <_/ _ \
|
|
101
|
+
/_/ /_/_/\__/_/ \___/___/\_, /\__/ |___/____(_)____(_)___/
|
|
102
|
+
/___/
|
|
103
103
|
```
|
|
104
104
|
|
|
105
105
|
## Table of Contents
|
|
@@ -121,6 +121,7 @@ This toolkit is compatible with the [hardware](#hardware) used in our microscope
|
|
|
121
121
|
- [Additional Hardware](#additional-hardware)
|
|
122
122
|
- [Pycro-Manager Integration](#pycro-manager-integration)
|
|
123
123
|
- [Features](#features)
|
|
124
|
+
- [Integrated Hardware](#integrated-hardware)
|
|
124
125
|
- [How to Use](#how-to-use)
|
|
125
126
|
- [Authors](#authors)
|
|
126
127
|
- [People Involved](#people-involved)
|
|
@@ -317,25 +318,27 @@ Schematic overview of the miEye instrument:
|
|
|
317
318
|
|
|
318
319
|
### Supported Cameras
|
|
319
320
|
|
|
320
|
-
|
|
|
321
|
-
|
|
|
322
|
-
| IDS uEye UI-3060CP Rev. 2 | IDS industrial-grade CMOS cameras
|
|
323
|
-
|
|
|
324
|
-
| Allied Vision Alvium 1800 | Allied Vision industrial-grade CMOS cameras (U-158m, U-511m)
|
|
321
|
+
| Camera | Description | Link |
|
|
322
|
+
| :-----------------------: | ------------------------------------------------------------------------ | :-----------------------------------------------------------------------------------------------------------: |
|
|
323
|
+
| IDS uEye UI-3060CP Rev. 2 | IDS industrial-grade CMOS cameras | [Product Link](https://en.ids-imaging.com/store/products/cameras/ui-3060cp-rev-2.html) |
|
|
324
|
+
| Thorlabs DCC1545M | DCx camera using UC480 driver | [Product Link](https://www.thorlabs.com/thorProduct.cfm?partNumber=DCC1545M) |
|
|
325
|
+
| Allied Vision Alvium 1800 | Allied Vision industrial-grade CMOS cameras (U-158m, U-511m) | [Product Link](https://www.alliedvision.com/en/products/alvium-configurator/alvium-1800-u/158/#_configurator) |
|
|
326
|
+
| Excelitas PCO sCMOS | Excelitas pco.edge 4.2 LT USB sCMOS Camera | [Product Link](https://www.excelitas.com/product/pcoedge-42-lt-usb-scmos-camera) |
|
|
327
|
+
| Pycro-camera | Access to cameras via Micro-Manager drivers/adapters using Pycro-Manager | - |
|
|
325
328
|
|
|
326
329
|
### Additional Hardware
|
|
327
330
|
|
|
328
331
|
| Hardware | Description | Link |
|
|
329
332
|
| --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
330
|
-
| Integrated Optics MatchBox | Multi-wavelength Laser Combiner, Single Laser MatchBox | [Link](https://integratedoptics.com/products/wavelength-combiners)
|
|
331
|
-
| Piezo Concept FOC | Nanopositioner for microscope objectives | [
|
|
333
|
+
| Integrated Optics MatchBox | Multi-wavelength Laser Combiner, Single Laser MatchBox | [Products Link](https://integratedoptics.com/products/wavelength-combiners) |
|
|
334
|
+
| Piezo Concept FOC | Nanopositioner for microscope objectives | [Piezo Concept FOC](https://piezoconcept-store.squarespace.com/1-axis/p/foc) |
|
|
332
335
|
| Thorlabs Elliptec ELL6/ELL9/ELL12 | Dual/Four/Six-Position Slider | [ELL6](https://www.thorlabs.com/thorproduct.cfm?partnumber=ELL6), [ELL9](https://www.thorlabs.com/thorproduct.cfm?partnumber=ELL9), [ELL12](https://www.thorlabs.com/thorproduct.cfm?partnumber=ELL12) |
|
|
333
336
|
| Thorlabs Elliptec ELL14 | Rotation Mount: SM1 Threaded | [ELL14](https://www.thorlabs.com/thorproduct.cfm?partnumber=ELL14) |
|
|
334
337
|
| Thorlabs Elliptec ELL20 | Linear Stage: 60 mm Travel | [ELL20](https://www.thorlabs.com/thorproduct.cfm?partnumber=ELL20) |
|
|
335
|
-
| Thorlabs KDC101 | Kinesis Controller for Z825B/[Z925B](https://www.thorlabs.com/thorproduct.cfm?partnumber=Z925B) actuators (Activate USB VCP to access the COM port in device manager) | [
|
|
336
|
-
| Parallax TSL1401-DB (#28317) | Linescan Camera Module | [
|
|
338
|
+
| Thorlabs KDC101 | Kinesis Controller for Z825B/[Z925B](https://www.thorlabs.com/thorproduct.cfm?partnumber=Z925B) actuators (Activate USB VCP to access the COM port in device manager) | [KDC101](https://www.thorlabs.com/thorproduct.cfm?partnumber=KDC101) |
|
|
339
|
+
| Parallax TSL1401-DB (#28317) | Linescan Camera Module | [Parallax TSL1401-DB](https://eu.mouser.com/ProductDetail/Parallax/28317?qs=%2Fha2pyFaduiCRhuOAXMuCmQIeG1Q3R01m6Y1EH%252BmN80%3D) |
|
|
337
340
|
| RelayBox Arduino | For laser control using camera GPIO signals | [RelayBox](https://github.com/samhitech/RelayBox) |
|
|
338
|
-
| miEye OSF Project Parts List | Parts list of miEye OSF Project | [Link](https://osf.io/j2fqy/)
|
|
341
|
+
| miEye OSF Project Parts List | Parts list of miEye OSF Project | [Repo Link](https://osf.io/j2fqy/) |
|
|
339
342
|
|
|
340
343
|
## Pycro-Manager Integration
|
|
341
344
|
|
|
@@ -346,6 +349,15 @@ Integration with Pycro-Manager is now implemented, providing support for managin
|
|
|
346
349
|
- **Headless Manager**: Manage multiple headless Micro-Manager instances (JavaBackend), including starting, stopping, and saving configurations.
|
|
347
350
|
- **Core Instances Manager**: Handle multiple PycroCore instances for device communication and control.
|
|
348
351
|
|
|
352
|
+
### Integrated Hardware
|
|
353
|
+
|
|
354
|
+
The following table lists the hardware devices that are integrated and supported by the `miEye module`:
|
|
355
|
+
|
|
356
|
+
| Device | Description |
|
|
357
|
+
| :----: | ------------------------------------------------------------------------------------------- |
|
|
358
|
+
| Camera | Access Micro-Manager cameras (mainly done for focus stabilization). |
|
|
359
|
+
| ZStage | Access Micro-Manager Z-stage devices for focus stabilization and axial positioning control. |
|
|
360
|
+
|
|
349
361
|
### How to Use
|
|
350
362
|
|
|
351
363
|
1. **Headless Manager**:
|
|
@@ -410,7 +422,7 @@ Special thanks to the following projects and libraries that make this work possi
|
|
|
410
422
|
> Raw data to results: a hands-on introduction and overview of computational analysis for single-molecule localization microscopy", Martens et al., (2022), Frontiers in Bioinformatics. [Paper](https://www.frontiersin.org/articles/10.3389/fbinf.2021.817254)
|
|
411
423
|
|
|
412
424
|
- **TARDIS (Temporal Analysis of Relative Distances)**: We have developed a partial Python implementation of TARDIS without fitting for now. For more information, refer to the [TARDIS software releases](https://github.com/kjamartens/TARDIS-public). The underlying algorithms and scientific details of TARDIS are detailed in the manuscript:
|
|
413
|
-
> Martens et al., “Temporal analysis of relative distances (TARDIS) is a robust, parameter-free alternative to single-particle tracking”, Nature Methods (2024). [
|
|
425
|
+
> Martens et al., “Temporal analysis of relative distances (TARDIS) is a robust, parameter-free alternative to single-particle tracking”, Nature Methods (2024). [Article](https://rdcu.be/dv1sr)
|
|
414
426
|
|
|
415
427
|
**Note**: I'm committed to maintaining an accurate acknowledgment list for our project. However, if I inadvertently miss acknowledging your work, please don't hesitate to reach out to us. I appreciate your understanding, and I'm doing my best to manage all acknowledgments amidst my other responsibilities.
|
|
416
428
|
|
|
@@ -31,11 +31,11 @@ This toolkit is compatible with the [hardware](#hardware) used in our microscope
|
|
|
31
31
|

|
|
32
32
|
|
|
33
33
|
```bash
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
34
|
+
__ ____ ____ ___ ____ ____
|
|
35
|
+
/ |/ (_)__________ / __/_ _____ _ __|_ | |_ / / __/
|
|
36
|
+
/ /|_/ / / __/ __/ _ \/ _// // / -_) | |/ / __/_ _/_ <_/ _ \
|
|
37
|
+
/_/ /_/_/\__/_/ \___/___/\_, /\__/ |___/____(_)____(_)___/
|
|
38
|
+
/___/
|
|
39
39
|
```
|
|
40
40
|
|
|
41
41
|
## Table of Contents
|
|
@@ -57,6 +57,7 @@ This toolkit is compatible with the [hardware](#hardware) used in our microscope
|
|
|
57
57
|
- [Additional Hardware](#additional-hardware)
|
|
58
58
|
- [Pycro-Manager Integration](#pycro-manager-integration)
|
|
59
59
|
- [Features](#features)
|
|
60
|
+
- [Integrated Hardware](#integrated-hardware)
|
|
60
61
|
- [How to Use](#how-to-use)
|
|
61
62
|
- [Authors](#authors)
|
|
62
63
|
- [People Involved](#people-involved)
|
|
@@ -253,25 +254,27 @@ Schematic overview of the miEye instrument:
|
|
|
253
254
|
|
|
254
255
|
### Supported Cameras
|
|
255
256
|
|
|
256
|
-
|
|
|
257
|
-
|
|
|
258
|
-
| IDS uEye UI-3060CP Rev. 2 | IDS industrial-grade CMOS cameras
|
|
259
|
-
|
|
|
260
|
-
| Allied Vision Alvium 1800 | Allied Vision industrial-grade CMOS cameras (U-158m, U-511m)
|
|
257
|
+
| Camera | Description | Link |
|
|
258
|
+
| :-----------------------: | ------------------------------------------------------------------------ | :-----------------------------------------------------------------------------------------------------------: |
|
|
259
|
+
| IDS uEye UI-3060CP Rev. 2 | IDS industrial-grade CMOS cameras | [Product Link](https://en.ids-imaging.com/store/products/cameras/ui-3060cp-rev-2.html) |
|
|
260
|
+
| Thorlabs DCC1545M | DCx camera using UC480 driver | [Product Link](https://www.thorlabs.com/thorProduct.cfm?partNumber=DCC1545M) |
|
|
261
|
+
| Allied Vision Alvium 1800 | Allied Vision industrial-grade CMOS cameras (U-158m, U-511m) | [Product Link](https://www.alliedvision.com/en/products/alvium-configurator/alvium-1800-u/158/#_configurator) |
|
|
262
|
+
| Excelitas PCO sCMOS | Excelitas pco.edge 4.2 LT USB sCMOS Camera | [Product Link](https://www.excelitas.com/product/pcoedge-42-lt-usb-scmos-camera) |
|
|
263
|
+
| Pycro-camera | Access to cameras via Micro-Manager drivers/adapters using Pycro-Manager | - |
|
|
261
264
|
|
|
262
265
|
### Additional Hardware
|
|
263
266
|
|
|
264
267
|
| Hardware | Description | Link |
|
|
265
268
|
| --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
266
|
-
| Integrated Optics MatchBox | Multi-wavelength Laser Combiner, Single Laser MatchBox | [Link](https://integratedoptics.com/products/wavelength-combiners)
|
|
267
|
-
| Piezo Concept FOC | Nanopositioner for microscope objectives | [
|
|
269
|
+
| Integrated Optics MatchBox | Multi-wavelength Laser Combiner, Single Laser MatchBox | [Products Link](https://integratedoptics.com/products/wavelength-combiners) |
|
|
270
|
+
| Piezo Concept FOC | Nanopositioner for microscope objectives | [Piezo Concept FOC](https://piezoconcept-store.squarespace.com/1-axis/p/foc) |
|
|
268
271
|
| Thorlabs Elliptec ELL6/ELL9/ELL12 | Dual/Four/Six-Position Slider | [ELL6](https://www.thorlabs.com/thorproduct.cfm?partnumber=ELL6), [ELL9](https://www.thorlabs.com/thorproduct.cfm?partnumber=ELL9), [ELL12](https://www.thorlabs.com/thorproduct.cfm?partnumber=ELL12) |
|
|
269
272
|
| Thorlabs Elliptec ELL14 | Rotation Mount: SM1 Threaded | [ELL14](https://www.thorlabs.com/thorproduct.cfm?partnumber=ELL14) |
|
|
270
273
|
| Thorlabs Elliptec ELL20 | Linear Stage: 60 mm Travel | [ELL20](https://www.thorlabs.com/thorproduct.cfm?partnumber=ELL20) |
|
|
271
|
-
| Thorlabs KDC101 | Kinesis Controller for Z825B/[Z925B](https://www.thorlabs.com/thorproduct.cfm?partnumber=Z925B) actuators (Activate USB VCP to access the COM port in device manager) | [
|
|
272
|
-
| Parallax TSL1401-DB (#28317) | Linescan Camera Module | [
|
|
274
|
+
| Thorlabs KDC101 | Kinesis Controller for Z825B/[Z925B](https://www.thorlabs.com/thorproduct.cfm?partnumber=Z925B) actuators (Activate USB VCP to access the COM port in device manager) | [KDC101](https://www.thorlabs.com/thorproduct.cfm?partnumber=KDC101) |
|
|
275
|
+
| Parallax TSL1401-DB (#28317) | Linescan Camera Module | [Parallax TSL1401-DB](https://eu.mouser.com/ProductDetail/Parallax/28317?qs=%2Fha2pyFaduiCRhuOAXMuCmQIeG1Q3R01m6Y1EH%252BmN80%3D) |
|
|
273
276
|
| RelayBox Arduino | For laser control using camera GPIO signals | [RelayBox](https://github.com/samhitech/RelayBox) |
|
|
274
|
-
| miEye OSF Project Parts List | Parts list of miEye OSF Project | [Link](https://osf.io/j2fqy/)
|
|
277
|
+
| miEye OSF Project Parts List | Parts list of miEye OSF Project | [Repo Link](https://osf.io/j2fqy/) |
|
|
275
278
|
|
|
276
279
|
## Pycro-Manager Integration
|
|
277
280
|
|
|
@@ -282,6 +285,15 @@ Integration with Pycro-Manager is now implemented, providing support for managin
|
|
|
282
285
|
- **Headless Manager**: Manage multiple headless Micro-Manager instances (JavaBackend), including starting, stopping, and saving configurations.
|
|
283
286
|
- **Core Instances Manager**: Handle multiple PycroCore instances for device communication and control.
|
|
284
287
|
|
|
288
|
+
### Integrated Hardware
|
|
289
|
+
|
|
290
|
+
The following table lists the hardware devices that are integrated and supported by the `miEye module`:
|
|
291
|
+
|
|
292
|
+
| Device | Description |
|
|
293
|
+
| :----: | ------------------------------------------------------------------------------------------- |
|
|
294
|
+
| Camera | Access Micro-Manager cameras (mainly done for focus stabilization). |
|
|
295
|
+
| ZStage | Access Micro-Manager Z-stage devices for focus stabilization and axial positioning control. |
|
|
296
|
+
|
|
285
297
|
### How to Use
|
|
286
298
|
|
|
287
299
|
1. **Headless Manager**:
|
|
@@ -346,7 +358,7 @@ Special thanks to the following projects and libraries that make this work possi
|
|
|
346
358
|
> Raw data to results: a hands-on introduction and overview of computational analysis for single-molecule localization microscopy", Martens et al., (2022), Frontiers in Bioinformatics. [Paper](https://www.frontiersin.org/articles/10.3389/fbinf.2021.817254)
|
|
347
359
|
|
|
348
360
|
- **TARDIS (Temporal Analysis of Relative Distances)**: We have developed a partial Python implementation of TARDIS without fitting for now. For more information, refer to the [TARDIS software releases](https://github.com/kjamartens/TARDIS-public). The underlying algorithms and scientific details of TARDIS are detailed in the manuscript:
|
|
349
|
-
> Martens et al., “Temporal analysis of relative distances (TARDIS) is a robust, parameter-free alternative to single-particle tracking”, Nature Methods (2024). [
|
|
361
|
+
> Martens et al., “Temporal analysis of relative distances (TARDIS) is a robust, parameter-free alternative to single-particle tracking”, Nature Methods (2024). [Article](https://rdcu.be/dv1sr)
|
|
350
362
|
|
|
351
363
|
**Note**: I'm committed to maintaining an accurate acknowledgment list for our project. However, if I inadvertently miss acknowledging your work, please don't hesitate to reach out to us. I appreciate your understanding, and I'm doing my best to manage all acknowledgments amidst my other responsibilities.
|
|
352
364
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
version_info = (2, 3,
|
|
1
|
+
version_info = (2, 3, 6)
|
|
2
2
|
__version__ = '.'.join(map(str, version_info))
|
|
@@ -25,7 +25,7 @@ from microEye.hardware.cams.shortcuts import (
|
|
|
25
25
|
CameraShortcutsWidget,
|
|
26
26
|
)
|
|
27
27
|
from microEye.qt import QDateTime, Qt, QtCore, QtWidgets, Signal, Slot
|
|
28
|
-
from microEye.utils.display import DisplayManager
|
|
28
|
+
from microEye.utils.display import DisplayManager, fast_autolevels_opencv
|
|
29
29
|
from microEye.utils.expandable_groupbox import ExpandableGroupBox
|
|
30
30
|
from microEye.utils.gui_helper import get_scaling_factor
|
|
31
31
|
from microEye.utils.metadata_tree import MetadataEditorTree, MetaParams
|
|
@@ -848,6 +848,9 @@ def display_frame(
|
|
|
848
848
|
if isinstance(frame, uImage):
|
|
849
849
|
frame = frame._image
|
|
850
850
|
|
|
851
|
+
thresholds, hist, cdf = fast_autolevels_opencv(
|
|
852
|
+
frame, levels=camp.camera_options.isAutostretch)
|
|
853
|
+
|
|
851
854
|
# cv2.imshow(name, frame)
|
|
852
855
|
DisplayManager.instance().image_update_signal.emit(
|
|
853
856
|
name,
|
|
@@ -862,6 +865,8 @@ def display_frame(
|
|
|
862
865
|
'isROIsView': camp.camera_options.isROIsView,
|
|
863
866
|
'isOverlaidView': camp.camera_options.isOverlaidView,
|
|
864
867
|
'plot_type': camp.camera_options.isHistogramPlot,
|
|
868
|
+
'threshold': thresholds,
|
|
869
|
+
'plot': hist if camp.camera_options.isHistogramPlot else cdf,
|
|
865
870
|
},
|
|
866
871
|
)
|
|
867
872
|
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import time
|
|
1
2
|
from typing import Optional
|
|
2
3
|
|
|
4
|
+
import serial
|
|
3
5
|
from pyqtgraph.parametertree import Parameter
|
|
4
6
|
|
|
5
7
|
from microEye.hardware.lasers.io_params import LaserState, MB_Params
|
|
@@ -7,9 +9,9 @@ from microEye.qt import QtCore, QtSerialPort, QtWidgets, Signal
|
|
|
7
9
|
from microEye.utils import StartGUI, Tree
|
|
8
10
|
|
|
9
11
|
|
|
10
|
-
class io_combiner(
|
|
12
|
+
class io_combiner(QtCore.QObject):
|
|
11
13
|
'''
|
|
12
|
-
Class representing a laser combiner MatchBox device | Inherits
|
|
14
|
+
Class representing a laser combiner MatchBox device | Inherits QObject
|
|
13
15
|
'''
|
|
14
16
|
|
|
15
17
|
INFO = b'r i'
|
|
@@ -115,6 +117,82 @@ class io_combiner(QtSerialPort.QSerialPort):
|
|
|
115
117
|
Max = [0, 0, 0, 0]
|
|
116
118
|
Wavelengths = [0, 0, 0, 0]
|
|
117
119
|
|
|
120
|
+
def __init__(self, parent: Optional[QtWidgets.QWidget] = None, **kwargs):
|
|
121
|
+
'''
|
|
122
|
+
Initializes a new io_single_laser instance.
|
|
123
|
+
|
|
124
|
+
Parameters
|
|
125
|
+
----------
|
|
126
|
+
parent : Optional[QWidget]
|
|
127
|
+
The parent widget for this io_single_laser instance.
|
|
128
|
+
'''
|
|
129
|
+
super().__init__(parent=parent)
|
|
130
|
+
|
|
131
|
+
self.ser = serial.Serial(
|
|
132
|
+
baudrate=kwargs.get('baudrate', 115200), # Default baudrate
|
|
133
|
+
port=kwargs.get('port', 'COM1'), # Default port
|
|
134
|
+
timeout=kwargs.get('timeout', 0.5), # Default timeout
|
|
135
|
+
write_timeout=kwargs.get('write_timeout', 0.5), # Default write timeout
|
|
136
|
+
open=False, # Start with the port closed
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
def isOpen(self) -> bool:
|
|
140
|
+
'''
|
|
141
|
+
Checks if the serial port is open.
|
|
142
|
+
|
|
143
|
+
Returns
|
|
144
|
+
-------
|
|
145
|
+
bool
|
|
146
|
+
True if the serial port is open, False otherwise.
|
|
147
|
+
'''
|
|
148
|
+
return self.ser.is_open
|
|
149
|
+
|
|
150
|
+
def setPortName(self, port: str):
|
|
151
|
+
'''
|
|
152
|
+
Sets the port name for the serial connection.
|
|
153
|
+
|
|
154
|
+
Parameters
|
|
155
|
+
----------
|
|
156
|
+
port : str
|
|
157
|
+
The name of the serial port to be used.
|
|
158
|
+
'''
|
|
159
|
+
if not self.ser.is_open:
|
|
160
|
+
self.ser.port = port
|
|
161
|
+
|
|
162
|
+
def portName(self) -> str:
|
|
163
|
+
'''
|
|
164
|
+
Returns the current port name of the serial connection.
|
|
165
|
+
|
|
166
|
+
Returns
|
|
167
|
+
-------
|
|
168
|
+
str
|
|
169
|
+
The current port name.
|
|
170
|
+
'''
|
|
171
|
+
return self.ser.port
|
|
172
|
+
|
|
173
|
+
def setBaudRate(self, baudrate: int):
|
|
174
|
+
'''
|
|
175
|
+
Sets the baud rate for the serial connection.
|
|
176
|
+
|
|
177
|
+
Parameters
|
|
178
|
+
----------
|
|
179
|
+
baudrate : int
|
|
180
|
+
The baud rate to be used for the serial connection.
|
|
181
|
+
'''
|
|
182
|
+
if not self.ser.is_open:
|
|
183
|
+
self.ser.baudrate = baudrate
|
|
184
|
+
|
|
185
|
+
def baudRate(self) -> int:
|
|
186
|
+
'''
|
|
187
|
+
Returns the current baud rate of the serial connection.
|
|
188
|
+
|
|
189
|
+
Returns
|
|
190
|
+
-------
|
|
191
|
+
int
|
|
192
|
+
The current baud rate.
|
|
193
|
+
'''
|
|
194
|
+
return self.ser.baudrate
|
|
195
|
+
|
|
118
196
|
def SendCommand(self, command, log_print: bool = True, delay: int = 1):
|
|
119
197
|
'''Sends a specific command to the device and waits for
|
|
120
198
|
the response then emits the DataReady signal.
|
|
@@ -127,54 +205,72 @@ class io_combiner(QtSerialPort.QSerialPort):
|
|
|
127
205
|
implemented in the MatchBox class.
|
|
128
206
|
'''
|
|
129
207
|
if self.isOpen():
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
errors='replace',
|
|
208
|
+
try:
|
|
209
|
+
self.ser.reset_input_buffer()
|
|
210
|
+
|
|
211
|
+
start_time = time.time()
|
|
212
|
+
self.ser.write(command)
|
|
213
|
+
|
|
214
|
+
response = (
|
|
215
|
+
self.ser.read_until(b'\r\n')
|
|
216
|
+
.decode(errors='replace')
|
|
217
|
+
.replace(b'\xff', b'')
|
|
218
|
+
.strip()
|
|
142
219
|
)
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
220
|
+
elapsed_time = (
|
|
221
|
+
time.time() - start_time
|
|
222
|
+
) * 1000 # Convert to milliseconds
|
|
223
|
+
if log_print:
|
|
224
|
+
print(
|
|
225
|
+
f'Command: {command} | '
|
|
226
|
+
f'Response: {response} | '
|
|
227
|
+
f'Time: {elapsed_time:.1f} ms'
|
|
228
|
+
)
|
|
148
229
|
|
|
149
|
-
|
|
230
|
+
self.DataReady.emit(response, command)
|
|
150
231
|
|
|
151
|
-
|
|
232
|
+
return response
|
|
233
|
+
except serial.SerialException as e:
|
|
234
|
+
print(f'Serial communication error: {e}')
|
|
235
|
+
return '<ERR>'
|
|
236
|
+
except Exception as e:
|
|
237
|
+
print(f'Unexpected error: {e}')
|
|
238
|
+
return '<ERR>'
|
|
152
239
|
|
|
153
240
|
def OpenCOM(self):
|
|
154
241
|
'''Opens the serial port and initializes the combiner.'''
|
|
155
242
|
if not self.isOpen():
|
|
156
|
-
|
|
157
|
-
|
|
243
|
+
try:
|
|
244
|
+
self.ser.open()
|
|
245
|
+
except serial.SerialException as e:
|
|
246
|
+
print(f'Error opening serial port: {e}')
|
|
158
247
|
|
|
159
248
|
if self.isOpen():
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
249
|
+
try:
|
|
250
|
+
self.SendCommand(io_combiner.ON)
|
|
251
|
+
self.SendCommand(io_combiner.START)
|
|
252
|
+
# self.SendCommand(io_single_laser.STATUS)
|
|
253
|
+
self.GetInfo()
|
|
254
|
+
self.GetWavelengths()
|
|
255
|
+
self.SetCurrent(1, 0)
|
|
256
|
+
self.SetCurrent(2, 0)
|
|
257
|
+
self.SetCurrent(3, 0)
|
|
258
|
+
self.SetCurrent(4, 0)
|
|
259
|
+
self.GetMaxCurrent()
|
|
260
|
+
except serial.SerialException as e:
|
|
261
|
+
print(f'Error during initialization: {e}')
|
|
262
|
+
|
|
263
|
+
return self.isOpen()
|
|
170
264
|
|
|
171
265
|
def CloseCOM(self):
|
|
172
266
|
'''Closes the serial port.'''
|
|
173
267
|
if self.isOpen():
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
268
|
+
try:
|
|
269
|
+
self.SendCommand(io_combiner.OFF)
|
|
270
|
+
except serial.SerialException as e:
|
|
271
|
+
print(f'Error closing serial port: {e}')
|
|
272
|
+
finally:
|
|
273
|
+
self.ser.close()
|
|
178
274
|
|
|
179
275
|
def GetMaxCurrent(self):
|
|
180
276
|
if self.isOpen():
|
|
@@ -287,7 +383,7 @@ class io_combiner(QtSerialPort.QSerialPort):
|
|
|
287
383
|
if not isinstance(value, int):
|
|
288
384
|
raise TypeError('Current must be an int!')
|
|
289
385
|
if value < 0 or value > self.Max[index - 1]:
|
|
290
|
-
raise ValueError(f'Current must be between 0 and {self.Max[index-1]}')
|
|
386
|
+
raise ValueError(f'Current must be between 0 and {self.Max[index - 1]}')
|
|
291
387
|
|
|
292
388
|
res = self.SendCommand(f'Lc{index:.0f} {value:.0f}'.encode())
|
|
293
389
|
|
|
@@ -423,7 +519,7 @@ class CombinerLaserWidget(Tree):
|
|
|
423
519
|
{
|
|
424
520
|
'name': str(MB_Params.SERIAL_PORT),
|
|
425
521
|
'type': 'group',
|
|
426
|
-
'expanded'
|
|
522
|
+
'expanded': False,
|
|
427
523
|
'children': [
|
|
428
524
|
{
|
|
429
525
|
'name': str(MB_Params.PORT),
|
|
@@ -439,8 +535,8 @@ class CombinerLaserWidget(Tree):
|
|
|
439
535
|
'value': 115200,
|
|
440
536
|
'limits': [
|
|
441
537
|
baudrate
|
|
442
|
-
for baudrate in
|
|
443
|
-
|
|
538
|
+
for baudrate in
|
|
539
|
+
QtSerialPort.QSerialPortInfo.standardBaudRates()
|
|
444
540
|
],
|
|
445
541
|
},
|
|
446
542
|
{'name': str(MB_Params.SET_PORT), 'type': 'action'},
|
|
@@ -610,7 +706,9 @@ class CombinerLaserWidget(Tree):
|
|
|
610
706
|
|
|
611
707
|
self.param_tree = Parameter.create(name='', type='group', children=params)
|
|
612
708
|
self.param_tree.sigTreeStateChanged.connect(self.change)
|
|
613
|
-
self.header().setSectionResizeMode(
|
|
709
|
+
self.header().setSectionResizeMode(
|
|
710
|
+
QtWidgets.QHeaderView.ResizeMode.ResizeToContents
|
|
711
|
+
)
|
|
614
712
|
|
|
615
713
|
self.get_param(MB_Params.SET_PORT).sigActivated.connect(self.set_config)
|
|
616
714
|
self.get_param(MB_Params.OPEN).sigActivated.connect(self.laser_connect)
|