microeye 2.3.7__tar.gz → 2.3.9__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.7/src/microeye.egg-info → microeye-2.3.9}/PKG-INFO +9 -9
- {microeye-2.3.7 → microeye-2.3.9}/README.md +8 -8
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/_version.py +1 -1
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/multi_viewer.py +64 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/viewer/localizations.py +29 -38
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/lasers/io_matchbox.py +6 -5
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/lasers/io_single_laser.py +5 -4
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/pycromanager/core.py +461 -321
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/pycromanager/devices.py +2 -1
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/pycromanager/widgets/pycro_panel.py +27 -14
- {microeye-2.3.7 → microeye-2.3.9/src/microeye.egg-info}/PKG-INFO +9 -9
- {microeye-2.3.7 → microeye-2.3.9}/LICENSE +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/MANIFEST.in +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/pyproject.toml +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/setup.cfg +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/setup.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/checklist_dialog.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/cmosMaps.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/filters/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/filters/base.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/filters/spatial.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/filters/temporal.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/fit.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/nena.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/phasor_fit.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/processing.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/psf/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/psf/extract.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/psf/rubost_mean.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/psf/spline.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/psf/stats/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/psf/stats/core.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/psf/stats/curve_fit.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/psf/stats/io.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/psf/stats/slope_fit.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/psf/temp.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/psf/test.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/pyfit3Dcspline/CPU/CPUfunctions.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/pyfit3Dcspline/CPU/CPUmleFit_LM.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/pyfit3Dcspline/CPU/CPUsplineLib.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/pyfit3Dcspline/CPU/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/pyfit3Dcspline/GPU/GPUfunctions.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/pyfit3Dcspline/GPU/GPUmleFit_LM_EMCCD.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/pyfit3Dcspline/GPU/GPUmleFit_LM_sCMOS.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/pyfit3Dcspline/GPU/GPUsplineLib.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/pyfit3Dcspline/GPU/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/pyfit3Dcspline/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/pyfit3Dcspline/constants.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/pyfit3Dcspline/mainfunctions.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/results.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/results_stats.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/fitting/tardis.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/processing/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/processing/frc.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/rendering/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/rendering/base.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/rendering/cloud.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/rendering/core.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/rendering/volumetric.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/tools/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/tools/kymograms.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/tools/roi_selectors.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/utils/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/utils/coordinates.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/utils/images.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/utils/windows.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/viewer/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/viewer/image_options_widget.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/viewer/images.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/viewer/layers_widget.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/viewer/psf.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/analysis/viewer/volume.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/cams/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/cams/camera_calibration.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/cams/camera_list.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/cams/camera_options.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/cams/camera_panel.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/cams/dummy/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/cams/dummy/dummy_panel.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/cams/jobs.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/cams/line_profiler.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/cams/linescan/IR_Cam.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/cams/linescan/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/cams/micam.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/cams/pco/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/cams/pco/enums.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/cams/pco/pco_cam.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/cams/pco/pco_panel.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/cams/shortcuts.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/cams/thorlabs/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/cams/thorlabs/thorlabs.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/cams/thorlabs/thorlabs_panel.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/cams/ueye/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/cams/ueye/ueye_camera.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/cams/ueye/ueye_panel.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/cams/vimba/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/cams/vimba/vimba_cam.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/cams/vimba/vimba_panel.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/device.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/lasers/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/lasers/io_params.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/lasers/laser_relay.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/mieye/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/mieye/acquisition_manager.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/mieye/devices_manager.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/mieye/miEye.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/misc/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/misc/acquisition_view.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/misc/reglo.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/misc/temp.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/port_config.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/protocols/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/protocols/actions.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/protocols/actions_items.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/protocols/designer.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/protocols/scene_manager.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/protocols/serialization.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/pycromanager/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/pycromanager/enums.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/pycromanager/headless.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/pycromanager/utils.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/pycromanager/widgets/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/pycromanager/widgets/bridges.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/pycromanager/widgets/headless_manager.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/pycromanager/widgets/headless_options.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/stages/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/stages/elliptec/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/stages/elliptec/baseDevice.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/stages/elliptec/device.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/stages/elliptec/deviceID.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/stages/elliptec/devicePort.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/stages/elliptec/deviceStatus.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/stages/elliptec/devicesView.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/stages/elliptec/ellDevices.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/stages/elliptec/messageUpdater.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/stages/elliptec/motorInfo.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/stages/elliptec/stage.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/stages/elliptec/test.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/stages/kinesis/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/stages/kinesis/kdc101/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/stages/kinesis/kdc101/enums.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/stages/kinesis/kdc101/factory.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/stages/kinesis/kdc101/kdc101.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/stages/kinesis/kinesis.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/stages/piezo_concept.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/stages/stabilizer.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/stages/stage.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/widgets/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/widgets/controller.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/widgets/devices.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/widgets/focusWidget.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/widgets/qlist_slider.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/hardware/widgets/scan_acquisition.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/icons/1024.png +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/icons/128.png +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/icons/16.png +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/icons/24.png +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/icons/256.png +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/icons/32.png +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/icons/48.png +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/icons/512.png +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/icons/64.png +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/icons/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/icons/close.svg +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/icons/mieye.png +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/icons/min.svg +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/icons/viewer.png +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/launcher.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/qt.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/tools/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/tools/microscopy.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/utils/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/utils/display.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/utils/enum_encoder.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/utils/expandable_groupbox.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/utils/gui_helper.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/utils/hid_utils/__init__.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/utils/hid_utils/controller.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/utils/hid_utils/device.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/utils/hid_utils/enums.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/utils/hid_utils/utils.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/utils/labelled_slider.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/utils/metadata.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/utils/metadata_tree.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/utils/micro_launcher.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/utils/parameter_tree.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/utils/pyscripting.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/utils/retry_exec.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/utils/start_gui.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/utils/thread_worker.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microEye/utils/uImage.py +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microeye.egg-info/SOURCES.txt +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microeye.egg-info/dependency_links.txt +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microeye.egg-info/entry_points.txt +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/src/microeye.egg-info/requires.txt +0 -0
- {microeye-2.3.7 → microeye-2.3.9}/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.9
|
|
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
|
|
@@ -70,6 +70,14 @@ The **`microEye`** is a Python toolkit for fluorescence microscopy that supports
|
|
|
70
70
|
|
|
71
71
|
This toolkit is compatible with the [hardware](#hardware) used in our microscope. For further details, refer to the [miEye microscope paper](https://doi.org/10.1016/j.ohx.2022.e00368) and [OSF project](http://doi.org/10.17605/osf.io/j2fqy).
|
|
72
72
|
|
|
73
|
+
```bash
|
|
74
|
+
__ __ _ ___ ___ ____ ___
|
|
75
|
+
| \/ (_)__ _ _ ___| __| _ ___ __ _|_ ) |__ // _ \
|
|
76
|
+
| |\/| | / _| '_/ _ \ _| || / -_) \ V // / _ |_ \\_, /
|
|
77
|
+
|_| |_|_\__|_| \___/___\_, \___| \_//___(_)___(_)_/
|
|
78
|
+
|__/
|
|
79
|
+
```
|
|
80
|
+
|
|
73
81
|

|
|
74
82
|

|
|
75
83
|

|
|
@@ -94,14 +102,6 @@ This toolkit is compatible with the [hardware](#hardware) used in our microscope
|
|
|
94
102
|

|
|
95
103
|

|
|
96
104
|
|
|
97
|
-
```bash
|
|
98
|
-
__ ____ ____ ___ ____ ____
|
|
99
|
-
/ |/ (_)__________ / __/_ _____ _ __|_ | |_ //_ /
|
|
100
|
-
/ /|_/ / / __/ __/ _ \/ _// // / -_) | |/ / __/_ _/_ <_ / /
|
|
101
|
-
/_/ /_/_/\__/_/ \___/___/\_, /\__/ |___/____(_)____(_)_/
|
|
102
|
-
/___/
|
|
103
|
-
```
|
|
104
|
-
|
|
105
105
|
## Table of Contents
|
|
106
106
|
|
|
107
107
|
- [The microEye](#the-microeye)
|
|
@@ -6,6 +6,14 @@ The **`microEye`** is a Python toolkit for fluorescence microscopy that supports
|
|
|
6
6
|
|
|
7
7
|
This toolkit is compatible with the [hardware](#hardware) used in our microscope. For further details, refer to the [miEye microscope paper](https://doi.org/10.1016/j.ohx.2022.e00368) and [OSF project](http://doi.org/10.17605/osf.io/j2fqy).
|
|
8
8
|
|
|
9
|
+
```bash
|
|
10
|
+
__ __ _ ___ ___ ____ ___
|
|
11
|
+
| \/ (_)__ _ _ ___| __| _ ___ __ _|_ ) |__ // _ \
|
|
12
|
+
| |\/| | / _| '_/ _ \ _| || / -_) \ V // / _ |_ \\_, /
|
|
13
|
+
|_| |_|_\__|_| \___/___\_, \___| \_//___(_)___(_)_/
|
|
14
|
+
|__/
|
|
15
|
+
```
|
|
16
|
+
|
|
9
17
|

|
|
10
18
|

|
|
11
19
|

|
|
@@ -30,14 +38,6 @@ This toolkit is compatible with the [hardware](#hardware) used in our microscope
|
|
|
30
38
|

|
|
31
39
|

|
|
32
40
|
|
|
33
|
-
```bash
|
|
34
|
-
__ ____ ____ ___ ____ ____
|
|
35
|
-
/ |/ (_)__________ / __/_ _____ _ __|_ | |_ //_ /
|
|
36
|
-
/ /|_/ / / __/ __/ _ \/ _// // / -_) | |/ / __/_ _/_ <_ / /
|
|
37
|
-
/_/ /_/_/\__/_/ \___/___/\_, /\__/ |___/____(_)____(_)_/
|
|
38
|
-
/___/
|
|
39
|
-
```
|
|
40
|
-
|
|
41
41
|
## Table of Contents
|
|
42
42
|
|
|
43
43
|
- [The microEye](#the-microeye)
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
version_info = (2, 3,
|
|
1
|
+
version_info = (2, 3, 9)
|
|
2
2
|
__version__ = '.'.join(map(str, version_info))
|
|
@@ -203,6 +203,10 @@ class multi_viewer(QMainWindow):
|
|
|
203
203
|
# Connect double-click signal to a method that uses QTimer
|
|
204
204
|
self.tree.doubleClicked.connect(self._open_file)
|
|
205
205
|
|
|
206
|
+
# Create Tree view context menu
|
|
207
|
+
self.tree.setContextMenuPolicy(Qt.CustomContextMenu)
|
|
208
|
+
self.tree.customContextMenuRequested.connect(self._show_tree_context_menu)
|
|
209
|
+
|
|
206
210
|
# Add the File system tab contents
|
|
207
211
|
self.imsq_pattern = QtWidgets.QLineEdit('/image_0*.ome.tif')
|
|
208
212
|
|
|
@@ -210,6 +214,66 @@ class multi_viewer(QMainWindow):
|
|
|
210
214
|
self.file_tree_layout.addWidget(self.imsq_pattern)
|
|
211
215
|
self.file_tree_layout.addWidget(self.tree)
|
|
212
216
|
|
|
217
|
+
def _show_tree_context_menu(self, position):
|
|
218
|
+
index = self.tree.indexAt(position)
|
|
219
|
+
if not index.isValid():
|
|
220
|
+
return
|
|
221
|
+
|
|
222
|
+
menu = QtWidgets.QMenu()
|
|
223
|
+
reveal_action = menu.addAction('Reveal in Explorer')
|
|
224
|
+
new_folder_action = menu.addAction('New Folder')
|
|
225
|
+
menu.addSeparator()
|
|
226
|
+
|
|
227
|
+
# Root path shortcuts
|
|
228
|
+
root_action = menu.addAction('This PC (Root Path)')
|
|
229
|
+
home_action = menu.addAction('Home (User Directory)')
|
|
230
|
+
desktop_action = menu.addAction('Desktop')
|
|
231
|
+
initial_action = menu.addAction('Initial Path')
|
|
232
|
+
working_dir_action = menu.addAction('Working Directory')
|
|
233
|
+
|
|
234
|
+
action = menu.exec(self.tree.viewport().mapToGlobal(position))
|
|
235
|
+
if action == reveal_action:
|
|
236
|
+
path = self.model.filePath(index)
|
|
237
|
+
folder = path if os.path.isdir(path) else os.path.dirname(path)
|
|
238
|
+
os.startfile(folder)
|
|
239
|
+
elif action == new_folder_action:
|
|
240
|
+
self._create_new_folder()
|
|
241
|
+
elif action == home_action:
|
|
242
|
+
home = os.path.expanduser('~')
|
|
243
|
+
self.tree.setRootIndex(self.model.index(home))
|
|
244
|
+
elif action == desktop_action:
|
|
245
|
+
desktop = os.path.join(os.path.expanduser('~'), 'Desktop')
|
|
246
|
+
self.tree.setRootIndex(self.model.index(desktop))
|
|
247
|
+
elif action == root_action:
|
|
248
|
+
self.tree.setRootIndex(self.model.index(''))
|
|
249
|
+
elif action == initial_action:
|
|
250
|
+
self.tree.setRootIndex(self.model.index(self.path))
|
|
251
|
+
elif action == working_dir_action:
|
|
252
|
+
self.tree.setRootIndex(
|
|
253
|
+
self.model.index(os.path.dirname(os.path.abspath(__package__)))
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
def _create_new_folder(self):
|
|
257
|
+
index = self.tree.currentIndex()
|
|
258
|
+
if not index.isValid():
|
|
259
|
+
return
|
|
260
|
+
|
|
261
|
+
path = self.model.filePath(index)
|
|
262
|
+
if not os.path.isdir(path):
|
|
263
|
+
path = os.path.dirname(path)
|
|
264
|
+
|
|
265
|
+
new_folder_name, ok = QtWidgets.QInputDialog.getText(
|
|
266
|
+
self, 'New Folder', 'Enter folder name:'
|
|
267
|
+
)
|
|
268
|
+
if ok and new_folder_name:
|
|
269
|
+
new_folder_path = os.path.join(path, new_folder_name)
|
|
270
|
+
try:
|
|
271
|
+
os.makedirs(new_folder_path)
|
|
272
|
+
except OSError as e:
|
|
273
|
+
QtWidgets.QMessageBox.critical(
|
|
274
|
+
self, 'Error', f'Could not create folder: {e}'
|
|
275
|
+
)
|
|
276
|
+
|
|
213
277
|
def tabifyDocks(self):
|
|
214
278
|
# Tabify docks
|
|
215
279
|
pass
|
|
@@ -285,23 +285,25 @@ class LocalizationsView(QtWidgets.QWidget):
|
|
|
285
285
|
ndarray or None
|
|
286
286
|
Rendered super-res image or None.
|
|
287
287
|
'''
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
continue
|
|
288
|
+
if not self.fittingResults:
|
|
289
|
+
return
|
|
291
290
|
|
|
292
|
-
|
|
293
|
-
continue
|
|
291
|
+
images = [None] * len(self.fittingResults)
|
|
294
292
|
|
|
295
|
-
|
|
296
|
-
|
|
293
|
+
render_idx = self.render_cbox.currentData()
|
|
294
|
+
projection = self.projection_cbox.currentData()
|
|
295
|
+
xy_bin = self.xy_binsize.value()
|
|
296
|
+
z_bin = self.z_binsize.value()
|
|
297
|
+
auto_levels = self.auto_level.isChecked()
|
|
298
|
+
|
|
299
|
+
renderer = BaseRenderer(xy_bin, z_bin, RenderModes(render_idx))
|
|
300
|
+
|
|
301
|
+
for idx, localizations in enumerate(self.fittingResults):
|
|
302
|
+
if not localizations or len(localizations) <= 0:
|
|
303
|
+
continue
|
|
297
304
|
|
|
298
|
-
renderClass = BaseRenderer(
|
|
299
|
-
self.xy_binsize.value(),
|
|
300
|
-
self.z_binsize.value(),
|
|
301
|
-
RenderModes(render_idx),
|
|
302
|
-
)
|
|
303
305
|
if 0 <= projection < 3:
|
|
304
|
-
|
|
306
|
+
rendered_img = renderer.render(
|
|
305
307
|
Projection(projection),
|
|
306
308
|
localizations.data[DataColumns.X],
|
|
307
309
|
localizations.data[DataColumns.Y],
|
|
@@ -309,29 +311,15 @@ class LocalizationsView(QtWidgets.QWidget):
|
|
|
309
311
|
localizations.data[DataColumns.INTENSITY],
|
|
310
312
|
)
|
|
311
313
|
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
)
|
|
315
|
-
|
|
316
|
-
if projection == 0:
|
|
317
|
-
self.view_box.setAspectLocked(True, 1)
|
|
318
|
-
else:
|
|
319
|
-
self.view_box.setAspectLocked(
|
|
320
|
-
True, self.xy_binsize.value() / self.z_binsize.value()
|
|
321
|
-
)
|
|
314
|
+
aspect = 1 if projection == 0 else xy_bin / z_bin
|
|
315
|
+
self.view_box.setAspectLocked(True, aspect)
|
|
322
316
|
elif 3 <= projection < 6:
|
|
323
|
-
projection
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
width = self.z_binsize.value()
|
|
328
|
-
else:
|
|
329
|
-
self.view_box.setAspectLocked(
|
|
330
|
-
True, self.xy_binsize.value() / self.z_binsize.value()
|
|
331
|
-
)
|
|
332
|
-
width = self.xy_binsize.value()
|
|
317
|
+
slice_proj = projection - 3
|
|
318
|
+
aspect = 1 if slice_proj == 0 else xy_bin / z_bin
|
|
319
|
+
self.view_box.setAspectLocked(True, aspect)
|
|
320
|
+
width = z_bin if slice_proj == 0 else xy_bin
|
|
333
321
|
|
|
334
|
-
|
|
322
|
+
rendered_img = renderer.render_slice(
|
|
335
323
|
Projection(projection),
|
|
336
324
|
localizations.data[DataColumns.X],
|
|
337
325
|
localizations.data[DataColumns.Y],
|
|
@@ -340,10 +328,13 @@ class LocalizationsView(QtWidgets.QWidget):
|
|
|
340
328
|
self.position.value(),
|
|
341
329
|
width,
|
|
342
330
|
)
|
|
331
|
+
else:
|
|
332
|
+
continue
|
|
343
333
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
334
|
+
self.setImage(rendered_img, index=idx, autoLevels=auto_levels)
|
|
335
|
+
images[idx] = rendered_img
|
|
336
|
+
|
|
337
|
+
return images
|
|
347
338
|
|
|
348
339
|
def extract_z(self):
|
|
349
340
|
'''Extract Z values from the fitting results.'''
|
|
@@ -1276,7 +1267,7 @@ class LocalizationsView(QtWidgets.QWidget):
|
|
|
1276
1267
|
)
|
|
1277
1268
|
|
|
1278
1269
|
if 'Super-res image' in options:
|
|
1279
|
-
sres_img = self.render_loc()
|
|
1270
|
+
sres_img = self.render_loc()[self.image_layers.currentIndex]
|
|
1280
1271
|
tf.imwrite(
|
|
1281
1272
|
re.sub(r'(\.h5|\.tsv)$', '_super_res.tif', filename),
|
|
1282
1273
|
sres_img,
|
|
@@ -74,7 +74,7 @@ class io_combiner(QtCore.QObject):
|
|
|
74
74
|
'''TBA
|
|
75
75
|
'''
|
|
76
76
|
|
|
77
|
-
DataReady = Signal(
|
|
77
|
+
DataReady = Signal(object, bytes)
|
|
78
78
|
|
|
79
79
|
Max_Power = 0.0
|
|
80
80
|
|
|
@@ -133,10 +133,8 @@ class io_combiner(QtCore.QObject):
|
|
|
133
133
|
|
|
134
134
|
self.ser = serial.Serial(
|
|
135
135
|
baudrate=kwargs.get('baudrate', 115200), # Default baudrate
|
|
136
|
-
port=kwargs.get('port', 'COM1'), # Default port
|
|
137
136
|
timeout=kwargs.get('timeout', 0.5), # Default timeout
|
|
138
137
|
write_timeout=kwargs.get('write_timeout', 0.5), # Default write timeout
|
|
139
|
-
open=False, # Start with the port closed
|
|
140
138
|
)
|
|
141
139
|
|
|
142
140
|
self._lock = threading.Lock() # Add this line
|
|
@@ -740,6 +738,8 @@ class CombinerLaserWidget(Tree):
|
|
|
740
738
|
self.set_param_value(MB_Params.FIRMWARE, self.Laser.Firmware)
|
|
741
739
|
self.set_param_value(MB_Params.SERIAL, self.Laser.Serial)
|
|
742
740
|
|
|
741
|
+
self.timer.start() # Start the timer to update stats
|
|
742
|
+
|
|
743
743
|
if not self._laserSwitches:
|
|
744
744
|
for idx in range(len(self.Laser.Wavelengths)):
|
|
745
745
|
if self.Laser.Wavelengths[idx] > 0:
|
|
@@ -778,7 +778,7 @@ class CombinerLaserWidget(Tree):
|
|
|
778
778
|
'''
|
|
779
779
|
if self.Laser.isOpen():
|
|
780
780
|
|
|
781
|
-
def fetch_stats():
|
|
781
|
+
def fetch_stats(event):
|
|
782
782
|
'''
|
|
783
783
|
Fetches the current readings and settings from the laser device.
|
|
784
784
|
'''
|
|
@@ -793,10 +793,11 @@ class CombinerLaserWidget(Tree):
|
|
|
793
793
|
|
|
794
794
|
return {}, {}
|
|
795
795
|
|
|
796
|
-
def done(
|
|
796
|
+
def done(result: tuple[dict, dict]):
|
|
797
797
|
'''
|
|
798
798
|
Updates the parameter tree with the fetched readings and settings.
|
|
799
799
|
'''
|
|
800
|
+
readings, settings = result
|
|
800
801
|
if readings:
|
|
801
802
|
for key, value in readings.items():
|
|
802
803
|
if isinstance(value, (int, float)):
|
|
@@ -103,10 +103,8 @@ class io_single_laser(QtCore.QObject):
|
|
|
103
103
|
|
|
104
104
|
self.ser = serial.Serial(
|
|
105
105
|
baudrate=kwargs.get('baudrate', 115200), # Default baudrate
|
|
106
|
-
port=kwargs.get('port', 'COM1'), # Default port
|
|
107
106
|
timeout=kwargs.get('timeout', 0.5), # Default timeout
|
|
108
107
|
write_timeout=kwargs.get('write_timeout', 0.5), # Default write timeout
|
|
109
|
-
open=False, # Start with the port closed
|
|
110
108
|
)
|
|
111
109
|
|
|
112
110
|
self._lock = threading.Lock() # Add this line
|
|
@@ -718,6 +716,8 @@ class SingleMatchBox(Tree):
|
|
|
718
716
|
self.set_param_value(MB_Params.FIRMWARE, self.Laser.Firmware)
|
|
719
717
|
self.set_param_value(MB_Params.SERIAL, self.Laser.Serial)
|
|
720
718
|
|
|
719
|
+
self.timer.start()
|
|
720
|
+
|
|
721
721
|
def update_stats(self):
|
|
722
722
|
'''
|
|
723
723
|
Updates the statistics displayed in the MatchBox GUI.
|
|
@@ -732,7 +732,7 @@ class SingleMatchBox(Tree):
|
|
|
732
732
|
'''
|
|
733
733
|
if self.Laser.isOpen():
|
|
734
734
|
|
|
735
|
-
def fetch_stats():
|
|
735
|
+
def fetch_stats(event):
|
|
736
736
|
'''
|
|
737
737
|
Fetches the current readings and settings from the laser device.
|
|
738
738
|
'''
|
|
@@ -746,10 +746,11 @@ class SingleMatchBox(Tree):
|
|
|
746
746
|
|
|
747
747
|
return {}, {}
|
|
748
748
|
|
|
749
|
-
def done(
|
|
749
|
+
def done(result: tuple[dict, dict]):
|
|
750
750
|
'''
|
|
751
751
|
Updates the parameter tree with the fetched readings and settings.
|
|
752
752
|
'''
|
|
753
|
+
readings, settings = result
|
|
753
754
|
if readings:
|
|
754
755
|
for key, value in readings.items():
|
|
755
756
|
if isinstance(value, (int, float)):
|