python-microscopy 25.6.5__cp39-cp39-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 (1277) 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.cp39-win_amd64.dll.a +0 -0
  80. PYME/Acquire/Hardware/Simulator/illuminate.cp39-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.cp39-win_amd64.dll.a +0 -0
  321. PYME/Analysis/PSFGen/ps_app.cp39-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.cp39-win_amd64.dll.a +0 -0
  349. PYME/Analysis/points/DeClump/deClump.cp39-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.cp39-win_amd64.dll.a +0 -0
  355. PYME/Analysis/points/DistHist/distHist.cp39-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.cp39-win_amd64.dll.a +0 -0
  360. PYME/Analysis/points/EdgeDB/edgeDB.cp39-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.cp39-win_amd64.dll.a +0 -0
  375. PYME/Analysis/points/SoftRend/triRend.cp39-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.cp39-win_amd64.dll.a +0 -0
  379. PYME/Analysis/points/arcfit/arcmf.cp39-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.cp39-win_amd64.dll.a +0 -0
  384. PYME/Analysis/points/astigmatism/astiglookup.cp39-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.cp39-win_amd64.dll.a +0 -0
  411. PYME/Analysis/points/traveling_salesperson/two_opt_utils.cp39-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.cp39-win_amd64.dll.a +0 -0
  426. PYME/DSView/LUT/lut.cp39-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.cp39-win_amd64.dll.a +0 -0
  574. PYME/IO/buffer_helpers.cp39-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 +200 -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.cp39-win_amd64.dll.a +0 -0
  820. PYME/contrib/gohlke/_tifffile.cp39-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.cp39-win_amd64.dll.a +0 -0
  836. PYME/experimental/_octree.cp39-win_amd64.pyd +0 -0
  837. PYME/experimental/_octree.pyx +477 -0
  838. PYME/experimental/_treap.cp39-win_amd64.dll.a +0 -0
  839. PYME/experimental/_treap.cp39-win_amd64.pyd +0 -0
  840. PYME/experimental/_treap.pyx +267 -0
  841. PYME/experimental/_triangle_mesh.cp39-win_amd64.dll.a +0 -0
  842. PYME/experimental/_triangle_mesh.cp39-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.cp39-win_amd64.dll.a +0 -0
  853. PYME/experimental/func_octree.cp39-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.cp39-win_amd64.dll.a +0 -0
  873. PYME/experimental/triangle_mesh_utils.cp39-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.cp39-win_amd64.dll.a +0 -0
  987. PYME/localization/cInterp/cInterp.cp39-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.cp39-win_amd64.dll.a +0 -0
  991. PYME/localization/cModels/gauss_app.cp39-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 +65 -0
  1275. python_microscopy-25.6.5.dist-info/METADATA +68 -0
  1276. python_microscopy-25.6.5.dist-info/RECORD +1277 -0
  1277. python_microscopy-25.6.5.dist-info/WHEEL +4 -0
PYME/LMVis/pipeline.py ADDED
@@ -0,0 +1,1227 @@
1
+
2
+ #!/usr/bin/python
3
+
4
+ ###############
5
+ # pipeline.py
6
+ #
7
+ # Copyright David Baddeley, 2012
8
+ # d.baddeley@auckland.ac.nz
9
+ #
10
+ # This program is free software: you can redistribute it and/or modify
11
+ # it under the terms of the GNU General Public License as published by
12
+ # the Free Software Foundation, either version 3 of the License, or
13
+ # (at your option) any later version.
14
+ #
15
+ # This program is distributed in the hope that it will be useful,
16
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
17
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
+ # GNU General Public License for more details.
19
+ #
20
+ # You should have received a copy of the GNU General Public License
21
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
22
+ #
23
+ ################
24
+ from PYME.IO import tabular
25
+ from PYME.IO.image import ImageBounds
26
+ from PYME.LMVis import dyeRatios
27
+ from PYME.LMVis import statusLog
28
+
29
+ try:
30
+ # make sure pipeline works when wx is not avalable
31
+ # TODO - move blob stuff into a recipe module and remove from pipeline.
32
+ from PYME.LMVis.triBlobs import BlobSettings
33
+ except ImportError:
34
+ # create a dummy class
35
+ class BlobSettings:
36
+ pass
37
+
38
+ from PYME.Analysis import piecewiseMapping
39
+ from PYME.IO import MetaDataHandler
40
+
41
+ import warnings
42
+
43
+ #from traits.api import HasTraits
44
+ #from traitsui.api import View
45
+ #from PYME.recipes.base import ModuleCollection
46
+ from PYME.recipes import Recipe
47
+
48
+ import numpy as np
49
+ import scipy.special
50
+ import os
51
+
52
+ from PYME.contrib import dispatch
53
+
54
+ from PYME.Analysis.BleachProfile.kinModels import getPhotonNums
55
+
56
+ import logging
57
+ logger = logging.getLogger(__name__)
58
+
59
+ def _processPriSplit(ds):
60
+ """set mappings ascociated with the use of a splitter"""
61
+
62
+ ds.setMapping('gFrac', 'fitResults_ratio')
63
+ ds.setMapping('error_gFrac', 'fitError_ratio')
64
+
65
+ ds.setMapping('fitResults_Ag', 'gFrac*A')
66
+ ds.setMapping('fitResults_Ar', '(1.0 - gFrac)*A + error_gFrac*A')
67
+ ds.setMapping('fitError_Ag', 'gFrac*fitError_A + error_gFrac*A')
68
+ ds.setMapping('fitError_Ar', '(1.0 - gFrac)*fitError_A')
69
+ #ds.setMapping('fitError_Ag', '1*sqrt(fitResults_Ag/1e-3)')
70
+ #ds.setMapping('fitError_Ar', '1*sqrt(fitResults_Ar/1e-3)')
71
+
72
+ sg = ds['fitError_Ag']
73
+ sr = ds['fitError_Ar']
74
+ g = ds['fitResults_Ag']
75
+ r = ds['fitResults_Ar']
76
+ I = ds['A']
77
+
78
+ colNorm = np.sqrt(2 * np.pi) * sg * sr / (2 * np.sqrt(sg ** 2 + sr ** 2) * I) * (
79
+ scipy.special.erf((sg ** 2 * r + sr ** 2 * (I - g)) / (np.sqrt(2) * sg * sr * np.sqrt(sg ** 2 + sr ** 2)))
80
+ - scipy.special.erf((sg ** 2 * (r - I) - sr ** 2 * g) / (np.sqrt(2) * sg * sr * np.sqrt(sg ** 2 + sr ** 2))))
81
+
82
+ colNorm /= (sg * sr)
83
+
84
+ ds.addColumn('ColourNorm', colNorm)
85
+
86
+
87
+ def _processSplitter(ds):
88
+ """set mappings ascociated with the use of a splitter"""
89
+
90
+ #ds.gF_zcorr = 0
91
+ ds.setMapping('A', 'fitResults_Ag + fitResults_Ar')
92
+ if 'fitResults_z0' in ds.keys():
93
+ ds.addVariable('gF_zcorr', 0)
94
+ ds.setMapping('gFrac', 'fitResults_Ag/(fitResults_Ag + fitResults_Ar) + gF_zcorr*fitResults_z0')
95
+ else:
96
+ ds.setMapping('gFrac', 'fitResults_Ag/(fitResults_Ag + fitResults_Ar)')
97
+
98
+ if 'fitError_Ag' in ds.keys():
99
+ ds.setMapping('error_gFrac',
100
+ 'sqrt((fitError_Ag/fitResults_Ag)**2 + (fitError_Ag**2 + fitError_Ar**2)/(fitResults_Ag + fitResults_Ar)**2)*fitResults_Ag/(fitResults_Ag + fitResults_Ar)')
101
+ else:
102
+ ds.setMapping('error_gFrac', '0*x + 0.01')
103
+ ds.setMapping('fitError_Ag', '1*sqrt(fitResults_Ag/1)')
104
+ ds.setMapping('fitError_Ar', '1*sqrt(fitResults_Ar/1)')
105
+
106
+ sg = ds['fitError_Ag']
107
+ sr = ds['fitError_Ar']
108
+ g = ds['fitResults_Ag']
109
+ r = ds['fitResults_Ar']
110
+ I = ds['A']
111
+
112
+ colNorm = np.sqrt(2 * np.pi) * sg * sr / (2 * np.sqrt(sg ** 2 + sr ** 2) * I) * (
113
+ scipy.special.erf((sg ** 2 * r + sr ** 2 * (I - g)) / (np.sqrt(2) * sg * sr * np.sqrt(sg ** 2 + sr ** 2)))
114
+ - scipy.special.erf((sg ** 2 * (r - I) - sr ** 2 * g) / (np.sqrt(2) * sg * sr * np.sqrt(sg ** 2 + sr ** 2))))
115
+
116
+ ds.addColumn('ColourNorm', colNorm)
117
+
118
+
119
+ def _add_eventvars_to_ds(ds, ev_mappings):
120
+ zm = ev_mappings.get('zm', None)
121
+ if zm:
122
+ z_focus = 1.e3 * zm(ds['t'])
123
+ ds.addColumn('focus', z_focus)
124
+
125
+ piezo_moving = ev_mappings.get('piezo_moving')
126
+ if piezo_moving:
127
+ ds.addColumn('piezoMoving', piezo_moving(ds['t']))
128
+
129
+ xm = ev_mappings.get('xm', None)
130
+ if xm:
131
+ # todo - comment on why the -0.01??
132
+ scan_x = 1.e3 * xm(ds['t'] - .01)
133
+ ds.addColumn('scanx', scan_x)
134
+
135
+ # scanned acquisition re-mapping temporarily disabled because we abuse the scanner for taking shift-fields (where
136
+ # we don't want re-mapping to occur) TODO - either detect shift-fields here, or implement remapping later.
137
+ #ds.setMapping('x', 'x + scanx')
138
+
139
+ ym = ev_mappings.get('ym', None)
140
+ if ym:
141
+ scan_y = 1.e3 * ym(ds['t'] - .01)
142
+ ds.addColumn('scany', scan_y)
143
+
144
+ # temporarily disabled - see scanx
145
+ #ds.setMapping('y', 'y + scany')
146
+
147
+ driftx = ev_mappings.get('driftx', None)
148
+ drifty = ev_mappings.get('drifty', None)
149
+ driftz = ev_mappings.get('driftz', None)
150
+ if driftx:
151
+ ds.addColumn('driftx', driftx(ds['t'] - .01))
152
+ ds.addColumn('drifty', drifty(ds['t'] - .01))
153
+ ds.addColumn('driftz', driftz(ds['t'] - .01))
154
+
155
+
156
+ def _add_missing_ds_keys(mapped_ds, ev_mappings={}):
157
+ """
158
+ VisGUI, and various rendering and postprocessing commands rely on having certain parameters defined or re-mapped
159
+ within a data source. Take care of these here.
160
+
161
+ Parameters
162
+ ----------
163
+ mapped_ds
164
+
165
+ """
166
+ _add_eventvars_to_ds(mapped_ds, ev_mappings)
167
+
168
+ #handle special cases which get detected by looking for the presence or
169
+ #absence of certain variables in the data.
170
+ if 'fitResults_Ag' in mapped_ds.keys():
171
+ #if we used the splitter set up a number of mappings e.g. total amplitude and ratio
172
+ _processSplitter(mapped_ds)
173
+
174
+ if 'fitResults_ratio' in mapped_ds.keys():
175
+ #if we used the splitter set up a number of mappings e.g. total amplitude and ratio
176
+ _processPriSplit(mapped_ds)
177
+
178
+ if 'fitResults_sigxl' in mapped_ds.keys():
179
+ #fast, quickpalm like astigmatic fitting
180
+ mapped_ds.setMapping('sig', 'fitResults_sigxl + fitResults_sigyu')
181
+ mapped_ds.setMapping('sig_d', 'fitResults_sigxl - fitResults_sigyu')
182
+
183
+ mapped_ds.addVariable('dsigd_dz', -30.)
184
+ mapped_ds.setMapping('fitResults_z0', 'dsigd_dz*sig_d')
185
+ if not 'y' in mapped_ds.keys():
186
+ mapped_ds.setMapping('y', '10*t')
187
+
188
+ # set up correction for foreshortening and z focus stepping
189
+ if not 'foreShort' in dir(mapped_ds):
190
+ mapped_ds.addVariable('foreShort', 1.)
191
+
192
+ if not 'focus' in mapped_ds.keys():
193
+ # set up a dummy focus variable if not already present
194
+ mapped_ds.setMapping('focus', '0*x')
195
+
196
+ if not 'z' in mapped_ds.keys():
197
+ if 'fitResults_z0' in mapped_ds.keys():
198
+ mapped_ds.setMapping('z', 'fitResults_z0 + foreShort*focus')
199
+ elif 'astigmatic_z' in mapped_ds.keys():
200
+ mapped_ds.setMapping('z', 'astigmatic_z + foreShort*focus')
201
+ elif 'astigZ' in mapped_ds.keys(): # legacy handling
202
+ mapped_ds.setMapping('z', 'astigZ + foreShort*focus')
203
+ else:
204
+ mapped_ds.setMapping('z', 'foreShort*focus')
205
+
206
+ if not 'A' in mapped_ds.keys() and 'fitResults_photons' in mapped_ds.keys():
207
+ mapped_ds.setMapping('A', 'fitResults_photons')
208
+
209
+
210
+
211
+ def _processEvents(ds, events, mdh):
212
+ """Read data from events table and translate it into mappings for,
213
+ e.g. z position"""
214
+
215
+ #eventCharts = []
216
+ ev_mappings = {}
217
+
218
+ if not events is None:
219
+ evKeyNames = set()
220
+ for e in events:
221
+ evKeyNames.add(e['EventName'])
222
+
223
+ if b'ProtocolFocus' in evKeyNames:
224
+ zm = piecewiseMapping.GeneratePMFromEventList(events, mdh, mdh['StartTime'], mdh['Protocol.PiezoStartPos'], eventName=b'ProtocolFocus')
225
+ ev_mappings['z_command'] = zm
226
+
227
+
228
+ if b'PiezoOnTarget' in evKeyNames:
229
+ # Sometimes we also emit PiezoOnTarget events with the actual piezo position, rather than where we
230
+ # told it to go, use these preferentially
231
+ # TODO - deprecate in favour of, e.g. 'FocusOnTarget' events which are offset-corrected - see issue 766
232
+ from PYME.Analysis import piezo_movement_correction
233
+ spoofed_evts = piezo_movement_correction.spoof_focus_events_from_ontarget(events, mdh)
234
+ zm = piecewiseMapping.GeneratePMFromEventList(spoofed_evts, mdh, mdh['StartTime'], mdh['Protocol.PiezoStartPos'], eventName=b'ProtocolFocus')
235
+ ev_mappings['z_ontarget'] = zm
236
+ ev_mappings['piezo_moving'] = piecewiseMapping.bool_map_between_events(events, mdh, b'ProtocolFocus', b'PiezoOnTarget',default=False)
237
+
238
+ # the z position we use for localizations gets the ontarget info if present
239
+ ev_mappings['zm'] = zm
240
+ #eventCharts.append(('Focus [um]', zm, b'ProtocolFocus'))
241
+
242
+ if b'ScannerXPos' in evKeyNames:
243
+ x0 = 0
244
+ if 'Positioning.Stage_X' in mdh.getEntryNames():
245
+ x0 = mdh.getEntry('Positioning.Stage_X')
246
+ xm = piecewiseMapping.GeneratePMFromEventList(events, mdh, mdh['StartTime'], x0, b'ScannerXPos', 0)
247
+ ev_mappings['xm'] = xm
248
+ #eventCharts.append(('XPos [um]', xm, 'ScannerXPos'))
249
+
250
+ if b'ScannerYPos' in evKeyNames:
251
+ y0 = 0
252
+ if 'Positioning.Stage_Y' in mdh.getEntryNames():
253
+ y0 = mdh.getEntry('Positioning.Stage_Y')
254
+ ym = piecewiseMapping.GeneratePMFromEventList(events, mdh, mdh.getEntry('StartTime'), y0, b'ScannerYPos', 0)
255
+ ev_mappings['ym'] = ym
256
+ #eventCharts.append(('YPos [um]', ym, 'ScannerYPos'))
257
+
258
+ if b'ShiftMeasure' in evKeyNames:
259
+ driftx = piecewiseMapping.GeneratePMFromEventList(events, mdh, mdh.getEntry('StartTime'), 0, b'ShiftMeasure',
260
+ 0)
261
+ drifty = piecewiseMapping.GeneratePMFromEventList(events, mdh, mdh.getEntry('StartTime'), 0, b'ShiftMeasure',
262
+ 1)
263
+ driftz = piecewiseMapping.GeneratePMFromEventList(events, mdh, mdh.getEntry('StartTime'), 0, b'ShiftMeasure',
264
+ 2)
265
+
266
+ ev_mappings['driftx'] = driftx
267
+ ev_mappings['drifty'] = drifty
268
+ ev_mappings['driftz'] = driftz
269
+
270
+ #eventCharts.append(('X Drift [px]', driftx, 'ShiftMeasure'))
271
+ #eventCharts.append(('Y Drift [px]', drifty, 'ShiftMeasure'))
272
+ #eventCharts.append(('Z Drift [px]', driftz, 'ShiftMeasure'))
273
+
274
+ # self.eventCharts = eventCharts
275
+ # self.ev_mappings = ev_mappings
276
+ elif all(k in mdh.keys() for k in ['StackSettings.FramesPerStep', 'StackSettings.StepSize',
277
+ 'StackSettings.NumSteps', 'StackSettings.NumCycles']):
278
+ # TODO - Remove this code - anytime we get here it's generally the result of an error in the input data
279
+ # This should be handled upstream when spooling
280
+ logger.warning('Spoofing focus from metadata: this usually implies an error in the input data (missing events) and results might vary')
281
+ try:
282
+ # if we dont have events file, see if we can use metadata to spoof focus
283
+ from PYME.experimental import labview_spooling_hacks
284
+
285
+ position, frames = labview_spooling_hacks.spoof_focus_from_metadata(mdh)
286
+ zm = piecewiseMapping.piecewiseMap(0, frames, position, mdh['Camera.CycleTime'], xIsSecs=False)
287
+ ev_mappings['z_command'] = zm
288
+ #eventCharts.append(('Focus [um]', zm, b'ProtocolFocus'))
289
+
290
+ except:
291
+ # It doesn't really matter if this fails, print our traceback anyway
292
+ logger.exception('Error trying to fudge focus positions')
293
+
294
+ return ev_mappings #, eventCharts
295
+
296
+ class Pipeline(object):
297
+ def __init__(self, filename=None, visFr=None, execute_on_invalidation=True):
298
+ self.filter = None
299
+ self.mapping = None
300
+ self.colourFilter = None
301
+ self.events = None
302
+
303
+ self.recipe = Recipe(execute_on_invalidation=execute_on_invalidation)
304
+ self.recipe.recipe_executed.connect(self.Rebuild)
305
+
306
+ self.selectedDataSourceKey = None
307
+ self.filterKeys = {'error_x': (0,30), 'error_y':(0,30),'A':(5,20000), 'sig' : (95, 200)}
308
+
309
+ self.blobSettings = BlobSettings()
310
+ self.objects = None
311
+
312
+ #self.imageBounds = ImageBounds(0,0,0,0)
313
+ #self.mdh = MetaDataHandler.NestedClassMDHandler()
314
+
315
+ self.Triangles = None
316
+ self.edb = None
317
+ self.Quads = None
318
+ self.GeneratedMeasures = {}
319
+
320
+ self.QTGoalPixelSize = 5
321
+
322
+ self._extra_chan_num = 0
323
+
324
+ self.filesToClose = []
325
+
326
+ #define a signal which a GUI can hook if the pipeline is rebuilt (i.e. the output changes)
327
+ self.onRebuild = dispatch.Signal()
328
+
329
+ #a cached list of our keys to be used to decide whether to fire a keys changed signal
330
+ self._keys = None
331
+ #define a signal which can be hooked if the pipeline keys have changed
332
+ self.onKeysChanged = dispatch.Signal()
333
+
334
+ self.ready = False
335
+ #self.visFr = visFr
336
+
337
+ if not filename is None:
338
+ self.OpenFile(filename)
339
+
340
+ #renderers.renderMetadataProviders.append(self.SaveMetadata)
341
+
342
+ @property
343
+ def mdh(self):
344
+ return self.selectedDataSource.mdh
345
+
346
+ @property
347
+ def imageBounds(self):
348
+ x0, y0, x1, y1, z0, z1 = 1e9, 1e9, -1e9, -1e9, 1e9, -1e9
349
+ for ds in self.dataSources.values():
350
+ try:
351
+ ib = ds.image_bounds
352
+ x0 = min(x0, ib.x0)
353
+ y0 = min(y0, ib.y0)
354
+ x1 = max(x1, ib.x1)
355
+ y1 = max(y1, ib.y1)
356
+ z0 = min(z0, ib.z0)
357
+ z1 = max(z1, ib.z1)
358
+ except AttributeError:
359
+ pass
360
+
361
+ return ImageBounds(x0, y0, x1, y1, z0, z1)
362
+
363
+ @property
364
+ def output(self):
365
+ return self.colourFilter
366
+
367
+ def __getitem__(self, keys):
368
+ """gets values from the 'tail' of the pipeline (ie the colourFilter)"""
369
+
370
+ return self.output[keys]
371
+
372
+ def keys(self):
373
+ return self.output.keys()
374
+
375
+ def __getattr__(self, item):
376
+ try:
377
+ #if 'colourFilter in '
378
+ if self.output is None:
379
+ raise AttributeError('colourFilter not yet created')
380
+
381
+ return self.output[item]
382
+ except KeyError:
383
+ raise AttributeError("'%s' has not attribute '%s'" % (self.__class__, item))
384
+
385
+ def __dir__(self):
386
+ if self.output is None:
387
+ return list(self.__dict__.keys()) + list(dir(type(self)))
388
+ else:
389
+ return list(self.output.keys()) + list(self.__dict__.keys()) + list(dir(type(self)))
390
+
391
+ #compatibility redirects
392
+ @property
393
+ def fluorSpecies(self):
394
+ #warnings.warn(DeprecationWarning('Use colour_mapper.species_ratios instead'))
395
+ raise DeprecationWarning('Use colour_mapper.species_ratios instead')
396
+ return self.colour_mapper.species_ratios
397
+
398
+ @property
399
+ def fluorSpeciesDyes(self):
400
+ #warnings.warn(DeprecationWarning('Use colour_mapper.species_dyes instead'))
401
+ raise DeprecationWarning('Use colour_mapper.species_dyes instead')
402
+ return self.colour_mapper.species_dyes
403
+
404
+
405
+ @property
406
+ def chromaticShifts(self):
407
+ return self.colourFilter.chromaticShifts
408
+
409
+ #end compatibility redirects
410
+
411
+ @property
412
+ def dataSources(self):
413
+ return self.recipe.namespace
414
+
415
+ @property
416
+ def layer_datasources(self):
417
+ lds = {'output':self.colourFilter}
418
+ lds.update(self.dataSources)
419
+ return lds
420
+
421
+ @property
422
+ def layer_data_source_names(self):
423
+ """
424
+ Return a list of names of datasources we can use with dotted channel selection
425
+
426
+ There is a little bit of magic here as we augment the names with dotted names for colour channel selection
427
+ """
428
+ names = []#'']
429
+ for k, v in self.layer_datasources.items():
430
+ names.append(k)
431
+ if isinstance(v, tabular.ColourFilter):
432
+ for c in v.getColourChans():
433
+ names.append('.'.join([k, c]))
434
+
435
+ return names
436
+
437
+ def get_layer_data(self, dsname):
438
+ """
439
+ Returns layer data for a given name. The principle difference to just accessing self.dataSources directly is that
440
+ we do some magic relating to allow colour channels to be accessed with the dot notation e.g. dsname.colour_channel
441
+
442
+ """
443
+ if dsname == '':
444
+ return self
445
+
446
+ parts = dsname.split('.')
447
+ if len(parts) == 2:
448
+ # special case - permit access to channels using dot notation
449
+ # NB: only works if our underlying datasource is a ColourFilter
450
+ ds, channel = parts
451
+ if ds == 'output':
452
+ return self.colourFilter.get_channel_ds(channel)
453
+ else:
454
+ return self.dataSources.get(ds, None).get_channel_ds(channel)
455
+ else:
456
+ if dsname =='output':
457
+ return self.colourFilter
458
+ else:
459
+ return self.dataSources.get(dsname, None)
460
+
461
+ @property
462
+ def selectedDataSource(self):
463
+ """
464
+
465
+ The currently selected data source (an instance of tabular.inputFilter derived class)
466
+
467
+ """
468
+ if self.selectedDataSourceKey is None:
469
+ return None
470
+ else:
471
+ return self.dataSources[self.selectedDataSourceKey]
472
+
473
+ def selectDataSource(self, dskey):
474
+ """
475
+ Set the currently selected data source
476
+
477
+ Parameters
478
+ ----------
479
+ dskey : string
480
+ The data source name
481
+
482
+ """
483
+ if not dskey in self.dataSources.keys():
484
+ raise KeyError('Data Source "%s" not found' % dskey)
485
+
486
+ self.selectedDataSourceKey = dskey
487
+
488
+ #remove any keys from the filter which are not present in the data
489
+ for k in list(self.filterKeys.keys()):
490
+ if not k in self.selectedDataSource.keys():
491
+ self.filterKeys.pop(k)
492
+
493
+ self.Rebuild()
494
+
495
+ def new_ds_name(self, stub, return_count=False):
496
+ """
497
+ Generate a name for a new, unused, pipeline step output based on a stub
498
+
499
+ FIXME - should this be in ModuleCollection instead?
500
+ FIXME - should this use recipe.outputs as well?
501
+
502
+ Parameters
503
+ ----------
504
+ stub - string to start the name with
505
+
506
+ Returns
507
+ -------
508
+
509
+ """
510
+ count = 0
511
+ pattern = stub + '%d'
512
+
513
+ name = pattern % count
514
+ while name in self.dataSources.keys():
515
+ count += 1
516
+ name = pattern % count
517
+
518
+ if return_count:
519
+ return name, count
520
+
521
+ return name
522
+
523
+ def _get_session_datasources(self):
524
+ """
525
+ Return a dictionary of datasources which are suitable for listing in a session file
526
+
527
+ """
528
+ from PYME import pyme_warnings as warnings
529
+ out = {}
530
+ for k in self.recipe.inferred_data:
531
+ ds = self.dataSources[k]
532
+
533
+ if hasattr(ds, 'filename'):
534
+ fn = ds.filename
535
+
536
+ q = getattr(ds, 'query', None)
537
+ if q:
538
+ fn += '?' + q
539
+
540
+ out[k] = fn
541
+ else:
542
+ #logger.error('Data source %s has no filename, skipping. Session will be incomplete.' % k)
543
+ if not warnings.warn('Data source %s has no filename, skipping. Session will be incomplete.' % k, allow_cancel=True):
544
+ raise RuntimeError('Session save cancelled')
545
+
546
+ return out
547
+
548
+ def get_session(self):
549
+ """
550
+ Return a dictionary of the current session
551
+
552
+ """
553
+ return {'datasources': self._get_session_datasources(),
554
+ 'recipe': self.recipe.get_cleaned_module_list(),
555
+ 'selected_datasource': self.selectedDataSourceKey}
556
+
557
+ def addColumn(self, name, values, default = 0):
558
+ """
559
+ Adds a column to the currently selected data source. Attempts to guess whether the size matches the input or
560
+ the output, and adds padding values appropriately if it matches the output.
561
+
562
+ Parameters
563
+ ----------
564
+ name : str
565
+ The column name
566
+ values : array like
567
+ The values
568
+ default : float
569
+ The default value to pad with if we've given an output-sized array
570
+
571
+ """
572
+ import warnings
573
+ warnings.warn('Deprecated. You should not add columns to the pipeline as this injects data and is not captured by the recipe', DeprecationWarning)
574
+
575
+ ds_len = len(self.selectedDataSource[self.selectedDataSource.keys()[0]])
576
+ val_len = len(values)
577
+
578
+ if val_len == ds_len:
579
+ #length matches the length of our input data source - do a simple add
580
+ self.selectedDataSource.addColumn(name, values)
581
+ elif val_len == len(self[self.keys()[0]]):
582
+
583
+ col_index = self.colourFilter.index
584
+
585
+ idx = np.copy(self.filter.Index)
586
+ idx[self.filter.Index] = col_index
587
+
588
+ ds_vals = np.zeros(ds_len) + default
589
+ ds_vals[idx] = np.array(values)
590
+
591
+ self.selectedDataSource.addColumn(name, ds_vals)
592
+ else:
593
+ raise RuntimeError("Length of new column doesn't match either the input or output lengths")
594
+
595
+ def addDataSource(self, dskey, ds, add_missing_vars=True):
596
+ """
597
+ Add a new data source
598
+
599
+ Parameters
600
+ ----------
601
+ dskey : str
602
+ The name of the new data source
603
+ ds : an tabular.inputFilter derived class
604
+ The new data source
605
+
606
+ """
607
+ #check that we have a suitable object - note that this could potentially be relaxed
608
+ assert isinstance(ds, tabular.TabularBase)
609
+
610
+ if not isinstance(ds, tabular.MappingFilter):
611
+ #wrap with a mapping filter
612
+ ds = tabular.MappingFilter(ds)
613
+
614
+ #add keys which might not already be defined
615
+ if add_missing_vars:
616
+ _add_missing_ds_keys(ds,self.ev_mappings)
617
+
618
+ if getattr(ds, 'mdh', None) is None:
619
+ try:
620
+ ds.mdh = self.mdh
621
+ except AttributeError:
622
+ logger.error('No metadata defined in pipeline')
623
+ pass
624
+
625
+ self.dataSources[dskey] = ds
626
+
627
+
628
+
629
+ def Rebuild(self, **kwargs):
630
+ """
631
+ Rebuild the pipeline. Called when the selected data source is changed/modified and/or the filter is changed.
632
+
633
+ """
634
+ for s in self.dataSources.values():
635
+ if 'setMapping' in dir(s):
636
+ #keep raw measurements available
637
+ s.setMapping('x_raw', 'x')
638
+ s.setMapping('y_raw', 'y')
639
+
640
+ if 'z' in s.keys():
641
+ s.setMapping('z_raw', 'z')
642
+
643
+ if not self.selectedDataSource is None:
644
+ if not self.mapping is None:
645
+ # copy any mapping we might have made across to the new mapping filter (should fix drift correction)
646
+ # TODO - make drift correction a recipe module so that we don't need this code. Long term we should be
647
+ # ditching the mapping filter here.
648
+ old_mapping = self.mapping
649
+ self.mapping = tabular.MappingFilter(self.selectedDataSource)
650
+ self.mapping.mappings.update(old_mapping.mappings)
651
+ else:
652
+ self.mapping = tabular.MappingFilter(self.selectedDataSource)
653
+
654
+ #the filter, however needs to be re-generated with new keys and or data source
655
+ self.filter = tabular.ResultsFilter(self.mapping, **self.filterKeys)
656
+
657
+ #we can also recycle the colour filter
658
+ if self.colourFilter is None:
659
+ self.colourFilter = tabular.ColourFilter(self.filter)
660
+ else:
661
+ self.colourFilter.resultsSource = self.filter
662
+
663
+ #self._process_colour()
664
+
665
+ self.ready = True
666
+
667
+ self.ClearGenerated()
668
+
669
+ def ClearGenerated(self):
670
+ self.Triangles = None
671
+ self.edb = None
672
+ self.GeneratedMeasures = {}
673
+ self.Quads = None
674
+
675
+ self.onRebuild.send_robust(sender=self)
676
+
677
+ #check to see if any of the keys have changed - if so, fire a keys changed event so the GUI can update
678
+ newKeys = self.keys()
679
+ if not newKeys == self._keys:
680
+ self.onKeysChanged.send_robust(sender=self)
681
+
682
+ def CloseFiles(self):
683
+ while len(self.filesToClose) > 0:
684
+ self.filesToClose.pop().close()
685
+
686
+ def _ds_from_file(self, filename, **kwargs):
687
+ """
688
+ loads a data set from a file
689
+
690
+ Parameters
691
+ ----------
692
+ filename : str
693
+ kwargs : any additional arguments (see OpenFile)
694
+
695
+ Returns
696
+ -------
697
+ ds : tabular.TabularBase
698
+ the datasource, complete with metadatahandler and events if found.
699
+
700
+ """
701
+ from PYME.IO import unifiedIO # TODO - what is the launch time penalty here for importing clusterUI and finding a nameserver?
702
+
703
+ mdh = MetaDataHandler.NestedClassMDHandler()
704
+ events = None
705
+
706
+ # load from file(/cluster, downloading a copy of the file if needed)
707
+ _original_filename = filename
708
+ #TODO - move unifiedIO call down into recipe IO
709
+ with unifiedIO.local_or_temp_filename(filename) as filename:
710
+ # TODO - check that loading isn't lazy (i.e. we need to make a copy of data in memory whilst in the
711
+ # context manager in order to be safe with unifiedIO and cluster data). From a quick look, it would seem
712
+ # that _ds_from_file() copies the data, but potentially keeps the file open which could be problematic.
713
+ # This won't effect local file loading even if loading is lazy (i.e. shouldn't cause a regression)
714
+
715
+ fn, query = filename.split('?', 1) if '?' in filename else (filename, '')
716
+ ext = os.path.splitext(fn)[1]
717
+
718
+ if ext == '.h5r':
719
+ import tables
720
+ h5f = tables.open_file(filename)
721
+ self.filesToClose.append(h5f)
722
+
723
+ h5r_tables = self.recipe._get_tables_from_hdf5(filename, h5f=h5f)
724
+
725
+ try:
726
+ driftDS = h5r_tables['DriftResults']
727
+ self.driftInputMapping = tabular.MappingFilter(driftDS)
728
+ self.addDataSource('Fiducials', self.driftInputMapping)
729
+ except KeyError:
730
+ logger.debug('No drift data found')
731
+ driftDS = None
732
+
733
+ try:
734
+ ds = h5r_tables['FitResults']
735
+ except KeyError:
736
+ logger.exception('No FitResults table found')
737
+ if driftDS is not None:
738
+ ds = driftDS
739
+ logger.debug('Using fiducial data as localisations')
740
+ else:
741
+ raise
742
+
743
+ # really old files might not have metadata, so test for it before assuming
744
+ if 'MetaData' in h5f.root:
745
+ mdh = MetaDataHandler.HDFMDHandler(h5f)
746
+
747
+ if ('Events' in h5f.root) and ('StartTime' in mdh.keys()):
748
+ events = h5f.root.Events[:]
749
+
750
+ elif ext == '.hdf':
751
+ #recipe output - handles generically formatted .h5
752
+ import tables
753
+ h5f = tables.open_file(filename)
754
+ self.filesToClose.append(h5f)
755
+
756
+ #defer our IO to the recipe IO method - TODO - do this for other file types as well
757
+ self.recipe._inject_tables_from_hdf5('', filename, '.hdf', h5f=h5f)
758
+ #self.recipe.load_inputs({'':)
759
+
760
+ for dsname, ds_ in self.dataSources.items():
761
+ #loop through tables until we get one which defines x. If no table defines x, take the last table to be added
762
+ #TODO make this logic better.
763
+ ds = ds_
764
+ if 'x' in ds.keys():
765
+ # TODO - get rid of some of the grossness here
766
+ mdh = getattr(ds, 'mdh', mdh)
767
+ events = getattr(ds, 'events', events)
768
+ break
769
+
770
+ else:
771
+ self.recipe._load_input(filename, 'FitResults', default_to_image=False, args=kwargs)
772
+ ds = self.dataSources['FitResults']
773
+
774
+
775
+ # make sure mdh is writable (file-based might not be)
776
+ ds.mdh = MetaDataHandler.NestedClassMDHandler(mdToCopy=mdh)
777
+ if events is not None:
778
+ # only set the .events attribute if we actually have events.
779
+ # ensure that events are sorted in increasing time order
780
+ ds.events = events[np.argsort(events['Time'])]
781
+
782
+ ds.filename = _original_filename # store the original filename / URI so that we can use it for saving sessions later.
783
+ return ds
784
+
785
+ def _clear_session(self, clobber_recipe=True):
786
+ #close any files we had open previously
787
+ while len(self.filesToClose) > 0:
788
+ self.filesToClose.pop().close()
789
+
790
+ # clear our state
791
+ # nb - equivalent to clearing recipe namespace
792
+ self.dataSources.clear()
793
+
794
+ if clobber_recipe:
795
+ # clear any processing modules from the pipeline
796
+ # call with clobber_recipe = False in a 'Open a new file with the processing pipeline I've set up' use case
797
+ # TODO: Add an "File-->Open [preserving recipe]" menu option or similar
798
+ self.recipe.modules = []
799
+
800
+ if 'zm' in dir(self):
801
+ del self.zm
802
+
803
+ self.filter = None
804
+ self.mapping = None
805
+ self.colourFilter = None
806
+ self.events = None
807
+
808
+ def load_session(self, session_info):
809
+ self._clear_session()
810
+
811
+ self.load_extra_datasources(**session_info['datasources'])
812
+ self.recipe._update_from_module_list(session_info['recipe'])
813
+ self.recipe.execute()
814
+
815
+ self.selectDataSource(session_info['selected_datasource'])
816
+
817
+ self.Rebuild()
818
+
819
+ def _create_default_recipe(self, pixel_size= 1.0, ds_keys = []):
820
+ from PYME.recipes.localisations import ProcessColour, Pipelineify
821
+ from PYME.recipes.tablefilters import FilterTable
822
+
823
+ add_pipeline_variables = Pipelineify(self.recipe,
824
+ inputFitResults='FitResults',
825
+ pixelSizeNM=pixel_size, #kwargs.get('PixelSize', 1.),
826
+ outputLocalizations='Localizations',
827
+ outputEventMaps= 'event_maps')
828
+ self.recipe.add_module(add_pipeline_variables)
829
+
830
+ #self._get_dye_ratios_from_metadata()
831
+
832
+ colour_mapper = ProcessColour(self.recipe, input='Localizations', output='colour_mapped')
833
+ self.recipe.add_module(colour_mapper)
834
+ self.recipe.add_module(FilterTable(self.recipe, inputName='colour_mapped', outputName='filtered_localizations', filters={k:list(v) for k, v in self.filterKeys.items() if k in ds_keys}))
835
+
836
+
837
+ def OpenFile(self, filename= '', ds = None, clobber_recipe=True, create_default_recipe=None, **kwargs):
838
+ """Open a file - accepts optional keyword arguments for use with files
839
+ saved as .txt and .mat. These are:
840
+
841
+ FieldNames: a list of names for the fields in the text file or
842
+ matlab variable.
843
+ VarName: the name of the variable in the .mat file which
844
+ contains the data.
845
+ SkipRows: Number of header rows to skip for txt file data
846
+
847
+ PixelSize: Pixel size if not in nm
848
+
849
+ """
850
+ self._clear_session(clobber_recipe=clobber_recipe)
851
+
852
+ self.filename = filename
853
+
854
+ if ds is None:
855
+ ds = self._ds_from_file(filename, **kwargs)
856
+ self.events = getattr(ds, 'events', None)
857
+ #self.mdh.copyEntriesFrom(ds.mdh)
858
+
859
+ # skip the MappingFilter wrapping, etc. in self.addDataSource and add this datasource as-is
860
+ self.dataSources['FitResults'] = ds
861
+
862
+ # Fit module specific filter settings
863
+ # TODO - put all the defaults here and use a local variable rather than in __init__ (self.filterKeys is largely an artifact of pre-recipe based pipeline)
864
+ if 'Analysis.FitModule' in ds.mdh.getEntryNames():
865
+ fitModule = ds.mdh['Analysis.FitModule']
866
+ if 'Interp' in fitModule:
867
+ self.filterKeys['A'] = (5, 100000)
868
+ if fitModule == 'SplitterShiftEstFR':
869
+ self.filterKeys['fitError_dx'] = (0, 10)
870
+ self.filterKeys['fitError_dy'] = (0, 10)
871
+
872
+ if create_default_recipe is None:
873
+ create_default_recipe = clobber_recipe
874
+
875
+ if create_default_recipe:
876
+ self._create_default_recipe(pixel_size=kwargs.get('PixelSize', 1.0), ds_keys = ds.keys())
877
+ else:
878
+ logger.warn('Opening file without clobbering recipe, filter and ratiometric colour settings might not be handled properly')
879
+ # FIXME - should we update filter keys and/or make the filter more robust
880
+ # FIXME - do we need to do anything about colour settings?
881
+
882
+ self.recipe.execute()
883
+ self.filterKeys = {}
884
+ if 'filtered_localizations' in self.dataSources.keys():
885
+ self.selectDataSource('filtered_localizations') #NB - this rebuilds the pipeline
886
+ else:
887
+ # TODO - replace / remove this fallback with something better. This is currently required
888
+ # when we use/abuse the pipeline in dh5view, but that should ideally be replaced with
889
+ # something cleaner. This (and case above) should probably also be conditional on `clobber_recipe`
890
+ # as if opening with an existing recipe we would likely want to keep selectedDataSource constant as well.
891
+ self.selectDataSource('FitResults')
892
+
893
+ # Retrieve or estimate image bounds
894
+ # if False: # 'imgBounds' in kwargs.keys():
895
+ # # TODO - why is this disabled? Current usage would appear to be when opening from LMAnalysis
896
+ # # during real-time localization, to force image bounds to match raw data, but also potentially useful
897
+ # # for other scenarios where metadata is not fully present.
898
+ # self.imageBounds = kwargs['imgBounds']
899
+ # elif ('scanx' not in self.selectedDataSource.keys() or 'scany' not in self.selectedDataSource.keys()) and 'Camera.ROIWidth' in self.mdh.getEntryNames():
900
+ # self.imageBounds = ImageBounds.extractFromMetadata(self.mdh)
901
+ # else:
902
+ # self.imageBounds = ImageBounds.estimateFromSource(self.selectedDataSource)
903
+
904
+ #self._process_colour()
905
+
906
+ @property
907
+ def ev_mappings(self):
908
+ try:
909
+ return self.dataSources['event_maps']
910
+ except KeyError:
911
+ logger.exception('No event mappings found')
912
+ return {}
913
+
914
+ @property
915
+ def eventCharts(self):
916
+ charts = []
917
+ if 'zm' in self.ev_mappings:
918
+ charts.append(('Focus [um]', self.ev_mappings['zm'], b'ProtocolFocus'))
919
+ elif 'z_command' in self.ev_mappings:
920
+ charts.append(('Focus [um]', self.ev_mappings['z_command'], b'ProtocolFocus'))
921
+
922
+ if 'xm' in self.ev_mappings:
923
+ charts.append(('XPos [um]', self.ev_mappings['xm'], 'ScannerXPos'))
924
+
925
+ if 'ym' in self.ev_mappings:
926
+ charts.append(('YPos [um]', self.ev_mappings['ym'], 'ScannerYPos'))
927
+
928
+ if 'driftx' in self.ev_mappings:
929
+ charts.append(('X Drift [px]', self.ev_mappings['driftx'], 'ShiftMeasure'))
930
+ charts.append(('Y Drift [px]', self.ev_mappings['drifty'], 'ShiftMeasure'))
931
+ charts.append(('Z Drift [px]', self.ev_mappings['driftz'], 'ShiftMeasure'))
932
+
933
+
934
+ return charts
935
+
936
+
937
+ def load_extra_datasources(self, **kwargs):
938
+ ''' Load additional input data files into the pipeline.
939
+
940
+ Takes keyword arguments with the following format:
941
+ namespace_key=filename
942
+
943
+ e.g.
944
+ load_extra_datadources(fitResults='fitResults.mat', drift='drift.mat')
945
+ '''
946
+
947
+ self.recipe.load_inputs(kwargs)
948
+
949
+
950
+ @property
951
+ def colour_mapper(self):
952
+ """ Search for a colour mapper rather than use a hard coded reference - allows loading of saved pipelines with colour mapping"""
953
+ from PYME.recipes.localisations import ProcessColour
954
+
955
+ # find ProcessColour instance(s) in the pipeline
956
+ mappers = [m for m in self.recipe.modules if isinstance(m, ProcessColour)]
957
+
958
+ if len(mappers) > 0:
959
+ #return the first mapper we find
960
+ return mappers[0]
961
+
962
+ else:
963
+ return None
964
+
965
+ def OpenChannel(self, filename='', ds=None, channel_name='', **kwargs):
966
+ """Open a file - accepts optional keyword arguments for use with files
967
+ saved as .txt and .mat. These are:
968
+
969
+ FieldNames: a list of names for the fields in the text file or
970
+ matlab variable.
971
+ VarName: the name of the variable in the .mat file which
972
+ contains the data.
973
+ SkipRows: Number of header rows to skip for txt file data
974
+
975
+ PixelSize: Pixel size if not in nm
976
+
977
+ """
978
+ if channel_name == '' or channel_name is None:
979
+ #select a channel name automatically
980
+ channel_name = 'Channel%d' % self._extra_chan_num
981
+ self._extra_chan_num += 1
982
+
983
+ if ds is None:
984
+ #load from file
985
+ ds = self._ds_from_file(filename, **kwargs)
986
+
987
+ #wrap the data source with a mapping so we can fiddle with things
988
+ #e.g. combining z position and focus
989
+ mapped_ds = tabular.MappingFilter(ds)
990
+
991
+ if 'PixelSize' in kwargs.keys():
992
+ mapped_ds.addVariable('pixelSize', kwargs['PixelSize'])
993
+ mapped_ds.setMapping('x', 'x*pixelSize')
994
+ mapped_ds.setMapping('y', 'y*pixelSize')
995
+
996
+
997
+ self.addDataSource(channel_name, mapped_ds)
998
+
999
+
1000
+
1001
+ def _process_colour(self):
1002
+ """
1003
+ Locate any colour / channel information and munge it into a format that the colourFilter understands.
1004
+
1005
+ We currently accept 3 ways of specifying channels:
1006
+
1007
+ - ratiometric colour, where 'gFrac' is defined to be the ratio between our observation channels
1008
+ - defining a 'probe' column in the input data which gives a channel index for each point
1009
+ - specifying colour ranges in the metadata
1010
+
1011
+ All of these get munged into the p_dye type entries that the colour filter needs.
1012
+
1013
+ """
1014
+ #clear out old colour keys
1015
+ warnings.warn(DeprecationWarning('This should not be called (colour now handled by the ProcessColour recipe module)'))
1016
+ for k in self.mapping.mappings.keys():
1017
+ if k.startswith('p_'):
1018
+ self.mapping.mappings.pop(k)
1019
+
1020
+ if 'gFrac' in self.selectedDataSource.keys():
1021
+ #ratiometric
1022
+ for structure, ratio in self.fluorSpecies.items():
1023
+ if not ratio is None:
1024
+ self.mapping.setMapping('p_%s' % structure, 'exp(-(%f - gFrac)**2/(2*error_gFrac**2))/(error_gFrac*sqrt(2*numpy.pi))' % ratio)
1025
+ else:
1026
+ if 'probe' in self.mapping.keys():
1027
+ #non-ratiometric (i.e. sequential) colour
1028
+ #color channel is given in 'probe' column
1029
+ self.mapping.setMapping('ColourNorm', '1.0 + 0*probe')
1030
+
1031
+ for i in range(int(self.mapping['probe'].min()), int(self.mapping['probe'].max() + 1)):
1032
+ self.mapping.setMapping('p_chan%d' % i, '1.0*(probe == %d)' % i)
1033
+
1034
+ nSeqCols = self.mdh.getOrDefault('Protocol.NumberSequentialColors', 1)
1035
+ if nSeqCols > 1:
1036
+ for i in range(nSeqCols):
1037
+ self.mapping.setMapping('ColourNorm', '1.0 + 0*t')
1038
+ cr = self.mdh['Protocol.ColorRange%d' % i]
1039
+ self.mapping.setMapping('p_chan%d' % i, '(t>= %d)*(t<%d)' % cr)
1040
+
1041
+ #self.ClearGenerated()
1042
+
1043
+
1044
+ def _get_dye_ratios_from_metadata(self):
1045
+ warnings.warn(DeprecationWarning('This should not be called (colour now handled by the ProcessColour recipe module)'))
1046
+ labels = self.mdh.getOrDefault('Sample.Labelling', [])
1047
+ seen_structures = []
1048
+
1049
+ for structure, dye in labels:
1050
+ if structure in seen_structures:
1051
+ strucname = structure + '_1'
1052
+ else:
1053
+ strucname = structure
1054
+ seen_structures.append(structure)
1055
+
1056
+ ratio = dyeRatios.getRatio(dye, self.mdh)
1057
+
1058
+ if not ratio is None:
1059
+ self.fluorSpecies[strucname] = ratio
1060
+ self.fluorSpeciesDyes[strucname] = dye
1061
+ #self.mapping.setMapping('p_%s' % structure, '(1.0/(ColourNorm*2*numpy.pi*fitError_Ag*fitError_Ar))*exp(-(fitResults_Ag - %f*A)**2/(2*fitError_Ag**2) - (fitResults_Ar - %f*A)**2/(2*fitError_Ar**2))' % (ratio, 1-ratio))
1062
+ #self.mapping.setMapping('p_%s' % structure, 'exp(-(%f - gFrac)**2/(2*error_gFrac**2))/(error_gFrac*sqrt(2*numpy.pi))' % ratio)
1063
+
1064
+
1065
+ def getNeighbourDists(self, forceRetriang = False):
1066
+ from PYME.LMVis import visHelpers
1067
+
1068
+ if forceRetriang or not 'neighbourDistances' in self.GeneratedMeasures.keys():
1069
+ statNeigh = statusLog.StatusLogger("Calculating mean neighbour distances ...")
1070
+ self.GeneratedMeasures['neighbourDistances'] = np.array(visHelpers.calcNeighbourDists(self.getTriangles(forceRetriang)))
1071
+
1072
+ return self.GeneratedMeasures['neighbourDistances']
1073
+
1074
+ def getTriangles(self, recalc = False):
1075
+ from matplotlib import tri
1076
+
1077
+ if self.Triangles is None or recalc:
1078
+ statTri = statusLog.StatusLogger("Generating Triangulation ...")
1079
+ self.Triangles = tri.Triangulation(self.colourFilter['x'] + .1*np.random.normal(size=len(self.colourFilter['x'])), self.colourFilter['y']+ .1*np.random.normal(size=len(self.colourFilter['x'])))
1080
+
1081
+ #reset things which will have changed
1082
+ self.edb = None
1083
+ try:
1084
+ self.GeneratedMeasures.pop('neighbourDistances')
1085
+ except KeyError:
1086
+ pass
1087
+
1088
+ return self.Triangles
1089
+
1090
+ def getEdb(self):
1091
+ from PYME.Analysis.points.EdgeDB import edges
1092
+ if self.edb is None:
1093
+ self.edb = edges.EdgeDB(self.getTriangles())
1094
+
1095
+ return self.edb
1096
+
1097
+ def getBlobs(self):
1098
+ from PYME.Analysis.points.EdgeDB import edges
1099
+
1100
+ tri = self.getTriangles()
1101
+ edb = self.getEdb()
1102
+
1103
+
1104
+ if self.blobSettings.jittering == 0:
1105
+ self.objIndices = edges.objectIndices(edb.segment(self.blobSettings.distThreshold), self.blobSettings.minSize)
1106
+ self.objects = [np.vstack((tri.x[oi], tri.y[oi])).T for oi in self.objIndices]
1107
+ else:
1108
+ from matplotlib import tri
1109
+
1110
+ ndists = self.getNeighbourDists()
1111
+
1112
+ x_ = np.hstack([self['x'] + 0.5*ndists*np.random.normal(size=ndists.size) for i in range(self.blobSettings.jittering)])
1113
+ y_ = np.hstack([self['y'] + 0.5*ndists*np.random.normal(size=ndists.size) for i in range(self.blobSettings.jittering)])
1114
+
1115
+ T = tri.Triangulation(x_, y_)
1116
+ edb = edges.EdgeDB(T)
1117
+
1118
+ objIndices = edges.objectIndices(edb.segment(self.blobSettings.distThreshold), self.blobSettings.minSize)
1119
+ self.objects = [np.vstack((T.x[oi], T.y[oi])).T for oi in objIndices]
1120
+
1121
+ return self.objects, self.blobSettings.distThreshold
1122
+
1123
+ def GenQuads(self, max_leaf_size=10):
1124
+ from PYME.Analysis.points.QuadTree import pointQT
1125
+
1126
+ di = max(self.imageBounds.x1 - self.imageBounds.x0,
1127
+ self.imageBounds.y1 - self.imageBounds.y0)
1128
+
1129
+ numPixels = di/self.QTGoalPixelSize
1130
+
1131
+ di = self.QTGoalPixelSize*2**np.ceil(np.log2(numPixels))
1132
+
1133
+
1134
+ self.Quads = pointQT.qtRoot(self.imageBounds.x0, self.imageBounds.x0+di,
1135
+ self.imageBounds.y0, self.imageBounds.y0 + di)
1136
+
1137
+ for xi, yi in zip(self['x'],self['y']):
1138
+ self.Quads.insert(pointQT.qtRec(xi,yi, None), max_leaf_size)
1139
+
1140
+ def measureObjects(self):
1141
+ from PYME.Analysis.points import objectMeasure
1142
+
1143
+ self.objectMeasures = objectMeasure.measureObjects(self.objects, self.objThreshold)
1144
+
1145
+ return self.objectMeasures
1146
+
1147
+ def save_txt(self, outFile, keys=None):
1148
+ if outFile.endswith('.csv'):
1149
+ delim = ', '
1150
+ else:
1151
+ delim = '\t'
1152
+
1153
+ if keys is None:
1154
+ keys = self.keys()
1155
+
1156
+ #nRecords = len(ds[keys[0]])
1157
+
1158
+ of = open(outFile, 'w')
1159
+
1160
+ of.write('#' + delim.join(['%s' % k for k in keys]) + '\n')
1161
+
1162
+ for row in zip(*[self[k] for k in keys]):
1163
+ of.write(delim.join(['%e' % c for c in row]) + '\n')
1164
+
1165
+ of.close()
1166
+
1167
+ def save_hdf(self, filename):
1168
+ self.colourFilter.to_hdf(filename, tablename='Localizations', metadata=self.mdh)
1169
+
1170
+ def to_recarray(self, keys=None):
1171
+ return self.colourFilter.to_recarray(keys=keys)
1172
+
1173
+ def toDataFrame(self, keys=None):
1174
+ import pandas as pd
1175
+ if keys is None:
1176
+ keys = self.keys()
1177
+
1178
+ d = {k: self[k] for k in keys}
1179
+
1180
+ return pd.DataFrame(d)
1181
+
1182
+ @property
1183
+ def dtypes(self):
1184
+ return {k: str(self[k, :2].dtype) for k in self.keys()}
1185
+
1186
+ def _repr_html_(self):
1187
+ import jinja2
1188
+ TEMPLATE = """
1189
+ <h3> LMVis.pipeline.Pipeline viewing {{ pipe.filename }} </h3>
1190
+ <br>
1191
+ {{ recipe_svg }}
1192
+ <b> Data Sources: </b> {% for k in pipe.dataSources.keys() %} {% if k != pipe.selectedDataSourceKey %} {{ k }} - [{{ pipe.dataSources[k]|length }} evts], {% endif %} {% endfor %} <b> {{ pipe.selectedDataSourceKey }} - [{{ pipe.dataSources[pipe.selectedDataSourceKey]|length }} evts]</b>
1193
+ <br>
1194
+ <b> Columns: </b> {{ grouped_keys }}
1195
+ """
1196
+
1197
+ try:
1198
+ svg = self.recipe.to_svg()
1199
+ except:
1200
+ svg = None
1201
+
1202
+ fr_keys = []
1203
+ fe_keys = []
1204
+ sl_keys = []
1205
+ st_keys = []
1206
+
1207
+ for k in self.keys():
1208
+ if k.startswith('fitResults'):
1209
+ fr_keys.append(k)
1210
+ elif k.startswith('fitError'):
1211
+ fe_keys.append(k)
1212
+ elif k.startswith('slicesUsed'):
1213
+ sl_keys.append(k)
1214
+ else:
1215
+ st_keys.append(k)
1216
+
1217
+ grouped_keys = sorted(st_keys) + sorted(fr_keys) + sorted(fe_keys) + sorted(sl_keys)
1218
+
1219
+ return jinja2.Template(TEMPLATE).render(pipe=self, recipe_svg = svg, grouped_keys=', '.join(grouped_keys))
1220
+
1221
+
1222
+
1223
+
1224
+
1225
+
1226
+
1227
+