python-microscopy 25.11.20__cp313-cp313-win_amd64.whl

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 (1278) hide show
  1. PYME/Acquire/ActionManager.py +450 -0
  2. PYME/Acquire/ExecTools.py +235 -0
  3. PYME/Acquire/Hardware/AAOptoelectronics/MDS.py +175 -0
  4. PYME/Acquire/Hardware/AAOptoelectronics/__init__.py +0 -0
  5. PYME/Acquire/Hardware/ARCoptix/__init__.py +0 -0
  6. PYME/Acquire/Hardware/ARCoptix/lcdriver.py +149 -0
  7. PYME/Acquire/Hardware/ARCoptix/lcserver32.py +123 -0
  8. PYME/Acquire/Hardware/AndorIXon/AndorCam.py +1095 -0
  9. PYME/Acquire/Hardware/AndorIXon/AndorControlFrame.py +312 -0
  10. PYME/Acquire/Hardware/AndorIXon/AndorIXon.py +737 -0
  11. PYME/Acquire/Hardware/AndorIXon/__init__.py +27 -0
  12. PYME/Acquire/Hardware/AndorNeo/AndorNeo.py +644 -0
  13. PYME/Acquire/Hardware/AndorNeo/AndorNeoControlFrame.py +161 -0
  14. PYME/Acquire/Hardware/AndorNeo/AndorZyla.py +761 -0
  15. PYME/Acquire/Hardware/AndorNeo/SDK3.py +307 -0
  16. PYME/Acquire/Hardware/AndorNeo/SDK3Cam.py +171 -0
  17. PYME/Acquire/Hardware/AndorNeo/ZylaControlPanel.py +105 -0
  18. PYME/Acquire/Hardware/AndorNeo/__init__.py +22 -0
  19. PYME/Acquire/Hardware/AndorNeo/parseAtdebug.py +46 -0
  20. PYME/Acquire/Hardware/AndorNeo/plotTimings.py +73 -0
  21. PYME/Acquire/Hardware/AndorNeo/testNeo.py +62 -0
  22. PYME/Acquire/Hardware/Camera.py +1199 -0
  23. PYME/Acquire/Hardware/CameraSkeleton.py +642 -0
  24. PYME/Acquire/Hardware/Coherent/OBIS.py +147 -0
  25. PYME/Acquire/Hardware/Coherent/Sapphire.py +162 -0
  26. PYME/Acquire/Hardware/Coherent/__init__.py +0 -0
  27. PYME/Acquire/Hardware/DMDGui.py +198 -0
  28. PYME/Acquire/Hardware/DigiData/DigiData.py +95 -0
  29. PYME/Acquire/Hardware/DigiData/DigiDataClient.py +30 -0
  30. PYME/Acquire/Hardware/DigiData/RemoteDigiData.py +51 -0
  31. PYME/Acquire/Hardware/DigiData/__init__.py +24 -0
  32. PYME/Acquire/Hardware/DigiData/axDD132x.py +348 -0
  33. PYME/Acquire/Hardware/EMCCDTheory.py +41 -0
  34. PYME/Acquire/Hardware/ExciterWheel.py +167 -0
  35. PYME/Acquire/Hardware/FilterWheel.py +184 -0
  36. PYME/Acquire/Hardware/FocCorr.py +106 -0
  37. PYME/Acquire/Hardware/FocCorrR.py +196 -0
  38. PYME/Acquire/Hardware/FrFilter.py +51 -0
  39. PYME/Acquire/Hardware/GCS/GCS_DLL.py +370 -0
  40. PYME/Acquire/Hardware/GCS/__init__.py +0 -0
  41. PYME/Acquire/Hardware/GCS/gcs.py +210 -0
  42. PYME/Acquire/Hardware/HamamatsuDCAM/HamamatsuDCAM.py +662 -0
  43. PYME/Acquire/Hardware/HamamatsuDCAM/HamamatsuORCA.py +602 -0
  44. PYME/Acquire/Hardware/HamamatsuDCAM/Hamamatsu_control_panel.py +54 -0
  45. PYME/Acquire/Hardware/HamamatsuDCAM/__init__.py +23 -0
  46. PYME/Acquire/Hardware/LaserControlFrame.py +160 -0
  47. PYME/Acquire/Hardware/MPBCommunications/MPBCW.py +132 -0
  48. PYME/Acquire/Hardware/MPBCommunications/__init__.py +0 -0
  49. PYME/Acquire/Hardware/Mercury/Mercury.py +269 -0
  50. PYME/Acquire/Hardware/Mercury/PI_Mercury_GCS_DLL.py +857 -0
  51. PYME/Acquire/Hardware/Mercury/__init__.py +22 -0
  52. PYME/Acquire/Hardware/Mercury/mercuryStepper.py +203 -0
  53. PYME/Acquire/Hardware/Mercury/mercuryStepperGCS.py +281 -0
  54. PYME/Acquire/Hardware/NikonTE2000.py +68 -0
  55. PYME/Acquire/Hardware/NikonTi.py +214 -0
  56. PYME/Acquire/Hardware/NikonTiGUI.py +81 -0
  57. PYME/Acquire/Hardware/OrielCornerstone.py +125 -0
  58. PYME/Acquire/Hardware/PM100USB.py +51 -0
  59. PYME/Acquire/Hardware/Piezos/__init__.py +22 -0
  60. PYME/Acquire/Hardware/Piezos/base_piezo.py +108 -0
  61. PYME/Acquire/Hardware/Piezos/offsetPiezo.py +162 -0
  62. PYME/Acquire/Hardware/Piezos/offsetPiezoREST.py +308 -0
  63. PYME/Acquire/Hardware/Piezos/piezo_c867.py +486 -0
  64. PYME/Acquire/Hardware/Piezos/piezo_e255.py +68 -0
  65. PYME/Acquire/Hardware/Piezos/piezo_e662.py +61 -0
  66. PYME/Acquire/Hardware/Piezos/piezo_e709.py +434 -0
  67. PYME/Acquire/Hardware/Piezos/piezo_e816.py +452 -0
  68. PYME/Acquire/Hardware/Piezos/piezo_e816_corr.py +70 -0
  69. PYME/Acquire/Hardware/Piezos/piezo_e816_dll.py +518 -0
  70. PYME/Acquire/Hardware/Piezos/piezo_e816b.py +70 -0
  71. PYME/Acquire/Hardware/Piezos/piezo_pipython_gcs.py +560 -0
  72. PYME/Acquire/Hardware/Piezos/piezo_test.py +55 -0
  73. PYME/Acquire/Hardware/Simulator/EmpiricalHist.py +273 -0
  74. PYME/Acquire/Hardware/Simulator/__init__.py +22 -0
  75. PYME/Acquire/Hardware/Simulator/dSimControl.py +961 -0
  76. PYME/Acquire/Hardware/Simulator/fakeCam.py +651 -0
  77. PYME/Acquire/Hardware/Simulator/fakePiezo.py +95 -0
  78. PYME/Acquire/Hardware/Simulator/fluor.py +336 -0
  79. PYME/Acquire/Hardware/Simulator/illuminate.cp313-win_amd64.dll.a +0 -0
  80. PYME/Acquire/Hardware/Simulator/illuminate.cp313-win_amd64.pyd +0 -0
  81. PYME/Acquire/Hardware/Simulator/illuminate.pyx +93 -0
  82. PYME/Acquire/Hardware/Simulator/lasersliders.py +90 -0
  83. PYME/Acquire/Hardware/Simulator/rend_im.py +446 -0
  84. PYME/Acquire/Hardware/Simulator/setup.py +69 -0
  85. PYME/Acquire/Hardware/Simulator/simcontrol.py +348 -0
  86. PYME/Acquire/Hardware/Simulator/simui_wx.py +794 -0
  87. PYME/Acquire/Hardware/Tango/__init__.py +0 -0
  88. PYME/Acquire/Hardware/Tango/marzhauser_tango.py +583 -0
  89. PYME/Acquire/Hardware/TiLightCrafter.py +388 -0
  90. PYME/Acquire/Hardware/__init__.py +22 -0
  91. PYME/Acquire/Hardware/aotf.py +271 -0
  92. PYME/Acquire/Hardware/arclampshutterpanel.py +71 -0
  93. PYME/Acquire/Hardware/cameraSoftwareBuffer.py +215 -0
  94. PYME/Acquire/Hardware/camera_noise.py +270 -0
  95. PYME/Acquire/Hardware/ccdAdjPanel.py +188 -0
  96. PYME/Acquire/Hardware/ccdCalibrator.py +161 -0
  97. PYME/Acquire/Hardware/cobaltLaser.py +108 -0
  98. PYME/Acquire/Hardware/cobaltLaser561.py +94 -0
  99. PYME/Acquire/Hardware/comports.py +26 -0
  100. PYME/Acquire/Hardware/driftTrackGUI.py +488 -0
  101. PYME/Acquire/Hardware/driftTracking.py +595 -0
  102. PYME/Acquire/Hardware/fakeShutters.py +52 -0
  103. PYME/Acquire/Hardware/focusKeys.py +204 -0
  104. PYME/Acquire/Hardware/focus_locks/__init__.py +0 -0
  105. PYME/Acquire/Hardware/focus_locks/reflection_focus_lock.py +684 -0
  106. PYME/Acquire/Hardware/frZStage.py +117 -0
  107. PYME/Acquire/Hardware/fw102.py +38 -0
  108. PYME/Acquire/Hardware/ids_peak_cam.py +561 -0
  109. PYME/Acquire/Hardware/ioslave.py +305 -0
  110. PYME/Acquire/Hardware/lasers.py +292 -0
  111. PYME/Acquire/Hardware/matchboxLaser.py +58 -0
  112. PYME/Acquire/Hardware/microscope_adapter.py +104 -0
  113. PYME/Acquire/Hardware/mpd_picosecond_delayer.py +395 -0
  114. PYME/Acquire/Hardware/multiview.py +287 -0
  115. PYME/Acquire/Hardware/olympusix81.py +59 -0
  116. PYME/Acquire/Hardware/pco/__init__.py +0 -0
  117. PYME/Acquire/Hardware/pco/pco_cam.py +348 -0
  118. PYME/Acquire/Hardware/pco/pco_edge_42_lt.py +34 -0
  119. PYME/Acquire/Hardware/pco/pco_sdk.py +1645 -0
  120. PYME/Acquire/Hardware/pco/pco_sdk_cam.py +518 -0
  121. PYME/Acquire/Hardware/pco/pco_sdk_cam_control_panel.py +54 -0
  122. PYME/Acquire/Hardware/phoxxLaser.py +199 -0
  123. PYME/Acquire/Hardware/phoxxLaserOLD.py +242 -0
  124. PYME/Acquire/Hardware/priorLumen.py +102 -0
  125. PYME/Acquire/Hardware/priorarclampshutter.py +52 -0
  126. PYME/Acquire/Hardware/setup.py +50 -0
  127. PYME/Acquire/Hardware/spacenav.py +148 -0
  128. PYME/Acquire/Hardware/splitter.py +394 -0
  129. PYME/Acquire/Hardware/thorlabsPiezo.py +98 -0
  130. PYME/Acquire/Hardware/thorlabs_cam.py +136 -0
  131. PYME/Acquire/Hardware/thorlabs_mff_flipper.py +400 -0
  132. PYME/Acquire/Hardware/toptica_ibeam.py +51 -0
  133. PYME/Acquire/Hardware/uc480/AndorControlFrame.py +308 -0
  134. PYME/Acquire/Hardware/uc480/__init__.py +27 -0
  135. PYME/Acquire/Hardware/uc480/uCam480.py +695 -0
  136. PYME/Acquire/Hardware/uc480/uc480.py +189 -0
  137. PYME/Acquire/Hardware/uc480/uc480Deprecated.py +87 -0
  138. PYME/Acquire/Hardware/uc480/uc480_h.py +767 -0
  139. PYME/Acquire/Hardware/uc480/uc480_h_gen.py +62 -0
  140. PYME/Acquire/Hardware/uc480/ucCamControlFrame.py +83 -0
  141. PYME/Acquire/Hardware/ueye.py +702 -0
  142. PYME/Acquire/PYMEAcquire.py +186 -0
  143. PYME/Acquire/Protocols/DMDMFM.py +74 -0
  144. PYME/Acquire/Protocols/__init__.py +22 -0
  145. PYME/Acquire/Protocols/darkCalibrate.py +56 -0
  146. PYME/Acquire/Protocols/dual671_470.py +45 -0
  147. PYME/Acquire/Protocols/dual671_488.py +46 -0
  148. PYME/Acquire/Protocols/gainCal.py +53 -0
  149. PYME/Acquire/Protocols/htsms-cal-psf.py +32 -0
  150. PYME/Acquire/Protocols/htsms-cal-registration.py +52 -0
  151. PYME/Acquire/Protocols/htsms-flow.py +29 -0
  152. PYME/Acquire/Protocols/htsms-staggered.py +31 -0
  153. PYME/Acquire/Protocols/htsms-tile.py +68 -0
  154. PYME/Acquire/Protocols/htsms-two-color.py +29 -0
  155. PYME/Acquire/Protocols/htsms-widefield.py +32 -0
  156. PYME/Acquire/Protocols/paint671.py +61 -0
  157. PYME/Acquire/Protocols/photoconversion.py +52 -0
  158. PYME/Acquire/Protocols/photoconversion2.py +55 -0
  159. PYME/Acquire/Protocols/prebleach488.py +70 -0
  160. PYME/Acquire/Protocols/prebleach490.py +69 -0
  161. PYME/Acquire/Protocols/prebleach561.py +72 -0
  162. PYME/Acquire/Protocols/prebleach561NeomEos2.py +70 -0
  163. PYME/Acquire/Protocols/prebleach561NeomEos2ND1.py +70 -0
  164. PYME/Acquire/Protocols/prebleach642.py +70 -0
  165. PYME/Acquire/Protocols/prebleach671.py +69 -0
  166. PYME/Acquire/Protocols/prebleach671ND1.py +58 -0
  167. PYME/Acquire/Protocols/prebleach671ND2.py +57 -0
  168. PYME/Acquire/Protocols/prebleach671Neo.py +69 -0
  169. PYME/Acquire/Protocols/recover671.py +62 -0
  170. PYME/Acquire/Protocols/sequence642_488.py +85 -0
  171. PYME/Acquire/Protocols/sequence642_561.py +87 -0
  172. PYME/Acquire/Protocols/shiftfield.py +198 -0
  173. PYME/Acquire/Protocols/simul488.py +59 -0
  174. PYME/Acquire/Protocols/simul642.py +63 -0
  175. PYME/Acquire/Protocols/simul642HTSMS.py +63 -0
  176. PYME/Acquire/Protocols/simulPA.py +37 -0
  177. PYME/Acquire/Protocols/simulSIM.py +76 -0
  178. PYME/Acquire/Protocols/simulStep.py +62 -0
  179. PYME/Acquire/Protocols/spdscan.py +178 -0
  180. PYME/Acquire/Protocols/standard470.py +45 -0
  181. PYME/Acquire/Protocols/standard488.py +47 -0
  182. PYME/Acquire/Protocols/standard671.py +48 -0
  183. PYME/Acquire/Protocols/standard671_no532.py +47 -0
  184. PYME/Acquire/Protocols/standardArclamp.py +46 -0
  185. PYME/Acquire/Protocols/strip_tile.py +204 -0
  186. PYME/Acquire/Protocols/tile.py +204 -0
  187. PYME/Acquire/Protocols/tile3D.py +192 -0
  188. PYME/Acquire/Protocols/tile671.py +190 -0
  189. PYME/Acquire/Protocols/tile_triggered.py +189 -0
  190. PYME/Acquire/Scripts/init.py +232 -0
  191. PYME/Acquire/Scripts/init_N1_Ti_Exeter_ZIx.py +374 -0
  192. PYME/Acquire/Scripts/init_N2_Ti_Zyla_lasers.py +290 -0
  193. PYME/Acquire/Scripts/init_Neo.py +266 -0
  194. PYME/Acquire/Scripts/init_NeoSim.py +159 -0
  195. PYME/Acquire/Scripts/init_TIRF.py +232 -0
  196. PYME/Acquire/Scripts/init_TIRF_Neo.py +242 -0
  197. PYME/Acquire/Scripts/init_TIRF_NeoO.py +241 -0
  198. PYME/Acquire/Scripts/init_TIRF_onecam.py +233 -0
  199. PYME/Acquire/Scripts/init_Ti.py +257 -0
  200. PYME/Acquire/Scripts/init_UOA_n.py +256 -0
  201. PYME/Acquire/Scripts/init_UOA_n2.py +246 -0
  202. PYME/Acquire/Scripts/init_Y1.py +249 -0
  203. PYME/Acquire/Scripts/init_Zyla.py +260 -0
  204. PYME/Acquire/Scripts/init_drift_tracking.py +80 -0
  205. PYME/Acquire/Scripts/init_emccd_basic.py +277 -0
  206. PYME/Acquire/Scripts/init_htsms.py +277 -0
  207. PYME/Acquire/Scripts/init_htsms_focus_lock.py +132 -0
  208. PYME/Acquire/Scripts/init_micrpi.py +45 -0
  209. PYME/Acquire/Scripts/init_orca.py +70 -0
  210. PYME/Acquire/Scripts/init_pco.py +49 -0
  211. PYME/Acquire/Scripts/init_rev.py +74 -0
  212. PYME/Acquire/Scripts/init_sim100.py +169 -0
  213. PYME/Acquire/Scripts/init_sim103.py +169 -0
  214. PYME/Acquire/Scripts/init_sim2.py +211 -0
  215. PYME/Acquire/Scripts/init_sim50.py +169 -0
  216. PYME/Acquire/Scripts/init_sim75.py +169 -0
  217. PYME/Acquire/Scripts/init_sim_drift_tracking.py +166 -0
  218. PYME/Acquire/Scripts/init_sim_htsms.py +224 -0
  219. PYME/Acquire/Scripts/init_sim_htsms_n.py +233 -0
  220. PYME/Acquire/Scripts/init_sim_main.py +229 -0
  221. PYME/Acquire/Scripts/init_sim_min.py +197 -0
  222. PYME/Acquire/Scripts/init_sim_rem.py +176 -0
  223. PYME/Acquire/Scripts/init_smi1.py +110 -0
  224. PYME/Acquire/Scripts/init_spectro.py +78 -0
  225. PYME/Acquire/Scripts/init_spim.py +116 -0
  226. PYME/Acquire/Scripts/init_thorcam.py +62 -0
  227. PYME/Acquire/Scripts/init_twophoton.py +112 -0
  228. PYME/Acquire/Scripts/init_uc480.py +262 -0
  229. PYME/Acquire/Scripts/init_ueye.py +261 -0
  230. PYME/Acquire/SpoolController.py +958 -0
  231. PYME/Acquire/Utils/MultiPointScanner.py +80 -0
  232. PYME/Acquire/Utils/__init__.py +13 -0
  233. PYME/Acquire/Utils/failsafe.py +157 -0
  234. PYME/Acquire/Utils/fastTiler.py +153 -0
  235. PYME/Acquire/Utils/pointScanner.py +496 -0
  236. PYME/Acquire/Utils/sarcSpacing.py +86 -0
  237. PYME/Acquire/Utils/strip_tiler.py +93 -0
  238. PYME/Acquire/Utils/tiler.py +464 -0
  239. PYME/Acquire/Utils/vibrationAnalysis.py +65 -0
  240. PYME/Acquire/__init__.py +44 -0
  241. PYME/Acquire/acquire_client.py +90 -0
  242. PYME/Acquire/acquire_server.py +316 -0
  243. PYME/Acquire/acquirebase.py +139 -0
  244. PYME/Acquire/acquiremainframe.py +716 -0
  245. PYME/Acquire/acquirewx.py +61 -0
  246. PYME/Acquire/acquisition_base.py +148 -0
  247. PYME/Acquire/actions.py +209 -0
  248. PYME/Acquire/autofocus.py +54 -0
  249. PYME/Acquire/eventLog.py +95 -0
  250. PYME/Acquire/event_loop.py +119 -0
  251. PYME/Acquire/frameWrangler.py +530 -0
  252. PYME/Acquire/htsms/__init__.py +8 -0
  253. PYME/Acquire/htsms/rule_ui.py +970 -0
  254. PYME/Acquire/htsms/rule_ui_v2.py +573 -0
  255. PYME/Acquire/htsms/tweeter.py +222 -0
  256. PYME/Acquire/microscope.py +1050 -0
  257. PYME/Acquire/positionTracker.py +181 -0
  258. PYME/Acquire/protocol.py +299 -0
  259. PYME/Acquire/protocol_acquisition.py +404 -0
  260. PYME/Acquire/sampleInformation.py +591 -0
  261. PYME/Acquire/sampleInformationDjangoDirect.py +446 -0
  262. PYME/Acquire/setup.py +52 -0
  263. PYME/Acquire/stackSettings.py +295 -0
  264. PYME/Acquire/stage_leveling.py +285 -0
  265. PYME/Acquire/ui/AnalysisSettingsUI.py +184 -0
  266. PYME/Acquire/ui/HDFSpoolFrame.py +584 -0
  267. PYME/Acquire/ui/__init__.py +0 -0
  268. PYME/Acquire/ui/actionUI.py +892 -0
  269. PYME/Acquire/ui/focus_lock_gui.py +149 -0
  270. PYME/Acquire/ui/intensity_trace.py +143 -0
  271. PYME/Acquire/ui/intsliders.py +222 -0
  272. PYME/Acquire/ui/lasersliders.py +329 -0
  273. PYME/Acquire/ui/mpd_picosecond_delay_panel.py +69 -0
  274. PYME/Acquire/ui/multiview_select.py +77 -0
  275. PYME/Acquire/ui/positionUI.py +519 -0
  276. PYME/Acquire/ui/preflight.py +58 -0
  277. PYME/Acquire/ui/scanner_panel.py +41 -0
  278. PYME/Acquire/ui/selectCameraPanel.py +46 -0
  279. PYME/Acquire/ui/seqdialog.py +501 -0
  280. PYME/Acquire/ui/splashScreen.py +175 -0
  281. PYME/Acquire/ui/spool_panel.py +830 -0
  282. PYME/Acquire/ui/tile_panel.py +556 -0
  283. PYME/Acquire/ui/tilesettingsui.py +91 -0
  284. PYME/Acquire/ui/voxelSizeDialog.py +149 -0
  285. PYME/Acquire/webui/__init__.py +36 -0
  286. PYME/Acquire/webui/ipy.py +361 -0
  287. PYME/Acquire/webui/static/css/pyme-bootstrap.css +9908 -0
  288. PYME/Acquire/webui/static/css/pymeacquire.css +85 -0
  289. PYME/Acquire/webui/static/js/pymeacquire.js +375 -0
  290. PYME/Acquire/webui/static/js/pzf.js +95 -0
  291. PYME/Acquire/webui/templates/PYMEAcquire.html +232 -0
  292. PYME/Acquire/webui/templates/login.html +84 -0
  293. PYME/Acquire/webui/templates/xtermpage.html +106 -0
  294. PYME/Acquire/xyztc.py +418 -0
  295. PYME/Acquire/zScanner.py +287 -0
  296. PYME/Analysis/BleachProfile/__init__.py +26 -0
  297. PYME/Analysis/BleachProfile/deMod.py +91 -0
  298. PYME/Analysis/BleachProfile/fitRecover.py +90 -0
  299. PYME/Analysis/BleachProfile/intensProf.py +519 -0
  300. PYME/Analysis/BleachProfile/kinModels.py +507 -0
  301. PYME/Analysis/BleachProfile/rawIntensity.py +227 -0
  302. PYME/Analysis/BleachProfile/rollins.py +555 -0
  303. PYME/Analysis/Colocalisation/__init__.py +27 -0
  304. PYME/Analysis/Colocalisation/colocScaleDep.py +126 -0
  305. PYME/Analysis/Colocalisation/correlationCoeffs.py +198 -0
  306. PYME/Analysis/Colocalisation/distColoc.py +110 -0
  307. PYME/Analysis/Colocalisation/edtColoc.py +191 -0
  308. PYME/Analysis/MetaData.py +278 -0
  309. PYME/Analysis/PSFEst/__init__.py +27 -0
  310. PYME/Analysis/PSFEst/dec.py +283 -0
  311. PYME/Analysis/PSFEst/extractImages.py +316 -0
  312. PYME/Analysis/PSFEst/fit_psf_zernikes.py +194 -0
  313. PYME/Analysis/PSFEst/psfQuality.py +225 -0
  314. PYME/Analysis/PSFGen/__init__.py +40 -0
  315. PYME/Analysis/PSFGen/fourier.py +138 -0
  316. PYME/Analysis/PSFGen/fourierHNA.py +1108 -0
  317. PYME/Analysis/PSFGen/fourierHNA2.py +979 -0
  318. PYME/Analysis/PSFGen/genCRBcurves.py +185 -0
  319. PYME/Analysis/PSFGen/nijboer_zernike.py +79 -0
  320. PYME/Analysis/PSFGen/ps_app.cp313-win_amd64.dll.a +0 -0
  321. PYME/Analysis/PSFGen/ps_app.cp313-win_amd64.pyd +0 -0
  322. PYME/Analysis/PSFGen/test_ps_app.py +24 -0
  323. PYME/Analysis/Tracking/__init__.py +3 -0
  324. PYME/Analysis/Tracking/msd.py +57 -0
  325. PYME/Analysis/Tracking/trackUtils.py +528 -0
  326. PYME/Analysis/Tracking/tracking.py +152 -0
  327. PYME/Analysis/__init__.py +30 -0
  328. PYME/Analysis/_fithelpers.py +161 -0
  329. PYME/Analysis/angleFilter.py +287 -0
  330. PYME/Analysis/annealThresh.py +157 -0
  331. PYME/Analysis/autoencoder_classifier.py +45 -0
  332. PYME/Analysis/binAvg.py +144 -0
  333. PYME/Analysis/composite.py +183 -0
  334. PYME/Analysis/cramerRao.py +259 -0
  335. PYME/Analysis/deTile.py +441 -0
  336. PYME/Analysis/density_filter.py +45 -0
  337. PYME/Analysis/distributed_pyramid.py +426 -0
  338. PYME/Analysis/fiducial_matching.py +220 -0
  339. PYME/Analysis/gen_sCMOS_maps.py +355 -0
  340. PYME/Analysis/graphing_filters.py +311 -0
  341. PYME/Analysis/implicitFilter.py +359 -0
  342. PYME/Analysis/keep_pairs.py +69 -0
  343. PYME/Analysis/optic_flow.py +108 -0
  344. PYME/Analysis/piecewise.py +36 -0
  345. PYME/Analysis/piecewiseMapping.py +304 -0
  346. PYME/Analysis/piezo_movement_correction.py +153 -0
  347. PYME/Analysis/points/DeClump/__init__.py +78 -0
  348. PYME/Analysis/points/DeClump/deClump.cp313-win_amd64.dll.a +0 -0
  349. PYME/Analysis/points/DeClump/deClump.cp313-win_amd64.pyd +0 -0
  350. PYME/Analysis/points/DeClump/deClumpGUI.py +87 -0
  351. PYME/Analysis/points/DeClump/pyDeClump.py +284 -0
  352. PYME/Analysis/points/DeClump/testClump.py +40 -0
  353. PYME/Analysis/points/DistHist/__init__.py +25 -0
  354. PYME/Analysis/points/DistHist/distHist.cp313-win_amd64.dll.a +0 -0
  355. PYME/Analysis/points/DistHist/distHist.cp313-win_amd64.pyd +0 -0
  356. PYME/Analysis/points/DistHist/distHistThreaded.py +71 -0
  357. PYME/Analysis/points/DistHist/setup.py +54 -0
  358. PYME/Analysis/points/EdgeDB/__init__.py +24 -0
  359. PYME/Analysis/points/EdgeDB/edgeDB.cp313-win_amd64.dll.a +0 -0
  360. PYME/Analysis/points/EdgeDB/edgeDB.cp313-win_amd64.pyd +0 -0
  361. PYME/Analysis/points/EdgeDB/edgeTest.py +66 -0
  362. PYME/Analysis/points/EdgeDB/edges.py +102 -0
  363. PYME/Analysis/points/EdgeDB/segment.py +75 -0
  364. PYME/Analysis/points/EdgeDB/setup.py +54 -0
  365. PYME/Analysis/points/QuadTree/QTrend.py +232 -0
  366. PYME/Analysis/points/QuadTree/__init__.py +25 -0
  367. PYME/Analysis/points/QuadTree/pointQT.py +227 -0
  368. PYME/Analysis/points/QuadTree/pointQTF.py +254 -0
  369. PYME/Analysis/points/QuadTree/qtUtils.py +36 -0
  370. PYME/Analysis/points/QuadTree/rendQT.py +118 -0
  371. PYME/Analysis/points/SoftRend/__init__.py +24 -0
  372. PYME/Analysis/points/SoftRend/setup.py +61 -0
  373. PYME/Analysis/points/SoftRend/testTetrahedra.py +41 -0
  374. PYME/Analysis/points/SoftRend/triRend.cp313-win_amd64.dll.a +0 -0
  375. PYME/Analysis/points/SoftRend/triRend.cp313-win_amd64.pyd +0 -0
  376. PYME/Analysis/points/__init__.py +3 -0
  377. PYME/Analysis/points/arcfit/__init__.py +1 -0
  378. PYME/Analysis/points/arcfit/arcmf.cp313-win_amd64.dll.a +0 -0
  379. PYME/Analysis/points/arcfit/arcmf.cp313-win_amd64.pyd +0 -0
  380. PYME/Analysis/points/arcfit/setup.py +51 -0
  381. PYME/Analysis/points/astigmatism/__init__.py +0 -0
  382. PYME/Analysis/points/astigmatism/astigTools.py +338 -0
  383. PYME/Analysis/points/astigmatism/astiglookup.cp313-win_amd64.dll.a +0 -0
  384. PYME/Analysis/points/astigmatism/astiglookup.cp313-win_amd64.pyd +0 -0
  385. PYME/Analysis/points/astigmatism/setup.py +54 -0
  386. PYME/Analysis/points/cluster_morphology.py +199 -0
  387. PYME/Analysis/points/coordinate_tools.py +278 -0
  388. PYME/Analysis/points/features/__init__.py +0 -0
  389. PYME/Analysis/points/features/metal.py +46 -0
  390. PYME/Analysis/points/features/shaders/vect_feat_3d.metal +49 -0
  391. PYME/Analysis/points/fiducials.py +142 -0
  392. PYME/Analysis/points/gen3DTriangs.py +796 -0
  393. PYME/Analysis/points/moments.py +143 -0
  394. PYME/Analysis/points/multiview.py +458 -0
  395. PYME/Analysis/points/objectMeasure.py +206 -0
  396. PYME/Analysis/points/qpaint.py +97 -0
  397. PYME/Analysis/points/rings.py +372 -0
  398. PYME/Analysis/points/ripleys.py +427 -0
  399. PYME/Analysis/points/segmentLL.py +134 -0
  400. PYME/Analysis/points/setup.py +56 -0
  401. PYME/Analysis/points/spherical_harmonics.py +909 -0
  402. PYME/Analysis/points/surfit.py +829 -0
  403. PYME/Analysis/points/tCluster.py +75 -0
  404. PYME/Analysis/points/traveling_salesperson/__init__.py +0 -0
  405. PYME/Analysis/points/traveling_salesperson/queue_opt.py +117 -0
  406. PYME/Analysis/points/traveling_salesperson/sectioned_two_opt.py +327 -0
  407. PYME/Analysis/points/traveling_salesperson/setup.py +40 -0
  408. PYME/Analysis/points/traveling_salesperson/sort.py +78 -0
  409. PYME/Analysis/points/traveling_salesperson/two_opt.py +189 -0
  410. PYME/Analysis/points/traveling_salesperson/two_opt_utils.cp313-win_amd64.dll.a +0 -0
  411. PYME/Analysis/points/traveling_salesperson/two_opt_utils.cp313-win_amd64.pyd +0 -0
  412. PYME/Analysis/points/traveling_salesperson/two_opt_utils.pyx +41 -0
  413. PYME/Analysis/points/twoColour.py +572 -0
  414. PYME/Analysis/points/twoColourPlot.py +107 -0
  415. PYME/Analysis/processLogger.py +129 -0
  416. PYME/Analysis/profile_extraction.py +72 -0
  417. PYME/Analysis/setup.py +60 -0
  418. PYME/Analysis/splitting.py +372 -0
  419. PYME/Analysis/svmSegment.py +214 -0
  420. PYME/Analysis/thresholding.py +192 -0
  421. PYME/Analysis/tile_pyramid.py +938 -0
  422. PYME/Analysis/widefieldify.py +54 -0
  423. PYME/DSView/DisplayOptionsPanel.py +503 -0
  424. PYME/DSView/LUT/__init__.py +33 -0
  425. PYME/DSView/LUT/lut.cp313-win_amd64.dll.a +0 -0
  426. PYME/DSView/LUT/lut.cp313-win_amd64.pyd +0 -0
  427. PYME/DSView/LUT/setup.py +54 -0
  428. PYME/DSView/OpenSequenceDialog.py +83 -0
  429. PYME/DSView/OverlaysPanel.py +111 -0
  430. PYME/DSView/__init__.py +32 -0
  431. PYME/DSView/arrayViewPanel.py +1035 -0
  432. PYME/DSView/displayOptions.py +453 -0
  433. PYME/DSView/displaySettingsPanel.py +271 -0
  434. PYME/DSView/dsviewer.py +542 -0
  435. PYME/DSView/eventLogViewer.py +805 -0
  436. PYME/DSView/fitInfo.py +486 -0
  437. PYME/DSView/htmlServe.py +72 -0
  438. PYME/DSView/logparser.py +100 -0
  439. PYME/DSView/modules/LMAnalysis.py +1053 -0
  440. PYME/DSView/modules/LMDisplay.py +194 -0
  441. PYME/DSView/modules/__init__.py +162 -0
  442. PYME/DSView/modules/_base.py +39 -0
  443. PYME/DSView/modules/annotation.py +725 -0
  444. PYME/DSView/modules/arrayView.py +71 -0
  445. PYME/DSView/modules/blobFinding.py +455 -0
  446. PYME/DSView/modules/blobMeasure.py +1093 -0
  447. PYME/DSView/modules/camera_maps.py +38 -0
  448. PYME/DSView/modules/coloc.py +414 -0
  449. PYME/DSView/modules/composite.py +715 -0
  450. PYME/DSView/modules/convnet.py +24 -0
  451. PYME/DSView/modules/cropping.py +133 -0
  452. PYME/DSView/modules/dark_and_flatfield.py +31 -0
  453. PYME/DSView/modules/deconvolution.py +499 -0
  454. PYME/DSView/modules/eventView.py +80 -0
  455. PYME/DSView/modules/extractBlobs.py +46 -0
  456. PYME/DSView/modules/fastGraphPanel.py +85 -0
  457. PYME/DSView/modules/filtering.py +335 -0
  458. PYME/DSView/modules/flowView.py +268 -0
  459. PYME/DSView/modules/fourierRingCorrelation.py +172 -0
  460. PYME/DSView/modules/gl_image_view.py +12 -0
  461. PYME/DSView/modules/graphViewPanel.py +272 -0
  462. PYME/DSView/modules/measure/__init__.py +1 -0
  463. PYME/DSView/modules/measure/filterPan.py +239 -0
  464. PYME/DSView/modules/metadataView.py +28 -0
  465. PYME/DSView/modules/multithreshold.py +98 -0
  466. PYME/DSView/modules/neuroglancer.py +129 -0
  467. PYME/DSView/modules/object_tagging.py +157 -0
  468. PYME/DSView/modules/particleTracking.py +463 -0
  469. PYME/DSView/modules/playback.py +256 -0
  470. PYME/DSView/modules/prebleachExtraction.py +75 -0
  471. PYME/DSView/modules/profileFitting.py +137 -0
  472. PYME/DSView/modules/profilePlotting.py +408 -0
  473. PYME/DSView/modules/projections.py +48 -0
  474. PYME/DSView/modules/psfExtraction.py +570 -0
  475. PYME/DSView/modules/psfGeneration.py +138 -0
  476. PYME/DSView/modules/psfTools.py +661 -0
  477. PYME/DSView/modules/pupilTools.py +204 -0
  478. PYME/DSView/modules/pupilView.py +139 -0
  479. PYME/DSView/modules/recipes.py +266 -0
  480. PYME/DSView/modules/redimension.py +75 -0
  481. PYME/DSView/modules/segmentation.py +192 -0
  482. PYME/DSView/modules/sheetView.py +24 -0
  483. PYME/DSView/modules/shell.py +39 -0
  484. PYME/DSView/modules/shiftfield_estimation.py +433 -0
  485. PYME/DSView/modules/sparkprepare.py +94 -0
  486. PYME/DSView/modules/splitter.py +148 -0
  487. PYME/DSView/modules/synchronise.py +64 -0
  488. PYME/DSView/modules/templates/astigCal.html +42 -0
  489. PYME/DSView/modules/templates/measureView.html +69 -0
  490. PYME/DSView/modules/templates/measureView2.html +48 -0
  491. PYME/DSView/modules/templates/measureView3.html +98 -0
  492. PYME/DSView/modules/templates/trackView.html +139 -0
  493. PYME/DSView/modules/templates/tracksOverview.html +21 -0
  494. PYME/DSView/modules/tiling.py +147 -0
  495. PYME/DSView/modules/unmixing.py +148 -0
  496. PYME/DSView/modules/vis3D.py +320 -0
  497. PYME/DSView/modules/visgui.py +163 -0
  498. PYME/DSView/modules/webview.py +14 -0
  499. PYME/DSView/overlays.py +295 -0
  500. PYME/DSView/scrolledImagePanel.py +188 -0
  501. PYME/DSView/setup.py +53 -0
  502. PYME/DSView/splashScreen.py +158 -0
  503. PYME/DSView/voxSizeDialog.py +84 -0
  504. PYME/Deconv/__init__.py +35 -0
  505. PYME/Deconv/beadGen.py +55 -0
  506. PYME/Deconv/dec.py +659 -0
  507. PYME/Deconv/decTask.py +65 -0
  508. PYME/Deconv/decThread.py +113 -0
  509. PYME/Deconv/dec_test.py +47 -0
  510. PYME/Deconv/deconvDialogs.py +417 -0
  511. PYME/Deconv/fftwWisdom.py +62 -0
  512. PYME/Deconv/richardsonLucy.py +141 -0
  513. PYME/Deconv/richardsonLucyMV.py +151 -0
  514. PYME/Deconv/richardsonLucyMVM.py +218 -0
  515. PYME/Deconv/test_block_dec.py +46 -0
  516. PYME/Deconv/tq_block_dec.py +331 -0
  517. PYME/Deconv/wiener.py +163 -0
  518. PYME/IO/DataSources/AlignDataSource.py +91 -0
  519. PYME/IO/DataSources/ArrayDataSource.py +260 -0
  520. PYME/IO/DataSources/BGSDataSource.py +353 -0
  521. PYME/IO/DataSources/BaseDataSource.py +457 -0
  522. PYME/IO/DataSources/BioformatsDataSource.py +178 -0
  523. PYME/IO/DataSources/BufferedDataSource.py +99 -0
  524. PYME/IO/DataSources/ClusterPZFDataSource.py +124 -0
  525. PYME/IO/DataSources/ConcatenatedDataSource.py +56 -0
  526. PYME/IO/DataSources/CropDataSource.py +243 -0
  527. PYME/IO/DataSources/DcimgDataSource.py +54 -0
  528. PYME/IO/DataSources/ElectronsPerSecondDataSource.py +61 -0
  529. PYME/IO/DataSources/FlatFieldDataSource.py +77 -0
  530. PYME/IO/DataSources/HDFDataSource.py +160 -0
  531. PYME/IO/DataSources/HTTPDataSource.py +80 -0
  532. PYME/IO/DataSources/ImageSeriesDataSource.py +123 -0
  533. PYME/IO/DataSources/MultiviewDataSource.py +99 -0
  534. PYME/IO/DataSources/OBFDataSource.py +67 -0
  535. PYME/IO/DataSources/RandomDataSource.py +23 -0
  536. PYME/IO/DataSources/SupertileDatasource.py +148 -0
  537. PYME/IO/DataSources/TQDataSource.py +41 -0
  538. PYME/IO/DataSources/TiffDataSource.py +193 -0
  539. PYME/IO/DataSources/TileDataSource.py +91 -0
  540. PYME/IO/DataSources/UnsplitDataSource.py +92 -0
  541. PYME/IO/DataSources/__init__.py +59 -0
  542. PYME/IO/FileUtils/IJLut.py +43 -0
  543. PYME/IO/FileUtils/RawToHdf5.py +105 -0
  544. PYME/IO/FileUtils/SPAD.py +54 -0
  545. PYME/IO/FileUtils/TiffSeqToHdf5.py +87 -0
  546. PYME/IO/FileUtils/__init__.py +24 -0
  547. PYME/IO/FileUtils/compHdf.py +39 -0
  548. PYME/IO/FileUtils/fileID.py +246 -0
  549. PYME/IO/FileUtils/fnlGen.py +40 -0
  550. PYME/IO/FileUtils/freeSpace.py +59 -0
  551. PYME/IO/FileUtils/h5-thumbnailer.py +85 -0
  552. PYME/IO/FileUtils/h5ExFrames.py +98 -0
  553. PYME/IO/FileUtils/h5ToTiffSeries.py +50 -0
  554. PYME/IO/FileUtils/h5r-thumbnailer.py +118 -0
  555. PYME/IO/FileUtils/h5rFormatDef.py +99 -0
  556. PYME/IO/FileUtils/h5rToTxt.py +77 -0
  557. PYME/IO/FileUtils/nameUtils.py +300 -0
  558. PYME/IO/FileUtils/obf_support.py +538 -0
  559. PYME/IO/FileUtils/ply.py +147 -0
  560. PYME/IO/FileUtils/readSpeckle.py +78 -0
  561. PYME/IO/FileUtils/readTiff.py +64 -0
  562. PYME/IO/FileUtils/saveTiffStack.py +137 -0
  563. PYME/IO/FileUtils/setup.py +36 -0
  564. PYME/IO/FileUtils/sf-thumbnailer.py +76 -0
  565. PYME/IO/FileUtils/stl.py +44 -0
  566. PYME/IO/FileUtils/thumbnailDatabase.py +104 -0
  567. PYME/IO/HTTPSpooler_v2.py +141 -0
  568. PYME/IO/MetaDataHandler.py +1072 -0
  569. PYME/IO/PZFFormat.py +375 -0
  570. PYME/IO/Spooler.py +279 -0
  571. PYME/IO/__init__.py +12 -0
  572. PYME/IO/acquisition_backends.py +353 -0
  573. PYME/IO/buffer_helpers.cp313-win_amd64.dll.a +0 -0
  574. PYME/IO/buffer_helpers.cp313-win_amd64.pyd +0 -0
  575. PYME/IO/buffer_helpers.pyx +190 -0
  576. PYME/IO/buffers.py +291 -0
  577. PYME/IO/clusterDuplication.py +204 -0
  578. PYME/IO/clusterExport.py +152 -0
  579. PYME/IO/clusterGlob.py +108 -0
  580. PYME/IO/clusterIO.py +1076 -0
  581. PYME/IO/clusterListing.py +232 -0
  582. PYME/IO/clusterResults.py +206 -0
  583. PYME/IO/clusterUpload.py +49 -0
  584. PYME/IO/cluster_directory.py +419 -0
  585. PYME/IO/cluster_streaming.py +216 -0
  586. PYME/IO/compatibility.py +12 -0
  587. PYME/IO/countdir/__init__.py +5 -0
  588. PYME/IO/countdir/setup.py +58 -0
  589. PYME/IO/csv_flavours.py +251 -0
  590. PYME/IO/dataExporter.py +470 -0
  591. PYME/IO/dataWrap.py +108 -0
  592. PYME/IO/dcimg.py +167 -0
  593. PYME/IO/events.py +161 -0
  594. PYME/IO/h5File.py +148 -0
  595. PYME/IO/h5rFile.py +323 -0
  596. PYME/IO/image.py +1447 -0
  597. PYME/IO/load_psf.py +26 -0
  598. PYME/IO/pyme_h5ls.py +58 -0
  599. PYME/IO/ragged.py +138 -0
  600. PYME/IO/rgb_image.py +94 -0
  601. PYME/IO/tabular.py +1338 -0
  602. PYME/IO/testClusterSpooling.py +199 -0
  603. PYME/IO/unifiedIO.py +301 -0
  604. PYME/LMVis/Extras/QPobjectSegment.py +220 -0
  605. PYME/LMVis/Extras/__init__.py +55 -0
  606. PYME/LMVis/Extras/animation.py +359 -0
  607. PYME/LMVis/Extras/annotation.py +78 -0
  608. PYME/LMVis/Extras/clusterAnalysis.py +460 -0
  609. PYME/LMVis/Extras/dockedPanel.py +69 -0
  610. PYME/LMVis/Extras/extra_layers.py +373 -0
  611. PYME/LMVis/Extras/fiducial.py +230 -0
  612. PYME/LMVis/Extras/flagZMotionArtifacts.py +60 -0
  613. PYME/LMVis/Extras/fusionUtils.py +9 -0
  614. PYME/LMVis/Extras/multiColourAnalysis.py +103 -0
  615. PYME/LMVis/Extras/multiviewMapping.py +489 -0
  616. PYME/LMVis/Extras/objectMeasurements.py +246 -0
  617. PYME/LMVis/Extras/particleTracking.py +272 -0
  618. PYME/LMVis/Extras/perFrameVariable.py +77 -0
  619. PYME/LMVis/Extras/photophysics.py +72 -0
  620. PYME/LMVis/Extras/pointSetGeneration.py +232 -0
  621. PYME/LMVis/Extras/pointwiseColoc.py +54 -0
  622. PYME/LMVis/Extras/saved_views.py +125 -0
  623. PYME/LMVis/Extras/scaleBox.py +115 -0
  624. PYME/LMVis/Extras/sequentialSpecies.py +125 -0
  625. PYME/LMVis/Extras/setBGImage.py +74 -0
  626. PYME/LMVis/Extras/shiftmapGenerator.py +138 -0
  627. PYME/LMVis/Extras/showShortcuts.py +69 -0
  628. PYME/LMVis/Extras/snapshot.py +135 -0
  629. PYME/LMVis/Extras/spherical_harmonics.py +98 -0
  630. PYME/LMVis/Extras/subsets.py +15 -0
  631. PYME/LMVis/Extras/surface_fitting.py +52 -0
  632. PYME/LMVis/Extras/temperaturePlot.py +53 -0
  633. PYME/LMVis/Extras/vibration.py +112 -0
  634. PYME/LMVis/VisGUI.py +506 -0
  635. PYME/LMVis/__init__.py +39 -0
  636. PYME/LMVis/colourFilterGUI.py +77 -0
  637. PYME/LMVis/colourPanel.py +491 -0
  638. PYME/LMVis/displayPane.py +462 -0
  639. PYME/LMVis/dyeRatios.py +116 -0
  640. PYME/LMVis/genImageDialog.py +298 -0
  641. PYME/LMVis/gl_offScreenHandler.py +134 -0
  642. PYME/LMVis/gl_render.py +1302 -0
  643. PYME/LMVis/gl_render3D.py +1453 -0
  644. PYME/LMVis/gl_render3D_shaders.py +1213 -0
  645. PYME/LMVis/glcanvas_core.py +1157 -0
  646. PYME/LMVis/imageView.py +752 -0
  647. PYME/LMVis/imageView2.py +372 -0
  648. PYME/LMVis/importTextDialog.py +342 -0
  649. PYME/LMVis/layer_panel.py +231 -0
  650. PYME/LMVis/layers/AxesOverlayLayer.py +126 -0
  651. PYME/LMVis/layers/LUTOverlayLayer.py +346 -0
  652. PYME/LMVis/layers/OverlayLayer.py +46 -0
  653. PYME/LMVis/layers/ScaleBarOverlayLayer.py +97 -0
  654. PYME/LMVis/layers/ScaleBoxOverlayLayer.py +181 -0
  655. PYME/LMVis/layers/SelectionOverlayLayer.py +124 -0
  656. PYME/LMVis/layers/__init__.py +53 -0
  657. PYME/LMVis/layers/base.py +319 -0
  658. PYME/LMVis/layers/image_layer.py +363 -0
  659. PYME/LMVis/layers/labels.py +186 -0
  660. PYME/LMVis/layers/layer_defaults.py +97 -0
  661. PYME/LMVis/layers/mesh.py +378 -0
  662. PYME/LMVis/layers/octree.py +194 -0
  663. PYME/LMVis/layers/pointcloud.py +372 -0
  664. PYME/LMVis/layers/quiver.py +271 -0
  665. PYME/LMVis/layers/text.py +250 -0
  666. PYME/LMVis/layers/tracks.py +309 -0
  667. PYME/LMVis/mv_math.py +78 -0
  668. PYME/LMVis/objectDarkMeasure.py +120 -0
  669. PYME/LMVis/pipeline.py +1227 -0
  670. PYME/LMVis/pipelineView.py +115 -0
  671. PYME/LMVis/pointSettingsPanel.py +135 -0
  672. PYME/LMVis/progGraph.py +59 -0
  673. PYME/LMVis/quadTreeSettings.py +90 -0
  674. PYME/LMVis/rendGauss.py +158 -0
  675. PYME/LMVis/renderers.py +576 -0
  676. PYME/LMVis/sessionpaths.py +136 -0
  677. PYME/LMVis/setup.py +39 -0
  678. PYME/LMVis/setup_exe.py +71 -0
  679. PYME/LMVis/shader_programs/DefaultShaderProgram.py +149 -0
  680. PYME/LMVis/shader_programs/GLProgram.py +119 -0
  681. PYME/LMVis/shader_programs/GouraudShaderProgram.py +157 -0
  682. PYME/LMVis/shader_programs/PointSpriteShaderProgram.py +163 -0
  683. PYME/LMVis/shader_programs/ShaderProgramFactory.py +54 -0
  684. PYME/LMVis/shader_programs/TesselShaderProgram.py +47 -0
  685. PYME/LMVis/shader_programs/WireFrameShaderProgram.py +50 -0
  686. PYME/LMVis/shader_programs/__init__.py +20 -0
  687. PYME/LMVis/shader_programs/oit_compositor.py +23 -0
  688. PYME/LMVis/shader_programs/shader_loader.py +84 -0
  689. PYME/LMVis/shader_programs/shader_program.py +168 -0
  690. PYME/LMVis/shader_programs/shaders/bigflatpoints_fs.glsl +16 -0
  691. PYME/LMVis/shader_programs/shaders/bigpoints_gs.glsl +40 -0
  692. PYME/LMVis/shader_programs/shaders/bigpointsprites_fs.glsl +20 -0
  693. PYME/LMVis/shader_programs/shaders/bigspheres_fs.glsl +53 -0
  694. PYME/LMVis/shader_programs/shaders/compose_fs.glsl +41 -0
  695. PYME/LMVis/shader_programs/shaders/compose_vs.glsl +25 -0
  696. PYME/LMVis/shader_programs/shaders/default_fs.glsl +27 -0
  697. PYME/LMVis/shader_programs/shaders/default_vs.glsl +88 -0
  698. PYME/LMVis/shader_programs/shaders/flatpoints_fs.glsl +27 -0
  699. PYME/LMVis/shader_programs/shaders/gouraud_flatpoints_fs.glsl +30 -0
  700. PYME/LMVis/shader_programs/shaders/gouraud_fs.glsl +26 -0
  701. PYME/LMVis/shader_programs/shaders/gouraud_oit_fs.glsl +68 -0
  702. PYME/LMVis/shader_programs/shaders/gouraud_vs.glsl +135 -0
  703. PYME/LMVis/shader_programs/shaders/image_fs.glsl +60 -0
  704. PYME/LMVis/shader_programs/shaders/image_vs.glsl +79 -0
  705. PYME/LMVis/shader_programs/shaders/phong_fs.glsl +43 -0
  706. PYME/LMVis/shader_programs/shaders/phong_vs.glsl +45 -0
  707. PYME/LMVis/shader_programs/shaders/pointsprites_fs.glsl +33 -0
  708. PYME/LMVis/shader_programs/shaders/pointsprites_vs.glsl +77 -0
  709. PYME/LMVis/shader_programs/shaders/spheres_fs.glsl +102 -0
  710. PYME/LMVis/shader_programs/shaders/tessel_fs.glsl +23 -0
  711. PYME/LMVis/shader_programs/shaders/tessel_vs.glsl +37 -0
  712. PYME/LMVis/shader_programs/shaders/text_fs.glsl +42 -0
  713. PYME/LMVis/shader_programs/shaders/text_vs.glsl +84 -0
  714. PYME/LMVis/shader_programs/shaders/widelines_fs.glsl +19 -0
  715. PYME/LMVis/shader_programs/shaders/widelines_gs.glsl +56 -0
  716. PYME/LMVis/shader_programs/shaders/widelines_vs.glsl +51 -0
  717. PYME/LMVis/statusLog.py +57 -0
  718. PYME/LMVis/triBlobs.py +142 -0
  719. PYME/LMVis/view_clipping_pane.py +429 -0
  720. PYME/LMVis/views.py +275 -0
  721. PYME/LMVis/visCore.py +1005 -0
  722. PYME/LMVis/visHelpers.py +880 -0
  723. PYME/LMVis/visHelpersMin.py +230 -0
  724. PYME/LMVis/workspaceTree.py +238 -0
  725. PYME/__init__.py +22 -0
  726. PYME/cluster/HTTPDataServer.py +1063 -0
  727. PYME/cluster/HTTPRulePusher.py +382 -0
  728. PYME/cluster/HTTPTaskPusher.py +377 -0
  729. PYME/cluster/PYMERuleNodeServer.py +192 -0
  730. PYME/cluster/PYMERuleServer.py +109 -0
  731. PYME/cluster/__init__.py +0 -0
  732. PYME/cluster/clusterUI/accounts/__init__.py +0 -0
  733. PYME/cluster/clusterUI/accounts/admin.py +85 -0
  734. PYME/cluster/clusterUI/accounts/forms.py +8 -0
  735. PYME/cluster/clusterUI/accounts/migrations/0001_initial.py +31 -0
  736. PYME/cluster/clusterUI/accounts/migrations/__init__.py +0 -0
  737. PYME/cluster/clusterUI/accounts/models.py +44 -0
  738. PYME/cluster/clusterUI/accounts/templates/accounts/user_form.html +13 -0
  739. PYME/cluster/clusterUI/accounts/templates/registration/initial_complete.html +6 -0
  740. PYME/cluster/clusterUI/accounts/templates/registration/initial_confirm.html +13 -0
  741. PYME/cluster/clusterUI/accounts/templates/registration/initial_done.html +7 -0
  742. PYME/cluster/clusterUI/accounts/templates/registration/verification.html +2 -0
  743. PYME/cluster/clusterUI/accounts/templates/registration/verification_subject.txt +1 -0
  744. PYME/cluster/clusterUI/accounts/urls.py +19 -0
  745. PYME/cluster/clusterUI/accounts/views.py +36 -0
  746. PYME/cluster/clusterUI/clusterUI/__init__.py +0 -0
  747. PYME/cluster/clusterUI/clusterUI/settings.py +147 -0
  748. PYME/cluster/clusterUI/clusterUI/urls.py +31 -0
  749. PYME/cluster/clusterUI/clusterUI/wsgi.py +16 -0
  750. PYME/cluster/clusterUI/clusterbrowser/__init__.py +0 -0
  751. PYME/cluster/clusterUI/clusterbrowser/admin.py +3 -0
  752. PYME/cluster/clusterUI/clusterbrowser/apps.py +7 -0
  753. PYME/cluster/clusterUI/clusterbrowser/migrations/__init__.py +0 -0
  754. PYME/cluster/clusterUI/clusterbrowser/models.py +5 -0
  755. PYME/cluster/clusterUI/clusterbrowser/templates/base.html +129 -0
  756. PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/dirlisting.html +231 -0
  757. PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/form_new_folder.html +18 -0
  758. PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/form_upload_file.html +17 -0
  759. PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/lightlisting.html +25 -0
  760. PYME/cluster/clusterUI/clusterbrowser/templates/registration/login.html +38 -0
  761. PYME/cluster/clusterUI/clusterbrowser/urls.py +10 -0
  762. PYME/cluster/clusterUI/clusterbrowser/views.py +148 -0
  763. PYME/cluster/clusterUI/clusterstatus/__init__.py +0 -0
  764. PYME/cluster/clusterUI/clusterstatus/admin.py +3 -0
  765. PYME/cluster/clusterUI/clusterstatus/apps.py +7 -0
  766. PYME/cluster/clusterUI/clusterstatus/migrations/__init__.py +0 -0
  767. PYME/cluster/clusterUI/clusterstatus/models.py +5 -0
  768. PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/load_content.html +29 -0
  769. PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/queue_info.html +28 -0
  770. PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/queue_info_content.html +50 -0
  771. PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/status_dash.html +29 -0
  772. PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/status_dash_content.html +90 -0
  773. PYME/cluster/clusterUI/clusterstatus/urls.py +9 -0
  774. PYME/cluster/clusterUI/clusterstatus/views.py +69 -0
  775. PYME/cluster/clusterUI/clusterui_tornado.py +117 -0
  776. PYME/cluster/clusterUI/deploy.py +62 -0
  777. PYME/cluster/clusterUI/localization/__init__.py +0 -0
  778. PYME/cluster/clusterUI/localization/admin.py +3 -0
  779. PYME/cluster/clusterUI/localization/apps.py +7 -0
  780. PYME/cluster/clusterUI/localization/migrations/__init__.py +0 -0
  781. PYME/cluster/clusterUI/localization/models.py +5 -0
  782. PYME/cluster/clusterUI/localization/templates/localization/settings_form.html +67 -0
  783. PYME/cluster/clusterUI/localization/urls.py +10 -0
  784. PYME/cluster/clusterUI/localization/views.py +170 -0
  785. PYME/cluster/clusterUI/manage.py +17 -0
  786. PYME/cluster/clusterUI/recipes/__init__.py +0 -0
  787. PYME/cluster/clusterUI/recipes/admin.py +3 -0
  788. PYME/cluster/clusterUI/recipes/migrations/__init__.py +0 -0
  789. PYME/cluster/clusterUI/recipes/models.py +3 -0
  790. PYME/cluster/clusterUI/recipes/templates/recipes/extra_inputs.html +35 -0
  791. PYME/cluster/clusterUI/recipes/templates/recipes/form_recipe.html +82 -0
  792. PYME/cluster/clusterUI/recipes/templates/recipes/input_list.html +7 -0
  793. PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editor.html +28 -0
  794. PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editor_common.html +46 -0
  795. PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editrun.html +93 -0
  796. PYME/cluster/clusterUI/recipes/templates/recipes/recipe_standalone.html +100 -0
  797. PYME/cluster/clusterUI/recipes/templates/recipes/recipe_template.html +109 -0
  798. PYME/cluster/clusterUI/recipes/urls.py +17 -0
  799. PYME/cluster/clusterUI/recipes/views.py +109 -0
  800. PYME/cluster/cluster_of_one.py +204 -0
  801. PYME/cluster/dataserver_wsgi.py +615 -0
  802. PYME/cluster/distribution.py +71 -0
  803. PYME/cluster/rulenodeserver.py +487 -0
  804. PYME/cluster/rules.py +979 -0
  805. PYME/cluster/ruleserver.py +1106 -0
  806. PYME/cluster/status.py +101 -0
  807. PYME/cluster/taskWorkerHTTP.py +522 -0
  808. PYME/cluster/webdav.py +1102 -0
  809. PYME/config.py +659 -0
  810. PYME/contrib/TextCtrlAutoComplete.py +582 -0
  811. PYME/contrib/__init__.py +7 -0
  812. PYME/contrib/aniso/__init__.py +2 -0
  813. PYME/contrib/aniso/aniso.py +268 -0
  814. PYME/contrib/auiFloatBook.py +94 -0
  815. PYME/contrib/congrid.py +127 -0
  816. PYME/contrib/dispatch/__init__.py +19 -0
  817. PYME/contrib/dispatch/dispatcher.py +289 -0
  818. PYME/contrib/gohlke/__init__.py +1 -0
  819. PYME/contrib/gohlke/_tifffile.cp313-win_amd64.dll.a +0 -0
  820. PYME/contrib/gohlke/_tifffile.cp313-win_amd64.pyd +0 -0
  821. PYME/contrib/gohlke/czifile.py +1289 -0
  822. PYME/contrib/gohlke/fcsfiles.py +514 -0
  823. PYME/contrib/gohlke/setup.py +54 -0
  824. PYME/contrib/gohlke/tifffile.py +3095 -0
  825. PYME/contrib/listctrlMixins.py +896 -0
  826. PYME/contrib/lzw.py +838 -0
  827. PYME/contrib/pad/__init__.py +13 -0
  828. PYME/contrib/pad/info_pad.py +18 -0
  829. PYME/contrib/pad/pad.py +670 -0
  830. PYME/contrib/setup.py +38 -0
  831. PYME/contrib/wxPlotPanel.py +137 -0
  832. PYME/experimental/SimReconstruction.py +49 -0
  833. PYME/experimental/__init__.pxd +0 -0
  834. PYME/experimental/__init__.py +4 -0
  835. PYME/experimental/_octree.cp313-win_amd64.dll.a +0 -0
  836. PYME/experimental/_octree.cp313-win_amd64.pyd +0 -0
  837. PYME/experimental/_octree.pyx +477 -0
  838. PYME/experimental/_treap.cp313-win_amd64.dll.a +0 -0
  839. PYME/experimental/_treap.cp313-win_amd64.pyd +0 -0
  840. PYME/experimental/_treap.pyx +267 -0
  841. PYME/experimental/_triangle_mesh.cp313-win_amd64.dll.a +0 -0
  842. PYME/experimental/_triangle_mesh.cp313-win_amd64.pyd +0 -0
  843. PYME/experimental/_triangle_mesh.pxd +149 -0
  844. PYME/experimental/_triangle_mesh.pyx +2787 -0
  845. PYME/experimental/aqavg.py +40 -0
  846. PYME/experimental/dcimgFileChucker.py +375 -0
  847. PYME/experimental/dcimgSpoolShim.py +174 -0
  848. PYME/experimental/dcimg_chuck_test.py +78 -0
  849. PYME/experimental/dual_marching_cubes.py +801 -0
  850. PYME/experimental/dual_marching_cubes_v2.py +645 -0
  851. PYME/experimental/expectationMaximisation.py +298 -0
  852. PYME/experimental/func_octree.cp313-win_amd64.dll.a +0 -0
  853. PYME/experimental/func_octree.cp313-win_amd64.pyd +0 -0
  854. PYME/experimental/func_octree.pyx +381 -0
  855. PYME/experimental/fusionRadial.py +520 -0
  856. PYME/experimental/fusionUtils.py +522 -0
  857. PYME/experimental/isosurface.py +147 -0
  858. PYME/experimental/labview_spooling_hacks.py +48 -0
  859. PYME/experimental/marching_cubes.py +811 -0
  860. PYME/experimental/marching_tetrahedra.py +343 -0
  861. PYME/experimental/modified_marching_cubes.py +1245 -0
  862. PYME/experimental/music.py +25 -0
  863. PYME/experimental/octree.py +188 -0
  864. PYME/experimental/pSpaceMap.py +34 -0
  865. PYME/experimental/pointFitConfoc.py +112 -0
  866. PYME/experimental/scanner_control.py +107 -0
  867. PYME/experimental/setup.py +109 -0
  868. PYME/experimental/spark.py +31 -0
  869. PYME/experimental/tcHist.py +71 -0
  870. PYME/experimental/treap.py +262 -0
  871. PYME/experimental/triangle_mesh.py +2287 -0
  872. PYME/experimental/triangle_mesh_utils.cp313-win_amd64.dll.a +0 -0
  873. PYME/experimental/triangle_mesh_utils.cp313-win_amd64.pyd +0 -0
  874. PYME/experimental/triangle_utils.py +87 -0
  875. PYME/experimental/triangular_mesh.py +2255 -0
  876. PYME/experimental/zMotionArtifactUtils.py +55 -0
  877. PYME/localization/FitFactories/AstigGaussFitFR.py +175 -0
  878. PYME/localization/FitFactories/AstigGaussGPUFitFR.py +326 -0
  879. PYME/localization/FitFactories/BeadConvolvedAstigGaussFit.py +206 -0
  880. PYME/localization/FitFactories/ChecksumFR.py +82 -0
  881. PYME/localization/FitFactories/ChecksumGPUFR.py +213 -0
  882. PYME/localization/FitFactories/ChecksumMultifitSR.py +86 -0
  883. PYME/localization/FitFactories/ConfocCOIR.py +93 -0
  884. PYME/localization/FitFactories/Dumbell3DFitR.py +193 -0
  885. PYME/localization/FitFactories/DumbellFitR.py +163 -0
  886. PYME/localization/FitFactories/FFBase.py +403 -0
  887. PYME/localization/FitFactories/Gauss3DFitR.py +213 -0
  888. PYME/localization/FitFactories/GaussFitConstrR.py +177 -0
  889. PYME/localization/FitFactories/GaussMultifitLinesR.py +351 -0
  890. PYME/localization/FitFactories/GaussMultifitR.py +326 -0
  891. PYME/localization/FitFactories/GaussMultifitSR.py +373 -0
  892. PYME/localization/FitFactories/InterpFitR.py +236 -0
  893. PYME/localization/FitFactories/InterpFitWFR.py +111 -0
  894. PYME/localization/FitFactories/Interpolators/CSInterpolator.py +148 -0
  895. PYME/localization/FitFactories/Interpolators/CubeSInterpolatorP.py +121 -0
  896. PYME/localization/FitFactories/Interpolators/CubicSplineInterpolator.py +69 -0
  897. PYME/localization/FitFactories/Interpolators/LinearInterpolator.py +135 -0
  898. PYME/localization/FitFactories/Interpolators/LinearPInterpolatorP.py +95 -0
  899. PYME/localization/FitFactories/Interpolators/__init__.py +33 -0
  900. PYME/localization/FitFactories/Interpolators/baseInterpolator.py +202 -0
  901. PYME/localization/FitFactories/LatFitCOIR.py +82 -0
  902. PYME/localization/FitFactories/LatGaussFitFR.py +220 -0
  903. PYME/localization/FitFactories/LatObjFindFR.py +85 -0
  904. PYME/localization/FitFactories/LatPSFFitR.py +142 -0
  905. PYME/localization/FitFactories/MultiviewFitInterpNR.py +400 -0
  906. PYME/localization/FitFactories/PRInterpFitQR.py +192 -0
  907. PYME/localization/FitFactories/PRInterpFitR.py +223 -0
  908. PYME/localization/FitFactories/ROIExtractNR.py +93 -0
  909. PYME/localization/FitFactories/SpecGaussFitFR.py +174 -0
  910. PYME/localization/FitFactories/SplitterFitCOIR.py +142 -0
  911. PYME/localization/FitFactories/SplitterFitFNR.py +312 -0
  912. PYME/localization/FitFactories/SplitterFitFusionR.py +318 -0
  913. PYME/localization/FitFactories/SplitterFitInterpBNR.py +357 -0
  914. PYME/localization/FitFactories/SplitterFitInterpNR.py +343 -0
  915. PYME/localization/FitFactories/SplitterFitScavNR.py +352 -0
  916. PYME/localization/FitFactories/SplitterMultifitSR.py +410 -0
  917. PYME/localization/FitFactories/SplitterObjFindR.py +194 -0
  918. PYME/localization/FitFactories/SplitterROIExtractNR.py +91 -0
  919. PYME/localization/FitFactories/SplitterShiftEstFR.py +230 -0
  920. PYME/localization/FitFactories/__init__.py +103 -0
  921. PYME/localization/FitFactories/fitCommon.py +195 -0
  922. PYME/localization/FitFactories/zEstimators/__init__.py +29 -0
  923. PYME/localization/FitFactories/zEstimators/astigEstimator.py +173 -0
  924. PYME/localization/FitFactories/zEstimators/biplaneEstimator.py +209 -0
  925. PYME/localization/FitFactories/zEstimators/genericDualEstimator.py +232 -0
  926. PYME/localization/FitFactories/zEstimators/genericEstimator.py +224 -0
  927. PYME/localization/FitFactories/zEstimators/priEstimator.py +255 -0
  928. PYME/localization/MetaDataEdit.py +543 -0
  929. PYME/localization/Test/30_9_series_A_1.sf +0 -0
  930. PYME/localization/Test/PRI.md +45 -0
  931. PYME/localization/Test/PRI_qr.md +52 -0
  932. PYME/localization/Test/PRI_r.md +52 -0
  933. PYME/localization/Test/__init__.py +22 -0
  934. PYME/localization/Test/astig.md +50 -0
  935. PYME/localization/Test/astigCOI.md +50 -0
  936. PYME/localization/Test/astig_gauss.md +52 -0
  937. PYME/localization/Test/astig_pe.md +50 -0
  938. PYME/localization/Test/astig_splitter.md +66 -0
  939. PYME/localization/Test/astig_splitterCOI.md +67 -0
  940. PYME/localization/Test/astig_splitterQ.md +66 -0
  941. PYME/localization/Test/astig_theory.md +50 -0
  942. PYME/localization/Test/astig_theory.psf +0 -0
  943. PYME/localization/Test/astig_theory.tif +0 -0
  944. PYME/localization/Test/beads1.psf +0 -0
  945. PYME/localization/Test/beads1.tif +0 -0
  946. PYME/localization/Test/biplane_splitter.md +75 -0
  947. PYME/localization/Test/biplane_splitter2.md +103 -0
  948. PYME/localization/Test/biplane_splitter3.md +115 -0
  949. PYME/localization/Test/defoc.md +48 -0
  950. PYME/localization/Test/dumbell_3d.md +52 -0
  951. PYME/localization/Test/fitTestJig.py +172 -0
  952. PYME/localization/Test/fitTestJigSCMOS.py +487 -0
  953. PYME/localization/Test/fitTestJigWC.py +225 -0
  954. PYME/localization/Test/gauss.md +50 -0
  955. PYME/localization/Test/gaussCOI.md +50 -0
  956. PYME/localization/Test/pri_pe.md +50 -0
  957. PYME/localization/Test/pri_theory.md +51 -0
  958. PYME/localization/Test/pri_theory.psf +0 -0
  959. PYME/localization/Test/pri_theory.tif +0 -0
  960. PYME/localization/Test/psf_astig.psf +0 -0
  961. PYME/localization/Test/psf_astig.tif +0 -0
  962. PYME/localization/Test/psf_astig_bg_d.psf +0 -0
  963. PYME/localization/Test/psf_astig_bg_d.tif +0 -0
  964. PYME/localization/Test/psf_astig_pe.psf +0 -0
  965. PYME/localization/Test/psf_astig_pe.tif +0 -0
  966. PYME/localization/Test/psf_decon.psf +0 -0
  967. PYME/localization/Test/psf_decon.tif +0 -0
  968. PYME/localization/Test/psf_decon_pe.psf +0 -0
  969. PYME/localization/Test/psf_decon_pe.tif +0 -0
  970. PYME/localization/Test/psf_guess.psf +0 -0
  971. PYME/localization/Test/splitter.md +63 -0
  972. PYME/localization/Test/splitter_scav.md +63 -0
  973. PYME/localization/Test/test.psf +0 -0
  974. PYME/localization/Test/test.tif +0 -0
  975. PYME/localization/Test/test_decon.psf +0 -0
  976. PYME/localization/Test/test_decon.tif +0 -0
  977. PYME/localization/Test/test_pe.psf +0 -0
  978. PYME/localization/Test/test_pe.tif +0 -0
  979. PYME/localization/Test/wf_theory.psf +0 -0
  980. PYME/localization/Test/wf_theory2.psf +0 -0
  981. PYME/localization/__init__.py +17 -0
  982. PYME/localization/autopsf/__init__.py +1 -0
  983. PYME/localization/autopsf/autopsf.py +486 -0
  984. PYME/localization/autopsf/roifit.py +310 -0
  985. PYME/localization/cInterp/__init__.py +24 -0
  986. PYME/localization/cInterp/cInterp.cp313-win_amd64.dll.a +0 -0
  987. PYME/localization/cInterp/cInterp.cp313-win_amd64.pyd +0 -0
  988. PYME/localization/cInterp/setup.py +54 -0
  989. PYME/localization/cModels/__init__.py +24 -0
  990. PYME/localization/cModels/gauss_app.cp313-win_amd64.dll.a +0 -0
  991. PYME/localization/cModels/gauss_app.cp313-win_amd64.pyd +0 -0
  992. PYME/localization/ofind.py +444 -0
  993. PYME/localization/ofind3d.py +306 -0
  994. PYME/localization/ofind_nofilt.py +128 -0
  995. PYME/localization/ofind_pri.py +478 -0
  996. PYME/localization/ofind_split.py +399 -0
  997. PYME/localization/ofind_xcorr.py +351 -0
  998. PYME/localization/ofind_xcorr_fw.py +441 -0
  999. PYME/localization/remFitBuf.py +657 -0
  1000. PYME/localization/setup.py +56 -0
  1001. PYME/localization/splitting.py +240 -0
  1002. PYME/localization/twist.py +60 -0
  1003. PYME/misc/TiSettings.py +36 -0
  1004. PYME/misc/TiffImagePlugin.py +838 -0
  1005. PYME/misc/VolProj.py +144 -0
  1006. PYME/misc/__init__.py +25 -0
  1007. PYME/misc/aligned_array.py +10 -0
  1008. PYME/misc/aniso.py +29 -0
  1009. PYME/misc/big_sur_fix.py +20 -0
  1010. PYME/misc/check_for_updates.py +139 -0
  1011. PYME/misc/colormaps.py +199 -0
  1012. PYME/misc/colorsys.py +201 -0
  1013. PYME/misc/computerName.py +33 -0
  1014. PYME/misc/coverslipGeometries.py +60 -0
  1015. PYME/misc/cython_numpy_monkey.py +40 -0
  1016. PYME/misc/depGraph.py +406 -0
  1017. PYME/misc/dirSize.py +31 -0
  1018. PYME/misc/diskCleanup.py +64 -0
  1019. PYME/misc/djangoRecarray.py +57 -0
  1020. PYME/misc/django_widgets.py +27 -0
  1021. PYME/misc/editgrid.py +101 -0
  1022. PYME/misc/eventSpy.py +122 -0
  1023. PYME/misc/exceptions.py +30 -0
  1024. PYME/misc/facsPlot.py +89 -0
  1025. PYME/misc/fbpIcons.py +90 -0
  1026. PYME/misc/fftw_compat.py +28 -0
  1027. PYME/misc/findCycles.py +91 -0
  1028. PYME/misc/fortran_interrupt_defeat.py +43 -0
  1029. PYME/misc/glassModel.py +64 -0
  1030. PYME/misc/hash32.py +41 -0
  1031. PYME/misc/hillcurve.py +88 -0
  1032. PYME/misc/hybrid_ns.py +84 -0
  1033. PYME/misc/kdFit.py +72 -0
  1034. PYME/misc/locate.py +10 -0
  1035. PYME/misc/memUsage.py +65 -0
  1036. PYME/misc/memmap.py +52 -0
  1037. PYME/misc/mock_ctypes.py +28 -0
  1038. PYME/misc/mock_traits.py +59 -0
  1039. PYME/misc/mock_traitsui.py +29 -0
  1040. PYME/misc/pyme_zeroconf.py +287 -0
  1041. PYME/misc/pyro_tracebacks.py +32 -0
  1042. PYME/misc/read_agf.py +605 -0
  1043. PYME/misc/sffake.py +16 -0
  1044. PYME/misc/snells.py +71 -0
  1045. PYME/misc/sqlite_ns.py +132 -0
  1046. PYME/misc/sqlitendarray.py +56 -0
  1047. PYME/misc/taskDef.py +44 -0
  1048. PYME/misc/tempDB.py +56 -0
  1049. PYME/misc/wxThread.py +33 -0
  1050. PYME/misc/zemax.py +259 -0
  1051. PYME/misc/zernike.py +151 -0
  1052. PYME/pyme_warnings.py +70 -0
  1053. PYME/recipes/Recipes/STEDDeconvolution.yaml +14 -0
  1054. PYME/recipes/Recipes/STEDMinistacks.yaml +15 -0
  1055. PYME/recipes/Recipes/STED_COP3.yaml +25 -0
  1056. PYME/recipes/Recipes/blobMeas.yaml +19 -0
  1057. PYME/recipes/Recipes/blobMeas2.yaml +37 -0
  1058. PYME/recipes/Recipes/blobMeasSR.yaml +66 -0
  1059. PYME/recipes/Recipes/coloc.yaml +43 -0
  1060. PYME/recipes/Recipes/coloc_roi_masked.yaml +46 -0
  1061. PYME/recipes/Recipes/multiblob.yaml +38 -0
  1062. PYME/recipes/Recipes/pre_particleTracking.yaml +30 -0
  1063. PYME/recipes/Recipes/segmentAndMeasureLoci.yaml +41 -0
  1064. PYME/recipes/__init__.py +6 -0
  1065. PYME/recipes/acquisition.py +158 -0
  1066. PYME/recipes/bakeshop.py +32 -0
  1067. PYME/recipes/base.py +1393 -0
  1068. PYME/recipes/batchProcess.py +147 -0
  1069. PYME/recipes/filters.py +394 -0
  1070. PYME/recipes/fudges.py +41 -0
  1071. PYME/recipes/graphing.py +108 -0
  1072. PYME/recipes/html_recipe_editor.py +90 -0
  1073. PYME/recipes/localisations.py +1386 -0
  1074. PYME/recipes/machine_learning.py +286 -0
  1075. PYME/recipes/measurement.py +1062 -0
  1076. PYME/recipes/modules.py +50 -0
  1077. PYME/recipes/multiview.py +435 -0
  1078. PYME/recipes/output.py +667 -0
  1079. PYME/recipes/pointcloud.py +510 -0
  1080. PYME/recipes/processing.py +2954 -0
  1081. PYME/recipes/pyramid.py +206 -0
  1082. PYME/recipes/recipe.py +965 -0
  1083. PYME/recipes/recipeGui.py +1029 -0
  1084. PYME/recipes/recipeLayout.py +499 -0
  1085. PYME/recipes/runRecipe.py +140 -0
  1086. PYME/recipes/setup.py +37 -0
  1087. PYME/recipes/simulation.py +91 -0
  1088. PYME/recipes/skfilters.py +143 -0
  1089. PYME/recipes/surface_fitting.py +776 -0
  1090. PYME/recipes/tablefilters.py +275 -0
  1091. PYME/recipes/tracking.py +343 -0
  1092. PYME/recipes/traits.py +157 -0
  1093. PYME/recipes/vertical_recipe_display.py +373 -0
  1094. PYME/resources/__init__.py +23 -0
  1095. PYME/resources/config_template/distributor.yaml +14 -0
  1096. PYME/resources/config_template/nodeserver.yaml +15 -0
  1097. PYME/resources/icons/LUT.png +0 -0
  1098. PYME/resources/icons/YSM_Shield.png +0 -0
  1099. PYME/resources/icons/YSM_logo.png +0 -0
  1100. PYME/resources/icons/arrow.png +0 -0
  1101. PYME/resources/icons/crosshairs.png +0 -0
  1102. PYME/resources/icons/line_select.png +0 -0
  1103. PYME/resources/icons/logo_fmhs.png +0 -0
  1104. PYME/resources/icons/media-playback-pause.png +0 -0
  1105. PYME/resources/icons/media-playback-start.png +0 -0
  1106. PYME/resources/icons/media-skip-backward.png +0 -0
  1107. PYME/resources/icons/media-skip-forward.png +0 -0
  1108. PYME/resources/icons/mesh.png +0 -0
  1109. PYME/resources/icons/mesh.svg +28 -0
  1110. PYME/resources/icons/pmacquire.icns +0 -0
  1111. PYME/resources/icons/pmacquire.ico +0 -0
  1112. PYME/resources/icons/pmanal.icns +0 -0
  1113. PYME/resources/icons/pmanal.ico +0 -0
  1114. PYME/resources/icons/pmvis.icns +0 -0
  1115. PYME/resources/icons/pmvis.ico +0 -0
  1116. PYME/resources/icons/points.png +0 -0
  1117. PYME/resources/icons/points.svg +16 -0
  1118. PYME/resources/icons/pymeLogo.png +0 -0
  1119. PYME/resources/icons/rect_select.png +0 -0
  1120. PYME/resources/icons/squiggle_select.png +0 -0
  1121. PYME/resources/icons/text3800.icns +0 -0
  1122. PYME/resources/icons/text3800.ico +0 -0
  1123. PYME/resources/icons/text3800.png +0 -0
  1124. PYME/resources/icons/text3800.tif +0 -0
  1125. PYME/resources/icons/text5377.icns +0 -0
  1126. PYME/resources/icons/text5377.ico +0 -0
  1127. PYME/resources/icons/text5377.png +0 -0
  1128. PYME/resources/icons/tracks.png +0 -0
  1129. PYME/resources/icons/tracks.svg +19 -0
  1130. PYME/resources/icons/view-front.png +0 -0
  1131. PYME/resources/icons/view-home.png +0 -0
  1132. PYME/resources/icons/view-right.png +0 -0
  1133. PYME/resources/icons/view-top.png +0 -0
  1134. PYME/resources/test_datasets/README.md +8 -0
  1135. PYME/resources/test_datasets/t_im.tif +0 -0
  1136. PYME/resources/test_datasets/test_csv.csv +4282 -0
  1137. PYME/resources/test_datasets/test_hdf.hdf +0 -0
  1138. PYME/resources/web/rule_inline.html +21 -0
  1139. PYME/resources/web/ruleserver.html +75 -0
  1140. PYME/resources/web/static/bootstrap.min.js +7 -0
  1141. PYME/resources/web/static/cluster.css +137 -0
  1142. PYME/resources/web/static/css/bootstrap-theme.css +587 -0
  1143. PYME/resources/web/static/css/bootstrap-theme.min.css +6 -0
  1144. PYME/resources/web/static/css/bootstrap.css +6757 -0
  1145. PYME/resources/web/static/css/bootstrap.min.css +6 -0
  1146. PYME/resources/web/static/css/flat_design_colors_full.css +306 -0
  1147. PYME/resources/web/static/css/recipe_editor.css +106 -0
  1148. PYME/resources/web/static/dashboard.css +106 -0
  1149. PYME/resources/web/static/fileselector.js +77 -0
  1150. PYME/resources/web/static/fonts/glyphicons-halflings-regular.eot +0 -0
  1151. PYME/resources/web/static/fonts/glyphicons-halflings-regular.svg +288 -0
  1152. PYME/resources/web/static/fonts/glyphicons-halflings-regular.ttf +0 -0
  1153. PYME/resources/web/static/fonts/glyphicons-halflings-regular.woff +0 -0
  1154. PYME/resources/web/static/fonts/glyphicons-halflings-regular.woff2 +0 -0
  1155. PYME/resources/web/static/images/osd_flat/LICENSE.txt +116 -0
  1156. PYME/resources/web/static/images/osd_flat/README.md +9 -0
  1157. PYME/resources/web/static/images/osd_flat/fullpage_grouphover.png +0 -0
  1158. PYME/resources/web/static/images/osd_flat/fullpage_hover.png +0 -0
  1159. PYME/resources/web/static/images/osd_flat/fullpage_pressed.png +0 -0
  1160. PYME/resources/web/static/images/osd_flat/fullpage_rest.png +0 -0
  1161. PYME/resources/web/static/images/osd_flat/home_grouphover.png +0 -0
  1162. PYME/resources/web/static/images/osd_flat/home_hover.png +0 -0
  1163. PYME/resources/web/static/images/osd_flat/home_pressed.png +0 -0
  1164. PYME/resources/web/static/images/osd_flat/home_rest.png +0 -0
  1165. PYME/resources/web/static/images/osd_flat/next_grouphover.png +0 -0
  1166. PYME/resources/web/static/images/osd_flat/next_hover.png +0 -0
  1167. PYME/resources/web/static/images/osd_flat/next_pressed.png +0 -0
  1168. PYME/resources/web/static/images/osd_flat/next_rest.png +0 -0
  1169. PYME/resources/web/static/images/osd_flat/previous_grouphover.png +0 -0
  1170. PYME/resources/web/static/images/osd_flat/previous_hover.png +0 -0
  1171. PYME/resources/web/static/images/osd_flat/previous_pressed.png +0 -0
  1172. PYME/resources/web/static/images/osd_flat/previous_rest.png +0 -0
  1173. PYME/resources/web/static/images/osd_flat/rotateleft_grouphover.png +0 -0
  1174. PYME/resources/web/static/images/osd_flat/rotateleft_hover.png +0 -0
  1175. PYME/resources/web/static/images/osd_flat/rotateleft_pressed.png +0 -0
  1176. PYME/resources/web/static/images/osd_flat/rotateleft_rest.png +0 -0
  1177. PYME/resources/web/static/images/osd_flat/rotateright_grouphover.png +0 -0
  1178. PYME/resources/web/static/images/osd_flat/rotateright_hover.png +0 -0
  1179. PYME/resources/web/static/images/osd_flat/rotateright_pressed.png +0 -0
  1180. PYME/resources/web/static/images/osd_flat/rotateright_rest.png +0 -0
  1181. PYME/resources/web/static/images/osd_flat/zoomin_grouphover.png +0 -0
  1182. PYME/resources/web/static/images/osd_flat/zoomin_hover.png +0 -0
  1183. PYME/resources/web/static/images/osd_flat/zoomin_pressed.png +0 -0
  1184. PYME/resources/web/static/images/osd_flat/zoomin_rest.png +0 -0
  1185. PYME/resources/web/static/images/osd_flat/zoomout_grouphover.png +0 -0
  1186. PYME/resources/web/static/images/osd_flat/zoomout_hover.png +0 -0
  1187. PYME/resources/web/static/images/osd_flat/zoomout_pressed.png +0 -0
  1188. PYME/resources/web/static/images/osd_flat/zoomout_rest.png +0 -0
  1189. PYME/resources/web/static/jigna-vue-bare.js +1395 -0
  1190. PYME/resources/web/static/jquery.min.js +2 -0
  1191. PYME/resources/web/static/jstree.min.js +6 -0
  1192. PYME/resources/web/static/openSeadragonGL.js +102 -0
  1193. PYME/resources/web/static/openseadragon-svg-overlay.js +103 -0
  1194. PYME/resources/web/static/openseadragon-viewerinputhook.min.js +6 -0
  1195. PYME/resources/web/static/openseadragon.min.js +9 -0
  1196. PYME/resources/web/static/recipe_editor.js +119 -0
  1197. PYME/resources/web/static/shaders/fragment/lut.glsl +20 -0
  1198. PYME/resources/web/static/shaders/fragment/none.glsl +17 -0
  1199. PYME/resources/web/static/shaders/fragment/outline.glsl +43 -0
  1200. PYME/resources/web/static/shaders/fragment/rect.glsl +7 -0
  1201. PYME/resources/web/static/shaders/fragment/sobel3.glsl +71 -0
  1202. PYME/resources/web/static/shaders/fragment/white.glsl +4 -0
  1203. PYME/resources/web/static/shaders/vertex/rect.glsl +22 -0
  1204. PYME/resources/web/static/shaders/vertex/square.glsl +9 -0
  1205. PYME/resources/web/static/utils.js +3 -0
  1206. PYME/resources/web/static/viaWebGL.js +217 -0
  1207. PYME/setup.py +109 -0
  1208. PYME/setup_exe.py +57 -0
  1209. PYME/simulation/__init__.py +0 -0
  1210. PYME/simulation/locify.py +319 -0
  1211. PYME/simulation/pointsets.py +279 -0
  1212. PYME/simulation/wormlike.py +99 -0
  1213. PYME/simulation/wormlike2.py +198 -0
  1214. PYME/simulation/wormlike3.py +197 -0
  1215. PYME/simulation/wormlike_curled.py +104 -0
  1216. PYME/tileviewer/__init__.py +0 -0
  1217. PYME/tileviewer/templates/roi_list.html +12 -0
  1218. PYME/tileviewer/templates/tileviewer.html +247 -0
  1219. PYME/tileviewer/tileviewer.py +207 -0
  1220. PYME/ui/AUIFrame.py +279 -0
  1221. PYME/ui/MetadataTree.py +469 -0
  1222. PYME/ui/__init__.py +4 -0
  1223. PYME/ui/about_dlg.py +29 -0
  1224. PYME/ui/autoFoldPanel.py +643 -0
  1225. PYME/ui/cascading_layout.py +45 -0
  1226. PYME/ui/crop_dialog.py +145 -0
  1227. PYME/ui/custom_traits_editors.py +508 -0
  1228. PYME/ui/editFilterDialog.py +80 -0
  1229. PYME/ui/editList.py +40 -0
  1230. PYME/ui/fastGraph.py +240 -0
  1231. PYME/ui/filterPane.py +348 -0
  1232. PYME/ui/histLimits.py +543 -0
  1233. PYME/ui/layerFoldPanel.py +232 -0
  1234. PYME/ui/manualFoldPanel.py +870 -0
  1235. PYME/ui/mytimer.py +116 -0
  1236. PYME/ui/patch_traitsui.py +151 -0
  1237. PYME/ui/progress.py +160 -0
  1238. PYME/ui/recArrayView.py +145 -0
  1239. PYME/ui/selection.py +71 -0
  1240. PYME/ui/shell.py +37 -0
  1241. PYME/ui/traitsui_constants.py +91 -0
  1242. PYME/ui/wx_compat.py +43 -0
  1243. PYME/update_version.py +159 -0
  1244. PYME/util/__init__.py +3 -0
  1245. PYME/util/authenticate.py +164 -0
  1246. PYME/util/execfile.py +21 -0
  1247. PYME/util/fProfile/__init__.py +1 -0
  1248. PYME/util/fProfile/convertProfile.py +117 -0
  1249. PYME/util/fProfile/fProfile.py +162 -0
  1250. PYME/util/fProfile/html/404.html +60 -0
  1251. PYME/util/fProfile/html/css/main.css +258 -0
  1252. PYME/util/fProfile/html/css/normalize.css +427 -0
  1253. PYME/util/fProfile/html/css/normalize.min.css +1 -0
  1254. PYME/util/fProfile/html/index.html +64 -0
  1255. PYME/util/fProfile/html/js/main.js +492 -0
  1256. PYME/util/fProfile/html/js/plugins.js +24 -0
  1257. PYME/util/fProfile/html/js/vendor/crossfilter.min.js +1 -0
  1258. PYME/util/fProfile/html/js/vendor/jquery-1.11.2.min.js +4 -0
  1259. PYME/util/fProfile/html/js/vendor/modernizr-2.8.3.min.js +4 -0
  1260. PYME/util/fProfile/html/js/vendor/tinycolor-min.js +4 -0
  1261. PYME/util/fProfile/viewProfile.py +30 -0
  1262. PYME/util/install_dependencies.py +95 -0
  1263. PYME/util/log_verbosity.py +11 -0
  1264. PYME/util/mProfile/__init__.py +1 -0
  1265. PYME/util/mProfile/colorize_db_t.py +297 -0
  1266. PYME/util/mProfile/mProfile.py +164 -0
  1267. PYME/util/mProfile/p.py +101 -0
  1268. PYME/util/mProfile/tProfile.py +165 -0
  1269. PYME/util/pymelauncher.py +47 -0
  1270. PYME/util/shmarray/__init__.py +0 -0
  1271. PYME/util/shmarray/shmTest.py +74 -0
  1272. PYME/util/shmarray/shmarray.py +165 -0
  1273. PYME/util/webframework.py +365 -0
  1274. PYME/version.py +62 -0
  1275. python_microscopy-25.11.20.dist-info/METADATA +68 -0
  1276. python_microscopy-25.11.20.dist-info/RECORD +1278 -0
  1277. python_microscopy-25.11.20.dist-info/WHEEL +4 -0
  1278. python_microscopy-25.11.20.dist-info/entry_points.txt +18 -0
@@ -0,0 +1,1199 @@
1
+ #!/usr/bin/python
2
+
3
+ ###############
4
+ # Camera.py
5
+ #
6
+ # Created: 12 September 2017
7
+ # Author : Z Marin
8
+ #
9
+ # Based on: AndorZyla.py, AndorIXon.py
10
+ #
11
+ # Copyright David Baddeley, 2012
12
+ # d.baddeley@auckland.ac.nz
13
+ #
14
+ # This program is free software: you can redistribute it and/or modify
15
+ # it under the terms of the GNU General Public License as published by
16
+ # the Free Software Foundation, either version 3 of the License, or
17
+ # (at your option) any later version.
18
+ #
19
+ # This program is distributed in the hope that it will be useful,
20
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
21
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22
+ # GNU General Public License for more details.
23
+ #
24
+ # You should have received a copy of the GNU General Public License
25
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
26
+ #
27
+ ################
28
+
29
+ from threading import Lock
30
+
31
+ from PYME.IO import MetaDataHandler
32
+ from PYME.Acquire import eventLog
33
+
34
+ from PYME import config
35
+ from . import camera_noise
36
+ import warnings
37
+
38
+ import numpy as np
39
+ import logging
40
+ logger = logging.getLogger(__name__)
41
+
42
+ def check_mapexists(mdh, type='dark', fill=True):
43
+ import os
44
+ from PYME.IO import clusterIO
45
+ from PYME.IO.FileUtils import nameUtils
46
+ from PYME.Analysis.gen_sCMOS_maps import map_filename
47
+
48
+ if type == 'dark':
49
+ id = 'Camera.DarkMapID'
50
+ elif type == 'variance':
51
+ id = 'Camera.VarianceMapID'
52
+ elif type == 'flatfield':
53
+ id = 'Camera.FlatfieldMapID'
54
+ else:
55
+ raise RuntimeError('unknown map type %s' % type)
56
+
57
+ mapfn = map_filename(mdh, type)
58
+
59
+ # find and record calibration paths
60
+ local_path = os.path.join(nameUtils.getCalibrationDir(mdh['Camera.SerialNumber']), mapfn)
61
+ cluster_path = 'CALIBRATION/%s/%s' % (mdh['Camera.SerialNumber'], mapfn)
62
+
63
+ try:
64
+ cluster_map_exists = clusterIO.exists(cluster_path)
65
+ except OSError:
66
+ # The cluster might not be running, if the cluster is not running, we clusterIO.exists throws an error.
67
+ # catch this to allow offline spooling (see issue #1141)
68
+ cluster_map_exists = False
69
+
70
+ if cluster_map_exists:
71
+ c_path = 'PYME-CLUSTER://%s/%s' % (clusterIO.local_serverfilter, cluster_path)
72
+ if fill:
73
+ mdh[id] = c_path
74
+ return c_path
75
+ elif os.path.exists(local_path):
76
+ if fill:
77
+ mdh[id] = local_path
78
+ return local_path
79
+ else:
80
+ return None
81
+
82
+
83
+ class CameraMapMixin(object):
84
+ def _map_cache_key(self, mdh, map_type):
85
+ if map_type == 'flatfield':
86
+ return (map_type, mdh['Camera.SerialNumber'])
87
+ else:
88
+ return (map_type, mdh['Camera.SerialNumber'], mdh['Camera.IntegrationTime'])
89
+
90
+ def _fill_camera_map_id(self, mdh, mdh_key, map_type):
91
+ #create cache if not already present
92
+ if not hasattr(self, '_camera_map_cache'):
93
+ self._camera_map_cache = {}
94
+
95
+ cache_key = self._map_cache_key(mdh, map_type)
96
+ try:
97
+ map_fn = self._camera_map_cache[cache_key]
98
+ except KeyError:
99
+ map_fn = check_mapexists(mdh, map_type, fill=False)
100
+ self._camera_map_cache[cache_key] = map_fn
101
+
102
+ if not map_fn is None:
103
+ mdh[mdh_key] = map_fn
104
+
105
+ def fill_camera_map_metadata(self, mdh):
106
+ self._fill_camera_map_id(mdh, 'Camera.DarkMapID', map_type='dark')
107
+ self._fill_camera_map_id(mdh, 'Camera.VarianceMapID', map_type='variance')
108
+ self._fill_camera_map_id(mdh, 'Camera.FlatfieldMapID', map_type='flatfield')
109
+
110
+
111
+ class Camera(object):
112
+ # Frame format - PYME previously supported frames in a custom format, but numpy_frames should always be true for current code
113
+ numpy_frames = 1 #Frames are delivered as numpy arrays.
114
+
115
+ # Acquisition modes
116
+ MODE_SINGLE_SHOT = 0
117
+ MODE_CONTINUOUS = 1
118
+ MODE_SOFTWARE_TRIGGER = 2
119
+ MODE_HARDWARE_TRIGGER = 3
120
+ MODE_HARDWARE_START_TRIGGER = 4
121
+
122
+ # Does this camera support a software trigger?
123
+ # Should be overridden in derived classes if the camera supports software triggering,
124
+ # and the derived class should also implement the FireSoftwareTrigger method
125
+ supports_software_trigger = False
126
+
127
+
128
+ def __init__(self, *args, **kwargs):
129
+ """
130
+ Create a camera object. This gets called from the PYMEAcquire init
131
+ script, which is custom for any given microscope and can take
132
+ whatever arguments are needed for a given camera.
133
+
134
+ .. note:: The one stipulation is that the Camera should register itself
135
+ as providing metadata.
136
+
137
+ Parameters
138
+ ----------
139
+ args :
140
+ Optional arguments, usually instantiated in inherited camera.
141
+ kwargs :
142
+ Optional dictionary of arguments, usually instantiated in
143
+ inherited camera.
144
+
145
+ """
146
+
147
+ self.active = True # Should the camera write its metadata?
148
+
149
+ self._saturation_threshold = (2**16) - 1 # default saturation threshold, if not provided in noise_properties
150
+
151
+ # Register as a provider of metadata (record camera settings)
152
+ # this is important so that the camera settings get recorded
153
+ MetaDataHandler.provideStartMetadata.append(self.GenStartMetadata)
154
+
155
+ def Init(self):
156
+ """
157
+ Optional intialization function. Also called from the init script.
158
+ Not really part of 'specification'
159
+ """
160
+ pass
161
+
162
+ @property
163
+ def contMode(self):
164
+ """ return whether the camera is runnint in continuous mode or not. This property (was previously a class member
165
+ variable) is required to allow the calling code to determine whether it needs to restart exposures after processing
166
+ the previous one."""
167
+ return self.GetAcquisitionMode() != self.MODE_SINGLE_SHOT
168
+
169
+ def ExpReady(self):
170
+ """
171
+ Checks whether there are any frames waiting in the camera buffers
172
+
173
+ Returns
174
+ -------
175
+ exposureReady : bool
176
+ True if there are frames waiting
177
+
178
+ """
179
+
180
+ raise NotImplementedError('Implemented in derived class.')
181
+
182
+ def GetName(self):
183
+ """ Camera name.
184
+
185
+ FIXME - Do we need this???
186
+
187
+ """
188
+ raise NotImplementedError('Implemented in derived class.')
189
+
190
+ def CamReady(self):
191
+ """
192
+ Returns true if the camera is ready (initialized) not really used for
193
+ anything, but might still be checked.
194
+
195
+ Returns
196
+ -------
197
+ bool
198
+ Is the camera ready?
199
+ """
200
+
201
+ return True
202
+
203
+ def ExtractColor(self, chSlice, mode):
204
+ """
205
+ Pulls the oldest frame from the camera buffer and copies it into memory we provide. Note that the function
206
+ signature and parameters are a legacy of very old code written for a colour camera with a bayer mask.
207
+
208
+ Parameters
209
+ ----------
210
+ chSlice : `~numpy.ndarray`
211
+ The array we want to put the data into
212
+ mode : int, ignored
213
+ Previously specified how to deal with the Bayer mask.
214
+
215
+ Returns
216
+ -------
217
+ None
218
+ """
219
+ raise NotImplementedError('Implemented in derived class.')
220
+
221
+ def GetHeadModel(self):
222
+ """
223
+ Get the the camera head model name.
224
+
225
+ Returns
226
+ -------
227
+ str
228
+ camera model namet
229
+ """
230
+ raise NotImplementedError('Should be implemented in derived class.')
231
+
232
+ def GetSerialNumber(self):
233
+ """
234
+ Get the camera serial number
235
+
236
+ Returns
237
+ -------
238
+ serialNum : str
239
+ The camera serial number
240
+
241
+ """
242
+ raise NotImplementedError('Should be implemented in derived class.')
243
+
244
+ def SetIntegTime(self, iTime):
245
+ """
246
+ Sets the exposure time in s. Currently assumes that we will want to go as fast as possible at this exposure time
247
+ and also sets the frame rate to match.
248
+
249
+ Parameters
250
+ ----------
251
+ iTime : float
252
+ Exposure time in s
253
+
254
+ Returns
255
+ -------
256
+ None
257
+
258
+ See Also
259
+ --------
260
+ GetIntegTime
261
+ """
262
+ raise NotImplementedError('Implemented in derived class.')
263
+
264
+ def GetIntegTime(self):
265
+ """
266
+ Get Camera object integration time.
267
+
268
+ Returns
269
+ -------
270
+ float
271
+ The exposure time in s
272
+
273
+ See Also
274
+ --------
275
+ SetIntegTime
276
+ """
277
+
278
+ raise NotImplementedError('Implemented in derived class.')
279
+
280
+
281
+ def GetCycleTime(self):
282
+ """
283
+ Get camera cycle time (1/fps) in seconds (float)
284
+
285
+ Returns
286
+ -------
287
+ float
288
+ Camera cycle time (seconds)
289
+ """
290
+ raise NotImplementedError('Implemented in derived class.')
291
+
292
+
293
+ def GetCCDWidth(self):
294
+ """
295
+ Returns
296
+ -------
297
+ int
298
+ The sensor width in pixels
299
+
300
+ """
301
+ raise NotImplementedError('Implemented in derived class.')
302
+
303
+ def GetCCDHeight(self):
304
+ """
305
+ Returns
306
+ -------
307
+ int
308
+ The sensor height in pixels
309
+
310
+ """
311
+ raise NotImplementedError('Implemented in derived class.')
312
+
313
+ def GetPicWidth(self):
314
+ """
315
+ Returns the width (in pixels) of the currently selected ROI.
316
+
317
+ Returns
318
+ -------
319
+ int
320
+ Width of ROI (pixels)
321
+ """
322
+ raise NotImplementedError('Implemented in derived class.')
323
+
324
+ def GetPicHeight(self):
325
+ """
326
+ Returns the height (in pixels) of the currently selected ROI
327
+
328
+ Returns
329
+ -------
330
+ int
331
+ Height of ROI (pixels)
332
+ """
333
+ raise NotImplementedError('Implemented in derived class.')
334
+
335
+
336
+
337
+ #Binning is not really supported in current software, making these commands mostly superfluous
338
+ #Being able to read out the binning (GetHorizBin, GetVertBin) is however necessary
339
+ #these should definitely be revisited
340
+ def SetHorizontalBin(self, value):
341
+ raise NotImplementedError("Implemented in derived class.")
342
+
343
+ def GetHorizontalBin(self):
344
+ return 1
345
+
346
+ def SetVerticalBin(self, value):
347
+ raise NotImplementedError("Implemented in derived class.")
348
+
349
+ def GetVerticalBin(self):
350
+ return 1
351
+
352
+ def GetSupportedBinnings(self):
353
+ """
354
+ returns a list of tuples [(binx, biny), ...] of supported binning configurations
355
+
356
+ """
357
+
358
+ return [(1,1)]
359
+
360
+
361
+ # ROI Functions
362
+ def SetROIIndex(self, index):
363
+ """
364
+ Used for early Andor Neo cameras with fixed ROIs. Should not be needed for most cameras
365
+
366
+ """
367
+ raise NotImplementedError("Implement if needed.")
368
+
369
+ def SetROI(self, x1, y1, x2, y2):
370
+ """
371
+ Set the ROI via coordinates (as opposed to via an index).
372
+
373
+ NOTE/FIXME: ROI handling is currently somewhat inconsistent between cameras, as a result of underlying differences
374
+ in the Camera APIs (some of which use zero based pixel indices and some of which use 1-based indices).
375
+
376
+ With the possible exception of the Hamamatsu Orca Flash support, the numpy convention is used, whereby:
377
+
378
+ x1, y1 are the zero based indices of the top-left pixel in the ROI and x2, y2 are the coordinates of the
379
+ bottom right corner of the ROI. It is important to note that, as with the python/numpy slice notation the row
380
+ and column with (zero based) coordinates y2 and x2 respectively are **excluded** from the ROI. IE an ROI [x1, y1, x2, y2]
381
+ goes from pixel index x1 up to, but not including pixel index x2 (this lets us define the ROI width as (x2-x1)).
382
+
383
+ Due to the fact that they map directly to API functions related to the Andor cameras, GetROIX1 and GetROIY1,
384
+ return indices which are 1-based and GetROIX2 and GetROIY2 match x2 and y2 as provided to SetROI. This is not
385
+ strictly followed in all cameras with the orca flash breaking convention. Rather than maintaining an inconsistent
386
+ indexing convention between the GetROIX...() functions and SetROI, these have been etc have been deprecated for
387
+ a single GetROI() function which uses the same conventions as SetROI
388
+
389
+ FIXME: How does the Orca handle x2, y2 ???
390
+
391
+ Parameters
392
+ ----------
393
+ x1 : int
394
+ Left x-coordinate, zero-indexed
395
+ y1 : int
396
+ Top y-coordinate, zero-indexed
397
+ x2 : int
398
+ Right x-coordinate, (excluded from ROI)
399
+ y2 : int
400
+ Bottom y-coordinate, (excluded from ROI)
401
+
402
+ Returns
403
+ -------
404
+ None
405
+
406
+
407
+ """
408
+ raise NotImplementedError('Implemented in derived class.')
409
+
410
+ def GetROI(self):
411
+ """
412
+
413
+ Returns
414
+ -------
415
+
416
+ The ROI, [x1, y1, x2, y2] in the numpy convention used by SetROI
417
+
418
+ """
419
+ raise NotImplementedError('Implemented in derived class.')
420
+
421
+ def GetROIX1(self):
422
+ """
423
+ Gets the position of the leftmost pixel of the ROI. [Deprecated]
424
+
425
+ Returns
426
+ -------
427
+ int
428
+ Left x-coordinate of ROI. One based indexing
429
+
430
+ Notes
431
+ -----
432
+ This is broken for the Orca
433
+ """
434
+ logger.warning("Deprecated - use GetROI() instead")
435
+ return self.GetROI()[0] + 1
436
+
437
+
438
+ def GetROIX2(self):
439
+ """
440
+ Gets the position of the rightmost pixel of the ROI. [Deprecated]
441
+
442
+ Returns
443
+ -------
444
+ int
445
+ Right x-coordinate of ROI. One base indexing
446
+
447
+
448
+ """
449
+ logger.warning("Deprecated - use GetROI() instead")
450
+ return self.GetROI()[2] + 1
451
+
452
+ def GetROIY1(self):
453
+ """
454
+ Gets the position of the top row of the ROI. [Deprecated]
455
+
456
+ Returns
457
+ -------
458
+ int
459
+ Top y-coordinate of ROI. One based indexing
460
+
461
+
462
+ """
463
+ logger.warning("Deprecated - use GetROI() instead")
464
+ return self.GetROI()[1]
465
+
466
+ def GetROIY2(self):
467
+ """
468
+ Gets the position of the bottom row of the ROI. [Deprecated]
469
+
470
+ Returns
471
+ -------
472
+ int
473
+ Bottom y-coordinate of ROI. One based indexing
474
+
475
+
476
+ """
477
+ logger.warning("Deprecated - use GetROI() instead")
478
+ return self.GetROI()[3]
479
+
480
+ def SetEMGain(self, gain):
481
+ """
482
+ Set the electron-multiplying gain. For EMCCDs this is typically the
483
+ uncalibrated, gain register setting. The calibrated gain is computed
484
+ separately and saved in the metadata as TrueEMGain.
485
+
486
+ Parameters
487
+ ----------
488
+ gain : float
489
+ EM gain of Camera object.
490
+
491
+ Returns
492
+ -------
493
+ None
494
+
495
+ See Also
496
+ --------
497
+ GetEMGain
498
+ """
499
+ pass
500
+
501
+ def GetEMGain(self):
502
+ """
503
+ Return electron-multiplying gain register setting. The actual gain will likely be a non-linear function of this
504
+ gain, so EMCCD cameras classes are encouraged to keep calibration data and to write this into the metadata as
505
+ 'TrueEMGain'
506
+
507
+ For non-EMCCD cameras, this should return 1.
508
+
509
+ Returns
510
+ -------
511
+ float
512
+ Electron multiplying gain register setting
513
+
514
+ See Also
515
+ ----------
516
+ GetTrueEMGain, SetEMGain
517
+ """
518
+ return 1
519
+
520
+ def GetTrueEMGain(self):
521
+ """
522
+ # FIXME - what is this doing here???????
523
+
524
+ Return true electron-multiplying gain of Camera object.
525
+
526
+ Returns
527
+ -------
528
+ float
529
+ Camera object adjusted true gain.
530
+
531
+ See Also
532
+ ----------
533
+ GetEMGain
534
+ """
535
+ return 1
536
+
537
+
538
+
539
+
540
+
541
+
542
+ def GetElectrTemp(*args):
543
+ """
544
+ Returns the temperature of the internal electronics. Legacy of PCO Sensicam support, which had separate sensors
545
+ for CCD and electronics. Not actually used anywhere critical (might be recorded in metadata), can remove.
546
+
547
+ """
548
+ return 25
549
+
550
+ def GetCCDTemp(self):
551
+ """
552
+ Gets the sensor temperature.
553
+
554
+ Returns
555
+ -------
556
+ float
557
+ The sensor's temperature in degrees Celsius
558
+ """
559
+ raise NotImplementedError('Implement in derived class.')
560
+
561
+ def GetCCDTempSetPoint(self):
562
+ """
563
+ Get the target camera temperature. Only currently called in Ixon
564
+ related code, but potentially generally useful.
565
+
566
+ Returns
567
+ -------
568
+ float
569
+ Target camera temperature (Celsius)
570
+ """
571
+ raise NotImplementedError('Implemented in derived class.')
572
+
573
+ def SetCCDTemp(self, temp):
574
+ """
575
+ Set the target camera temperature.
576
+
577
+ Parameters
578
+ ----------
579
+ temp : float
580
+ The target camera temperature (Celsius)
581
+
582
+ Returns
583
+ -------
584
+ None
585
+ """
586
+ raise NotImplementedError('Implemented in derived class.')
587
+
588
+ def SetShutter(self, mode):
589
+ """
590
+ Set the camera shutter (if available).
591
+
592
+ Parameters
593
+ ----------
594
+ mode : bool
595
+ True (1) if open
596
+ """
597
+ pass
598
+
599
+ def SetBaselineClamp(self, mode):
600
+ """ Set the camera baseline clamp (EMCCD). Only called from the Ixon settings panel, so not relevant for other
601
+ cameras."""
602
+ pass
603
+
604
+
605
+ def GetAcquisitionMode(self):
606
+ """
607
+ Get the Camera object readout mode.
608
+
609
+ Returns
610
+ -------
611
+ int
612
+ One of:
613
+ MODE_CONTINUOUS
614
+ camera is free-running using internal timing
615
+ MODE_SINGLE_SHOT
616
+ captures single frame on acquisition start
617
+ MODE_SOFTWARE_TRIGGER
618
+ captures a single frame every time a software trigger is
619
+ sent. See `FireSoftwareTrigger`
620
+ MODE_HARDWARE_TRIGGER
621
+ captures a single frame every time an external hardware
622
+ trigger is received by the camera
623
+ MODE_HARDWARE_START_TRIGGER
624
+ camera waits for an external hardware trigger and enters
625
+ free-running internal timing mode once received
626
+
627
+ See Also
628
+ --------
629
+ SetAcquisitionMode
630
+
631
+ Notes
632
+ -----
633
+ Calling code should compare against the constants defined on the Camera class, rather than their integer values
634
+
635
+ """
636
+ raise NotImplementedError('Should be implemented in derived class.')
637
+
638
+ def SetAcquisitionMode(self, mode):
639
+ """
640
+ Set the readout mode of the Camera object. PYME currently supports
641
+ several modes; different options can be useful for timing. The primary
642
+ modes are single shot, where the camera takes one image, and then a new
643
+ exposure has to be manually triggered, or continuous / free running,
644
+ where the camera runs as fast as it can until we tell it to stop. Not all cameras support all modes. All cameras should support `MODE_CONTINUOUS` and `MODE_SINGLE_SHOT`, but care should be taken when using the other modes (i.e. usage probably need to be restricted to code which knows what type of camera it's dealing with). TODO - add a mechanism for cameras to report which modes they support.
645
+
646
+
647
+ Parameters
648
+ ----------
649
+ mode : int
650
+ One of:
651
+ MODE_CONTINUOUS
652
+ camera is free-running using internal timing
653
+ MODE_SINGLE_SHOT
654
+ captures single frame on acquisition start
655
+ MODE_SOFTWARE_TRIGGER
656
+ captures a single frame every time a software trigger is
657
+ sent. See `FireSoftwareTrigger`
658
+ MODE_HARDWARE_TRIGGER
659
+ captures a single frame every time an external hardware
660
+ trigger is received by the camera
661
+ MODE_HARDWARE_START_TRIGGER
662
+ camera waits for an external hardware trigger and enters
663
+ free-running internal timing mode once received
664
+
665
+ Returns
666
+ -------
667
+ None
668
+
669
+ See Also
670
+ --------
671
+ GetAcquisitionMode
672
+
673
+ Notes
674
+ -----
675
+ Calling code should use the constants defined on the Camera class, rather than their integer values
676
+ """
677
+
678
+ raise NotImplementedError('Should be implemented in derived class.')
679
+
680
+ def SetBurst(self, burstSize):
681
+ """
682
+ Used with Andor Zyla/Neo for burst mode acquisition, can generally ignore for most cameras. Somewhat experimental
683
+ and does not currently have any UI bindings.
684
+ """
685
+ raise NotImplementedError("Implement if needed")
686
+
687
+ def SetActive(self, active=True):
688
+ """
689
+ Flag the Camera object as active (or inactive) to dictate whether or
690
+ not it writes its metadata.
691
+
692
+ Parameters
693
+ ----------
694
+ active : bool
695
+ """
696
+
697
+ self.active = bool(active)
698
+
699
+ def _log_exposure_start(self):
700
+ """
701
+ Log a StartAq event to the event log to facilitate timestamping of acquisition frames.
702
+ This should be called in the StartExposure and FireSoftwareTrigger methods of derived camera classes.
703
+ """
704
+ eventLog.logEvent('StartAq', '')
705
+
706
+ def StartExposure(self):
707
+ """
708
+ Starts an acquisition.
709
+
710
+ Must call _log_exposure_start to log the start of the acquisition.
711
+
712
+ Returns
713
+ -------
714
+ int
715
+ Success (0) or failure (-1) of initialization.
716
+ """
717
+ raise NotImplementedError('Implemented in derived class.')
718
+
719
+
720
+ def StopAq(self):
721
+ """
722
+ Stops acquiring.
723
+
724
+ Returns
725
+ -------
726
+ None
727
+ """
728
+ raise NotImplementedError('Implemented in derived class.')
729
+
730
+
731
+ def GetNumImsBuffered(self):
732
+ """
733
+ Return the number of images in the buffer.
734
+
735
+ Returns
736
+ -------
737
+ int
738
+ Number of images in buffer
739
+ """
740
+ raise NotImplementedError("Implemented in derived class.")
741
+
742
+ def GetBufferSize(self):
743
+ """
744
+ Return the total size of the buffer (in images).
745
+
746
+ Returns
747
+ -------
748
+ int
749
+ Number of images that can be stored in the buffer.
750
+ """
751
+ raise NotImplementedError("Implemented in derived class.")
752
+
753
+
754
+ @property
755
+ def _gain_mode(self):
756
+ """
757
+ Should return a representation of the camera gain and/or preamp mode that can be used as a dictionary key.
758
+ Should be overriden in derived classes if they have any setable preamp gain modes to speak of.
759
+ This is used to look up noise properties by preamp setting, see noise_properties below.
760
+ """
761
+ return 'fixed'
762
+
763
+
764
+ @property
765
+ def noise_properties(self):
766
+ """
767
+ Return the noise properties for the given camera. This is a dictionary with the following entries
768
+
769
+ 'ReadNoise' : camera read noise as a standard deviation in units of photoelectrons (e-)
770
+ 'ElectronsPerCount' : AD conversion factor - how many electrons per ADU
771
+ 'NoiseFactor' : excess (multiplicative) noise factor 1.44 for EMCCD, 1 for standard CCD/sCMOS. See
772
+ doi: 10.1109/TED.2003.813462
773
+ 'SaturationThreshold' : the full well capacity (in ADU)
774
+
775
+ and optionally
776
+
777
+ 'ADOffset' : the dark level (in ADU)
778
+ 'DefaultEMGain' : a sensible EM gain setting to use for localization recording
779
+
780
+
781
+ These are sourced from config files, referenced by camera serial number and gain mode.
782
+ See :py:mod:`PYME.Acquire.Hardware.camera_noise` for details. There can be camera to camera to camera variations in
783
+ the valid values and meanings of `self._gain_mode`.
784
+ """
785
+ try:
786
+ return camera_noise.noise_properties[self.GetSerialNumber()]['noise_properties'][self._gain_mode]
787
+ except KeyError: # last resort is a runtime error - we can debate what the best solution is
788
+ # we could also look for a 'default' entry in the properties
789
+ raise RuntimeError('Camera specific noise props not found for serial no "%s" and preamp mode "%s". See PYME.Acquire.Hardware.camera_noise for info on how to setup your camera'
790
+ % (self.GetSerialNumber(),self._gain_mode))
791
+
792
+ def GetStatus(self):
793
+ """
794
+ Used to poll the camera for status information. Useful for some cameras where it makes sense
795
+ to make one API call to get the temperature, frame rate, num frames buffered etc ... and cache
796
+ the results. For most cameras can be safely ignored.
797
+
798
+ Parameters
799
+ ----------
800
+ args
801
+
802
+ Returns
803
+ -------
804
+
805
+ """
806
+ pass
807
+
808
+ def GetFPS(self):
809
+ """
810
+ Get the camera frame rate in frames per second (float).
811
+
812
+ Returns
813
+ -------
814
+ float
815
+ Camera frame rate (frames per second)
816
+ """
817
+
818
+ raise NotImplementedError('Implement in derived class')
819
+
820
+ def GenStartMetadata(self, mdh):
821
+ """
822
+ FIXME - should this be in the base class ???
823
+
824
+ Create Camera metadata. This ensures the Camera's settings get
825
+ recorded.
826
+
827
+ Parameters
828
+ ----------
829
+ mdh : MetaDataHandler
830
+ MetaDataHandler object for Camera.
831
+
832
+ Returns
833
+ -------
834
+ None
835
+ """
836
+
837
+ if self.active:
838
+ # Set Camera object metadata here with calls to mdh.setEntry
839
+ self.GetStatus()
840
+
841
+ # Personal identification
842
+ try:
843
+ mdh.setEntry('Camera.Name', self.GetName())
844
+ mdh.setEntry('Camera.Model', self.GetHeadModel())
845
+ except NotImplementedError:
846
+ # cameras are not required to provide GetName(), GetHeadModel()
847
+ # and these metadata entries should not be depended on (might change).
848
+ pass
849
+
850
+ mdh.setEntry('Camera.SerialNumber', self.GetSerialNumber())
851
+
852
+ # Time
853
+ mdh.setEntry('Camera.IntegrationTime', self.GetIntegTime())
854
+ mdh.setEntry('Camera.CycleTime', self.GetCycleTime())
855
+
856
+ # Gain
857
+ mdh.setEntry('Camera.EMGain', self.GetEMGain())
858
+ mdh.setEntry('Camera.TrueEMGain', self.GetTrueEMGain())
859
+
860
+ # Noise
861
+ noiseProps = self.noise_properties
862
+ mdh.setEntry('Camera.ReadNoise', noiseProps['ReadNoise'])
863
+ mdh.setEntry('Camera.NoiseFactor', noiseProps.get('NoiseFactor', 1))
864
+ mdh.setEntry('Camera.ElectronsPerCount', noiseProps['ElectronsPerCount'])
865
+
866
+ # Temp
867
+ mdh.setEntry('Camera.StartCCDTemp', self.GetCCDTemp())
868
+
869
+ # Chip size
870
+ mdh.setEntry('Camera.SensorWidth', self.GetCCDWidth())
871
+ mdh.setEntry('Camera.SensorHeight', self.GetCCDHeight())
872
+
873
+ x1, y1, x2, y2 = self.GetROI()
874
+ mdh.setEntry('Camera.ROIOriginX', x1)
875
+ mdh.setEntry('Camera.ROIOriginY', y1)
876
+ mdh.setEntry('Camera.ROIWidth', x2 - x1)
877
+ mdh.setEntry('Camera.ROIHeight', y2 - y1)
878
+
879
+ @property
880
+ def SaturationThreshold(self):
881
+ """
882
+ Returns
883
+ -------
884
+ int
885
+ the full well capacity (in ADU), typically 2^bitdepth - 1
886
+ """
887
+ try:
888
+ return self.noise_properties['SaturationThreshold']
889
+ except (KeyError, RuntimeError):
890
+ return self._saturation_threshold
891
+
892
+
893
+ def Shutdown(self):
894
+ """Shutdown and clean up the camera"""
895
+ pass
896
+
897
+ def __del__(self):
898
+ self.Shutdown()
899
+
900
+
901
+ #legacy methods, unused
902
+
903
+ def CheckCoordinates(*args):
904
+ # this could possibly get a reprieve, maybe ofter re-naming. Purpose was to decide if a given
905
+ # ROI was going to be valid
906
+ raise DeprecationWarning("Deprecated.")
907
+
908
+ def DisplayError(*args):
909
+ """Completely deprecated and never called. Artifact of very old code which had GUI mixed up with camera. Should remove"""
910
+ raise DeprecationWarning("Deprecated.")
911
+
912
+ def GetBWPicture(*args):
913
+ """Legacy of old code. Not called anywhere, should remove"""
914
+ raise DeprecationWarning("Deprecated.")
915
+
916
+ def GetNumberChannels(*args):
917
+ """
918
+ Returns the number of colour channels in the Bayer mask. Legacy, deprecated, and not used
919
+
920
+ Returns
921
+ -------
922
+ the number of colour channels
923
+
924
+ """
925
+ raise DeprecationWarning("Deprecated.")
926
+
927
+ def SetCOC(*args):
928
+ """Legacy of sensicam support. Hopefully no longer called anywhere"""
929
+ raise DeprecationWarning("Deprecated.")
930
+
931
+ def StartLifePreview(*args):
932
+ """Legacy of old code. Not called anywhere, should remove"""
933
+ raise DeprecationWarning("Deprecated.")
934
+
935
+ def StopLifePreview(*args):
936
+ """Legacy of old code. Not called anywhere, should remove"""
937
+ raise DeprecationWarning("Deprecated.")
938
+
939
+
940
+ # DEPRECATED, TODO - schedule for removal
941
+ class MultiviewCameraMixin(object):
942
+ def __init__(self, multiview_info, default_roi, camera_class):
943
+ """
944
+ Used principally for cutting horizontally spaced ROIs out of a vertical band of the sCMOS chip, where there
945
+ is dark space between the images and we want to avoid saving and transmitting this dark data.
946
+
947
+ This class supports the standard full chip and cropped ROI modes, as well as a new multiview mode. The
948
+ multiview mode makes the frames appear to the outside world as though they are just active multiview views
949
+ concatenated horizontally.
950
+
951
+ To implement a multiview camera, simply inherit both from the specific camera class you want as well as this
952
+ class, e.g.
953
+ class MultiviewCoolCamera(MultiviewCamera, CoolCamera)
954
+ def __init__(self, whatever_cool_cam_needs, multiview_info)
955
+ CoolCamera.__init__(self, whatever_cool_cam_needs)
956
+ default_roi = dict(xi=0, xf=2048, yi=0, yf=2048)
957
+ MultiviewCamera.__init__(self, multiview_info, default_roi, CoolCamera)
958
+
959
+ and that's it. Then in your init script, simply define your multiview_info dict and initialize your
960
+ MultiviewCoolCamera class.
961
+
962
+ Parameters
963
+ ----------
964
+ multiview_info : dict
965
+ Information about how to crop the image. Can either be a dictionary, or something which behaves like a
966
+ dictionary (e.g. a MetaDataHandler).
967
+ default_roi: dict
968
+ contains the default ROI of the camera. This should just be the full chip, and should be defined in the
969
+ camera_class: class
970
+ This should be the class of the camera you want to inherit from. The MultiviewCamera class needs to know
971
+ this so we can clobber the inherited ExtractColor method and still be able to pull raw frames from the
972
+ camera using camera_class.ExtractColor
973
+
974
+ Notes
975
+ -----
976
+ For now, the 0th multiview ROI should be the upper-left most multiview ROI, in order to properly spoof the
977
+ position to match up with the stage. See PYME.IO.MetaDataHandler.get_camera_roi_origin.
978
+ """
979
+ warnings.warn(DeprecationWarning('Use PYME.Acquire.Hardware.multiview.MultiviewWrapper instead'))
980
+ logger.warn('MultiviewMixin is deprecated - use PYME.Acquire.Hardware.multiview.MultiviewWrapper instead')
981
+ self.camera_class = camera_class
982
+ self.multiview_info = multiview_info
983
+ self._channel_color = multiview_info['Multiview.ChannelColor']
984
+
985
+ self.n_views = multiview_info['Multiview.NumROIs']
986
+ self.view_origins = [multiview_info['Multiview.ROI%dOrigin' % i] for i in range(self.n_views)]
987
+ self.size_x, self.size_y = multiview_info['Multiview.DefaultROISize']
988
+ self.multiview_roi_size_options = multiview_info['Multiview.ROISizeOptions']
989
+
990
+ self.view_centers = [(ox + int(0.5*self.size_x), oy + int(0.5*self.size_y)) for ox, oy in self.view_origins]
991
+
992
+ self.multiview_enabled = False
993
+ self.active_views = []
994
+
995
+ # set default width and height to return to when multiview is disabled
996
+ self._default_chip_width = default_roi['xf'] - default_roi['xi']
997
+ self._default_chip_height = default_roi['yf'] - default_roi['yi']
998
+ self.default_chip_roi = default_roi
999
+ self._current_pic_width = self._default_chip_width
1000
+ self._current_pic_height = self._default_chip_height
1001
+
1002
+ def ChangeMultiviewROISize(self, x_size, y_size):
1003
+ """
1004
+ Changes the ROI size of the views. Currently they are all the same size
1005
+ Parameters
1006
+ ----------
1007
+ x_size: int
1008
+ first dimension size
1009
+ y_size: int
1010
+ second dimension size
1011
+
1012
+ Returns
1013
+ -------
1014
+ None
1015
+ """
1016
+ # shift the origins
1017
+ self.view_origins = [(xc - int(0.5*x_size), yc - int(0.5*y_size)) for xc, yc in self.view_centers]
1018
+ # store the new sizes
1019
+ self.size_x, self.size_y = x_size, y_size
1020
+
1021
+ if self.multiview_enabled:
1022
+ # re-set the slices for frame cropping
1023
+ self.enable_multiview(self.active_views)
1024
+
1025
+
1026
+ def GetPicWidth(self):
1027
+ """
1028
+ This clobbers the inherited self.camera_class GetPicWidth method so that the outside world (FrameWrangler)
1029
+ only allocates memory/thinks our camera frames are the final concatenated multiview width.
1030
+ Returns
1031
+ -------
1032
+ pic_width: int
1033
+ width of the concatenated multiview frame
1034
+ """
1035
+ if self.multiview_enabled:
1036
+ return self._current_pic_width
1037
+ else:
1038
+ return self.camera_class.GetPicWidth(self)
1039
+
1040
+ def GetPicHeight(self):
1041
+ """
1042
+ This clobbers the inherited self.camera_class GetPicHeight method so that the outside world (FrameWrangler)
1043
+ only allocates memory/thinks our camera frames are the final multiview frame height.
1044
+ Returns
1045
+ -------
1046
+ pic_height: int
1047
+ height of the multiview frame
1048
+ """
1049
+ if self.multiview_enabled:
1050
+ return self._current_pic_height
1051
+ else:
1052
+ return self.camera_class.GetPicHeight(self)
1053
+
1054
+ def set_active_views(self, views):
1055
+ if len(views) == 0:
1056
+ self.disable_multiview()
1057
+ elif sorted(views) == self.active_views:
1058
+ pass
1059
+ else:
1060
+ self.enable_multiview(views)
1061
+
1062
+
1063
+ def enable_multiview(self, views):
1064
+ """
1065
+
1066
+ Parameters
1067
+ ----------
1068
+ views: list
1069
+ views to activate. Should be integers which can be used to index self.multiview_info
1070
+
1071
+ Returns
1072
+ -------
1073
+
1074
+ Notes
1075
+ -----
1076
+ FrameWrangler must be stopped before this function is called, and "prepared" afterwards before being started
1077
+ again. This is not special to this function, but rather anytime SetROI gets called.
1078
+
1079
+ """
1080
+ views = sorted(list(views)) # tuple(int) isn't iterable, make sure we avoid it
1081
+ # set the camera FOV to be just large enough so we do most of the cropping where it is already optimized
1082
+ self.x_origins, self.y_origins = zip(*[self.view_origins[view] for view in views])
1083
+ chip_x_min, chip_x_max = min(self.x_origins), max(self.x_origins)
1084
+ chip_y_min, chip_y_max = min(self.y_origins), max(self.y_origins)
1085
+
1086
+ chip_width = chip_x_max + self.size_x - chip_x_min
1087
+ chip_height = chip_y_max + self.size_y - chip_y_min
1088
+
1089
+ self.chip_roi = [chip_x_min, chip_y_min, chip_x_min + chip_width, chip_y_min + chip_height]
1090
+ logger.debug('setting chip ROI')
1091
+ self.SetROI(*self.chip_roi)
1092
+ actual = self.GetROI()
1093
+ try:
1094
+ assert actual == tuple(self.chip_roi)
1095
+ except AssertionError:
1096
+ raise(AssertionError('Error setting camera ROI. Check that ROI is feasible for camera, target: %s, actual: %s'
1097
+ % (tuple(self.chip_roi), actual)))
1098
+
1099
+ # hold an array for temporarily writing the roughly cropped chip
1100
+ self.chip_data = np.empty((chip_width, chip_height), dtype='uint16', order='F')
1101
+
1102
+ # precalculate slices for each view
1103
+ self.view_slices, self.output_slices = [], []
1104
+ for x_ind, view in enumerate(views):
1105
+ ox, oy = self.view_origins[view]
1106
+ # calculate the offset from the chip origin
1107
+ oxp, oyp = ox - chip_x_min, oy - chip_y_min
1108
+ # calculate the slices to pull out of roi on chip
1109
+ self.view_slices.append(np.s_[oxp:oxp + self.size_x, oyp: oyp + self.size_y])
1110
+ # calculate slices to write into out array
1111
+ self.output_slices.append(np.s_[self.size_x * x_ind:self.size_x * (x_ind + 1), 0:self.size_y])
1112
+
1113
+ # update our apparent height and widths, concatenating along 'x' or the 0th dim
1114
+ self._current_pic_width = len(views) * self.size_x
1115
+ self._current_pic_height = self.size_y
1116
+ # tell the world what we've accomplished here today
1117
+ self.multiview_enabled = True
1118
+ self.active_views = views
1119
+
1120
+ def disable_multiview(self):
1121
+ """
1122
+ Disables multiview mode and returns camera to the default ROI (e.g. full chip)
1123
+ Returns
1124
+ -------
1125
+
1126
+ """
1127
+ self.multiview_enabled = False
1128
+ self.active_views = []
1129
+ self.SetROI(self.default_chip_roi['xi'], self.default_chip_roi['yi'],
1130
+ self.default_chip_roi['xf'], self.default_chip_roi['yf'],)
1131
+
1132
+
1133
+ def ExtractColor(self, output_frame, mode):
1134
+ """
1135
+ Override camera get-frame function, but with multiview cropping.
1136
+
1137
+ Parameters
1138
+ ----------
1139
+ output_frame: np.array
1140
+ array sized for the final multiview frame
1141
+ mode: int
1142
+ camera acquisition mode.
1143
+
1144
+ Returns
1145
+ -------
1146
+
1147
+ """
1148
+ if self.multiview_enabled:
1149
+ # logger.debug('pulling frame')
1150
+ # pull data off the roughly cropped frame
1151
+ self.camera_class.ExtractColor(self, self.chip_data, mode)
1152
+ # extract the multiview frames from the cropped chip into our output
1153
+ for out_slice, view_slice in zip(self.output_slices, self.view_slices):
1154
+ output_frame[out_slice] = self.chip_data[view_slice]
1155
+
1156
+ else:
1157
+ # skip extra cropping, extract the full chip directly into the output frame
1158
+ self.camera_class.ExtractColor(self, output_frame, mode)
1159
+
1160
+ def GenStartMetadata(self, mdh):
1161
+ """
1162
+ Light shim to record multiview metadata, when appropriate
1163
+
1164
+ Parameters
1165
+ ----------
1166
+ mdh : MetaDataHandler
1167
+ MetaDataHandler object for Camera.
1168
+
1169
+ Returns
1170
+ -------
1171
+ None
1172
+ """
1173
+ self.camera_class.GenStartMetadata(self, mdh)
1174
+ # add in multiview info
1175
+ if self.multiview_enabled:
1176
+ mdh.setEntry('Multiview.NumROIs', self.n_views)
1177
+ mdh.setEntry('Multiview.ROISize', [self.size_x, self.size_y])
1178
+ mdh.setEntry('Multiview.ChannelColor', self._channel_color)
1179
+ mdh.setEntry('Multiview.ActiveViews', self.active_views)
1180
+ for ind in range(self.n_views):
1181
+ mdh.setEntry('Multiview.ROI%dOrigin' % ind, self.view_origins[ind])
1182
+
1183
+ def register_state_handlers(self, state_manager):
1184
+ """ Allow key multiview settings to be updated easily through
1185
+ the microscope state handler
1186
+
1187
+ Parameters
1188
+ ----------
1189
+ state_manager : PYME.Acquire.microscope.State
1190
+ """
1191
+ logger.debug('registering multiview camera state handlers')
1192
+
1193
+ state_manager.registerHandler('Multiview.ActiveViews',
1194
+ lambda : self.active_views,
1195
+ self.set_active_views, True)
1196
+ state_manager.registerHandler('Multiview.ROISize',
1197
+ lambda : [self.size_x, self.size_y],
1198
+ lambda p : self.ChangeMultiviewROISize(p[0], p[1]),
1199
+ True)