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,1062 @@
1
+ # -*- coding: utf-8 -*-
2
+ from __future__ import print_function
3
+
4
+ """
5
+ Created on Mon May 25 17:10:02 2015
6
+
7
+ @author: david
8
+ """
9
+ from .base import ModuleBase, register_module, Filter
10
+ from .traits import Input, Output, Float, Enum, CStr, Bool, Int, List, Dict, Any, observe
11
+ import numpy as np
12
+ #import pandas as pd
13
+ from PYME.IO import tabular
14
+ from PYME.IO import MetaDataHandler
15
+ import os
16
+ from six.moves import xrange
17
+ import logging
18
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+ @register_module('MultifitBlobs')
22
+ class MultifitBlobs(ModuleBase):
23
+ inputImage = Output('input')
24
+ outputName = CStr('positions')
25
+ blobSigma = Float(45.0)
26
+ threshold = Float(2.0)
27
+ scale = Float(1000)
28
+
29
+ def run(self, inputImage):
30
+ from PYME.localization.FitFactories import GaussMultifitSR
31
+ import pandas as pd
32
+
33
+ # mdh = MetaDataHandler.NestedClassMDHandler(inputImage.mdh)
34
+ #mdh['Analysis.PSFSigma'] = self.blobSigma
35
+
36
+ res = []
37
+
38
+ for i in range(inputImage.data.shape[2]):
39
+ md = MetaDataHandler.NestedClassMDHandler(mdh)
40
+ md['tIndex'] = i
41
+ ff = GaussMultifitSR.FitFactory(self.scale*inputImage.data[:,:,i], md, noiseSigma=np.ones_like(inputImage.data[:,:,i].squeeze()))
42
+
43
+ res.append(tabular.FitResultsSource(ff.FindAndFit(self.threshold)))
44
+
45
+ #FIXME - this shouldn't be a DataFrame
46
+ res = pd.DataFrame(np.vstack(res))
47
+ #res.mdh = mdh
48
+
49
+ return res
50
+
51
+ @register_module('FitDumbells')
52
+ class FitDumbells(ModuleBase):
53
+ inputImage = Input('input')
54
+ inputPositions = Input('objPostiions')
55
+ outputName = Output('fitResults')
56
+
57
+ def run(self, inputImage, inputPositions):
58
+ from PYME.localization.FitFactories import DumbellFitR
59
+ from PYME.IO import MetaDataHandler
60
+
61
+ md = MetaDataHandler.NestedClassMDHandler()
62
+ #set metadata entries needed for fitting to suitable defaults
63
+ md['Camera.ADOffset'] = inputImage.data[:,:,0].min()
64
+ md['Camera.TrueEMGain'] = 1.0
65
+ md['Camera.ElectronsPerCount'] = 1.0
66
+ md['Camera.ReadNoise'] = 1.0
67
+ md['Camera.NoiseFactor'] = 1.0
68
+
69
+ #copy across the entries from the real image, replacing the defaults
70
+ #if necessary
71
+ md.copyEntriesFrom(inputImage.mdh)
72
+
73
+ r = np.zeros(len(inputPositions['x']), dtype=DumbellFitR.FitResultsDType)
74
+
75
+ ff_t = -1
76
+
77
+ ps = inputImage.pixelSize
78
+
79
+ for x, y, t, i in zip(inputPositions['x'], inputPositions['y'], inputPositions['t'], range(len(inputPositions['x']))):
80
+ if not t == ff_t:
81
+ md['tIndex'] = t
82
+ ff = DumbellFitR.FitFactory(inputImage.data[:,:,t], md)
83
+ ff_t = t
84
+
85
+ r[i] = ff.FromPoint(x/ps, y/ps)
86
+
87
+
88
+ res = tabular.FitResultsSource(r)
89
+ res.mdh = md
90
+
91
+ return res
92
+
93
+ @register_module('DetectPoints2D')
94
+ class DetectPoints2D(ModuleBase):
95
+ """
96
+ Detect point-like objects using a sombrero (or Difference of Gaussians) filter
97
+
98
+ Parameters
99
+ ----------
100
+ input_name : Input
101
+ PYME.IO.ImageStack
102
+ snr_threshold : Bool
103
+ How should we interpret the threshold? If True, the signal-to-noise (SNR) is estimated at each pixel, and the threshold
104
+ applied at each pixel is this estimate multiplied by the 'threshold' parameter. If False, the threshold parameter is used
105
+ directly.
106
+ NB - this cannot be set in conjunction with multithreshold.
107
+ multithreshold : Bool
108
+ If true, detect objects at multiple decreasing thresholds, removing detected objects before progressing to the next step.
109
+ This is similar to the CLEAN algorithm from astromy and useful for detecting weak point-like objects
110
+ in the immediate vicinity of strong ones.
111
+ NB - this cannot be set together with snr_threshold.
112
+ threshold : Float
113
+ The intensity threshold applied during detection if 'snr_threshold' is False, otherwise this scalar is first
114
+ multiplied by the SNR estimate at each pixel before the threshold is applied. When multithreshold is set, the
115
+ highest threshold is max_intensity/2, the lowest is threshold*max_intensity.
116
+ filter_radius_lowpass : Float
117
+ The std. deviation (in pixels) of the lowpass part of the sombrero. Should match the expected object size.
118
+ filter_radius_highpass : Float
119
+ The std deviation (in pixels) of the highpass part of the sombrero. Ideally > 2x the object size, but less than the
120
+ spacing between objects.
121
+ blur_radius : Float
122
+ Used with multithrehold. Std deviation in pixels of a Gaussian filter used to blur the segmented image with at each threshold step
123
+ prior to subtraction. Should be set so the Gaussian width approximates the PSF width. Most critical if you want to
124
+ reliably detect points on the slope of a brighter point, as making this too large will lead to a "halo of exclusion" around bright points.
125
+ Conversely, setting it to small will lead to spurious detections due to incomplete removal of the bright point.
126
+ debounce_radius : Int
127
+ Radius is pixels to check for other detected points. If multiple points are found within this radius the brightest
128
+ will be preserved and the other(s) will be removed
129
+ edge_mask_width : Int
130
+ Thickness of border region to exclude detecting points from.
131
+
132
+ Returns
133
+ -------
134
+ output_name : Output
135
+ PYME.IO.tabular containing x and y coordinates of each point, as well as the frame index they were detected on
136
+
137
+ Notes
138
+ -----
139
+
140
+ Input image series should already be camera corrected (see Processing.FlatfieldAndDarkCorrect)
141
+
142
+ """
143
+
144
+ input_name = Input('input')
145
+
146
+ threshold = Float(1.)
147
+ debounce_radius = Int(4)
148
+ snr_threshold = Bool(True)
149
+ muiltithreshold = Bool(False)
150
+ edge_mask_width = Int(5)
151
+ filter_radius_lowpass = Float(1.0)
152
+ filter_radius_highpass = Float(3.0)
153
+ blur_radius = Float(1.5)
154
+
155
+ output_name = Output('candidate_points')
156
+
157
+ def run(self, input_name):
158
+ from PYME.localization.ofind import ObjectIdentifier
159
+ from PYME.localization.remFitBuf import fitTask
160
+
161
+ if self.snr_threshold and self.muiltithreshold:
162
+ raise RuntimeError('Cannot specify both snr_threshold and multithreshold simultaeneously')
163
+
164
+ x, y, t = [], [], []
165
+ # note that ObjectIdentifier is only 2D-aware
166
+ for ti in range(input_name.data.shape[2]):
167
+ frame = input_name.data.getSlice(ti)
168
+ finder = ObjectIdentifier(frame * (frame > 0), filterRadiusLowpass=self.filter_radius_lowpass, filterRadiusHighpass=self.filter_radius_highpass)
169
+
170
+ if self.snr_threshold: # calculate a per-pixel threshold based on an estimate of the SNR
171
+ sigma = fitTask.calcSigma(input_name.mdh, frame).squeeze()
172
+ threshold = sigma * self.threshold
173
+ else:
174
+ threshold = self.threshold
175
+
176
+ if self.muiltithreshold:
177
+ thresholdSteps = "default"
178
+ else:
179
+ thresholdSteps = 0
180
+
181
+ finder.FindObjects(threshold, numThresholdSteps=thresholdSteps, debounceRadius=self.debounce_radius, maskEdgeWidth=self.edge_mask_width)
182
+
183
+ x.append(finder.x[:])
184
+ y.append(finder.y[:])
185
+ t.append(ti * np.ones_like(finder.x[:]))
186
+
187
+ return tabular.DictSource({'x': np.concatenate(x, axis=0), 'y': np.concatenate(y, axis=0),
188
+ 't': np.concatenate(t, axis=0)})
189
+
190
+
191
+
192
+ @register_module('FitPoints')
193
+ class FitPoints(ModuleBase):
194
+ """
195
+ Apply one of the fit modules from PYME.localization.FitFactories to each of
196
+ the points in the provided in inputPositions.
197
+
198
+ Parameters
199
+ ----------
200
+ inputImage: PYME.IO.image.ImageStack
201
+ FitPoints does not do the camera correction normally done during
202
+ localization analysis in PYME. To accomplish this using recipe modules,
203
+ run your ImageStack through `processing.FlatfieldAndDarkCorrect` first.
204
+ inputPositions: PYME.IO.tabular
205
+ positions to fit in units of nanometers. If inputImage is missing voxelsize
206
+ metadata, a pixel size of 1 nm is assumed.
207
+ outputName: PYME.IO.tabular
208
+ see selected fit module datatype for fit result and fit error parameters
209
+
210
+ """
211
+ inputImage = Input('input')
212
+ inputPositions = Input('objPositions')
213
+ outputName = Output('fitResults')
214
+ fitModule = CStr('LatGaussFitFR')
215
+ roiHalfSize = Int(7)
216
+ channel = Int(0)
217
+ parameters = Dict(str, Any) #fit parameters ('Analysis' metadata entries)
218
+
219
+ @observe('fitModule')
220
+ def _on_fit_module_change(self, event=None):
221
+ # populate parameters for the given fit module
222
+ from PYME.localization.FitFactories import import_fit_factory
223
+ fitMod = import_fit_factory(self.fitModule)
224
+
225
+ try:
226
+ params = fitMod.PARAMETERS
227
+
228
+ # add default value for any parameters which are absent
229
+ for p in params:
230
+ if not p.paramName in self.parameters:
231
+ self.parameters[p.paramName] = p.default
232
+
233
+ # remove any parameters which don't belong to the selected fit factory
234
+ pnames = [p.paramName for p in params]
235
+ for k in self.parameters.keys():
236
+ if not k in pnames:
237
+ self.parameters.pop(k)
238
+
239
+ except AttributeError:
240
+ pass
241
+
242
+ def __init__(self, *args, **kwargs):
243
+ super().__init__(*args, **kwargs)
244
+
245
+ self._on_fit_module_change()
246
+
247
+ def run(self, inputImage, inputPositions):
248
+ from PYME.localization.FitFactories import import_fit_factory
249
+ from PYME.IO import MetaDataHandler
250
+
251
+ md = MetaDataHandler.NestedClassMDHandler()
252
+ #set metadata entries needed for fitting to suitable defaults
253
+ md['Camera.ADOffset'] = inputImage.data[:, :, 0].min()
254
+ md['Camera.TrueEMGain'] = 1.0
255
+ md['Camera.ElectronsPerCount'] = 1.0
256
+ md['Camera.ReadNoise'] = 1.0
257
+ md['Camera.NoiseFactor'] = 1.0
258
+
259
+ md['voxelsize.x'] = .001
260
+ md['voxelsize.y'] = .001
261
+
262
+ #copy across the entries from the real image, replacing the defaults
263
+ #if necessary
264
+ md.copyEntriesFrom(inputImage.mdh)
265
+
266
+ #copy fitting parameters into metadata
267
+ md.update(self.parameters)
268
+
269
+ fitMod = import_fit_factory(self.fitModule) #import our fitting module
270
+
271
+ r = np.zeros(len(inputPositions['x']), dtype=fitMod.FitResultsDType)
272
+
273
+ ff_t = -1
274
+
275
+ ps = inputImage.pixelSize
276
+ print('pixel size: %s' % ps)
277
+
278
+ for x, y, t, i in zip(inputPositions['x'], inputPositions['y'], inputPositions['t'].astype(int), range(len(inputPositions['x']))):
279
+ if not t == ff_t:
280
+ md['tIndex'] = t
281
+ ff = fitMod.FitFactory(np.atleast_3d(inputImage.data[:, :, t, self.channel]), md)
282
+ ff_t = t
283
+
284
+ #print x/ps, y/ps
285
+ r[i] = ff.FromPoint(x/ps, y/ps, roiHalfSize=self.roiHalfSize)
286
+
287
+ res = tabular.FitResultsSource(r, sort=False)
288
+ res.mdh = md
289
+
290
+ return res
291
+
292
+ @register_module('IntensityAtPoints')
293
+ class IntensityAtPoints(ModuleBase):
294
+ """ Apply one of the fit modules from PYME.localization.FitFactories to each of the points in the provided
295
+ in inputPositions
296
+ """
297
+ inputImage = Input('input')
298
+ inputPositions = Input('objPostiions')
299
+ outputName = Output('fitResults')
300
+ radii = List([3, 5, 7, 9, 11])
301
+ mode = Enum(['sum', 'mean'])
302
+ #fitModule = CStr('LatGaussFitFR')
303
+
304
+ def __init__(self, *args, **kwargs):
305
+ self._mask_cache = {}
306
+ ModuleBase.__init__(self, *args, **kwargs)
307
+
308
+ def _get_mask(self, r):
309
+ #if not '_mask_cache' in dir(self):
310
+ # self._mask_cache = {}
311
+
312
+ if not r in self._mask_cache.keys():
313
+ x_, y_ = np.mgrid[-r:(r+1.), -r:(r+1.)]
314
+ self._mask_cache[r] = 1.0*((x_*x_ + y_*y_) < r*r)
315
+
316
+ return self._mask_cache[r]
317
+
318
+
319
+ def _get_mean(self, data, x, y, t, radius):
320
+ roi = data[(x-radius):(x + radius + 1), (y-radius):(y + radius + 1), t].squeeze()
321
+ mask = self._get_mask(radius)
322
+
323
+ return (roi.squeeze()*mask).sum()/mask.sum()
324
+
325
+ def _get_sum(self, data, x, y, t, radius):
326
+ print(data.shape, x, y, t)
327
+ roi = data[int(x - radius):int(x + radius + 1), int(y - radius):int(y + radius + 1), int(t)].squeeze()
328
+ mask = self._get_mask(radius)
329
+
330
+ print(mask.shape, roi.shape)#, (roi * mask).shape
331
+
332
+ return (roi.squeeze() * mask).sum()
333
+
334
+ def run(self, inputImage, inputPositions):
335
+ #from PYME.localization.FitFactories import DumbellFitR
336
+ from PYME.IO import MetaDataHandler
337
+
338
+ md = MetaDataHandler.NestedClassMDHandler()
339
+ #set metadata entries needed for fitting to suitable defaults
340
+ md['Camera.ADOffset'] = inputImage.data[:, :, 0].min()
341
+ md['Camera.TrueEMGain'] = 1.0
342
+ md['Camera.ElectronsPerCount'] = 1.0
343
+ md['Camera.ReadNoise'] = 1.0
344
+ md['Camera.NoiseFactor'] = 1.0
345
+
346
+ #copy across the entries from the real image, replacing the defaults
347
+ #if necessary
348
+ md.copyEntriesFrom(inputImage.mdh)
349
+
350
+ res = np.zeros(len(inputPositions['x']), dtype=[('r%d' % r, 'f4') for r in self.radii])
351
+ ff_t = -1
352
+
353
+ aggFunc = getattr(self, '_get_%s' % self.mode)
354
+
355
+ ps = inputImage.pixelSize
356
+ print('pixel size: %s' % ps)
357
+ for x, y, t, i in zip(inputPositions['x'], inputPositions['y'], inputPositions['t'], range(len(inputPositions['x']))):
358
+ for r in self.radii:
359
+ res[i]['r%d' % r] = aggFunc(inputImage.data, np.round(x / ps), np.round(y / ps), t, r)
360
+
361
+ res = tabular.RecArraySource(res)
362
+ res.mdh = md
363
+
364
+ return res
365
+
366
+
367
+ class ExtractROIs(ModuleBase):
368
+ """
369
+ Extract ROIs around input positions and return them as an ImageStack. Points
370
+ too close to the edge of the input image will be filtered. The ROI-relative
371
+ positions are also determined (distance from the upper left hand corner of
372
+ each ROI to the point about which it was cropped).
373
+
374
+ Parameters
375
+ ----------
376
+ input_series : PYME.IO.image.ImageStack
377
+ series to crop ROIs from
378
+ input_positions : PYME.IO.tabular.TabularBase
379
+ positions to extract
380
+ roi_half_size : int
381
+ size of ROIs to extract, as a half size, so final ROI size will be
382
+ `2 * roi_half_size + 1`.
383
+ output_relative_positions : PYME.IO.tabular.TabularBase
384
+ distances [nm] from ROI upper left hand corner (x, y = 0, 0) to
385
+ corresponding extraction position.
386
+ output_rois : PYME.IO.image.ImageStack
387
+ extracted ROIs as an image stack. Dimension 2 (typically z/t)
388
+ corresponds to position index.
389
+
390
+ Notes
391
+ -----
392
+ - Positions too close to the frame edge, which will result in ROIs cropped
393
+ being smaller than specified, will be removed and not included in the module
394
+ outputs.
395
+ - Multiview positions are not supported, and must be 'unmapped' to the
396
+ original camera positions first.
397
+ """
398
+ input_series = Input('series')
399
+ input_positions = Input('positions')
400
+
401
+ roi_half_size = Int(7)
402
+
403
+ output_relative_positions = Output('relative_positions')
404
+ output_rois = Output('roi_stack')
405
+
406
+ def run(self, input_series, input_positions):
407
+ from PYME.IO.image import ImageStack
408
+
409
+ ox_nm, oy_nm, oz = input_series.origin
410
+ vs_nm = np.array([input_series.voxelsize_nm.x, input_series.voxelsize_nm.y])
411
+ roi_half_nm = (self.roi_half_size + 1) * vs_nm
412
+ x_max, y_max = (input_series.data.shape[:2] * vs_nm) - roi_half_nm
413
+
414
+ edge_filtered = tabular.ResultsFilter(input_positions,
415
+ x=[ox_nm + roi_half_nm[0], x_max],
416
+ y=[oy_nm + roi_half_nm[1], y_max])
417
+ n_filtered = len(input_positions) - len(edge_filtered)
418
+ if n_filtered > 0:
419
+ logger.error('%d positions too close to edge, filtering.' % n_filtered)
420
+
421
+ extracted = FitPoints(fitModule='ROIExtractNR',
422
+ roiHalfSize=self.roi_half_size,
423
+ channel=0).apply_simple(inputImage=input_series,
424
+ inputPositions=edge_filtered)
425
+
426
+ # get roi edge position. FFBase._get_roi rounds before extracting
427
+ relative_positions = edge_filtered.to_recarray()
428
+ x_edge = np.round(edge_filtered['x'] / input_series.voxelsize_nm.x) - self.roi_half_size
429
+ y_edge = np.round(edge_filtered['y'] / input_series.voxelsize_nm.y) - self.roi_half_size
430
+ # subtract off ofset to ROI edge
431
+ relative_positions['x'] = edge_filtered['x'] - (x_edge * input_series.voxelsize_nm.x)
432
+ relative_positions['y'] = edge_filtered['y'] - (y_edge * input_series.voxelsize_nm.y)
433
+ relative_positions['fitResults_x0'] = relative_positions['x']
434
+ relative_positions['fitResults_y0'] = relative_positions['y']
435
+ relative_positions = tabular.RecArraySource(relative_positions)
436
+ relative_positions.mdh = MetaDataHandler.NestedClassMDHandler(input_positions.mdh)
437
+ relative_positions.mdh['ExtractROIs.RoiHalfSize'] = self.roi_half_size
438
+
439
+
440
+ return {'output_rois' : ImageStack(data=np.moveaxis(extracted['data'], 0, 2),
441
+ mdh=input_series.mdh),
442
+ 'output_relative_positions' : relative_positions}
443
+
444
+
445
+ @register_module('MeanNeighbourDistances')
446
+ class MeanNeighbourDistances(ModuleBase):
447
+ """Calculates mean distance to nearest neighbour in a triangulation of the
448
+ supplied points"""
449
+ inputPositions = Input('input')
450
+ outputName = Output('neighbourDists')
451
+ key = CStr('neighbourDists')
452
+
453
+ def run(self, inputPositions):
454
+ from matplotlib import delaunay
455
+ from PYME.LMVis import visHelpers
456
+
457
+ x, y = inputPositions['x'], inputPositions['y']
458
+ #triangulate the data
459
+ T = delaunay.Triangulation(x + .1*np.random.normal(size=len(x)), y + .1*np.random.normal(size=len(x)))
460
+ #find the average edge lengths leading away from a given point
461
+ res = np.array(visHelpers.calcNeighbourDists(T))
462
+
463
+ return tabular.DictSource({self.key:res})
464
+
465
+ @register_module('NearestNeighbourDistances')
466
+ class NearestNeighbourDistances(ModuleBase):
467
+ """Calculates the nearest neighbour distances between supplied points using
468
+ a kdtree"""
469
+ inputChan0 = Input('input')
470
+ inputChan1 = Input('')
471
+ outputName = Output('neighbourDists')
472
+ columns = List(['x', 'y'])
473
+ key = CStr('neighbourDists')
474
+
475
+ def run(self, inputChan0, inputChan1 = 0):
476
+ from scipy.spatial import cKDTree
477
+
478
+ if not inputChan1:
479
+ inputChan1 = inputChan0
480
+ singleChan = True # flag to not pair molecules with themselves
481
+ else:
482
+ singleChan = False
483
+
484
+ #create a kdtree
485
+ p1 = np.vstack([inputChan0[k] for k in self.columns]).T
486
+ p2 = np.vstack([inputChan1[k] for k in self.columns]).T
487
+ kdt = cKDTree(p1)
488
+
489
+ if singleChan:
490
+ #query the two closest entries - the closest entry will be the orig point paired with itself, so ignore it
491
+ d, i = kdt.query(p2, 2)
492
+ d = d[:, 1]
493
+ else:
494
+ d, i = kdt.query(p2, 1)
495
+
496
+ return tabular.DictSource({self.key: d})
497
+
498
+ @register_module('PairwiseDistanceHistogram')
499
+ class PairwiseDistanceHistogram(ModuleBase):
500
+ """Calculates a histogram of pairwise distances"""
501
+ inputPositions = Input('input')
502
+ inputPositions2 = Input('')
503
+ outputName = Output('distHist')
504
+ nbins = Int(50)
505
+ binSize = Float(50.)
506
+ threaded = Bool(False)
507
+
508
+ def run(self, inputPositions, inputPositions2):
509
+ from PYME.Analysis.points import DistHist
510
+
511
+ pos1 = inputPositions2 if inputPositions2 else inputPositions
512
+
513
+ if np.count_nonzero(inputPositions['z']) == 0 and np.count_nonzero(pos1['z']) == 0:
514
+ if self.threaded:
515
+ res = DistHist.distanceHistogramThreaded(inputPositions['x'], inputPositions['y'], pos1['x'], pos1['y'], self.nbins, self.binSize)
516
+ else:
517
+ res = DistHist.distanceHistogram(inputPositions['x'], inputPositions['y'], pos1['x'], pos1['y'], self.nbins, self.binSize)
518
+ else:
519
+ if self.threaded:
520
+ res = DistHist.distanceHistogram3DThreaded(inputPositions['x'], inputPositions['y'], inputPositions['z'],
521
+ pos1['x'], pos1['y'], pos1['z'], self.nbins, self.binSize)
522
+ else:
523
+ res = DistHist.distanceHistogram3D(inputPositions['x'], inputPositions['y'], inputPositions['z'],
524
+ pos1['x'], pos1['y'], pos1['z'], self.nbins, self.binSize)
525
+
526
+ d = self.binSize*np.arange(self.nbins)
527
+
528
+ return tabular.DictSource({'bins': d, 'counts': res})
529
+
530
+ @register_module('Histogram')
531
+ class Histogram(ModuleBase):
532
+ """Calculates a histogram of a given measurement key"""
533
+ inputMeasurements = Input('input')
534
+ outputName = Output('hist')
535
+ key = CStr('key')
536
+ nbins = Int(50)
537
+ left = Float(0.)
538
+ right = Float(1000)
539
+ normalize = Bool(False)
540
+
541
+ def run(self, inputMeasurements):
542
+ v = inputMeasurements[self.key]
543
+
544
+ edges = np.linspace(self.left, self.right, self.nbins)
545
+ res = np.histogram(v, edges, normed=self.normalize)[0]
546
+
547
+ return tabular.DictSource({'bins' : 0.5*(edges[:-1] + edges[1:]), 'counts' : res})
548
+
549
+
550
+ @register_module('ImageHistogram')
551
+ class ImageHistogram(ModuleBase):
552
+ """Calculates a histogram of a given measurement key"""
553
+ inputImage = Input('input')
554
+ outputName = Output('hist')
555
+ inputMask = Input('')
556
+ nbins = Int(50)
557
+ left = Float(0.)
558
+ right = Float(1000)
559
+ normalize = Bool(False)
560
+
561
+ def run(self, inputImage, inputMask=None):
562
+ vals = inputImage.data[:,:,:].ravel()
563
+
564
+ if inputMask:
565
+ m = inputMask.data[:,:,:].ravel() >0
566
+ vals = vals[m]
567
+
568
+ edges = np.linspace(self.left, self.right, self.nbins)
569
+ res = np.histogram(vals, edges, normed=self.normalize)[0]
570
+
571
+ return tabular.DictSource({'bins' : 0.5*(edges[:-1] + edges[1:]), 'counts' : res})
572
+
573
+ @register_module('ImageCumulativeHistogram')
574
+ class ImageCumulativeHistogram(ModuleBase):
575
+ """Calculates a histogram of a given measurement key"""
576
+ inputImage = Input('input')
577
+ outputName = Output('hist')
578
+ inputMask = Input('')
579
+ #nbins = Int(50)
580
+ #left = Float(0.)
581
+ #right = Float(1000)
582
+
583
+ def run(self, inputImage, inputMask=None):
584
+ vals = inputImage.data[:,:,:].ravel()
585
+
586
+ if inputMask:
587
+ m = inputMask.data[:,:,:].ravel() > 0
588
+ vals = vals[m]
589
+
590
+ yvals = np.linspace(0, 1.0, len(vals))
591
+ xvals = np.sort(vals)
592
+
593
+ return tabular.DictSource({'bins' : xvals, 'counts' : yvals})
594
+
595
+ @register_module('BinnedHistogram')
596
+ class BinnedHistogram(ModuleBase):
597
+ """Calculates a histogram of a given measurement key, binned by a separate value"""
598
+ inputImage = Input('input')
599
+ binBy = CStr('indepvar')
600
+ outputName = Output('hist')
601
+ inputMask = Input('')
602
+
603
+ nbins = Int(50)
604
+ left = Float(0.)
605
+ right = Float(1000)
606
+
607
+ def run(self, inputImage, binBy, inputMask=None):
608
+ from PYME.Analysis import binAvg
609
+ vals = inputImage.data[:, :, :].ravel()
610
+ binby = binBy.data[:,:,:].ravel()
611
+
612
+ if inputMask:
613
+ m = inputMask.data[:, :, :].ravel() > 0
614
+
615
+ vals = vals[m]
616
+ binby = binby[m]
617
+
618
+ #mask out NaNs
619
+ m2 = ~np.isnan(vals)
620
+ vals = vals[m2]
621
+ binby = binby[m2]
622
+
623
+ edges = np.linspace(self.left, self.right, self.nbins)
624
+
625
+ bn, bm, bs = binAvg.binAvg(binby, vals, edges)
626
+
627
+ return tabular.DictSource({'bins': 0.5*(edges[:-1] + edges[1:]), 'counts': bn, 'means' : bm})
628
+
629
+
630
+
631
+ # there are some measurements we don't want / are not particlarly useful (i.e. the ones which just return the image)
632
+ # some of these changed in recent versions of skimage (2022), so try both new and old versions
633
+ _MEASURE2D_KEYS_TO_IGNORE = ['convex_image',
634
+ 'filled_image',
635
+ 'image_convex',
636
+ 'image_filled',
637
+ 'image',
638
+ 'intensity_image',
639
+ 'image_intensity']
640
+
641
+ # euler_number calculation can be buggy and cause crashes
642
+ _MEASURE2D_KEYS_TO_IGNORE.append('euler_number')
643
+
644
+ @register_module('Measure2D')
645
+ class Measure2D(ModuleBase):
646
+ """Perform 2D morphological measurements based on an image mask and optional intensity image.
647
+
648
+ **Note:** To perform mesurements on multi-colour images, split channels first and measure each channel
649
+ separately.
650
+
651
+ **Note:** Measure2D currently works on *flattened* data where z and t dimensions have been collapsed
652
+ to a single "frame" dimension. TODO - fix this (or at least record the corresponding z and t indices for
653
+ each measurement).
654
+ """
655
+ inputLabels = Input('labels')
656
+ inputIntensity = Input('data')
657
+ outputName = Output('measurements')
658
+
659
+ measureContour = Bool(True)
660
+
661
+ def run(self, inputLabels, inputIntensity):
662
+
663
+ #define the measurement class, which behaves like an input filter
664
+ class measurements(tabular.TabularBase):
665
+ _name = 'Measue 2D source'
666
+ ps = inputLabels.pixelSize
667
+
668
+ def __init__(self):
669
+ self.measures = []
670
+ self.contours = []
671
+ self.frameNos = []
672
+
673
+ self._keys = []
674
+
675
+ def addFrameMeasures(self, frameNo, measurements, contours = None):
676
+ if len(measurements) == 0:
677
+ return
678
+
679
+ if len(self.measures) == 0:
680
+ #first time we've called this - determine our data type
681
+ self._keys = ['t', 'x', 'y'] + [r for r in dir(measurements[0]) if not (r.startswith('_') or r in _MEASURE2D_KEYS_TO_IGNORE)]
682
+
683
+ if not contours is None:
684
+ self._keys += ['contour']
685
+
686
+ self.measures.extend(measurements)
687
+ self.frameNos.extend([frameNo for i in xrange(len(measurements))])
688
+
689
+ if contours:
690
+ self.contours.extend(contours)
691
+
692
+ def keys(self):
693
+ return self._keys
694
+
695
+ def __getitem__(self, keys):
696
+ if isinstance(keys, tuple) and len(keys) > 1:
697
+ key = keys[0]
698
+ sl = keys[1]
699
+ else:
700
+ key = keys
701
+ sl = slice(None)
702
+
703
+
704
+ #print key, sl
705
+
706
+ if not key in self._keys:
707
+ raise KeyError("'%s' key not defined" % key)
708
+
709
+ if key == 't':
710
+ return np.array(self.frameNos[sl])
711
+ elif key == 'contour':
712
+ return np.array(self.contours[sl], dtype='O')
713
+ elif key == 'x':
714
+ return self.ps*np.array([r.centroid[0] for r in self.measures[sl]])
715
+ elif key == 'y':
716
+ return self.ps*np.array([r.centroid[1] for r in self.measures[sl]])
717
+ else:
718
+ l = [getattr(r, key) for r in self.measures[sl]]
719
+
720
+ if not (('image' in key) or (key == 'coords')):#np.isscalar(l[0]):
721
+ a = np.array(l)
722
+ return a
723
+ else:
724
+ a = np.empty(len(l), dtype='O')
725
+ for i, li in enumerate(l):
726
+ a[i] = li
727
+
728
+ return a
729
+
730
+ # def toDataFrame(self, keys=None):
731
+ # import pandas as pd
732
+ # if keys == None:
733
+ # keys = self._keys
734
+ #
735
+ # d = {k: self.__getitem__(k) for k in keys}
736
+ #
737
+ # return pd.DataFrame(d)
738
+
739
+
740
+ # end measuremnt class def
741
+
742
+ assert (inputLabels.data_xyztc.shape[4 ==1]), 'Measure2D labels must have a single colour channel'
743
+
744
+ m = measurements()
745
+
746
+ if inputIntensity:
747
+ assert (inputLabels.data_xyztc.shape == inputIntensity.data_xyztc.shape), 'Measure2D labels and intensity must be the same shape'
748
+
749
+ for i in xrange(inputLabels.data.shape[2]):
750
+ m.addFrameMeasures(i, *self._measureFrame(i, inputLabels, inputIntensity))
751
+
752
+ #m.mdh = inputLabels.mdh
753
+
754
+ return m
755
+
756
+ def _measureFrame(self, frameNo, labels, intensity):
757
+ import skimage.measure
758
+
759
+ li = labels.data_xytc[:,:,frameNo, 0].squeeze().astype('i')
760
+
761
+ if intensity:
762
+ it = intensity.data_xytc[:,:,frameNo, 0].squeeze()
763
+ else:
764
+ it = None
765
+
766
+ rp = skimage.measure.regionprops(li, it, cache=True)
767
+
768
+ #print len(rp), li.max()
769
+
770
+ if self.measureContour:
771
+ ct = []
772
+ for r in rp:
773
+ #print i, (li == (i+1)).sum()
774
+ #c = skimage.measure.find_contours(r['image'], .5)
775
+ c = skimage.measure.find_contours((li == r.label), .5)
776
+ if len(c) == 0:
777
+ c = [np.zeros((2,2))]
778
+ #ct.append(c[0] + np.array(r['bbox'])[:2][None,:])
779
+ ct.append(c[0])
780
+ else:
781
+ ct = None
782
+
783
+
784
+
785
+ return rp, ct
786
+
787
+
788
+
789
+ @register_module('Plot')
790
+ class Plot(ModuleBase):
791
+ """Take just certain columns of a variable"""
792
+ input0 = Input('measurements')
793
+ input1 = Input('')
794
+ input2 = Input('')
795
+ input3 = Input('')
796
+ xkey = CStr('')
797
+ ykey = CStr('')
798
+ type = Enum(['line', 'bar'])
799
+ outputName = Output('outGraph')
800
+
801
+ def execute(self, namespace):
802
+ ms = []
803
+ labs = []
804
+ if not self.input0 == '':
805
+ ms.append(namespace[self.input0])
806
+ labs.append(self.input0)
807
+ if not self.input1 == '':
808
+ ms.append(namespace[self.input1])
809
+ labs.append(self.input1)
810
+ if not self.input2 == '':
811
+ ms.append(namespace[self.input2])
812
+ labs.append(self.input2)
813
+ if not self.input3 == '':
814
+ ms.append(namespace[self.input3])
815
+ labs.append(self.input3)
816
+
817
+ # import pylab
818
+ import matplotlib.pyplot as plt
819
+
820
+ plt.figure()
821
+ for meas in ms:
822
+ if self.type == 'bar':
823
+ xv = meas[self.xkey]
824
+ plt.bar(xv, meas[self.ykey], align='center', width=(xv[1] - xv[0]))
825
+ else:
826
+ plt.plot(meas[self.xkey], meas[self.ykey])
827
+
828
+ plt.grid()
829
+ plt.legend(labs)
830
+ plt.xlabel(self.xkey)
831
+ plt.ylabel(self.ykey)
832
+ #namespace[self.outputName] = out
833
+
834
+ @register_module('AddMetadataToMeasurements')
835
+ class AddMetadataToMeasurements(ModuleBase):
836
+ """Adds metadata entries as extra column(s) to the output
837
+
838
+ This was written to allow key parameters or experimental variables to be tracked prior to aggregating / concatenating
839
+ measurements from multiple different images. By adding, e.g. the sample labelling, or a particular experimental
840
+ parameter to an output table as an extra column we can then aggregate and group that data in processing.
841
+ """
842
+ inputMeasurements = Input('measurements')
843
+ inputImage = Input('input')
844
+ keys = CStr('SampleNotes')
845
+ metadataKeys = CStr('Sample.Notes')
846
+ outputName = Output('annotatedMeasurements')
847
+ string_length = Int(128, desc='Ammount of storage (characters) to allocate for string values')
848
+
849
+ def run(self, inputMeasurements, inputImage):
850
+ from PYME.IO import MetaDataHandler
851
+ res = {}
852
+ res.update(inputMeasurements)
853
+
854
+ nEntries = len(list(res.values())[0])
855
+ for k, mdk in zip(self.keys.split(), self.metadataKeys.split()):
856
+ if mdk == 'seriesName':
857
+ #import os
858
+ v = os.path.split(inputImage.seriesName)[1]
859
+ else:
860
+ v = inputImage.mdh[mdk]
861
+
862
+ if isinstance(v, str):
863
+ # use bytes/cstring dtype (rather than U) so that
864
+ # pytables doesn't bork on us
865
+ res[k] = np.array([v]*nEntries, dtype='S%d'%self.string_length)
866
+ else:
867
+ res[k] = np.array([v]*nEntries)
868
+
869
+ #res = pd.DataFrame(res)
870
+ res = tabular.DictSource(res)
871
+ #if 'mdh' in dir(meas):
872
+ res.mdh = MetaDataHandler.DictMDHandler(inputImage.mdh)
873
+
874
+ return res
875
+
876
+
877
+ @register_module('IdentifyOverlappingROIs')
878
+ class IdentifyOverlappingROIs(ModuleBase):
879
+ """
880
+
881
+ Filter input ROI positions such that ROIs of a given size will not overlap. Output maintains all points, but with
882
+ the addition of a column indicating whether the point has been rejected due to overlap or not.
883
+
884
+ Parameters
885
+ ----------
886
+ input : Input
887
+ PYME.IO.tabular containing x and y coordinates. Compatible with measurement output for Supertile coordinates,
888
+ e.g. 'x_um'
889
+ roi_size_pixels: Int
890
+ Size of ROI to be used in calculating overlap.
891
+ reject_key: CStr
892
+ Name of column to add to output datasource encoding whether a point has been rejected due to overlap (1) or
893
+ kept (0).
894
+ output: Output
895
+ PYME.IO.tabular
896
+
897
+ Notes
898
+ -----
899
+ Currently roi overlap is defined as being within sqrt(2) * roi_size. Obviously two square ROIs can be roi_size + 1
900
+ away from each other and not overlap if they are arranged correctly, so the current check is a little more happy-to-
901
+ toss points then it could be.
902
+
903
+ """
904
+ input = Input('input')
905
+ roi_size_pixels = Int(256)
906
+ reject_key = CStr('rejected')
907
+ output = Output('cluster_metrics')
908
+
909
+ def run(self, input):
910
+ from scipy.spatial import KDTree
911
+
912
+ try:
913
+ positions = np.stack([input['x_um'], input['y_um']], axis=1)
914
+ far_flung = np.sqrt(2) * input.mdh['Pyramid.PixelSize'] * self.roi_size_pixels # [micrometers]
915
+ except KeyError:
916
+ positions = np.stack([input['x'], input['y']], axis=1) / 1e3 # assume x and y were in [nanometers]
917
+ far_flung = np.sqrt(2) * input.mdh['voxelsize.x'] * self.roi_size_pixels # [micrometers]
918
+
919
+ tree = KDTree(positions)
920
+
921
+
922
+ neighbors = tree.query_ball_tree(tree, r=far_flung, p=2)
923
+
924
+ tossing = set()
925
+ for ind, close in enumerate(neighbors):
926
+ if ind not in tossing and len(close) > 1: # ignore points we've already decided to reject
927
+ # reject points too close to our current indexed point
928
+ # TODO - don't reject points inside of this circular radius if their square ROIs don't actually overlap
929
+ close.remove(ind)
930
+ tossing.update(close)
931
+
932
+ out = tabular.MappingFilter(input)
933
+ reject = np.zeros(tree.n, dtype=int)
934
+ reject[list(tossing)] = 1
935
+ out.addColumn(self.reject_key, reject)
936
+
937
+ return out
938
+
939
+
940
+ @register_module('ChunkedTravelingSalesperson')
941
+ class ChunkedTravelingSalesperson(ModuleBase):
942
+ """
943
+
944
+ Optimize route visiting each position in an input dataset exactly once, starting from the last point in the input.
945
+ 2-opt algorithm is used, and points are chunked (very) roughly into a grid based on an assumption of uniform density
946
+ and the points_per_chunk argument. After the chunks are individually optimized, a modified two-opt algorithm is run
947
+ on the section end-points, so section order can be optimized as well as whether sections are traversed forwards or
948
+ backwards.
949
+
950
+ Parameters
951
+ ----------
952
+ input : Input
953
+ PYME.IO.tabular containing x and y coordinates. Compatible with measurement output for Supertile coordinates,
954
+ e.g. 'x_um'
955
+ epsilon: Float
956
+ Relative improvement threshold used to stop algorithm when gains become negligible
957
+ points_per_chunk: Int
958
+ Number of points desired to be in each chunk that a two-opt algorithm is run on. Larger chunks tend toward more
959
+ ideal paths, but much larger computational complexity.
960
+ n_processes: Int
961
+ Number of processes to split the chunk tasks among. Setting of zero defaults to using one process per CPU core.
962
+ output: Output
963
+ PYME.IO.tabular
964
+
965
+ """
966
+ input = Input('input')
967
+ epsilon = Float(0.001)
968
+ points_per_chunk = Int(500)
969
+ n_processes = Int(0)
970
+ output = Output('sorted')
971
+
972
+ def execute(self, namespace):
973
+ from PYME.Analysis.points.traveling_salesperson import sectioned_two_opt
974
+
975
+ points = namespace[self.input]
976
+
977
+ try:
978
+ positions = np.stack([points['x_um'], points['y_um']], axis=1)
979
+ except KeyError:
980
+ positions = np.stack([points['x'], points['y']], axis=1) / 1e3
981
+
982
+ final_route = sectioned_two_opt.tsp_chunk_two_opt_multiproc(positions, self.epsilon, self.points_per_chunk,
983
+ self.n_processes)
984
+
985
+ # note that we sorted the positions / sections once before, need to propagate that through before sorting
986
+ out = tabular.DictSource({k: points[k][final_route] for k in points.keys()})
987
+ out.mdh = MetaDataHandler.NestedClassMDHandler()
988
+ try:
989
+ out.mdh.copyEntriesFrom(points.mdh)
990
+ except AttributeError:
991
+ pass
992
+
993
+ # use the already sorted output to get the final distance
994
+ try:
995
+ og_distance = np.sqrt((points['x_um'][1:] - points['x_um'][:-1]) ** 2 + (points['y_um'][1:] - points['y_um'][:-1]) ** 2).sum()
996
+ final_distance = np.sqrt((out['x_um'][1:] - out['x_um'][:-1]) ** 2 + (out['y_um'][1:] - out['y_um'][:-1]) ** 2).sum()
997
+ except KeyError:
998
+ og_distance = np.sqrt((points['x'][1:] - points['x'][:-1]) ** 2 + (points['y'][1:] - points['y'][:-1]) ** 2).sum() / 1e3
999
+ final_distance = np.sqrt((out['x'][1:] - out['x'][:-1]) ** 2 + (out['y'][1:] - out['y'][:-1]) ** 2).sum() / 1e3
1000
+
1001
+ out.mdh['TravelingSalesperson.OriginalDistance'] = og_distance
1002
+ out.mdh['TravelingSalesperson.Distance'] = final_distance
1003
+
1004
+ namespace[self.output] = out
1005
+
1006
+
1007
+
1008
+
1009
+ @register_module('TravelingSalesperson')
1010
+ class TravelingSalesperson(ModuleBase):
1011
+ """
1012
+
1013
+ Optimize route visiting each position in an input dataset exactly once, starting from the 0th point or
1014
+ the minimum x + y corner. A greedy sort is done first because it is quite fast and should for average case reduce
1015
+ number of moves from O(nlog(n)) to O(n).
1016
+
1017
+ Parameters
1018
+ ----------
1019
+ input : Input
1020
+ PYME.IO.tabular containing x and y coordinates. Compatible with measurement output for Supertile coordinates,
1021
+ e.g. 'x_um'
1022
+ epsilon: Float
1023
+ Relative improvement threshold used to stop algorithm when gains become negligible
1024
+ start_from_corner: Bool
1025
+ Flag to toggle starting from the min(x + y) point [True] or the 0th point in the input positions.
1026
+ output: Output
1027
+ PYME.IO.tabular
1028
+
1029
+
1030
+ """
1031
+ input = Input('input')
1032
+ epsilon = Float(0.001)
1033
+ start_from_corner = Bool(True)
1034
+ output = Output('sorted')
1035
+
1036
+ def execute(self, namespace):
1037
+ from PYME.Analysis.points.traveling_salesperson import sort
1038
+
1039
+ points = namespace[self.input]
1040
+
1041
+ try:
1042
+ positions = np.stack([points['x_um'], points['y_um']], axis=1)
1043
+ except KeyError:
1044
+ # units don't matter for these calculations, but we want to preserve them on the other side
1045
+ positions = np.stack([points['x'], points['y']], axis=1) / 1e3
1046
+
1047
+ start_index = 0 if not self.start_from_corner else np.argmin(positions.sum(axis=1))
1048
+
1049
+ positions, ogd, final_distance = sort.tsp_sort(positions, start_index, self.epsilon, return_path_length=True)
1050
+
1051
+ out = tabular.DictSource({'x_um': positions[:, 0],
1052
+ 'y_um': positions[:, 1]})
1053
+ out.mdh = MetaDataHandler.NestedClassMDHandler()
1054
+ try:
1055
+ out.mdh.copyEntriesFrom(points.mdh)
1056
+ except AttributeError:
1057
+ pass
1058
+ out.mdh['TravelingSalesperson.Distance'] = final_distance
1059
+ out.mdh['TravelingSalesperson.OriginalDistance'] = ogd
1060
+
1061
+ namespace[self.output] = out
1062
+