microeye 2.3.2__tar.gz → 2.3.3__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 (197) hide show
  1. {microeye-2.3.2/src/microeye.egg-info → microeye-2.3.3}/PKG-INFO +36 -10
  2. {microeye-2.3.2 → microeye-2.3.3}/README.md +34 -8
  3. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/_version.py +1 -1
  4. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/camera_options.py +5 -0
  5. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/camera_panel.py +163 -99
  6. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/jobs.py +2 -1
  7. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/shortcuts.py +96 -10
  8. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/mieye/devices_manager.py +4 -2
  9. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/mieye/miEye.py +2 -2
  10. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/pycromanager/widgets/pycro_panel.py +6 -0
  11. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/kinesis/kinesis.py +1 -1
  12. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/piezo_concept.py +1 -1
  13. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/gui_helper.py +29 -2
  14. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/uImage.py +12 -5
  15. {microeye-2.3.2 → microeye-2.3.3/src/microeye.egg-info}/PKG-INFO +36 -10
  16. {microeye-2.3.2 → microeye-2.3.3}/src/microeye.egg-info/requires.txt +1 -1
  17. {microeye-2.3.2 → microeye-2.3.3}/LICENSE +0 -0
  18. {microeye-2.3.2 → microeye-2.3.3}/MANIFEST.in +0 -0
  19. {microeye-2.3.2 → microeye-2.3.3}/pyproject.toml +0 -0
  20. {microeye-2.3.2 → microeye-2.3.3}/setup.cfg +0 -0
  21. {microeye-2.3.2 → microeye-2.3.3}/setup.py +0 -0
  22. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/__init__.py +0 -0
  23. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/__init__.py +0 -0
  24. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/checklist_dialog.py +0 -0
  25. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/cmosMaps.py +0 -0
  26. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/filters/__init__.py +0 -0
  27. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/filters/base.py +0 -0
  28. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/filters/spatial.py +0 -0
  29. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/filters/temporal.py +0 -0
  30. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/__init__.py +0 -0
  31. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/fit.py +0 -0
  32. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/nena.py +0 -0
  33. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/phasor_fit.py +0 -0
  34. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/processing.py +0 -0
  35. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/psf/__init__.py +0 -0
  36. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/psf/extract.py +0 -0
  37. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/psf/rubost_mean.py +0 -0
  38. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/psf/spline.py +0 -0
  39. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/psf/stats/__init__.py +0 -0
  40. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/psf/stats/core.py +0 -0
  41. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/psf/stats/curve_fit.py +0 -0
  42. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/psf/stats/io.py +0 -0
  43. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/psf/stats/slope_fit.py +0 -0
  44. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/psf/temp.py +0 -0
  45. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/psf/test.py +0 -0
  46. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/pyfit3Dcspline/CPU/CPUfunctions.py +0 -0
  47. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/pyfit3Dcspline/CPU/CPUmleFit_LM.py +0 -0
  48. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/pyfit3Dcspline/CPU/CPUsplineLib.py +0 -0
  49. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/pyfit3Dcspline/CPU/__init__.py +0 -0
  50. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/pyfit3Dcspline/GPU/GPUfunctions.py +0 -0
  51. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/pyfit3Dcspline/GPU/GPUmleFit_LM_EMCCD.py +0 -0
  52. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/pyfit3Dcspline/GPU/GPUmleFit_LM_sCMOS.py +0 -0
  53. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/pyfit3Dcspline/GPU/GPUsplineLib.py +0 -0
  54. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/pyfit3Dcspline/GPU/__init__.py +0 -0
  55. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/pyfit3Dcspline/__init__.py +0 -0
  56. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/pyfit3Dcspline/constants.py +0 -0
  57. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/pyfit3Dcspline/mainfunctions.py +0 -0
  58. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/results.py +0 -0
  59. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/results_stats.py +0 -0
  60. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/fitting/tardis.py +0 -0
  61. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/multi_viewer.py +0 -0
  62. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/processing/__init__.py +0 -0
  63. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/processing/frc.py +0 -0
  64. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/rendering/__init__.py +0 -0
  65. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/rendering/base.py +0 -0
  66. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/rendering/cloud.py +0 -0
  67. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/rendering/core.py +0 -0
  68. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/rendering/volumetric.py +0 -0
  69. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/tools/__init__.py +0 -0
  70. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/tools/kymograms.py +0 -0
  71. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/tools/roi_selectors.py +0 -0
  72. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/utils/__init__.py +0 -0
  73. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/utils/coordinates.py +0 -0
  74. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/utils/images.py +0 -0
  75. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/utils/windows.py +0 -0
  76. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/viewer/__init__.py +0 -0
  77. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/viewer/image_options_widget.py +0 -0
  78. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/viewer/images.py +0 -0
  79. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/viewer/layers_widget.py +0 -0
  80. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/viewer/localizations.py +0 -0
  81. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/viewer/psf.py +0 -0
  82. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/analysis/viewer/volume.py +0 -0
  83. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/__init__.py +0 -0
  84. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/__init__.py +0 -0
  85. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/camera_calibration.py +0 -0
  86. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/camera_list.py +0 -0
  87. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/dummy/__init__.py +0 -0
  88. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/dummy/dummy_panel.py +0 -0
  89. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/line_profiler.py +0 -0
  90. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/linescan/IR_Cam.py +0 -0
  91. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/linescan/__init__.py +0 -0
  92. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/micam.py +0 -0
  93. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/pco/__init__.py +0 -0
  94. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/pco/enums.py +0 -0
  95. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/pco/pco_cam.py +0 -0
  96. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/pco/pco_panel.py +0 -0
  97. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/thorlabs/__init__.py +0 -0
  98. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/thorlabs/thorlabs.py +0 -0
  99. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/thorlabs/thorlabs_panel.py +0 -0
  100. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/ueye/__init__.py +0 -0
  101. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/ueye/ueye_camera.py +0 -0
  102. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/ueye/ueye_panel.py +0 -0
  103. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/vimba/__init__.py +0 -0
  104. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/vimba/vimba_cam.py +0 -0
  105. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/cams/vimba/vimba_panel.py +0 -0
  106. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/device.py +0 -0
  107. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/lasers/__init__.py +0 -0
  108. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/lasers/io_matchbox.py +0 -0
  109. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/lasers/io_params.py +0 -0
  110. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/lasers/io_single_laser.py +0 -0
  111. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/lasers/laser_relay.py +0 -0
  112. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/mieye/__init__.py +0 -0
  113. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/mieye/acquisition_manager.py +0 -0
  114. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/misc/__init__.py +0 -0
  115. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/misc/acquisition_view.py +0 -0
  116. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/misc/reglo.py +0 -0
  117. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/misc/temp.py +0 -0
  118. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/port_config.py +0 -0
  119. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/protocols/__init__.py +0 -0
  120. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/protocols/actions.py +0 -0
  121. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/protocols/actions_items.py +0 -0
  122. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/protocols/designer.py +0 -0
  123. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/protocols/scene_manager.py +0 -0
  124. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/protocols/serialization.py +0 -0
  125. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/pycromanager/__init__.py +0 -0
  126. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/pycromanager/core.py +0 -0
  127. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/pycromanager/devices.py +0 -0
  128. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/pycromanager/enums.py +0 -0
  129. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/pycromanager/headless.py +0 -0
  130. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/pycromanager/utils.py +0 -0
  131. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/pycromanager/widgets/__init__.py +0 -0
  132. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/pycromanager/widgets/bridges.py +0 -0
  133. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/pycromanager/widgets/headless_manager.py +0 -0
  134. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/pycromanager/widgets/headless_options.py +0 -0
  135. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/__init__.py +0 -0
  136. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/elliptec/__init__.py +0 -0
  137. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/elliptec/baseDevice.py +0 -0
  138. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/elliptec/device.py +0 -0
  139. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/elliptec/deviceID.py +0 -0
  140. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/elliptec/devicePort.py +0 -0
  141. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/elliptec/deviceStatus.py +0 -0
  142. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/elliptec/devicesView.py +0 -0
  143. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/elliptec/ellDevices.py +0 -0
  144. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/elliptec/messageUpdater.py +0 -0
  145. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/elliptec/motorInfo.py +0 -0
  146. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/elliptec/stage.py +0 -0
  147. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/elliptec/test.py +0 -0
  148. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/kinesis/__init__.py +0 -0
  149. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/kinesis/kdc101/__init__.py +0 -0
  150. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/kinesis/kdc101/enums.py +0 -0
  151. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/kinesis/kdc101/factory.py +0 -0
  152. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/kinesis/kdc101/kdc101.py +0 -0
  153. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/stabilizer.py +0 -0
  154. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/stages/stage.py +0 -0
  155. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/widgets/__init__.py +0 -0
  156. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/widgets/controller.py +0 -0
  157. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/widgets/devices.py +0 -0
  158. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/widgets/focusWidget.py +0 -0
  159. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/widgets/qlist_slider.py +0 -0
  160. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/hardware/widgets/scan_acquisition.py +0 -0
  161. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/icons/1024.png +0 -0
  162. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/icons/128.png +0 -0
  163. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/icons/16.png +0 -0
  164. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/icons/24.png +0 -0
  165. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/icons/256.png +0 -0
  166. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/icons/32.png +0 -0
  167. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/icons/48.png +0 -0
  168. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/icons/512.png +0 -0
  169. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/icons/64.png +0 -0
  170. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/icons/__init__.py +0 -0
  171. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/icons/close.svg +0 -0
  172. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/icons/mieye.png +0 -0
  173. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/icons/min.svg +0 -0
  174. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/icons/viewer.png +0 -0
  175. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/launcher.py +0 -0
  176. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/qt.py +0 -0
  177. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/__init__.py +0 -0
  178. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/enum_encoder.py +0 -0
  179. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/expandable_groupbox.py +0 -0
  180. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/hid/__init__.py +0 -0
  181. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/hid/controller.py +0 -0
  182. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/hid/device.py +0 -0
  183. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/hid/enums.py +0 -0
  184. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/hid/utils.py +0 -0
  185. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/labelled_slider.py +0 -0
  186. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/metadata.py +0 -0
  187. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/metadata_tree.py +0 -0
  188. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/micro_launcher.py +0 -0
  189. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/parameter_tree.py +0 -0
  190. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/pyscripting.py +0 -0
  191. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/retry_exec.py +0 -0
  192. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/start_gui.py +0 -0
  193. {microeye-2.3.2 → microeye-2.3.3}/src/microEye/utils/thread_worker.py +0 -0
  194. {microeye-2.3.2 → microeye-2.3.3}/src/microeye.egg-info/SOURCES.txt +0 -0
  195. {microeye-2.3.2 → microeye-2.3.3}/src/microeye.egg-info/dependency_links.txt +0 -0
  196. {microeye-2.3.2 → microeye-2.3.3}/src/microeye.egg-info/entry_points.txt +0 -0
  197. {microeye-2.3.2 → microeye-2.3.3}/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.2
3
+ Version: 2.3.3
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
@@ -20,7 +20,7 @@ Requires-Dist: dask==2024.5.2
20
20
  Requires-Dist: h5py==3.11.0
21
21
  Requires-Dist: hidapi==0.14.0
22
22
  Requires-Dist: matplotlib==3.9.2
23
- Requires-Dist: mmpycore==0.3.16
23
+ Requires-Dist: mmpycorex==0.3.16
24
24
  Requires-Dist: numba==0.60.0
25
25
  Requires-Dist: numpy==1.26.4
26
26
  Requires-Dist: ome_types==0.5.2
@@ -85,7 +85,7 @@ This toolkit is compatible with the [hardware](#hardware) used in our microscope
85
85
 
86
86
  ![Contributors](https://img.shields.io/github/contributors/samhitech/microEye.svg)
87
87
  ![GitHub Last Commit](https://img.shields.io/github/last-commit/samhitech/microEye.svg)
88
- ![Maintenance](https://img.shields.io/maintenance/yes/2024.svg)
88
+ ![Maintenance](https://img.shields.io/maintenance/yes/2025.svg)
89
89
 
90
90
  ![GitHub Issues](https://img.shields.io/github/issues/samhitech/microEye.svg)
91
91
  ![GitHub Bugs](https://img.shields.io/github/issues/samhitech/microEye/bug.svg)
@@ -96,9 +96,9 @@ This toolkit is compatible with the [hardware](#hardware) used in our microscope
96
96
  ![GitHub Stars](https://img.shields.io/github/stars/samhitech/microEye.svg)
97
97
 
98
98
  ```bash
99
- __ ____ ____ ___ ____ ___
100
- / |/ (_)__________ / __/_ _____ _ __|_ | |_ / |_ |
101
- / /|_/ / / __/ __/ _ \/ _// // / -_) | |/ / __/_ _/_ <_ / __/
99
+ __ ____ ____ ___ ____ ____
100
+ / |/ (_)__________ / __/_ _____ _ __|_ | |_ / |_ /
101
+ / /|_/ / / __/ __/ _ \/ _// // / -_) | |/ / __/_ _/_ <_ _/_ <
102
102
  /_/ /_/_/\__/_/ \___/___/\_, /\__/ |___/____(_)____(_)____/
103
103
  /___/
104
104
  ```
@@ -120,7 +120,9 @@ This toolkit is compatible with the [hardware](#hardware) used in our microscope
120
120
  - [Hardware](#hardware)
121
121
  - [Supported Cameras](#supported-cameras)
122
122
  - [Additional Hardware](#additional-hardware)
123
- - [Pycro-Manager Hardware](#pycro-manager-hardware)
123
+ - [Pycro-Manager Integration](#pycro-manager-integration)
124
+ - [Features](#features)
125
+ - [How to Use](#how-to-use)
124
126
  - [Authors](#authors)
125
127
  - [People Involved](#people-involved)
126
128
  - [Acknowledgement](#acknowledgement)
@@ -214,7 +216,6 @@ Upon running the launcher, you will be presented with the following interface:
214
216
  - **Theme (dropdown)**: Select the theme for the application. Options are None (default), qdarktheme, or qdarkstyle.
215
217
 
216
218
  To launch a module, simply click on the respective button (`miEye Module` or `Viewer Module`). If you wish to change the Qt API or theme, select the desired option from the dropdown menus before launching.
217
- Sounds good, here's the updated section with the simplified commands:
218
219
 
219
220
  ## Modules
220
221
 
@@ -334,9 +335,34 @@ Schematic overview of the miEye instrument:
334
335
  | RelayBox Arduino | For laser control using camera GPIO signals | [RelayBox](https://github.com/samhitech/RelayBox) |
335
336
  | miEye OSF Project Parts List | Parts list of miEye OSF Project | [Link](https://osf.io/j2fqy/) |
336
337
 
337
- ### Pycro-Manager Hardware
338
+ ## Pycro-Manager Integration
338
339
 
339
- Integration under development. **[To Be Added]**
340
+ Integration with Pycro-Manager is now implemented, providing support for managing headless instances and `Core` instances. This allows for seamless control and configuration of hardware devices through the Pycro-Manager framework.
341
+
342
+ ### Features
343
+
344
+ - **Headless Manager**: Manage multiple headless Micro-Manager instances (JavaBackend), including starting, stopping, and saving configurations.
345
+ - **Core Instances Manager**: Handle multiple PycroCore instances for device communication and control.
346
+
347
+ ### How to Use
348
+
349
+ 1. **Headless Manager**:
350
+
351
+ - Open the `miEye_module` and navigate to `Tools -> Micro-Manager Headless Manager` in the main menu.
352
+ - Start a new headless instance using a specific configuration file.
353
+ - Stop individual running instances or terminate all instances simultaneously.
354
+ - Save configurations for future use or load previously saved configurations for headless instances.
355
+
356
+ 2. **Core Instances**:
357
+
358
+ - Open the `miEye_module` and navigate to `Tools -> Micro-Manager Core Bridges` in the main menu.
359
+ - Click on `Add Core Bridge` and provide the port address in the dialog box.
360
+ - A list of connected devices will be displayed, allowing you to view each device's properties.
361
+ - Close the window and refresh the camera list to access Pycro-Manager cameras.
362
+
363
+ _Accessing other types of devices is under development!_
364
+
365
+ _Note: Currently, only acquisition has been tested with the developed `PycroPanel`. Full implementation of focus stabilization is planned for future updates by implementing further stage-related widgets._
340
366
 
341
367
  ![pycromanager integration](https://github.com/user-attachments/assets/73893f9f-c1ef-438f-a884-ec3f60f00118)
342
368
 
@@ -20,7 +20,7 @@ This toolkit is compatible with the [hardware](#hardware) used in our microscope
20
20
 
21
21
  ![Contributors](https://img.shields.io/github/contributors/samhitech/microEye.svg)
22
22
  ![GitHub Last Commit](https://img.shields.io/github/last-commit/samhitech/microEye.svg)
23
- ![Maintenance](https://img.shields.io/maintenance/yes/2024.svg)
23
+ ![Maintenance](https://img.shields.io/maintenance/yes/2025.svg)
24
24
 
25
25
  ![GitHub Issues](https://img.shields.io/github/issues/samhitech/microEye.svg)
26
26
  ![GitHub Bugs](https://img.shields.io/github/issues/samhitech/microEye/bug.svg)
@@ -31,9 +31,9 @@ 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
- / /|_/ / / __/ __/ _ \/ _// // / -_) | |/ / __/_ _/_ <_ / __/
34
+ __ ____ ____ ___ ____ ____
35
+ / |/ (_)__________ / __/_ _____ _ __|_ | |_ / |_ /
36
+ / /|_/ / / __/ __/ _ \/ _// // / -_) | |/ / __/_ _/_ <_ _/_ <
37
37
  /_/ /_/_/\__/_/ \___/___/\_, /\__/ |___/____(_)____(_)____/
38
38
  /___/
39
39
  ```
@@ -55,7 +55,9 @@ This toolkit is compatible with the [hardware](#hardware) used in our microscope
55
55
  - [Hardware](#hardware)
56
56
  - [Supported Cameras](#supported-cameras)
57
57
  - [Additional Hardware](#additional-hardware)
58
- - [Pycro-Manager Hardware](#pycro-manager-hardware)
58
+ - [Pycro-Manager Integration](#pycro-manager-integration)
59
+ - [Features](#features)
60
+ - [How to Use](#how-to-use)
59
61
  - [Authors](#authors)
60
62
  - [People Involved](#people-involved)
61
63
  - [Acknowledgement](#acknowledgement)
@@ -149,7 +151,6 @@ Upon running the launcher, you will be presented with the following interface:
149
151
  - **Theme (dropdown)**: Select the theme for the application. Options are None (default), qdarktheme, or qdarkstyle.
150
152
 
151
153
  To launch a module, simply click on the respective button (`miEye Module` or `Viewer Module`). If you wish to change the Qt API or theme, select the desired option from the dropdown menus before launching.
152
- Sounds good, here's the updated section with the simplified commands:
153
154
 
154
155
  ## Modules
155
156
 
@@ -269,9 +270,34 @@ Schematic overview of the miEye instrument:
269
270
  | RelayBox Arduino | For laser control using camera GPIO signals | [RelayBox](https://github.com/samhitech/RelayBox) |
270
271
  | miEye OSF Project Parts List | Parts list of miEye OSF Project | [Link](https://osf.io/j2fqy/) |
271
272
 
272
- ### Pycro-Manager Hardware
273
+ ## Pycro-Manager Integration
273
274
 
274
- Integration under development. **[To Be Added]**
275
+ Integration with Pycro-Manager is now implemented, providing support for managing headless instances and `Core` instances. This allows for seamless control and configuration of hardware devices through the Pycro-Manager framework.
276
+
277
+ ### Features
278
+
279
+ - **Headless Manager**: Manage multiple headless Micro-Manager instances (JavaBackend), including starting, stopping, and saving configurations.
280
+ - **Core Instances Manager**: Handle multiple PycroCore instances for device communication and control.
281
+
282
+ ### How to Use
283
+
284
+ 1. **Headless Manager**:
285
+
286
+ - Open the `miEye_module` and navigate to `Tools -> Micro-Manager Headless Manager` in the main menu.
287
+ - Start a new headless instance using a specific configuration file.
288
+ - Stop individual running instances or terminate all instances simultaneously.
289
+ - Save configurations for future use or load previously saved configurations for headless instances.
290
+
291
+ 2. **Core Instances**:
292
+
293
+ - Open the `miEye_module` and navigate to `Tools -> Micro-Manager Core Bridges` in the main menu.
294
+ - Click on `Add Core Bridge` and provide the port address in the dialog box.
295
+ - A list of connected devices will be displayed, allowing you to view each device's properties.
296
+ - Close the window and refresh the camera list to access Pycro-Manager cameras.
297
+
298
+ _Accessing other types of devices is under development!_
299
+
300
+ _Note: Currently, only acquisition has been tested with the developed `PycroPanel`. Full implementation of focus stabilization is planned for future updates by implementing further stage-related widgets._
275
301
 
276
302
  ![pycromanager integration](https://github.com/user-attachments/assets/73893f9f-c1ef-438f-a884-ec3f60f00118)
277
303
 
@@ -1,2 +1,2 @@
1
- version_info = (2, 3, 2)
1
+ version_info = (2, 3, 3)
2
2
  __version__ = '.'.join(map(str, version_info))
@@ -662,6 +662,11 @@ class CameraOptions(Tree):
662
662
  '''
663
663
  return self.get_param_value(CamParams.DISPLAY_STATS_OPTION)
664
664
 
665
+ def toggleDisplayStats(self):
666
+ param = self.get_param(CamParams.DISPLAY_STATS_OPTION)
667
+ if param:
668
+ param.setValue(not param.value())
669
+
665
670
  @property
666
671
  def isLineProfiler(self):
667
672
  '''
@@ -6,6 +6,7 @@ import time
6
6
  import traceback
7
7
  from functools import lru_cache
8
8
  from queue import Queue
9
+ from typing import Union
9
10
 
10
11
  import cv2
11
12
  import numpy as np
@@ -98,7 +99,7 @@ class Camera_Panel(QtWidgets.QGroupBox):
98
99
 
99
100
  self._directory = os.path.join(home, 'Desktop') # save directory
100
101
  self._save_path = '' # save path
101
- self._save_prefix = '' # save prefix
102
+ self._save_prefix = ''
102
103
 
103
104
  # acquisition job info class
104
105
  self.acq_job = None
@@ -119,7 +120,7 @@ class Camera_Panel(QtWidgets.QGroupBox):
119
120
  self.main_layout.addWidget(self.main_tab_view)
120
121
 
121
122
  # tab widgets
122
- self.first_tab = QtWidgets.QWidget()
123
+ self.first_tab = QtWidgets.QSplitter(QtCore.Qt.Orientation.Vertical)
123
124
 
124
125
  self.OME_tab = MetadataEditorTree()
125
126
 
@@ -128,11 +129,6 @@ class Camera_Panel(QtWidgets.QGroupBox):
128
129
  if not self.mini:
129
130
  self.main_tab_view.addTab(self.OME_tab, 'OME-XML metadata')
130
131
 
131
- # first tab vertical layout
132
- self.first_tab_Layout = QtWidgets.QFormLayout()
133
- # set as first tab layout
134
- self.first_tab.setLayout(self.first_tab_Layout)
135
-
136
132
  self.camera_options = CameraOptions()
137
133
 
138
134
  # Create the camera shortcuts widget
@@ -148,7 +144,14 @@ class Camera_Panel(QtWidgets.QGroupBox):
148
144
  r'(\d+)(?:_ms|ms)', name
149
145
  ) # find any number of format '000_ms' or '00ms'
150
146
  if match:
147
+ unit = self.camera_options.get_param(CamParams.EXPOSURE).opts[
148
+ 'suffix'
149
+ ]
151
150
  exposure = self._cam.getExposure()
151
+ if unit == 's':
152
+ exposure *= 1000
153
+ elif unit == 'us':
154
+ exposure /= 1000
152
155
  # update the exposure time in the name
153
156
  name = name.replace(match.group(0), f'{exposure:03.0f}ms')
154
157
  else:
@@ -163,16 +166,44 @@ class Camera_Panel(QtWidgets.QGroupBox):
163
166
  name = re.sub(r'^\d+', f'{index:03d}', name)
164
167
  else:
165
168
  name = f'001_{name}'
166
-
169
+ elif mode == 'unique_index':
170
+ # Check if folder exists within the chosen directory
171
+ directory = self.camera_options.get_param_value(
172
+ CamParams.SAVE_DIRECTORY
173
+ )
174
+ match = re.search(r'^\d+', name)
175
+ if match:
176
+ index = 1
177
+ while any(
178
+ folder.startswith(f'{index:03d}_')
179
+ for folder in os.listdir(directory)
180
+ if os.path.isdir(os.path.join(directory, folder))
181
+ ):
182
+ index += 1
183
+ name = re.sub(r'^\d+', f'{index:03d}', name)
184
+ else:
185
+ index = 1
186
+ while os.path.exists(
187
+ os.path.join(directory, f'{index:03d}_{name}')
188
+ ):
189
+ index += 1
190
+ name = f'{index:03d}_{name}'
167
191
 
168
192
  self.camera_options.set_param_value(CamParams.EXPERIMENT_NAME, name)
169
193
 
170
-
171
194
  self.cam_shortcuts.exposureChanged.connect(self.setExposure)
172
195
  self.cam_shortcuts.autostretchChanged.connect(
173
196
  self.camera_options.toggleAutostretch
174
197
  )
175
198
  self.cam_shortcuts.previewChanged.connect(self.camera_options.togglePreview)
199
+ self.cam_shortcuts.displayStatsChanged.connect(
200
+ self.camera_options.toggleDisplayStats
201
+ )
202
+ self.cam_shortcuts.displayModeChanged.connect(
203
+ lambda mode: self.camera_options.set_param_value(
204
+ CamParams.VIEW_OPTIONS, mode
205
+ )
206
+ )
176
207
  self.cam_shortcuts.saveDataChanged.connect(self.camera_options.toggleSaveData)
177
208
  self.cam_shortcuts.zoomChanged.connect(self.camera_options.setZoom)
178
209
  self.cam_shortcuts.acquisitionStart.connect(self.start_free_run)
@@ -196,6 +227,12 @@ class Camera_Panel(QtWidgets.QGroupBox):
196
227
  self.cam_shortcuts.set_preview(
197
228
  self.camera_options.get_param_value(CamParams.PREVIEW)
198
229
  )
230
+ self.cam_shortcuts.set_display_stats(
231
+ self.camera_options.get_param_value(CamParams.DISPLAY_STATS_OPTION)
232
+ )
233
+ self.cam_shortcuts.set_display_mode(
234
+ self.camera_options.get_param_value(CamParams.VIEW_OPTIONS)
235
+ )
199
236
  self.cam_shortcuts.set_save_data(
200
237
  self.camera_options.get_param_value(CamParams.SAVE_DATA)
201
238
  )
@@ -204,14 +241,20 @@ class Camera_Panel(QtWidgets.QGroupBox):
204
241
  # display menu but centered horizontally
205
242
  menu.exec(
206
243
  self.main_tab_view.mapToGlobal(
207
- QtCore.QPoint(self.main_tab_view.rect().left(), pos.y())
244
+ QtCore.QPoint(
245
+ self.main_tab_view.rect().left()
246
+ + (self.main_tab_view.rect().width() - menu.rect().width())
247
+ // 2,
248
+ pos.y(),
249
+ )
208
250
  )
209
251
  )
210
252
 
211
253
  self.camera_options.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
212
254
  self.camera_options.customContextMenuRequested.connect(show_shortcuts)
213
255
 
214
- self.first_tab_Layout.addRow(self.camera_options)
256
+ self.first_tab.addWidget(self.camera_options)
257
+ self.first_tab.setStretchFactor(0, 1)
215
258
 
216
259
  self.camera_options.get_param(
217
260
  CamParams.EXPERIMENT_NAME
@@ -262,20 +305,50 @@ class Camera_Panel(QtWidgets.QGroupBox):
262
305
  self.camera_options.viewOptionChanged.connect(lambda: self.view_toggled())
263
306
 
264
307
  # controls for histogram and cdf
265
- self.histogram_group = ExpandableGroupBox('Histogram')
266
- self.first_tab_Layout.addRow(self.histogram_group)
267
- # Hist plotWidget
308
+
309
+ # Create a single plot with shared X-axis and
310
+ # separate Y-axes for histogram and CDF
268
311
  self.histogram = pg.PlotWidget()
269
- self.hist_cdf = pg.PlotWidget()
312
+ self.hist_cdf = pg.ViewBox()
313
+
314
+ # Add the CDF ViewBox to the histogram plot
315
+ self.histogram.getPlotItem().scene().addItem(self.hist_cdf)
316
+ self.histogram.getPlotItem().getAxis('left').setLabel('HIST')
317
+ self.histogram.getPlotItem().getAxis('right').setLabel('CDF')
318
+ self.histogram.getPlotItem().showAxis('right')
319
+ self.histogram.getPlotItem().getAxis('right').linkToView(self.hist_cdf)
320
+
321
+ # Link the X-axis of the CDF ViewBox to the main plot
322
+ self.hist_cdf.setXLink(self.histogram.getPlotItem().getViewBox())
323
+
324
+ # Adjust the CDF ViewBox to match the main plot
325
+ def update_views():
326
+ self.hist_cdf.setGeometry(
327
+ self.histogram.getPlotItem().getViewBox().sceneBoundingRect()
328
+ )
329
+ self.hist_cdf.linkedViewChanged(
330
+ self.histogram.getPlotItem().getViewBox(), self.hist_cdf.XAxis
331
+ )
332
+
333
+ self.histogram.getPlotItem().getViewBox().sigResized.connect(update_views)
334
+
335
+ # Set up pens and brushes for histogram and CDF
270
336
  greenP = pg.mkPen(color='g')
271
337
  blueP = pg.mkPen(color='b')
338
+ cyanP = pg.mkPen(color='c')
339
+ yellowP = pg.mkPen(color='y')
272
340
  greenB = pg.mkBrush(0, 255, 0, 32)
273
341
  blueB = pg.mkBrush(0, 0, 255, 32)
342
+
343
+ # Add histogram and CDF plots
274
344
  self._plot_ref = self.histogram.plot(self._bins, self._hist, pen=greenP)
275
- self._cdf_plot_ref = self.hist_cdf.plot(self._bins, self._hist, pen=greenP)
276
345
  self._plot_ref_2 = self.histogram.plot(self._bins, self._hist, pen=blueP)
277
- self._cdf_plot_ref_2 = self.hist_cdf.plot(self._bins, self._hist, pen=blueP)
346
+ self._cdf_plot_ref = pg.PlotDataItem(self._bins, self._hist, pen=cyanP)
347
+ self._cdf_plot_ref_2 = pg.PlotDataItem(self._bins, self._hist, pen=yellowP)
348
+ self.hist_cdf.addItem(self._cdf_plot_ref)
349
+ self.hist_cdf.addItem(self._cdf_plot_ref_2)
278
350
 
351
+ # Add linear regions for histogram and CDF
279
352
  self.lr_0 = pg.LinearRegionItem(
280
353
  (0, self._nBins),
281
354
  bounds=(0, self._nBins),
@@ -297,8 +370,9 @@ class Camera_Panel(QtWidgets.QGroupBox):
297
370
  self.histogram.addItem(self.lr_0)
298
371
  self.histogram.addItem(self.lr_1)
299
372
 
300
- self.histogram_group.layout().addWidget(self.histogram)
301
- self.histogram_group.layout().addWidget(self.hist_cdf)
373
+ # Add the histogram plot to the layout
374
+ self.first_tab.addWidget(self.histogram)
375
+ self.first_tab.setStretchFactor(1, 1)
302
376
 
303
377
  CameraOptions.combine_params(self.PARAMS)
304
378
 
@@ -491,7 +565,7 @@ class Camera_Panel(QtWidgets.QGroupBox):
491
565
  )
492
566
 
493
567
  def view_toggled(self):
494
- if self.camera_options.isSingleView:
568
+ if self.camera_options.isSingleView or self.camera_options.isROIsView:
495
569
  self.lr_0.setSpan(0, 1)
496
570
  self.lr_1.setMovable(False)
497
571
  self.lr_1.setRegion((0, self._nBins))
@@ -734,17 +808,29 @@ def drawStats(frame: uImage):
734
808
  ]
735
809
 
736
810
  # Font settings
737
- font, font_scale, font_thickness, font_color = get_font_settings()
811
+ font = cv2.FONT_HERSHEY_SIMPLEX
812
+ font_scale = 0.5 # Reduced font size
813
+ font_thickness = 1
814
+ font_color = (255, 255, 255) # White text
738
815
 
739
816
  # Position to start adding text
740
- x, y = 50, 50
817
+ x, y = 10, 20
741
818
 
742
- # Add each line of text to the image
819
+ # Add each line of text to the image with a background
743
820
  for line in lines:
821
+ text_size = cv2.getTextSize(line, font, font_scale, font_thickness)[0]
822
+ text_x, text_y = x, y - text_size[1]
823
+ cv2.rectangle(
824
+ frame._view,
825
+ (text_x - 2, text_y - 2),
826
+ (text_x + text_size[0] + 2, text_y + text_size[1] + 2),
827
+ (0, 0, 0), # Black background
828
+ -1,
829
+ )
744
830
  cv2.putText(
745
831
  frame._view, line, (x, y), font, font_scale, font_color, font_thickness
746
832
  )
747
- y += int(2 * font_scale * 20) # Adjust vertical spacing
833
+ y += int(1.5 * text_size[1]) # Adjust vertical spacing
748
834
 
749
835
 
750
836
  def update_histogram_and_display(params: AcquisitionJob, camp: Camera_Panel):
@@ -758,113 +844,91 @@ def update_histogram_and_display(params: AcquisitionJob, camp: Camera_Panel):
758
844
  camp : Camera_Panel
759
845
  The camera panel to display data.
760
846
  '''
761
- # Common logic for updating histogram and display
847
+
848
+ def process_frame(frame: uImage, region=None, zoom=None):
849
+ '''Helper to process a single frame.'''
850
+ frame.equalizeLUT(region, camp.camera_options.isNumpyLUT)
851
+ if zoom is None:
852
+ zoom = camp.camera_options.get_param_value(CamParams.RESIZE_DISPLAY)
853
+ frame._view = cv2.resize(
854
+ frame._view, (0, 0), fx=zoom, fy=zoom, interpolation=cv2.INTER_NEAREST
855
+ )
856
+
857
+ if camp.camera_options.isDisplayStats:
858
+ drawStats(frame)
859
+ return frame
860
+
861
+ def display_frame(name, frame: Union[uImage, np.ndarray]):
862
+ '''Helper to display a single frame.'''
863
+ if isinstance(frame, uImage):
864
+ frame = frame._view
865
+
866
+ cv2.imshow(name, frame)
867
+
762
868
  if camp.camera_options.isSingleView or (
763
869
  camp.camera_options.isROIsView and len(params.rois) == 0
764
870
  ):
765
- _range = (
871
+ region = (
766
872
  None
767
873
  if camp.camera_options.isAutostretch
768
874
  else tuple(map(math.ceil, camp.lr_0.getRegion()))
769
875
  )
770
-
771
- params.frame.equalizeLUT(_range, camp.camera_options.isNumpyLUT)
772
-
876
+ params.frame = process_frame(params.frame, region)
773
877
  camp.updateRangeSignal.emit(params.frame._min, params.frame._max)
774
-
775
878
  camp.updateStatsSignal.emit((params.frame, None))
879
+ display_frame(params.name, params.frame)
776
880
 
777
- # resizing the image
778
- zoom = camp.camera_options.get_param_value(CamParams.RESIZE_DISPLAY)
779
-
780
- if camp.camera_options.isDisplayStats:
781
- drawStats(params.frame)
782
-
783
- params.frame._view = cv2.resize(
784
- params.frame._view,
785
- (0, 0),
786
- fx=zoom,
787
- fy=zoom,
788
- interpolation=cv2.INTER_NEAREST,
789
- )
790
-
791
- # display it
792
- cv2.imshow(params.name, params.frame._view)
793
881
  elif camp.camera_options.isROIsView:
794
- if len(params.rois) == 1:
795
- camp._plot_ref_2.setData(camp._hist)
796
- camp._cdf_plot_ref_2.setData(camp._hist)
797
882
  images, mins, maxs = [], [], []
798
883
  for idx, roi in enumerate(params.rois):
799
884
  uimage = uImage(
800
885
  params.frame.image[roi[1] : roi[1] + roi[3], roi[0] : roi[0] + roi[2]]
801
886
  )
802
-
803
887
  if idx > 0 and params.flip_rois:
804
888
  uimage.image = np.fliplr(uimage.image)
805
-
806
- _range = None
807
- # image stretching
808
- if not camp.camera_options.isAutostretch and idx < 2:
809
- linear_region = camp.lr_0 if idx == 0 else camp.lr_1
810
- _range = tuple(map(math.ceil, linear_region.getRegion()))
811
-
812
- uimage.equalizeLUT(_range, camp.camera_options.isNumpyLUT)
813
-
889
+ region = (
890
+ None
891
+ if camp.camera_options.isAutostretch
892
+ else tuple(map(math.ceil, camp.lr_0.getRegion()))
893
+ )
894
+ uimage = process_frame(uimage, region)
814
895
  mins.append(uimage._min)
815
896
  maxs.append(uimage._max)
816
897
  images.append(uimage)
817
-
818
- # resizing the image
819
- zoom = camp.camera_options.get_param_value(CamParams.RESIZE_DISPLAY)
820
- uimage._view = cv2.resize(
821
- uimage._view, (0, 0), fx=zoom, fy=zoom, interpolation=cv2.INTER_NEAREST
822
- )
823
-
824
- # display it
825
- cv2.imshow(params.name + f' ROI {idx + 1}', uimage._view)
826
-
898
+ display_frame(f'ROI {idx + 1}', uimage)
827
899
  camp.updateRangeSignal.emit(min(mins), max(maxs))
828
900
  camp.updateStatsSignal.emit(tuple(images))
829
- else:
830
- _rang_left = None
831
- _rang_right = None
832
-
833
- # image stretching
834
- if not camp.camera_options.isAutostretch:
835
- _rang_left = tuple(map(math.ceil, camp.lr_0.getRegion()))
836
- _rang_right = tuple(map(math.ceil, camp.lr_1.getRegion()))
837
901
 
902
+ else:
838
903
  left, right = params.frame.hsplitView()
839
-
840
- left.equalizeLUT(_rang_left, camp.camera_options.isNumpyLUT)
841
- right.equalizeLUT(_rang_right, camp.camera_options.isNumpyLUT)
842
-
904
+ zoom = camp.camera_options.get_param_value(CamParams.RESIZE_DISPLAY)
905
+ left = process_frame(
906
+ left,
907
+ None
908
+ if camp.camera_options.isAutostretch
909
+ else tuple(map(math.ceil, camp.lr_0.getRegion())),
910
+ zoom=zoom,
911
+ )
912
+ right = process_frame(
913
+ right,
914
+ None
915
+ if camp.camera_options.isAutostretch
916
+ else tuple(map(math.ceil, camp.lr_1.getRegion())),
917
+ zoom=zoom,
918
+ )
843
919
  camp.updateRangeSignal.emit(
844
920
  min(left._min, right._min), max(left._max, right._max)
845
921
  )
846
922
  camp.updateStatsSignal.emit((left, right))
847
923
 
848
- zoom = camp.camera_options.get_param_value(CamParams.RESIZE_DISPLAY)
849
924
  if camp.camera_options.isOverlaidView:
850
- _img = np.zeros(left._view.shape[:2] + (3,), dtype=np.uint8)
851
- _img[..., 1] = left._view
852
- _img[..., 0] = right._view
853
- _img = cv2.resize(
854
- _img, (0, 0), fx=zoom, fy=zoom, interpolation=cv2.INTER_NEAREST
855
- )
856
-
857
- cv2.imshow(params.name, _img)
925
+ overlaid_img = np.zeros(left._view.shape[:2] + (3,), dtype=np.uint8)
926
+ overlaid_img[..., 1] = left._view
927
+ overlaid_img[..., 0] = right._view
928
+ display_frame(params.name, overlaid_img)
858
929
  else:
859
- _img = cv2.resize(
860
- np.concatenate([left._view, right._view], axis=1),
861
- (0, 0),
862
- fx=zoom,
863
- fy=zoom,
864
- interpolation=cv2.INTER_NEAREST,
865
- )
866
-
867
- cv2.imshow(params.name, _img)
930
+ concatenated_img = np.concatenate([left._view, right._view], axis=1)
931
+ display_frame(params.name, concatenated_img)
868
932
 
869
933
 
870
934
  def cam_display(params: AcquisitionJob, camp: Camera_Panel, **kwargs):
@@ -11,6 +11,7 @@ import tifffile as tf
11
11
  import zarr
12
12
 
13
13
  from microEye.hardware.cams.camera_calibration import dark_calibration
14
+ from microEye.utils.uImage import uImage
14
15
 
15
16
 
16
17
  class AcquisitionJob:
@@ -205,7 +206,7 @@ class AcquisitionJob:
205
206
  '''cross-thread attribute (use lock)'''
206
207
  self.display_time = 0.0
207
208
  '''cross-thread attribute (use lock)'''
208
- self.frame = None
209
+ self.frame : uImage = None
209
210
  '''cross-thread attribute (use lock)'''
210
211
  self.frames_captured = 0
211
212
  '''cross-thread attribute (use lock)'''