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.
Files changed (200) hide show
  1. {microeye-2.3.5/src/microeye.egg-info → microeye-2.3.6}/PKG-INFO +29 -17
  2. {microeye-2.3.5 → microeye-2.3.6}/README.md +28 -16
  3. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/_version.py +1 -1
  4. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/camera_panel.py +6 -1
  5. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/lasers/io_matchbox.py +140 -42
  6. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/lasers/io_single_laser.py +129 -28
  7. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/display.py +23 -26
  8. {microeye-2.3.5 → microeye-2.3.6/src/microeye.egg-info}/PKG-INFO +29 -17
  9. {microeye-2.3.5 → microeye-2.3.6}/LICENSE +0 -0
  10. {microeye-2.3.5 → microeye-2.3.6}/MANIFEST.in +0 -0
  11. {microeye-2.3.5 → microeye-2.3.6}/pyproject.toml +0 -0
  12. {microeye-2.3.5 → microeye-2.3.6}/setup.cfg +0 -0
  13. {microeye-2.3.5 → microeye-2.3.6}/setup.py +0 -0
  14. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/__init__.py +0 -0
  15. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/__init__.py +0 -0
  16. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/checklist_dialog.py +0 -0
  17. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/cmosMaps.py +0 -0
  18. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/filters/__init__.py +0 -0
  19. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/filters/base.py +0 -0
  20. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/filters/spatial.py +0 -0
  21. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/filters/temporal.py +0 -0
  22. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/__init__.py +0 -0
  23. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/fit.py +0 -0
  24. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/nena.py +0 -0
  25. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/phasor_fit.py +0 -0
  26. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/processing.py +0 -0
  27. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/psf/__init__.py +0 -0
  28. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/psf/extract.py +0 -0
  29. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/psf/rubost_mean.py +0 -0
  30. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/psf/spline.py +0 -0
  31. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/psf/stats/__init__.py +0 -0
  32. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/psf/stats/core.py +0 -0
  33. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/psf/stats/curve_fit.py +0 -0
  34. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/psf/stats/io.py +0 -0
  35. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/psf/stats/slope_fit.py +0 -0
  36. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/psf/temp.py +0 -0
  37. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/psf/test.py +0 -0
  38. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/pyfit3Dcspline/CPU/CPUfunctions.py +0 -0
  39. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/pyfit3Dcspline/CPU/CPUmleFit_LM.py +0 -0
  40. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/pyfit3Dcspline/CPU/CPUsplineLib.py +0 -0
  41. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/pyfit3Dcspline/CPU/__init__.py +0 -0
  42. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/pyfit3Dcspline/GPU/GPUfunctions.py +0 -0
  43. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/pyfit3Dcspline/GPU/GPUmleFit_LM_EMCCD.py +0 -0
  44. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/pyfit3Dcspline/GPU/GPUmleFit_LM_sCMOS.py +0 -0
  45. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/pyfit3Dcspline/GPU/GPUsplineLib.py +0 -0
  46. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/pyfit3Dcspline/GPU/__init__.py +0 -0
  47. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/pyfit3Dcspline/__init__.py +0 -0
  48. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/pyfit3Dcspline/constants.py +0 -0
  49. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/pyfit3Dcspline/mainfunctions.py +0 -0
  50. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/results.py +0 -0
  51. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/results_stats.py +0 -0
  52. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/fitting/tardis.py +0 -0
  53. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/multi_viewer.py +0 -0
  54. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/processing/__init__.py +0 -0
  55. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/processing/frc.py +0 -0
  56. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/rendering/__init__.py +0 -0
  57. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/rendering/base.py +0 -0
  58. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/rendering/cloud.py +0 -0
  59. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/rendering/core.py +0 -0
  60. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/rendering/volumetric.py +0 -0
  61. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/tools/__init__.py +0 -0
  62. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/tools/kymograms.py +0 -0
  63. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/tools/roi_selectors.py +0 -0
  64. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/utils/__init__.py +0 -0
  65. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/utils/coordinates.py +0 -0
  66. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/utils/images.py +0 -0
  67. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/utils/windows.py +0 -0
  68. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/viewer/__init__.py +0 -0
  69. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/viewer/image_options_widget.py +0 -0
  70. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/viewer/images.py +0 -0
  71. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/viewer/layers_widget.py +0 -0
  72. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/viewer/localizations.py +0 -0
  73. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/viewer/psf.py +0 -0
  74. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/analysis/viewer/volume.py +0 -0
  75. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/__init__.py +0 -0
  76. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/__init__.py +0 -0
  77. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/camera_calibration.py +0 -0
  78. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/camera_list.py +0 -0
  79. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/camera_options.py +0 -0
  80. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/dummy/__init__.py +0 -0
  81. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/dummy/dummy_panel.py +0 -0
  82. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/jobs.py +0 -0
  83. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/line_profiler.py +0 -0
  84. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/linescan/IR_Cam.py +0 -0
  85. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/linescan/__init__.py +0 -0
  86. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/micam.py +0 -0
  87. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/pco/__init__.py +0 -0
  88. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/pco/enums.py +0 -0
  89. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/pco/pco_cam.py +0 -0
  90. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/pco/pco_panel.py +0 -0
  91. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/shortcuts.py +0 -0
  92. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/thorlabs/__init__.py +0 -0
  93. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/thorlabs/thorlabs.py +0 -0
  94. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/thorlabs/thorlabs_panel.py +0 -0
  95. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/ueye/__init__.py +0 -0
  96. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/ueye/ueye_camera.py +0 -0
  97. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/ueye/ueye_panel.py +0 -0
  98. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/vimba/__init__.py +0 -0
  99. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/vimba/vimba_cam.py +0 -0
  100. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/cams/vimba/vimba_panel.py +0 -0
  101. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/device.py +0 -0
  102. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/lasers/__init__.py +0 -0
  103. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/lasers/io_params.py +0 -0
  104. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/lasers/laser_relay.py +0 -0
  105. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/mieye/__init__.py +0 -0
  106. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/mieye/acquisition_manager.py +0 -0
  107. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/mieye/devices_manager.py +0 -0
  108. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/mieye/miEye.py +0 -0
  109. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/misc/__init__.py +0 -0
  110. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/misc/acquisition_view.py +0 -0
  111. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/misc/reglo.py +0 -0
  112. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/misc/temp.py +0 -0
  113. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/port_config.py +0 -0
  114. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/protocols/__init__.py +0 -0
  115. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/protocols/actions.py +0 -0
  116. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/protocols/actions_items.py +0 -0
  117. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/protocols/designer.py +0 -0
  118. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/protocols/scene_manager.py +0 -0
  119. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/protocols/serialization.py +0 -0
  120. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/pycromanager/__init__.py +0 -0
  121. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/pycromanager/core.py +0 -0
  122. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/pycromanager/devices.py +0 -0
  123. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/pycromanager/enums.py +0 -0
  124. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/pycromanager/headless.py +0 -0
  125. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/pycromanager/utils.py +0 -0
  126. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/pycromanager/widgets/__init__.py +0 -0
  127. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/pycromanager/widgets/bridges.py +0 -0
  128. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/pycromanager/widgets/headless_manager.py +0 -0
  129. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/pycromanager/widgets/headless_options.py +0 -0
  130. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/pycromanager/widgets/pycro_panel.py +0 -0
  131. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/__init__.py +0 -0
  132. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/elliptec/__init__.py +0 -0
  133. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/elliptec/baseDevice.py +0 -0
  134. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/elliptec/device.py +0 -0
  135. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/elliptec/deviceID.py +0 -0
  136. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/elliptec/devicePort.py +0 -0
  137. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/elliptec/deviceStatus.py +0 -0
  138. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/elliptec/devicesView.py +0 -0
  139. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/elliptec/ellDevices.py +0 -0
  140. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/elliptec/messageUpdater.py +0 -0
  141. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/elliptec/motorInfo.py +0 -0
  142. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/elliptec/stage.py +0 -0
  143. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/elliptec/test.py +0 -0
  144. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/kinesis/__init__.py +0 -0
  145. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/kinesis/kdc101/__init__.py +0 -0
  146. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/kinesis/kdc101/enums.py +0 -0
  147. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/kinesis/kdc101/factory.py +0 -0
  148. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/kinesis/kdc101/kdc101.py +0 -0
  149. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/kinesis/kinesis.py +0 -0
  150. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/piezo_concept.py +0 -0
  151. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/stabilizer.py +0 -0
  152. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/stages/stage.py +0 -0
  153. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/widgets/__init__.py +0 -0
  154. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/widgets/controller.py +0 -0
  155. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/widgets/devices.py +0 -0
  156. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/widgets/focusWidget.py +0 -0
  157. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/widgets/qlist_slider.py +0 -0
  158. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/hardware/widgets/scan_acquisition.py +0 -0
  159. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/icons/1024.png +0 -0
  160. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/icons/128.png +0 -0
  161. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/icons/16.png +0 -0
  162. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/icons/24.png +0 -0
  163. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/icons/256.png +0 -0
  164. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/icons/32.png +0 -0
  165. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/icons/48.png +0 -0
  166. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/icons/512.png +0 -0
  167. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/icons/64.png +0 -0
  168. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/icons/__init__.py +0 -0
  169. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/icons/close.svg +0 -0
  170. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/icons/mieye.png +0 -0
  171. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/icons/min.svg +0 -0
  172. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/icons/viewer.png +0 -0
  173. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/launcher.py +0 -0
  174. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/qt.py +0 -0
  175. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/tools/__init__.py +0 -0
  176. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/tools/microscopy.py +0 -0
  177. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/__init__.py +0 -0
  178. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/enum_encoder.py +0 -0
  179. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/expandable_groupbox.py +0 -0
  180. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/gui_helper.py +0 -0
  181. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/hid_utils/__init__.py +0 -0
  182. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/hid_utils/controller.py +0 -0
  183. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/hid_utils/device.py +0 -0
  184. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/hid_utils/enums.py +0 -0
  185. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/hid_utils/utils.py +0 -0
  186. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/labelled_slider.py +0 -0
  187. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/metadata.py +0 -0
  188. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/metadata_tree.py +0 -0
  189. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/micro_launcher.py +0 -0
  190. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/parameter_tree.py +0 -0
  191. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/pyscripting.py +0 -0
  192. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/retry_exec.py +0 -0
  193. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/start_gui.py +0 -0
  194. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/thread_worker.py +0 -0
  195. {microeye-2.3.5 → microeye-2.3.6}/src/microEye/utils/uImage.py +0 -0
  196. {microeye-2.3.5 → microeye-2.3.6}/src/microeye.egg-info/SOURCES.txt +0 -0
  197. {microeye-2.3.5 → microeye-2.3.6}/src/microeye.egg-info/dependency_links.txt +0 -0
  198. {microeye-2.3.5 → microeye-2.3.6}/src/microeye.egg-info/entry_points.txt +0 -0
  199. {microeye-2.3.5 → microeye-2.3.6}/src/microeye.egg-info/requires.txt +0 -0
  200. {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.5
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
  ![GitHub Stars](https://img.shields.io/github/stars/samhitech/microEye.svg)
96
96
 
97
97
  ```bash
98
- __ __ _ ___ ___ ____ ___
99
- | \/ (_)__ _ _ ___| __| _ ___ __ _|_ ) |__ / | __|
100
- | |\/| | / _| '_/ _ \ _| || / -_) \ V // / _ |_ \_|__ \
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
- | Camera | Description | Link |
321
- | ------------------------- | ------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------- |
322
- | IDS uEye UI-3060CP Rev. 2 | IDS industrial-grade CMOS cameras | [Link](https://en.ids-imaging.com/store/products/cameras/ui-3060cp-rev-2.html) |
323
- | Thorlabs DCC1545M | DCx camera using UC480 driver | [Link](https://www.thorlabs.com/thorProduct.cfm?partNumber=DCC1545M) |
324
- | Allied Vision Alvium 1800 | Allied Vision industrial-grade CMOS cameras (U-158m, U-511m) | [Link](https://www.alliedvision.com/en/products/alvium-configurator/alvium-1800-u/158/#_configurator) |
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 | [Link](https://piezoconcept-store.squarespace.com/1-axis/p/foc) |
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) | [Link](https://www.thorlabs.com/thorproduct.cfm?partnumber=KDC101) |
336
- | Parallax TSL1401-DB (#28317) | Linescan Camera Module | [Link](https://eu.mouser.com/ProductDetail/Parallax/28317?qs=%2Fha2pyFaduiCRhuOAXMuCmQIeG1Q3R01m6Y1EH%252BmN80%3D) |
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). [Link](https://rdcu.be/dv1sr)
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
  ![GitHub Stars](https://img.shields.io/github/stars/samhitech/microEye.svg)
32
32
 
33
33
  ```bash
34
- __ __ _ ___ ___ ____ ___
35
- | \/ (_)__ _ _ ___| __| _ ___ __ _|_ ) |__ / | __|
36
- | |\/| | / _| '_/ _ \ _| || / -_) \ V // / _ |_ \_|__ \
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
- | Camera | Description | Link |
257
- | ------------------------- | ------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------- |
258
- | IDS uEye UI-3060CP Rev. 2 | IDS industrial-grade CMOS cameras | [Link](https://en.ids-imaging.com/store/products/cameras/ui-3060cp-rev-2.html) |
259
- | Thorlabs DCC1545M | DCx camera using UC480 driver | [Link](https://www.thorlabs.com/thorProduct.cfm?partNumber=DCC1545M) |
260
- | Allied Vision Alvium 1800 | Allied Vision industrial-grade CMOS cameras (U-158m, U-511m) | [Link](https://www.alliedvision.com/en/products/alvium-configurator/alvium-1800-u/158/#_configurator) |
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 | [Link](https://piezoconcept-store.squarespace.com/1-axis/p/foc) |
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) | [Link](https://www.thorlabs.com/thorproduct.cfm?partnumber=KDC101) |
272
- | Parallax TSL1401-DB (#28317) | Linescan Camera Module | [Link](https://eu.mouser.com/ProductDetail/Parallax/28317?qs=%2Fha2pyFaduiCRhuOAXMuCmQIeG1Q3R01m6Y1EH%252BmN80%3D) |
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). [Link](https://rdcu.be/dv1sr)
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, 5)
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(QtSerialPort.QSerialPort):
12
+ class io_combiner(QtCore.QObject):
11
13
  '''
12
- Class representing a laser combiner MatchBox device | Inherits QSerialPort
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
- self.readAll()
131
- self.write(command)
132
- self.waitForBytesWritten(500)
133
- QtCore.QThread.msleep(delay)
134
- while self.bytesAvailable() < 5:
135
- self.waitForReadyRead(500)
136
-
137
- response = (
138
- str(
139
- self.readAll().replace(b'\xff', b''),
140
- encoding='utf-8',
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
- .strip('\r\n')
144
- .strip()
145
- )
146
- if log_print:
147
- print(response, command)
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
- self.DataReady.emit(response, command)
230
+ self.DataReady.emit(response, command)
150
231
 
151
- return response
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
- self.open(QtCore.QIODevice.OpenModeFlag.ReadWrite)
157
- self.flush()
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
- self.SendCommand(io_combiner.ON)
161
- self.SendCommand(io_combiner.START)
162
- # self.SendCommand(io_single_laser.STATUS)
163
- self.GetInfo()
164
- self.GetWavelengths()
165
- self.SetCurrent(1, 0)
166
- self.SetCurrent(2, 0)
167
- self.SetCurrent(3, 0)
168
- self.SetCurrent(4, 0)
169
- self.GetMaxCurrent()
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
- self.SendCommand(io_combiner.OFF)
175
- self.waitForBytesWritten(500)
176
-
177
- self.close()
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' : False,
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
- QtSerialPort.QSerialPortInfo.standardBaudRates()
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(QtWidgets.QHeaderView.ResizeMode.ResizeToContents)
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)