python-microscopy 25.11.20__cp313-cp313-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1278) hide show
  1. PYME/Acquire/ActionManager.py +450 -0
  2. PYME/Acquire/ExecTools.py +235 -0
  3. PYME/Acquire/Hardware/AAOptoelectronics/MDS.py +175 -0
  4. PYME/Acquire/Hardware/AAOptoelectronics/__init__.py +0 -0
  5. PYME/Acquire/Hardware/ARCoptix/__init__.py +0 -0
  6. PYME/Acquire/Hardware/ARCoptix/lcdriver.py +149 -0
  7. PYME/Acquire/Hardware/ARCoptix/lcserver32.py +123 -0
  8. PYME/Acquire/Hardware/AndorIXon/AndorCam.py +1095 -0
  9. PYME/Acquire/Hardware/AndorIXon/AndorControlFrame.py +312 -0
  10. PYME/Acquire/Hardware/AndorIXon/AndorIXon.py +737 -0
  11. PYME/Acquire/Hardware/AndorIXon/__init__.py +27 -0
  12. PYME/Acquire/Hardware/AndorNeo/AndorNeo.py +644 -0
  13. PYME/Acquire/Hardware/AndorNeo/AndorNeoControlFrame.py +161 -0
  14. PYME/Acquire/Hardware/AndorNeo/AndorZyla.py +761 -0
  15. PYME/Acquire/Hardware/AndorNeo/SDK3.py +307 -0
  16. PYME/Acquire/Hardware/AndorNeo/SDK3Cam.py +171 -0
  17. PYME/Acquire/Hardware/AndorNeo/ZylaControlPanel.py +105 -0
  18. PYME/Acquire/Hardware/AndorNeo/__init__.py +22 -0
  19. PYME/Acquire/Hardware/AndorNeo/parseAtdebug.py +46 -0
  20. PYME/Acquire/Hardware/AndorNeo/plotTimings.py +73 -0
  21. PYME/Acquire/Hardware/AndorNeo/testNeo.py +62 -0
  22. PYME/Acquire/Hardware/Camera.py +1199 -0
  23. PYME/Acquire/Hardware/CameraSkeleton.py +642 -0
  24. PYME/Acquire/Hardware/Coherent/OBIS.py +147 -0
  25. PYME/Acquire/Hardware/Coherent/Sapphire.py +162 -0
  26. PYME/Acquire/Hardware/Coherent/__init__.py +0 -0
  27. PYME/Acquire/Hardware/DMDGui.py +198 -0
  28. PYME/Acquire/Hardware/DigiData/DigiData.py +95 -0
  29. PYME/Acquire/Hardware/DigiData/DigiDataClient.py +30 -0
  30. PYME/Acquire/Hardware/DigiData/RemoteDigiData.py +51 -0
  31. PYME/Acquire/Hardware/DigiData/__init__.py +24 -0
  32. PYME/Acquire/Hardware/DigiData/axDD132x.py +348 -0
  33. PYME/Acquire/Hardware/EMCCDTheory.py +41 -0
  34. PYME/Acquire/Hardware/ExciterWheel.py +167 -0
  35. PYME/Acquire/Hardware/FilterWheel.py +184 -0
  36. PYME/Acquire/Hardware/FocCorr.py +106 -0
  37. PYME/Acquire/Hardware/FocCorrR.py +196 -0
  38. PYME/Acquire/Hardware/FrFilter.py +51 -0
  39. PYME/Acquire/Hardware/GCS/GCS_DLL.py +370 -0
  40. PYME/Acquire/Hardware/GCS/__init__.py +0 -0
  41. PYME/Acquire/Hardware/GCS/gcs.py +210 -0
  42. PYME/Acquire/Hardware/HamamatsuDCAM/HamamatsuDCAM.py +662 -0
  43. PYME/Acquire/Hardware/HamamatsuDCAM/HamamatsuORCA.py +602 -0
  44. PYME/Acquire/Hardware/HamamatsuDCAM/Hamamatsu_control_panel.py +54 -0
  45. PYME/Acquire/Hardware/HamamatsuDCAM/__init__.py +23 -0
  46. PYME/Acquire/Hardware/LaserControlFrame.py +160 -0
  47. PYME/Acquire/Hardware/MPBCommunications/MPBCW.py +132 -0
  48. PYME/Acquire/Hardware/MPBCommunications/__init__.py +0 -0
  49. PYME/Acquire/Hardware/Mercury/Mercury.py +269 -0
  50. PYME/Acquire/Hardware/Mercury/PI_Mercury_GCS_DLL.py +857 -0
  51. PYME/Acquire/Hardware/Mercury/__init__.py +22 -0
  52. PYME/Acquire/Hardware/Mercury/mercuryStepper.py +203 -0
  53. PYME/Acquire/Hardware/Mercury/mercuryStepperGCS.py +281 -0
  54. PYME/Acquire/Hardware/NikonTE2000.py +68 -0
  55. PYME/Acquire/Hardware/NikonTi.py +214 -0
  56. PYME/Acquire/Hardware/NikonTiGUI.py +81 -0
  57. PYME/Acquire/Hardware/OrielCornerstone.py +125 -0
  58. PYME/Acquire/Hardware/PM100USB.py +51 -0
  59. PYME/Acquire/Hardware/Piezos/__init__.py +22 -0
  60. PYME/Acquire/Hardware/Piezos/base_piezo.py +108 -0
  61. PYME/Acquire/Hardware/Piezos/offsetPiezo.py +162 -0
  62. PYME/Acquire/Hardware/Piezos/offsetPiezoREST.py +308 -0
  63. PYME/Acquire/Hardware/Piezos/piezo_c867.py +486 -0
  64. PYME/Acquire/Hardware/Piezos/piezo_e255.py +68 -0
  65. PYME/Acquire/Hardware/Piezos/piezo_e662.py +61 -0
  66. PYME/Acquire/Hardware/Piezos/piezo_e709.py +434 -0
  67. PYME/Acquire/Hardware/Piezos/piezo_e816.py +452 -0
  68. PYME/Acquire/Hardware/Piezos/piezo_e816_corr.py +70 -0
  69. PYME/Acquire/Hardware/Piezos/piezo_e816_dll.py +518 -0
  70. PYME/Acquire/Hardware/Piezos/piezo_e816b.py +70 -0
  71. PYME/Acquire/Hardware/Piezos/piezo_pipython_gcs.py +560 -0
  72. PYME/Acquire/Hardware/Piezos/piezo_test.py +55 -0
  73. PYME/Acquire/Hardware/Simulator/EmpiricalHist.py +273 -0
  74. PYME/Acquire/Hardware/Simulator/__init__.py +22 -0
  75. PYME/Acquire/Hardware/Simulator/dSimControl.py +961 -0
  76. PYME/Acquire/Hardware/Simulator/fakeCam.py +651 -0
  77. PYME/Acquire/Hardware/Simulator/fakePiezo.py +95 -0
  78. PYME/Acquire/Hardware/Simulator/fluor.py +336 -0
  79. PYME/Acquire/Hardware/Simulator/illuminate.cp313-win_amd64.dll.a +0 -0
  80. PYME/Acquire/Hardware/Simulator/illuminate.cp313-win_amd64.pyd +0 -0
  81. PYME/Acquire/Hardware/Simulator/illuminate.pyx +93 -0
  82. PYME/Acquire/Hardware/Simulator/lasersliders.py +90 -0
  83. PYME/Acquire/Hardware/Simulator/rend_im.py +446 -0
  84. PYME/Acquire/Hardware/Simulator/setup.py +69 -0
  85. PYME/Acquire/Hardware/Simulator/simcontrol.py +348 -0
  86. PYME/Acquire/Hardware/Simulator/simui_wx.py +794 -0
  87. PYME/Acquire/Hardware/Tango/__init__.py +0 -0
  88. PYME/Acquire/Hardware/Tango/marzhauser_tango.py +583 -0
  89. PYME/Acquire/Hardware/TiLightCrafter.py +388 -0
  90. PYME/Acquire/Hardware/__init__.py +22 -0
  91. PYME/Acquire/Hardware/aotf.py +271 -0
  92. PYME/Acquire/Hardware/arclampshutterpanel.py +71 -0
  93. PYME/Acquire/Hardware/cameraSoftwareBuffer.py +215 -0
  94. PYME/Acquire/Hardware/camera_noise.py +270 -0
  95. PYME/Acquire/Hardware/ccdAdjPanel.py +188 -0
  96. PYME/Acquire/Hardware/ccdCalibrator.py +161 -0
  97. PYME/Acquire/Hardware/cobaltLaser.py +108 -0
  98. PYME/Acquire/Hardware/cobaltLaser561.py +94 -0
  99. PYME/Acquire/Hardware/comports.py +26 -0
  100. PYME/Acquire/Hardware/driftTrackGUI.py +488 -0
  101. PYME/Acquire/Hardware/driftTracking.py +595 -0
  102. PYME/Acquire/Hardware/fakeShutters.py +52 -0
  103. PYME/Acquire/Hardware/focusKeys.py +204 -0
  104. PYME/Acquire/Hardware/focus_locks/__init__.py +0 -0
  105. PYME/Acquire/Hardware/focus_locks/reflection_focus_lock.py +684 -0
  106. PYME/Acquire/Hardware/frZStage.py +117 -0
  107. PYME/Acquire/Hardware/fw102.py +38 -0
  108. PYME/Acquire/Hardware/ids_peak_cam.py +561 -0
  109. PYME/Acquire/Hardware/ioslave.py +305 -0
  110. PYME/Acquire/Hardware/lasers.py +292 -0
  111. PYME/Acquire/Hardware/matchboxLaser.py +58 -0
  112. PYME/Acquire/Hardware/microscope_adapter.py +104 -0
  113. PYME/Acquire/Hardware/mpd_picosecond_delayer.py +395 -0
  114. PYME/Acquire/Hardware/multiview.py +287 -0
  115. PYME/Acquire/Hardware/olympusix81.py +59 -0
  116. PYME/Acquire/Hardware/pco/__init__.py +0 -0
  117. PYME/Acquire/Hardware/pco/pco_cam.py +348 -0
  118. PYME/Acquire/Hardware/pco/pco_edge_42_lt.py +34 -0
  119. PYME/Acquire/Hardware/pco/pco_sdk.py +1645 -0
  120. PYME/Acquire/Hardware/pco/pco_sdk_cam.py +518 -0
  121. PYME/Acquire/Hardware/pco/pco_sdk_cam_control_panel.py +54 -0
  122. PYME/Acquire/Hardware/phoxxLaser.py +199 -0
  123. PYME/Acquire/Hardware/phoxxLaserOLD.py +242 -0
  124. PYME/Acquire/Hardware/priorLumen.py +102 -0
  125. PYME/Acquire/Hardware/priorarclampshutter.py +52 -0
  126. PYME/Acquire/Hardware/setup.py +50 -0
  127. PYME/Acquire/Hardware/spacenav.py +148 -0
  128. PYME/Acquire/Hardware/splitter.py +394 -0
  129. PYME/Acquire/Hardware/thorlabsPiezo.py +98 -0
  130. PYME/Acquire/Hardware/thorlabs_cam.py +136 -0
  131. PYME/Acquire/Hardware/thorlabs_mff_flipper.py +400 -0
  132. PYME/Acquire/Hardware/toptica_ibeam.py +51 -0
  133. PYME/Acquire/Hardware/uc480/AndorControlFrame.py +308 -0
  134. PYME/Acquire/Hardware/uc480/__init__.py +27 -0
  135. PYME/Acquire/Hardware/uc480/uCam480.py +695 -0
  136. PYME/Acquire/Hardware/uc480/uc480.py +189 -0
  137. PYME/Acquire/Hardware/uc480/uc480Deprecated.py +87 -0
  138. PYME/Acquire/Hardware/uc480/uc480_h.py +767 -0
  139. PYME/Acquire/Hardware/uc480/uc480_h_gen.py +62 -0
  140. PYME/Acquire/Hardware/uc480/ucCamControlFrame.py +83 -0
  141. PYME/Acquire/Hardware/ueye.py +702 -0
  142. PYME/Acquire/PYMEAcquire.py +186 -0
  143. PYME/Acquire/Protocols/DMDMFM.py +74 -0
  144. PYME/Acquire/Protocols/__init__.py +22 -0
  145. PYME/Acquire/Protocols/darkCalibrate.py +56 -0
  146. PYME/Acquire/Protocols/dual671_470.py +45 -0
  147. PYME/Acquire/Protocols/dual671_488.py +46 -0
  148. PYME/Acquire/Protocols/gainCal.py +53 -0
  149. PYME/Acquire/Protocols/htsms-cal-psf.py +32 -0
  150. PYME/Acquire/Protocols/htsms-cal-registration.py +52 -0
  151. PYME/Acquire/Protocols/htsms-flow.py +29 -0
  152. PYME/Acquire/Protocols/htsms-staggered.py +31 -0
  153. PYME/Acquire/Protocols/htsms-tile.py +68 -0
  154. PYME/Acquire/Protocols/htsms-two-color.py +29 -0
  155. PYME/Acquire/Protocols/htsms-widefield.py +32 -0
  156. PYME/Acquire/Protocols/paint671.py +61 -0
  157. PYME/Acquire/Protocols/photoconversion.py +52 -0
  158. PYME/Acquire/Protocols/photoconversion2.py +55 -0
  159. PYME/Acquire/Protocols/prebleach488.py +70 -0
  160. PYME/Acquire/Protocols/prebleach490.py +69 -0
  161. PYME/Acquire/Protocols/prebleach561.py +72 -0
  162. PYME/Acquire/Protocols/prebleach561NeomEos2.py +70 -0
  163. PYME/Acquire/Protocols/prebleach561NeomEos2ND1.py +70 -0
  164. PYME/Acquire/Protocols/prebleach642.py +70 -0
  165. PYME/Acquire/Protocols/prebleach671.py +69 -0
  166. PYME/Acquire/Protocols/prebleach671ND1.py +58 -0
  167. PYME/Acquire/Protocols/prebleach671ND2.py +57 -0
  168. PYME/Acquire/Protocols/prebleach671Neo.py +69 -0
  169. PYME/Acquire/Protocols/recover671.py +62 -0
  170. PYME/Acquire/Protocols/sequence642_488.py +85 -0
  171. PYME/Acquire/Protocols/sequence642_561.py +87 -0
  172. PYME/Acquire/Protocols/shiftfield.py +198 -0
  173. PYME/Acquire/Protocols/simul488.py +59 -0
  174. PYME/Acquire/Protocols/simul642.py +63 -0
  175. PYME/Acquire/Protocols/simul642HTSMS.py +63 -0
  176. PYME/Acquire/Protocols/simulPA.py +37 -0
  177. PYME/Acquire/Protocols/simulSIM.py +76 -0
  178. PYME/Acquire/Protocols/simulStep.py +62 -0
  179. PYME/Acquire/Protocols/spdscan.py +178 -0
  180. PYME/Acquire/Protocols/standard470.py +45 -0
  181. PYME/Acquire/Protocols/standard488.py +47 -0
  182. PYME/Acquire/Protocols/standard671.py +48 -0
  183. PYME/Acquire/Protocols/standard671_no532.py +47 -0
  184. PYME/Acquire/Protocols/standardArclamp.py +46 -0
  185. PYME/Acquire/Protocols/strip_tile.py +204 -0
  186. PYME/Acquire/Protocols/tile.py +204 -0
  187. PYME/Acquire/Protocols/tile3D.py +192 -0
  188. PYME/Acquire/Protocols/tile671.py +190 -0
  189. PYME/Acquire/Protocols/tile_triggered.py +189 -0
  190. PYME/Acquire/Scripts/init.py +232 -0
  191. PYME/Acquire/Scripts/init_N1_Ti_Exeter_ZIx.py +374 -0
  192. PYME/Acquire/Scripts/init_N2_Ti_Zyla_lasers.py +290 -0
  193. PYME/Acquire/Scripts/init_Neo.py +266 -0
  194. PYME/Acquire/Scripts/init_NeoSim.py +159 -0
  195. PYME/Acquire/Scripts/init_TIRF.py +232 -0
  196. PYME/Acquire/Scripts/init_TIRF_Neo.py +242 -0
  197. PYME/Acquire/Scripts/init_TIRF_NeoO.py +241 -0
  198. PYME/Acquire/Scripts/init_TIRF_onecam.py +233 -0
  199. PYME/Acquire/Scripts/init_Ti.py +257 -0
  200. PYME/Acquire/Scripts/init_UOA_n.py +256 -0
  201. PYME/Acquire/Scripts/init_UOA_n2.py +246 -0
  202. PYME/Acquire/Scripts/init_Y1.py +249 -0
  203. PYME/Acquire/Scripts/init_Zyla.py +260 -0
  204. PYME/Acquire/Scripts/init_drift_tracking.py +80 -0
  205. PYME/Acquire/Scripts/init_emccd_basic.py +277 -0
  206. PYME/Acquire/Scripts/init_htsms.py +277 -0
  207. PYME/Acquire/Scripts/init_htsms_focus_lock.py +132 -0
  208. PYME/Acquire/Scripts/init_micrpi.py +45 -0
  209. PYME/Acquire/Scripts/init_orca.py +70 -0
  210. PYME/Acquire/Scripts/init_pco.py +49 -0
  211. PYME/Acquire/Scripts/init_rev.py +74 -0
  212. PYME/Acquire/Scripts/init_sim100.py +169 -0
  213. PYME/Acquire/Scripts/init_sim103.py +169 -0
  214. PYME/Acquire/Scripts/init_sim2.py +211 -0
  215. PYME/Acquire/Scripts/init_sim50.py +169 -0
  216. PYME/Acquire/Scripts/init_sim75.py +169 -0
  217. PYME/Acquire/Scripts/init_sim_drift_tracking.py +166 -0
  218. PYME/Acquire/Scripts/init_sim_htsms.py +224 -0
  219. PYME/Acquire/Scripts/init_sim_htsms_n.py +233 -0
  220. PYME/Acquire/Scripts/init_sim_main.py +229 -0
  221. PYME/Acquire/Scripts/init_sim_min.py +197 -0
  222. PYME/Acquire/Scripts/init_sim_rem.py +176 -0
  223. PYME/Acquire/Scripts/init_smi1.py +110 -0
  224. PYME/Acquire/Scripts/init_spectro.py +78 -0
  225. PYME/Acquire/Scripts/init_spim.py +116 -0
  226. PYME/Acquire/Scripts/init_thorcam.py +62 -0
  227. PYME/Acquire/Scripts/init_twophoton.py +112 -0
  228. PYME/Acquire/Scripts/init_uc480.py +262 -0
  229. PYME/Acquire/Scripts/init_ueye.py +261 -0
  230. PYME/Acquire/SpoolController.py +958 -0
  231. PYME/Acquire/Utils/MultiPointScanner.py +80 -0
  232. PYME/Acquire/Utils/__init__.py +13 -0
  233. PYME/Acquire/Utils/failsafe.py +157 -0
  234. PYME/Acquire/Utils/fastTiler.py +153 -0
  235. PYME/Acquire/Utils/pointScanner.py +496 -0
  236. PYME/Acquire/Utils/sarcSpacing.py +86 -0
  237. PYME/Acquire/Utils/strip_tiler.py +93 -0
  238. PYME/Acquire/Utils/tiler.py +464 -0
  239. PYME/Acquire/Utils/vibrationAnalysis.py +65 -0
  240. PYME/Acquire/__init__.py +44 -0
  241. PYME/Acquire/acquire_client.py +90 -0
  242. PYME/Acquire/acquire_server.py +316 -0
  243. PYME/Acquire/acquirebase.py +139 -0
  244. PYME/Acquire/acquiremainframe.py +716 -0
  245. PYME/Acquire/acquirewx.py +61 -0
  246. PYME/Acquire/acquisition_base.py +148 -0
  247. PYME/Acquire/actions.py +209 -0
  248. PYME/Acquire/autofocus.py +54 -0
  249. PYME/Acquire/eventLog.py +95 -0
  250. PYME/Acquire/event_loop.py +119 -0
  251. PYME/Acquire/frameWrangler.py +530 -0
  252. PYME/Acquire/htsms/__init__.py +8 -0
  253. PYME/Acquire/htsms/rule_ui.py +970 -0
  254. PYME/Acquire/htsms/rule_ui_v2.py +573 -0
  255. PYME/Acquire/htsms/tweeter.py +222 -0
  256. PYME/Acquire/microscope.py +1050 -0
  257. PYME/Acquire/positionTracker.py +181 -0
  258. PYME/Acquire/protocol.py +299 -0
  259. PYME/Acquire/protocol_acquisition.py +404 -0
  260. PYME/Acquire/sampleInformation.py +591 -0
  261. PYME/Acquire/sampleInformationDjangoDirect.py +446 -0
  262. PYME/Acquire/setup.py +52 -0
  263. PYME/Acquire/stackSettings.py +295 -0
  264. PYME/Acquire/stage_leveling.py +285 -0
  265. PYME/Acquire/ui/AnalysisSettingsUI.py +184 -0
  266. PYME/Acquire/ui/HDFSpoolFrame.py +584 -0
  267. PYME/Acquire/ui/__init__.py +0 -0
  268. PYME/Acquire/ui/actionUI.py +892 -0
  269. PYME/Acquire/ui/focus_lock_gui.py +149 -0
  270. PYME/Acquire/ui/intensity_trace.py +143 -0
  271. PYME/Acquire/ui/intsliders.py +222 -0
  272. PYME/Acquire/ui/lasersliders.py +329 -0
  273. PYME/Acquire/ui/mpd_picosecond_delay_panel.py +69 -0
  274. PYME/Acquire/ui/multiview_select.py +77 -0
  275. PYME/Acquire/ui/positionUI.py +519 -0
  276. PYME/Acquire/ui/preflight.py +58 -0
  277. PYME/Acquire/ui/scanner_panel.py +41 -0
  278. PYME/Acquire/ui/selectCameraPanel.py +46 -0
  279. PYME/Acquire/ui/seqdialog.py +501 -0
  280. PYME/Acquire/ui/splashScreen.py +175 -0
  281. PYME/Acquire/ui/spool_panel.py +830 -0
  282. PYME/Acquire/ui/tile_panel.py +556 -0
  283. PYME/Acquire/ui/tilesettingsui.py +91 -0
  284. PYME/Acquire/ui/voxelSizeDialog.py +149 -0
  285. PYME/Acquire/webui/__init__.py +36 -0
  286. PYME/Acquire/webui/ipy.py +361 -0
  287. PYME/Acquire/webui/static/css/pyme-bootstrap.css +9908 -0
  288. PYME/Acquire/webui/static/css/pymeacquire.css +85 -0
  289. PYME/Acquire/webui/static/js/pymeacquire.js +375 -0
  290. PYME/Acquire/webui/static/js/pzf.js +95 -0
  291. PYME/Acquire/webui/templates/PYMEAcquire.html +232 -0
  292. PYME/Acquire/webui/templates/login.html +84 -0
  293. PYME/Acquire/webui/templates/xtermpage.html +106 -0
  294. PYME/Acquire/xyztc.py +418 -0
  295. PYME/Acquire/zScanner.py +287 -0
  296. PYME/Analysis/BleachProfile/__init__.py +26 -0
  297. PYME/Analysis/BleachProfile/deMod.py +91 -0
  298. PYME/Analysis/BleachProfile/fitRecover.py +90 -0
  299. PYME/Analysis/BleachProfile/intensProf.py +519 -0
  300. PYME/Analysis/BleachProfile/kinModels.py +507 -0
  301. PYME/Analysis/BleachProfile/rawIntensity.py +227 -0
  302. PYME/Analysis/BleachProfile/rollins.py +555 -0
  303. PYME/Analysis/Colocalisation/__init__.py +27 -0
  304. PYME/Analysis/Colocalisation/colocScaleDep.py +126 -0
  305. PYME/Analysis/Colocalisation/correlationCoeffs.py +198 -0
  306. PYME/Analysis/Colocalisation/distColoc.py +110 -0
  307. PYME/Analysis/Colocalisation/edtColoc.py +191 -0
  308. PYME/Analysis/MetaData.py +278 -0
  309. PYME/Analysis/PSFEst/__init__.py +27 -0
  310. PYME/Analysis/PSFEst/dec.py +283 -0
  311. PYME/Analysis/PSFEst/extractImages.py +316 -0
  312. PYME/Analysis/PSFEst/fit_psf_zernikes.py +194 -0
  313. PYME/Analysis/PSFEst/psfQuality.py +225 -0
  314. PYME/Analysis/PSFGen/__init__.py +40 -0
  315. PYME/Analysis/PSFGen/fourier.py +138 -0
  316. PYME/Analysis/PSFGen/fourierHNA.py +1108 -0
  317. PYME/Analysis/PSFGen/fourierHNA2.py +979 -0
  318. PYME/Analysis/PSFGen/genCRBcurves.py +185 -0
  319. PYME/Analysis/PSFGen/nijboer_zernike.py +79 -0
  320. PYME/Analysis/PSFGen/ps_app.cp313-win_amd64.dll.a +0 -0
  321. PYME/Analysis/PSFGen/ps_app.cp313-win_amd64.pyd +0 -0
  322. PYME/Analysis/PSFGen/test_ps_app.py +24 -0
  323. PYME/Analysis/Tracking/__init__.py +3 -0
  324. PYME/Analysis/Tracking/msd.py +57 -0
  325. PYME/Analysis/Tracking/trackUtils.py +528 -0
  326. PYME/Analysis/Tracking/tracking.py +152 -0
  327. PYME/Analysis/__init__.py +30 -0
  328. PYME/Analysis/_fithelpers.py +161 -0
  329. PYME/Analysis/angleFilter.py +287 -0
  330. PYME/Analysis/annealThresh.py +157 -0
  331. PYME/Analysis/autoencoder_classifier.py +45 -0
  332. PYME/Analysis/binAvg.py +144 -0
  333. PYME/Analysis/composite.py +183 -0
  334. PYME/Analysis/cramerRao.py +259 -0
  335. PYME/Analysis/deTile.py +441 -0
  336. PYME/Analysis/density_filter.py +45 -0
  337. PYME/Analysis/distributed_pyramid.py +426 -0
  338. PYME/Analysis/fiducial_matching.py +220 -0
  339. PYME/Analysis/gen_sCMOS_maps.py +355 -0
  340. PYME/Analysis/graphing_filters.py +311 -0
  341. PYME/Analysis/implicitFilter.py +359 -0
  342. PYME/Analysis/keep_pairs.py +69 -0
  343. PYME/Analysis/optic_flow.py +108 -0
  344. PYME/Analysis/piecewise.py +36 -0
  345. PYME/Analysis/piecewiseMapping.py +304 -0
  346. PYME/Analysis/piezo_movement_correction.py +153 -0
  347. PYME/Analysis/points/DeClump/__init__.py +78 -0
  348. PYME/Analysis/points/DeClump/deClump.cp313-win_amd64.dll.a +0 -0
  349. PYME/Analysis/points/DeClump/deClump.cp313-win_amd64.pyd +0 -0
  350. PYME/Analysis/points/DeClump/deClumpGUI.py +87 -0
  351. PYME/Analysis/points/DeClump/pyDeClump.py +284 -0
  352. PYME/Analysis/points/DeClump/testClump.py +40 -0
  353. PYME/Analysis/points/DistHist/__init__.py +25 -0
  354. PYME/Analysis/points/DistHist/distHist.cp313-win_amd64.dll.a +0 -0
  355. PYME/Analysis/points/DistHist/distHist.cp313-win_amd64.pyd +0 -0
  356. PYME/Analysis/points/DistHist/distHistThreaded.py +71 -0
  357. PYME/Analysis/points/DistHist/setup.py +54 -0
  358. PYME/Analysis/points/EdgeDB/__init__.py +24 -0
  359. PYME/Analysis/points/EdgeDB/edgeDB.cp313-win_amd64.dll.a +0 -0
  360. PYME/Analysis/points/EdgeDB/edgeDB.cp313-win_amd64.pyd +0 -0
  361. PYME/Analysis/points/EdgeDB/edgeTest.py +66 -0
  362. PYME/Analysis/points/EdgeDB/edges.py +102 -0
  363. PYME/Analysis/points/EdgeDB/segment.py +75 -0
  364. PYME/Analysis/points/EdgeDB/setup.py +54 -0
  365. PYME/Analysis/points/QuadTree/QTrend.py +232 -0
  366. PYME/Analysis/points/QuadTree/__init__.py +25 -0
  367. PYME/Analysis/points/QuadTree/pointQT.py +227 -0
  368. PYME/Analysis/points/QuadTree/pointQTF.py +254 -0
  369. PYME/Analysis/points/QuadTree/qtUtils.py +36 -0
  370. PYME/Analysis/points/QuadTree/rendQT.py +118 -0
  371. PYME/Analysis/points/SoftRend/__init__.py +24 -0
  372. PYME/Analysis/points/SoftRend/setup.py +61 -0
  373. PYME/Analysis/points/SoftRend/testTetrahedra.py +41 -0
  374. PYME/Analysis/points/SoftRend/triRend.cp313-win_amd64.dll.a +0 -0
  375. PYME/Analysis/points/SoftRend/triRend.cp313-win_amd64.pyd +0 -0
  376. PYME/Analysis/points/__init__.py +3 -0
  377. PYME/Analysis/points/arcfit/__init__.py +1 -0
  378. PYME/Analysis/points/arcfit/arcmf.cp313-win_amd64.dll.a +0 -0
  379. PYME/Analysis/points/arcfit/arcmf.cp313-win_amd64.pyd +0 -0
  380. PYME/Analysis/points/arcfit/setup.py +51 -0
  381. PYME/Analysis/points/astigmatism/__init__.py +0 -0
  382. PYME/Analysis/points/astigmatism/astigTools.py +338 -0
  383. PYME/Analysis/points/astigmatism/astiglookup.cp313-win_amd64.dll.a +0 -0
  384. PYME/Analysis/points/astigmatism/astiglookup.cp313-win_amd64.pyd +0 -0
  385. PYME/Analysis/points/astigmatism/setup.py +54 -0
  386. PYME/Analysis/points/cluster_morphology.py +199 -0
  387. PYME/Analysis/points/coordinate_tools.py +278 -0
  388. PYME/Analysis/points/features/__init__.py +0 -0
  389. PYME/Analysis/points/features/metal.py +46 -0
  390. PYME/Analysis/points/features/shaders/vect_feat_3d.metal +49 -0
  391. PYME/Analysis/points/fiducials.py +142 -0
  392. PYME/Analysis/points/gen3DTriangs.py +796 -0
  393. PYME/Analysis/points/moments.py +143 -0
  394. PYME/Analysis/points/multiview.py +458 -0
  395. PYME/Analysis/points/objectMeasure.py +206 -0
  396. PYME/Analysis/points/qpaint.py +97 -0
  397. PYME/Analysis/points/rings.py +372 -0
  398. PYME/Analysis/points/ripleys.py +427 -0
  399. PYME/Analysis/points/segmentLL.py +134 -0
  400. PYME/Analysis/points/setup.py +56 -0
  401. PYME/Analysis/points/spherical_harmonics.py +909 -0
  402. PYME/Analysis/points/surfit.py +829 -0
  403. PYME/Analysis/points/tCluster.py +75 -0
  404. PYME/Analysis/points/traveling_salesperson/__init__.py +0 -0
  405. PYME/Analysis/points/traveling_salesperson/queue_opt.py +117 -0
  406. PYME/Analysis/points/traveling_salesperson/sectioned_two_opt.py +327 -0
  407. PYME/Analysis/points/traveling_salesperson/setup.py +40 -0
  408. PYME/Analysis/points/traveling_salesperson/sort.py +78 -0
  409. PYME/Analysis/points/traveling_salesperson/two_opt.py +189 -0
  410. PYME/Analysis/points/traveling_salesperson/two_opt_utils.cp313-win_amd64.dll.a +0 -0
  411. PYME/Analysis/points/traveling_salesperson/two_opt_utils.cp313-win_amd64.pyd +0 -0
  412. PYME/Analysis/points/traveling_salesperson/two_opt_utils.pyx +41 -0
  413. PYME/Analysis/points/twoColour.py +572 -0
  414. PYME/Analysis/points/twoColourPlot.py +107 -0
  415. PYME/Analysis/processLogger.py +129 -0
  416. PYME/Analysis/profile_extraction.py +72 -0
  417. PYME/Analysis/setup.py +60 -0
  418. PYME/Analysis/splitting.py +372 -0
  419. PYME/Analysis/svmSegment.py +214 -0
  420. PYME/Analysis/thresholding.py +192 -0
  421. PYME/Analysis/tile_pyramid.py +938 -0
  422. PYME/Analysis/widefieldify.py +54 -0
  423. PYME/DSView/DisplayOptionsPanel.py +503 -0
  424. PYME/DSView/LUT/__init__.py +33 -0
  425. PYME/DSView/LUT/lut.cp313-win_amd64.dll.a +0 -0
  426. PYME/DSView/LUT/lut.cp313-win_amd64.pyd +0 -0
  427. PYME/DSView/LUT/setup.py +54 -0
  428. PYME/DSView/OpenSequenceDialog.py +83 -0
  429. PYME/DSView/OverlaysPanel.py +111 -0
  430. PYME/DSView/__init__.py +32 -0
  431. PYME/DSView/arrayViewPanel.py +1035 -0
  432. PYME/DSView/displayOptions.py +453 -0
  433. PYME/DSView/displaySettingsPanel.py +271 -0
  434. PYME/DSView/dsviewer.py +542 -0
  435. PYME/DSView/eventLogViewer.py +805 -0
  436. PYME/DSView/fitInfo.py +486 -0
  437. PYME/DSView/htmlServe.py +72 -0
  438. PYME/DSView/logparser.py +100 -0
  439. PYME/DSView/modules/LMAnalysis.py +1053 -0
  440. PYME/DSView/modules/LMDisplay.py +194 -0
  441. PYME/DSView/modules/__init__.py +162 -0
  442. PYME/DSView/modules/_base.py +39 -0
  443. PYME/DSView/modules/annotation.py +725 -0
  444. PYME/DSView/modules/arrayView.py +71 -0
  445. PYME/DSView/modules/blobFinding.py +455 -0
  446. PYME/DSView/modules/blobMeasure.py +1093 -0
  447. PYME/DSView/modules/camera_maps.py +38 -0
  448. PYME/DSView/modules/coloc.py +414 -0
  449. PYME/DSView/modules/composite.py +715 -0
  450. PYME/DSView/modules/convnet.py +24 -0
  451. PYME/DSView/modules/cropping.py +133 -0
  452. PYME/DSView/modules/dark_and_flatfield.py +31 -0
  453. PYME/DSView/modules/deconvolution.py +499 -0
  454. PYME/DSView/modules/eventView.py +80 -0
  455. PYME/DSView/modules/extractBlobs.py +46 -0
  456. PYME/DSView/modules/fastGraphPanel.py +85 -0
  457. PYME/DSView/modules/filtering.py +335 -0
  458. PYME/DSView/modules/flowView.py +268 -0
  459. PYME/DSView/modules/fourierRingCorrelation.py +172 -0
  460. PYME/DSView/modules/gl_image_view.py +12 -0
  461. PYME/DSView/modules/graphViewPanel.py +272 -0
  462. PYME/DSView/modules/measure/__init__.py +1 -0
  463. PYME/DSView/modules/measure/filterPan.py +239 -0
  464. PYME/DSView/modules/metadataView.py +28 -0
  465. PYME/DSView/modules/multithreshold.py +98 -0
  466. PYME/DSView/modules/neuroglancer.py +129 -0
  467. PYME/DSView/modules/object_tagging.py +157 -0
  468. PYME/DSView/modules/particleTracking.py +463 -0
  469. PYME/DSView/modules/playback.py +256 -0
  470. PYME/DSView/modules/prebleachExtraction.py +75 -0
  471. PYME/DSView/modules/profileFitting.py +137 -0
  472. PYME/DSView/modules/profilePlotting.py +408 -0
  473. PYME/DSView/modules/projections.py +48 -0
  474. PYME/DSView/modules/psfExtraction.py +570 -0
  475. PYME/DSView/modules/psfGeneration.py +138 -0
  476. PYME/DSView/modules/psfTools.py +661 -0
  477. PYME/DSView/modules/pupilTools.py +204 -0
  478. PYME/DSView/modules/pupilView.py +139 -0
  479. PYME/DSView/modules/recipes.py +266 -0
  480. PYME/DSView/modules/redimension.py +75 -0
  481. PYME/DSView/modules/segmentation.py +192 -0
  482. PYME/DSView/modules/sheetView.py +24 -0
  483. PYME/DSView/modules/shell.py +39 -0
  484. PYME/DSView/modules/shiftfield_estimation.py +433 -0
  485. PYME/DSView/modules/sparkprepare.py +94 -0
  486. PYME/DSView/modules/splitter.py +148 -0
  487. PYME/DSView/modules/synchronise.py +64 -0
  488. PYME/DSView/modules/templates/astigCal.html +42 -0
  489. PYME/DSView/modules/templates/measureView.html +69 -0
  490. PYME/DSView/modules/templates/measureView2.html +48 -0
  491. PYME/DSView/modules/templates/measureView3.html +98 -0
  492. PYME/DSView/modules/templates/trackView.html +139 -0
  493. PYME/DSView/modules/templates/tracksOverview.html +21 -0
  494. PYME/DSView/modules/tiling.py +147 -0
  495. PYME/DSView/modules/unmixing.py +148 -0
  496. PYME/DSView/modules/vis3D.py +320 -0
  497. PYME/DSView/modules/visgui.py +163 -0
  498. PYME/DSView/modules/webview.py +14 -0
  499. PYME/DSView/overlays.py +295 -0
  500. PYME/DSView/scrolledImagePanel.py +188 -0
  501. PYME/DSView/setup.py +53 -0
  502. PYME/DSView/splashScreen.py +158 -0
  503. PYME/DSView/voxSizeDialog.py +84 -0
  504. PYME/Deconv/__init__.py +35 -0
  505. PYME/Deconv/beadGen.py +55 -0
  506. PYME/Deconv/dec.py +659 -0
  507. PYME/Deconv/decTask.py +65 -0
  508. PYME/Deconv/decThread.py +113 -0
  509. PYME/Deconv/dec_test.py +47 -0
  510. PYME/Deconv/deconvDialogs.py +417 -0
  511. PYME/Deconv/fftwWisdom.py +62 -0
  512. PYME/Deconv/richardsonLucy.py +141 -0
  513. PYME/Deconv/richardsonLucyMV.py +151 -0
  514. PYME/Deconv/richardsonLucyMVM.py +218 -0
  515. PYME/Deconv/test_block_dec.py +46 -0
  516. PYME/Deconv/tq_block_dec.py +331 -0
  517. PYME/Deconv/wiener.py +163 -0
  518. PYME/IO/DataSources/AlignDataSource.py +91 -0
  519. PYME/IO/DataSources/ArrayDataSource.py +260 -0
  520. PYME/IO/DataSources/BGSDataSource.py +353 -0
  521. PYME/IO/DataSources/BaseDataSource.py +457 -0
  522. PYME/IO/DataSources/BioformatsDataSource.py +178 -0
  523. PYME/IO/DataSources/BufferedDataSource.py +99 -0
  524. PYME/IO/DataSources/ClusterPZFDataSource.py +124 -0
  525. PYME/IO/DataSources/ConcatenatedDataSource.py +56 -0
  526. PYME/IO/DataSources/CropDataSource.py +243 -0
  527. PYME/IO/DataSources/DcimgDataSource.py +54 -0
  528. PYME/IO/DataSources/ElectronsPerSecondDataSource.py +61 -0
  529. PYME/IO/DataSources/FlatFieldDataSource.py +77 -0
  530. PYME/IO/DataSources/HDFDataSource.py +160 -0
  531. PYME/IO/DataSources/HTTPDataSource.py +80 -0
  532. PYME/IO/DataSources/ImageSeriesDataSource.py +123 -0
  533. PYME/IO/DataSources/MultiviewDataSource.py +99 -0
  534. PYME/IO/DataSources/OBFDataSource.py +67 -0
  535. PYME/IO/DataSources/RandomDataSource.py +23 -0
  536. PYME/IO/DataSources/SupertileDatasource.py +148 -0
  537. PYME/IO/DataSources/TQDataSource.py +41 -0
  538. PYME/IO/DataSources/TiffDataSource.py +193 -0
  539. PYME/IO/DataSources/TileDataSource.py +91 -0
  540. PYME/IO/DataSources/UnsplitDataSource.py +92 -0
  541. PYME/IO/DataSources/__init__.py +59 -0
  542. PYME/IO/FileUtils/IJLut.py +43 -0
  543. PYME/IO/FileUtils/RawToHdf5.py +105 -0
  544. PYME/IO/FileUtils/SPAD.py +54 -0
  545. PYME/IO/FileUtils/TiffSeqToHdf5.py +87 -0
  546. PYME/IO/FileUtils/__init__.py +24 -0
  547. PYME/IO/FileUtils/compHdf.py +39 -0
  548. PYME/IO/FileUtils/fileID.py +246 -0
  549. PYME/IO/FileUtils/fnlGen.py +40 -0
  550. PYME/IO/FileUtils/freeSpace.py +59 -0
  551. PYME/IO/FileUtils/h5-thumbnailer.py +85 -0
  552. PYME/IO/FileUtils/h5ExFrames.py +98 -0
  553. PYME/IO/FileUtils/h5ToTiffSeries.py +50 -0
  554. PYME/IO/FileUtils/h5r-thumbnailer.py +118 -0
  555. PYME/IO/FileUtils/h5rFormatDef.py +99 -0
  556. PYME/IO/FileUtils/h5rToTxt.py +77 -0
  557. PYME/IO/FileUtils/nameUtils.py +300 -0
  558. PYME/IO/FileUtils/obf_support.py +538 -0
  559. PYME/IO/FileUtils/ply.py +147 -0
  560. PYME/IO/FileUtils/readSpeckle.py +78 -0
  561. PYME/IO/FileUtils/readTiff.py +64 -0
  562. PYME/IO/FileUtils/saveTiffStack.py +137 -0
  563. PYME/IO/FileUtils/setup.py +36 -0
  564. PYME/IO/FileUtils/sf-thumbnailer.py +76 -0
  565. PYME/IO/FileUtils/stl.py +44 -0
  566. PYME/IO/FileUtils/thumbnailDatabase.py +104 -0
  567. PYME/IO/HTTPSpooler_v2.py +141 -0
  568. PYME/IO/MetaDataHandler.py +1072 -0
  569. PYME/IO/PZFFormat.py +375 -0
  570. PYME/IO/Spooler.py +279 -0
  571. PYME/IO/__init__.py +12 -0
  572. PYME/IO/acquisition_backends.py +353 -0
  573. PYME/IO/buffer_helpers.cp313-win_amd64.dll.a +0 -0
  574. PYME/IO/buffer_helpers.cp313-win_amd64.pyd +0 -0
  575. PYME/IO/buffer_helpers.pyx +190 -0
  576. PYME/IO/buffers.py +291 -0
  577. PYME/IO/clusterDuplication.py +204 -0
  578. PYME/IO/clusterExport.py +152 -0
  579. PYME/IO/clusterGlob.py +108 -0
  580. PYME/IO/clusterIO.py +1076 -0
  581. PYME/IO/clusterListing.py +232 -0
  582. PYME/IO/clusterResults.py +206 -0
  583. PYME/IO/clusterUpload.py +49 -0
  584. PYME/IO/cluster_directory.py +419 -0
  585. PYME/IO/cluster_streaming.py +216 -0
  586. PYME/IO/compatibility.py +12 -0
  587. PYME/IO/countdir/__init__.py +5 -0
  588. PYME/IO/countdir/setup.py +58 -0
  589. PYME/IO/csv_flavours.py +251 -0
  590. PYME/IO/dataExporter.py +470 -0
  591. PYME/IO/dataWrap.py +108 -0
  592. PYME/IO/dcimg.py +167 -0
  593. PYME/IO/events.py +161 -0
  594. PYME/IO/h5File.py +148 -0
  595. PYME/IO/h5rFile.py +323 -0
  596. PYME/IO/image.py +1447 -0
  597. PYME/IO/load_psf.py +26 -0
  598. PYME/IO/pyme_h5ls.py +58 -0
  599. PYME/IO/ragged.py +138 -0
  600. PYME/IO/rgb_image.py +94 -0
  601. PYME/IO/tabular.py +1338 -0
  602. PYME/IO/testClusterSpooling.py +199 -0
  603. PYME/IO/unifiedIO.py +301 -0
  604. PYME/LMVis/Extras/QPobjectSegment.py +220 -0
  605. PYME/LMVis/Extras/__init__.py +55 -0
  606. PYME/LMVis/Extras/animation.py +359 -0
  607. PYME/LMVis/Extras/annotation.py +78 -0
  608. PYME/LMVis/Extras/clusterAnalysis.py +460 -0
  609. PYME/LMVis/Extras/dockedPanel.py +69 -0
  610. PYME/LMVis/Extras/extra_layers.py +373 -0
  611. PYME/LMVis/Extras/fiducial.py +230 -0
  612. PYME/LMVis/Extras/flagZMotionArtifacts.py +60 -0
  613. PYME/LMVis/Extras/fusionUtils.py +9 -0
  614. PYME/LMVis/Extras/multiColourAnalysis.py +103 -0
  615. PYME/LMVis/Extras/multiviewMapping.py +489 -0
  616. PYME/LMVis/Extras/objectMeasurements.py +246 -0
  617. PYME/LMVis/Extras/particleTracking.py +272 -0
  618. PYME/LMVis/Extras/perFrameVariable.py +77 -0
  619. PYME/LMVis/Extras/photophysics.py +72 -0
  620. PYME/LMVis/Extras/pointSetGeneration.py +232 -0
  621. PYME/LMVis/Extras/pointwiseColoc.py +54 -0
  622. PYME/LMVis/Extras/saved_views.py +125 -0
  623. PYME/LMVis/Extras/scaleBox.py +115 -0
  624. PYME/LMVis/Extras/sequentialSpecies.py +125 -0
  625. PYME/LMVis/Extras/setBGImage.py +74 -0
  626. PYME/LMVis/Extras/shiftmapGenerator.py +138 -0
  627. PYME/LMVis/Extras/showShortcuts.py +69 -0
  628. PYME/LMVis/Extras/snapshot.py +135 -0
  629. PYME/LMVis/Extras/spherical_harmonics.py +98 -0
  630. PYME/LMVis/Extras/subsets.py +15 -0
  631. PYME/LMVis/Extras/surface_fitting.py +52 -0
  632. PYME/LMVis/Extras/temperaturePlot.py +53 -0
  633. PYME/LMVis/Extras/vibration.py +112 -0
  634. PYME/LMVis/VisGUI.py +506 -0
  635. PYME/LMVis/__init__.py +39 -0
  636. PYME/LMVis/colourFilterGUI.py +77 -0
  637. PYME/LMVis/colourPanel.py +491 -0
  638. PYME/LMVis/displayPane.py +462 -0
  639. PYME/LMVis/dyeRatios.py +116 -0
  640. PYME/LMVis/genImageDialog.py +298 -0
  641. PYME/LMVis/gl_offScreenHandler.py +134 -0
  642. PYME/LMVis/gl_render.py +1302 -0
  643. PYME/LMVis/gl_render3D.py +1453 -0
  644. PYME/LMVis/gl_render3D_shaders.py +1213 -0
  645. PYME/LMVis/glcanvas_core.py +1157 -0
  646. PYME/LMVis/imageView.py +752 -0
  647. PYME/LMVis/imageView2.py +372 -0
  648. PYME/LMVis/importTextDialog.py +342 -0
  649. PYME/LMVis/layer_panel.py +231 -0
  650. PYME/LMVis/layers/AxesOverlayLayer.py +126 -0
  651. PYME/LMVis/layers/LUTOverlayLayer.py +346 -0
  652. PYME/LMVis/layers/OverlayLayer.py +46 -0
  653. PYME/LMVis/layers/ScaleBarOverlayLayer.py +97 -0
  654. PYME/LMVis/layers/ScaleBoxOverlayLayer.py +181 -0
  655. PYME/LMVis/layers/SelectionOverlayLayer.py +124 -0
  656. PYME/LMVis/layers/__init__.py +53 -0
  657. PYME/LMVis/layers/base.py +319 -0
  658. PYME/LMVis/layers/image_layer.py +363 -0
  659. PYME/LMVis/layers/labels.py +186 -0
  660. PYME/LMVis/layers/layer_defaults.py +97 -0
  661. PYME/LMVis/layers/mesh.py +378 -0
  662. PYME/LMVis/layers/octree.py +194 -0
  663. PYME/LMVis/layers/pointcloud.py +372 -0
  664. PYME/LMVis/layers/quiver.py +271 -0
  665. PYME/LMVis/layers/text.py +250 -0
  666. PYME/LMVis/layers/tracks.py +309 -0
  667. PYME/LMVis/mv_math.py +78 -0
  668. PYME/LMVis/objectDarkMeasure.py +120 -0
  669. PYME/LMVis/pipeline.py +1227 -0
  670. PYME/LMVis/pipelineView.py +115 -0
  671. PYME/LMVis/pointSettingsPanel.py +135 -0
  672. PYME/LMVis/progGraph.py +59 -0
  673. PYME/LMVis/quadTreeSettings.py +90 -0
  674. PYME/LMVis/rendGauss.py +158 -0
  675. PYME/LMVis/renderers.py +576 -0
  676. PYME/LMVis/sessionpaths.py +136 -0
  677. PYME/LMVis/setup.py +39 -0
  678. PYME/LMVis/setup_exe.py +71 -0
  679. PYME/LMVis/shader_programs/DefaultShaderProgram.py +149 -0
  680. PYME/LMVis/shader_programs/GLProgram.py +119 -0
  681. PYME/LMVis/shader_programs/GouraudShaderProgram.py +157 -0
  682. PYME/LMVis/shader_programs/PointSpriteShaderProgram.py +163 -0
  683. PYME/LMVis/shader_programs/ShaderProgramFactory.py +54 -0
  684. PYME/LMVis/shader_programs/TesselShaderProgram.py +47 -0
  685. PYME/LMVis/shader_programs/WireFrameShaderProgram.py +50 -0
  686. PYME/LMVis/shader_programs/__init__.py +20 -0
  687. PYME/LMVis/shader_programs/oit_compositor.py +23 -0
  688. PYME/LMVis/shader_programs/shader_loader.py +84 -0
  689. PYME/LMVis/shader_programs/shader_program.py +168 -0
  690. PYME/LMVis/shader_programs/shaders/bigflatpoints_fs.glsl +16 -0
  691. PYME/LMVis/shader_programs/shaders/bigpoints_gs.glsl +40 -0
  692. PYME/LMVis/shader_programs/shaders/bigpointsprites_fs.glsl +20 -0
  693. PYME/LMVis/shader_programs/shaders/bigspheres_fs.glsl +53 -0
  694. PYME/LMVis/shader_programs/shaders/compose_fs.glsl +41 -0
  695. PYME/LMVis/shader_programs/shaders/compose_vs.glsl +25 -0
  696. PYME/LMVis/shader_programs/shaders/default_fs.glsl +27 -0
  697. PYME/LMVis/shader_programs/shaders/default_vs.glsl +88 -0
  698. PYME/LMVis/shader_programs/shaders/flatpoints_fs.glsl +27 -0
  699. PYME/LMVis/shader_programs/shaders/gouraud_flatpoints_fs.glsl +30 -0
  700. PYME/LMVis/shader_programs/shaders/gouraud_fs.glsl +26 -0
  701. PYME/LMVis/shader_programs/shaders/gouraud_oit_fs.glsl +68 -0
  702. PYME/LMVis/shader_programs/shaders/gouraud_vs.glsl +135 -0
  703. PYME/LMVis/shader_programs/shaders/image_fs.glsl +60 -0
  704. PYME/LMVis/shader_programs/shaders/image_vs.glsl +79 -0
  705. PYME/LMVis/shader_programs/shaders/phong_fs.glsl +43 -0
  706. PYME/LMVis/shader_programs/shaders/phong_vs.glsl +45 -0
  707. PYME/LMVis/shader_programs/shaders/pointsprites_fs.glsl +33 -0
  708. PYME/LMVis/shader_programs/shaders/pointsprites_vs.glsl +77 -0
  709. PYME/LMVis/shader_programs/shaders/spheres_fs.glsl +102 -0
  710. PYME/LMVis/shader_programs/shaders/tessel_fs.glsl +23 -0
  711. PYME/LMVis/shader_programs/shaders/tessel_vs.glsl +37 -0
  712. PYME/LMVis/shader_programs/shaders/text_fs.glsl +42 -0
  713. PYME/LMVis/shader_programs/shaders/text_vs.glsl +84 -0
  714. PYME/LMVis/shader_programs/shaders/widelines_fs.glsl +19 -0
  715. PYME/LMVis/shader_programs/shaders/widelines_gs.glsl +56 -0
  716. PYME/LMVis/shader_programs/shaders/widelines_vs.glsl +51 -0
  717. PYME/LMVis/statusLog.py +57 -0
  718. PYME/LMVis/triBlobs.py +142 -0
  719. PYME/LMVis/view_clipping_pane.py +429 -0
  720. PYME/LMVis/views.py +275 -0
  721. PYME/LMVis/visCore.py +1005 -0
  722. PYME/LMVis/visHelpers.py +880 -0
  723. PYME/LMVis/visHelpersMin.py +230 -0
  724. PYME/LMVis/workspaceTree.py +238 -0
  725. PYME/__init__.py +22 -0
  726. PYME/cluster/HTTPDataServer.py +1063 -0
  727. PYME/cluster/HTTPRulePusher.py +382 -0
  728. PYME/cluster/HTTPTaskPusher.py +377 -0
  729. PYME/cluster/PYMERuleNodeServer.py +192 -0
  730. PYME/cluster/PYMERuleServer.py +109 -0
  731. PYME/cluster/__init__.py +0 -0
  732. PYME/cluster/clusterUI/accounts/__init__.py +0 -0
  733. PYME/cluster/clusterUI/accounts/admin.py +85 -0
  734. PYME/cluster/clusterUI/accounts/forms.py +8 -0
  735. PYME/cluster/clusterUI/accounts/migrations/0001_initial.py +31 -0
  736. PYME/cluster/clusterUI/accounts/migrations/__init__.py +0 -0
  737. PYME/cluster/clusterUI/accounts/models.py +44 -0
  738. PYME/cluster/clusterUI/accounts/templates/accounts/user_form.html +13 -0
  739. PYME/cluster/clusterUI/accounts/templates/registration/initial_complete.html +6 -0
  740. PYME/cluster/clusterUI/accounts/templates/registration/initial_confirm.html +13 -0
  741. PYME/cluster/clusterUI/accounts/templates/registration/initial_done.html +7 -0
  742. PYME/cluster/clusterUI/accounts/templates/registration/verification.html +2 -0
  743. PYME/cluster/clusterUI/accounts/templates/registration/verification_subject.txt +1 -0
  744. PYME/cluster/clusterUI/accounts/urls.py +19 -0
  745. PYME/cluster/clusterUI/accounts/views.py +36 -0
  746. PYME/cluster/clusterUI/clusterUI/__init__.py +0 -0
  747. PYME/cluster/clusterUI/clusterUI/settings.py +147 -0
  748. PYME/cluster/clusterUI/clusterUI/urls.py +31 -0
  749. PYME/cluster/clusterUI/clusterUI/wsgi.py +16 -0
  750. PYME/cluster/clusterUI/clusterbrowser/__init__.py +0 -0
  751. PYME/cluster/clusterUI/clusterbrowser/admin.py +3 -0
  752. PYME/cluster/clusterUI/clusterbrowser/apps.py +7 -0
  753. PYME/cluster/clusterUI/clusterbrowser/migrations/__init__.py +0 -0
  754. PYME/cluster/clusterUI/clusterbrowser/models.py +5 -0
  755. PYME/cluster/clusterUI/clusterbrowser/templates/base.html +129 -0
  756. PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/dirlisting.html +231 -0
  757. PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/form_new_folder.html +18 -0
  758. PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/form_upload_file.html +17 -0
  759. PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/lightlisting.html +25 -0
  760. PYME/cluster/clusterUI/clusterbrowser/templates/registration/login.html +38 -0
  761. PYME/cluster/clusterUI/clusterbrowser/urls.py +10 -0
  762. PYME/cluster/clusterUI/clusterbrowser/views.py +148 -0
  763. PYME/cluster/clusterUI/clusterstatus/__init__.py +0 -0
  764. PYME/cluster/clusterUI/clusterstatus/admin.py +3 -0
  765. PYME/cluster/clusterUI/clusterstatus/apps.py +7 -0
  766. PYME/cluster/clusterUI/clusterstatus/migrations/__init__.py +0 -0
  767. PYME/cluster/clusterUI/clusterstatus/models.py +5 -0
  768. PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/load_content.html +29 -0
  769. PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/queue_info.html +28 -0
  770. PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/queue_info_content.html +50 -0
  771. PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/status_dash.html +29 -0
  772. PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/status_dash_content.html +90 -0
  773. PYME/cluster/clusterUI/clusterstatus/urls.py +9 -0
  774. PYME/cluster/clusterUI/clusterstatus/views.py +69 -0
  775. PYME/cluster/clusterUI/clusterui_tornado.py +117 -0
  776. PYME/cluster/clusterUI/deploy.py +62 -0
  777. PYME/cluster/clusterUI/localization/__init__.py +0 -0
  778. PYME/cluster/clusterUI/localization/admin.py +3 -0
  779. PYME/cluster/clusterUI/localization/apps.py +7 -0
  780. PYME/cluster/clusterUI/localization/migrations/__init__.py +0 -0
  781. PYME/cluster/clusterUI/localization/models.py +5 -0
  782. PYME/cluster/clusterUI/localization/templates/localization/settings_form.html +67 -0
  783. PYME/cluster/clusterUI/localization/urls.py +10 -0
  784. PYME/cluster/clusterUI/localization/views.py +170 -0
  785. PYME/cluster/clusterUI/manage.py +17 -0
  786. PYME/cluster/clusterUI/recipes/__init__.py +0 -0
  787. PYME/cluster/clusterUI/recipes/admin.py +3 -0
  788. PYME/cluster/clusterUI/recipes/migrations/__init__.py +0 -0
  789. PYME/cluster/clusterUI/recipes/models.py +3 -0
  790. PYME/cluster/clusterUI/recipes/templates/recipes/extra_inputs.html +35 -0
  791. PYME/cluster/clusterUI/recipes/templates/recipes/form_recipe.html +82 -0
  792. PYME/cluster/clusterUI/recipes/templates/recipes/input_list.html +7 -0
  793. PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editor.html +28 -0
  794. PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editor_common.html +46 -0
  795. PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editrun.html +93 -0
  796. PYME/cluster/clusterUI/recipes/templates/recipes/recipe_standalone.html +100 -0
  797. PYME/cluster/clusterUI/recipes/templates/recipes/recipe_template.html +109 -0
  798. PYME/cluster/clusterUI/recipes/urls.py +17 -0
  799. PYME/cluster/clusterUI/recipes/views.py +109 -0
  800. PYME/cluster/cluster_of_one.py +204 -0
  801. PYME/cluster/dataserver_wsgi.py +615 -0
  802. PYME/cluster/distribution.py +71 -0
  803. PYME/cluster/rulenodeserver.py +487 -0
  804. PYME/cluster/rules.py +979 -0
  805. PYME/cluster/ruleserver.py +1106 -0
  806. PYME/cluster/status.py +101 -0
  807. PYME/cluster/taskWorkerHTTP.py +522 -0
  808. PYME/cluster/webdav.py +1102 -0
  809. PYME/config.py +659 -0
  810. PYME/contrib/TextCtrlAutoComplete.py +582 -0
  811. PYME/contrib/__init__.py +7 -0
  812. PYME/contrib/aniso/__init__.py +2 -0
  813. PYME/contrib/aniso/aniso.py +268 -0
  814. PYME/contrib/auiFloatBook.py +94 -0
  815. PYME/contrib/congrid.py +127 -0
  816. PYME/contrib/dispatch/__init__.py +19 -0
  817. PYME/contrib/dispatch/dispatcher.py +289 -0
  818. PYME/contrib/gohlke/__init__.py +1 -0
  819. PYME/contrib/gohlke/_tifffile.cp313-win_amd64.dll.a +0 -0
  820. PYME/contrib/gohlke/_tifffile.cp313-win_amd64.pyd +0 -0
  821. PYME/contrib/gohlke/czifile.py +1289 -0
  822. PYME/contrib/gohlke/fcsfiles.py +514 -0
  823. PYME/contrib/gohlke/setup.py +54 -0
  824. PYME/contrib/gohlke/tifffile.py +3095 -0
  825. PYME/contrib/listctrlMixins.py +896 -0
  826. PYME/contrib/lzw.py +838 -0
  827. PYME/contrib/pad/__init__.py +13 -0
  828. PYME/contrib/pad/info_pad.py +18 -0
  829. PYME/contrib/pad/pad.py +670 -0
  830. PYME/contrib/setup.py +38 -0
  831. PYME/contrib/wxPlotPanel.py +137 -0
  832. PYME/experimental/SimReconstruction.py +49 -0
  833. PYME/experimental/__init__.pxd +0 -0
  834. PYME/experimental/__init__.py +4 -0
  835. PYME/experimental/_octree.cp313-win_amd64.dll.a +0 -0
  836. PYME/experimental/_octree.cp313-win_amd64.pyd +0 -0
  837. PYME/experimental/_octree.pyx +477 -0
  838. PYME/experimental/_treap.cp313-win_amd64.dll.a +0 -0
  839. PYME/experimental/_treap.cp313-win_amd64.pyd +0 -0
  840. PYME/experimental/_treap.pyx +267 -0
  841. PYME/experimental/_triangle_mesh.cp313-win_amd64.dll.a +0 -0
  842. PYME/experimental/_triangle_mesh.cp313-win_amd64.pyd +0 -0
  843. PYME/experimental/_triangle_mesh.pxd +149 -0
  844. PYME/experimental/_triangle_mesh.pyx +2787 -0
  845. PYME/experimental/aqavg.py +40 -0
  846. PYME/experimental/dcimgFileChucker.py +375 -0
  847. PYME/experimental/dcimgSpoolShim.py +174 -0
  848. PYME/experimental/dcimg_chuck_test.py +78 -0
  849. PYME/experimental/dual_marching_cubes.py +801 -0
  850. PYME/experimental/dual_marching_cubes_v2.py +645 -0
  851. PYME/experimental/expectationMaximisation.py +298 -0
  852. PYME/experimental/func_octree.cp313-win_amd64.dll.a +0 -0
  853. PYME/experimental/func_octree.cp313-win_amd64.pyd +0 -0
  854. PYME/experimental/func_octree.pyx +381 -0
  855. PYME/experimental/fusionRadial.py +520 -0
  856. PYME/experimental/fusionUtils.py +522 -0
  857. PYME/experimental/isosurface.py +147 -0
  858. PYME/experimental/labview_spooling_hacks.py +48 -0
  859. PYME/experimental/marching_cubes.py +811 -0
  860. PYME/experimental/marching_tetrahedra.py +343 -0
  861. PYME/experimental/modified_marching_cubes.py +1245 -0
  862. PYME/experimental/music.py +25 -0
  863. PYME/experimental/octree.py +188 -0
  864. PYME/experimental/pSpaceMap.py +34 -0
  865. PYME/experimental/pointFitConfoc.py +112 -0
  866. PYME/experimental/scanner_control.py +107 -0
  867. PYME/experimental/setup.py +109 -0
  868. PYME/experimental/spark.py +31 -0
  869. PYME/experimental/tcHist.py +71 -0
  870. PYME/experimental/treap.py +262 -0
  871. PYME/experimental/triangle_mesh.py +2287 -0
  872. PYME/experimental/triangle_mesh_utils.cp313-win_amd64.dll.a +0 -0
  873. PYME/experimental/triangle_mesh_utils.cp313-win_amd64.pyd +0 -0
  874. PYME/experimental/triangle_utils.py +87 -0
  875. PYME/experimental/triangular_mesh.py +2255 -0
  876. PYME/experimental/zMotionArtifactUtils.py +55 -0
  877. PYME/localization/FitFactories/AstigGaussFitFR.py +175 -0
  878. PYME/localization/FitFactories/AstigGaussGPUFitFR.py +326 -0
  879. PYME/localization/FitFactories/BeadConvolvedAstigGaussFit.py +206 -0
  880. PYME/localization/FitFactories/ChecksumFR.py +82 -0
  881. PYME/localization/FitFactories/ChecksumGPUFR.py +213 -0
  882. PYME/localization/FitFactories/ChecksumMultifitSR.py +86 -0
  883. PYME/localization/FitFactories/ConfocCOIR.py +93 -0
  884. PYME/localization/FitFactories/Dumbell3DFitR.py +193 -0
  885. PYME/localization/FitFactories/DumbellFitR.py +163 -0
  886. PYME/localization/FitFactories/FFBase.py +403 -0
  887. PYME/localization/FitFactories/Gauss3DFitR.py +213 -0
  888. PYME/localization/FitFactories/GaussFitConstrR.py +177 -0
  889. PYME/localization/FitFactories/GaussMultifitLinesR.py +351 -0
  890. PYME/localization/FitFactories/GaussMultifitR.py +326 -0
  891. PYME/localization/FitFactories/GaussMultifitSR.py +373 -0
  892. PYME/localization/FitFactories/InterpFitR.py +236 -0
  893. PYME/localization/FitFactories/InterpFitWFR.py +111 -0
  894. PYME/localization/FitFactories/Interpolators/CSInterpolator.py +148 -0
  895. PYME/localization/FitFactories/Interpolators/CubeSInterpolatorP.py +121 -0
  896. PYME/localization/FitFactories/Interpolators/CubicSplineInterpolator.py +69 -0
  897. PYME/localization/FitFactories/Interpolators/LinearInterpolator.py +135 -0
  898. PYME/localization/FitFactories/Interpolators/LinearPInterpolatorP.py +95 -0
  899. PYME/localization/FitFactories/Interpolators/__init__.py +33 -0
  900. PYME/localization/FitFactories/Interpolators/baseInterpolator.py +202 -0
  901. PYME/localization/FitFactories/LatFitCOIR.py +82 -0
  902. PYME/localization/FitFactories/LatGaussFitFR.py +220 -0
  903. PYME/localization/FitFactories/LatObjFindFR.py +85 -0
  904. PYME/localization/FitFactories/LatPSFFitR.py +142 -0
  905. PYME/localization/FitFactories/MultiviewFitInterpNR.py +400 -0
  906. PYME/localization/FitFactories/PRInterpFitQR.py +192 -0
  907. PYME/localization/FitFactories/PRInterpFitR.py +223 -0
  908. PYME/localization/FitFactories/ROIExtractNR.py +93 -0
  909. PYME/localization/FitFactories/SpecGaussFitFR.py +174 -0
  910. PYME/localization/FitFactories/SplitterFitCOIR.py +142 -0
  911. PYME/localization/FitFactories/SplitterFitFNR.py +312 -0
  912. PYME/localization/FitFactories/SplitterFitFusionR.py +318 -0
  913. PYME/localization/FitFactories/SplitterFitInterpBNR.py +357 -0
  914. PYME/localization/FitFactories/SplitterFitInterpNR.py +343 -0
  915. PYME/localization/FitFactories/SplitterFitScavNR.py +352 -0
  916. PYME/localization/FitFactories/SplitterMultifitSR.py +410 -0
  917. PYME/localization/FitFactories/SplitterObjFindR.py +194 -0
  918. PYME/localization/FitFactories/SplitterROIExtractNR.py +91 -0
  919. PYME/localization/FitFactories/SplitterShiftEstFR.py +230 -0
  920. PYME/localization/FitFactories/__init__.py +103 -0
  921. PYME/localization/FitFactories/fitCommon.py +195 -0
  922. PYME/localization/FitFactories/zEstimators/__init__.py +29 -0
  923. PYME/localization/FitFactories/zEstimators/astigEstimator.py +173 -0
  924. PYME/localization/FitFactories/zEstimators/biplaneEstimator.py +209 -0
  925. PYME/localization/FitFactories/zEstimators/genericDualEstimator.py +232 -0
  926. PYME/localization/FitFactories/zEstimators/genericEstimator.py +224 -0
  927. PYME/localization/FitFactories/zEstimators/priEstimator.py +255 -0
  928. PYME/localization/MetaDataEdit.py +543 -0
  929. PYME/localization/Test/30_9_series_A_1.sf +0 -0
  930. PYME/localization/Test/PRI.md +45 -0
  931. PYME/localization/Test/PRI_qr.md +52 -0
  932. PYME/localization/Test/PRI_r.md +52 -0
  933. PYME/localization/Test/__init__.py +22 -0
  934. PYME/localization/Test/astig.md +50 -0
  935. PYME/localization/Test/astigCOI.md +50 -0
  936. PYME/localization/Test/astig_gauss.md +52 -0
  937. PYME/localization/Test/astig_pe.md +50 -0
  938. PYME/localization/Test/astig_splitter.md +66 -0
  939. PYME/localization/Test/astig_splitterCOI.md +67 -0
  940. PYME/localization/Test/astig_splitterQ.md +66 -0
  941. PYME/localization/Test/astig_theory.md +50 -0
  942. PYME/localization/Test/astig_theory.psf +0 -0
  943. PYME/localization/Test/astig_theory.tif +0 -0
  944. PYME/localization/Test/beads1.psf +0 -0
  945. PYME/localization/Test/beads1.tif +0 -0
  946. PYME/localization/Test/biplane_splitter.md +75 -0
  947. PYME/localization/Test/biplane_splitter2.md +103 -0
  948. PYME/localization/Test/biplane_splitter3.md +115 -0
  949. PYME/localization/Test/defoc.md +48 -0
  950. PYME/localization/Test/dumbell_3d.md +52 -0
  951. PYME/localization/Test/fitTestJig.py +172 -0
  952. PYME/localization/Test/fitTestJigSCMOS.py +487 -0
  953. PYME/localization/Test/fitTestJigWC.py +225 -0
  954. PYME/localization/Test/gauss.md +50 -0
  955. PYME/localization/Test/gaussCOI.md +50 -0
  956. PYME/localization/Test/pri_pe.md +50 -0
  957. PYME/localization/Test/pri_theory.md +51 -0
  958. PYME/localization/Test/pri_theory.psf +0 -0
  959. PYME/localization/Test/pri_theory.tif +0 -0
  960. PYME/localization/Test/psf_astig.psf +0 -0
  961. PYME/localization/Test/psf_astig.tif +0 -0
  962. PYME/localization/Test/psf_astig_bg_d.psf +0 -0
  963. PYME/localization/Test/psf_astig_bg_d.tif +0 -0
  964. PYME/localization/Test/psf_astig_pe.psf +0 -0
  965. PYME/localization/Test/psf_astig_pe.tif +0 -0
  966. PYME/localization/Test/psf_decon.psf +0 -0
  967. PYME/localization/Test/psf_decon.tif +0 -0
  968. PYME/localization/Test/psf_decon_pe.psf +0 -0
  969. PYME/localization/Test/psf_decon_pe.tif +0 -0
  970. PYME/localization/Test/psf_guess.psf +0 -0
  971. PYME/localization/Test/splitter.md +63 -0
  972. PYME/localization/Test/splitter_scav.md +63 -0
  973. PYME/localization/Test/test.psf +0 -0
  974. PYME/localization/Test/test.tif +0 -0
  975. PYME/localization/Test/test_decon.psf +0 -0
  976. PYME/localization/Test/test_decon.tif +0 -0
  977. PYME/localization/Test/test_pe.psf +0 -0
  978. PYME/localization/Test/test_pe.tif +0 -0
  979. PYME/localization/Test/wf_theory.psf +0 -0
  980. PYME/localization/Test/wf_theory2.psf +0 -0
  981. PYME/localization/__init__.py +17 -0
  982. PYME/localization/autopsf/__init__.py +1 -0
  983. PYME/localization/autopsf/autopsf.py +486 -0
  984. PYME/localization/autopsf/roifit.py +310 -0
  985. PYME/localization/cInterp/__init__.py +24 -0
  986. PYME/localization/cInterp/cInterp.cp313-win_amd64.dll.a +0 -0
  987. PYME/localization/cInterp/cInterp.cp313-win_amd64.pyd +0 -0
  988. PYME/localization/cInterp/setup.py +54 -0
  989. PYME/localization/cModels/__init__.py +24 -0
  990. PYME/localization/cModels/gauss_app.cp313-win_amd64.dll.a +0 -0
  991. PYME/localization/cModels/gauss_app.cp313-win_amd64.pyd +0 -0
  992. PYME/localization/ofind.py +444 -0
  993. PYME/localization/ofind3d.py +306 -0
  994. PYME/localization/ofind_nofilt.py +128 -0
  995. PYME/localization/ofind_pri.py +478 -0
  996. PYME/localization/ofind_split.py +399 -0
  997. PYME/localization/ofind_xcorr.py +351 -0
  998. PYME/localization/ofind_xcorr_fw.py +441 -0
  999. PYME/localization/remFitBuf.py +657 -0
  1000. PYME/localization/setup.py +56 -0
  1001. PYME/localization/splitting.py +240 -0
  1002. PYME/localization/twist.py +60 -0
  1003. PYME/misc/TiSettings.py +36 -0
  1004. PYME/misc/TiffImagePlugin.py +838 -0
  1005. PYME/misc/VolProj.py +144 -0
  1006. PYME/misc/__init__.py +25 -0
  1007. PYME/misc/aligned_array.py +10 -0
  1008. PYME/misc/aniso.py +29 -0
  1009. PYME/misc/big_sur_fix.py +20 -0
  1010. PYME/misc/check_for_updates.py +139 -0
  1011. PYME/misc/colormaps.py +199 -0
  1012. PYME/misc/colorsys.py +201 -0
  1013. PYME/misc/computerName.py +33 -0
  1014. PYME/misc/coverslipGeometries.py +60 -0
  1015. PYME/misc/cython_numpy_monkey.py +40 -0
  1016. PYME/misc/depGraph.py +406 -0
  1017. PYME/misc/dirSize.py +31 -0
  1018. PYME/misc/diskCleanup.py +64 -0
  1019. PYME/misc/djangoRecarray.py +57 -0
  1020. PYME/misc/django_widgets.py +27 -0
  1021. PYME/misc/editgrid.py +101 -0
  1022. PYME/misc/eventSpy.py +122 -0
  1023. PYME/misc/exceptions.py +30 -0
  1024. PYME/misc/facsPlot.py +89 -0
  1025. PYME/misc/fbpIcons.py +90 -0
  1026. PYME/misc/fftw_compat.py +28 -0
  1027. PYME/misc/findCycles.py +91 -0
  1028. PYME/misc/fortran_interrupt_defeat.py +43 -0
  1029. PYME/misc/glassModel.py +64 -0
  1030. PYME/misc/hash32.py +41 -0
  1031. PYME/misc/hillcurve.py +88 -0
  1032. PYME/misc/hybrid_ns.py +84 -0
  1033. PYME/misc/kdFit.py +72 -0
  1034. PYME/misc/locate.py +10 -0
  1035. PYME/misc/memUsage.py +65 -0
  1036. PYME/misc/memmap.py +52 -0
  1037. PYME/misc/mock_ctypes.py +28 -0
  1038. PYME/misc/mock_traits.py +59 -0
  1039. PYME/misc/mock_traitsui.py +29 -0
  1040. PYME/misc/pyme_zeroconf.py +287 -0
  1041. PYME/misc/pyro_tracebacks.py +32 -0
  1042. PYME/misc/read_agf.py +605 -0
  1043. PYME/misc/sffake.py +16 -0
  1044. PYME/misc/snells.py +71 -0
  1045. PYME/misc/sqlite_ns.py +132 -0
  1046. PYME/misc/sqlitendarray.py +56 -0
  1047. PYME/misc/taskDef.py +44 -0
  1048. PYME/misc/tempDB.py +56 -0
  1049. PYME/misc/wxThread.py +33 -0
  1050. PYME/misc/zemax.py +259 -0
  1051. PYME/misc/zernike.py +151 -0
  1052. PYME/pyme_warnings.py +70 -0
  1053. PYME/recipes/Recipes/STEDDeconvolution.yaml +14 -0
  1054. PYME/recipes/Recipes/STEDMinistacks.yaml +15 -0
  1055. PYME/recipes/Recipes/STED_COP3.yaml +25 -0
  1056. PYME/recipes/Recipes/blobMeas.yaml +19 -0
  1057. PYME/recipes/Recipes/blobMeas2.yaml +37 -0
  1058. PYME/recipes/Recipes/blobMeasSR.yaml +66 -0
  1059. PYME/recipes/Recipes/coloc.yaml +43 -0
  1060. PYME/recipes/Recipes/coloc_roi_masked.yaml +46 -0
  1061. PYME/recipes/Recipes/multiblob.yaml +38 -0
  1062. PYME/recipes/Recipes/pre_particleTracking.yaml +30 -0
  1063. PYME/recipes/Recipes/segmentAndMeasureLoci.yaml +41 -0
  1064. PYME/recipes/__init__.py +6 -0
  1065. PYME/recipes/acquisition.py +158 -0
  1066. PYME/recipes/bakeshop.py +32 -0
  1067. PYME/recipes/base.py +1393 -0
  1068. PYME/recipes/batchProcess.py +147 -0
  1069. PYME/recipes/filters.py +394 -0
  1070. PYME/recipes/fudges.py +41 -0
  1071. PYME/recipes/graphing.py +108 -0
  1072. PYME/recipes/html_recipe_editor.py +90 -0
  1073. PYME/recipes/localisations.py +1386 -0
  1074. PYME/recipes/machine_learning.py +286 -0
  1075. PYME/recipes/measurement.py +1062 -0
  1076. PYME/recipes/modules.py +50 -0
  1077. PYME/recipes/multiview.py +435 -0
  1078. PYME/recipes/output.py +667 -0
  1079. PYME/recipes/pointcloud.py +510 -0
  1080. PYME/recipes/processing.py +2954 -0
  1081. PYME/recipes/pyramid.py +206 -0
  1082. PYME/recipes/recipe.py +965 -0
  1083. PYME/recipes/recipeGui.py +1029 -0
  1084. PYME/recipes/recipeLayout.py +499 -0
  1085. PYME/recipes/runRecipe.py +140 -0
  1086. PYME/recipes/setup.py +37 -0
  1087. PYME/recipes/simulation.py +91 -0
  1088. PYME/recipes/skfilters.py +143 -0
  1089. PYME/recipes/surface_fitting.py +776 -0
  1090. PYME/recipes/tablefilters.py +275 -0
  1091. PYME/recipes/tracking.py +343 -0
  1092. PYME/recipes/traits.py +157 -0
  1093. PYME/recipes/vertical_recipe_display.py +373 -0
  1094. PYME/resources/__init__.py +23 -0
  1095. PYME/resources/config_template/distributor.yaml +14 -0
  1096. PYME/resources/config_template/nodeserver.yaml +15 -0
  1097. PYME/resources/icons/LUT.png +0 -0
  1098. PYME/resources/icons/YSM_Shield.png +0 -0
  1099. PYME/resources/icons/YSM_logo.png +0 -0
  1100. PYME/resources/icons/arrow.png +0 -0
  1101. PYME/resources/icons/crosshairs.png +0 -0
  1102. PYME/resources/icons/line_select.png +0 -0
  1103. PYME/resources/icons/logo_fmhs.png +0 -0
  1104. PYME/resources/icons/media-playback-pause.png +0 -0
  1105. PYME/resources/icons/media-playback-start.png +0 -0
  1106. PYME/resources/icons/media-skip-backward.png +0 -0
  1107. PYME/resources/icons/media-skip-forward.png +0 -0
  1108. PYME/resources/icons/mesh.png +0 -0
  1109. PYME/resources/icons/mesh.svg +28 -0
  1110. PYME/resources/icons/pmacquire.icns +0 -0
  1111. PYME/resources/icons/pmacquire.ico +0 -0
  1112. PYME/resources/icons/pmanal.icns +0 -0
  1113. PYME/resources/icons/pmanal.ico +0 -0
  1114. PYME/resources/icons/pmvis.icns +0 -0
  1115. PYME/resources/icons/pmvis.ico +0 -0
  1116. PYME/resources/icons/points.png +0 -0
  1117. PYME/resources/icons/points.svg +16 -0
  1118. PYME/resources/icons/pymeLogo.png +0 -0
  1119. PYME/resources/icons/rect_select.png +0 -0
  1120. PYME/resources/icons/squiggle_select.png +0 -0
  1121. PYME/resources/icons/text3800.icns +0 -0
  1122. PYME/resources/icons/text3800.ico +0 -0
  1123. PYME/resources/icons/text3800.png +0 -0
  1124. PYME/resources/icons/text3800.tif +0 -0
  1125. PYME/resources/icons/text5377.icns +0 -0
  1126. PYME/resources/icons/text5377.ico +0 -0
  1127. PYME/resources/icons/text5377.png +0 -0
  1128. PYME/resources/icons/tracks.png +0 -0
  1129. PYME/resources/icons/tracks.svg +19 -0
  1130. PYME/resources/icons/view-front.png +0 -0
  1131. PYME/resources/icons/view-home.png +0 -0
  1132. PYME/resources/icons/view-right.png +0 -0
  1133. PYME/resources/icons/view-top.png +0 -0
  1134. PYME/resources/test_datasets/README.md +8 -0
  1135. PYME/resources/test_datasets/t_im.tif +0 -0
  1136. PYME/resources/test_datasets/test_csv.csv +4282 -0
  1137. PYME/resources/test_datasets/test_hdf.hdf +0 -0
  1138. PYME/resources/web/rule_inline.html +21 -0
  1139. PYME/resources/web/ruleserver.html +75 -0
  1140. PYME/resources/web/static/bootstrap.min.js +7 -0
  1141. PYME/resources/web/static/cluster.css +137 -0
  1142. PYME/resources/web/static/css/bootstrap-theme.css +587 -0
  1143. PYME/resources/web/static/css/bootstrap-theme.min.css +6 -0
  1144. PYME/resources/web/static/css/bootstrap.css +6757 -0
  1145. PYME/resources/web/static/css/bootstrap.min.css +6 -0
  1146. PYME/resources/web/static/css/flat_design_colors_full.css +306 -0
  1147. PYME/resources/web/static/css/recipe_editor.css +106 -0
  1148. PYME/resources/web/static/dashboard.css +106 -0
  1149. PYME/resources/web/static/fileselector.js +77 -0
  1150. PYME/resources/web/static/fonts/glyphicons-halflings-regular.eot +0 -0
  1151. PYME/resources/web/static/fonts/glyphicons-halflings-regular.svg +288 -0
  1152. PYME/resources/web/static/fonts/glyphicons-halflings-regular.ttf +0 -0
  1153. PYME/resources/web/static/fonts/glyphicons-halflings-regular.woff +0 -0
  1154. PYME/resources/web/static/fonts/glyphicons-halflings-regular.woff2 +0 -0
  1155. PYME/resources/web/static/images/osd_flat/LICENSE.txt +116 -0
  1156. PYME/resources/web/static/images/osd_flat/README.md +9 -0
  1157. PYME/resources/web/static/images/osd_flat/fullpage_grouphover.png +0 -0
  1158. PYME/resources/web/static/images/osd_flat/fullpage_hover.png +0 -0
  1159. PYME/resources/web/static/images/osd_flat/fullpage_pressed.png +0 -0
  1160. PYME/resources/web/static/images/osd_flat/fullpage_rest.png +0 -0
  1161. PYME/resources/web/static/images/osd_flat/home_grouphover.png +0 -0
  1162. PYME/resources/web/static/images/osd_flat/home_hover.png +0 -0
  1163. PYME/resources/web/static/images/osd_flat/home_pressed.png +0 -0
  1164. PYME/resources/web/static/images/osd_flat/home_rest.png +0 -0
  1165. PYME/resources/web/static/images/osd_flat/next_grouphover.png +0 -0
  1166. PYME/resources/web/static/images/osd_flat/next_hover.png +0 -0
  1167. PYME/resources/web/static/images/osd_flat/next_pressed.png +0 -0
  1168. PYME/resources/web/static/images/osd_flat/next_rest.png +0 -0
  1169. PYME/resources/web/static/images/osd_flat/previous_grouphover.png +0 -0
  1170. PYME/resources/web/static/images/osd_flat/previous_hover.png +0 -0
  1171. PYME/resources/web/static/images/osd_flat/previous_pressed.png +0 -0
  1172. PYME/resources/web/static/images/osd_flat/previous_rest.png +0 -0
  1173. PYME/resources/web/static/images/osd_flat/rotateleft_grouphover.png +0 -0
  1174. PYME/resources/web/static/images/osd_flat/rotateleft_hover.png +0 -0
  1175. PYME/resources/web/static/images/osd_flat/rotateleft_pressed.png +0 -0
  1176. PYME/resources/web/static/images/osd_flat/rotateleft_rest.png +0 -0
  1177. PYME/resources/web/static/images/osd_flat/rotateright_grouphover.png +0 -0
  1178. PYME/resources/web/static/images/osd_flat/rotateright_hover.png +0 -0
  1179. PYME/resources/web/static/images/osd_flat/rotateright_pressed.png +0 -0
  1180. PYME/resources/web/static/images/osd_flat/rotateright_rest.png +0 -0
  1181. PYME/resources/web/static/images/osd_flat/zoomin_grouphover.png +0 -0
  1182. PYME/resources/web/static/images/osd_flat/zoomin_hover.png +0 -0
  1183. PYME/resources/web/static/images/osd_flat/zoomin_pressed.png +0 -0
  1184. PYME/resources/web/static/images/osd_flat/zoomin_rest.png +0 -0
  1185. PYME/resources/web/static/images/osd_flat/zoomout_grouphover.png +0 -0
  1186. PYME/resources/web/static/images/osd_flat/zoomout_hover.png +0 -0
  1187. PYME/resources/web/static/images/osd_flat/zoomout_pressed.png +0 -0
  1188. PYME/resources/web/static/images/osd_flat/zoomout_rest.png +0 -0
  1189. PYME/resources/web/static/jigna-vue-bare.js +1395 -0
  1190. PYME/resources/web/static/jquery.min.js +2 -0
  1191. PYME/resources/web/static/jstree.min.js +6 -0
  1192. PYME/resources/web/static/openSeadragonGL.js +102 -0
  1193. PYME/resources/web/static/openseadragon-svg-overlay.js +103 -0
  1194. PYME/resources/web/static/openseadragon-viewerinputhook.min.js +6 -0
  1195. PYME/resources/web/static/openseadragon.min.js +9 -0
  1196. PYME/resources/web/static/recipe_editor.js +119 -0
  1197. PYME/resources/web/static/shaders/fragment/lut.glsl +20 -0
  1198. PYME/resources/web/static/shaders/fragment/none.glsl +17 -0
  1199. PYME/resources/web/static/shaders/fragment/outline.glsl +43 -0
  1200. PYME/resources/web/static/shaders/fragment/rect.glsl +7 -0
  1201. PYME/resources/web/static/shaders/fragment/sobel3.glsl +71 -0
  1202. PYME/resources/web/static/shaders/fragment/white.glsl +4 -0
  1203. PYME/resources/web/static/shaders/vertex/rect.glsl +22 -0
  1204. PYME/resources/web/static/shaders/vertex/square.glsl +9 -0
  1205. PYME/resources/web/static/utils.js +3 -0
  1206. PYME/resources/web/static/viaWebGL.js +217 -0
  1207. PYME/setup.py +109 -0
  1208. PYME/setup_exe.py +57 -0
  1209. PYME/simulation/__init__.py +0 -0
  1210. PYME/simulation/locify.py +319 -0
  1211. PYME/simulation/pointsets.py +279 -0
  1212. PYME/simulation/wormlike.py +99 -0
  1213. PYME/simulation/wormlike2.py +198 -0
  1214. PYME/simulation/wormlike3.py +197 -0
  1215. PYME/simulation/wormlike_curled.py +104 -0
  1216. PYME/tileviewer/__init__.py +0 -0
  1217. PYME/tileviewer/templates/roi_list.html +12 -0
  1218. PYME/tileviewer/templates/tileviewer.html +247 -0
  1219. PYME/tileviewer/tileviewer.py +207 -0
  1220. PYME/ui/AUIFrame.py +279 -0
  1221. PYME/ui/MetadataTree.py +469 -0
  1222. PYME/ui/__init__.py +4 -0
  1223. PYME/ui/about_dlg.py +29 -0
  1224. PYME/ui/autoFoldPanel.py +643 -0
  1225. PYME/ui/cascading_layout.py +45 -0
  1226. PYME/ui/crop_dialog.py +145 -0
  1227. PYME/ui/custom_traits_editors.py +508 -0
  1228. PYME/ui/editFilterDialog.py +80 -0
  1229. PYME/ui/editList.py +40 -0
  1230. PYME/ui/fastGraph.py +240 -0
  1231. PYME/ui/filterPane.py +348 -0
  1232. PYME/ui/histLimits.py +543 -0
  1233. PYME/ui/layerFoldPanel.py +232 -0
  1234. PYME/ui/manualFoldPanel.py +870 -0
  1235. PYME/ui/mytimer.py +116 -0
  1236. PYME/ui/patch_traitsui.py +151 -0
  1237. PYME/ui/progress.py +160 -0
  1238. PYME/ui/recArrayView.py +145 -0
  1239. PYME/ui/selection.py +71 -0
  1240. PYME/ui/shell.py +37 -0
  1241. PYME/ui/traitsui_constants.py +91 -0
  1242. PYME/ui/wx_compat.py +43 -0
  1243. PYME/update_version.py +159 -0
  1244. PYME/util/__init__.py +3 -0
  1245. PYME/util/authenticate.py +164 -0
  1246. PYME/util/execfile.py +21 -0
  1247. PYME/util/fProfile/__init__.py +1 -0
  1248. PYME/util/fProfile/convertProfile.py +117 -0
  1249. PYME/util/fProfile/fProfile.py +162 -0
  1250. PYME/util/fProfile/html/404.html +60 -0
  1251. PYME/util/fProfile/html/css/main.css +258 -0
  1252. PYME/util/fProfile/html/css/normalize.css +427 -0
  1253. PYME/util/fProfile/html/css/normalize.min.css +1 -0
  1254. PYME/util/fProfile/html/index.html +64 -0
  1255. PYME/util/fProfile/html/js/main.js +492 -0
  1256. PYME/util/fProfile/html/js/plugins.js +24 -0
  1257. PYME/util/fProfile/html/js/vendor/crossfilter.min.js +1 -0
  1258. PYME/util/fProfile/html/js/vendor/jquery-1.11.2.min.js +4 -0
  1259. PYME/util/fProfile/html/js/vendor/modernizr-2.8.3.min.js +4 -0
  1260. PYME/util/fProfile/html/js/vendor/tinycolor-min.js +4 -0
  1261. PYME/util/fProfile/viewProfile.py +30 -0
  1262. PYME/util/install_dependencies.py +95 -0
  1263. PYME/util/log_verbosity.py +11 -0
  1264. PYME/util/mProfile/__init__.py +1 -0
  1265. PYME/util/mProfile/colorize_db_t.py +297 -0
  1266. PYME/util/mProfile/mProfile.py +164 -0
  1267. PYME/util/mProfile/p.py +101 -0
  1268. PYME/util/mProfile/tProfile.py +165 -0
  1269. PYME/util/pymelauncher.py +47 -0
  1270. PYME/util/shmarray/__init__.py +0 -0
  1271. PYME/util/shmarray/shmTest.py +74 -0
  1272. PYME/util/shmarray/shmarray.py +165 -0
  1273. PYME/util/webframework.py +365 -0
  1274. PYME/version.py +62 -0
  1275. python_microscopy-25.11.20.dist-info/METADATA +68 -0
  1276. python_microscopy-25.11.20.dist-info/RECORD +1278 -0
  1277. python_microscopy-25.11.20.dist-info/WHEEL +4 -0
  1278. python_microscopy-25.11.20.dist-info/entry_points.txt +18 -0
@@ -0,0 +1,1386 @@
1
+ from .base import register_module, ModuleBase, Filter
2
+ from .traits import Input, Output, Float, Enum, CStr, Str, Bool, Int, List, FileOrURI, Dict
3
+
4
+ import numpy as np
5
+ from PYME.IO import tabular
6
+ from PYME.LMVis import renderers
7
+ import logging
8
+ logger = logging.getLogger(__name__)
9
+
10
+
11
+ @register_module('ExtractTableChannel')
12
+ class ExtractTableChannel(ModuleBase):
13
+ """Create and return a ColourFilter which has filtered out one colour channel from a table of localizations."""
14
+ inputName = Input('measurements')
15
+ channel = CStr('everything')
16
+ outputName = Output('filtered')
17
+
18
+ # def execute(self, namespace):
19
+ # inp = namespace[self.inputName]
20
+
21
+ # map = tabular.ColourFilter(inp, currentColour=self.channel)
22
+
23
+ # if 'mdh' in dir(inp):
24
+ # map.mdh = inp.mdh
25
+
26
+ # namespace[self.outputName] = map
27
+
28
+ def run(self, inputName):
29
+ return tabular.ColourFilter(inputName, currentColour=self.channel)
30
+
31
+ @property
32
+ def _colour_choices(self):
33
+ #try and find the available column names
34
+ try:
35
+ return tabular.ColourFilter.get_colour_chans(self._parent.namespace[self.inputName])
36
+ except:
37
+ return []
38
+
39
+ def _view_items(self, params=None):
40
+ from traitsui.api import Item
41
+ from PYME.ui.custom_traits_editors import CBEditor
42
+ return [Item('channel', editor=CBEditor(choices=self._colour_choices)),]
43
+
44
+
45
+
46
+ @register_module('DensityMapping')
47
+ class DensityMapping(ModuleBase):
48
+ """ Use density estimation methods to generate an image from localizations
49
+
50
+ """
51
+ inputLocalizations = Input('localizations')
52
+ outputImage = Output('output')
53
+
54
+ available_renderers = sorted(renderers.RENDERERS.keys())
55
+
56
+ renderingModule = Enum(available_renderers)#, default_value='Jittered Triangulation')
57
+
58
+ pixelSize = Float(5)
59
+ jitterVariable = CStr('1.0')
60
+ jitterScale = Float(1.0)
61
+ jitterVariableZ = CStr('1.0')
62
+ jitterScaleZ = Float(1.0)
63
+ MCProbability = Float(1.0)
64
+ numSamples = Int(10)
65
+ colours = List(Str, ['all',])
66
+ zBoundsMode = Enum(['manual', 'min-max'])
67
+ zBounds = List(Float, [-500, 500])
68
+ zSliceThickness = Float(50.0)
69
+ softRender = Bool(True)
70
+ xyBoundsMode = Enum(['estimate', 'inherit', 'metadata', 'manual'])
71
+ manualXYBounds = List(Float, [0,0,5e3, 5e3])
72
+
73
+
74
+ # def execute(self, namespace):
75
+ # from PYME.IO.image import ImageBounds
76
+ # inp = namespace[self.inputLocalizations]
77
+ # if not isinstance(inp, tabular.ColourFilter):
78
+ # cf = tabular.ColourFilter(inp, None)
79
+
80
+ # print('Created colour filter with chans: %s' % cf.getColourChans())
81
+ # cf.mdh = inp.mdh
82
+ # else:
83
+ # cf = inp
84
+
85
+ # #default to taking min and max localizations as image bounds
86
+ # imb = ImageBounds.estimateFromSource(inp)
87
+
88
+ # if self.zBoundsMode == 'min-max':
89
+ # self.zBounds[0], self.zBounds[1] = float(imb.z0), float(imb.z1)
90
+
91
+ # if (self.xyBoundsMode == 'inherit') and not (getattr(inp, 'imageBounds', None) is None):
92
+ # imb = inp.imageBounds
93
+ # elif self.xyBoundsMode == 'metadata':
94
+ # imb = ImageBounds.extractFromMetadata(inp.mdh)
95
+ # elif self.xyBoundsMode == 'manual':
96
+ # imb.x0, imb.y0, imb.x1, imb.y1 = self.manualXYBounds
97
+
98
+ # cf.imageBounds = imb
99
+
100
+
101
+ # renderer = renderers.RENDERERS[str(self.renderingModule)](None, cf)
102
+
103
+ # logger.debug('about to generate')
104
+
105
+ # out = renderer.Generate(self.trait_get())
106
+
107
+ # logger.debug(f'generated:{out.data_xyztc.shape}')
108
+
109
+ # namespace[self.outputImage] = out
110
+
111
+ def run(self, inputLocalizations):
112
+ from PYME.IO.image import ImageBounds
113
+ inp = inputLocalizations
114
+ if not isinstance(inp, tabular.ColourFilter):
115
+ cf = tabular.ColourFilter(inp, None)
116
+
117
+ print('Created colour filter with chans: %s' % cf.getColourChans())
118
+ cf.mdh = inp.mdh
119
+ else:
120
+ cf = inp
121
+
122
+ #default to taking min and max localizations as image bounds
123
+ imb = ImageBounds.estimateFromSource(inp)
124
+
125
+ if self.zBoundsMode == 'min-max':
126
+ self.zBounds[0], self.zBounds[1] = float(imb.z0), float(imb.z1)
127
+
128
+ if (self.xyBoundsMode == 'inherit') and not (getattr(inp, 'imageBounds', None) is None):
129
+ imb = inp.imageBounds
130
+ elif self.xyBoundsMode == 'metadata':
131
+ imb = ImageBounds.extractFromMetadata(inp.mdh)
132
+ elif self.xyBoundsMode == 'manual':
133
+ imb.x0, imb.y0, imb.x1, imb.y1 = self.manualXYBounds
134
+
135
+ cf.imageBounds = imb
136
+
137
+
138
+ renderer = renderers.RENDERERS[str(self.renderingModule)](None, cf)
139
+
140
+ logger.debug('about to generate')
141
+
142
+ out = renderer.Generate(self.trait_get())
143
+
144
+ logger.debug(f'generated:{out.data_xyztc.shape}')
145
+
146
+ return out
147
+
148
+ def _view_items(self, params=None):
149
+ from traitsui.api import Group, Item, CSVListEditor
150
+ return [Item('renderingModule'),
151
+ Item('pixelSize'),
152
+ Item('colours', style='text',editor=CSVListEditor(auto_set=False, enter_set=True)),
153
+ #Item('softRender'),
154
+ Group(
155
+ Item('jitterVariable'),
156
+ Item('jitterScale'),
157
+ Item('jitterVariableZ', visible_when='"3D" in renderingModule'),
158
+ Item('jitterScaleZ', visible_when='"3D" in renderingModule'),
159
+ Item('numSamples', visible_when='"Triangulation" in renderingModule'),
160
+ Item('MCProbability', visible_when='"Triangulation" in renderingModule'),
161
+ label='Jittering/Gaussian Size', visible_when='not (("Histogram" in renderingModule) or (renderingModule=="Current"))'),
162
+ Group(
163
+ Item('zSliceThickness'),
164
+ Item('zBoundsMode'),
165
+ Item('zBounds', visible_when='zBoundsMode=="manual"',editor=CSVListEditor(auto_set=False, enter_set=True)),
166
+ label='3D', visible_when='"3D" in renderingModule'),
167
+ Group(
168
+ Item('xyBoundsMode'),
169
+ Item('manualXYBounds', visible_when='xyBoundsMode=="manual"',editor=CSVListEditor(auto_set=False, enter_set=True)),
170
+ label='Output Image Size',
171
+ ),
172
+ ]
173
+
174
+ class DictWrapper(dict):
175
+ pass
176
+ @register_module('AddPipelineDerivedVars')
177
+ class Pipelineify(ModuleBase):
178
+ """
179
+ Perform standard mappings, including those derived from acquisition events.
180
+
181
+ Parameters
182
+ ----------
183
+ inputFitResults : string - the name of a tabular.TabularBase object
184
+ Typically the FitResults table of an h5r file
185
+ inputEvents : string - name of a tabular.TabularBase object containing acquisition events [optional]
186
+ This is not usually required as the IO methods attach `.events` as a datasource attribute. Use when events come
187
+ from a separate file or when there are intervening processing steps between IO and this module (the `.events`
188
+ attribute does not propagate through recipe modules).
189
+ TODO - do we really want to be attaching events as an attribute or should they be there own entry in the recipe namespace
190
+ TODO - should we change this to the processed events???
191
+ pixelSizeNM : float
192
+ Scaling factor to get 'x' and 'y' into units of nanometers. Useful if handling external data input in pixel units. Defaults to 1.
193
+
194
+ Returns
195
+ -------
196
+ outputLocalizations : tabular.MappingFilter
197
+
198
+ """
199
+ inputFitResults = Input('FitResults')
200
+ inputEvents = Input('')
201
+
202
+ # Fiducial table input
203
+ # inputDriftResults = Input('')
204
+ # TODO - to replicate the pipeline input processing, we should take inputFitResults and inputDriftResults and output
205
+ # 'Localisations' and 'Fiducials' (the fiducials get some, but not all of the manipulations and extra columns). Should
206
+ # we expand this module, or pass the fiducials though in the same way as the fit results, living with the fact that
207
+ # there will be extra columns?
208
+
209
+ pixelSizeNM = Float(1, label='nanometer units',
210
+ desc="scaling factor to get 'x' and 'y' into units of nanometers. Useful if handling external data input in pixel units")
211
+
212
+ foreshortening = Float(1.0, desc='scaling factor to correct for foreshortening in z')
213
+
214
+ outputLocalizations = Output('Localizations')
215
+ outputEventMaps = Output('event_maps')
216
+
217
+ # def execute(self, namespace):
218
+ # from PYME.LMVis import pipeline
219
+ # fitResults = namespace[self.inputFitResults]
220
+ # mdh = fitResults.mdh
221
+
222
+ # mapped_ds = tabular.MappingFilter(fitResults)
223
+
224
+
225
+ # if not self.pixelSizeNM == 1: # TODO - check close instead?
226
+ # mapped_ds.addVariable('pixelSize', self.pixelSizeNM)
227
+ # mapped_ds.setMapping('x', 'x*pixelSize')
228
+ # mapped_ds.setMapping('y', 'y*pixelSize')
229
+
230
+ # #extract information from any events
231
+ # if self.inputEvents != '':
232
+ # # Use specified table for events if given (otherwise look for a `.events` attribute on the input data
233
+ # # TODO: resolve how best to handle events (i.e. should they be a separate table, or should they be attached to data tables)
234
+ # events = namespace.get(self.inputEvents, None)
235
+ # else:
236
+ # try:
237
+ # events = fitResults.events
238
+ # except AttributeError:
239
+ # logger.debug('no events found')
240
+ # events = None
241
+
242
+ # if isinstance(events, tabular.TabularBase):
243
+ # events = events.to_recarray()
244
+
245
+ # ev_maps, ev_charts = pipeline._processEvents(mapped_ds, events, mdh)
246
+ # pipeline._add_missing_ds_keys(mapped_ds, ev_maps)
247
+
248
+ # #Fit module specific filter settings
249
+ # if 'Analysis.FitModule' in mdh.getEntryNames():
250
+ # fitModule = mdh['Analysis.FitModule']
251
+
252
+ # if 'LatGaussFitFR' in fitModule:
253
+ # # TODO - move getPhotonNums() out of pipeline
254
+ # mapped_ds.addColumn('nPhotons', pipeline.getPhotonNums(mapped_ds, mdh))
255
+
256
+ # if 'SplitterFitFNR' in fitModule:
257
+ # mapped_ds.addColumn('nPhotonsg', pipeline.getPhotonNums({'A': mapped_ds['fitResults_Ag'], 'sig': mapped_ds['fitResults_sigma']}, mdh))
258
+ # mapped_ds.addColumn('nPhotonsr', pipeline.getPhotonNums({'A': mapped_ds['fitResults_Ar'], 'sig': mapped_ds['fitResults_sigma']}, mdh))
259
+ # mapped_ds.setMapping('nPhotons', 'nPhotonsg+nPhotonsr')
260
+
261
+ # mapped_ds.mdh = mdh
262
+
263
+ # namespace[self.outputLocalizations] = mapped_ds
264
+
265
+ def run(self, inputFitResults, inputEvents=None):
266
+ from PYME.LMVis import pipeline
267
+ from PYME.IO import MetaDataHandler
268
+ fitResults = inputFitResults
269
+ mdh = MetaDataHandler.DictMDHandler(fitResults.mdh)
270
+
271
+ mapped_ds = tabular.MappingFilter(fitResults)
272
+
273
+
274
+ if not self.pixelSizeNM == 1: # TODO - check close instead?
275
+ mapped_ds.addVariable('pixelSize', self.pixelSizeNM)
276
+ mapped_ds.setMapping('x', 'x*pixelSize')
277
+ mapped_ds.setMapping('y', 'y*pixelSize')
278
+
279
+ #extract information from any events
280
+ if inputEvents:
281
+ events = inputEvents
282
+ else:
283
+ try:
284
+ events = fitResults.events
285
+ except AttributeError:
286
+ logger.debug('no events found')
287
+ events = None
288
+
289
+ if isinstance(events, tabular.TabularBase):
290
+ events = events.to_recarray()
291
+
292
+ ev_maps = pipeline._processEvents(mapped_ds, events, mdh)
293
+ pipeline._add_missing_ds_keys(mapped_ds, ev_maps)
294
+ mapped_ds.set_variables(foreShort=self.foreshortening)
295
+
296
+ #Fit module specific filter settings
297
+ if 'Analysis.FitModule' in mdh.getEntryNames():
298
+ fitModule = mdh['Analysis.FitModule']
299
+
300
+ if 'LatGaussFitFR' in fitModule:
301
+ # TODO - move getPhotonNums() out of pipeline
302
+ mapped_ds.addColumn('nPhotons', pipeline.getPhotonNums(mapped_ds, mdh))
303
+
304
+ if 'SplitterFitFNR' in fitModule:
305
+ mapped_ds.addColumn('nPhotonsg', pipeline.getPhotonNums({'A': mapped_ds['fitResults_Ag'], 'sig': mapped_ds['fitResults_sigma']}, mdh))
306
+ mapped_ds.addColumn('nPhotonsr', pipeline.getPhotonNums({'A': mapped_ds['fitResults_Ar'], 'sig': mapped_ds['fitResults_sigma']}, mdh))
307
+ mapped_ds.setMapping('nPhotons', 'nPhotonsg+nPhotonsr')
308
+
309
+ mapped_ds.mdh = mdh
310
+
311
+ return {'outputLocalizations' : mapped_ds, 'outputEventMaps' : DictWrapper(ev_maps)}
312
+
313
+ @register_module("ProcessColour")
314
+ class ProcessColour(ModuleBase):
315
+ input = Input('localizations')
316
+ output = Output('colour_mapped')
317
+
318
+ # ratios & dyes for ratiometric colour - maps species name to floating point ratio
319
+ # Note that these get filled in automatically from the metadata but will get saved with the recipe when the recipe
320
+ # is saved. If you want a generic recipe, you will need to manually remove the dye entries from the .yaml file
321
+ # TODO - do this automatically somehow?
322
+ # TODO - default is to override saved values with those from metadata. Change this?
323
+ species_ratios = Dict(str, float)
324
+ species_dyes = Dict(str, str)
325
+
326
+ ratios_from_metadata = Bool(True)
327
+
328
+ def _get_dye_ratios_from_metadata(self, mdh):
329
+ from PYME.LMVis import dyeRatios
330
+
331
+ labels = mdh.getOrDefault('Sample.Labelling', [])
332
+ seen_structures = []
333
+
334
+ for structure, dye in labels:
335
+ #info might be unicode - convert to a standard string to keep traits happy
336
+ structure = str(structure)
337
+ dye = str(dye)
338
+
339
+ if structure in seen_structures:
340
+ strucname = structure + '_1'
341
+ else:
342
+ strucname = structure
343
+ seen_structures.append(structure)
344
+
345
+ ratio = dyeRatios.getRatio(dye, mdh)
346
+
347
+ if not ratio is None:
348
+ self.species_ratios[strucname] = ratio
349
+ self.species_dyes[strucname] = dye
350
+
351
+ # def execute(self, namespace):
352
+ # input = namespace[self.input]
353
+ # mdh = input.mdh
354
+
355
+ # if self.ratios_from_metadata:
356
+ # # turn off invalidation so we don't get a recursive loop. TODO - fix this properly as it's gross to be changing
357
+ # # our parameters here
358
+ # invalidate = self._invalidate_parent
359
+ # self._invalidate_parent = False
360
+ # self._get_dye_ratios_from_metadata(mdh)
361
+ # self._invalidate_parent = invalidate
362
+
363
+ # output = tabular.MappingFilter(input)
364
+ # output.mdh = mdh
365
+
366
+ # if 'gFrac' in output.keys():
367
+ # #ratiometric
368
+ # #raise NotImplementedError('Ratiometric processing in recipes not implemented yet')
369
+ # for structure, ratio in self.species_ratios.items():
370
+ # if not ratio is None:
371
+ # output.setMapping('p_%s' % structure,
372
+ # 'exp(-(%f - gFrac)**2/(2*error_gFrac**2))/(error_gFrac*sqrt(2*numpy.pi))' % ratio)
373
+ # else:
374
+ # if 'probe' in output.keys():
375
+ # #non-ratiometric (i.e. sequential) colour
376
+ # #color channel is given in 'probe' column
377
+ # output.setMapping('ColourNorm', '1.0 + 0*probe')
378
+
379
+ # for i in range(int(output['probe'].min()), int(output['probe'].max() + 1)):
380
+ # output.setMapping('p_chan%d' % i, '1.0*(probe == %d)' % i)
381
+
382
+ # nSeqCols = mdh.getOrDefault('Protocol.NumberSequentialColors', 1)
383
+ # if nSeqCols > 1:
384
+ # for i in range(nSeqCols):
385
+ # output.setMapping('ColourNorm', '1.0 + 0*t')
386
+ # cr = mdh['Protocol.ColorRange%d' % i]
387
+ # output.setMapping('p_chan%d' % i, '(t>= %d)*(t<%d)' % cr)
388
+
389
+ # cached_output = tabular.CachingResultsFilter(output)
390
+ # #cached_output.mdh = output.mdh
391
+ # namespace[self.output] = cached_output
392
+
393
+ def run(self, input):
394
+ mdh = input.mdh
395
+
396
+ if self.ratios_from_metadata:
397
+ # turn off invalidation so we don't get a recursive loop. TODO - fix this properly as it's gross to be changing
398
+ # our parameters here
399
+ invalidate = self._invalidate_parent
400
+ self._invalidate_parent = False
401
+ self._get_dye_ratios_from_metadata(mdh)
402
+ self._invalidate_parent = invalidate
403
+
404
+ output = tabular.MappingFilter(input)
405
+ output.mdh = mdh
406
+
407
+ if 'gFrac' in output.keys():
408
+ #ratiometric
409
+ #raise NotImplementedError('Ratiometric processing in recipes not implemented yet')
410
+ for structure, ratio in self.species_ratios.items():
411
+ if not ratio is None:
412
+ output.setMapping('p_%s' % structure,
413
+ 'exp(-(%f - gFrac)**2/(2*error_gFrac**2))/(error_gFrac*sqrt(2*numpy.pi))' % ratio)
414
+ else:
415
+ if 'probe' in output.keys():
416
+ #non-ratiometric (i.e. sequential) colour
417
+ #color channel is given in 'probe' column
418
+ output.setMapping('ColourNorm', '1.0 + 0*probe')
419
+
420
+ for i in range(int(output['probe'].min()), int(output['probe'].max() + 1)):
421
+ output.setMapping('p_chan%d' % i, '1.0*(probe == %d)' % i)
422
+
423
+ nSeqCols = mdh.getOrDefault('Protocol.NumberSequentialColors', 1)
424
+ if nSeqCols > 1:
425
+ for i in range(nSeqCols):
426
+ output.setMapping('ColourNorm', '1.0 + 0*t')
427
+ cr = mdh['Protocol.ColorRange%d' % i]
428
+ output.setMapping('p_chan%d' % i, '(t>= %d)*(t<%d)' % cr)
429
+
430
+ cached_output = tabular.CachingResultsFilter(output)
431
+ #cached_output.mdh = output.mdh
432
+ return cached_output
433
+
434
+
435
+ @register_module('TimeBlocks')
436
+ class TimeBlocks(ModuleBase):
437
+ """
438
+
439
+ Divides series into alternating time blocks to generate 2 fake colour channels for Fourier Ring / Fourier shell correlation.
440
+
441
+ This is probably a better approach than taking random subsets as the later will tend to generate unrealistically high
442
+ correlation values for repeated localizations.
443
+
444
+ Adapted from Christian Soeller's 'splitRender' implementation.
445
+ """
446
+ input = Input('localizations')
447
+ output = Output('time_blocks')
448
+
449
+ block_size = Int(100)
450
+
451
+ # def execute(self, namespace):
452
+ # input = namespace[self.input]
453
+ # mdh = input.mdh
454
+
455
+ # output = tabular.MappingFilter(input)
456
+ # output.mdh = mdh
457
+
458
+ # output.addColumn('block_id', np.mod((output['t']/self.block_size).astype('int'),2))
459
+
460
+ # channel_names = [k for k in input.keys() if k.startswith('p_')]
461
+
462
+ # print(channel_names)
463
+ # print(input.keys())
464
+
465
+ # if len(channel_names) == 0:
466
+ # #single channel data - no channels defined.
467
+ # output.setMapping('ColourNorm', '1.0 + 0*t')
468
+ # output.setMapping('p_block0', '1.0*block_id')
469
+ # output.setMapping('p_block1', '1.0 - block_id')
470
+ # else:
471
+ # #have colour channels - subdivide them
472
+ # for k in channel_names:
473
+ # output.setMapping('%s_block0' % k, '%s*block_id' % k)
474
+ # output.setMapping('%s_block1' % k, '%s*(1.0 - block_id)' % k)
475
+
476
+ # #hide original channel names
477
+ # output.hidden_columns.extend(channel_names)
478
+
479
+
480
+ # namespace[self.output] = output
481
+
482
+ def run(self, input):
483
+ output = tabular.MappingFilter(input)
484
+
485
+ output.addColumn('block_id', np.mod((output['t']/self.block_size).astype('int'),2))
486
+
487
+ channel_names = [k for k in input.keys() if k.startswith('p_')]
488
+
489
+ #print(channel_names)
490
+ #print(input.keys())
491
+
492
+ if len(channel_names) == 0:
493
+ #single channel data - no channels defined.
494
+ output.setMapping('ColourNorm', '1.0 + 0*t')
495
+ output.setMapping('p_block0', '1.0*block_id')
496
+ output.setMapping('p_block1', '1.0 - block_id')
497
+ else:
498
+ #have colour channels - subdivide them
499
+ for k in channel_names:
500
+ output.setMapping('%s_block0' % k, '%s*block_id' % k)
501
+ output.setMapping('%s_block1' % k, '%s*(1.0 - block_id)' % k)
502
+
503
+ #hide original channel names
504
+ output.hidden_columns.extend(channel_names)
505
+
506
+ return output
507
+
508
+
509
+ @register_module('MergeClumps')
510
+ class MergeClumps(ModuleBase):
511
+ """Create a new mapping object which derives mapped keys from original ones"""
512
+ inputName = Input('clumped')
513
+ outputName = Output('merged')
514
+ labelKey = CStr('clumpIndex')
515
+ discardTrivial = Bool(False)
516
+
517
+ # def execute(self, namespace):
518
+ # from PYME.Analysis.points.DeClump import pyDeClump
519
+
520
+ # inp = namespace[self.inputName]
521
+ # grouped = pyDeClump.mergeClumps(inp, labelKey=self.labelKey)
522
+ # try:
523
+ # grouped.mdh = inp.mdh
524
+ # except AttributeError:
525
+ # pass
526
+ # grouped = pyDeClump.mergeClumps(inp, labelKey=self.labelKey, discard_trivial=self.discardTrivial)
527
+ # try:
528
+ # grouped.mdh = inp.mdh
529
+ # except AttributeError:
530
+ # pass
531
+
532
+ # namespace[self.outputName] = grouped
533
+
534
+ def run(self, inputName):
535
+ from PYME.Analysis.points.DeClump import pyDeClump
536
+ return pyDeClump.mergeClumps(inputName, labelKey=self.labelKey, discard_trivial=self.discardTrivial)
537
+
538
+
539
+ @register_module('IDTransientFrames')
540
+ class IDTransientFrames(ModuleBase): #FIXME - move to multi-view specific module and potentially rename (depending on whether we introduce scoping)
541
+ """
542
+ Adds an 'isTransient' column to the input datasource so that one can filter localizations that are from frames
543
+ acquired during z-translation
544
+ """
545
+ inputName = Input('zmapped')
546
+ inputEvents = Input('Events')
547
+ framesPerStep = Float()
548
+ outputName = Output('transientFiltered')
549
+
550
+ # def execute(self, namespace):
551
+ # from PYME.experimental import zMotionArtifactUtils
552
+
553
+ # inp = namespace[self.inputName]
554
+
555
+ # mapped = tabular.MappingFilter(inp)
556
+
557
+ # if 'mdh' not in dir(inp):
558
+ # if self.framesPerStep <= 0:
559
+ # raise RuntimeError('idTransientFrames needs metadata')
560
+ # else:
561
+ # fps = self.framesPerStep
562
+ # else:
563
+ # fps = inp.mdh['StackSettings.FramesPerStep']
564
+
565
+ # mask = zMotionArtifactUtils.flagMotionArtifacts(mapped, namespace[self.inputEvents], fps)
566
+ # mapped.addColumn('piezoUnstable', mask)
567
+
568
+ # mapped.mdh = inp.mdh
569
+
570
+ # namespace[self.outputName] = mapped
571
+
572
+ def run(self, inputName, inputEvents):
573
+ from PYME.experimental import zMotionArtifactUtils
574
+
575
+ mapped = tabular.MappingFilter(inputName)
576
+
577
+ if 'mdh' not in dir(inputName):
578
+ if self.framesPerStep <= 0:
579
+ raise RuntimeError('idTransientFrames needs metadata')
580
+ else:
581
+ fps = self.framesPerStep
582
+ else:
583
+ fps = inputName.mdh['StackSettings.FramesPerStep']
584
+
585
+ mask = zMotionArtifactUtils.flagMotionArtifacts(mapped, inputEvents, fps)
586
+ mapped.addColumn('piezoUnstable', mask)
587
+
588
+ return mapped
589
+
590
+ @register_module('DBSCANClustering')
591
+ class DBSCANClustering(ModuleBase):
592
+ """
593
+ Performs DBSCAN clustering on input dictionary
594
+
595
+ Parameters
596
+ ----------
597
+ searchRadius : float
598
+ search radius for clustering [nm]
599
+ minPtsForCore : int
600
+ number of points within SearchRadius required for a given point to be
601
+ considered a core point
602
+
603
+ Notes
604
+ -----
605
+
606
+ See `sklearn.cluster.dbscan` for more details about the underlying
607
+ algorithm and parameter meanings.
608
+
609
+ """
610
+ import multiprocessing
611
+ inputName = Input('filtered')
612
+
613
+ columns = List(str, ['x', 'y', 'z'])
614
+ searchRadius = Float(10)
615
+ minClumpSize = Int(1)
616
+
617
+ #exposes sklearn parallelism. Recipe modules are generally assumed
618
+ #to be single-threaded. Enable at your own risk
619
+ multithreaded = Bool(False)
620
+ numberOfJobs = Int(max(multiprocessing.cpu_count()-1,1))
621
+
622
+ clumpColumnName = CStr('dbscanClumpID')
623
+
624
+ outputName = Output('dbscanClustered')
625
+
626
+ # def execute(self, namespace):
627
+ # from sklearn.cluster import dbscan
628
+
629
+ # inp = namespace[self.inputName]
630
+ # mapped = tabular.MappingFilter(inp)
631
+
632
+ # # Note that sklearn gives unclustered points label of -1, and first value starts at 0.
633
+ # if self.multithreaded:
634
+ # core_samp, dbLabels = dbscan(np.vstack([inp[k] for k in self.columns]).T,
635
+ # eps=self.searchRadius, min_samples=self.minClumpSize, n_jobs=self.numberOfJobs)
636
+ # else:
637
+ # #NB try-catch from Christians multithreaded example removed as I think we should see failure here
638
+ # core_samp, dbLabels = dbscan(np.vstack([inp[k] for k in self.columns]).T,
639
+ # eps=self.searchRadius, min_samples=self.minClumpSize)
640
+
641
+ # # shift dbscan labels up by one to match existing convention that a clumpID of 0 corresponds to unclumped
642
+ # mapped.addColumn(str(self.clumpColumnName), dbLabels + 1)
643
+
644
+ # # propogate metadata, if present
645
+ # try:
646
+ # mapped.mdh = inp.mdh
647
+ # except AttributeError:
648
+ # pass
649
+
650
+ # namespace[self.outputName] = mapped
651
+
652
+ def run(self, inputName):
653
+ from sklearn.cluster import dbscan
654
+
655
+ inp = inputName
656
+ mapped = tabular.MappingFilter(inp)
657
+
658
+ # Note that sklearn gives unclustered points label of -1, and first value starts at 0.
659
+ if self.multithreaded:
660
+ core_samp, dbLabels = dbscan(np.vstack([inp[k] for k in self.columns]).T,
661
+ eps=self.searchRadius, min_samples=self.minClumpSize, n_jobs=self.numberOfJobs)
662
+ else:
663
+ #NB try-catch from Christians multithreaded example removed as I think we should see failure here
664
+ core_samp, dbLabels = dbscan(np.vstack([inp[k] for k in self.columns]).T,
665
+ eps=self.searchRadius, min_samples=self.minClumpSize)
666
+
667
+ # shift dbscan labels up by one to match existing convention that a clumpID of 0 corresponds to unclumped
668
+ mapped.addColumn(str(self.clumpColumnName), dbLabels + 1)
669
+
670
+ return mapped
671
+
672
+ @property
673
+ def hide_in_overview(self):
674
+ return ['columns']
675
+
676
+ def _view_items(self, params=None):
677
+ from traitsui.api import Item, TextEditor
678
+ return [Item('columns', editor=TextEditor(auto_set=False, enter_set=True, evaluate=List(str))),
679
+ Item('searchRadius'),
680
+ Item('minClumpSize'),
681
+ Item('multithreaded'),
682
+ Item('numberOfJobs'),
683
+ Item('clumpColumnName'),]
684
+
685
+
686
+
687
+ #TODO - this is very specialized and probably doesn't belong here - at least not in this form
688
+ @register_module('ClusterCountVsImagingTime')
689
+ class ClusterCountVsImagingTime(ModuleBase):
690
+ """
691
+ WARNING: This module will likely move, dissapear, or be refactored
692
+
693
+ ClusterCountVsImagingTime iteratively filters a dictionary-like object on t, and at each step counts the number of
694
+ labeled objects (e.g. DBSCAN clusters) which contain at least N-points. It does this for two N-points, so one can be
695
+ set according to density with all frames included, and the other can be set for one of the earlier frame-counts.
696
+
697
+ args:
698
+ stepSize: number of frames to add in on each iteration
699
+ labelsKey: key containing labels for each localization
700
+ lowerMinPtsPerCluster:
701
+ higherMinPtsPerCluster:
702
+
703
+ returns:
704
+ dictionary-like object with the following keys:
705
+ t: upper bound on frame number included in calculations on each iteration.
706
+ N_labelsWithLowMinPoints:
707
+ N_labelsWithHighMinPoints:
708
+
709
+ From wikipedia: "While minPts intuitively is the minimum cluster size, in some cases DBSCAN can produce smaller
710
+ clusters. A DBSCAN cluster consists of at least one core point. As other points may be border points to more than
711
+ one cluster, there is no guarantee that at least minPts points are included in every cluster."
712
+ """
713
+ inputName = Input('input')
714
+
715
+ labelsKey = CStr('dbscanClumpID')
716
+ lowerMinPtsPerCluster = Int(3)
717
+ higherMinPtsPerCluster = Int(6)
718
+ stepSize = Int(3000)
719
+
720
+ outputName = Output('incremented')
721
+
722
+ # def execute(self, namespace):
723
+ # from PYME.IO import tabular
724
+
725
+ # if self.lowerMinPtsPerCluster > self.higherMinPtsPerCluster:
726
+ # print('Swapping low and high MinPtsPerCluster - input was reversed')
727
+ # temp = self.lowerMinPtsPerCluster
728
+ # self.lowerMinPtsPerCluster = self.higherMinPtsPerCluster
729
+ # self.higherMinPtsPerCluster = temp
730
+
731
+ # iters = (int(np.max(namespace[self.inputName]['t']))/int(self.stepSize)) + 2
732
+
733
+ # # other counts
734
+ # lowDensMinPtsClumps = np.empty(iters)
735
+ # lowDensMinPtsClumps[0] = 0
736
+ # hiDensMinPtsClumps = np.empty(iters)
737
+ # hiDensMinPtsClumps[0] = 0
738
+ # t = np.empty(iters)
739
+ # t[0] = 0
740
+
741
+ # inp = tabular.MappingFilter(namespace[self.inputName])
742
+
743
+ # for ind in range(1, iters): # start from 1 since t=[0,0] will yield no clumps
744
+ # # filter time
745
+ # inc = tabular.ResultsFilter(inp, t=[0, self.stepSize * ind])
746
+ # t[ind] = np.max(inc['t'])
747
+
748
+ # cid, counts = np.unique(inc[self.labelsKey], return_counts=True)
749
+ # # cmask = np.in1d(inc['DBSCAN_allFrames'], cid)
750
+
751
+ # cidL = cid[counts >= self.lowerMinPtsPerCluster]
752
+ # lowDensMinPtsClumps[ind] = np.sum(cidL != -1) # ignore unclumped in count
753
+ # cid = cid[counts >= self.higherMinPtsPerCluster]
754
+ # hiDensMinPtsClumps[ind] = np.sum(cid != -1) # ignore unclumped in count
755
+
756
+
757
+ # res = tabular.MappingFilter({'t': t,
758
+ # 'N_labelsWithLowMinPoints': lowDensMinPtsClumps,
759
+ # 'N_labelsWithHighMinPoints': hiDensMinPtsClumps})
760
+
761
+ # # propagate metadata, if present
762
+ # try:
763
+ # res.mdh = namespace[self.inputName].mdh
764
+ # except AttributeError:
765
+ # pass
766
+
767
+ # namespace[self.outputName] = res
768
+
769
+ def run(self, inputName):
770
+ from PYME.IO import tabular
771
+
772
+ inp = tabular.MappingFilter(inputName)
773
+
774
+ if self.lowerMinPtsPerCluster > self.higherMinPtsPerCluster:
775
+ print('Swapping low and high MinPtsPerCluster - input was reversed')
776
+ temp = self.lowerMinPtsPerCluster
777
+ self.lowerMinPtsPerCluster = self.higherMinPtsPerCluster
778
+ self.higherMinPtsPerCluster = temp
779
+
780
+ iters = (int(np.max(inp['t']))/int(self.stepSize)) + 2
781
+
782
+ # other counts
783
+ lowDensMinPtsClumps = np.empty(iters)
784
+ lowDensMinPtsClumps[0] = 0
785
+ hiDensMinPtsClumps = np.empty(iters)
786
+ hiDensMinPtsClumps[0] = 0
787
+ t = np.empty(iters)
788
+ t[0] = 0
789
+
790
+
791
+ for ind in range(1, iters): # start from 1 since t=[0,0] will yield no clumps
792
+ # filter time
793
+ inc = tabular.ResultsFilter(inp, t=[0, self.stepSize * ind])
794
+ t[ind] = np.max(inc['t'])
795
+
796
+ cid, counts = np.unique(inc[self.labelsKey], return_counts=True)
797
+ # cmask = np.in1d(inc['DBSCAN_allFrames'], cid)
798
+
799
+ cidL = cid[counts >= self.lowerMinPtsPerCluster]
800
+ lowDensMinPtsClumps[ind] = np.sum(cidL != -1) # ignore unclumped in count
801
+ cid = cid[counts >= self.higherMinPtsPerCluster]
802
+ hiDensMinPtsClumps[ind] = np.sum(cid != -1) # ignore unclumped in count
803
+
804
+
805
+ return tabular.MappingFilter({'t': t,
806
+ 'N_labelsWithLowMinPoints': lowDensMinPtsClumps,
807
+ 'N_labelsWithHighMinPoints': hiDensMinPtsClumps})
808
+
809
+
810
+ @register_module('LabelsFromImage')
811
+ class LabelsFromImage(ModuleBase):
812
+ """
813
+ Maps each point in the input table to a pixel in a labelled image, and extracts the pixel value at that location to
814
+ use as a label for the point data.
815
+
816
+ Inputs
817
+ ------
818
+ inputName: Input
819
+ name of tabular input containing positions ('x', 'y', and optionally 'z' columns should be present)
820
+ inputImage: Input
821
+ name of image input containing labels
822
+
823
+ Outputs
824
+ -------
825
+ outputName: Output
826
+ name of tabular output. A mapped version of the tabular input with 2 extra columns
827
+ label_key_name : CStr
828
+ name of new column which will contain the label number from image, mapped to each localization within that label
829
+ label_count_key_name : CStr
830
+ name of new column which will contain the number of localizations within the label that a given localization
831
+ belongs to
832
+ minimum_localizations: Int
833
+ threshold for the number of localizations required to propagate a label through to localizations
834
+
835
+ """
836
+ inputName = Input('input')
837
+ inputImage = Input('labeled')
838
+
839
+ label_key_name = CStr('objectID')
840
+ label_count_key_name = CStr('NEvents')
841
+
842
+ minimum_localizations = Int(1)
843
+
844
+ outputName = Output('labeled_points')
845
+
846
+ # def execute(self, namespace):
847
+ # from PYME.IO import tabular
848
+ # from PYME.Analysis.points import cluster_morphology
849
+
850
+ # inp = namespace[self.inputName]
851
+ # img = namespace[self.inputImage]
852
+
853
+ # ids, numPerObject = cluster_morphology.get_labels_from_image(img, inp, minimum_localizations=self.minimum_localizations)
854
+
855
+ # labeled = tabular.MappingFilter(inp)
856
+ # labeled.addColumn(self.label_key_name, ids)
857
+ # labeled.addColumn(self.label_count_key_name, numPerObject[ids - 1])
858
+
859
+ # # propagate metadata, if present
860
+ # try:
861
+ # labeled.mdh = namespace[self.inputName].mdh
862
+ # except AttributeError:
863
+ # pass
864
+
865
+ # namespace[self.outputName] = labeled
866
+
867
+ def run(self, inputName, inputImage):
868
+ from PYME.IO import tabular
869
+ from PYME.Analysis.points import cluster_morphology
870
+
871
+ ids, numPerObject = cluster_morphology.get_labels_from_image(inputImage, inputName, minimum_localizations=self.minimum_localizations)
872
+
873
+ labeled = tabular.MappingFilter(inputName)
874
+ labeled.addColumn(self.label_key_name, ids)
875
+ labeled.addColumn(self.label_count_key_name, numPerObject[ids - 1])
876
+
877
+ return labeled
878
+
879
+
880
+ @register_module('MeasureClusters3D')
881
+ class MeasureClusters3D(ModuleBase):
882
+ """
883
+ Measures the 3D morphology of clusters of points
884
+
885
+ Inputs
886
+ ------
887
+
888
+ inputName : name of tabular data containing x, y, and z columns and labels identifying which cluster each point
889
+ belongs to.
890
+
891
+ Outputs
892
+ -------
893
+
894
+ outputName: a new tabular data source containing measurements of the clusters
895
+
896
+ Parameters
897
+ ----------
898
+ labelKey: name of column to use as a label identifying clusters
899
+
900
+ Notes
901
+ -----
902
+
903
+ Measures calculated (to be expanded)
904
+
905
+ :count: int
906
+ Number of localizations (points) in the cluster
907
+ :x: float
908
+ x center of mass
909
+ :y: float
910
+ y center of mass
911
+ :z: float
912
+ z center of mass
913
+ :gyrationRadius : float
914
+ root mean square displacement to center of cluster, a measure of compaction or spatial extent see also
915
+ supplemental text of DOI: 10.1038/nature16496
916
+ :axis0 : ndarray, shape (3,)
917
+ principle axis which accounts for the largest variance of the cluster, i.e. corresponds to the largest
918
+ eigenvalue
919
+ :axis1 : ndarray, shape (3,)
920
+ next principle axis
921
+ :axis2 : ndarray, shape (3,)
922
+ principle axis corresponding to the smallest eigenvalue
923
+ :sigma0 : float
924
+ standard deviation along axis0
925
+ :sigma1 : float
926
+ standard deviation along axis1
927
+ :sigma2 : float
928
+ standard deviation along axis2
929
+ :anisotropy : float
930
+ metric of anisotropy based on the spread along principle axes. Standard deviations of alpha * [1, 0, 0],
931
+ where alpha is a scalar, will result in an 'anisotropy' value of 1, i.e. maximally anisotropic. Completely
932
+ isotropic clusters will have equal standard deviations, i.e. alpha * [1, 1, 1], which corresponds to an
933
+ 'anisotropy' value of 0. Intermediate cases result in values between 0 and 1.
934
+ :theta : float
935
+ Azimuthal angle, in radians, along which the principle axis (axis0) points
936
+ :phi : float
937
+ Zenith angle, in radians, along which the principle axis (axis0) points
938
+
939
+ """
940
+ inputName = Input('input')
941
+ labelKey = CStr('clumpIndex')
942
+
943
+ outputName = Output('clusterMeasures')
944
+
945
+ # def execute(self, namespace):
946
+ # from PYME.Analysis.points import cluster_morphology as cmorph
947
+ # import numpy as np
948
+
949
+ # inp = namespace[self.inputName]
950
+
951
+ # labels = inp[self.labelKey].astype(np.int)
952
+ # # make sure labeling scheme is consistent with what pyme conventions
953
+ # if (len(labels) > 0) and (labels.min() < 0):
954
+ # raise UserWarning('This module expects 0-label for unclustered points, and no negative labels')
955
+
956
+ # I = np.argsort(labels)
957
+ # I = I[labels[I] > 0]
958
+
959
+ # x_vals, y_vals, z_vals = inp['x'][I], inp['y'][I], inp['z'][I]
960
+ # labels = labels[I]
961
+ # maxLabel = labels[-1] if (len(labels) > 0) else 0
962
+
963
+ # #find the unique labels, and their separation in the sorted list of points
964
+ # unique_labels, counts = np.unique(labels, return_counts=True)
965
+
966
+ # #allocate memory to store results in
967
+ # measurements = np.zeros(maxLabel, cmorph.measurement_dtype)
968
+
969
+ # # loop over labels, recalling that input is now sorted, and we know how many points are in each label.
970
+ # # Note that missing labels result in zeroed entries (i.e. the initial values are not changed).
971
+ # # Missing values can be filtered out later, if desired, by filtering on the 'counts' column, but having a dense
972
+ # # array where index == label number makes any postprocessing in which we might want to find the data
973
+ # # corresponding to a particular label MUCH easier and faster.
974
+ # indi = 0
975
+ # for label_num, ct in zip(unique_labels, counts):
976
+ # indf = indi + ct
977
+
978
+ # # create x,y,z arrays for this cluster, and calculate center of mass
979
+ # x, y, z = x_vals[indi:indf], y_vals[indi:indf], z_vals[indi:indf]
980
+
981
+ # cluster_index = label_num - 1 # we ignore the unclustered points, and start labeling at 1
982
+ # cmorph.measure_3d(x, y, z, output=measurements[cluster_index])
983
+
984
+ # indi = indf
985
+
986
+ # meas = tabular.RecArraySource(measurements)
987
+
988
+ # try:
989
+ # meas.mdh = namespace[self.inputName].mdh
990
+ # except AttributeError:
991
+ # pass
992
+
993
+ # namespace[self.outputName] = meas
994
+
995
+
996
+ def run(self, inputName):
997
+ from PYME.Analysis.points import cluster_morphology as cmorph
998
+ import numpy as np
999
+
1000
+ inp = inputName
1001
+
1002
+ labels = inp[self.labelKey].astype(int)
1003
+ # make sure labeling scheme is consistent with what pyme conventions
1004
+ if (len(labels) > 0) and (labels.min() < 0):
1005
+ raise UserWarning('This module expects 0-label for unclustered points, and no negative labels')
1006
+
1007
+ I = np.argsort(labels)
1008
+ I = I[labels[I] > 0]
1009
+
1010
+ x_vals, y_vals, z_vals = inp['x'][I], inp['y'][I], inp['z'][I]
1011
+ labels = labels[I]
1012
+ maxLabel = labels[-1] if (len(labels) > 0) else 0
1013
+
1014
+ #find the unique labels, and their separation in the sorted list of points
1015
+ unique_labels, counts = np.unique(labels, return_counts=True)
1016
+
1017
+ #allocate memory to store results in
1018
+ measurements = np.zeros(maxLabel, cmorph.measurement_dtype)
1019
+
1020
+ # loop over labels, recalling that input is now sorted, and we know how many points are in each label.
1021
+ # Note that missing labels result in zeroed entries (i.e. the initial values are not changed).
1022
+ # Missing values can be filtered out later, if desired, by filtering on the 'counts' column, but having a dense
1023
+ # array where index == label number makes any postprocessing in which we might want to find the data
1024
+ # corresponding to a particular label MUCH easier and faster.
1025
+ indi = 0
1026
+ for label_num, ct in zip(unique_labels, counts):
1027
+ indf = indi + ct
1028
+
1029
+ # create x,y,z arrays for this cluster, and calculate center of mass
1030
+ x, y, z = x_vals[indi:indf], y_vals[indi:indf], z_vals[indi:indf]
1031
+
1032
+ cluster_index = label_num - 1 # we ignore the unclustered points, and start labeling at 1
1033
+ cmorph.measure_3d(x, y, z, output=measurements[cluster_index])
1034
+
1035
+ indi = indf
1036
+
1037
+ # propagate the labelKey used to generate these measurements
1038
+ output = tabular.MappingFilter(tabular.RecArraySource(measurements))
1039
+ output.addColumn(self.labelKey, np.arange(maxLabel))
1040
+ return output
1041
+
1042
+
1043
+ @register_module('AddMeasurementsByLabel')
1044
+ class AddMeasurementsByLabel(ModuleBase):
1045
+ input_points = Input('input')
1046
+ input_measurements = Input('clusterMeasures')
1047
+ label_key = CStr('label')
1048
+ output_points = Output('annotated_points')
1049
+
1050
+ def run(self, input_points, input_measurements):
1051
+ """
1052
+ Propagate measurements from e.g. MeasureClusters3D back to points they were calcualted from.
1053
+ This is particularly useful for visualizing e.g. the gyration radius of a cluster in PYMEVis
1054
+ while looking at the original localization data.
1055
+
1056
+ Parameters
1057
+ ----------
1058
+ input_points : PYME.IO.tabular.TabularBase
1059
+ points used to generate the measurements
1060
+ input_measurements : PYME.IO.tabular.TabularBase
1061
+ measurements to propagate back to the points
1062
+
1063
+ Returns
1064
+ -------
1065
+ PYME.IO.tabular.TabularBase
1066
+ point data with new columns added, one for each scalar measurement in input_measurements, which
1067
+ can be accessed by '<label_key>_<measurement_key>', e.g. 'clumpIndex_gyrationRadius'.
1068
+
1069
+ """
1070
+ from PYME.IO.tabular import MappingFilter
1071
+
1072
+ # only propagate 1D measurements
1073
+ annotations = dict()
1074
+ for k in input_measurements.keys():
1075
+ if input_measurements[k].ndim == 1: #TODO - also check for object dtype?
1076
+ annotations[k] = np.zeros(len(input_points), dtype=input_measurements[k].dtype)
1077
+
1078
+ try:
1079
+ labels = np.unique(input_measurements[self.label_key])
1080
+ except KeyError:
1081
+ logger.exception('Label key %s not found in input_measurements, RISKY: continuing with assumption measurements are sorted by label and all present' % self.label_key)
1082
+ labels = np.arange(1, len(input_measurements) + 1) # MeasureClusters3D ignores the unclustered points 'label 0' so index 0 corresponds to 'label 1'
1083
+
1084
+ for label in labels:
1085
+ points_mask = label == input_points[self.label_key]
1086
+ try:
1087
+ measurement_mask = label == input_measurements[self.label_key]
1088
+ except KeyError:
1089
+ measurement_mask = label - 1 # MeasureClusters3D ignores the unclustered points 'label 0' so index 0 corresponds to 'label 1'
1090
+
1091
+ for k in annotations.keys():
1092
+ annotations[k][points_mask] = input_measurements[k][measurement_mask]
1093
+
1094
+ output_points = MappingFilter(input_points)
1095
+ try:
1096
+ output_points.mdh = input_points.mdh
1097
+ except AttributeError:
1098
+ pass
1099
+
1100
+ for k in annotations.keys():
1101
+ output_points.addColumn(self.label_key + '_' + k, annotations[k])
1102
+
1103
+ return output_points
1104
+
1105
+
1106
+ @register_module('FiducialCorrection')
1107
+ class FiducialCorrection(ModuleBase):
1108
+ """
1109
+ Maps each point in the input table to a pixel in a labelled image, and extracts the pixel value at that location to
1110
+ use as a label for the point data.
1111
+
1112
+ Inputs
1113
+ ------
1114
+ inputName: name of tabular input containing positions ('x', 'y', and optionally 'z' columns should be present)
1115
+ inputImage: name of image input containing labels
1116
+
1117
+ Outputs
1118
+ -------
1119
+ outputName: name of tabular output. A mapped version of the tabular input with 2 extra columns
1120
+ objectID: Label number from image, mapped to each localization within that label
1121
+ NEvents: Number of localizations within the label that a given localization belongs to
1122
+
1123
+ """
1124
+ inputLocalizations = Input('Localizations')
1125
+ inputFiducials = Input('Fiducials')
1126
+
1127
+ clumpRadiusVar = CStr('error_x')
1128
+ clumpRadiusMultiplier = Float(5.0)
1129
+ timeWindow = Int(25)
1130
+
1131
+ temporalFilter = Enum(['Gaussian', 'Uniform', 'Median'])
1132
+ temporalFilterScale = Float(10.0)
1133
+
1134
+ outputName = Output('corrected_localizations')
1135
+ outputFiducials = Output('corrected_fiducials')
1136
+
1137
+ # def execute(self, namespace):
1138
+ # from PYME.IO import tabular
1139
+ # from PYME.Analysis.points import fiducials
1140
+
1141
+ # locs = namespace[self.inputLocalizations]
1142
+ # fids = namespace[self.inputFiducials]
1143
+
1144
+ # t_fid, fid_trajectory, clump_index = fiducials.extractAverageTrajectory(fids, clumpRadiusVar=self.clumpRadiusVar,
1145
+ # clumpRadiusMultiplier=float(self.clumpRadiusMultiplier),
1146
+ # timeWindow=int(self.timeWindow),
1147
+ # filter=self.temporalFilter, filterScale=float(self.temporalFilterScale))
1148
+
1149
+ # out = tabular.MappingFilter(locs)
1150
+ # t_out = out['t']
1151
+
1152
+ # out_f = tabular.MappingFilter(fids)
1153
+ # out_f.addColumn('clumpIndex', clump_index)
1154
+ # t_out_f = out_f['t']
1155
+
1156
+ # for dim in fid_trajectory.keys():
1157
+ # print(dim)
1158
+ # out.addColumn('fiducial_{0}'.format(dim), np.interp(t_out, t_fid, fid_trajectory[dim]))
1159
+ # out.setMapping(dim, '{0} - fiducial_{0}'.format(dim))
1160
+
1161
+ # out_f.addColumn('fiducial_{0}'.format(dim), np.interp(t_out_f, t_fid, fid_trajectory[dim]))
1162
+ # out_f.setMapping(dim, '{0} - fiducial_{0}'.format(dim))
1163
+
1164
+ # # propagate metadata, if present
1165
+ # try:
1166
+ # out.mdh = locs.mdh
1167
+ # except AttributeError:
1168
+ # pass
1169
+
1170
+ # namespace[self.outputName] = out
1171
+ # namespace[self.outputFiducials] = out_f
1172
+
1173
+ def run(self, inputLocalizations, inputFiducials):
1174
+ from PYME.IO import tabular
1175
+ from PYME.Analysis.points import fiducials
1176
+ from PYME.IO import MetaDataHandler
1177
+
1178
+ t_fid, fid_trajectory, clump_index = fiducials.extractAverageTrajectory(inputFiducials, clumpRadiusVar=self.clumpRadiusVar,
1179
+ clumpRadiusMultiplier=float(self.clumpRadiusMultiplier),
1180
+ timeWindow=int(self.timeWindow),
1181
+ filter=self.temporalFilter, filterScale=float(self.temporalFilterScale))
1182
+
1183
+ out = tabular.MappingFilter(inputLocalizations)
1184
+ t_out = out['t']
1185
+
1186
+ out_f = tabular.MappingFilter(inputFiducials)
1187
+ out_f.addColumn('clumpIndex', clump_index)
1188
+ t_out_f = out_f['t']
1189
+
1190
+ for dim in fid_trajectory.keys():
1191
+ print(dim)
1192
+ out.addColumn('fiducial_{0}'.format(dim), np.interp(t_out, t_fid, fid_trajectory[dim]))
1193
+ out.setMapping(dim, '{0} - fiducial_{0}'.format(dim))
1194
+
1195
+ out_f.addColumn('fiducial_{0}'.format(dim), np.interp(t_out_f, t_fid, fid_trajectory[dim]))
1196
+ out_f.setMapping(dim, '{0} - fiducial_{0}'.format(dim))
1197
+
1198
+ # propagate metadata, if present
1199
+ try:
1200
+ out.mdh = MetaDataHandler.DictMDHandler(inputLocalizations.mdh)
1201
+ except AttributeError:
1202
+ pass
1203
+
1204
+ return {'outputName': out, 'outputFiducials' : out_f}
1205
+
1206
+
1207
+ @register_module('AutocorrelationDriftCorrection')
1208
+ class AutocorrelationDriftCorrection(ModuleBase):
1209
+ """
1210
+ Perform drift correction using autocorrelation between subsets of the point data
1211
+
1212
+ Inputs
1213
+ ------
1214
+ inputName: name of tabular input containing positions ('x', 'y', and 't' columns should be present)
1215
+ step : time step (in frames) with which to traverse the series
1216
+ window: size of time window (in frames). A series of images will be generated from
1217
+ multiple overlapping windows, spaced by `step` frames.
1218
+ binsize: size of histogram bins in nm
1219
+
1220
+ Outputs
1221
+ -------
1222
+ outputName: name of tabular output. A mapped version of the tabular input with 2 extra columns
1223
+
1224
+ """
1225
+ inputName = Input('Localizations')
1226
+ step = Int(200)
1227
+ window = Int(500)
1228
+ binsize = Float(30)
1229
+
1230
+ outputName = Output('corrected_localizations')
1231
+
1232
+ def calcCorrDrift(self, x, y, t):
1233
+ from scipy import ndimage
1234
+
1235
+ tMax = int(t.max())
1236
+
1237
+ bx = np.arange(x.min(), x.max() + self.binsize, self.binsize)
1238
+ by = np.arange(y.min(), y.max() + self.binsize, self.binsize)
1239
+
1240
+ tInd = t < self.window
1241
+
1242
+ h1 = np.histogram2d(x[tInd], y[tInd], [bx, by])[0]
1243
+ H1 = np.fft.fftn(h1)
1244
+
1245
+ shifts = []
1246
+ tis = []
1247
+
1248
+ for ti in range(0, tMax + 1, self.step):
1249
+ tInd = (t >= ti) * (t < (ti + self.window))
1250
+ h2 = np.histogram2d(x[tInd], y[tInd], [bx, by])[0]
1251
+
1252
+ xc = abs(np.fft.ifftshift(np.fft.ifftn(H1 * np.fft.ifftn(h2))))
1253
+
1254
+ xct = (xc - xc.max() / 3) * (xc > xc.max() / 3)
1255
+
1256
+ shifts.append(ndimage.measurements.center_of_mass(xct))
1257
+ tis.append(ti + self.window / 2.)
1258
+
1259
+ sha = np.array(shifts)
1260
+
1261
+ return np.array(tis), self.binsize * (sha - sha[0])
1262
+
1263
+ # def execute(self, namespace):
1264
+ # from PYME.IO import tabular
1265
+ # locs = namespace[self.inputName]
1266
+
1267
+ # t_shift, shifts = self.calcCorrDrift(locs['x'], locs['y'], locs['t'])
1268
+ # shx = shifts[:, 0]
1269
+ # shy = shifts[:, 1]
1270
+
1271
+ # out = tabular.MappingFilter(locs)
1272
+ # t_out = out['t']
1273
+ # dx = np.interp(t_out, t_shift, shx)
1274
+ # dy = np.interp(t_out, t_shift, shy)
1275
+
1276
+
1277
+ # out.addColumn('dx', dx)
1278
+ # out.addColumn('dy', dy)
1279
+ # out.setMapping('x', 'x + dx')
1280
+ # out.setMapping('y', 'y + dy')
1281
+
1282
+ # # propagate metadata, if present
1283
+ # try:
1284
+ # out.mdh = locs.mdh
1285
+ # except AttributeError:
1286
+ # pass
1287
+
1288
+ # namespace[self.outputName] = out
1289
+
1290
+ def run(self, inputName):
1291
+ from PYME.IO import tabular
1292
+ locs = inputName
1293
+
1294
+ t_shift, shifts = self.calcCorrDrift(locs['x'], locs['y'], locs['t'])
1295
+ shx = shifts[:, 0]
1296
+ shy = shifts[:, 1]
1297
+
1298
+ out = tabular.MappingFilter(locs)
1299
+ t_out = out['t']
1300
+ dx = np.interp(t_out, t_shift, shx)
1301
+ dy = np.interp(t_out, t_shift, shy)
1302
+
1303
+
1304
+ out.addColumn('dx', dx)
1305
+ out.addColumn('dy', dy)
1306
+ out.setMapping('x', 'x + dx')
1307
+ out.setMapping('y', 'y + dy')
1308
+
1309
+ return out
1310
+
1311
+ @register_module('MapAstigZ')
1312
+ class MapAstigZ(ModuleBase):
1313
+ """
1314
+
1315
+ Uses astigmatism calibration (widths of PSF along each dimension as a function of z) to determine the z-position of
1316
+ localizations relative to the focal plane of the frame during which it was imaged. Note this is the single channel version
1317
+ and does not work for combined biplane and astigmatism (see Multiview.MapAstigZ). It also uses the more robust but less precise
1318
+ dsigma method.
1319
+
1320
+ Parameters
1321
+ ----------
1322
+ input_name : traits.Input
1323
+ localizations as PYME.IO.Tabular types
1324
+ astigmatism_calibration_location : traits.File
1325
+ file path or URL to astigmatism calibration file
1326
+
1327
+ Returns
1328
+ -------
1329
+ output_name : traits.Output
1330
+ output is a json wrapped by PYME.IO.ragged.RaggedCache
1331
+
1332
+ Notes
1333
+ -----
1334
+
1335
+ """
1336
+ input_name = Input('merged')
1337
+
1338
+ astigmatism_calibration_location = FileOrURI('')
1339
+ rough_knot_spacing = Float(50.)
1340
+ z_scale = Float(1.0)
1341
+
1342
+ output_name = Output('zmapped')
1343
+
1344
+ def execute(self, namespace):
1345
+ from PYME.Analysis.points.astigmatism import astigTools
1346
+ from PYME.IO import unifiedIO
1347
+ from PYME.IO import MetaDataHandler
1348
+ import json
1349
+
1350
+ inp = namespace[self.input_name]
1351
+
1352
+ if 'mdh' not in dir(inp):
1353
+ raise RuntimeError('MapAstigZ needs metadata')
1354
+
1355
+ if self.astigmatism_calibration_location == '': # grab calibration from the metadata
1356
+ calibration_location = inp.mdh['Analysis.AstigmatismMapID']
1357
+ else:
1358
+ calibration_location = self.astigmatism_calibration_location
1359
+
1360
+ s = unifiedIO.read(calibration_location)
1361
+
1362
+ astig_calibrations = json.loads(s)
1363
+
1364
+ mapped = tabular.MappingFilter(inp)
1365
+
1366
+ # hack to make this work for non-multi-view data
1367
+ if ('sigmax' not in mapped.keys()) and (inp.mdh.getOrDefault('Multiview.NumROIs', 1) == 1):
1368
+ # if we are single channel it is safe to define sigmax0, sigmay0 as sigmax, sigmay
1369
+ # without any folding etc ...
1370
+ mapped.setMapping('sigmax', 'fitResults_sigmax')
1371
+ mapped.setMapping('sigmay', 'fitResults_sigmay')
1372
+ mapped.setMapping('error_sigmax', 'fitError_sigmax')
1373
+ mapped.setMapping('error_sigmay', 'fitError_sigmay')
1374
+
1375
+
1376
+ z, zerr = astigTools.lookup_astig_z_dsigma(mapped, astig_calibrations, self.rough_knot_spacing, plot=False)
1377
+
1378
+ mapped.addColumn('astigmatic_z', z)
1379
+ mapped.addColumn('astigmatic_z_lookup_error', zerr)
1380
+ mapped.addVariable('z_scale', self.z_scale)
1381
+ mapped.setMapping('z', 'astigmatic_z*z_scale + z')
1382
+
1383
+ mapped.mdh = MetaDataHandler.NestedClassMDHandler(inp.mdh)
1384
+ mapped.mdh['Analysis.astigmatism_calibration_used'] = calibration_location
1385
+
1386
+ namespace[self.output_name] = mapped