python-microscopy 25.6.5__cp39-cp39-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1277) hide show
  1. PYME/Acquire/ActionManager.py +450 -0
  2. PYME/Acquire/ExecTools.py +235 -0
  3. PYME/Acquire/Hardware/AAOptoelectronics/MDS.py +175 -0
  4. PYME/Acquire/Hardware/AAOptoelectronics/__init__.py +0 -0
  5. PYME/Acquire/Hardware/ARCoptix/__init__.py +0 -0
  6. PYME/Acquire/Hardware/ARCoptix/lcdriver.py +149 -0
  7. PYME/Acquire/Hardware/ARCoptix/lcserver32.py +123 -0
  8. PYME/Acquire/Hardware/AndorIXon/AndorCam.py +1095 -0
  9. PYME/Acquire/Hardware/AndorIXon/AndorControlFrame.py +312 -0
  10. PYME/Acquire/Hardware/AndorIXon/AndorIXon.py +737 -0
  11. PYME/Acquire/Hardware/AndorIXon/__init__.py +27 -0
  12. PYME/Acquire/Hardware/AndorNeo/AndorNeo.py +644 -0
  13. PYME/Acquire/Hardware/AndorNeo/AndorNeoControlFrame.py +161 -0
  14. PYME/Acquire/Hardware/AndorNeo/AndorZyla.py +761 -0
  15. PYME/Acquire/Hardware/AndorNeo/SDK3.py +307 -0
  16. PYME/Acquire/Hardware/AndorNeo/SDK3Cam.py +171 -0
  17. PYME/Acquire/Hardware/AndorNeo/ZylaControlPanel.py +105 -0
  18. PYME/Acquire/Hardware/AndorNeo/__init__.py +22 -0
  19. PYME/Acquire/Hardware/AndorNeo/parseAtdebug.py +46 -0
  20. PYME/Acquire/Hardware/AndorNeo/plotTimings.py +73 -0
  21. PYME/Acquire/Hardware/AndorNeo/testNeo.py +62 -0
  22. PYME/Acquire/Hardware/Camera.py +1199 -0
  23. PYME/Acquire/Hardware/CameraSkeleton.py +642 -0
  24. PYME/Acquire/Hardware/Coherent/OBIS.py +147 -0
  25. PYME/Acquire/Hardware/Coherent/Sapphire.py +162 -0
  26. PYME/Acquire/Hardware/Coherent/__init__.py +0 -0
  27. PYME/Acquire/Hardware/DMDGui.py +198 -0
  28. PYME/Acquire/Hardware/DigiData/DigiData.py +95 -0
  29. PYME/Acquire/Hardware/DigiData/DigiDataClient.py +30 -0
  30. PYME/Acquire/Hardware/DigiData/RemoteDigiData.py +51 -0
  31. PYME/Acquire/Hardware/DigiData/__init__.py +24 -0
  32. PYME/Acquire/Hardware/DigiData/axDD132x.py +348 -0
  33. PYME/Acquire/Hardware/EMCCDTheory.py +41 -0
  34. PYME/Acquire/Hardware/ExciterWheel.py +167 -0
  35. PYME/Acquire/Hardware/FilterWheel.py +184 -0
  36. PYME/Acquire/Hardware/FocCorr.py +106 -0
  37. PYME/Acquire/Hardware/FocCorrR.py +196 -0
  38. PYME/Acquire/Hardware/FrFilter.py +51 -0
  39. PYME/Acquire/Hardware/GCS/GCS_DLL.py +370 -0
  40. PYME/Acquire/Hardware/GCS/__init__.py +0 -0
  41. PYME/Acquire/Hardware/GCS/gcs.py +210 -0
  42. PYME/Acquire/Hardware/HamamatsuDCAM/HamamatsuDCAM.py +662 -0
  43. PYME/Acquire/Hardware/HamamatsuDCAM/HamamatsuORCA.py +602 -0
  44. PYME/Acquire/Hardware/HamamatsuDCAM/Hamamatsu_control_panel.py +54 -0
  45. PYME/Acquire/Hardware/HamamatsuDCAM/__init__.py +23 -0
  46. PYME/Acquire/Hardware/LaserControlFrame.py +160 -0
  47. PYME/Acquire/Hardware/MPBCommunications/MPBCW.py +132 -0
  48. PYME/Acquire/Hardware/MPBCommunications/__init__.py +0 -0
  49. PYME/Acquire/Hardware/Mercury/Mercury.py +269 -0
  50. PYME/Acquire/Hardware/Mercury/PI_Mercury_GCS_DLL.py +857 -0
  51. PYME/Acquire/Hardware/Mercury/__init__.py +22 -0
  52. PYME/Acquire/Hardware/Mercury/mercuryStepper.py +203 -0
  53. PYME/Acquire/Hardware/Mercury/mercuryStepperGCS.py +281 -0
  54. PYME/Acquire/Hardware/NikonTE2000.py +68 -0
  55. PYME/Acquire/Hardware/NikonTi.py +214 -0
  56. PYME/Acquire/Hardware/NikonTiGUI.py +81 -0
  57. PYME/Acquire/Hardware/OrielCornerstone.py +125 -0
  58. PYME/Acquire/Hardware/PM100USB.py +51 -0
  59. PYME/Acquire/Hardware/Piezos/__init__.py +22 -0
  60. PYME/Acquire/Hardware/Piezos/base_piezo.py +108 -0
  61. PYME/Acquire/Hardware/Piezos/offsetPiezo.py +162 -0
  62. PYME/Acquire/Hardware/Piezos/offsetPiezoREST.py +308 -0
  63. PYME/Acquire/Hardware/Piezos/piezo_c867.py +486 -0
  64. PYME/Acquire/Hardware/Piezos/piezo_e255.py +68 -0
  65. PYME/Acquire/Hardware/Piezos/piezo_e662.py +61 -0
  66. PYME/Acquire/Hardware/Piezos/piezo_e709.py +434 -0
  67. PYME/Acquire/Hardware/Piezos/piezo_e816.py +452 -0
  68. PYME/Acquire/Hardware/Piezos/piezo_e816_corr.py +70 -0
  69. PYME/Acquire/Hardware/Piezos/piezo_e816_dll.py +518 -0
  70. PYME/Acquire/Hardware/Piezos/piezo_e816b.py +70 -0
  71. PYME/Acquire/Hardware/Piezos/piezo_pipython_gcs.py +560 -0
  72. PYME/Acquire/Hardware/Piezos/piezo_test.py +55 -0
  73. PYME/Acquire/Hardware/Simulator/EmpiricalHist.py +273 -0
  74. PYME/Acquire/Hardware/Simulator/__init__.py +22 -0
  75. PYME/Acquire/Hardware/Simulator/dSimControl.py +961 -0
  76. PYME/Acquire/Hardware/Simulator/fakeCam.py +651 -0
  77. PYME/Acquire/Hardware/Simulator/fakePiezo.py +95 -0
  78. PYME/Acquire/Hardware/Simulator/fluor.py +336 -0
  79. PYME/Acquire/Hardware/Simulator/illuminate.cp39-win_amd64.dll.a +0 -0
  80. PYME/Acquire/Hardware/Simulator/illuminate.cp39-win_amd64.pyd +0 -0
  81. PYME/Acquire/Hardware/Simulator/illuminate.pyx +93 -0
  82. PYME/Acquire/Hardware/Simulator/lasersliders.py +90 -0
  83. PYME/Acquire/Hardware/Simulator/rend_im.py +446 -0
  84. PYME/Acquire/Hardware/Simulator/setup.py +69 -0
  85. PYME/Acquire/Hardware/Simulator/simcontrol.py +348 -0
  86. PYME/Acquire/Hardware/Simulator/simui_wx.py +794 -0
  87. PYME/Acquire/Hardware/Tango/__init__.py +0 -0
  88. PYME/Acquire/Hardware/Tango/marzhauser_tango.py +583 -0
  89. PYME/Acquire/Hardware/TiLightCrafter.py +388 -0
  90. PYME/Acquire/Hardware/__init__.py +22 -0
  91. PYME/Acquire/Hardware/aotf.py +271 -0
  92. PYME/Acquire/Hardware/arclampshutterpanel.py +71 -0
  93. PYME/Acquire/Hardware/cameraSoftwareBuffer.py +215 -0
  94. PYME/Acquire/Hardware/camera_noise.py +270 -0
  95. PYME/Acquire/Hardware/ccdAdjPanel.py +188 -0
  96. PYME/Acquire/Hardware/ccdCalibrator.py +161 -0
  97. PYME/Acquire/Hardware/cobaltLaser.py +108 -0
  98. PYME/Acquire/Hardware/cobaltLaser561.py +94 -0
  99. PYME/Acquire/Hardware/comports.py +26 -0
  100. PYME/Acquire/Hardware/driftTrackGUI.py +488 -0
  101. PYME/Acquire/Hardware/driftTracking.py +595 -0
  102. PYME/Acquire/Hardware/fakeShutters.py +52 -0
  103. PYME/Acquire/Hardware/focusKeys.py +204 -0
  104. PYME/Acquire/Hardware/focus_locks/__init__.py +0 -0
  105. PYME/Acquire/Hardware/focus_locks/reflection_focus_lock.py +684 -0
  106. PYME/Acquire/Hardware/frZStage.py +117 -0
  107. PYME/Acquire/Hardware/fw102.py +38 -0
  108. PYME/Acquire/Hardware/ids_peak_cam.py +561 -0
  109. PYME/Acquire/Hardware/ioslave.py +305 -0
  110. PYME/Acquire/Hardware/lasers.py +292 -0
  111. PYME/Acquire/Hardware/matchboxLaser.py +58 -0
  112. PYME/Acquire/Hardware/microscope_adapter.py +104 -0
  113. PYME/Acquire/Hardware/mpd_picosecond_delayer.py +395 -0
  114. PYME/Acquire/Hardware/multiview.py +287 -0
  115. PYME/Acquire/Hardware/olympusix81.py +59 -0
  116. PYME/Acquire/Hardware/pco/__init__.py +0 -0
  117. PYME/Acquire/Hardware/pco/pco_cam.py +348 -0
  118. PYME/Acquire/Hardware/pco/pco_edge_42_lt.py +34 -0
  119. PYME/Acquire/Hardware/pco/pco_sdk.py +1645 -0
  120. PYME/Acquire/Hardware/pco/pco_sdk_cam.py +518 -0
  121. PYME/Acquire/Hardware/pco/pco_sdk_cam_control_panel.py +54 -0
  122. PYME/Acquire/Hardware/phoxxLaser.py +199 -0
  123. PYME/Acquire/Hardware/phoxxLaserOLD.py +242 -0
  124. PYME/Acquire/Hardware/priorLumen.py +102 -0
  125. PYME/Acquire/Hardware/priorarclampshutter.py +52 -0
  126. PYME/Acquire/Hardware/setup.py +50 -0
  127. PYME/Acquire/Hardware/spacenav.py +148 -0
  128. PYME/Acquire/Hardware/splitter.py +394 -0
  129. PYME/Acquire/Hardware/thorlabsPiezo.py +98 -0
  130. PYME/Acquire/Hardware/thorlabs_cam.py +136 -0
  131. PYME/Acquire/Hardware/thorlabs_mff_flipper.py +400 -0
  132. PYME/Acquire/Hardware/toptica_ibeam.py +51 -0
  133. PYME/Acquire/Hardware/uc480/AndorControlFrame.py +308 -0
  134. PYME/Acquire/Hardware/uc480/__init__.py +27 -0
  135. PYME/Acquire/Hardware/uc480/uCam480.py +695 -0
  136. PYME/Acquire/Hardware/uc480/uc480.py +189 -0
  137. PYME/Acquire/Hardware/uc480/uc480Deprecated.py +87 -0
  138. PYME/Acquire/Hardware/uc480/uc480_h.py +767 -0
  139. PYME/Acquire/Hardware/uc480/uc480_h_gen.py +62 -0
  140. PYME/Acquire/Hardware/uc480/ucCamControlFrame.py +83 -0
  141. PYME/Acquire/Hardware/ueye.py +702 -0
  142. PYME/Acquire/PYMEAcquire.py +186 -0
  143. PYME/Acquire/Protocols/DMDMFM.py +74 -0
  144. PYME/Acquire/Protocols/__init__.py +22 -0
  145. PYME/Acquire/Protocols/darkCalibrate.py +56 -0
  146. PYME/Acquire/Protocols/dual671_470.py +45 -0
  147. PYME/Acquire/Protocols/dual671_488.py +46 -0
  148. PYME/Acquire/Protocols/gainCal.py +53 -0
  149. PYME/Acquire/Protocols/htsms-cal-psf.py +32 -0
  150. PYME/Acquire/Protocols/htsms-cal-registration.py +52 -0
  151. PYME/Acquire/Protocols/htsms-flow.py +29 -0
  152. PYME/Acquire/Protocols/htsms-staggered.py +31 -0
  153. PYME/Acquire/Protocols/htsms-tile.py +68 -0
  154. PYME/Acquire/Protocols/htsms-two-color.py +29 -0
  155. PYME/Acquire/Protocols/htsms-widefield.py +32 -0
  156. PYME/Acquire/Protocols/paint671.py +61 -0
  157. PYME/Acquire/Protocols/photoconversion.py +52 -0
  158. PYME/Acquire/Protocols/photoconversion2.py +55 -0
  159. PYME/Acquire/Protocols/prebleach488.py +70 -0
  160. PYME/Acquire/Protocols/prebleach490.py +69 -0
  161. PYME/Acquire/Protocols/prebleach561.py +72 -0
  162. PYME/Acquire/Protocols/prebleach561NeomEos2.py +70 -0
  163. PYME/Acquire/Protocols/prebleach561NeomEos2ND1.py +70 -0
  164. PYME/Acquire/Protocols/prebleach642.py +70 -0
  165. PYME/Acquire/Protocols/prebleach671.py +69 -0
  166. PYME/Acquire/Protocols/prebleach671ND1.py +58 -0
  167. PYME/Acquire/Protocols/prebleach671ND2.py +57 -0
  168. PYME/Acquire/Protocols/prebleach671Neo.py +69 -0
  169. PYME/Acquire/Protocols/recover671.py +62 -0
  170. PYME/Acquire/Protocols/sequence642_488.py +85 -0
  171. PYME/Acquire/Protocols/sequence642_561.py +87 -0
  172. PYME/Acquire/Protocols/shiftfield.py +198 -0
  173. PYME/Acquire/Protocols/simul488.py +59 -0
  174. PYME/Acquire/Protocols/simul642.py +63 -0
  175. PYME/Acquire/Protocols/simul642HTSMS.py +63 -0
  176. PYME/Acquire/Protocols/simulPA.py +37 -0
  177. PYME/Acquire/Protocols/simulSIM.py +76 -0
  178. PYME/Acquire/Protocols/simulStep.py +62 -0
  179. PYME/Acquire/Protocols/spdscan.py +178 -0
  180. PYME/Acquire/Protocols/standard470.py +45 -0
  181. PYME/Acquire/Protocols/standard488.py +47 -0
  182. PYME/Acquire/Protocols/standard671.py +48 -0
  183. PYME/Acquire/Protocols/standard671_no532.py +47 -0
  184. PYME/Acquire/Protocols/standardArclamp.py +46 -0
  185. PYME/Acquire/Protocols/strip_tile.py +204 -0
  186. PYME/Acquire/Protocols/tile.py +204 -0
  187. PYME/Acquire/Protocols/tile3D.py +192 -0
  188. PYME/Acquire/Protocols/tile671.py +190 -0
  189. PYME/Acquire/Protocols/tile_triggered.py +189 -0
  190. PYME/Acquire/Scripts/init.py +232 -0
  191. PYME/Acquire/Scripts/init_N1_Ti_Exeter_ZIx.py +374 -0
  192. PYME/Acquire/Scripts/init_N2_Ti_Zyla_lasers.py +290 -0
  193. PYME/Acquire/Scripts/init_Neo.py +266 -0
  194. PYME/Acquire/Scripts/init_NeoSim.py +159 -0
  195. PYME/Acquire/Scripts/init_TIRF.py +232 -0
  196. PYME/Acquire/Scripts/init_TIRF_Neo.py +242 -0
  197. PYME/Acquire/Scripts/init_TIRF_NeoO.py +241 -0
  198. PYME/Acquire/Scripts/init_TIRF_onecam.py +233 -0
  199. PYME/Acquire/Scripts/init_Ti.py +257 -0
  200. PYME/Acquire/Scripts/init_UOA_n.py +256 -0
  201. PYME/Acquire/Scripts/init_UOA_n2.py +246 -0
  202. PYME/Acquire/Scripts/init_Y1.py +249 -0
  203. PYME/Acquire/Scripts/init_Zyla.py +260 -0
  204. PYME/Acquire/Scripts/init_drift_tracking.py +80 -0
  205. PYME/Acquire/Scripts/init_emccd_basic.py +277 -0
  206. PYME/Acquire/Scripts/init_htsms.py +277 -0
  207. PYME/Acquire/Scripts/init_htsms_focus_lock.py +132 -0
  208. PYME/Acquire/Scripts/init_micrpi.py +45 -0
  209. PYME/Acquire/Scripts/init_orca.py +70 -0
  210. PYME/Acquire/Scripts/init_pco.py +49 -0
  211. PYME/Acquire/Scripts/init_rev.py +74 -0
  212. PYME/Acquire/Scripts/init_sim100.py +169 -0
  213. PYME/Acquire/Scripts/init_sim103.py +169 -0
  214. PYME/Acquire/Scripts/init_sim2.py +211 -0
  215. PYME/Acquire/Scripts/init_sim50.py +169 -0
  216. PYME/Acquire/Scripts/init_sim75.py +169 -0
  217. PYME/Acquire/Scripts/init_sim_drift_tracking.py +166 -0
  218. PYME/Acquire/Scripts/init_sim_htsms.py +224 -0
  219. PYME/Acquire/Scripts/init_sim_htsms_n.py +233 -0
  220. PYME/Acquire/Scripts/init_sim_main.py +229 -0
  221. PYME/Acquire/Scripts/init_sim_min.py +197 -0
  222. PYME/Acquire/Scripts/init_sim_rem.py +176 -0
  223. PYME/Acquire/Scripts/init_smi1.py +110 -0
  224. PYME/Acquire/Scripts/init_spectro.py +78 -0
  225. PYME/Acquire/Scripts/init_spim.py +116 -0
  226. PYME/Acquire/Scripts/init_thorcam.py +62 -0
  227. PYME/Acquire/Scripts/init_twophoton.py +112 -0
  228. PYME/Acquire/Scripts/init_uc480.py +262 -0
  229. PYME/Acquire/Scripts/init_ueye.py +261 -0
  230. PYME/Acquire/SpoolController.py +958 -0
  231. PYME/Acquire/Utils/MultiPointScanner.py +80 -0
  232. PYME/Acquire/Utils/__init__.py +13 -0
  233. PYME/Acquire/Utils/failsafe.py +157 -0
  234. PYME/Acquire/Utils/fastTiler.py +153 -0
  235. PYME/Acquire/Utils/pointScanner.py +496 -0
  236. PYME/Acquire/Utils/sarcSpacing.py +86 -0
  237. PYME/Acquire/Utils/strip_tiler.py +93 -0
  238. PYME/Acquire/Utils/tiler.py +464 -0
  239. PYME/Acquire/Utils/vibrationAnalysis.py +65 -0
  240. PYME/Acquire/__init__.py +44 -0
  241. PYME/Acquire/acquire_client.py +90 -0
  242. PYME/Acquire/acquire_server.py +316 -0
  243. PYME/Acquire/acquirebase.py +139 -0
  244. PYME/Acquire/acquiremainframe.py +716 -0
  245. PYME/Acquire/acquirewx.py +61 -0
  246. PYME/Acquire/acquisition_base.py +148 -0
  247. PYME/Acquire/actions.py +209 -0
  248. PYME/Acquire/autofocus.py +54 -0
  249. PYME/Acquire/eventLog.py +95 -0
  250. PYME/Acquire/event_loop.py +119 -0
  251. PYME/Acquire/frameWrangler.py +530 -0
  252. PYME/Acquire/htsms/__init__.py +8 -0
  253. PYME/Acquire/htsms/rule_ui.py +970 -0
  254. PYME/Acquire/htsms/rule_ui_v2.py +573 -0
  255. PYME/Acquire/htsms/tweeter.py +222 -0
  256. PYME/Acquire/microscope.py +1050 -0
  257. PYME/Acquire/positionTracker.py +181 -0
  258. PYME/Acquire/protocol.py +299 -0
  259. PYME/Acquire/protocol_acquisition.py +404 -0
  260. PYME/Acquire/sampleInformation.py +591 -0
  261. PYME/Acquire/sampleInformationDjangoDirect.py +446 -0
  262. PYME/Acquire/setup.py +52 -0
  263. PYME/Acquire/stackSettings.py +295 -0
  264. PYME/Acquire/stage_leveling.py +285 -0
  265. PYME/Acquire/ui/AnalysisSettingsUI.py +184 -0
  266. PYME/Acquire/ui/HDFSpoolFrame.py +584 -0
  267. PYME/Acquire/ui/__init__.py +0 -0
  268. PYME/Acquire/ui/actionUI.py +892 -0
  269. PYME/Acquire/ui/focus_lock_gui.py +149 -0
  270. PYME/Acquire/ui/intensity_trace.py +143 -0
  271. PYME/Acquire/ui/intsliders.py +222 -0
  272. PYME/Acquire/ui/lasersliders.py +329 -0
  273. PYME/Acquire/ui/mpd_picosecond_delay_panel.py +69 -0
  274. PYME/Acquire/ui/multiview_select.py +77 -0
  275. PYME/Acquire/ui/positionUI.py +519 -0
  276. PYME/Acquire/ui/preflight.py +58 -0
  277. PYME/Acquire/ui/scanner_panel.py +41 -0
  278. PYME/Acquire/ui/selectCameraPanel.py +46 -0
  279. PYME/Acquire/ui/seqdialog.py +501 -0
  280. PYME/Acquire/ui/splashScreen.py +175 -0
  281. PYME/Acquire/ui/spool_panel.py +830 -0
  282. PYME/Acquire/ui/tile_panel.py +556 -0
  283. PYME/Acquire/ui/tilesettingsui.py +91 -0
  284. PYME/Acquire/ui/voxelSizeDialog.py +149 -0
  285. PYME/Acquire/webui/__init__.py +36 -0
  286. PYME/Acquire/webui/ipy.py +361 -0
  287. PYME/Acquire/webui/static/css/pyme-bootstrap.css +9908 -0
  288. PYME/Acquire/webui/static/css/pymeacquire.css +85 -0
  289. PYME/Acquire/webui/static/js/pymeacquire.js +375 -0
  290. PYME/Acquire/webui/static/js/pzf.js +95 -0
  291. PYME/Acquire/webui/templates/PYMEAcquire.html +232 -0
  292. PYME/Acquire/webui/templates/login.html +84 -0
  293. PYME/Acquire/webui/templates/xtermpage.html +106 -0
  294. PYME/Acquire/xyztc.py +418 -0
  295. PYME/Acquire/zScanner.py +287 -0
  296. PYME/Analysis/BleachProfile/__init__.py +26 -0
  297. PYME/Analysis/BleachProfile/deMod.py +91 -0
  298. PYME/Analysis/BleachProfile/fitRecover.py +90 -0
  299. PYME/Analysis/BleachProfile/intensProf.py +519 -0
  300. PYME/Analysis/BleachProfile/kinModels.py +507 -0
  301. PYME/Analysis/BleachProfile/rawIntensity.py +227 -0
  302. PYME/Analysis/BleachProfile/rollins.py +555 -0
  303. PYME/Analysis/Colocalisation/__init__.py +27 -0
  304. PYME/Analysis/Colocalisation/colocScaleDep.py +126 -0
  305. PYME/Analysis/Colocalisation/correlationCoeffs.py +198 -0
  306. PYME/Analysis/Colocalisation/distColoc.py +110 -0
  307. PYME/Analysis/Colocalisation/edtColoc.py +191 -0
  308. PYME/Analysis/MetaData.py +278 -0
  309. PYME/Analysis/PSFEst/__init__.py +27 -0
  310. PYME/Analysis/PSFEst/dec.py +283 -0
  311. PYME/Analysis/PSFEst/extractImages.py +316 -0
  312. PYME/Analysis/PSFEst/fit_psf_zernikes.py +194 -0
  313. PYME/Analysis/PSFEst/psfQuality.py +225 -0
  314. PYME/Analysis/PSFGen/__init__.py +40 -0
  315. PYME/Analysis/PSFGen/fourier.py +138 -0
  316. PYME/Analysis/PSFGen/fourierHNA.py +1108 -0
  317. PYME/Analysis/PSFGen/fourierHNA2.py +979 -0
  318. PYME/Analysis/PSFGen/genCRBcurves.py +185 -0
  319. PYME/Analysis/PSFGen/nijboer_zernike.py +79 -0
  320. PYME/Analysis/PSFGen/ps_app.cp39-win_amd64.dll.a +0 -0
  321. PYME/Analysis/PSFGen/ps_app.cp39-win_amd64.pyd +0 -0
  322. PYME/Analysis/PSFGen/test_ps_app.py +24 -0
  323. PYME/Analysis/Tracking/__init__.py +3 -0
  324. PYME/Analysis/Tracking/msd.py +57 -0
  325. PYME/Analysis/Tracking/trackUtils.py +528 -0
  326. PYME/Analysis/Tracking/tracking.py +152 -0
  327. PYME/Analysis/__init__.py +30 -0
  328. PYME/Analysis/_fithelpers.py +161 -0
  329. PYME/Analysis/angleFilter.py +287 -0
  330. PYME/Analysis/annealThresh.py +157 -0
  331. PYME/Analysis/autoencoder_classifier.py +45 -0
  332. PYME/Analysis/binAvg.py +144 -0
  333. PYME/Analysis/composite.py +183 -0
  334. PYME/Analysis/cramerRao.py +259 -0
  335. PYME/Analysis/deTile.py +441 -0
  336. PYME/Analysis/density_filter.py +45 -0
  337. PYME/Analysis/distributed_pyramid.py +426 -0
  338. PYME/Analysis/fiducial_matching.py +220 -0
  339. PYME/Analysis/gen_sCMOS_maps.py +355 -0
  340. PYME/Analysis/graphing_filters.py +311 -0
  341. PYME/Analysis/implicitFilter.py +359 -0
  342. PYME/Analysis/keep_pairs.py +69 -0
  343. PYME/Analysis/optic_flow.py +108 -0
  344. PYME/Analysis/piecewise.py +36 -0
  345. PYME/Analysis/piecewiseMapping.py +304 -0
  346. PYME/Analysis/piezo_movement_correction.py +153 -0
  347. PYME/Analysis/points/DeClump/__init__.py +78 -0
  348. PYME/Analysis/points/DeClump/deClump.cp39-win_amd64.dll.a +0 -0
  349. PYME/Analysis/points/DeClump/deClump.cp39-win_amd64.pyd +0 -0
  350. PYME/Analysis/points/DeClump/deClumpGUI.py +87 -0
  351. PYME/Analysis/points/DeClump/pyDeClump.py +284 -0
  352. PYME/Analysis/points/DeClump/testClump.py +40 -0
  353. PYME/Analysis/points/DistHist/__init__.py +25 -0
  354. PYME/Analysis/points/DistHist/distHist.cp39-win_amd64.dll.a +0 -0
  355. PYME/Analysis/points/DistHist/distHist.cp39-win_amd64.pyd +0 -0
  356. PYME/Analysis/points/DistHist/distHistThreaded.py +71 -0
  357. PYME/Analysis/points/DistHist/setup.py +54 -0
  358. PYME/Analysis/points/EdgeDB/__init__.py +24 -0
  359. PYME/Analysis/points/EdgeDB/edgeDB.cp39-win_amd64.dll.a +0 -0
  360. PYME/Analysis/points/EdgeDB/edgeDB.cp39-win_amd64.pyd +0 -0
  361. PYME/Analysis/points/EdgeDB/edgeTest.py +66 -0
  362. PYME/Analysis/points/EdgeDB/edges.py +102 -0
  363. PYME/Analysis/points/EdgeDB/segment.py +75 -0
  364. PYME/Analysis/points/EdgeDB/setup.py +54 -0
  365. PYME/Analysis/points/QuadTree/QTrend.py +232 -0
  366. PYME/Analysis/points/QuadTree/__init__.py +25 -0
  367. PYME/Analysis/points/QuadTree/pointQT.py +227 -0
  368. PYME/Analysis/points/QuadTree/pointQTF.py +254 -0
  369. PYME/Analysis/points/QuadTree/qtUtils.py +36 -0
  370. PYME/Analysis/points/QuadTree/rendQT.py +118 -0
  371. PYME/Analysis/points/SoftRend/__init__.py +24 -0
  372. PYME/Analysis/points/SoftRend/setup.py +61 -0
  373. PYME/Analysis/points/SoftRend/testTetrahedra.py +41 -0
  374. PYME/Analysis/points/SoftRend/triRend.cp39-win_amd64.dll.a +0 -0
  375. PYME/Analysis/points/SoftRend/triRend.cp39-win_amd64.pyd +0 -0
  376. PYME/Analysis/points/__init__.py +3 -0
  377. PYME/Analysis/points/arcfit/__init__.py +1 -0
  378. PYME/Analysis/points/arcfit/arcmf.cp39-win_amd64.dll.a +0 -0
  379. PYME/Analysis/points/arcfit/arcmf.cp39-win_amd64.pyd +0 -0
  380. PYME/Analysis/points/arcfit/setup.py +51 -0
  381. PYME/Analysis/points/astigmatism/__init__.py +0 -0
  382. PYME/Analysis/points/astigmatism/astigTools.py +338 -0
  383. PYME/Analysis/points/astigmatism/astiglookup.cp39-win_amd64.dll.a +0 -0
  384. PYME/Analysis/points/astigmatism/astiglookup.cp39-win_amd64.pyd +0 -0
  385. PYME/Analysis/points/astigmatism/setup.py +54 -0
  386. PYME/Analysis/points/cluster_morphology.py +199 -0
  387. PYME/Analysis/points/coordinate_tools.py +278 -0
  388. PYME/Analysis/points/features/__init__.py +0 -0
  389. PYME/Analysis/points/features/metal.py +46 -0
  390. PYME/Analysis/points/features/shaders/vect_feat_3d.metal +49 -0
  391. PYME/Analysis/points/fiducials.py +142 -0
  392. PYME/Analysis/points/gen3DTriangs.py +796 -0
  393. PYME/Analysis/points/moments.py +143 -0
  394. PYME/Analysis/points/multiview.py +458 -0
  395. PYME/Analysis/points/objectMeasure.py +206 -0
  396. PYME/Analysis/points/qpaint.py +97 -0
  397. PYME/Analysis/points/rings.py +372 -0
  398. PYME/Analysis/points/ripleys.py +427 -0
  399. PYME/Analysis/points/segmentLL.py +134 -0
  400. PYME/Analysis/points/setup.py +56 -0
  401. PYME/Analysis/points/spherical_harmonics.py +909 -0
  402. PYME/Analysis/points/surfit.py +829 -0
  403. PYME/Analysis/points/tCluster.py +75 -0
  404. PYME/Analysis/points/traveling_salesperson/__init__.py +0 -0
  405. PYME/Analysis/points/traveling_salesperson/queue_opt.py +117 -0
  406. PYME/Analysis/points/traveling_salesperson/sectioned_two_opt.py +327 -0
  407. PYME/Analysis/points/traveling_salesperson/setup.py +40 -0
  408. PYME/Analysis/points/traveling_salesperson/sort.py +78 -0
  409. PYME/Analysis/points/traveling_salesperson/two_opt.py +189 -0
  410. PYME/Analysis/points/traveling_salesperson/two_opt_utils.cp39-win_amd64.dll.a +0 -0
  411. PYME/Analysis/points/traveling_salesperson/two_opt_utils.cp39-win_amd64.pyd +0 -0
  412. PYME/Analysis/points/traveling_salesperson/two_opt_utils.pyx +41 -0
  413. PYME/Analysis/points/twoColour.py +572 -0
  414. PYME/Analysis/points/twoColourPlot.py +107 -0
  415. PYME/Analysis/processLogger.py +129 -0
  416. PYME/Analysis/profile_extraction.py +72 -0
  417. PYME/Analysis/setup.py +60 -0
  418. PYME/Analysis/splitting.py +372 -0
  419. PYME/Analysis/svmSegment.py +214 -0
  420. PYME/Analysis/thresholding.py +192 -0
  421. PYME/Analysis/tile_pyramid.py +938 -0
  422. PYME/Analysis/widefieldify.py +54 -0
  423. PYME/DSView/DisplayOptionsPanel.py +503 -0
  424. PYME/DSView/LUT/__init__.py +33 -0
  425. PYME/DSView/LUT/lut.cp39-win_amd64.dll.a +0 -0
  426. PYME/DSView/LUT/lut.cp39-win_amd64.pyd +0 -0
  427. PYME/DSView/LUT/setup.py +54 -0
  428. PYME/DSView/OpenSequenceDialog.py +83 -0
  429. PYME/DSView/OverlaysPanel.py +111 -0
  430. PYME/DSView/__init__.py +32 -0
  431. PYME/DSView/arrayViewPanel.py +1035 -0
  432. PYME/DSView/displayOptions.py +453 -0
  433. PYME/DSView/displaySettingsPanel.py +271 -0
  434. PYME/DSView/dsviewer.py +542 -0
  435. PYME/DSView/eventLogViewer.py +805 -0
  436. PYME/DSView/fitInfo.py +486 -0
  437. PYME/DSView/htmlServe.py +72 -0
  438. PYME/DSView/logparser.py +100 -0
  439. PYME/DSView/modules/LMAnalysis.py +1053 -0
  440. PYME/DSView/modules/LMDisplay.py +194 -0
  441. PYME/DSView/modules/__init__.py +162 -0
  442. PYME/DSView/modules/_base.py +39 -0
  443. PYME/DSView/modules/annotation.py +725 -0
  444. PYME/DSView/modules/arrayView.py +71 -0
  445. PYME/DSView/modules/blobFinding.py +455 -0
  446. PYME/DSView/modules/blobMeasure.py +1093 -0
  447. PYME/DSView/modules/camera_maps.py +38 -0
  448. PYME/DSView/modules/coloc.py +414 -0
  449. PYME/DSView/modules/composite.py +715 -0
  450. PYME/DSView/modules/convnet.py +24 -0
  451. PYME/DSView/modules/cropping.py +133 -0
  452. PYME/DSView/modules/dark_and_flatfield.py +31 -0
  453. PYME/DSView/modules/deconvolution.py +499 -0
  454. PYME/DSView/modules/eventView.py +80 -0
  455. PYME/DSView/modules/extractBlobs.py +46 -0
  456. PYME/DSView/modules/fastGraphPanel.py +85 -0
  457. PYME/DSView/modules/filtering.py +335 -0
  458. PYME/DSView/modules/flowView.py +268 -0
  459. PYME/DSView/modules/fourierRingCorrelation.py +172 -0
  460. PYME/DSView/modules/gl_image_view.py +12 -0
  461. PYME/DSView/modules/graphViewPanel.py +272 -0
  462. PYME/DSView/modules/measure/__init__.py +1 -0
  463. PYME/DSView/modules/measure/filterPan.py +239 -0
  464. PYME/DSView/modules/metadataView.py +28 -0
  465. PYME/DSView/modules/multithreshold.py +98 -0
  466. PYME/DSView/modules/neuroglancer.py +129 -0
  467. PYME/DSView/modules/object_tagging.py +157 -0
  468. PYME/DSView/modules/particleTracking.py +463 -0
  469. PYME/DSView/modules/playback.py +256 -0
  470. PYME/DSView/modules/prebleachExtraction.py +75 -0
  471. PYME/DSView/modules/profileFitting.py +137 -0
  472. PYME/DSView/modules/profilePlotting.py +408 -0
  473. PYME/DSView/modules/projections.py +48 -0
  474. PYME/DSView/modules/psfExtraction.py +570 -0
  475. PYME/DSView/modules/psfGeneration.py +138 -0
  476. PYME/DSView/modules/psfTools.py +661 -0
  477. PYME/DSView/modules/pupilTools.py +204 -0
  478. PYME/DSView/modules/pupilView.py +139 -0
  479. PYME/DSView/modules/recipes.py +266 -0
  480. PYME/DSView/modules/redimension.py +75 -0
  481. PYME/DSView/modules/segmentation.py +192 -0
  482. PYME/DSView/modules/sheetView.py +24 -0
  483. PYME/DSView/modules/shell.py +39 -0
  484. PYME/DSView/modules/shiftfield_estimation.py +433 -0
  485. PYME/DSView/modules/sparkprepare.py +94 -0
  486. PYME/DSView/modules/splitter.py +148 -0
  487. PYME/DSView/modules/synchronise.py +64 -0
  488. PYME/DSView/modules/templates/astigCal.html +42 -0
  489. PYME/DSView/modules/templates/measureView.html +69 -0
  490. PYME/DSView/modules/templates/measureView2.html +48 -0
  491. PYME/DSView/modules/templates/measureView3.html +98 -0
  492. PYME/DSView/modules/templates/trackView.html +139 -0
  493. PYME/DSView/modules/templates/tracksOverview.html +21 -0
  494. PYME/DSView/modules/tiling.py +147 -0
  495. PYME/DSView/modules/unmixing.py +148 -0
  496. PYME/DSView/modules/vis3D.py +320 -0
  497. PYME/DSView/modules/visgui.py +163 -0
  498. PYME/DSView/modules/webview.py +14 -0
  499. PYME/DSView/overlays.py +295 -0
  500. PYME/DSView/scrolledImagePanel.py +188 -0
  501. PYME/DSView/setup.py +53 -0
  502. PYME/DSView/splashScreen.py +158 -0
  503. PYME/DSView/voxSizeDialog.py +84 -0
  504. PYME/Deconv/__init__.py +35 -0
  505. PYME/Deconv/beadGen.py +55 -0
  506. PYME/Deconv/dec.py +659 -0
  507. PYME/Deconv/decTask.py +65 -0
  508. PYME/Deconv/decThread.py +113 -0
  509. PYME/Deconv/dec_test.py +47 -0
  510. PYME/Deconv/deconvDialogs.py +417 -0
  511. PYME/Deconv/fftwWisdom.py +62 -0
  512. PYME/Deconv/richardsonLucy.py +141 -0
  513. PYME/Deconv/richardsonLucyMV.py +151 -0
  514. PYME/Deconv/richardsonLucyMVM.py +218 -0
  515. PYME/Deconv/test_block_dec.py +46 -0
  516. PYME/Deconv/tq_block_dec.py +331 -0
  517. PYME/Deconv/wiener.py +163 -0
  518. PYME/IO/DataSources/AlignDataSource.py +91 -0
  519. PYME/IO/DataSources/ArrayDataSource.py +260 -0
  520. PYME/IO/DataSources/BGSDataSource.py +353 -0
  521. PYME/IO/DataSources/BaseDataSource.py +457 -0
  522. PYME/IO/DataSources/BioformatsDataSource.py +178 -0
  523. PYME/IO/DataSources/BufferedDataSource.py +99 -0
  524. PYME/IO/DataSources/ClusterPZFDataSource.py +124 -0
  525. PYME/IO/DataSources/ConcatenatedDataSource.py +56 -0
  526. PYME/IO/DataSources/CropDataSource.py +243 -0
  527. PYME/IO/DataSources/DcimgDataSource.py +54 -0
  528. PYME/IO/DataSources/ElectronsPerSecondDataSource.py +61 -0
  529. PYME/IO/DataSources/FlatFieldDataSource.py +77 -0
  530. PYME/IO/DataSources/HDFDataSource.py +160 -0
  531. PYME/IO/DataSources/HTTPDataSource.py +80 -0
  532. PYME/IO/DataSources/ImageSeriesDataSource.py +123 -0
  533. PYME/IO/DataSources/MultiviewDataSource.py +99 -0
  534. PYME/IO/DataSources/OBFDataSource.py +67 -0
  535. PYME/IO/DataSources/RandomDataSource.py +23 -0
  536. PYME/IO/DataSources/SupertileDatasource.py +148 -0
  537. PYME/IO/DataSources/TQDataSource.py +41 -0
  538. PYME/IO/DataSources/TiffDataSource.py +193 -0
  539. PYME/IO/DataSources/TileDataSource.py +91 -0
  540. PYME/IO/DataSources/UnsplitDataSource.py +92 -0
  541. PYME/IO/DataSources/__init__.py +59 -0
  542. PYME/IO/FileUtils/IJLut.py +43 -0
  543. PYME/IO/FileUtils/RawToHdf5.py +105 -0
  544. PYME/IO/FileUtils/SPAD.py +54 -0
  545. PYME/IO/FileUtils/TiffSeqToHdf5.py +87 -0
  546. PYME/IO/FileUtils/__init__.py +24 -0
  547. PYME/IO/FileUtils/compHdf.py +39 -0
  548. PYME/IO/FileUtils/fileID.py +246 -0
  549. PYME/IO/FileUtils/fnlGen.py +40 -0
  550. PYME/IO/FileUtils/freeSpace.py +59 -0
  551. PYME/IO/FileUtils/h5-thumbnailer.py +85 -0
  552. PYME/IO/FileUtils/h5ExFrames.py +98 -0
  553. PYME/IO/FileUtils/h5ToTiffSeries.py +50 -0
  554. PYME/IO/FileUtils/h5r-thumbnailer.py +118 -0
  555. PYME/IO/FileUtils/h5rFormatDef.py +99 -0
  556. PYME/IO/FileUtils/h5rToTxt.py +77 -0
  557. PYME/IO/FileUtils/nameUtils.py +300 -0
  558. PYME/IO/FileUtils/obf_support.py +538 -0
  559. PYME/IO/FileUtils/ply.py +147 -0
  560. PYME/IO/FileUtils/readSpeckle.py +78 -0
  561. PYME/IO/FileUtils/readTiff.py +64 -0
  562. PYME/IO/FileUtils/saveTiffStack.py +137 -0
  563. PYME/IO/FileUtils/setup.py +36 -0
  564. PYME/IO/FileUtils/sf-thumbnailer.py +76 -0
  565. PYME/IO/FileUtils/stl.py +44 -0
  566. PYME/IO/FileUtils/thumbnailDatabase.py +104 -0
  567. PYME/IO/HTTPSpooler_v2.py +141 -0
  568. PYME/IO/MetaDataHandler.py +1072 -0
  569. PYME/IO/PZFFormat.py +375 -0
  570. PYME/IO/Spooler.py +279 -0
  571. PYME/IO/__init__.py +12 -0
  572. PYME/IO/acquisition_backends.py +353 -0
  573. PYME/IO/buffer_helpers.cp39-win_amd64.dll.a +0 -0
  574. PYME/IO/buffer_helpers.cp39-win_amd64.pyd +0 -0
  575. PYME/IO/buffer_helpers.pyx +190 -0
  576. PYME/IO/buffers.py +291 -0
  577. PYME/IO/clusterDuplication.py +204 -0
  578. PYME/IO/clusterExport.py +152 -0
  579. PYME/IO/clusterGlob.py +108 -0
  580. PYME/IO/clusterIO.py +1076 -0
  581. PYME/IO/clusterListing.py +232 -0
  582. PYME/IO/clusterResults.py +206 -0
  583. PYME/IO/clusterUpload.py +49 -0
  584. PYME/IO/cluster_directory.py +419 -0
  585. PYME/IO/cluster_streaming.py +216 -0
  586. PYME/IO/compatibility.py +12 -0
  587. PYME/IO/countdir/__init__.py +5 -0
  588. PYME/IO/countdir/setup.py +58 -0
  589. PYME/IO/csv_flavours.py +251 -0
  590. PYME/IO/dataExporter.py +470 -0
  591. PYME/IO/dataWrap.py +108 -0
  592. PYME/IO/dcimg.py +167 -0
  593. PYME/IO/events.py +161 -0
  594. PYME/IO/h5File.py +148 -0
  595. PYME/IO/h5rFile.py +323 -0
  596. PYME/IO/image.py +1447 -0
  597. PYME/IO/load_psf.py +26 -0
  598. PYME/IO/pyme_h5ls.py +58 -0
  599. PYME/IO/ragged.py +138 -0
  600. PYME/IO/rgb_image.py +94 -0
  601. PYME/IO/tabular.py +1338 -0
  602. PYME/IO/testClusterSpooling.py +199 -0
  603. PYME/IO/unifiedIO.py +301 -0
  604. PYME/LMVis/Extras/QPobjectSegment.py +220 -0
  605. PYME/LMVis/Extras/__init__.py +55 -0
  606. PYME/LMVis/Extras/animation.py +359 -0
  607. PYME/LMVis/Extras/annotation.py +78 -0
  608. PYME/LMVis/Extras/clusterAnalysis.py +460 -0
  609. PYME/LMVis/Extras/dockedPanel.py +69 -0
  610. PYME/LMVis/Extras/extra_layers.py +373 -0
  611. PYME/LMVis/Extras/fiducial.py +230 -0
  612. PYME/LMVis/Extras/flagZMotionArtifacts.py +60 -0
  613. PYME/LMVis/Extras/fusionUtils.py +9 -0
  614. PYME/LMVis/Extras/multiColourAnalysis.py +103 -0
  615. PYME/LMVis/Extras/multiviewMapping.py +489 -0
  616. PYME/LMVis/Extras/objectMeasurements.py +246 -0
  617. PYME/LMVis/Extras/particleTracking.py +272 -0
  618. PYME/LMVis/Extras/perFrameVariable.py +77 -0
  619. PYME/LMVis/Extras/photophysics.py +72 -0
  620. PYME/LMVis/Extras/pointSetGeneration.py +232 -0
  621. PYME/LMVis/Extras/pointwiseColoc.py +54 -0
  622. PYME/LMVis/Extras/saved_views.py +125 -0
  623. PYME/LMVis/Extras/scaleBox.py +115 -0
  624. PYME/LMVis/Extras/sequentialSpecies.py +125 -0
  625. PYME/LMVis/Extras/setBGImage.py +74 -0
  626. PYME/LMVis/Extras/shiftmapGenerator.py +138 -0
  627. PYME/LMVis/Extras/showShortcuts.py +69 -0
  628. PYME/LMVis/Extras/snapshot.py +135 -0
  629. PYME/LMVis/Extras/spherical_harmonics.py +98 -0
  630. PYME/LMVis/Extras/subsets.py +15 -0
  631. PYME/LMVis/Extras/surface_fitting.py +52 -0
  632. PYME/LMVis/Extras/temperaturePlot.py +53 -0
  633. PYME/LMVis/Extras/vibration.py +112 -0
  634. PYME/LMVis/VisGUI.py +506 -0
  635. PYME/LMVis/__init__.py +39 -0
  636. PYME/LMVis/colourFilterGUI.py +77 -0
  637. PYME/LMVis/colourPanel.py +491 -0
  638. PYME/LMVis/displayPane.py +462 -0
  639. PYME/LMVis/dyeRatios.py +116 -0
  640. PYME/LMVis/genImageDialog.py +298 -0
  641. PYME/LMVis/gl_offScreenHandler.py +134 -0
  642. PYME/LMVis/gl_render.py +1302 -0
  643. PYME/LMVis/gl_render3D.py +1453 -0
  644. PYME/LMVis/gl_render3D_shaders.py +1213 -0
  645. PYME/LMVis/glcanvas_core.py +1157 -0
  646. PYME/LMVis/imageView.py +752 -0
  647. PYME/LMVis/imageView2.py +372 -0
  648. PYME/LMVis/importTextDialog.py +342 -0
  649. PYME/LMVis/layer_panel.py +231 -0
  650. PYME/LMVis/layers/AxesOverlayLayer.py +126 -0
  651. PYME/LMVis/layers/LUTOverlayLayer.py +346 -0
  652. PYME/LMVis/layers/OverlayLayer.py +46 -0
  653. PYME/LMVis/layers/ScaleBarOverlayLayer.py +97 -0
  654. PYME/LMVis/layers/ScaleBoxOverlayLayer.py +181 -0
  655. PYME/LMVis/layers/SelectionOverlayLayer.py +124 -0
  656. PYME/LMVis/layers/__init__.py +53 -0
  657. PYME/LMVis/layers/base.py +319 -0
  658. PYME/LMVis/layers/image_layer.py +363 -0
  659. PYME/LMVis/layers/labels.py +186 -0
  660. PYME/LMVis/layers/layer_defaults.py +97 -0
  661. PYME/LMVis/layers/mesh.py +378 -0
  662. PYME/LMVis/layers/octree.py +194 -0
  663. PYME/LMVis/layers/pointcloud.py +372 -0
  664. PYME/LMVis/layers/quiver.py +271 -0
  665. PYME/LMVis/layers/text.py +250 -0
  666. PYME/LMVis/layers/tracks.py +309 -0
  667. PYME/LMVis/mv_math.py +78 -0
  668. PYME/LMVis/objectDarkMeasure.py +120 -0
  669. PYME/LMVis/pipeline.py +1227 -0
  670. PYME/LMVis/pipelineView.py +115 -0
  671. PYME/LMVis/pointSettingsPanel.py +135 -0
  672. PYME/LMVis/progGraph.py +59 -0
  673. PYME/LMVis/quadTreeSettings.py +90 -0
  674. PYME/LMVis/rendGauss.py +158 -0
  675. PYME/LMVis/renderers.py +576 -0
  676. PYME/LMVis/sessionpaths.py +136 -0
  677. PYME/LMVis/setup.py +39 -0
  678. PYME/LMVis/setup_exe.py +71 -0
  679. PYME/LMVis/shader_programs/DefaultShaderProgram.py +149 -0
  680. PYME/LMVis/shader_programs/GLProgram.py +119 -0
  681. PYME/LMVis/shader_programs/GouraudShaderProgram.py +157 -0
  682. PYME/LMVis/shader_programs/PointSpriteShaderProgram.py +163 -0
  683. PYME/LMVis/shader_programs/ShaderProgramFactory.py +54 -0
  684. PYME/LMVis/shader_programs/TesselShaderProgram.py +47 -0
  685. PYME/LMVis/shader_programs/WireFrameShaderProgram.py +50 -0
  686. PYME/LMVis/shader_programs/__init__.py +20 -0
  687. PYME/LMVis/shader_programs/oit_compositor.py +23 -0
  688. PYME/LMVis/shader_programs/shader_loader.py +84 -0
  689. PYME/LMVis/shader_programs/shader_program.py +168 -0
  690. PYME/LMVis/shader_programs/shaders/bigflatpoints_fs.glsl +16 -0
  691. PYME/LMVis/shader_programs/shaders/bigpoints_gs.glsl +40 -0
  692. PYME/LMVis/shader_programs/shaders/bigpointsprites_fs.glsl +20 -0
  693. PYME/LMVis/shader_programs/shaders/bigspheres_fs.glsl +53 -0
  694. PYME/LMVis/shader_programs/shaders/compose_fs.glsl +41 -0
  695. PYME/LMVis/shader_programs/shaders/compose_vs.glsl +25 -0
  696. PYME/LMVis/shader_programs/shaders/default_fs.glsl +27 -0
  697. PYME/LMVis/shader_programs/shaders/default_vs.glsl +88 -0
  698. PYME/LMVis/shader_programs/shaders/flatpoints_fs.glsl +27 -0
  699. PYME/LMVis/shader_programs/shaders/gouraud_flatpoints_fs.glsl +30 -0
  700. PYME/LMVis/shader_programs/shaders/gouraud_fs.glsl +26 -0
  701. PYME/LMVis/shader_programs/shaders/gouraud_oit_fs.glsl +68 -0
  702. PYME/LMVis/shader_programs/shaders/gouraud_vs.glsl +135 -0
  703. PYME/LMVis/shader_programs/shaders/image_fs.glsl +60 -0
  704. PYME/LMVis/shader_programs/shaders/image_vs.glsl +79 -0
  705. PYME/LMVis/shader_programs/shaders/phong_fs.glsl +43 -0
  706. PYME/LMVis/shader_programs/shaders/phong_vs.glsl +45 -0
  707. PYME/LMVis/shader_programs/shaders/pointsprites_fs.glsl +33 -0
  708. PYME/LMVis/shader_programs/shaders/pointsprites_vs.glsl +77 -0
  709. PYME/LMVis/shader_programs/shaders/spheres_fs.glsl +102 -0
  710. PYME/LMVis/shader_programs/shaders/tessel_fs.glsl +23 -0
  711. PYME/LMVis/shader_programs/shaders/tessel_vs.glsl +37 -0
  712. PYME/LMVis/shader_programs/shaders/text_fs.glsl +42 -0
  713. PYME/LMVis/shader_programs/shaders/text_vs.glsl +84 -0
  714. PYME/LMVis/shader_programs/shaders/widelines_fs.glsl +19 -0
  715. PYME/LMVis/shader_programs/shaders/widelines_gs.glsl +56 -0
  716. PYME/LMVis/shader_programs/shaders/widelines_vs.glsl +51 -0
  717. PYME/LMVis/statusLog.py +57 -0
  718. PYME/LMVis/triBlobs.py +142 -0
  719. PYME/LMVis/view_clipping_pane.py +429 -0
  720. PYME/LMVis/views.py +275 -0
  721. PYME/LMVis/visCore.py +1005 -0
  722. PYME/LMVis/visHelpers.py +880 -0
  723. PYME/LMVis/visHelpersMin.py +230 -0
  724. PYME/LMVis/workspaceTree.py +238 -0
  725. PYME/__init__.py +22 -0
  726. PYME/cluster/HTTPDataServer.py +1063 -0
  727. PYME/cluster/HTTPRulePusher.py +382 -0
  728. PYME/cluster/HTTPTaskPusher.py +377 -0
  729. PYME/cluster/PYMERuleNodeServer.py +192 -0
  730. PYME/cluster/PYMERuleServer.py +109 -0
  731. PYME/cluster/__init__.py +0 -0
  732. PYME/cluster/clusterUI/accounts/__init__.py +0 -0
  733. PYME/cluster/clusterUI/accounts/admin.py +85 -0
  734. PYME/cluster/clusterUI/accounts/forms.py +8 -0
  735. PYME/cluster/clusterUI/accounts/migrations/0001_initial.py +31 -0
  736. PYME/cluster/clusterUI/accounts/migrations/__init__.py +0 -0
  737. PYME/cluster/clusterUI/accounts/models.py +44 -0
  738. PYME/cluster/clusterUI/accounts/templates/accounts/user_form.html +13 -0
  739. PYME/cluster/clusterUI/accounts/templates/registration/initial_complete.html +6 -0
  740. PYME/cluster/clusterUI/accounts/templates/registration/initial_confirm.html +13 -0
  741. PYME/cluster/clusterUI/accounts/templates/registration/initial_done.html +7 -0
  742. PYME/cluster/clusterUI/accounts/templates/registration/verification.html +2 -0
  743. PYME/cluster/clusterUI/accounts/templates/registration/verification_subject.txt +1 -0
  744. PYME/cluster/clusterUI/accounts/urls.py +19 -0
  745. PYME/cluster/clusterUI/accounts/views.py +36 -0
  746. PYME/cluster/clusterUI/clusterUI/__init__.py +0 -0
  747. PYME/cluster/clusterUI/clusterUI/settings.py +147 -0
  748. PYME/cluster/clusterUI/clusterUI/urls.py +31 -0
  749. PYME/cluster/clusterUI/clusterUI/wsgi.py +16 -0
  750. PYME/cluster/clusterUI/clusterbrowser/__init__.py +0 -0
  751. PYME/cluster/clusterUI/clusterbrowser/admin.py +3 -0
  752. PYME/cluster/clusterUI/clusterbrowser/apps.py +7 -0
  753. PYME/cluster/clusterUI/clusterbrowser/migrations/__init__.py +0 -0
  754. PYME/cluster/clusterUI/clusterbrowser/models.py +5 -0
  755. PYME/cluster/clusterUI/clusterbrowser/templates/base.html +129 -0
  756. PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/dirlisting.html +231 -0
  757. PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/form_new_folder.html +18 -0
  758. PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/form_upload_file.html +17 -0
  759. PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/lightlisting.html +25 -0
  760. PYME/cluster/clusterUI/clusterbrowser/templates/registration/login.html +38 -0
  761. PYME/cluster/clusterUI/clusterbrowser/urls.py +10 -0
  762. PYME/cluster/clusterUI/clusterbrowser/views.py +148 -0
  763. PYME/cluster/clusterUI/clusterstatus/__init__.py +0 -0
  764. PYME/cluster/clusterUI/clusterstatus/admin.py +3 -0
  765. PYME/cluster/clusterUI/clusterstatus/apps.py +7 -0
  766. PYME/cluster/clusterUI/clusterstatus/migrations/__init__.py +0 -0
  767. PYME/cluster/clusterUI/clusterstatus/models.py +5 -0
  768. PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/load_content.html +29 -0
  769. PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/queue_info.html +28 -0
  770. PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/queue_info_content.html +50 -0
  771. PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/status_dash.html +29 -0
  772. PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/status_dash_content.html +90 -0
  773. PYME/cluster/clusterUI/clusterstatus/urls.py +9 -0
  774. PYME/cluster/clusterUI/clusterstatus/views.py +69 -0
  775. PYME/cluster/clusterUI/clusterui_tornado.py +117 -0
  776. PYME/cluster/clusterUI/deploy.py +62 -0
  777. PYME/cluster/clusterUI/localization/__init__.py +0 -0
  778. PYME/cluster/clusterUI/localization/admin.py +3 -0
  779. PYME/cluster/clusterUI/localization/apps.py +7 -0
  780. PYME/cluster/clusterUI/localization/migrations/__init__.py +0 -0
  781. PYME/cluster/clusterUI/localization/models.py +5 -0
  782. PYME/cluster/clusterUI/localization/templates/localization/settings_form.html +67 -0
  783. PYME/cluster/clusterUI/localization/urls.py +10 -0
  784. PYME/cluster/clusterUI/localization/views.py +170 -0
  785. PYME/cluster/clusterUI/manage.py +17 -0
  786. PYME/cluster/clusterUI/recipes/__init__.py +0 -0
  787. PYME/cluster/clusterUI/recipes/admin.py +3 -0
  788. PYME/cluster/clusterUI/recipes/migrations/__init__.py +0 -0
  789. PYME/cluster/clusterUI/recipes/models.py +3 -0
  790. PYME/cluster/clusterUI/recipes/templates/recipes/extra_inputs.html +35 -0
  791. PYME/cluster/clusterUI/recipes/templates/recipes/form_recipe.html +82 -0
  792. PYME/cluster/clusterUI/recipes/templates/recipes/input_list.html +7 -0
  793. PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editor.html +28 -0
  794. PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editor_common.html +46 -0
  795. PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editrun.html +93 -0
  796. PYME/cluster/clusterUI/recipes/templates/recipes/recipe_standalone.html +100 -0
  797. PYME/cluster/clusterUI/recipes/templates/recipes/recipe_template.html +109 -0
  798. PYME/cluster/clusterUI/recipes/urls.py +17 -0
  799. PYME/cluster/clusterUI/recipes/views.py +109 -0
  800. PYME/cluster/cluster_of_one.py +200 -0
  801. PYME/cluster/dataserver_wsgi.py +615 -0
  802. PYME/cluster/distribution.py +71 -0
  803. PYME/cluster/rulenodeserver.py +487 -0
  804. PYME/cluster/rules.py +979 -0
  805. PYME/cluster/ruleserver.py +1106 -0
  806. PYME/cluster/status.py +101 -0
  807. PYME/cluster/taskWorkerHTTP.py +522 -0
  808. PYME/cluster/webdav.py +1102 -0
  809. PYME/config.py +659 -0
  810. PYME/contrib/TextCtrlAutoComplete.py +582 -0
  811. PYME/contrib/__init__.py +7 -0
  812. PYME/contrib/aniso/__init__.py +2 -0
  813. PYME/contrib/aniso/aniso.py +268 -0
  814. PYME/contrib/auiFloatBook.py +94 -0
  815. PYME/contrib/congrid.py +127 -0
  816. PYME/contrib/dispatch/__init__.py +19 -0
  817. PYME/contrib/dispatch/dispatcher.py +289 -0
  818. PYME/contrib/gohlke/__init__.py +1 -0
  819. PYME/contrib/gohlke/_tifffile.cp39-win_amd64.dll.a +0 -0
  820. PYME/contrib/gohlke/_tifffile.cp39-win_amd64.pyd +0 -0
  821. PYME/contrib/gohlke/czifile.py +1289 -0
  822. PYME/contrib/gohlke/fcsfiles.py +514 -0
  823. PYME/contrib/gohlke/setup.py +54 -0
  824. PYME/contrib/gohlke/tifffile.py +3095 -0
  825. PYME/contrib/listctrlMixins.py +896 -0
  826. PYME/contrib/lzw.py +838 -0
  827. PYME/contrib/pad/__init__.py +13 -0
  828. PYME/contrib/pad/info_pad.py +18 -0
  829. PYME/contrib/pad/pad.py +670 -0
  830. PYME/contrib/setup.py +38 -0
  831. PYME/contrib/wxPlotPanel.py +137 -0
  832. PYME/experimental/SimReconstruction.py +49 -0
  833. PYME/experimental/__init__.pxd +0 -0
  834. PYME/experimental/__init__.py +4 -0
  835. PYME/experimental/_octree.cp39-win_amd64.dll.a +0 -0
  836. PYME/experimental/_octree.cp39-win_amd64.pyd +0 -0
  837. PYME/experimental/_octree.pyx +477 -0
  838. PYME/experimental/_treap.cp39-win_amd64.dll.a +0 -0
  839. PYME/experimental/_treap.cp39-win_amd64.pyd +0 -0
  840. PYME/experimental/_treap.pyx +267 -0
  841. PYME/experimental/_triangle_mesh.cp39-win_amd64.dll.a +0 -0
  842. PYME/experimental/_triangle_mesh.cp39-win_amd64.pyd +0 -0
  843. PYME/experimental/_triangle_mesh.pxd +149 -0
  844. PYME/experimental/_triangle_mesh.pyx +2787 -0
  845. PYME/experimental/aqavg.py +40 -0
  846. PYME/experimental/dcimgFileChucker.py +375 -0
  847. PYME/experimental/dcimgSpoolShim.py +174 -0
  848. PYME/experimental/dcimg_chuck_test.py +78 -0
  849. PYME/experimental/dual_marching_cubes.py +801 -0
  850. PYME/experimental/dual_marching_cubes_v2.py +645 -0
  851. PYME/experimental/expectationMaximisation.py +298 -0
  852. PYME/experimental/func_octree.cp39-win_amd64.dll.a +0 -0
  853. PYME/experimental/func_octree.cp39-win_amd64.pyd +0 -0
  854. PYME/experimental/func_octree.pyx +381 -0
  855. PYME/experimental/fusionRadial.py +520 -0
  856. PYME/experimental/fusionUtils.py +522 -0
  857. PYME/experimental/isosurface.py +147 -0
  858. PYME/experimental/labview_spooling_hacks.py +48 -0
  859. PYME/experimental/marching_cubes.py +811 -0
  860. PYME/experimental/marching_tetrahedra.py +343 -0
  861. PYME/experimental/modified_marching_cubes.py +1245 -0
  862. PYME/experimental/music.py +25 -0
  863. PYME/experimental/octree.py +188 -0
  864. PYME/experimental/pSpaceMap.py +34 -0
  865. PYME/experimental/pointFitConfoc.py +112 -0
  866. PYME/experimental/scanner_control.py +107 -0
  867. PYME/experimental/setup.py +109 -0
  868. PYME/experimental/spark.py +31 -0
  869. PYME/experimental/tcHist.py +71 -0
  870. PYME/experimental/treap.py +262 -0
  871. PYME/experimental/triangle_mesh.py +2287 -0
  872. PYME/experimental/triangle_mesh_utils.cp39-win_amd64.dll.a +0 -0
  873. PYME/experimental/triangle_mesh_utils.cp39-win_amd64.pyd +0 -0
  874. PYME/experimental/triangle_utils.py +87 -0
  875. PYME/experimental/triangular_mesh.py +2255 -0
  876. PYME/experimental/zMotionArtifactUtils.py +55 -0
  877. PYME/localization/FitFactories/AstigGaussFitFR.py +175 -0
  878. PYME/localization/FitFactories/AstigGaussGPUFitFR.py +326 -0
  879. PYME/localization/FitFactories/BeadConvolvedAstigGaussFit.py +206 -0
  880. PYME/localization/FitFactories/ChecksumFR.py +82 -0
  881. PYME/localization/FitFactories/ChecksumGPUFR.py +213 -0
  882. PYME/localization/FitFactories/ChecksumMultifitSR.py +86 -0
  883. PYME/localization/FitFactories/ConfocCOIR.py +93 -0
  884. PYME/localization/FitFactories/Dumbell3DFitR.py +193 -0
  885. PYME/localization/FitFactories/DumbellFitR.py +163 -0
  886. PYME/localization/FitFactories/FFBase.py +403 -0
  887. PYME/localization/FitFactories/Gauss3DFitR.py +213 -0
  888. PYME/localization/FitFactories/GaussFitConstrR.py +177 -0
  889. PYME/localization/FitFactories/GaussMultifitLinesR.py +351 -0
  890. PYME/localization/FitFactories/GaussMultifitR.py +326 -0
  891. PYME/localization/FitFactories/GaussMultifitSR.py +373 -0
  892. PYME/localization/FitFactories/InterpFitR.py +236 -0
  893. PYME/localization/FitFactories/InterpFitWFR.py +111 -0
  894. PYME/localization/FitFactories/Interpolators/CSInterpolator.py +148 -0
  895. PYME/localization/FitFactories/Interpolators/CubeSInterpolatorP.py +121 -0
  896. PYME/localization/FitFactories/Interpolators/CubicSplineInterpolator.py +69 -0
  897. PYME/localization/FitFactories/Interpolators/LinearInterpolator.py +135 -0
  898. PYME/localization/FitFactories/Interpolators/LinearPInterpolatorP.py +95 -0
  899. PYME/localization/FitFactories/Interpolators/__init__.py +33 -0
  900. PYME/localization/FitFactories/Interpolators/baseInterpolator.py +202 -0
  901. PYME/localization/FitFactories/LatFitCOIR.py +82 -0
  902. PYME/localization/FitFactories/LatGaussFitFR.py +220 -0
  903. PYME/localization/FitFactories/LatObjFindFR.py +85 -0
  904. PYME/localization/FitFactories/LatPSFFitR.py +142 -0
  905. PYME/localization/FitFactories/MultiviewFitInterpNR.py +400 -0
  906. PYME/localization/FitFactories/PRInterpFitQR.py +192 -0
  907. PYME/localization/FitFactories/PRInterpFitR.py +223 -0
  908. PYME/localization/FitFactories/ROIExtractNR.py +93 -0
  909. PYME/localization/FitFactories/SpecGaussFitFR.py +174 -0
  910. PYME/localization/FitFactories/SplitterFitCOIR.py +142 -0
  911. PYME/localization/FitFactories/SplitterFitFNR.py +312 -0
  912. PYME/localization/FitFactories/SplitterFitFusionR.py +318 -0
  913. PYME/localization/FitFactories/SplitterFitInterpBNR.py +357 -0
  914. PYME/localization/FitFactories/SplitterFitInterpNR.py +343 -0
  915. PYME/localization/FitFactories/SplitterFitScavNR.py +352 -0
  916. PYME/localization/FitFactories/SplitterMultifitSR.py +410 -0
  917. PYME/localization/FitFactories/SplitterObjFindR.py +194 -0
  918. PYME/localization/FitFactories/SplitterROIExtractNR.py +91 -0
  919. PYME/localization/FitFactories/SplitterShiftEstFR.py +230 -0
  920. PYME/localization/FitFactories/__init__.py +103 -0
  921. PYME/localization/FitFactories/fitCommon.py +195 -0
  922. PYME/localization/FitFactories/zEstimators/__init__.py +29 -0
  923. PYME/localization/FitFactories/zEstimators/astigEstimator.py +173 -0
  924. PYME/localization/FitFactories/zEstimators/biplaneEstimator.py +209 -0
  925. PYME/localization/FitFactories/zEstimators/genericDualEstimator.py +232 -0
  926. PYME/localization/FitFactories/zEstimators/genericEstimator.py +224 -0
  927. PYME/localization/FitFactories/zEstimators/priEstimator.py +255 -0
  928. PYME/localization/MetaDataEdit.py +543 -0
  929. PYME/localization/Test/30_9_series_A_1.sf +0 -0
  930. PYME/localization/Test/PRI.md +45 -0
  931. PYME/localization/Test/PRI_qr.md +52 -0
  932. PYME/localization/Test/PRI_r.md +52 -0
  933. PYME/localization/Test/__init__.py +22 -0
  934. PYME/localization/Test/astig.md +50 -0
  935. PYME/localization/Test/astigCOI.md +50 -0
  936. PYME/localization/Test/astig_gauss.md +52 -0
  937. PYME/localization/Test/astig_pe.md +50 -0
  938. PYME/localization/Test/astig_splitter.md +66 -0
  939. PYME/localization/Test/astig_splitterCOI.md +67 -0
  940. PYME/localization/Test/astig_splitterQ.md +66 -0
  941. PYME/localization/Test/astig_theory.md +50 -0
  942. PYME/localization/Test/astig_theory.psf +0 -0
  943. PYME/localization/Test/astig_theory.tif +0 -0
  944. PYME/localization/Test/beads1.psf +0 -0
  945. PYME/localization/Test/beads1.tif +0 -0
  946. PYME/localization/Test/biplane_splitter.md +75 -0
  947. PYME/localization/Test/biplane_splitter2.md +103 -0
  948. PYME/localization/Test/biplane_splitter3.md +115 -0
  949. PYME/localization/Test/defoc.md +48 -0
  950. PYME/localization/Test/dumbell_3d.md +52 -0
  951. PYME/localization/Test/fitTestJig.py +172 -0
  952. PYME/localization/Test/fitTestJigSCMOS.py +487 -0
  953. PYME/localization/Test/fitTestJigWC.py +225 -0
  954. PYME/localization/Test/gauss.md +50 -0
  955. PYME/localization/Test/gaussCOI.md +50 -0
  956. PYME/localization/Test/pri_pe.md +50 -0
  957. PYME/localization/Test/pri_theory.md +51 -0
  958. PYME/localization/Test/pri_theory.psf +0 -0
  959. PYME/localization/Test/pri_theory.tif +0 -0
  960. PYME/localization/Test/psf_astig.psf +0 -0
  961. PYME/localization/Test/psf_astig.tif +0 -0
  962. PYME/localization/Test/psf_astig_bg_d.psf +0 -0
  963. PYME/localization/Test/psf_astig_bg_d.tif +0 -0
  964. PYME/localization/Test/psf_astig_pe.psf +0 -0
  965. PYME/localization/Test/psf_astig_pe.tif +0 -0
  966. PYME/localization/Test/psf_decon.psf +0 -0
  967. PYME/localization/Test/psf_decon.tif +0 -0
  968. PYME/localization/Test/psf_decon_pe.psf +0 -0
  969. PYME/localization/Test/psf_decon_pe.tif +0 -0
  970. PYME/localization/Test/psf_guess.psf +0 -0
  971. PYME/localization/Test/splitter.md +63 -0
  972. PYME/localization/Test/splitter_scav.md +63 -0
  973. PYME/localization/Test/test.psf +0 -0
  974. PYME/localization/Test/test.tif +0 -0
  975. PYME/localization/Test/test_decon.psf +0 -0
  976. PYME/localization/Test/test_decon.tif +0 -0
  977. PYME/localization/Test/test_pe.psf +0 -0
  978. PYME/localization/Test/test_pe.tif +0 -0
  979. PYME/localization/Test/wf_theory.psf +0 -0
  980. PYME/localization/Test/wf_theory2.psf +0 -0
  981. PYME/localization/__init__.py +17 -0
  982. PYME/localization/autopsf/__init__.py +1 -0
  983. PYME/localization/autopsf/autopsf.py +486 -0
  984. PYME/localization/autopsf/roifit.py +310 -0
  985. PYME/localization/cInterp/__init__.py +24 -0
  986. PYME/localization/cInterp/cInterp.cp39-win_amd64.dll.a +0 -0
  987. PYME/localization/cInterp/cInterp.cp39-win_amd64.pyd +0 -0
  988. PYME/localization/cInterp/setup.py +54 -0
  989. PYME/localization/cModels/__init__.py +24 -0
  990. PYME/localization/cModels/gauss_app.cp39-win_amd64.dll.a +0 -0
  991. PYME/localization/cModels/gauss_app.cp39-win_amd64.pyd +0 -0
  992. PYME/localization/ofind.py +444 -0
  993. PYME/localization/ofind3d.py +306 -0
  994. PYME/localization/ofind_nofilt.py +128 -0
  995. PYME/localization/ofind_pri.py +478 -0
  996. PYME/localization/ofind_split.py +399 -0
  997. PYME/localization/ofind_xcorr.py +351 -0
  998. PYME/localization/ofind_xcorr_fw.py +441 -0
  999. PYME/localization/remFitBuf.py +657 -0
  1000. PYME/localization/setup.py +56 -0
  1001. PYME/localization/splitting.py +240 -0
  1002. PYME/localization/twist.py +60 -0
  1003. PYME/misc/TiSettings.py +36 -0
  1004. PYME/misc/TiffImagePlugin.py +838 -0
  1005. PYME/misc/VolProj.py +144 -0
  1006. PYME/misc/__init__.py +25 -0
  1007. PYME/misc/aligned_array.py +10 -0
  1008. PYME/misc/aniso.py +29 -0
  1009. PYME/misc/big_sur_fix.py +20 -0
  1010. PYME/misc/check_for_updates.py +139 -0
  1011. PYME/misc/colormaps.py +199 -0
  1012. PYME/misc/colorsys.py +201 -0
  1013. PYME/misc/computerName.py +33 -0
  1014. PYME/misc/coverslipGeometries.py +60 -0
  1015. PYME/misc/cython_numpy_monkey.py +40 -0
  1016. PYME/misc/depGraph.py +406 -0
  1017. PYME/misc/dirSize.py +31 -0
  1018. PYME/misc/diskCleanup.py +64 -0
  1019. PYME/misc/djangoRecarray.py +57 -0
  1020. PYME/misc/django_widgets.py +27 -0
  1021. PYME/misc/editgrid.py +101 -0
  1022. PYME/misc/eventSpy.py +122 -0
  1023. PYME/misc/exceptions.py +30 -0
  1024. PYME/misc/facsPlot.py +89 -0
  1025. PYME/misc/fbpIcons.py +90 -0
  1026. PYME/misc/fftw_compat.py +28 -0
  1027. PYME/misc/findCycles.py +91 -0
  1028. PYME/misc/fortran_interrupt_defeat.py +43 -0
  1029. PYME/misc/glassModel.py +64 -0
  1030. PYME/misc/hash32.py +41 -0
  1031. PYME/misc/hillcurve.py +88 -0
  1032. PYME/misc/hybrid_ns.py +84 -0
  1033. PYME/misc/kdFit.py +72 -0
  1034. PYME/misc/locate.py +10 -0
  1035. PYME/misc/memUsage.py +65 -0
  1036. PYME/misc/memmap.py +52 -0
  1037. PYME/misc/mock_ctypes.py +28 -0
  1038. PYME/misc/mock_traits.py +59 -0
  1039. PYME/misc/mock_traitsui.py +29 -0
  1040. PYME/misc/pyme_zeroconf.py +287 -0
  1041. PYME/misc/pyro_tracebacks.py +32 -0
  1042. PYME/misc/read_agf.py +605 -0
  1043. PYME/misc/sffake.py +16 -0
  1044. PYME/misc/snells.py +71 -0
  1045. PYME/misc/sqlite_ns.py +132 -0
  1046. PYME/misc/sqlitendarray.py +56 -0
  1047. PYME/misc/taskDef.py +44 -0
  1048. PYME/misc/tempDB.py +56 -0
  1049. PYME/misc/wxThread.py +33 -0
  1050. PYME/misc/zemax.py +259 -0
  1051. PYME/misc/zernike.py +151 -0
  1052. PYME/pyme_warnings.py +70 -0
  1053. PYME/recipes/Recipes/STEDDeconvolution.yaml +14 -0
  1054. PYME/recipes/Recipes/STEDMinistacks.yaml +15 -0
  1055. PYME/recipes/Recipes/STED_COP3.yaml +25 -0
  1056. PYME/recipes/Recipes/blobMeas.yaml +19 -0
  1057. PYME/recipes/Recipes/blobMeas2.yaml +37 -0
  1058. PYME/recipes/Recipes/blobMeasSR.yaml +66 -0
  1059. PYME/recipes/Recipes/coloc.yaml +43 -0
  1060. PYME/recipes/Recipes/coloc_roi_masked.yaml +46 -0
  1061. PYME/recipes/Recipes/multiblob.yaml +38 -0
  1062. PYME/recipes/Recipes/pre_particleTracking.yaml +30 -0
  1063. PYME/recipes/Recipes/segmentAndMeasureLoci.yaml +41 -0
  1064. PYME/recipes/__init__.py +6 -0
  1065. PYME/recipes/acquisition.py +158 -0
  1066. PYME/recipes/bakeshop.py +32 -0
  1067. PYME/recipes/base.py +1393 -0
  1068. PYME/recipes/batchProcess.py +147 -0
  1069. PYME/recipes/filters.py +394 -0
  1070. PYME/recipes/fudges.py +41 -0
  1071. PYME/recipes/graphing.py +108 -0
  1072. PYME/recipes/html_recipe_editor.py +90 -0
  1073. PYME/recipes/localisations.py +1386 -0
  1074. PYME/recipes/machine_learning.py +286 -0
  1075. PYME/recipes/measurement.py +1062 -0
  1076. PYME/recipes/modules.py +50 -0
  1077. PYME/recipes/multiview.py +435 -0
  1078. PYME/recipes/output.py +667 -0
  1079. PYME/recipes/pointcloud.py +510 -0
  1080. PYME/recipes/processing.py +2954 -0
  1081. PYME/recipes/pyramid.py +206 -0
  1082. PYME/recipes/recipe.py +965 -0
  1083. PYME/recipes/recipeGui.py +1029 -0
  1084. PYME/recipes/recipeLayout.py +499 -0
  1085. PYME/recipes/runRecipe.py +140 -0
  1086. PYME/recipes/setup.py +37 -0
  1087. PYME/recipes/simulation.py +91 -0
  1088. PYME/recipes/skfilters.py +143 -0
  1089. PYME/recipes/surface_fitting.py +776 -0
  1090. PYME/recipes/tablefilters.py +275 -0
  1091. PYME/recipes/tracking.py +343 -0
  1092. PYME/recipes/traits.py +157 -0
  1093. PYME/recipes/vertical_recipe_display.py +373 -0
  1094. PYME/resources/__init__.py +23 -0
  1095. PYME/resources/config_template/distributor.yaml +14 -0
  1096. PYME/resources/config_template/nodeserver.yaml +15 -0
  1097. PYME/resources/icons/LUT.png +0 -0
  1098. PYME/resources/icons/YSM_Shield.png +0 -0
  1099. PYME/resources/icons/YSM_logo.png +0 -0
  1100. PYME/resources/icons/arrow.png +0 -0
  1101. PYME/resources/icons/crosshairs.png +0 -0
  1102. PYME/resources/icons/line_select.png +0 -0
  1103. PYME/resources/icons/logo_fmhs.png +0 -0
  1104. PYME/resources/icons/media-playback-pause.png +0 -0
  1105. PYME/resources/icons/media-playback-start.png +0 -0
  1106. PYME/resources/icons/media-skip-backward.png +0 -0
  1107. PYME/resources/icons/media-skip-forward.png +0 -0
  1108. PYME/resources/icons/mesh.png +0 -0
  1109. PYME/resources/icons/mesh.svg +28 -0
  1110. PYME/resources/icons/pmacquire.icns +0 -0
  1111. PYME/resources/icons/pmacquire.ico +0 -0
  1112. PYME/resources/icons/pmanal.icns +0 -0
  1113. PYME/resources/icons/pmanal.ico +0 -0
  1114. PYME/resources/icons/pmvis.icns +0 -0
  1115. PYME/resources/icons/pmvis.ico +0 -0
  1116. PYME/resources/icons/points.png +0 -0
  1117. PYME/resources/icons/points.svg +16 -0
  1118. PYME/resources/icons/pymeLogo.png +0 -0
  1119. PYME/resources/icons/rect_select.png +0 -0
  1120. PYME/resources/icons/squiggle_select.png +0 -0
  1121. PYME/resources/icons/text3800.icns +0 -0
  1122. PYME/resources/icons/text3800.ico +0 -0
  1123. PYME/resources/icons/text3800.png +0 -0
  1124. PYME/resources/icons/text3800.tif +0 -0
  1125. PYME/resources/icons/text5377.icns +0 -0
  1126. PYME/resources/icons/text5377.ico +0 -0
  1127. PYME/resources/icons/text5377.png +0 -0
  1128. PYME/resources/icons/tracks.png +0 -0
  1129. PYME/resources/icons/tracks.svg +19 -0
  1130. PYME/resources/icons/view-front.png +0 -0
  1131. PYME/resources/icons/view-home.png +0 -0
  1132. PYME/resources/icons/view-right.png +0 -0
  1133. PYME/resources/icons/view-top.png +0 -0
  1134. PYME/resources/test_datasets/README.md +8 -0
  1135. PYME/resources/test_datasets/t_im.tif +0 -0
  1136. PYME/resources/test_datasets/test_csv.csv +4282 -0
  1137. PYME/resources/test_datasets/test_hdf.hdf +0 -0
  1138. PYME/resources/web/rule_inline.html +21 -0
  1139. PYME/resources/web/ruleserver.html +75 -0
  1140. PYME/resources/web/static/bootstrap.min.js +7 -0
  1141. PYME/resources/web/static/cluster.css +137 -0
  1142. PYME/resources/web/static/css/bootstrap-theme.css +587 -0
  1143. PYME/resources/web/static/css/bootstrap-theme.min.css +6 -0
  1144. PYME/resources/web/static/css/bootstrap.css +6757 -0
  1145. PYME/resources/web/static/css/bootstrap.min.css +6 -0
  1146. PYME/resources/web/static/css/flat_design_colors_full.css +306 -0
  1147. PYME/resources/web/static/css/recipe_editor.css +106 -0
  1148. PYME/resources/web/static/dashboard.css +106 -0
  1149. PYME/resources/web/static/fileselector.js +77 -0
  1150. PYME/resources/web/static/fonts/glyphicons-halflings-regular.eot +0 -0
  1151. PYME/resources/web/static/fonts/glyphicons-halflings-regular.svg +288 -0
  1152. PYME/resources/web/static/fonts/glyphicons-halflings-regular.ttf +0 -0
  1153. PYME/resources/web/static/fonts/glyphicons-halflings-regular.woff +0 -0
  1154. PYME/resources/web/static/fonts/glyphicons-halflings-regular.woff2 +0 -0
  1155. PYME/resources/web/static/images/osd_flat/LICENSE.txt +116 -0
  1156. PYME/resources/web/static/images/osd_flat/README.md +9 -0
  1157. PYME/resources/web/static/images/osd_flat/fullpage_grouphover.png +0 -0
  1158. PYME/resources/web/static/images/osd_flat/fullpage_hover.png +0 -0
  1159. PYME/resources/web/static/images/osd_flat/fullpage_pressed.png +0 -0
  1160. PYME/resources/web/static/images/osd_flat/fullpage_rest.png +0 -0
  1161. PYME/resources/web/static/images/osd_flat/home_grouphover.png +0 -0
  1162. PYME/resources/web/static/images/osd_flat/home_hover.png +0 -0
  1163. PYME/resources/web/static/images/osd_flat/home_pressed.png +0 -0
  1164. PYME/resources/web/static/images/osd_flat/home_rest.png +0 -0
  1165. PYME/resources/web/static/images/osd_flat/next_grouphover.png +0 -0
  1166. PYME/resources/web/static/images/osd_flat/next_hover.png +0 -0
  1167. PYME/resources/web/static/images/osd_flat/next_pressed.png +0 -0
  1168. PYME/resources/web/static/images/osd_flat/next_rest.png +0 -0
  1169. PYME/resources/web/static/images/osd_flat/previous_grouphover.png +0 -0
  1170. PYME/resources/web/static/images/osd_flat/previous_hover.png +0 -0
  1171. PYME/resources/web/static/images/osd_flat/previous_pressed.png +0 -0
  1172. PYME/resources/web/static/images/osd_flat/previous_rest.png +0 -0
  1173. PYME/resources/web/static/images/osd_flat/rotateleft_grouphover.png +0 -0
  1174. PYME/resources/web/static/images/osd_flat/rotateleft_hover.png +0 -0
  1175. PYME/resources/web/static/images/osd_flat/rotateleft_pressed.png +0 -0
  1176. PYME/resources/web/static/images/osd_flat/rotateleft_rest.png +0 -0
  1177. PYME/resources/web/static/images/osd_flat/rotateright_grouphover.png +0 -0
  1178. PYME/resources/web/static/images/osd_flat/rotateright_hover.png +0 -0
  1179. PYME/resources/web/static/images/osd_flat/rotateright_pressed.png +0 -0
  1180. PYME/resources/web/static/images/osd_flat/rotateright_rest.png +0 -0
  1181. PYME/resources/web/static/images/osd_flat/zoomin_grouphover.png +0 -0
  1182. PYME/resources/web/static/images/osd_flat/zoomin_hover.png +0 -0
  1183. PYME/resources/web/static/images/osd_flat/zoomin_pressed.png +0 -0
  1184. PYME/resources/web/static/images/osd_flat/zoomin_rest.png +0 -0
  1185. PYME/resources/web/static/images/osd_flat/zoomout_grouphover.png +0 -0
  1186. PYME/resources/web/static/images/osd_flat/zoomout_hover.png +0 -0
  1187. PYME/resources/web/static/images/osd_flat/zoomout_pressed.png +0 -0
  1188. PYME/resources/web/static/images/osd_flat/zoomout_rest.png +0 -0
  1189. PYME/resources/web/static/jigna-vue-bare.js +1395 -0
  1190. PYME/resources/web/static/jquery.min.js +2 -0
  1191. PYME/resources/web/static/jstree.min.js +6 -0
  1192. PYME/resources/web/static/openSeadragonGL.js +102 -0
  1193. PYME/resources/web/static/openseadragon-svg-overlay.js +103 -0
  1194. PYME/resources/web/static/openseadragon-viewerinputhook.min.js +6 -0
  1195. PYME/resources/web/static/openseadragon.min.js +9 -0
  1196. PYME/resources/web/static/recipe_editor.js +119 -0
  1197. PYME/resources/web/static/shaders/fragment/lut.glsl +20 -0
  1198. PYME/resources/web/static/shaders/fragment/none.glsl +17 -0
  1199. PYME/resources/web/static/shaders/fragment/outline.glsl +43 -0
  1200. PYME/resources/web/static/shaders/fragment/rect.glsl +7 -0
  1201. PYME/resources/web/static/shaders/fragment/sobel3.glsl +71 -0
  1202. PYME/resources/web/static/shaders/fragment/white.glsl +4 -0
  1203. PYME/resources/web/static/shaders/vertex/rect.glsl +22 -0
  1204. PYME/resources/web/static/shaders/vertex/square.glsl +9 -0
  1205. PYME/resources/web/static/utils.js +3 -0
  1206. PYME/resources/web/static/viaWebGL.js +217 -0
  1207. PYME/setup.py +109 -0
  1208. PYME/setup_exe.py +57 -0
  1209. PYME/simulation/__init__.py +0 -0
  1210. PYME/simulation/locify.py +319 -0
  1211. PYME/simulation/pointsets.py +279 -0
  1212. PYME/simulation/wormlike.py +99 -0
  1213. PYME/simulation/wormlike2.py +198 -0
  1214. PYME/simulation/wormlike3.py +197 -0
  1215. PYME/simulation/wormlike_curled.py +104 -0
  1216. PYME/tileviewer/__init__.py +0 -0
  1217. PYME/tileviewer/templates/roi_list.html +12 -0
  1218. PYME/tileviewer/templates/tileviewer.html +247 -0
  1219. PYME/tileviewer/tileviewer.py +207 -0
  1220. PYME/ui/AUIFrame.py +279 -0
  1221. PYME/ui/MetadataTree.py +469 -0
  1222. PYME/ui/__init__.py +4 -0
  1223. PYME/ui/about_dlg.py +29 -0
  1224. PYME/ui/autoFoldPanel.py +643 -0
  1225. PYME/ui/cascading_layout.py +45 -0
  1226. PYME/ui/crop_dialog.py +145 -0
  1227. PYME/ui/custom_traits_editors.py +508 -0
  1228. PYME/ui/editFilterDialog.py +80 -0
  1229. PYME/ui/editList.py +40 -0
  1230. PYME/ui/fastGraph.py +240 -0
  1231. PYME/ui/filterPane.py +348 -0
  1232. PYME/ui/histLimits.py +543 -0
  1233. PYME/ui/layerFoldPanel.py +232 -0
  1234. PYME/ui/manualFoldPanel.py +870 -0
  1235. PYME/ui/mytimer.py +116 -0
  1236. PYME/ui/patch_traitsui.py +151 -0
  1237. PYME/ui/progress.py +160 -0
  1238. PYME/ui/recArrayView.py +145 -0
  1239. PYME/ui/selection.py +71 -0
  1240. PYME/ui/shell.py +37 -0
  1241. PYME/ui/traitsui_constants.py +91 -0
  1242. PYME/ui/wx_compat.py +43 -0
  1243. PYME/update_version.py +159 -0
  1244. PYME/util/__init__.py +3 -0
  1245. PYME/util/authenticate.py +164 -0
  1246. PYME/util/execfile.py +21 -0
  1247. PYME/util/fProfile/__init__.py +1 -0
  1248. PYME/util/fProfile/convertProfile.py +117 -0
  1249. PYME/util/fProfile/fProfile.py +162 -0
  1250. PYME/util/fProfile/html/404.html +60 -0
  1251. PYME/util/fProfile/html/css/main.css +258 -0
  1252. PYME/util/fProfile/html/css/normalize.css +427 -0
  1253. PYME/util/fProfile/html/css/normalize.min.css +1 -0
  1254. PYME/util/fProfile/html/index.html +64 -0
  1255. PYME/util/fProfile/html/js/main.js +492 -0
  1256. PYME/util/fProfile/html/js/plugins.js +24 -0
  1257. PYME/util/fProfile/html/js/vendor/crossfilter.min.js +1 -0
  1258. PYME/util/fProfile/html/js/vendor/jquery-1.11.2.min.js +4 -0
  1259. PYME/util/fProfile/html/js/vendor/modernizr-2.8.3.min.js +4 -0
  1260. PYME/util/fProfile/html/js/vendor/tinycolor-min.js +4 -0
  1261. PYME/util/fProfile/viewProfile.py +30 -0
  1262. PYME/util/install_dependencies.py +95 -0
  1263. PYME/util/log_verbosity.py +11 -0
  1264. PYME/util/mProfile/__init__.py +1 -0
  1265. PYME/util/mProfile/colorize_db_t.py +297 -0
  1266. PYME/util/mProfile/mProfile.py +164 -0
  1267. PYME/util/mProfile/p.py +101 -0
  1268. PYME/util/mProfile/tProfile.py +165 -0
  1269. PYME/util/pymelauncher.py +47 -0
  1270. PYME/util/shmarray/__init__.py +0 -0
  1271. PYME/util/shmarray/shmTest.py +74 -0
  1272. PYME/util/shmarray/shmarray.py +165 -0
  1273. PYME/util/webframework.py +365 -0
  1274. PYME/version.py +65 -0
  1275. python_microscopy-25.6.5.dist-info/METADATA +68 -0
  1276. python_microscopy-25.6.5.dist-info/RECORD +1277 -0
  1277. python_microscopy-25.6.5.dist-info/WHEEL +4 -0
@@ -0,0 +1,1289 @@
1
+ # -*- coding: utf-8 -*-
2
+ # czifile.py
3
+
4
+ # Copyright (c) 2013-2014, Christoph Gohlke
5
+ # Copyright (c) 2013-2014, The Regents of the University of California
6
+ # Produced at the Laboratory for Fluorescence Dynamics.
7
+ # All rights reserved.
8
+ #
9
+ # Redistribution and use in source and binary forms, with or without
10
+ # modification, are permitted provided that the following conditions are met:
11
+ #
12
+ # * Redistributions of source code must retain the above copyright
13
+ # notice, this list of conditions and the following disclaimer.
14
+ # * Redistributions in binary form must reproduce the above copyright
15
+ # notice, this list of conditions and the following disclaimer in the
16
+ # documentation and/or other materials provided with the distribution.
17
+ # * Neither the name of the copyright holders nor the names of any
18
+ # contributors may be used to endorse or promote products derived
19
+ # from this software without specific prior written permission.
20
+ #
21
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
25
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31
+ # POSSIBILITY OF SUCH DAMAGE.
32
+
33
+ """Read image and metadata from Carl Zeiss(r) ZISRAW (CZI) files.
34
+
35
+ CZI is the native image file format of the ZEN(r) software by the Carl Zeiss
36
+ Microscopy GmbH. It stores multidimensional images and metadata from
37
+ microscopy experiments.
38
+
39
+ :Author:
40
+ `Christoph Gohlke <http://www.lfd.uci.edu/~gohlke/>`_
41
+
42
+ :Organization:
43
+ Laboratory for Fluorescence Dynamics, University of California, Irvine
44
+
45
+ :Version: 2013.12.04
46
+
47
+ Requirements
48
+ ------------
49
+ * `CPython 2.7 or 3.3 <http://www.python.org>`_
50
+ * `Numpy 1.7 <http://www.numpy.org>`_
51
+ * `Scipy 0.13 <http://www.scipy.org>`_
52
+ * `Tifffile.py 2013.11.03 <http://www.lfd.uci.edu/~gohlke/>`_
53
+ * `Czifle.pyx 2013.12.04 <http://www.lfd.uci.edu/~gohlke/>`_
54
+ (for decoding JpegXrFile and JpgFile images)
55
+
56
+ Revisions
57
+ ---------
58
+ 2013.12.04
59
+ Decode JpegXrFile and JpgFile via _czifle extension module.
60
+ Attempt to reconstruct tiled mosaic images.
61
+ 2013.11.20
62
+ Initial release.
63
+
64
+ Notes
65
+ -----
66
+ The API is not stable yet and might change between revisions.
67
+
68
+ The file format design specification [1] is confidential and the licence
69
+ agreement does not permit to write data into CZI files.
70
+
71
+ Only a subset of the 2012 specification is implemented in the initial release.
72
+ Specifically, multifile images are not yet supported.
73
+
74
+ Tested on Windows with a few example files only.
75
+
76
+ References
77
+ ----------
78
+ (1) ZISRAW (CZI) File Format Design specification Release Version 1.1 for
79
+ ZEN 2012. DS_ZISRAW-FileFormat_Rel_ZEN2012.doc (Confidential)
80
+ Documentation can be requested at
81
+ <http://microscopy.zeiss.com/microscopy/en_us/downloads/zen.html>
82
+ (2) CZI The File Format for the Microscope | ZEISS International
83
+ <http://microscopy.zeiss.com/microscopy/en_us/products/microscope-software/
84
+ zen-2012/czi.html>
85
+
86
+ Examples
87
+ --------
88
+ >>> with CziFile('test.czi') as czi:
89
+ ... image = czi.asarray()
90
+ >>> image.shape
91
+ (3, 3, 3, 250, 200, 3)
92
+ >>> image[0, 0, 0, 0, 0]
93
+ array([10, 10, 10], dtype=uint8)
94
+
95
+ """
96
+
97
+ from __future__ import division, print_function
98
+
99
+ import sys
100
+ import os
101
+ import re
102
+ import uuid
103
+ import struct
104
+ import warnings
105
+ import tempfile
106
+
107
+ try:
108
+ from lxml import etree
109
+ except ImportError:
110
+ from xml.etree import cElementTree as etree
111
+
112
+ import numpy
113
+ from scipy.ndimage.interpolation import zoom
114
+
115
+ from .tifffile import decodelzw, lazyattr, stripnull
116
+
117
+ try:
118
+ import _czifile
119
+ _have_czifile = True
120
+ except ImportError:
121
+ _have_czifile = False
122
+ warnings.warn(
123
+ "failed to import the optional _czifile C extension module.\n"
124
+ "Decoding of JXR and JPG encoded images will be unavailable.\n"
125
+ "Czifile.pyx can be obtained at http://www.lfd.uci.edu/~gohlke/")
126
+
127
+ __version__ = '2013.12.04'
128
+ __docformat__ = 'restructuredtext en'
129
+ __all__ = 'imread', 'CziFile'
130
+
131
+
132
+ def imread(filename, *args, **kwargs):
133
+ """Return image data from CZI file as numpy array.
134
+
135
+ 'args' and 'kwargs' are arguments to CziFile.asarray().
136
+
137
+ Examples
138
+ --------
139
+ >>> image = imread('test.czi')
140
+ >>> image.shape
141
+ (3, 3, 3, 250, 200, 3)
142
+ >>> image.dtype
143
+ dtype('uint8')
144
+
145
+ """
146
+ with CziFile(filename) as czi:
147
+ result = czi.asarray(*args, **kwargs)
148
+ return result
149
+
150
+
151
+ class CziFile(object):
152
+ """Carl Zeiss Image (CZI) file.
153
+
154
+ Attributes
155
+ ----------
156
+ header : FileHeaderSegment
157
+ Global file metadata such as file version and GUID.
158
+ metadata : etree.ElementTree.Element
159
+ Global image metadata in UTF-8 encoded XML format.
160
+
161
+ All attributes are read-only.
162
+
163
+ """
164
+
165
+ def __init__(self, arg, multifile=True, filesize=None, detectmosaic=True):
166
+ """Open CZI file and read header.
167
+
168
+ Raise ValueError if file is not a ZISRAW file.
169
+
170
+ Parameters
171
+ ----------
172
+ multifile : bool
173
+ If True (default), the master file of a multifile CZI file
174
+ will be opened if applicable.
175
+ filesize : int
176
+ Size of file if arg is a file handle pointing to an
177
+ embedded CZI file.
178
+ detectmosaic : bool
179
+ If True (default), mosaic images will be reconstructed from
180
+ SubBlocks with a tile index.
181
+
182
+ Notes
183
+ -----
184
+ CziFile instances created from file name must be closed using the
185
+ 'close' method, which is automatically called when using the
186
+ 'with' statement.
187
+
188
+ """
189
+ self._fh = FileHandle(arg, size=filesize)
190
+ try:
191
+ if self._fh.read(10) != b'ZISRAWFILE':
192
+ raise ValueError("not a CZI file")
193
+ self.header = Segment(self._fh, 0).data()
194
+ except Exception:
195
+ self._fh.close()
196
+ raise
197
+
198
+ if multifile and self.header.file_part and isinstance(arg, basestring):
199
+ # open master file instead
200
+ self._fh.close()
201
+ name, _ = match_filename(arg)
202
+ self._fh = FileHandle(name)
203
+ self.header = Segment(self._fh, 0).data()
204
+ assert(self.header.primary_file_guid == self.header.file_guid)
205
+ assert(self.header.file_part == 0)
206
+
207
+ if self.header.update_pending:
208
+ warnings.warn("file is pending update")
209
+ self._filter_mosaic = detectmosaic
210
+
211
+ def segments(self, kind=None):
212
+ """Return iterator over Segment data of specified kind.
213
+
214
+ Parameters
215
+ ----------
216
+ kind : bytestring or sequence thereof
217
+ Segment id(s) as listed in SEGMENT_ID.
218
+ If None (default), all segments are returned.
219
+
220
+ """
221
+ fpos = 0
222
+ while True:
223
+ self._fh.seek(fpos)
224
+ try:
225
+ segment = Segment(self._fh)
226
+ except SegmentNotFoundError:
227
+ break
228
+ if (kind is None) or (segment.sid in kind):
229
+ yield segment.data()
230
+ fpos = segment.data_offset + segment.allocated_size
231
+
232
+ @lazyattr
233
+ def metadata(self):
234
+ """Return data from MetadataSegment as xml.ElementTree root Element.
235
+
236
+ Return None if no Metadata segment is found.
237
+
238
+ """
239
+ if self.header.metadata_position:
240
+ segment = Segment(self._fh, self.header.metadata_position)
241
+ if segment.sid == MetadataSegment.SID:
242
+ return etree.fromstring(segment.data().data())
243
+ warnings.warn("Metadata segment not found")
244
+ try:
245
+ metadata = next(self.segments(MetadataSegment.SID))
246
+ return etree.fromstring(metadata.data())
247
+ except StopIteration:
248
+ pass
249
+
250
+ @lazyattr
251
+ def subblock_directory(self):
252
+ """Return list of all DirectoryEntryDV in file.
253
+
254
+ Use SubBlockDirectorySegment if exists, else find SubBlockSegments.
255
+
256
+ """
257
+ if self.header.directory_position:
258
+ segment = Segment(self._fh, self.header.directory_position)
259
+ if segment.sid == SubBlockDirectorySegment.SID:
260
+ return segment.data().entries
261
+ warnings.warn("SubBlockDirectory segment not found")
262
+ return list(segment.directory_entry for segment in
263
+ self.segments(SubBlockSegment.SID))
264
+
265
+ @lazyattr
266
+ def attachment_directory(self):
267
+ """Return list of all AttachmentEntryA1 in file.
268
+
269
+ Use AttachmentDirectorySegment if exists, else find AttachmentSegments.
270
+
271
+ """
272
+ if self.header.attachment_directory_position:
273
+ segment = Segment(self._fh,
274
+ self.header.attachment_directory_position)
275
+ if segment.sid == AttachmentDirectorySegment.SID:
276
+ return segment.data().entries
277
+ warnings.warn("AttachmentDirectory segment not found")
278
+ return list(segment.attachment_entry for segment in
279
+ self.segments(AttachmentSegment.SID))
280
+
281
+ def subblocks(self):
282
+ """Return iterator over all SubBlock segments in file."""
283
+ for entry in self.subblock_directory:
284
+ yield entry.data_segment()
285
+
286
+ def attachments(self):
287
+ """Return iterator over all Attachment segments in file."""
288
+ for entry in self.attachment_directory:
289
+ yield entry.data_segment()
290
+
291
+ def save_attachments(self, directory=None):
292
+ """Save all attachments to files."""
293
+ if directory is None:
294
+ directory = self._fh.filename + '.attachments'
295
+ if not os.path.exists(directory):
296
+ os.makedirs(directory)
297
+ for attachment in self.attachments():
298
+ attachment.save(directory=directory)
299
+
300
+ @lazyattr
301
+ def filtered_subblock_directory(self):
302
+ """Return sorted list of DirectoryEntryDV if mosaic, else all."""
303
+ if not self._filter_mosaic:
304
+ return self.subblock_directory
305
+ filtered = [directory_entry
306
+ for directory_entry in self.subblock_directory
307
+ if directory_entry.mosaic_index is not None]
308
+ if not filtered:
309
+ return self.subblock_directory
310
+ return list(sorted(filtered, key=lambda x: x.mosaic_index))
311
+
312
+ @lazyattr
313
+ def shape(self):
314
+ """Return shape of image data in file."""
315
+ shape = [[dim.start + dim.size
316
+ for dim in directory_entry.dimension_entries
317
+ if dim.dimension != b'M']
318
+ for directory_entry in self.filtered_subblock_directory]
319
+ shape = numpy.max(shape, axis=0)
320
+ shape = tuple(i-j for i, j in zip(shape, self.start[:-1]))
321
+ dtype = self.filtered_subblock_directory[0].dtype
322
+ sampleshape = numpy.dtype(dtype).shape
323
+ shape = shape + (sampleshape if sampleshape else (1,))
324
+ return shape
325
+
326
+ @lazyattr
327
+ def start(self):
328
+ """Return minimum start indices per dimension of sub images in file."""
329
+ start = [[dim.start
330
+ for dim in directory_entry.dimension_entries
331
+ if dim.dimension != b'M']
332
+ for directory_entry in self.filtered_subblock_directory]
333
+ start = tuple(numpy.min(start, axis=0)) + (0,)
334
+ return start
335
+
336
+ @lazyattr
337
+ def axes(self):
338
+ """Return axes of image data in file."""
339
+ return self.filtered_subblock_directory[0].axes
340
+
341
+ @lazyattr
342
+ def dtype(self):
343
+ """Return dtype of image data in file."""
344
+ # subblock data can be of different pixel type
345
+ dtype = self.filtered_subblock_directory[0].dtype[-2:]
346
+ for directory_entry in self.filtered_subblock_directory:
347
+ dtype = numpy.promote_types(dtype, directory_entry.dtype[-2:])
348
+ return dtype
349
+
350
+ def asarray(self, bgr2rgb=False, resize=True, order=1):
351
+ """Return image data from file(s) as numpy array.
352
+
353
+ Parameters
354
+ ----------
355
+ bgr2rgb : bool
356
+ If True, exchange red and blue samples if applicable.
357
+ resize : bool
358
+ If True (default), resize sub/supersampled subblock data.
359
+ order : int
360
+ The order of spline interpolation used to resize sub/supersampled
361
+ subblock data. Default is 1 (bilinear).
362
+
363
+ """
364
+ image = numpy.zeros(self.shape, self.dtype)
365
+ for directory_entry in self.filtered_subblock_directory:
366
+ subblock = directory_entry.data_segment()
367
+ tile = subblock.data(bgr2rgb=bgr2rgb, resize=resize, order=order)
368
+ index = [slice(i-j, i-j+k) for i, j, k in
369
+ zip(directory_entry.start, self.start, tile.shape)]
370
+ try:
371
+ image[index] = tile
372
+ except ValueError as e:
373
+ warnings.warn(str(e))
374
+ return image
375
+
376
+ def close(self):
377
+ self._fh.close()
378
+
379
+ def __enter__(self):
380
+ return self
381
+
382
+ def __exit__(self, exc_type, exc_value, traceback):
383
+ self.close()
384
+
385
+ def __str__(self):
386
+ return '\n '.join((
387
+ self._fh.name.capitalize(),
388
+ "(Carl Zeiss Image File)",
389
+ str(self.header),
390
+ "MetadataSegment",
391
+ str(self.axes),
392
+ str(self.shape),
393
+ str(self.dtype),
394
+ str(etree.tostring(self.metadata))))
395
+
396
+
397
+ class FileHandle(object):
398
+ """Binary file handle that can handle a file within a file.
399
+
400
+ Only binary read, seek, tell and close are supported on embedded files.
401
+
402
+ Attributes
403
+ ----------
404
+ name : str
405
+ file name
406
+ path : str
407
+ Absolute path to file.
408
+
409
+ All attributes are read-only.
410
+
411
+ """
412
+
413
+ def __init__(self, arg, mode='rb', name=None, offset=None, size=None):
414
+ """Initialize file handle from file name or another file handle.
415
+
416
+ Parameters
417
+ ----------
418
+ arg : str, File, or FileHandle
419
+ File name or open file handle.
420
+ mode : str
421
+ File open mode in case 'arg' is filename.
422
+ name : str
423
+ Optional name of file in case 'arg' is file handle.
424
+ offset : int
425
+ Optional start position of file in the file. By default the
426
+ current file position is used as offset.
427
+ size : int
428
+ Optional size of file in the file. By default the number of
429
+ bytes from the current file position to the end of the file
430
+ is used.
431
+
432
+ """
433
+ if isinstance(arg, basestring): # file name
434
+ filename = os.path.abspath(arg)
435
+ self.path, self.name = os.path.split(filename)
436
+ self._fh = open(filename, mode)
437
+ self._close = True
438
+ if offset is None:
439
+ offset = 0
440
+ elif isinstance(arg, FileHandle):
441
+ if offset is None:
442
+ offset = arg.tell()
443
+ else:
444
+ offset = arg._offset + offset
445
+ self._fh = arg._fh
446
+ self._close = False
447
+ if name:
448
+ self.name = name
449
+ else:
450
+ name, ext = os.path.splitext(arg.name)
451
+ self.name = "%s@%i%s" % (name, offset, ext)
452
+ self.path = arg.path
453
+ else: # file handle
454
+ if offset is None:
455
+ offset = arg.tell()
456
+ self._fh = arg
457
+ self._close = False
458
+ self.name = name if name else self._fh.name
459
+ self.path = ''
460
+
461
+ self._offset = offset
462
+ if size is not None:
463
+ self.size = size
464
+
465
+ @property
466
+ def filename(self):
467
+ return os.path.join(self.path, self.name)
468
+
469
+ def read(self, size=-1):
470
+ if size < 0 and self._offset:
471
+ size = self.size
472
+ return self._fh.read(size)
473
+
474
+ def fromfile(self, dtype, count=-1, sep=""):
475
+ return numpy.fromfile(self._fh, dtype, count, sep)
476
+
477
+ def tell(self):
478
+ return self._fh.tell() - self._offset
479
+
480
+ def seek(self, offset, whence=0):
481
+ if self._offset:
482
+ if whence == 0:
483
+ self._fh.seek(self._offset + offset, whence)
484
+ return
485
+ elif whence == 2:
486
+ self._fh.seek(self._offset + self.size - offset, 0)
487
+ return
488
+ self._fh.seek(offset, whence)
489
+
490
+ def close(self):
491
+ if self._close:
492
+ self._fh.close()
493
+
494
+ def __getattr__(self, name):
495
+ if name == 'size':
496
+ self._fh.seek(self._offset, 2)
497
+ self.size = self._fh.tell()
498
+ return self.size
499
+ return getattr(self._fh, name)
500
+
501
+ def __enter__(self):
502
+ return self
503
+
504
+ def __exit__(self, exc_type, exc_value, traceback):
505
+ self.close()
506
+
507
+
508
+ class Segment(object):
509
+ """ZISRAW Segment."""
510
+
511
+ __slots__ = 'sid', 'allocated_size', 'used_size', 'data_offset', '_fh'
512
+
513
+ def __init__(self, fh, fpos=None):
514
+ """Read segment header from file."""
515
+ if fpos is not None:
516
+ fh.seek(fpos)
517
+ try:
518
+ (self.sid,
519
+ self.allocated_size,
520
+ self.used_size
521
+ ) = struct.unpack('<16sqq', fh.read(32))
522
+ except struct.error:
523
+ raise SegmentNotFoundError("can not read ZISRAW segment")
524
+ self.sid = stripnull(self.sid)
525
+ if self.sid not in SEGMENT_ID:
526
+ if not self.sid.startswith(b'ZISRAW'):
527
+ raise SegmentNotFoundError("not a ZISRAW segment")
528
+ warnings.warn("unknown segment type %s" % self.sid)
529
+ self.data_offset = fh.tell()
530
+ self._fh = fh
531
+
532
+ def data(self):
533
+ """Read segment data from file and return as \*Segment instance."""
534
+ self._fh.seek(self.data_offset)
535
+ return SEGMENT_ID.get(self.sid, UnknownSegment)(self._fh)
536
+
537
+ def __str__(self):
538
+ return "Segment %s %i of %i" % (
539
+ self.sid, self.used_size, self.allocated_size)
540
+
541
+
542
+ class SegmentNotFoundError(Exception):
543
+ """Exception to indicate that file position doesn't contain Segment."""
544
+ pass
545
+
546
+
547
+ class FileHeaderSegment(object):
548
+ """ZISRAWFILE file header segment data.
549
+
550
+ Contains global file metadata such as file version and GUID.
551
+
552
+ """
553
+ __slots__ = ('version', 'primary_file_guid', 'file_guid',
554
+ 'file_part', 'directory_position', 'metadata_position',
555
+ 'update_pending', 'attachment_directory_position')
556
+
557
+ SID = b'ZISRAWFILE'
558
+
559
+ def __init__(self, fh):
560
+ (major,
561
+ minor,
562
+ reserved1,
563
+ reserved2,
564
+ primary_file_guid,
565
+ file_guid,
566
+ self.file_part,
567
+ self.directory_position,
568
+ self.metadata_position,
569
+ self.update_pending,
570
+ self.attachment_directory_position,
571
+ ) = struct.unpack('<iiii16s16siqqiq', fh.read(80))
572
+ self.version = (major, minor)
573
+ self.update_pending = bool(self.update_pending)
574
+ self.primary_file_guid = uuid.UUID(bytes=primary_file_guid)
575
+ self.file_guid = uuid.UUID(bytes=file_guid)
576
+
577
+ def __str__(self):
578
+ return "FileHeaderSegment\n " + "\n ".join(
579
+ "%s %s" % (name, str(getattr(self, name)))
580
+ for name in FileHeaderSegment.__slots__)
581
+
582
+
583
+ class MetadataSegment(object):
584
+ """ZISRAWMETADATA segment data.
585
+
586
+ Contains global image metadata in UTF-8 encoded XML format.
587
+
588
+ """
589
+ __slots__ = 'xml_size', 'attachment_size', 'xml_offset', '_fh'
590
+
591
+ SID = b'ZISRAWMETADATA'
592
+
593
+ def __init__(self, fh):
594
+ self.xml_size, self.attachment_size = struct.unpack('<ii', fh.read(8))
595
+ fh.seek(248, 1) # spare
596
+ self.xml_offset = fh.tell()
597
+ self._fh = fh
598
+
599
+ def data(self, raw=False):
600
+ """Read XML from file and return as unicode string."""
601
+ self._fh.seek(self.xml_offset)
602
+ data = self._fh.read(self.xml_size)
603
+ if raw:
604
+ return data
605
+ data = data.replace(b'\r\n', b'\n').replace(b'\r', b'\n')
606
+ return unicode(data, 'utf-8')
607
+
608
+ def __str__(self):
609
+ return "MetadataSegment\n %s" % self.data()
610
+
611
+
612
+ class SubBlockSegment(object):
613
+ """ZISRAWSUBBLOCK segment data.
614
+
615
+ Contains XML metadata, optional attachments, and homogenous,
616
+ contiguous pixel data.
617
+
618
+ """
619
+ __slots__ = ('metadata_size', 'attachment_size', 'data_size',
620
+ 'directory_entry', 'data_offset', '_fh')
621
+
622
+ SID = b'ZISRAWSUBBLOCK'
623
+
624
+ def __init__(self, fh):
625
+ (self.metadata_size,
626
+ self.attachment_size,
627
+ self.data_size,
628
+ ) = struct.unpack('<iiq', fh.read(16))
629
+ self.directory_entry = DirectoryEntryDV(fh)
630
+ #fh.seek(max(240 - self.directory_entry.storage_size, 0), 1) # fill
631
+ #self.metadata = unicode(fh.read(self.metadata_size), 'utf-8')
632
+ self.data_offset = fh.tell()
633
+ self.data_offset += max(240 - self.directory_entry.storage_size, 0)
634
+ self.data_offset += self.metadata_size
635
+ self._fh = fh
636
+
637
+ def metadata(self):
638
+ """Read metadata from file and return as XML string."""
639
+ self._fh.seek(self.data_offset - self.metadata_size)
640
+ return unicode(self._fh.read(self.metadata_size), 'utf-8')
641
+
642
+ def data(self, raw=False, bgr2rgb=True, resize=True, order=1):
643
+ """Read image data from file and return as numpy array."""
644
+ self._fh.seek(self.data_offset)
645
+ if raw:
646
+ return self._fh.read(self.data_size)
647
+ elif self.compression:
648
+ if self.compression not in DECOMPRESS:
649
+ raise ValueError("compression unknown or not supported")
650
+ # TODO: test this
651
+ data = self._fh.read(self.data_size)
652
+ data = DECOMPRESS[self.compression](data)
653
+ if self.compression == 2:
654
+ # LZW
655
+ data = numpy.fromstring(data, self.dtype)
656
+ else:
657
+ dtype = numpy.dtype(self.dtype)
658
+ data = self._fh.fromfile(dtype, self.data_size // dtype.itemsize)
659
+
660
+ data = data.reshape(self.stored_shape)
661
+ if self.stored_shape == self.shape or not resize:
662
+ if bgr2rgb and self.stored_shape[-1] in (3, 4):
663
+ tmp = data[..., 0].copy()
664
+ data[..., 0] = data[..., 2]
665
+ data[..., 2] = tmp
666
+ return data
667
+
668
+ # sub / supersampling
669
+ factors = [j / i for i, j in zip(self.stored_shape, self.shape)]
670
+ factors = [(1.0 if abs(1.0-f) < 0.0001 else f) for f in factors]
671
+ shape = list(self.stored_shape)
672
+ # remove leading dimensions with factor 1.0 for speed
673
+ for factor in factors:
674
+ if factor != 1.0:
675
+ break
676
+ shape = shape[1:]
677
+ factors = factors[1:]
678
+ data.shape = shape
679
+ # resize RGB components separately for speed
680
+ if shape[-1] in (3, 4) and factors[-1] == 1.0:
681
+ factors = factors[:-1]
682
+ old = data
683
+ data = numpy.empty(self.shape, self.dtype[-2:])
684
+ for i in range(shape[-1]):
685
+ j = {0: 2, 1: 1, 2: 0, 3: 3}[i] if bgr2rgb else i
686
+ data[..., i] = zoom(old[..., j], zoom=factors, order=order)
687
+ else:
688
+ data = zoom(data, zoom=factors, order=order)
689
+
690
+ data.shape = self.shape
691
+ return data
692
+
693
+ def attachments(self):
694
+ """Read optional attachments from file and return as bytes."""
695
+ if self.attachment_size < 1:
696
+ return b''
697
+ self._fh.seek(self.data_offset + self.data_size)
698
+ return self._fh.read(self.attachment_size)
699
+
700
+ def __getattr__(self, name):
701
+ """Directly access DirectoryEntryDV attributes."""
702
+ return getattr(self.directory_entry, name)
703
+
704
+ def __str__(self):
705
+ return "SubBlockSegment\n %s\n %s" % (
706
+ self.metadata(), str(self.directory_entry))
707
+
708
+
709
+ class DirectoryEntryDV(object):
710
+ """Directory Entry - Schema DV."""
711
+
712
+ #__slots__ = ('file_position', 'file_part', 'compression', 'pyramid_type',
713
+ # 'dimension_entries', 'dtype', '_fh')
714
+
715
+ @staticmethod
716
+ def read_file_position(fh):
717
+ """Return file position of associated SubBlock segment."""
718
+ (schema_type,
719
+ file_position,
720
+ dimensions_count,
721
+ ) = struct.unpack('<2s4xq14xi', fh.read(32))
722
+ fh.seek(dimensions_count * 20, 1)
723
+ assert(schema_type == b'DV')
724
+ return file_position
725
+
726
+ def __init__(self, fh):
727
+ (schema_type,
728
+ pixel_type,
729
+ self.file_position,
730
+ self.file_part, # reserved
731
+ self.compression,
732
+ self.pyramid_type, # internal
733
+ reserved1,
734
+ reserved2,
735
+ dimensions_count,
736
+ ) = struct.unpack('<2siqiiBB4si', fh.read(32))
737
+
738
+ if schema_type != b'DV':
739
+ raise ValueError("not a DirectoryEntryDV")
740
+ self.dtype = PIXEL_TYPE[pixel_type]
741
+
742
+ # reverse dimension_entries to match C contiguous data
743
+ self.dimension_entries = list(reversed(
744
+ [DimensionEntryDV1(fh) for _ in range(dimensions_count)]))
745
+ self._fh = fh
746
+
747
+ @lazyattr
748
+ def storage_size(self):
749
+ return 32 + len(self.dimension_entries) * 20
750
+
751
+ @lazyattr
752
+ def pixel_type(self):
753
+ return PIXEL_TYPE[self.dtype]
754
+
755
+ @lazyattr
756
+ def axes(self):
757
+ axes = b''.join(dim.dimension for dim in self.dimension_entries
758
+ if dim.dimension != b'M')
759
+ return axes + b'0'
760
+
761
+ @lazyattr
762
+ def shape(self):
763
+ shape = tuple(dim.size for dim in self.dimension_entries
764
+ if dim.dimension != b'M')
765
+ sampleshape = numpy.dtype(self.dtype).shape
766
+ return shape + (sampleshape if sampleshape else (1,))
767
+
768
+ @lazyattr
769
+ def start(self):
770
+ start = tuple(dim.start for dim in self.dimension_entries
771
+ if dim.dimension != b'M')
772
+ return start + (0,)
773
+
774
+ @lazyattr
775
+ def stored_shape(self):
776
+ shape = tuple(dim.stored_size for dim in self.dimension_entries
777
+ if dim.dimension != b'M')
778
+ sampleshape = numpy.dtype(self.dtype).shape
779
+ return shape + (sampleshape if sampleshape else (1,))
780
+
781
+ @lazyattr
782
+ def mosaic_index(self):
783
+ for dim in self.dimension_entries:
784
+ if dim.dimension == b'M':
785
+ return dim.start
786
+
787
+ def data_segment(self):
788
+ """Read and return SubBlockSegment at file_position."""
789
+ return Segment(self._fh, self.file_position).data()
790
+
791
+ def __str__(self):
792
+ return "DirectoryEntryDV\n %s %s %s %s\n %s" % (
793
+ COMPRESSION.get(self.compression, self.compression),
794
+ self.pixel_type, self.axes, str(self.shape),
795
+ "\n ".join(str(d) for d in self.dimension_entries))
796
+
797
+
798
+ class DimensionEntryDV1(object):
799
+ """Dimension Entry - Schema DV."""
800
+
801
+ __slots__ = 'dimension', 'start', 'size', 'start_coordinate', 'stored_size'
802
+
803
+ def __init__(self, fh):
804
+ (self.dimension,
805
+ self.start,
806
+ self.size,
807
+ self.start_coordinate,
808
+ stored_size
809
+ ) = struct.unpack('<4siifi', fh.read(20))
810
+ self.dimension = stripnull(self.dimension)
811
+ self.stored_size = stored_size if stored_size else self.size
812
+
813
+ def __str__(self):
814
+ return "DimensionEntryDV1 %s %i %i %f %i" % (
815
+ self.dimension, self.start, self.size,
816
+ self.start_coordinate, self.stored_size)
817
+
818
+
819
+ class SubBlockDirectorySegment(object):
820
+ """ZISRAWDIRECTORY segment data.
821
+
822
+ Contains entries of any kind, currently only DirectoryEntryDV.
823
+
824
+ """
825
+ __slots__ = 'entries',
826
+
827
+ SID = b'ZISRAWDIRECTORY'
828
+
829
+ @staticmethod
830
+ def file_positions(fh):
831
+ """Return list of file positions of associated SubBlock segments."""
832
+ entry_count = struct.unpack('<i', fh.read(4))[0]
833
+ fh.seek(124, 1) # reserved
834
+ return tuple(DirectoryEntryDV.read_file_position(fh)
835
+ for _ in range(entry_count))
836
+
837
+ def __init__(self, fh):
838
+ entry_count = struct.unpack('<i', fh.read(4))[0]
839
+ fh.seek(124, 1) # reserved
840
+ self.entries = tuple(DirectoryEntryDV(fh) for _ in range(entry_count))
841
+
842
+ def __len__(self):
843
+ return len(self.entries)
844
+
845
+ def __getitem__(self, key):
846
+ return self.entries[key]
847
+
848
+ def __iter__(self):
849
+ return iter(self.entries)
850
+
851
+ def __str__(self):
852
+ return "SubBlockDirectorySegment\n %s" % (
853
+ "\n ".join(str(e) for e in self.entries))
854
+
855
+
856
+ class AttachmentSegment(object):
857
+ """ZISRAWATTACH segment data.
858
+
859
+ Contains binary or text data as specified in attachment_entry.
860
+
861
+ """
862
+ __slots__ = 'data_size', 'attachment_entry', 'data_offset', '_fh'
863
+
864
+ SID = b'ZISRAWATTACH'
865
+
866
+ def __init__(self, fh):
867
+ self.data_size = struct.unpack('<i', fh.read(4))[0]
868
+ fh.seek(12, 1) # reserved
869
+ self.attachment_entry = AttachmentEntryA1(fh)
870
+ fh.seek(112, 1) # reserved
871
+ self.data_offset = fh.tell()
872
+ self._fh = fh
873
+
874
+ def save(self, filename=None, directory='.'):
875
+ """Save attachment to file in directory."""
876
+ self._fh.seek(self.data_offset)
877
+ if not filename:
878
+ filename = self.attachment_entry.filename
879
+ filename = os.path.join(directory, filename)
880
+ with open(filename, 'wb') as fh:
881
+ fh.write(self._fh.read(self.data_size))
882
+
883
+ def data(self, raw=False):
884
+ """Read embedded file and return content.
885
+
886
+ If 'raw' is False (default), try return content according to
887
+ CONTENT_FILE_TYPE, else return raw bytes.
888
+
889
+ """
890
+ self._fh.seek(self.data_offset)
891
+ cotype = self.attachment_entry.content_file_type
892
+ if not raw and cotype in CONTENT_FILE_TYPE:
893
+ return CONTENT_FILE_TYPE[cotype](self._fh, filesize=self.data_size)
894
+ else:
895
+ return self._fh.read(self.data_size)
896
+
897
+ def __str__(self):
898
+ return "AttachmentSegment\n %s" % self.attachment_entry
899
+
900
+
901
+ class AttachmentEntryA1(object):
902
+ """AttachmentEntry - Schema A1."""
903
+
904
+ __slots__ = ('content_guid', 'content_file_type', 'name',
905
+ 'file_position', '_fh')
906
+
907
+ @staticmethod
908
+ def read_file_position(fh):
909
+ """Return file position of associated Attachment segment."""
910
+ schema_type, file_position = struct.unpack('<2s10xq', fh.read(20))
911
+ fh.seek(108, 1)
912
+ assert(schema_type == b'A1')
913
+ return file_position
914
+
915
+ def __init__(self, fh):
916
+ (shema_type,
917
+ reserved,
918
+ self.file_position,
919
+ file_part, # reserved
920
+ content_guid,
921
+ content_file_type,
922
+ name
923
+ ) = struct.unpack('<2s10sqi16s8s80s', fh.read(128))
924
+
925
+ if shema_type != b'A1':
926
+ raise ValueError("not a AttachmentEntryA1")
927
+ self.content_guid = uuid.UUID(bytes=content_guid)
928
+ self.content_file_type = stripnull(content_file_type)
929
+ self.name = unicode(stripnull(name), 'utf-8')
930
+ self._fh = fh
931
+
932
+ @property
933
+ def filename(self):
934
+ """Return unique file name for attachment."""
935
+ return "%s@%i.%s" % (self.name, self.file_position,
936
+ unicode(self.content_file_type, 'utf-8').lower())
937
+
938
+ def data_segment(self):
939
+ """Read and return AttachmentSegment at file_position."""
940
+ return Segment(self._fh, self.file_position).data()
941
+
942
+ def __str__(self):
943
+ return " ".join(str(i) for i in (
944
+ "AttachmentEntryA1", self.name, self.content_file_type,
945
+ self.content_guid))
946
+
947
+
948
+ class AttachmentDirectorySegment(object):
949
+ """ZISRAWATTDIR segment data. Sequence of AttachmentEntryA1."""
950
+
951
+ __slots__ = 'entries',
952
+
953
+ SID = b'ZISRAWATTDIR'
954
+
955
+ @staticmethod
956
+ def file_positions(fh):
957
+ """Return list of file positions of associated Attachment segments."""
958
+ entry_count = struct.unpack('<i', fh.read(4))[0]
959
+ fh.seek(252, 1)
960
+ return tuple(AttachmentEntryA1.read_file_position(fh)
961
+ for _ in range(entry_count))
962
+
963
+ def __init__(self, fh):
964
+ entry_count = struct.unpack('<i', fh.read(4))[0]
965
+ fh.seek(252, 1)
966
+ self.entries = tuple(AttachmentEntryA1(fh) for _ in range(entry_count))
967
+
968
+ def __len__(self):
969
+ return len(self.entries)
970
+
971
+ def __getitem__(self, key):
972
+ return self.entries[key]
973
+
974
+ def __iter__(self):
975
+ return iter(self.entries)
976
+
977
+ def __str__(self):
978
+ return "AttachmentDirectorySegment\n %s" % (
979
+ "\n ".join(str(i) for i in self.entries))
980
+
981
+
982
+ class DeletedSegment(object):
983
+ """DELETED segment data. Ignore."""
984
+
985
+ __slots__ = ()
986
+
987
+ SID = b'DELETED'
988
+
989
+ def __init__(self, fh):
990
+ pass
991
+
992
+ def __str__(self):
993
+ return "DeletedSegment"
994
+
995
+
996
+ class UnknownSegment(object):
997
+ """Unknown segment data. Ignore."""
998
+
999
+ __slots__ = ()
1000
+
1001
+ def __init__(self, fh):
1002
+ pass
1003
+
1004
+ def __str__(self):
1005
+ return "UnknownSegment"
1006
+
1007
+
1008
+ class TimeStamps(object):
1009
+ """CZTIMS TimeStamps content schema.
1010
+
1011
+ Contains sequence of floting point numbers, i.e. seconds relative
1012
+ to start time of acquisition.
1013
+
1014
+ """
1015
+ __slots__ = 'time_stamps',
1016
+
1017
+ def __init__(self, fh, filesize=None):
1018
+ size, number = struct.unpack('<ii', fh.read(8))
1019
+ self.time_stamps = struct.unpack('<%id' % number, fh.read(8 * number))
1020
+
1021
+ def __len__(self):
1022
+ return len(self.time_stamps)
1023
+
1024
+ def __getitem__(self, key):
1025
+ return self.time_stamps[key]
1026
+
1027
+ def __iter__(self):
1028
+ return iter(self.time_stamps)
1029
+
1030
+ def __str__(self):
1031
+ return str(self.time_stamps)
1032
+
1033
+
1034
+ class FocusPositions(object):
1035
+ """CZFOC FocusPositions content schema.
1036
+
1037
+ Contains sequence of floting point numbers, i.e. micrometers relative
1038
+ to Z start position of acquisition.
1039
+
1040
+ """
1041
+ __slots__ = 'positions',
1042
+
1043
+ def __init__(self, fh, filesize=None):
1044
+ size, number = struct.unpack('<ii', fh.read(8))
1045
+ self.positions = struct.unpack('<%id' % number, fh.read(8 * number))
1046
+
1047
+ def __len__(self):
1048
+ return len(self.positions)
1049
+
1050
+ def __getitem__(self, key):
1051
+ return self.positions[key]
1052
+
1053
+ def __iter__(self):
1054
+ return iter(self.positions)
1055
+
1056
+ def __str__(self):
1057
+ return str(self.positions)
1058
+
1059
+
1060
+ class EventList(object):
1061
+ """CZEVL EventList content schema. Sequence of EventListEntry."""
1062
+
1063
+ __slots__ = 'events',
1064
+
1065
+ def __init__(self, fh, filesize=None):
1066
+ size, number = struct.unpack('<ii', fh.read(8))
1067
+ self.events = [EventListEntry(fh) for _ in range(number)]
1068
+
1069
+ def __len__(self):
1070
+ return len(self.events)
1071
+
1072
+ def __getitem__(self, key):
1073
+ return self.events[key]
1074
+
1075
+ def __iter__(self):
1076
+ return iter(self.events)
1077
+
1078
+ def __str__(self):
1079
+ return "\n ".join(str(event) for event in self.events)
1080
+
1081
+
1082
+ class EventListEntry(object):
1083
+ """EventListEntry content schema."""
1084
+
1085
+ __slots__ = 'time', 'event_type', 'description'
1086
+
1087
+ EV_TYPE = {0: 'MARKER', 1: 'TIME_CHANGE', 2: 'BLEACH_START',
1088
+ 3: 'BLEACH_STOP', 4: 'TRIGGER'}
1089
+
1090
+ def __init__(self, fh):
1091
+ (size,
1092
+ self.time,
1093
+ self.event_type,
1094
+ description_size,
1095
+ ) = struct.unpack('<idii', fh.read(20))
1096
+ description = stripnull(fh.read(description_size))
1097
+ self.description = unicode(description, 'utf-8')
1098
+
1099
+ def __str__(self):
1100
+ return "%s @ %s (%s)" % (EventListEntry.EV_TYPE[self.event_type],
1101
+ self.time, self.description)
1102
+
1103
+
1104
+ class LookupTables(object):
1105
+ """CZLUT LookupTables content schema. Sequence of LookupTableEntry."""
1106
+
1107
+ __slots__ = 'lookup_tables',
1108
+
1109
+ def __init__(self, fh, filesize=None):
1110
+ size, number = struct.unpack('<ii', fh.read(8))
1111
+ self.lookup_tables = [LookupTableEntry(fh) for _ in range(number)]
1112
+
1113
+ def __len__(self):
1114
+ return len(self.lookup_tables)
1115
+
1116
+ def __getitem__(self, key):
1117
+ return self.lookup_tables[key]
1118
+
1119
+ def __iter__(self):
1120
+ return iter(self.lookup_tables)
1121
+
1122
+ def __str__(self):
1123
+ return "LookupTables\n %s" % str(self.lookup_tables)
1124
+
1125
+
1126
+ class LookupTableEntry(object):
1127
+ """LookupTableEntry content schema. Sequence of ComponentEntry."""
1128
+
1129
+ __slots__ = 'identifier', 'components'
1130
+
1131
+ def __init__(self, fh):
1132
+ size, identifier, number = struct.unpack('<i80si', fh.read(88))
1133
+ self.identifier = unicode(stripnull(identifier), 'utf-8')
1134
+ self.components = [ComponentEntry(fh) for _ in range(number)]
1135
+
1136
+ def __len__(self):
1137
+ return len(self.components)
1138
+
1139
+ def __getitem__(self, key):
1140
+ return self.components[key]
1141
+
1142
+ def __iter__(self):
1143
+ return iter(self.components)
1144
+
1145
+ def __str__(self):
1146
+ return "LookupTableEntry\n %s\n %s" % (
1147
+ self.identifier, "\n ".join(str(i) for i in self.components))
1148
+
1149
+
1150
+ class ComponentEntry(object):
1151
+ """ComponentEntry content schema."""
1152
+
1153
+ __slots__ = 'component_type', 'intensity'
1154
+
1155
+ CO_TYPE = {-1: 'RGB', 1: 'RED', 2: 'GREEN', 3: 'BLUE'}
1156
+
1157
+ def __init__(self, fh):
1158
+ size, self.component_type, number = struct.unpack('<iii', fh.read(12))
1159
+ self.intensity = fh.fromfile(dtype='<i2', count=number//2)
1160
+ if self.component_type == -1:
1161
+ self.intensity = self.intensity.reshape(-1, 3)
1162
+
1163
+ def __str__(self):
1164
+ return "ComponentEntry %s %s" % (
1165
+ ComponentEntry.CO_TYPE[self.component_type],
1166
+ str(self.intensity.shape))
1167
+
1168
+
1169
+ def xml_reader(fh, filesize):
1170
+ """Read XML from file and return as xml.ElementTree root Element."""
1171
+ xml = unicode(stripnull(fh.read(filesize)), 'utf-8')
1172
+ return etree.fromstring(xml)
1173
+
1174
+
1175
+ def match_filename(filename):
1176
+ """Return master file name and file part number from CZI file name."""
1177
+ match = re.search(r'(.*?)(?:\((\d+)\))?\.czi$',
1178
+ filename, re.IGNORECASE).groups()
1179
+ name = match[0] + '.czi'
1180
+ part = int(match[1]) if len(match) > 1 else 0
1181
+ return name, part
1182
+
1183
+
1184
+ def decodejxr(data):
1185
+ """Decode JXR data stream into ndarray via temporary file."""
1186
+ fd, filename = tempfile.mkstemp(suffix='.jxr')
1187
+ with os.fdopen(fd, 'wb') as fh:
1188
+ fh.write(data)
1189
+ if isinstance(filename, unicode):
1190
+ filename = filename.encode('ascii')
1191
+ try:
1192
+ out = _czifile.decodejxr(filename)
1193
+ finally:
1194
+ os.remove(filename)
1195
+ return out
1196
+
1197
+
1198
+ def decodejpg(data):
1199
+ """Decode JPG data stream into ndarray."""
1200
+ return _czifile.decodejpg(data, len(data))
1201
+
1202
+
1203
+ # map Segment.sid to data reader
1204
+ SEGMENT_ID = {
1205
+ FileHeaderSegment.SID: FileHeaderSegment,
1206
+ SubBlockDirectorySegment.SID: SubBlockDirectorySegment,
1207
+ SubBlockSegment.SID: SubBlockSegment,
1208
+ MetadataSegment.SID: MetadataSegment,
1209
+ AttachmentSegment.SID: AttachmentSegment,
1210
+ AttachmentDirectorySegment.SID: AttachmentDirectorySegment,
1211
+ DeletedSegment.SID: DeletedSegment,
1212
+ }
1213
+
1214
+ # map AttachmentEntryA1.content_file_type to attachment reader.
1215
+ CONTENT_FILE_TYPE = {
1216
+ b'CZI': CziFile,
1217
+ b'ZISRAW': CziFile,
1218
+ b'CZTIMS': TimeStamps,
1219
+ b'CZEVL': EventList,
1220
+ b'CZLUT': LookupTables,
1221
+ b'CZFOC': FocusPositions,
1222
+ b'CZEXP': xml_reader, # Experiment
1223
+ b'CZHWS': xml_reader, # HardwareSetting
1224
+ b'CZMVM': xml_reader, # MultiviewMicroscopy
1225
+ # b'CZPML': PalMoleculeList, # undocumented
1226
+ # b'ZIP'
1227
+ # b'JPG'
1228
+ }
1229
+
1230
+ # map DirectoryEntryDV.pixeltype to numpy dtypes
1231
+ PIXEL_TYPE = {
1232
+ 0: '<u1', 'Gray8': '<u1', '<u1': 'Gray8',
1233
+ 1: '<u2', 'Gray16': '<u2', '<u2': 'Gray16',
1234
+ 2: '<f4', 'Gray32Float': '<f4', '<f4': 'Gray32Float',
1235
+ 3: '<3u1', 'Bgr24': '<3u1', '<3u1': 'Bgr24',
1236
+ 4: '<3u2', 'Bgr48': '<3u2', '<3u2': 'Bgr48',
1237
+ 8: '<3f4', 'Bgr96Float': '<3f4', '<3f4': 'Bgr96Float',
1238
+ 9: '<4u1', 'Bgra32': '<4u1', '<4u1': 'Bgra32',
1239
+ 10: '<F8', 'Gray64ComplexFloat': '<F8', '<F8': 'Gray64ComplexFloat',
1240
+ 11: '<3F8', 'Bgr192ComplexFloat': '<3F8', '<3F8': 'Bgr192ComplexFloat',
1241
+ 12: '<i4', 'Gray32': '<i4', '<i4': 'Gray32',
1242
+ 13: '<i8', 'Gray64': '<i8', '<i8': 'Gray64',
1243
+ }
1244
+
1245
+
1246
+ # map dimension character to description
1247
+ DIMENSIONS = {
1248
+ b'0': 'Sample', # e.g. RGBA
1249
+ b'X': 'Width',
1250
+ b'Y': 'Height',
1251
+ b'C': 'Channel',
1252
+ b'Z': 'Slice', # depth
1253
+ b'T': 'Time',
1254
+ b'R': 'Rotation',
1255
+ b'S': 'Scene',
1256
+ b'I': 'Illumination', # direction
1257
+ b'B': 'Block', # acquisition
1258
+ b'M': 'Mosaic', # tile
1259
+ b'H': 'Phase',
1260
+ b'V': 'View',
1261
+ }
1262
+
1263
+ # map DirectoryEntryDV.compression to description
1264
+ COMPRESSION = {
1265
+ 0: "Uncompressed",
1266
+ 1: "JpgFile",
1267
+ 2: "LZW",
1268
+ 4: "JpegXrFile",
1269
+ # 100 and up: camera/system specific specific RAW data
1270
+ }
1271
+
1272
+ # map DirectoryEntryDV.compression to decompression function
1273
+ DECOMPRESS = {
1274
+ 0: lambda x: x, # uncompressed
1275
+ 2: decodelzw, # LZW
1276
+ }
1277
+
1278
+ if _have_czifile:
1279
+ DECOMPRESS[1] = decodejpg
1280
+ DECOMPRESS[4] = decodejxr
1281
+
1282
+ if sys.version_info[0] > 2:
1283
+ unicode = str
1284
+ basestring = str, bytes
1285
+
1286
+ if __name__ == "__main__":
1287
+ import doctest
1288
+ numpy.set_printoptions(suppress=True, precision=5)
1289
+ doctest.testmod()