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
PYME/IO/tabular.py ADDED
@@ -0,0 +1,1338 @@
1
+ #!/usr/bin/python
2
+
3
+ ##################
4
+ # inpFilt.py
5
+ #
6
+ # Copyright David Baddeley, 2009
7
+ # d.baddeley@auckland.ac.nz
8
+ #
9
+ # This program is free software: you can redistribute it and/or modify
10
+ # it under the terms of the GNU General Public License as published by
11
+ # the Free Software Foundation, either version 3 of the License, or
12
+ # (at your option) any later version.
13
+ #
14
+ # This program is distributed in the hope that it will be useful,
15
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
+ # GNU General Public License for more details.
18
+ #
19
+ # You should have received a copy of the GNU General Public License
20
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
21
+ #
22
+ ##################
23
+
24
+ """ import filters for localisation microscopy results. These masquerade as
25
+ dictionaries which can be looked up to yield the desired data. The visualisation
26
+ routines expect at least 'x' and 'y' to be defined as keys, and may also
27
+ understand additional values, e.g. 'error_x'
28
+ """
29
+ import types
30
+ import six
31
+ import warnings
32
+ import numpy as np
33
+
34
+ from numpy import * #to allow the use of sin cos etc in mappings
35
+ from PYME.Analysis.piecewise import * #allow piecewise linear mappings
36
+
37
+ import tables
38
+ import logging
39
+
40
+ logger = logging.getLogger(__name__)
41
+
42
+ #helper function for renaming classes
43
+
44
+ def deprecated_name(name):
45
+ def _dec(cls):
46
+
47
+ def _dep_name(*args, **kwargs):
48
+ warnings.warn(VisibleDeprecationWarning('%s is deprecated, use %s instead' % (name, cls.__name__)))
49
+ return cls(*args, **kwargs)
50
+
51
+ globals()[name] = _dep_name
52
+
53
+ return cls
54
+
55
+ return _dec
56
+
57
+ class TabularBase(object):
58
+ _image_bounds = False
59
+
60
+ def toDataFrame(self, keys=None):
61
+ warnings.warn('toDataFrame is deprecated, use to_pandas instead', DeprecationWarning)
62
+ self.to_pandas(keys)
63
+
64
+ def to_pandas(self, keys=None):
65
+ """
66
+ Convert tabular data to a pandas DataFrame
67
+ """
68
+ import pandas as pd
69
+ if keys is None:
70
+ keys = self.keys()
71
+
72
+ d = {}
73
+
74
+ for k in keys:
75
+ v = self.__getitem__(k)
76
+ if np.ndim(v) == 1:
77
+ d[k] = v
78
+ else:
79
+ v1 = np.empty(len(v), 'O')
80
+ for i in range(len(v)):
81
+ v1[i] = v[i]
82
+ d[k] = v1
83
+
84
+ return pd.DataFrame(d)
85
+
86
+ def _getKeySlice(self, keys):
87
+ if isinstance(keys, tuple) and len(keys) > 1:
88
+ key = keys[0]
89
+ sl = keys[1]
90
+ else:
91
+ key = keys
92
+ sl = slice(None)
93
+
94
+ #print key, sl
95
+
96
+ return key, sl
97
+
98
+ def to_recarray(self, keys=None):
99
+ """
100
+ Converts tabular data types into record arrays, which is useful for e.g. saving as an hdf table. In order to be
101
+ converted, the tabular data source must be able to be flattened.
102
+
103
+ Parameters
104
+ ----------
105
+ keys : list of fields to be copied into output. Defaults to all existing keys.
106
+
107
+ Returns
108
+ -------
109
+ numpy recarray version of self
110
+
111
+ """
112
+ from numpy.core import records
113
+ if keys is None:
114
+ keys = list(self.keys())
115
+
116
+ columns = [self.__getitem__(k) for k in keys]
117
+
118
+ filtered_cols = [i for i, v in enumerate(columns) if not v.dtype == 'O']
119
+
120
+ cols = [columns[i] for i in filtered_cols]
121
+ keys_ = [keys[i] for i in filtered_cols]
122
+
123
+
124
+ dt = [(k, v.dtype, v.shape[1:]) for k, v in zip(keys_, cols)]
125
+
126
+ #print(dt)
127
+ return records.fromarrays(cols, names=keys_, dtype=dt)
128
+
129
+ def to_hdf(self, filename, tablename='Data', keys=None, metadata=None,
130
+ keep_alive_timeout=0):
131
+ """
132
+ Writes data to a table in an HDF5 file
133
+
134
+ Parameters
135
+ ----------
136
+
137
+ filename: string
138
+ the name of the file to save to
139
+ tablename: string [optional]
140
+ the name of the table within the file to save to. Defaults to "Data"
141
+ keys: list [optional]
142
+ a list of column names to save (if keys == None, all columns are saved)
143
+ metadata: a MetaDataHandler instance [optional]
144
+ associated metadata to write to the file
145
+ keep_alive_timeout: float
146
+ a timeout in seconds. If non-zero, the file is held open after we have finished writing to it until the
147
+ timeout elapses. Useful as a performance optimisation when making multiple writes to a single file,
148
+ potentially across multiple threads. NOTE: the keep_alive_timeout is not garuanteed to be observed - it
149
+ gets set by the first open call of a given session, so if the file is already open due to a previous openH5R
150
+ call, the timeout requested by that call will be used.
151
+
152
+ """
153
+ from PYME.IO import h5rFile
154
+
155
+ with h5rFile.openH5R(filename, 'a', keep_alive_timeout=keep_alive_timeout) as f:
156
+ f.appendToTable(tablename, self.to_recarray(keys))
157
+
158
+ if metadata is not None:
159
+ f.updateMetadata(metadata)
160
+
161
+ #wait until data is written
162
+ f.flush()
163
+
164
+ def to_csv(self, outFile, keys=None):
165
+ if outFile.endswith('.csv'):
166
+ delim = ', '
167
+ else:
168
+ delim = '\t'
169
+
170
+ if keys is None:
171
+ keys = self.keys()
172
+
173
+ #nRecords = len(ds[keys[0]])
174
+
175
+ def fmt(d):
176
+ if np.isscalar(d):
177
+ if isinstance(d, six.string_types):
178
+ return str(d)
179
+ else:
180
+ return '%e' % d
181
+ else:
182
+ # try to make sure odd objects don't break file formatting
183
+ return ('"%s"' % str(d).replace(delim,' ').replace('\n',' '))
184
+
185
+ of = open(outFile, 'w')
186
+
187
+ of.write('# ' + delim.join(['%s' % k for k in keys]) + '\n')
188
+
189
+ for row in zip(*[self[k] for k in keys]):
190
+ of.write(delim.join([fmt(c) for c in row]) + '\n')
191
+
192
+ of.close()
193
+
194
+
195
+ def keys(self):
196
+ raise NotImplementedError('Should be over-ridden in derived class')
197
+
198
+ def __getitem__(self, keys):
199
+ raise NotImplementedError('Should be over-ridden in derived class')
200
+
201
+ def __len__(self):
202
+ return len(self[list(self.keys())[0]])
203
+
204
+ def __getattr__(self, item):
205
+ try:
206
+ return self[item]
207
+ except KeyError:
208
+ raise AttributeError("'%s' has not attribute '%s'" % (self.__class__, item))
209
+
210
+ def __dir__(self):
211
+ return list(self.keys()) + list(self.__dict__.keys()) + list(dir(type(self)))
212
+
213
+ def to_JSON(self, keys=None, return_slice=slice(None)):
214
+ # TODO - do we actually use the slice argument? Should the signature better match to_hdf, to_recarray, toDataFrame?
215
+ # TODO - is this redundant when compared to .toDataFrame().to_json()
216
+ import json
217
+
218
+ d= {}
219
+ keys = keys if keys != None else self.keys()
220
+ for k in keys:
221
+ d[k] = self[(k, return_slice)].tolist()
222
+ return json.dumps(d)
223
+
224
+ def _calc_image_bounds(self):
225
+ from PYME.IO.image import ImageBounds
226
+
227
+ try:
228
+ if hasattr(self, 'mdh') and ('scanx' not in self.keys() or 'scany' not in self.keys()) and 'Camera.ROIWidth' in self.mdh.getEntryNames():
229
+ bds = ImageBounds.extractFromMetadata(self.mdh)
230
+ else:
231
+ bds = ImageBounds.estimateFromSource(self)
232
+ except:
233
+ logger.exception('Error estimating image bounds')
234
+ bds = ImageBounds(0,0,0,0,0,0)
235
+
236
+ return bds
237
+
238
+ @property
239
+ def image_bounds(self):
240
+ if self._image_bounds is False:
241
+ self._image_bounds = self._calc_image_bounds()
242
+
243
+ return self._image_bounds
244
+
245
+
246
+ # Data sources (File IO, or adapters to other data formats - e.g. recarrays
247
+ ###########################################################################
248
+
249
+ @deprecated_name('randomSource')
250
+ class RandomSource(TabularBase):
251
+ _name = "Random Source"
252
+ def __init__(self, xmax, ymax, nsamps):
253
+ """Uniform random source, for testing and as an example"""
254
+ self.x = xmax*np.random.rand(nsamps)
255
+ self.y = ymax*np.random.rand(nsamps)
256
+
257
+ self._keys = ['x', 'y']
258
+
259
+ def keys(self):
260
+ return self._keys
261
+
262
+ def __getitem__(self, keys):
263
+ key, sl = self._getKeySlice(keys)
264
+
265
+ if not key in self._keys:
266
+ raise KeyError('Key (%s) not defined' % key)
267
+
268
+ if key == 'x':
269
+ return self.x[sl]
270
+ elif key == 'y':
271
+ return self.y[sl]
272
+
273
+ def getInfo(self):
274
+ return 'Random Data Source\n\n %d points' % len(self.x)
275
+
276
+ def unNestNames(nameList, parent=''):
277
+ unList = []
278
+ for n in nameList:
279
+ if isinstance(n, six.string_types):
280
+ unList.append(parent + n)
281
+ else:
282
+ unList += unNestNames(n[1], parent + n[0] + '_')
283
+ return unList
284
+
285
+ def unNestDtype(descr, parent=''):
286
+ unList = []
287
+ for n in descr:
288
+ #print n, n.__class__, len(n)
289
+ if isinstance(n, tuple) and len(n) == 2 and isinstance(n[1],six.string_types):
290
+ unList.append(parent + n[0])
291
+ else:
292
+ unList += unNestDtype(n[1], parent + n[0] + '_')
293
+ return unList
294
+
295
+ def unnest_dtype(dtype, parent=''):
296
+ if isinstance(dtype, np.dtype):
297
+ descr = dtype.descr
298
+ else:
299
+ descr = dtype
300
+
301
+ dt = []
302
+ for node in descr:
303
+ if isinstance(node, tuple):# and len(node) == 2:
304
+ name, t = node[:2]
305
+ if isinstance(t, str):
306
+ dt.append((parent + name, ) + node[1:])
307
+ elif len(node) == 2:
308
+ dt += unnest_dtype(node[1], parent=parent + name + '_')
309
+ else:
310
+ raise RuntimeError('unexpected dtype descr: %s, node: %s' % (descr, node))
311
+ else:
312
+ raise RuntimeError('unexpected dtype descr: %s, node: %s' % (descr, node))
313
+
314
+ if parent == '':
315
+ #cast to a numpy dtype if we are at the top recursion level
316
+ return np.dtype(dt)
317
+ else:
318
+ # otherwise just return the description
319
+ return dt
320
+
321
+ @deprecated_name('fitResultsSource')
322
+ class FitResultsSource(TabularBase):
323
+ _name = "recarrayfi Source"
324
+ def __init__(self, fitResults, sort=True):
325
+ self.setResults(fitResults, sort=sort)
326
+
327
+ def _set_transkeys(self):
328
+ self.transkeys = {'A': 'fitResults_A', 'x': 'fitResults_x0',
329
+ 'y': 'fitResults_y0', 'sig': 'fitResults_sigma',
330
+ 'error_x': 'fitError_x0', 'error_y': 'fitError_y0', 'error_z': 'fitError_z0', 't': 'tIndex'}
331
+
332
+ for k in list(self.transkeys.keys()):
333
+ if not self.transkeys[k] in self._keys:
334
+ self.transkeys.pop(k)
335
+
336
+ def setResults(self, fitResults, sort=True):
337
+ self.fitResults = fitResults
338
+
339
+ if sort:
340
+ #sort by time
341
+ self.fitResults.sort(order='tIndex')
342
+
343
+ #allow access using unnested original names
344
+ # TODO???? - replace key translation with a np.view call?
345
+ #self._keys = unNestDtype(self.fitResults.dtype.descr)
346
+ self._keys = list(unnest_dtype(self.fitResults.dtype).names)
347
+
348
+ #or shorter aliases
349
+ self._set_transkeys()
350
+
351
+
352
+
353
+ def keys(self):
354
+ return self._keys + list(self.transkeys.keys())
355
+
356
+ def __getitem__(self, keys):
357
+ key, sl = self._getKeySlice(keys)
358
+
359
+ #if we're using an alias replace with actual key
360
+ if key in self.transkeys.keys():
361
+ key = self.transkeys[key]
362
+
363
+ if not key in self._keys:
364
+ raise KeyError('Key (%s) not found' % key)
365
+
366
+ k = key.split('_')
367
+
368
+ if len(k) == 1: # TODO: evaluate why these are cast as floats
369
+ return self.fitResults[k[0]][sl]
370
+ elif len(k) == 2:
371
+ return self.fitResults[k[0]][k[1]][sl]
372
+ elif len(k) == 3:
373
+ return self.fitResults[k[0]][k[1]][k[2]][sl]
374
+ else:
375
+ raise KeyError("Don't know about deeper nesting yet")
376
+
377
+ def getInfo(self):
378
+ return 'PYME h5r Data Source\n\n %d points' % self.fitResults.shape[0]
379
+
380
+
381
+
382
+ class _BaseHDFSource(FitResultsSource):
383
+ ''' Copy of the original BaseHDFSource which used pytables directly rather than h5rFile
384
+ Currently unused, but kept for historical reasons.
385
+ '''
386
+ def __init__(self, h5fFile, tablename='FitResults'):
387
+ """ Data source for use with h5r files as saved by the PYME analysis
388
+ component. Takes either an open h5r file or a string filename to be
389
+ opened."""
390
+ self.tablename = tablename
391
+
392
+ if type(h5fFile) == tables.file.File:
393
+ h5f = h5fFile
394
+ self._own_file = False #did we open the file
395
+ else:
396
+ h5f = tables.open_file(h5fFile)
397
+ self.h5f = h5f
398
+ self._own_file = True
399
+
400
+ #if not tablename in dir(self.h5f.root):
401
+
402
+
403
+ try:
404
+ self.fitResults = getattr(h5f.root, tablename)[:]
405
+ except (AttributeError, tables.NoSuchNodeError):
406
+ logger.exception('Was expecting to find a "%s" table' % tablename)
407
+ raise
408
+
409
+ #allow access using unnested original names
410
+ self._keys = unNestNames(getattr(h5f.root, tablename).description._v_nested_names)
411
+
412
+ #close the hdf file (if we opened it)
413
+ #if self._own_file:
414
+ # h5f.close()
415
+
416
+ #or shorter aliases
417
+
418
+ def close(self):
419
+ if self._own_file:
420
+ try:
421
+ self.h5f.close()
422
+ except:
423
+ pass
424
+
425
+ def __del__(self):
426
+ self.close()
427
+
428
+
429
+ class BaseHDFSource(FitResultsSource):
430
+ def __init__(self, h5fFile, tablename='FitResults'):
431
+ """ Data source for use with h5r files as saved by the PYME analysis
432
+ component. Takes either an open h5r file or a string filename to be
433
+ opened."""
434
+ from PYME.IO import h5rFile
435
+ self.tablename = tablename
436
+
437
+ if isinstance(h5fFile, tables.file.File):
438
+ try:
439
+ fr = getattr(h5fFile.root, tablename)
440
+ self.fitResults = fr[:]
441
+
442
+ #allow access using unnested original names
443
+ self._keys = unNestNames(fr.description._v_nested_names)
444
+
445
+ except (AttributeError, tables.NoSuchNodeError):
446
+ logger.exception('Was expecting to find a "%s" table' % tablename)
447
+ raise
448
+
449
+
450
+
451
+ else:
452
+ if isinstance(h5fFile, h5rFile.H5RFile):
453
+ h5f = h5fFile
454
+ else:
455
+ h5f = h5rFile.openH5R(h5fFile)
456
+
457
+ with h5f:
458
+ self.fitResults = h5f.getTableData(tablename, slice(None))
459
+ if (len(self.fitResults) == 0):
460
+ raise RuntimeError('Was expecting to find a "%s" table' % tablename)
461
+
462
+ #allow access using unnested original names
463
+ self._keys = unNestNames(getattr(h5f._h5file.root, tablename).description._v_nested_names)
464
+
465
+ #close the hdf file (if we opened it)
466
+ #if self._own_file:
467
+ # h5f.close()
468
+
469
+ #or shorter aliases
470
+
471
+ def close(self):
472
+ pass
473
+
474
+
475
+ @deprecated_name('h5rSource')
476
+ class H5RSource(BaseHDFSource):
477
+ _name = "h5r Data Source"
478
+ def __init__(self, h5fFile, tablename='FitResults'):
479
+ BaseHDFSource.__init__(self, h5fFile, tablename)
480
+
481
+ # set up column aliases
482
+ self._set_transkeys()
483
+
484
+ #sort by time
485
+ if 'tIndex' in self._keys:
486
+ I = self.fitResults['tIndex'].argsort()
487
+ self.fitResults = self.fitResults[I]
488
+ #self.fitResults.sort(order='tIndex')
489
+
490
+
491
+ def getInfo(self):
492
+ return 'PYME h5r Data Source\n\n %d points' % self.fitResults.shape[0]
493
+
494
+
495
+ @deprecated_name('h5rDSource')
496
+ class H5RDSource(H5RSource):
497
+ _name = "h5r Drift Source"
498
+
499
+ def __init__(self, h5fFile):
500
+ """ Data source for use with h5r files as saved by the PYME analysis
501
+ component"""
502
+
503
+ H5RSource.__init__(self, h5fFile, 'DriftResults')
504
+
505
+ def getInfo(self):
506
+ return 'PYME h5r Drift Data Source\n\n %d points' % self.fitResults.shape[0]
507
+
508
+ @deprecated_name('hdfSource')
509
+ class HDFSource(H5RSource):
510
+ _name = "hdf Data Source"
511
+
512
+ def __init__(self, h5fFile, tablename='FitResults'):
513
+ BaseHDFSource.__init__(self, h5fFile, tablename)
514
+ #or shorter aliases
515
+
516
+ #sort by time
517
+ if 'tIndex' in self._keys:
518
+ I = self.fitResults['tIndex'].argsort()
519
+ self.fitResults = self.fitResults[I]
520
+
521
+ def keys(self):
522
+ return self._keys #+ self.transkeys.keys()
523
+
524
+ def __getitem__(self, keys):
525
+ key, sl = self._getKeySlice(keys)
526
+
527
+ if not key in self._keys:
528
+ raise KeyError('Key (%s) not found' % key)
529
+
530
+ return self.fitResults[key][sl]
531
+
532
+
533
+ def getInfo(self):
534
+ return 'PYME hdf Data Source\n\n %d points' % self.fitResults.shape[0]
535
+
536
+ # class h5rDSource(inputFilter):
537
+ # _name = "h5r Drift Source"
538
+ # def __init__(self, h5fFile):
539
+ # """ Data source for use with h5r files as saved by the PYME analysis
540
+ # component"""
541
+ #
542
+ # if type(h5fFile) == tables.file.File:
543
+ # self.h5f = h5fFile
544
+ # else:
545
+ # self.h5f = tables.openFile(h5fFile)
546
+ #
547
+ # if not 'DriftResults' in dir(self.h5f.root):
548
+ # raise RuntimeError('Was expecting to find a "DriftResults" table')
549
+ #
550
+ # self.driftResults = self.h5f.root.DriftResults[:]
551
+ #
552
+ # #sort by time
553
+ # self.driftResults.sort(order='tIndex')
554
+ #
555
+ # #allow access using unnested original names
556
+ # self._keys = unNestNames(self.h5f.root.DriftResults.description._v_nestedNames)
557
+ # #or shorter aliases
558
+ # self.transkeys = {'A' : 'fitResults_A', 'x' : 'fitResults_x0',
559
+ # 'y' : 'fitResults_y0', 'sig' : 'fitResults_sigma',
560
+ # 'error_x' : 'fitError_x0', 'error_y' : 'fitError_y0', 't':'tIndex'}
561
+ #
562
+ #
563
+ # def keys(self):
564
+ # return self._keys + self.transkeys.keys()
565
+ #
566
+ # def __getitem__(self, keys):
567
+ # key, sl = self._getKeySlice(keys)
568
+ #
569
+ # #if we're using an alias replace with actual key
570
+ # if key in self.transkeys.keys():
571
+ # key = self.transkeys[key]
572
+ #
573
+ # if not key in self._keys:
574
+ # raise RuntimeError('Key not found')
575
+ #
576
+ # k = key.split('_')
577
+ #
578
+ # if len(k) == 1:
579
+ # return self.driftResults[sl][k[0]].astype('f')
580
+ # elif len(k) == 2:
581
+ # return self.driftResults[sl][k[0]][k[1]].astype('f')
582
+ # elif len(k) == 3:
583
+ # return self.driftResults[sl][k[0]][k[1]][k[2]].astype('f')
584
+ # else:
585
+ # raise RuntimeError("Don't know about deeper nesting yet")
586
+ #
587
+ #
588
+ # def close(self):
589
+ # self.h5f.close()
590
+ #
591
+ # def getInfo(self):
592
+ # return 'PYME h5r Drift Data Source\n\n %d points' % self.h5f.root.DriftResults.shape[0]
593
+ @deprecated_name('textfileSource')
594
+ class TextfileSource(TabularBase):
595
+ _name = "Text File Source"
596
+ def __init__(self, filename, columnnames, delimiter=None, skiprows=0, skip_footer=0, invalid_raise=True, comments='#'):
597
+ """ Input filter for use with delimited text data. Defaults
598
+ to whitespace delimiter. Need to provide a list of variable names
599
+ in the order that they appear in the file. Using 'x', 'y' and 'error_x'
600
+ for the position data and it's error should ensure that this functions
601
+ with the visualisation backends"""
602
+
603
+ #self.res = np.loadtxt(filename, dtype={'names' : columnnames, # TODO: evaluate why these are cast as floats
604
+ # 'formats' : ['f4' for i in range(len(columnnames))]}, delimiter = delimiter, skiprows=skiprows)
605
+
606
+ from PYME import config
607
+
608
+ #print('invalid_raise:', invalid_raise)
609
+
610
+ if config.get('TextFileSource-use_pandas',False):
611
+ logger.info('Opening "%s" using pandas (set TextFileSource-use_pandas: False in config.yaml to use legacy np.genfromtxt instead)' % filename)
612
+ import pandas as pd
613
+ self.res = pd.read_csv(filename,
614
+ comment=comments,
615
+ delimiter=delimiter,
616
+ skiprows=skiprows,
617
+ skipfooter=skip_footer,
618
+ names=columnnames,
619
+ dtype='f4',
620
+ skipinitialspace=True,
621
+ on_bad_lines='error' if invalid_raise else 'warn,'
622
+ ).to_records(index=False)
623
+
624
+ else:
625
+ logger.info('Opening %s using np.genfromtxt (set TextFileSource-use_pandas: True in config.yaml to use pandas instead)' % filename)
626
+ self.res = np.genfromtxt(filename,
627
+ comments=comments,
628
+ delimiter=delimiter,
629
+ skip_header=skiprows,
630
+ skip_footer=skip_footer,
631
+ names=columnnames,
632
+ dtype='f4', replace_space='_',
633
+ missing_values=None, filling_values=np.nan, # use NaN to flag missing values
634
+ invalid_raise=invalid_raise,
635
+ encoding='latin-1') # Zeiss Elyra bombs unless we go for latin-1 encoding, maybe make flavour specific?
636
+
637
+ # check for missing values:
638
+ # TODO - is this needed/helpful, or should we propagate missing values further?
639
+ # cast to a non-structured dtype and use the fact than the sum will be NaN if any of the individual values is NaN
640
+ r = self.res.view(('f4', len(columnnames))).sum(1)
641
+ if np.any(np.isnan(r)):
642
+ logger.warning('Text file contains missing values, discarding lines with missing values')
643
+ self.res = self.res[~np.isnan(r)]
644
+
645
+ self._keys = list(columnnames)
646
+
647
+
648
+ def keys(self):
649
+ return self._keys
650
+
651
+ def __getitem__(self, keys):
652
+ key, sl = self._getKeySlice(keys)
653
+
654
+ if not key in self._keys:
655
+ raise KeyError('Key (%s) not found' % key)
656
+
657
+
658
+ return self.res[key][sl]
659
+
660
+
661
+ def getInfo(self):
662
+ return 'Text Data Source\n\n %d points' % len(self.res['x'])
663
+
664
+
665
+ @deprecated_name('matfileSource')
666
+ class MatfileSource(TabularBase):
667
+ _name = "Matlab Source"
668
+ def __init__(self, filename, columnnames, varName='Orte'):
669
+ """ Input filter for use with matlab data where all variables are in in one 2D array (variable).
670
+ Need to provide a variable name within the matfile to and a list of column names
671
+ in the order that they appear in the file. Using 'x', 'y' and 'error_x'
672
+ for the position data and it's error should ensure that this functions
673
+ with the visualisation backends"""
674
+
675
+ import scipy.io
676
+
677
+ self.res = scipy.io.loadmat(filename)[varName].astype('f4') # TODO: evaluate why these are cast as floats
678
+ self.res = np.rec.fromarrays(self.res.T, dtype={'names' : columnnames, 'formats' : ['f4' for i in range(len(columnnames))]})
679
+
680
+ self._keys = list(columnnames)
681
+
682
+
683
+ def keys(self):
684
+ return self._keys
685
+
686
+ def __getitem__(self, key):
687
+ key, sl = self._getKeySlice(key)
688
+ if not key in self._keys:
689
+ raise KeyError('Key (%s) not found' % key)
690
+
691
+ return self.res[key][sl]
692
+
693
+
694
+ def getInfo(self):
695
+ return 'Text Data Source\n\n %d points' % len(self.res['x'])
696
+
697
+ @deprecated_name('matfileColumnSource')
698
+ class MatfileColumnSource(TabularBase):
699
+ _name = "Matlab Column Source"
700
+
701
+ def __init__(self, filename):
702
+ """ Input filter for use with matlab data where the each column is in a separate variable.
703
+ Relies on variables having suitable column names - columns named x, y, z, t, and probe (if multi-colour) should
704
+ be present.
705
+ """
706
+
707
+ import scipy.io
708
+
709
+ self.res = scipy.io.loadmat(filename) # TODO: evaluate why these are cast as floats
710
+
711
+ self._keys = [k for k in self.res.keys() if not k.startswith('_')]
712
+
713
+ def keys(self):
714
+ return self._keys
715
+
716
+ def __getitem__(self, key):
717
+ key, sl = self._getKeySlice(key)
718
+ if not key in self._keys:
719
+ raise KeyError('Key (%s) not found' % key)
720
+
721
+ return self.res[key][sl].astype('f4').squeeze()
722
+
723
+ def getInfo(self):
724
+ return 'Text Data Source\n\n %d points' % len(self.res['x'])
725
+
726
+ class MatfileMultiColumnSource(MatfileColumnSource):
727
+ def __init__(self, filename):
728
+ MatfileColumnSource.__init__(self, filename)
729
+
730
+ # Unwrap multiple channels in self.res
731
+ tmp_res = {}
732
+ for k in self._keys:
733
+ tmp_res[k] = np.vstack(self.res[k][0]).squeeze()
734
+ n_channels = self.res[self._keys[0]][0].shape[0]
735
+ tmp_res['probe'] = np.vstack(self.res[self._keys[0]][0]*np.zeros(n_channels)+np.arange(n_channels)).squeeze()
736
+ self._keys.append('probe')
737
+
738
+ self.res = tmp_res
739
+
740
+ @deprecated_name('recArrayInput')
741
+ class RecArraySource(TabularBase):
742
+ _name = 'RecArray Source'
743
+ def __init__(self, recordArray):
744
+ self.recArray = recordArray
745
+ self._keys = list(self.recArray.dtype.names)
746
+
747
+ def keys(self):
748
+ return self._keys
749
+
750
+ def __getitem__(self, keys):
751
+ key, sl = self._getKeySlice(keys)
752
+
753
+ if not key in self._keys:
754
+ raise KeyError('Key (%s) not found' % key)
755
+
756
+ return self.recArray[key][sl]
757
+
758
+ def getInfo(self):
759
+ return 'Record Array Source\n\n %d points' % len(self.recArray['x'])
760
+
761
+
762
+ class DictSource(TabularBase):
763
+ _name = 'Dict Source'
764
+
765
+ def __init__(self, source):
766
+ """
767
+ Create a data source from a dictionary of numpy arrays, where each entry is a column.
768
+
769
+ Parameters
770
+ ----------
771
+ source
772
+
773
+ """
774
+ self._verify(source)
775
+ self._source = source
776
+
777
+ def _verify(self, source):
778
+ L = len(source[list(source.keys())[0]])
779
+
780
+ for k, v in source.items():
781
+ if not isinstance(v, np.ndarray):
782
+ raise TypeError('Column "%s" is not a numpy array' % k)
783
+
784
+ if not len(v) == L:
785
+ raise ValueError('Columns are different lengths')
786
+
787
+ def addColumn(self, name, values):
788
+ if not isinstance(values, np.ndarray):
789
+ raise TypeError('New column "%s" is not a numpy array' % name)
790
+
791
+ if not len(values) == len(self):
792
+ raise ValueError('Columns are different lengths')
793
+
794
+ def keys(self):
795
+ return list(self._source.keys())
796
+
797
+ def __getitem__(self, keys):
798
+ key, sl = self._getKeySlice(keys)
799
+ return self._source[key][sl]
800
+
801
+ class ColumnSource(DictSource):
802
+ _name = 'Column Source'
803
+ def __init__(self, **kwargs):
804
+ """
805
+ Create a datasource from columns specified by kwargs. Each column should be a numpy array.
806
+
807
+ Parameters
808
+ ----------
809
+ kwargs
810
+ """
811
+ DictSource.__init__(self, dict(kwargs))
812
+
813
+ def scalar_dict_source(d):
814
+ """
815
+ Creates a tabular data source of length 1 from a scalar data
816
+ """
817
+
818
+ return DictSource({k : np.asarray([v]) for k, v in d.items()})
819
+
820
+ def scalar_column_source(**kwargs):
821
+ """
822
+ Creates a tabular data source of length 1 from a scalar data
823
+ """
824
+
825
+ return ColumnSource(**{k : np.asarray([v]) for k, v in kwargs.items()})
826
+
827
+ # Filters (which remap existing data sources)
828
+ #############################################
829
+
830
+
831
+ class SelectionFilter(TabularBase):
832
+ _name = "Selection Filter"
833
+
834
+ def __init__(self, resultsSource, index):
835
+ """ A filter which relies on a supplied index (either integer or boolean)"""
836
+
837
+ self.resultsSource = resultsSource
838
+
839
+ self.Index = index
840
+
841
+ def __getitem__(self, keys):
842
+ key, sl = self._getKeySlice(keys)
843
+ return self.resultsSource[key][self.Index][sl]
844
+
845
+ def keys(self):
846
+ return list(self.resultsSource.keys())
847
+
848
+ @deprecated_name('resultsFilter')
849
+ class ResultsFilter(SelectionFilter):
850
+ _name = "Results Filter"
851
+ def __init__(self, resultsSource, **kwargs):
852
+ """Class to permit filtering of fit results - masquarades
853
+ as a dictionary. Takes item ranges as keyword arguments, eg:
854
+ f = resultsFliter(source, x=[0,10], error_x=[0,5]) will return
855
+ an object that behaves like source, but with only those points with
856
+ an x value in the range [0, 10] and a x error in the range [0, 5].
857
+
858
+ The filter class does not have any explicit knowledge of the keys
859
+ supported by the underlying data source."""
860
+
861
+ if not isinstance(resultsSource, TabularBase):
862
+ raise TypeError('Expecting a tabular object for resultsSource')
863
+
864
+ self.resultsSource = resultsSource
865
+
866
+ #by default select everything
867
+ #self.Index = np.ones(self.resultsSource[list(resultsSource.keys())[0]].shape[0]) > 0.5
868
+ self.Index = np.ones(len(self.resultsSource), dtype=bool)
869
+
870
+ for k in kwargs.keys():
871
+ if not k in self.resultsSource.keys():
872
+ raise KeyError('Requested key not present: ' + k)
873
+
874
+ range = kwargs[k]
875
+ if not len(range) == 2:
876
+ raise RuntimeError('Expected an iterable of length 2')
877
+
878
+ self.Index *= (self.resultsSource[k] > range[0])*(self.resultsSource[k] < range[1])
879
+
880
+
881
+ @deprecated_name('randomSelectionFilter')
882
+ class RandomSelectionFilter(SelectionFilter):
883
+ _name = "Random Selection Filter"
884
+
885
+ def __init__(self, resultsSource, num_Samples):
886
+ """Class to permit filtering of fit results - masquarades
887
+ as a dictionary. Takes item ranges as keyword arguments, eg:
888
+ f = resultsFliter(source, x=[0,10], error_x=[0,5]) will return
889
+ an object that behaves like source, but with only those points with
890
+ an x value in the range [0, 10] and a x error in the range [0, 5].
891
+
892
+ The filter class does not have any explicit knowledge of the keys
893
+ supported by the underlying data source."""
894
+
895
+ if not isinstance(resultsSource, TabularBase):
896
+ raise TypeError('Expecting a tabular object for resultsSource')
897
+
898
+ self.resultsSource = resultsSource
899
+
900
+ #by default select everything
901
+ self.Index = np.random.choice(len(self.resultsSource), num_Samples, replace=False)
902
+
903
+
904
+ @deprecated_name('idFilter')
905
+ class IdFilter(SelectionFilter):
906
+ _name = "Id Filter"
907
+
908
+ def __init__(self, resultsSource, id_column, valid_ids):
909
+ """Class to permit filtering of fit results - masquarades
910
+ as a dictionary. Takes item ranges as keyword arguments, eg:
911
+ f = resultsFliter(source, x=[0,10], error_x=[0,5]) will return
912
+ an object that behaves like source, but with only those points with
913
+ an x value in the range [0, 10] and a x error in the range [0, 5].
914
+
915
+ The filter class does not have any explicit knowledge of the keys
916
+ supported by the underlying data source."""
917
+
918
+ if not isinstance(resultsSource, TabularBase):
919
+ raise TypeError('Expecting a tabular object for resultsSource')
920
+
921
+ self.resultsSource = resultsSource
922
+ self.id_column = id_column
923
+ self.valid_ids = valid_ids
924
+
925
+ #self.Index = np.zeros(self.resultsSource[list(resultsSource.keys())[0]].shape)
926
+ self.Index = np.zeros(len(self.resultsSource))
927
+
928
+ for id in valid_ids:
929
+ self.Index += (self.resultsSource[id_column] == id)
930
+
931
+
932
+
933
+ self.Index = self.Index > 0.5
934
+
935
+
936
+ @deprecated_name('concatenateFilter')
937
+ class ConcatenateFilter(TabularBase):
938
+ _name = "Concatenation Filter"
939
+
940
+ def __init__(self, source0, source1, *args, concatKey='concatSource'):
941
+ """Class which concatenates two (or more) tabular data sources. The data sources should have the same keys.
942
+
943
+ The filter class does not have any explicit knowledge of the keys
944
+ supported by the underlying data source."""
945
+
946
+ self.source0 = source0
947
+ #self.source1 = source1
948
+
949
+ self._sources = [source0, source1, ] + list(args)
950
+ self._concat_key = concatKey
951
+
952
+
953
+ def __getitem__(self, keys):
954
+ key, sl = self._getKeySlice(keys)
955
+ if key == self._concat_key:
956
+ return np.hstack([i* np.ones(len(s[list(s.keys())[0]])) for i, s in enumerate(self._sources)])
957
+ #return np.hstack((np.zeros(len(self.source0[list(self.source0.keys())[0]])), np.ones(len(self.source1[list(self.source1.keys())[0]]))))
958
+ else:
959
+ return np.hstack([s[key] for s in self._sources])[sl]
960
+
961
+ def keys(self):
962
+ return set(self.source0.keys()).intersection(*[s.keys() for s in self._sources]).union([self._concat_key,])
963
+
964
+
965
+ @deprecated_name('cachingResultsFilter')
966
+ class CachingResultsFilter(TabularBase):
967
+ _name = "Caching Results Filter"
968
+ def __init__(self, resultsSource, **kwargs):
969
+ """Class to permit filtering of fit results - masquarades
970
+ as a dictionary. Takes item ranges as keyword arguments, eg:
971
+ f = resultsFliter(source, x=[0,10], error_x=[0,5]) will return
972
+ an object that behaves like source, but with only those points with
973
+ an x value in the range [0, 10] and a x error in the range [0, 5].
974
+
975
+ The filter class does not have any explicit knowledge of the keys
976
+ supported by the underlying data source."""
977
+
978
+ if not isinstance(resultsSource, TabularBase):
979
+ raise TypeError('Expecting a tabular object for resultsSource')
980
+
981
+ self.resultsSource = resultsSource
982
+ self.cache = {}
983
+
984
+ #by default select everything
985
+ self.Index = np.ones(len(self.resultsSource), dtype=bool)
986
+
987
+ for k in kwargs.keys():
988
+ if not k in self.resultsSource.keys():
989
+ raise KeyError('Requested key not present: ' + k)
990
+
991
+ range = kwargs[k]
992
+ if not len(range) == 2:
993
+ raise RuntimeError('Expected an iterable of length 2')
994
+
995
+ self.Index *= (self.resultsSource[k] > range[0])*(self.resultsSource[k] < range[1])
996
+
997
+
998
+ def __getitem__(self, keys):
999
+ key, sl = self._getKeySlice(keys)
1000
+ if key in self.cache.keys():
1001
+ return self.cache[key][sl]
1002
+ else:
1003
+ res = np.array(self.resultsSource[key])[self.Index]
1004
+ self.cache[key] = res
1005
+ return res[sl]
1006
+
1007
+ def keys(self):
1008
+ return list(self.resultsSource.keys())
1009
+
1010
+ @property
1011
+ def mdh(self):
1012
+ return self.resultsSource.mdh
1013
+
1014
+ @deprecated_name('mappingFilter')
1015
+ class MappingFilter(TabularBase):
1016
+ _name = "Mapping Filter"
1017
+ def __init__(self, resultsSource, **kwargs):
1018
+ """Class to permit transformations (e.g. drift correction) of fit results
1019
+ - masquarades as a dictionary. Takes mappings as keyword arguments, eg:
1020
+ f = resultsFliter(source, xp='x + a*tIndex', yp=compile('y + b*tIndex', '/tmp/test1', 'eval'), a=1, b=2)
1021
+ will return an object that behaves like source, but has additional members
1022
+ xp and yp.
1023
+
1024
+ the mappings should either be code objects, strings (which will be compiled into code objects),
1025
+ or something else (which will be turned into a local variable - eg constants in above example)
1026
+
1027
+ MappingFilter has one optional keyword arguement, modifies_bounds, which is a boolean indicating
1028
+ that the bounds implied by the metadata will no longer match up to the data after mapping - e.g. if
1029
+ the mapping introduces position shifts. For now, this is un-used, but exists as a hook for potential
1030
+ future use cases (see https://github.com/python-microscopy/python-microscopy/pull/1543#issuecomment-2298643266).
1031
+
1032
+ """
1033
+
1034
+ if not isinstance(resultsSource, TabularBase):
1035
+ warnings.warn(VisibleDeprecationWarning('Mapping filter created with something that is not a tabular object. This will be unsupported in a future release. Consider DictSource or ColumnSource instead'))
1036
+
1037
+ self._modifies_bounds = kwargs.pop('modifies_bounds', False)
1038
+
1039
+ self.resultsSource = resultsSource
1040
+
1041
+ self.mappings = {}
1042
+ self.new_columns = {}
1043
+ self.variables = {}
1044
+ self.hidden_columns = []
1045
+
1046
+ for k in kwargs.keys():
1047
+ v = kwargs[k]
1048
+ self.setMapping(k,v)
1049
+
1050
+ def _calc_image_bounds(self):
1051
+ if self._modifies_bounds and 'x' in self.keys():
1052
+ # it is possible for a mapping to introduce large changes in x and y, hence modifying the image bounds
1053
+ # from their metadata values. We need to estimate bounds from data in this case.
1054
+ from PYME.IO.image import ImageBounds
1055
+ return ImageBounds.estimateFromSource(self)
1056
+ else:
1057
+ return super()._calc_image_bounds()
1058
+
1059
+ def __getitem__(self, keys):
1060
+ key, sl = self._getKeySlice(keys)
1061
+ if key in self.mappings.keys():
1062
+ return self.getMappedResults(key, sl)
1063
+ elif key in self.new_columns.keys():
1064
+ return self.new_columns[key][sl]
1065
+ else:
1066
+ return self.resultsSource[keys]
1067
+
1068
+ def keys(self):
1069
+ keys = list(dict.fromkeys(list(self.resultsSource.keys()) + list(self.mappings.keys()) + list(self.new_columns.keys())))
1070
+ for k in self.hidden_columns:
1071
+ keys.remove(k)
1072
+
1073
+ return keys
1074
+
1075
+ def addVariable(self, name, value):
1076
+ """
1077
+ Adds a scalar variable to the mapping object. This will be accessible from mappings. An example usage might
1078
+ be to define a scaling parameter for one of our column variables.
1079
+
1080
+ Parameters
1081
+ ----------
1082
+ name : string
1083
+ The name we want to be able to access the variable by
1084
+ value : float (or something which can be cast to a float)
1085
+ The value
1086
+
1087
+ """
1088
+
1089
+ #insert into our __dict__ object (for backwards compatibility - TODO change me to something less hacky)
1090
+ #setattr(self, name, float(value))
1091
+
1092
+ self.variables[name] = float(value)
1093
+
1094
+ def set_variables(self, **kwargs):
1095
+ for k, v in kwargs.items():
1096
+ self.variables[k] = float(v)
1097
+
1098
+ def addColumn(self, name, values):
1099
+ """
1100
+ Adds a column of values to the mapping.
1101
+
1102
+ Parameters
1103
+ ----------
1104
+ name : str
1105
+ The new column name
1106
+ values : array-like
1107
+ The values. This should be the same length as the existing columns.
1108
+
1109
+ """
1110
+
1111
+ #force to be an array
1112
+ values = np.array(values)
1113
+
1114
+ if not len(values) == len(self.resultsSource[list(self.resultsSource.keys())[0]]):
1115
+ raise RuntimeError('New column does not match the length of existing columns')
1116
+
1117
+ #insert into our __dict__ object (for backwards compatibility - TODO change me to something less hacky)
1118
+ #setattr(self, name, values)
1119
+
1120
+ self.new_columns[name] = values
1121
+
1122
+
1123
+ def setMapping(self, key, mapping):
1124
+ if type(mapping) == types.CodeType:
1125
+ self.mappings[key] = mapping
1126
+ elif isinstance(mapping, six.string_types):
1127
+ self.mappings[key] = compile(mapping, '/tmp/test1', 'eval')
1128
+ else:
1129
+ warnings.warn('setMapping should not be used to add a variable/data column', DeprecationWarning)
1130
+ self.__dict__[key] = mapping
1131
+
1132
+ def getMappedResults(self, key, sl):
1133
+ map = self.mappings[key]
1134
+
1135
+ #get all the variables needed for evaluation into local namespace
1136
+ varnames = map.co_names
1137
+ for vname in varnames:
1138
+ if vname in globals():
1139
+ pass
1140
+ if vname in self.resultsSource.keys(): #look at original results first
1141
+ locals()[vname] = self.resultsSource[vname][sl]
1142
+ elif vname in self.new_columns.keys():
1143
+ locals()[vname] = self.new_columns[vname][sl]
1144
+ elif vname in self.variables.keys():
1145
+ locals()[vname] = self.variables[vname]
1146
+ elif vname in self.__dict__.keys(): #look for constants
1147
+ #FIXME - do we still need this now we have variables
1148
+ locals()[vname] = self.__dict__[vname]
1149
+ elif vname in self.mappings.keys(): #finally try other mappings
1150
+ #try to prevent infinite recursion here if mappings have circular references
1151
+ if not vname == key and not key in self.mappings[vname].co_names:
1152
+ locals()[vname] = self.getMappedResults(vname, sl)
1153
+ else:
1154
+ raise RuntimeError('Circular reference detected in mapping')
1155
+
1156
+ return eval(map)
1157
+
1158
+ class _ChannelFilter(TabularBase):
1159
+ def __init__(self, colour_filter, channel):
1160
+ self.colour_filter = colour_filter
1161
+ self.channel = channel
1162
+
1163
+ def __getitem__(self, keys):
1164
+ return self.colour_filter.get_channel_column(self.channel, keys)
1165
+
1166
+ def keys(self):
1167
+ return list(self.colour_filter.keys())
1168
+
1169
+ @deprecated_name('colourFilter')
1170
+ class ColourFilter(TabularBase):
1171
+ _name = "Colour Filter"
1172
+ def __init__(self, resultsSource, currentColour=None):
1173
+ """Class to permit filtering by colour
1174
+ """
1175
+
1176
+ if not isinstance(resultsSource, TabularBase):
1177
+ raise TypeError('Expecting a tabular object for resultsSource')
1178
+
1179
+ self.resultsSource = resultsSource
1180
+ self.currentColour = currentColour
1181
+ self.chromaticShifts = {}
1182
+
1183
+ self.t_p_dye = 0.1
1184
+ self.t_p_other = 0.1
1185
+ self.t_p_background = .01
1186
+
1187
+ @property
1188
+ def index(self):
1189
+ return self._index(self.currentColour)
1190
+
1191
+ def _index(self, channel):
1192
+ colChans = self.getColourChans()
1193
+ if not channel in colChans:
1194
+ return np.ones(len(self.resultsSource[list(self.resultsSource.keys())[0]]), 'bool')
1195
+ else:
1196
+ p_dye = self.resultsSource['p_%s' % channel]
1197
+
1198
+ p_other = 0 * p_dye
1199
+ p_tot = self.t_p_background * self.resultsSource['ColourNorm']
1200
+
1201
+ for k in colChans:
1202
+ p_tot += self.resultsSource['p_%s' % k]
1203
+ if not channel == k:
1204
+ p_other = np.maximum(p_other, self.resultsSource['p_%s' % k])
1205
+
1206
+ p_dye = p_dye / p_tot
1207
+ p_other = p_other / p_tot
1208
+
1209
+ return (p_dye > self.t_p_dye) * (p_other < self.t_p_other)
1210
+
1211
+
1212
+ def __getitem__(self, keys):
1213
+ return self.get_channel_column(self.currentColour, keys)
1214
+
1215
+ def get_channel_column(self, chan, keys):
1216
+ key, sl = self._getKeySlice(keys)
1217
+ colChans = self.getColourChans()
1218
+
1219
+ if not chan in colChans:
1220
+ return self.resultsSource[keys]
1221
+ else:
1222
+ #chromatic shift correction
1223
+ #print self.currentColour
1224
+ if chan in self.chromaticShifts.keys() and key in self.chromaticShifts[chan].keys():
1225
+ return self.resultsSource[key][self._index(chan)][sl] + self.chromaticShifts[chan][key]
1226
+ else:
1227
+ return self.resultsSource[key][self._index(chan)][sl]
1228
+
1229
+ def get_channel_ds(self, chan):
1230
+ return _ChannelFilter(self, chan)
1231
+
1232
+
1233
+ @classmethod
1234
+ def get_colour_chans(cls, resultsSource):
1235
+ return [k[2:] for k in resultsSource.keys() if k.startswith('p_')]
1236
+
1237
+ def getColourChans(self):
1238
+ return self.get_colour_chans(self)
1239
+
1240
+ def setColour(self, colour):
1241
+ self.currentColour = colour
1242
+
1243
+ def keys(self):
1244
+ return list(self.resultsSource.keys())
1245
+
1246
+
1247
+ @deprecated_name('cloneSource')
1248
+ class CloneSource(TabularBase):
1249
+ _name = "Cloned Source"
1250
+ def __init__(self, resultsSource, keys=None):
1251
+ """Creates an in memory copy of a (filtered) data source"""
1252
+ #resultsSource
1253
+ self.cache = {}
1254
+
1255
+ if not isinstance(resultsSource, TabularBase):
1256
+ raise TypeError('Expecting a tabular object for resultsSource')
1257
+
1258
+ klist = resultsSource.keys() if not keys else keys
1259
+
1260
+ for k in klist:
1261
+ self.cache[k] = resultsSource[k]
1262
+
1263
+
1264
+
1265
+ def __getitem__(self, keys):
1266
+ key, sl = self._getKeySlice(keys)
1267
+ return self.cache[key][sl]
1268
+
1269
+ def keys(self):
1270
+ return list(self.cache.keys())
1271
+
1272
+ class AnndataSource(TabularBase):
1273
+ """Interfaces with anndata/scanpy/squidpy packages for spatialomics."""
1274
+ _name = "Anndata Source"
1275
+
1276
+ def __init__(self, filename):
1277
+ try:
1278
+ import anndata as ad
1279
+ except ModuleNotFoundError:
1280
+ raise ModuleNotFoundError("No module named anndata. Please install anndata to use this source.")
1281
+
1282
+ # backed='r' keeps us from loading the full file into memory
1283
+ # TODO: Is this the behaviour we want?
1284
+ self.res = ad.read(filename, backed='r')
1285
+
1286
+ # Flatten the anndata structure as best we can to fit our tabular structure
1287
+ self._keys = list(self.res.var_names) + list(self.res.obs.keys())
1288
+ self._keys_attrs = {**{k: 'X' for k in self.res.var_names}, **{k: 'obs' for k in self.res.obs_keys()}}
1289
+ for k, v in self.res.obsm.items():
1290
+ n_var = v.shape[1]
1291
+ if k == "spatial" or k == "spatial3d":
1292
+ if n_var == 2:
1293
+ proposed_keys = ['x', 'y']
1294
+ elif n_var == 3:
1295
+ proposed_keys = ['x', 'y', 'z']
1296
+ else:
1297
+ print(f"Could not load spatial data. Unsupported number of dimensions {n_var}.")
1298
+ proposed_keys = None
1299
+
1300
+ for i, kk in enumerate(proposed_keys):
1301
+ count = 0
1302
+ while proposed_keys[i] in self._keys:
1303
+ proposed_keys[i] = f"{kk}{count}"
1304
+ count += 1
1305
+ self._keys += [proposed_keys[i]]
1306
+ self._keys_attrs.update({proposed_keys[i]: {'obsm': {k: i}}})
1307
+ else:
1308
+ self._keys += [f"{k}_{j}" for j in range(n_var)]
1309
+ self._keys_attrs.update({f"{k}_{j}": {'obsm': {k: j}} for j in range(n_var)})
1310
+
1311
+ def keys(self):
1312
+ return self._keys
1313
+
1314
+ def __getitem__(self, key):
1315
+ key, sl = self._getKeySlice(key)
1316
+ if key not in self._keys:
1317
+ raise KeyError('Key (%s) not found' % key)
1318
+
1319
+ print(f"Getting {key}")
1320
+
1321
+ if self._keys_attrs[key] == "X":
1322
+ x = self.res[sl, key].X
1323
+ if isinstance(x, np.ndarray):
1324
+ return x.squeeze()
1325
+ return x.toarray().squeeze()
1326
+ elif isinstance(self._keys_attrs[key], dict):
1327
+ first_key = next(iter(self._keys_attrs[key]))
1328
+ if first_key == "obsm":
1329
+ d = self._keys_attrs[key][first_key]
1330
+ dkey = next(iter(d))
1331
+ return getattr(self.res, first_key)[dkey][:,d[dkey]]
1332
+ else:
1333
+ raise KeyError(f"Unknown subkeys starting from {first_key}.")
1334
+ else:
1335
+ return getattr(self.res, self._keys_attrs[key])[key][sl].to_numpy().squeeze()
1336
+
1337
+ def getInfo(self):
1338
+ return f"Anndata Data Source\n\n {self.res.X.shape[0]} points"