python-microscopy 25.11.20__cp313-cp313-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1278) hide show
  1. PYME/Acquire/ActionManager.py +450 -0
  2. PYME/Acquire/ExecTools.py +235 -0
  3. PYME/Acquire/Hardware/AAOptoelectronics/MDS.py +175 -0
  4. PYME/Acquire/Hardware/AAOptoelectronics/__init__.py +0 -0
  5. PYME/Acquire/Hardware/ARCoptix/__init__.py +0 -0
  6. PYME/Acquire/Hardware/ARCoptix/lcdriver.py +149 -0
  7. PYME/Acquire/Hardware/ARCoptix/lcserver32.py +123 -0
  8. PYME/Acquire/Hardware/AndorIXon/AndorCam.py +1095 -0
  9. PYME/Acquire/Hardware/AndorIXon/AndorControlFrame.py +312 -0
  10. PYME/Acquire/Hardware/AndorIXon/AndorIXon.py +737 -0
  11. PYME/Acquire/Hardware/AndorIXon/__init__.py +27 -0
  12. PYME/Acquire/Hardware/AndorNeo/AndorNeo.py +644 -0
  13. PYME/Acquire/Hardware/AndorNeo/AndorNeoControlFrame.py +161 -0
  14. PYME/Acquire/Hardware/AndorNeo/AndorZyla.py +761 -0
  15. PYME/Acquire/Hardware/AndorNeo/SDK3.py +307 -0
  16. PYME/Acquire/Hardware/AndorNeo/SDK3Cam.py +171 -0
  17. PYME/Acquire/Hardware/AndorNeo/ZylaControlPanel.py +105 -0
  18. PYME/Acquire/Hardware/AndorNeo/__init__.py +22 -0
  19. PYME/Acquire/Hardware/AndorNeo/parseAtdebug.py +46 -0
  20. PYME/Acquire/Hardware/AndorNeo/plotTimings.py +73 -0
  21. PYME/Acquire/Hardware/AndorNeo/testNeo.py +62 -0
  22. PYME/Acquire/Hardware/Camera.py +1199 -0
  23. PYME/Acquire/Hardware/CameraSkeleton.py +642 -0
  24. PYME/Acquire/Hardware/Coherent/OBIS.py +147 -0
  25. PYME/Acquire/Hardware/Coherent/Sapphire.py +162 -0
  26. PYME/Acquire/Hardware/Coherent/__init__.py +0 -0
  27. PYME/Acquire/Hardware/DMDGui.py +198 -0
  28. PYME/Acquire/Hardware/DigiData/DigiData.py +95 -0
  29. PYME/Acquire/Hardware/DigiData/DigiDataClient.py +30 -0
  30. PYME/Acquire/Hardware/DigiData/RemoteDigiData.py +51 -0
  31. PYME/Acquire/Hardware/DigiData/__init__.py +24 -0
  32. PYME/Acquire/Hardware/DigiData/axDD132x.py +348 -0
  33. PYME/Acquire/Hardware/EMCCDTheory.py +41 -0
  34. PYME/Acquire/Hardware/ExciterWheel.py +167 -0
  35. PYME/Acquire/Hardware/FilterWheel.py +184 -0
  36. PYME/Acquire/Hardware/FocCorr.py +106 -0
  37. PYME/Acquire/Hardware/FocCorrR.py +196 -0
  38. PYME/Acquire/Hardware/FrFilter.py +51 -0
  39. PYME/Acquire/Hardware/GCS/GCS_DLL.py +370 -0
  40. PYME/Acquire/Hardware/GCS/__init__.py +0 -0
  41. PYME/Acquire/Hardware/GCS/gcs.py +210 -0
  42. PYME/Acquire/Hardware/HamamatsuDCAM/HamamatsuDCAM.py +662 -0
  43. PYME/Acquire/Hardware/HamamatsuDCAM/HamamatsuORCA.py +602 -0
  44. PYME/Acquire/Hardware/HamamatsuDCAM/Hamamatsu_control_panel.py +54 -0
  45. PYME/Acquire/Hardware/HamamatsuDCAM/__init__.py +23 -0
  46. PYME/Acquire/Hardware/LaserControlFrame.py +160 -0
  47. PYME/Acquire/Hardware/MPBCommunications/MPBCW.py +132 -0
  48. PYME/Acquire/Hardware/MPBCommunications/__init__.py +0 -0
  49. PYME/Acquire/Hardware/Mercury/Mercury.py +269 -0
  50. PYME/Acquire/Hardware/Mercury/PI_Mercury_GCS_DLL.py +857 -0
  51. PYME/Acquire/Hardware/Mercury/__init__.py +22 -0
  52. PYME/Acquire/Hardware/Mercury/mercuryStepper.py +203 -0
  53. PYME/Acquire/Hardware/Mercury/mercuryStepperGCS.py +281 -0
  54. PYME/Acquire/Hardware/NikonTE2000.py +68 -0
  55. PYME/Acquire/Hardware/NikonTi.py +214 -0
  56. PYME/Acquire/Hardware/NikonTiGUI.py +81 -0
  57. PYME/Acquire/Hardware/OrielCornerstone.py +125 -0
  58. PYME/Acquire/Hardware/PM100USB.py +51 -0
  59. PYME/Acquire/Hardware/Piezos/__init__.py +22 -0
  60. PYME/Acquire/Hardware/Piezos/base_piezo.py +108 -0
  61. PYME/Acquire/Hardware/Piezos/offsetPiezo.py +162 -0
  62. PYME/Acquire/Hardware/Piezos/offsetPiezoREST.py +308 -0
  63. PYME/Acquire/Hardware/Piezos/piezo_c867.py +486 -0
  64. PYME/Acquire/Hardware/Piezos/piezo_e255.py +68 -0
  65. PYME/Acquire/Hardware/Piezos/piezo_e662.py +61 -0
  66. PYME/Acquire/Hardware/Piezos/piezo_e709.py +434 -0
  67. PYME/Acquire/Hardware/Piezos/piezo_e816.py +452 -0
  68. PYME/Acquire/Hardware/Piezos/piezo_e816_corr.py +70 -0
  69. PYME/Acquire/Hardware/Piezos/piezo_e816_dll.py +518 -0
  70. PYME/Acquire/Hardware/Piezos/piezo_e816b.py +70 -0
  71. PYME/Acquire/Hardware/Piezos/piezo_pipython_gcs.py +560 -0
  72. PYME/Acquire/Hardware/Piezos/piezo_test.py +55 -0
  73. PYME/Acquire/Hardware/Simulator/EmpiricalHist.py +273 -0
  74. PYME/Acquire/Hardware/Simulator/__init__.py +22 -0
  75. PYME/Acquire/Hardware/Simulator/dSimControl.py +961 -0
  76. PYME/Acquire/Hardware/Simulator/fakeCam.py +651 -0
  77. PYME/Acquire/Hardware/Simulator/fakePiezo.py +95 -0
  78. PYME/Acquire/Hardware/Simulator/fluor.py +336 -0
  79. PYME/Acquire/Hardware/Simulator/illuminate.cp313-win_amd64.dll.a +0 -0
  80. PYME/Acquire/Hardware/Simulator/illuminate.cp313-win_amd64.pyd +0 -0
  81. PYME/Acquire/Hardware/Simulator/illuminate.pyx +93 -0
  82. PYME/Acquire/Hardware/Simulator/lasersliders.py +90 -0
  83. PYME/Acquire/Hardware/Simulator/rend_im.py +446 -0
  84. PYME/Acquire/Hardware/Simulator/setup.py +69 -0
  85. PYME/Acquire/Hardware/Simulator/simcontrol.py +348 -0
  86. PYME/Acquire/Hardware/Simulator/simui_wx.py +794 -0
  87. PYME/Acquire/Hardware/Tango/__init__.py +0 -0
  88. PYME/Acquire/Hardware/Tango/marzhauser_tango.py +583 -0
  89. PYME/Acquire/Hardware/TiLightCrafter.py +388 -0
  90. PYME/Acquire/Hardware/__init__.py +22 -0
  91. PYME/Acquire/Hardware/aotf.py +271 -0
  92. PYME/Acquire/Hardware/arclampshutterpanel.py +71 -0
  93. PYME/Acquire/Hardware/cameraSoftwareBuffer.py +215 -0
  94. PYME/Acquire/Hardware/camera_noise.py +270 -0
  95. PYME/Acquire/Hardware/ccdAdjPanel.py +188 -0
  96. PYME/Acquire/Hardware/ccdCalibrator.py +161 -0
  97. PYME/Acquire/Hardware/cobaltLaser.py +108 -0
  98. PYME/Acquire/Hardware/cobaltLaser561.py +94 -0
  99. PYME/Acquire/Hardware/comports.py +26 -0
  100. PYME/Acquire/Hardware/driftTrackGUI.py +488 -0
  101. PYME/Acquire/Hardware/driftTracking.py +595 -0
  102. PYME/Acquire/Hardware/fakeShutters.py +52 -0
  103. PYME/Acquire/Hardware/focusKeys.py +204 -0
  104. PYME/Acquire/Hardware/focus_locks/__init__.py +0 -0
  105. PYME/Acquire/Hardware/focus_locks/reflection_focus_lock.py +684 -0
  106. PYME/Acquire/Hardware/frZStage.py +117 -0
  107. PYME/Acquire/Hardware/fw102.py +38 -0
  108. PYME/Acquire/Hardware/ids_peak_cam.py +561 -0
  109. PYME/Acquire/Hardware/ioslave.py +305 -0
  110. PYME/Acquire/Hardware/lasers.py +292 -0
  111. PYME/Acquire/Hardware/matchboxLaser.py +58 -0
  112. PYME/Acquire/Hardware/microscope_adapter.py +104 -0
  113. PYME/Acquire/Hardware/mpd_picosecond_delayer.py +395 -0
  114. PYME/Acquire/Hardware/multiview.py +287 -0
  115. PYME/Acquire/Hardware/olympusix81.py +59 -0
  116. PYME/Acquire/Hardware/pco/__init__.py +0 -0
  117. PYME/Acquire/Hardware/pco/pco_cam.py +348 -0
  118. PYME/Acquire/Hardware/pco/pco_edge_42_lt.py +34 -0
  119. PYME/Acquire/Hardware/pco/pco_sdk.py +1645 -0
  120. PYME/Acquire/Hardware/pco/pco_sdk_cam.py +518 -0
  121. PYME/Acquire/Hardware/pco/pco_sdk_cam_control_panel.py +54 -0
  122. PYME/Acquire/Hardware/phoxxLaser.py +199 -0
  123. PYME/Acquire/Hardware/phoxxLaserOLD.py +242 -0
  124. PYME/Acquire/Hardware/priorLumen.py +102 -0
  125. PYME/Acquire/Hardware/priorarclampshutter.py +52 -0
  126. PYME/Acquire/Hardware/setup.py +50 -0
  127. PYME/Acquire/Hardware/spacenav.py +148 -0
  128. PYME/Acquire/Hardware/splitter.py +394 -0
  129. PYME/Acquire/Hardware/thorlabsPiezo.py +98 -0
  130. PYME/Acquire/Hardware/thorlabs_cam.py +136 -0
  131. PYME/Acquire/Hardware/thorlabs_mff_flipper.py +400 -0
  132. PYME/Acquire/Hardware/toptica_ibeam.py +51 -0
  133. PYME/Acquire/Hardware/uc480/AndorControlFrame.py +308 -0
  134. PYME/Acquire/Hardware/uc480/__init__.py +27 -0
  135. PYME/Acquire/Hardware/uc480/uCam480.py +695 -0
  136. PYME/Acquire/Hardware/uc480/uc480.py +189 -0
  137. PYME/Acquire/Hardware/uc480/uc480Deprecated.py +87 -0
  138. PYME/Acquire/Hardware/uc480/uc480_h.py +767 -0
  139. PYME/Acquire/Hardware/uc480/uc480_h_gen.py +62 -0
  140. PYME/Acquire/Hardware/uc480/ucCamControlFrame.py +83 -0
  141. PYME/Acquire/Hardware/ueye.py +702 -0
  142. PYME/Acquire/PYMEAcquire.py +186 -0
  143. PYME/Acquire/Protocols/DMDMFM.py +74 -0
  144. PYME/Acquire/Protocols/__init__.py +22 -0
  145. PYME/Acquire/Protocols/darkCalibrate.py +56 -0
  146. PYME/Acquire/Protocols/dual671_470.py +45 -0
  147. PYME/Acquire/Protocols/dual671_488.py +46 -0
  148. PYME/Acquire/Protocols/gainCal.py +53 -0
  149. PYME/Acquire/Protocols/htsms-cal-psf.py +32 -0
  150. PYME/Acquire/Protocols/htsms-cal-registration.py +52 -0
  151. PYME/Acquire/Protocols/htsms-flow.py +29 -0
  152. PYME/Acquire/Protocols/htsms-staggered.py +31 -0
  153. PYME/Acquire/Protocols/htsms-tile.py +68 -0
  154. PYME/Acquire/Protocols/htsms-two-color.py +29 -0
  155. PYME/Acquire/Protocols/htsms-widefield.py +32 -0
  156. PYME/Acquire/Protocols/paint671.py +61 -0
  157. PYME/Acquire/Protocols/photoconversion.py +52 -0
  158. PYME/Acquire/Protocols/photoconversion2.py +55 -0
  159. PYME/Acquire/Protocols/prebleach488.py +70 -0
  160. PYME/Acquire/Protocols/prebleach490.py +69 -0
  161. PYME/Acquire/Protocols/prebleach561.py +72 -0
  162. PYME/Acquire/Protocols/prebleach561NeomEos2.py +70 -0
  163. PYME/Acquire/Protocols/prebleach561NeomEos2ND1.py +70 -0
  164. PYME/Acquire/Protocols/prebleach642.py +70 -0
  165. PYME/Acquire/Protocols/prebleach671.py +69 -0
  166. PYME/Acquire/Protocols/prebleach671ND1.py +58 -0
  167. PYME/Acquire/Protocols/prebleach671ND2.py +57 -0
  168. PYME/Acquire/Protocols/prebleach671Neo.py +69 -0
  169. PYME/Acquire/Protocols/recover671.py +62 -0
  170. PYME/Acquire/Protocols/sequence642_488.py +85 -0
  171. PYME/Acquire/Protocols/sequence642_561.py +87 -0
  172. PYME/Acquire/Protocols/shiftfield.py +198 -0
  173. PYME/Acquire/Protocols/simul488.py +59 -0
  174. PYME/Acquire/Protocols/simul642.py +63 -0
  175. PYME/Acquire/Protocols/simul642HTSMS.py +63 -0
  176. PYME/Acquire/Protocols/simulPA.py +37 -0
  177. PYME/Acquire/Protocols/simulSIM.py +76 -0
  178. PYME/Acquire/Protocols/simulStep.py +62 -0
  179. PYME/Acquire/Protocols/spdscan.py +178 -0
  180. PYME/Acquire/Protocols/standard470.py +45 -0
  181. PYME/Acquire/Protocols/standard488.py +47 -0
  182. PYME/Acquire/Protocols/standard671.py +48 -0
  183. PYME/Acquire/Protocols/standard671_no532.py +47 -0
  184. PYME/Acquire/Protocols/standardArclamp.py +46 -0
  185. PYME/Acquire/Protocols/strip_tile.py +204 -0
  186. PYME/Acquire/Protocols/tile.py +204 -0
  187. PYME/Acquire/Protocols/tile3D.py +192 -0
  188. PYME/Acquire/Protocols/tile671.py +190 -0
  189. PYME/Acquire/Protocols/tile_triggered.py +189 -0
  190. PYME/Acquire/Scripts/init.py +232 -0
  191. PYME/Acquire/Scripts/init_N1_Ti_Exeter_ZIx.py +374 -0
  192. PYME/Acquire/Scripts/init_N2_Ti_Zyla_lasers.py +290 -0
  193. PYME/Acquire/Scripts/init_Neo.py +266 -0
  194. PYME/Acquire/Scripts/init_NeoSim.py +159 -0
  195. PYME/Acquire/Scripts/init_TIRF.py +232 -0
  196. PYME/Acquire/Scripts/init_TIRF_Neo.py +242 -0
  197. PYME/Acquire/Scripts/init_TIRF_NeoO.py +241 -0
  198. PYME/Acquire/Scripts/init_TIRF_onecam.py +233 -0
  199. PYME/Acquire/Scripts/init_Ti.py +257 -0
  200. PYME/Acquire/Scripts/init_UOA_n.py +256 -0
  201. PYME/Acquire/Scripts/init_UOA_n2.py +246 -0
  202. PYME/Acquire/Scripts/init_Y1.py +249 -0
  203. PYME/Acquire/Scripts/init_Zyla.py +260 -0
  204. PYME/Acquire/Scripts/init_drift_tracking.py +80 -0
  205. PYME/Acquire/Scripts/init_emccd_basic.py +277 -0
  206. PYME/Acquire/Scripts/init_htsms.py +277 -0
  207. PYME/Acquire/Scripts/init_htsms_focus_lock.py +132 -0
  208. PYME/Acquire/Scripts/init_micrpi.py +45 -0
  209. PYME/Acquire/Scripts/init_orca.py +70 -0
  210. PYME/Acquire/Scripts/init_pco.py +49 -0
  211. PYME/Acquire/Scripts/init_rev.py +74 -0
  212. PYME/Acquire/Scripts/init_sim100.py +169 -0
  213. PYME/Acquire/Scripts/init_sim103.py +169 -0
  214. PYME/Acquire/Scripts/init_sim2.py +211 -0
  215. PYME/Acquire/Scripts/init_sim50.py +169 -0
  216. PYME/Acquire/Scripts/init_sim75.py +169 -0
  217. PYME/Acquire/Scripts/init_sim_drift_tracking.py +166 -0
  218. PYME/Acquire/Scripts/init_sim_htsms.py +224 -0
  219. PYME/Acquire/Scripts/init_sim_htsms_n.py +233 -0
  220. PYME/Acquire/Scripts/init_sim_main.py +229 -0
  221. PYME/Acquire/Scripts/init_sim_min.py +197 -0
  222. PYME/Acquire/Scripts/init_sim_rem.py +176 -0
  223. PYME/Acquire/Scripts/init_smi1.py +110 -0
  224. PYME/Acquire/Scripts/init_spectro.py +78 -0
  225. PYME/Acquire/Scripts/init_spim.py +116 -0
  226. PYME/Acquire/Scripts/init_thorcam.py +62 -0
  227. PYME/Acquire/Scripts/init_twophoton.py +112 -0
  228. PYME/Acquire/Scripts/init_uc480.py +262 -0
  229. PYME/Acquire/Scripts/init_ueye.py +261 -0
  230. PYME/Acquire/SpoolController.py +958 -0
  231. PYME/Acquire/Utils/MultiPointScanner.py +80 -0
  232. PYME/Acquire/Utils/__init__.py +13 -0
  233. PYME/Acquire/Utils/failsafe.py +157 -0
  234. PYME/Acquire/Utils/fastTiler.py +153 -0
  235. PYME/Acquire/Utils/pointScanner.py +496 -0
  236. PYME/Acquire/Utils/sarcSpacing.py +86 -0
  237. PYME/Acquire/Utils/strip_tiler.py +93 -0
  238. PYME/Acquire/Utils/tiler.py +464 -0
  239. PYME/Acquire/Utils/vibrationAnalysis.py +65 -0
  240. PYME/Acquire/__init__.py +44 -0
  241. PYME/Acquire/acquire_client.py +90 -0
  242. PYME/Acquire/acquire_server.py +316 -0
  243. PYME/Acquire/acquirebase.py +139 -0
  244. PYME/Acquire/acquiremainframe.py +716 -0
  245. PYME/Acquire/acquirewx.py +61 -0
  246. PYME/Acquire/acquisition_base.py +148 -0
  247. PYME/Acquire/actions.py +209 -0
  248. PYME/Acquire/autofocus.py +54 -0
  249. PYME/Acquire/eventLog.py +95 -0
  250. PYME/Acquire/event_loop.py +119 -0
  251. PYME/Acquire/frameWrangler.py +530 -0
  252. PYME/Acquire/htsms/__init__.py +8 -0
  253. PYME/Acquire/htsms/rule_ui.py +970 -0
  254. PYME/Acquire/htsms/rule_ui_v2.py +573 -0
  255. PYME/Acquire/htsms/tweeter.py +222 -0
  256. PYME/Acquire/microscope.py +1050 -0
  257. PYME/Acquire/positionTracker.py +181 -0
  258. PYME/Acquire/protocol.py +299 -0
  259. PYME/Acquire/protocol_acquisition.py +404 -0
  260. PYME/Acquire/sampleInformation.py +591 -0
  261. PYME/Acquire/sampleInformationDjangoDirect.py +446 -0
  262. PYME/Acquire/setup.py +52 -0
  263. PYME/Acquire/stackSettings.py +295 -0
  264. PYME/Acquire/stage_leveling.py +285 -0
  265. PYME/Acquire/ui/AnalysisSettingsUI.py +184 -0
  266. PYME/Acquire/ui/HDFSpoolFrame.py +584 -0
  267. PYME/Acquire/ui/__init__.py +0 -0
  268. PYME/Acquire/ui/actionUI.py +892 -0
  269. PYME/Acquire/ui/focus_lock_gui.py +149 -0
  270. PYME/Acquire/ui/intensity_trace.py +143 -0
  271. PYME/Acquire/ui/intsliders.py +222 -0
  272. PYME/Acquire/ui/lasersliders.py +329 -0
  273. PYME/Acquire/ui/mpd_picosecond_delay_panel.py +69 -0
  274. PYME/Acquire/ui/multiview_select.py +77 -0
  275. PYME/Acquire/ui/positionUI.py +519 -0
  276. PYME/Acquire/ui/preflight.py +58 -0
  277. PYME/Acquire/ui/scanner_panel.py +41 -0
  278. PYME/Acquire/ui/selectCameraPanel.py +46 -0
  279. PYME/Acquire/ui/seqdialog.py +501 -0
  280. PYME/Acquire/ui/splashScreen.py +175 -0
  281. PYME/Acquire/ui/spool_panel.py +830 -0
  282. PYME/Acquire/ui/tile_panel.py +556 -0
  283. PYME/Acquire/ui/tilesettingsui.py +91 -0
  284. PYME/Acquire/ui/voxelSizeDialog.py +149 -0
  285. PYME/Acquire/webui/__init__.py +36 -0
  286. PYME/Acquire/webui/ipy.py +361 -0
  287. PYME/Acquire/webui/static/css/pyme-bootstrap.css +9908 -0
  288. PYME/Acquire/webui/static/css/pymeacquire.css +85 -0
  289. PYME/Acquire/webui/static/js/pymeacquire.js +375 -0
  290. PYME/Acquire/webui/static/js/pzf.js +95 -0
  291. PYME/Acquire/webui/templates/PYMEAcquire.html +232 -0
  292. PYME/Acquire/webui/templates/login.html +84 -0
  293. PYME/Acquire/webui/templates/xtermpage.html +106 -0
  294. PYME/Acquire/xyztc.py +418 -0
  295. PYME/Acquire/zScanner.py +287 -0
  296. PYME/Analysis/BleachProfile/__init__.py +26 -0
  297. PYME/Analysis/BleachProfile/deMod.py +91 -0
  298. PYME/Analysis/BleachProfile/fitRecover.py +90 -0
  299. PYME/Analysis/BleachProfile/intensProf.py +519 -0
  300. PYME/Analysis/BleachProfile/kinModels.py +507 -0
  301. PYME/Analysis/BleachProfile/rawIntensity.py +227 -0
  302. PYME/Analysis/BleachProfile/rollins.py +555 -0
  303. PYME/Analysis/Colocalisation/__init__.py +27 -0
  304. PYME/Analysis/Colocalisation/colocScaleDep.py +126 -0
  305. PYME/Analysis/Colocalisation/correlationCoeffs.py +198 -0
  306. PYME/Analysis/Colocalisation/distColoc.py +110 -0
  307. PYME/Analysis/Colocalisation/edtColoc.py +191 -0
  308. PYME/Analysis/MetaData.py +278 -0
  309. PYME/Analysis/PSFEst/__init__.py +27 -0
  310. PYME/Analysis/PSFEst/dec.py +283 -0
  311. PYME/Analysis/PSFEst/extractImages.py +316 -0
  312. PYME/Analysis/PSFEst/fit_psf_zernikes.py +194 -0
  313. PYME/Analysis/PSFEst/psfQuality.py +225 -0
  314. PYME/Analysis/PSFGen/__init__.py +40 -0
  315. PYME/Analysis/PSFGen/fourier.py +138 -0
  316. PYME/Analysis/PSFGen/fourierHNA.py +1108 -0
  317. PYME/Analysis/PSFGen/fourierHNA2.py +979 -0
  318. PYME/Analysis/PSFGen/genCRBcurves.py +185 -0
  319. PYME/Analysis/PSFGen/nijboer_zernike.py +79 -0
  320. PYME/Analysis/PSFGen/ps_app.cp313-win_amd64.dll.a +0 -0
  321. PYME/Analysis/PSFGen/ps_app.cp313-win_amd64.pyd +0 -0
  322. PYME/Analysis/PSFGen/test_ps_app.py +24 -0
  323. PYME/Analysis/Tracking/__init__.py +3 -0
  324. PYME/Analysis/Tracking/msd.py +57 -0
  325. PYME/Analysis/Tracking/trackUtils.py +528 -0
  326. PYME/Analysis/Tracking/tracking.py +152 -0
  327. PYME/Analysis/__init__.py +30 -0
  328. PYME/Analysis/_fithelpers.py +161 -0
  329. PYME/Analysis/angleFilter.py +287 -0
  330. PYME/Analysis/annealThresh.py +157 -0
  331. PYME/Analysis/autoencoder_classifier.py +45 -0
  332. PYME/Analysis/binAvg.py +144 -0
  333. PYME/Analysis/composite.py +183 -0
  334. PYME/Analysis/cramerRao.py +259 -0
  335. PYME/Analysis/deTile.py +441 -0
  336. PYME/Analysis/density_filter.py +45 -0
  337. PYME/Analysis/distributed_pyramid.py +426 -0
  338. PYME/Analysis/fiducial_matching.py +220 -0
  339. PYME/Analysis/gen_sCMOS_maps.py +355 -0
  340. PYME/Analysis/graphing_filters.py +311 -0
  341. PYME/Analysis/implicitFilter.py +359 -0
  342. PYME/Analysis/keep_pairs.py +69 -0
  343. PYME/Analysis/optic_flow.py +108 -0
  344. PYME/Analysis/piecewise.py +36 -0
  345. PYME/Analysis/piecewiseMapping.py +304 -0
  346. PYME/Analysis/piezo_movement_correction.py +153 -0
  347. PYME/Analysis/points/DeClump/__init__.py +78 -0
  348. PYME/Analysis/points/DeClump/deClump.cp313-win_amd64.dll.a +0 -0
  349. PYME/Analysis/points/DeClump/deClump.cp313-win_amd64.pyd +0 -0
  350. PYME/Analysis/points/DeClump/deClumpGUI.py +87 -0
  351. PYME/Analysis/points/DeClump/pyDeClump.py +284 -0
  352. PYME/Analysis/points/DeClump/testClump.py +40 -0
  353. PYME/Analysis/points/DistHist/__init__.py +25 -0
  354. PYME/Analysis/points/DistHist/distHist.cp313-win_amd64.dll.a +0 -0
  355. PYME/Analysis/points/DistHist/distHist.cp313-win_amd64.pyd +0 -0
  356. PYME/Analysis/points/DistHist/distHistThreaded.py +71 -0
  357. PYME/Analysis/points/DistHist/setup.py +54 -0
  358. PYME/Analysis/points/EdgeDB/__init__.py +24 -0
  359. PYME/Analysis/points/EdgeDB/edgeDB.cp313-win_amd64.dll.a +0 -0
  360. PYME/Analysis/points/EdgeDB/edgeDB.cp313-win_amd64.pyd +0 -0
  361. PYME/Analysis/points/EdgeDB/edgeTest.py +66 -0
  362. PYME/Analysis/points/EdgeDB/edges.py +102 -0
  363. PYME/Analysis/points/EdgeDB/segment.py +75 -0
  364. PYME/Analysis/points/EdgeDB/setup.py +54 -0
  365. PYME/Analysis/points/QuadTree/QTrend.py +232 -0
  366. PYME/Analysis/points/QuadTree/__init__.py +25 -0
  367. PYME/Analysis/points/QuadTree/pointQT.py +227 -0
  368. PYME/Analysis/points/QuadTree/pointQTF.py +254 -0
  369. PYME/Analysis/points/QuadTree/qtUtils.py +36 -0
  370. PYME/Analysis/points/QuadTree/rendQT.py +118 -0
  371. PYME/Analysis/points/SoftRend/__init__.py +24 -0
  372. PYME/Analysis/points/SoftRend/setup.py +61 -0
  373. PYME/Analysis/points/SoftRend/testTetrahedra.py +41 -0
  374. PYME/Analysis/points/SoftRend/triRend.cp313-win_amd64.dll.a +0 -0
  375. PYME/Analysis/points/SoftRend/triRend.cp313-win_amd64.pyd +0 -0
  376. PYME/Analysis/points/__init__.py +3 -0
  377. PYME/Analysis/points/arcfit/__init__.py +1 -0
  378. PYME/Analysis/points/arcfit/arcmf.cp313-win_amd64.dll.a +0 -0
  379. PYME/Analysis/points/arcfit/arcmf.cp313-win_amd64.pyd +0 -0
  380. PYME/Analysis/points/arcfit/setup.py +51 -0
  381. PYME/Analysis/points/astigmatism/__init__.py +0 -0
  382. PYME/Analysis/points/astigmatism/astigTools.py +338 -0
  383. PYME/Analysis/points/astigmatism/astiglookup.cp313-win_amd64.dll.a +0 -0
  384. PYME/Analysis/points/astigmatism/astiglookup.cp313-win_amd64.pyd +0 -0
  385. PYME/Analysis/points/astigmatism/setup.py +54 -0
  386. PYME/Analysis/points/cluster_morphology.py +199 -0
  387. PYME/Analysis/points/coordinate_tools.py +278 -0
  388. PYME/Analysis/points/features/__init__.py +0 -0
  389. PYME/Analysis/points/features/metal.py +46 -0
  390. PYME/Analysis/points/features/shaders/vect_feat_3d.metal +49 -0
  391. PYME/Analysis/points/fiducials.py +142 -0
  392. PYME/Analysis/points/gen3DTriangs.py +796 -0
  393. PYME/Analysis/points/moments.py +143 -0
  394. PYME/Analysis/points/multiview.py +458 -0
  395. PYME/Analysis/points/objectMeasure.py +206 -0
  396. PYME/Analysis/points/qpaint.py +97 -0
  397. PYME/Analysis/points/rings.py +372 -0
  398. PYME/Analysis/points/ripleys.py +427 -0
  399. PYME/Analysis/points/segmentLL.py +134 -0
  400. PYME/Analysis/points/setup.py +56 -0
  401. PYME/Analysis/points/spherical_harmonics.py +909 -0
  402. PYME/Analysis/points/surfit.py +829 -0
  403. PYME/Analysis/points/tCluster.py +75 -0
  404. PYME/Analysis/points/traveling_salesperson/__init__.py +0 -0
  405. PYME/Analysis/points/traveling_salesperson/queue_opt.py +117 -0
  406. PYME/Analysis/points/traveling_salesperson/sectioned_two_opt.py +327 -0
  407. PYME/Analysis/points/traveling_salesperson/setup.py +40 -0
  408. PYME/Analysis/points/traveling_salesperson/sort.py +78 -0
  409. PYME/Analysis/points/traveling_salesperson/two_opt.py +189 -0
  410. PYME/Analysis/points/traveling_salesperson/two_opt_utils.cp313-win_amd64.dll.a +0 -0
  411. PYME/Analysis/points/traveling_salesperson/two_opt_utils.cp313-win_amd64.pyd +0 -0
  412. PYME/Analysis/points/traveling_salesperson/two_opt_utils.pyx +41 -0
  413. PYME/Analysis/points/twoColour.py +572 -0
  414. PYME/Analysis/points/twoColourPlot.py +107 -0
  415. PYME/Analysis/processLogger.py +129 -0
  416. PYME/Analysis/profile_extraction.py +72 -0
  417. PYME/Analysis/setup.py +60 -0
  418. PYME/Analysis/splitting.py +372 -0
  419. PYME/Analysis/svmSegment.py +214 -0
  420. PYME/Analysis/thresholding.py +192 -0
  421. PYME/Analysis/tile_pyramid.py +938 -0
  422. PYME/Analysis/widefieldify.py +54 -0
  423. PYME/DSView/DisplayOptionsPanel.py +503 -0
  424. PYME/DSView/LUT/__init__.py +33 -0
  425. PYME/DSView/LUT/lut.cp313-win_amd64.dll.a +0 -0
  426. PYME/DSView/LUT/lut.cp313-win_amd64.pyd +0 -0
  427. PYME/DSView/LUT/setup.py +54 -0
  428. PYME/DSView/OpenSequenceDialog.py +83 -0
  429. PYME/DSView/OverlaysPanel.py +111 -0
  430. PYME/DSView/__init__.py +32 -0
  431. PYME/DSView/arrayViewPanel.py +1035 -0
  432. PYME/DSView/displayOptions.py +453 -0
  433. PYME/DSView/displaySettingsPanel.py +271 -0
  434. PYME/DSView/dsviewer.py +542 -0
  435. PYME/DSView/eventLogViewer.py +805 -0
  436. PYME/DSView/fitInfo.py +486 -0
  437. PYME/DSView/htmlServe.py +72 -0
  438. PYME/DSView/logparser.py +100 -0
  439. PYME/DSView/modules/LMAnalysis.py +1053 -0
  440. PYME/DSView/modules/LMDisplay.py +194 -0
  441. PYME/DSView/modules/__init__.py +162 -0
  442. PYME/DSView/modules/_base.py +39 -0
  443. PYME/DSView/modules/annotation.py +725 -0
  444. PYME/DSView/modules/arrayView.py +71 -0
  445. PYME/DSView/modules/blobFinding.py +455 -0
  446. PYME/DSView/modules/blobMeasure.py +1093 -0
  447. PYME/DSView/modules/camera_maps.py +38 -0
  448. PYME/DSView/modules/coloc.py +414 -0
  449. PYME/DSView/modules/composite.py +715 -0
  450. PYME/DSView/modules/convnet.py +24 -0
  451. PYME/DSView/modules/cropping.py +133 -0
  452. PYME/DSView/modules/dark_and_flatfield.py +31 -0
  453. PYME/DSView/modules/deconvolution.py +499 -0
  454. PYME/DSView/modules/eventView.py +80 -0
  455. PYME/DSView/modules/extractBlobs.py +46 -0
  456. PYME/DSView/modules/fastGraphPanel.py +85 -0
  457. PYME/DSView/modules/filtering.py +335 -0
  458. PYME/DSView/modules/flowView.py +268 -0
  459. PYME/DSView/modules/fourierRingCorrelation.py +172 -0
  460. PYME/DSView/modules/gl_image_view.py +12 -0
  461. PYME/DSView/modules/graphViewPanel.py +272 -0
  462. PYME/DSView/modules/measure/__init__.py +1 -0
  463. PYME/DSView/modules/measure/filterPan.py +239 -0
  464. PYME/DSView/modules/metadataView.py +28 -0
  465. PYME/DSView/modules/multithreshold.py +98 -0
  466. PYME/DSView/modules/neuroglancer.py +129 -0
  467. PYME/DSView/modules/object_tagging.py +157 -0
  468. PYME/DSView/modules/particleTracking.py +463 -0
  469. PYME/DSView/modules/playback.py +256 -0
  470. PYME/DSView/modules/prebleachExtraction.py +75 -0
  471. PYME/DSView/modules/profileFitting.py +137 -0
  472. PYME/DSView/modules/profilePlotting.py +408 -0
  473. PYME/DSView/modules/projections.py +48 -0
  474. PYME/DSView/modules/psfExtraction.py +570 -0
  475. PYME/DSView/modules/psfGeneration.py +138 -0
  476. PYME/DSView/modules/psfTools.py +661 -0
  477. PYME/DSView/modules/pupilTools.py +204 -0
  478. PYME/DSView/modules/pupilView.py +139 -0
  479. PYME/DSView/modules/recipes.py +266 -0
  480. PYME/DSView/modules/redimension.py +75 -0
  481. PYME/DSView/modules/segmentation.py +192 -0
  482. PYME/DSView/modules/sheetView.py +24 -0
  483. PYME/DSView/modules/shell.py +39 -0
  484. PYME/DSView/modules/shiftfield_estimation.py +433 -0
  485. PYME/DSView/modules/sparkprepare.py +94 -0
  486. PYME/DSView/modules/splitter.py +148 -0
  487. PYME/DSView/modules/synchronise.py +64 -0
  488. PYME/DSView/modules/templates/astigCal.html +42 -0
  489. PYME/DSView/modules/templates/measureView.html +69 -0
  490. PYME/DSView/modules/templates/measureView2.html +48 -0
  491. PYME/DSView/modules/templates/measureView3.html +98 -0
  492. PYME/DSView/modules/templates/trackView.html +139 -0
  493. PYME/DSView/modules/templates/tracksOverview.html +21 -0
  494. PYME/DSView/modules/tiling.py +147 -0
  495. PYME/DSView/modules/unmixing.py +148 -0
  496. PYME/DSView/modules/vis3D.py +320 -0
  497. PYME/DSView/modules/visgui.py +163 -0
  498. PYME/DSView/modules/webview.py +14 -0
  499. PYME/DSView/overlays.py +295 -0
  500. PYME/DSView/scrolledImagePanel.py +188 -0
  501. PYME/DSView/setup.py +53 -0
  502. PYME/DSView/splashScreen.py +158 -0
  503. PYME/DSView/voxSizeDialog.py +84 -0
  504. PYME/Deconv/__init__.py +35 -0
  505. PYME/Deconv/beadGen.py +55 -0
  506. PYME/Deconv/dec.py +659 -0
  507. PYME/Deconv/decTask.py +65 -0
  508. PYME/Deconv/decThread.py +113 -0
  509. PYME/Deconv/dec_test.py +47 -0
  510. PYME/Deconv/deconvDialogs.py +417 -0
  511. PYME/Deconv/fftwWisdom.py +62 -0
  512. PYME/Deconv/richardsonLucy.py +141 -0
  513. PYME/Deconv/richardsonLucyMV.py +151 -0
  514. PYME/Deconv/richardsonLucyMVM.py +218 -0
  515. PYME/Deconv/test_block_dec.py +46 -0
  516. PYME/Deconv/tq_block_dec.py +331 -0
  517. PYME/Deconv/wiener.py +163 -0
  518. PYME/IO/DataSources/AlignDataSource.py +91 -0
  519. PYME/IO/DataSources/ArrayDataSource.py +260 -0
  520. PYME/IO/DataSources/BGSDataSource.py +353 -0
  521. PYME/IO/DataSources/BaseDataSource.py +457 -0
  522. PYME/IO/DataSources/BioformatsDataSource.py +178 -0
  523. PYME/IO/DataSources/BufferedDataSource.py +99 -0
  524. PYME/IO/DataSources/ClusterPZFDataSource.py +124 -0
  525. PYME/IO/DataSources/ConcatenatedDataSource.py +56 -0
  526. PYME/IO/DataSources/CropDataSource.py +243 -0
  527. PYME/IO/DataSources/DcimgDataSource.py +54 -0
  528. PYME/IO/DataSources/ElectronsPerSecondDataSource.py +61 -0
  529. PYME/IO/DataSources/FlatFieldDataSource.py +77 -0
  530. PYME/IO/DataSources/HDFDataSource.py +160 -0
  531. PYME/IO/DataSources/HTTPDataSource.py +80 -0
  532. PYME/IO/DataSources/ImageSeriesDataSource.py +123 -0
  533. PYME/IO/DataSources/MultiviewDataSource.py +99 -0
  534. PYME/IO/DataSources/OBFDataSource.py +67 -0
  535. PYME/IO/DataSources/RandomDataSource.py +23 -0
  536. PYME/IO/DataSources/SupertileDatasource.py +148 -0
  537. PYME/IO/DataSources/TQDataSource.py +41 -0
  538. PYME/IO/DataSources/TiffDataSource.py +193 -0
  539. PYME/IO/DataSources/TileDataSource.py +91 -0
  540. PYME/IO/DataSources/UnsplitDataSource.py +92 -0
  541. PYME/IO/DataSources/__init__.py +59 -0
  542. PYME/IO/FileUtils/IJLut.py +43 -0
  543. PYME/IO/FileUtils/RawToHdf5.py +105 -0
  544. PYME/IO/FileUtils/SPAD.py +54 -0
  545. PYME/IO/FileUtils/TiffSeqToHdf5.py +87 -0
  546. PYME/IO/FileUtils/__init__.py +24 -0
  547. PYME/IO/FileUtils/compHdf.py +39 -0
  548. PYME/IO/FileUtils/fileID.py +246 -0
  549. PYME/IO/FileUtils/fnlGen.py +40 -0
  550. PYME/IO/FileUtils/freeSpace.py +59 -0
  551. PYME/IO/FileUtils/h5-thumbnailer.py +85 -0
  552. PYME/IO/FileUtils/h5ExFrames.py +98 -0
  553. PYME/IO/FileUtils/h5ToTiffSeries.py +50 -0
  554. PYME/IO/FileUtils/h5r-thumbnailer.py +118 -0
  555. PYME/IO/FileUtils/h5rFormatDef.py +99 -0
  556. PYME/IO/FileUtils/h5rToTxt.py +77 -0
  557. PYME/IO/FileUtils/nameUtils.py +300 -0
  558. PYME/IO/FileUtils/obf_support.py +538 -0
  559. PYME/IO/FileUtils/ply.py +147 -0
  560. PYME/IO/FileUtils/readSpeckle.py +78 -0
  561. PYME/IO/FileUtils/readTiff.py +64 -0
  562. PYME/IO/FileUtils/saveTiffStack.py +137 -0
  563. PYME/IO/FileUtils/setup.py +36 -0
  564. PYME/IO/FileUtils/sf-thumbnailer.py +76 -0
  565. PYME/IO/FileUtils/stl.py +44 -0
  566. PYME/IO/FileUtils/thumbnailDatabase.py +104 -0
  567. PYME/IO/HTTPSpooler_v2.py +141 -0
  568. PYME/IO/MetaDataHandler.py +1072 -0
  569. PYME/IO/PZFFormat.py +375 -0
  570. PYME/IO/Spooler.py +279 -0
  571. PYME/IO/__init__.py +12 -0
  572. PYME/IO/acquisition_backends.py +353 -0
  573. PYME/IO/buffer_helpers.cp313-win_amd64.dll.a +0 -0
  574. PYME/IO/buffer_helpers.cp313-win_amd64.pyd +0 -0
  575. PYME/IO/buffer_helpers.pyx +190 -0
  576. PYME/IO/buffers.py +291 -0
  577. PYME/IO/clusterDuplication.py +204 -0
  578. PYME/IO/clusterExport.py +152 -0
  579. PYME/IO/clusterGlob.py +108 -0
  580. PYME/IO/clusterIO.py +1076 -0
  581. PYME/IO/clusterListing.py +232 -0
  582. PYME/IO/clusterResults.py +206 -0
  583. PYME/IO/clusterUpload.py +49 -0
  584. PYME/IO/cluster_directory.py +419 -0
  585. PYME/IO/cluster_streaming.py +216 -0
  586. PYME/IO/compatibility.py +12 -0
  587. PYME/IO/countdir/__init__.py +5 -0
  588. PYME/IO/countdir/setup.py +58 -0
  589. PYME/IO/csv_flavours.py +251 -0
  590. PYME/IO/dataExporter.py +470 -0
  591. PYME/IO/dataWrap.py +108 -0
  592. PYME/IO/dcimg.py +167 -0
  593. PYME/IO/events.py +161 -0
  594. PYME/IO/h5File.py +148 -0
  595. PYME/IO/h5rFile.py +323 -0
  596. PYME/IO/image.py +1447 -0
  597. PYME/IO/load_psf.py +26 -0
  598. PYME/IO/pyme_h5ls.py +58 -0
  599. PYME/IO/ragged.py +138 -0
  600. PYME/IO/rgb_image.py +94 -0
  601. PYME/IO/tabular.py +1338 -0
  602. PYME/IO/testClusterSpooling.py +199 -0
  603. PYME/IO/unifiedIO.py +301 -0
  604. PYME/LMVis/Extras/QPobjectSegment.py +220 -0
  605. PYME/LMVis/Extras/__init__.py +55 -0
  606. PYME/LMVis/Extras/animation.py +359 -0
  607. PYME/LMVis/Extras/annotation.py +78 -0
  608. PYME/LMVis/Extras/clusterAnalysis.py +460 -0
  609. PYME/LMVis/Extras/dockedPanel.py +69 -0
  610. PYME/LMVis/Extras/extra_layers.py +373 -0
  611. PYME/LMVis/Extras/fiducial.py +230 -0
  612. PYME/LMVis/Extras/flagZMotionArtifacts.py +60 -0
  613. PYME/LMVis/Extras/fusionUtils.py +9 -0
  614. PYME/LMVis/Extras/multiColourAnalysis.py +103 -0
  615. PYME/LMVis/Extras/multiviewMapping.py +489 -0
  616. PYME/LMVis/Extras/objectMeasurements.py +246 -0
  617. PYME/LMVis/Extras/particleTracking.py +272 -0
  618. PYME/LMVis/Extras/perFrameVariable.py +77 -0
  619. PYME/LMVis/Extras/photophysics.py +72 -0
  620. PYME/LMVis/Extras/pointSetGeneration.py +232 -0
  621. PYME/LMVis/Extras/pointwiseColoc.py +54 -0
  622. PYME/LMVis/Extras/saved_views.py +125 -0
  623. PYME/LMVis/Extras/scaleBox.py +115 -0
  624. PYME/LMVis/Extras/sequentialSpecies.py +125 -0
  625. PYME/LMVis/Extras/setBGImage.py +74 -0
  626. PYME/LMVis/Extras/shiftmapGenerator.py +138 -0
  627. PYME/LMVis/Extras/showShortcuts.py +69 -0
  628. PYME/LMVis/Extras/snapshot.py +135 -0
  629. PYME/LMVis/Extras/spherical_harmonics.py +98 -0
  630. PYME/LMVis/Extras/subsets.py +15 -0
  631. PYME/LMVis/Extras/surface_fitting.py +52 -0
  632. PYME/LMVis/Extras/temperaturePlot.py +53 -0
  633. PYME/LMVis/Extras/vibration.py +112 -0
  634. PYME/LMVis/VisGUI.py +506 -0
  635. PYME/LMVis/__init__.py +39 -0
  636. PYME/LMVis/colourFilterGUI.py +77 -0
  637. PYME/LMVis/colourPanel.py +491 -0
  638. PYME/LMVis/displayPane.py +462 -0
  639. PYME/LMVis/dyeRatios.py +116 -0
  640. PYME/LMVis/genImageDialog.py +298 -0
  641. PYME/LMVis/gl_offScreenHandler.py +134 -0
  642. PYME/LMVis/gl_render.py +1302 -0
  643. PYME/LMVis/gl_render3D.py +1453 -0
  644. PYME/LMVis/gl_render3D_shaders.py +1213 -0
  645. PYME/LMVis/glcanvas_core.py +1157 -0
  646. PYME/LMVis/imageView.py +752 -0
  647. PYME/LMVis/imageView2.py +372 -0
  648. PYME/LMVis/importTextDialog.py +342 -0
  649. PYME/LMVis/layer_panel.py +231 -0
  650. PYME/LMVis/layers/AxesOverlayLayer.py +126 -0
  651. PYME/LMVis/layers/LUTOverlayLayer.py +346 -0
  652. PYME/LMVis/layers/OverlayLayer.py +46 -0
  653. PYME/LMVis/layers/ScaleBarOverlayLayer.py +97 -0
  654. PYME/LMVis/layers/ScaleBoxOverlayLayer.py +181 -0
  655. PYME/LMVis/layers/SelectionOverlayLayer.py +124 -0
  656. PYME/LMVis/layers/__init__.py +53 -0
  657. PYME/LMVis/layers/base.py +319 -0
  658. PYME/LMVis/layers/image_layer.py +363 -0
  659. PYME/LMVis/layers/labels.py +186 -0
  660. PYME/LMVis/layers/layer_defaults.py +97 -0
  661. PYME/LMVis/layers/mesh.py +378 -0
  662. PYME/LMVis/layers/octree.py +194 -0
  663. PYME/LMVis/layers/pointcloud.py +372 -0
  664. PYME/LMVis/layers/quiver.py +271 -0
  665. PYME/LMVis/layers/text.py +250 -0
  666. PYME/LMVis/layers/tracks.py +309 -0
  667. PYME/LMVis/mv_math.py +78 -0
  668. PYME/LMVis/objectDarkMeasure.py +120 -0
  669. PYME/LMVis/pipeline.py +1227 -0
  670. PYME/LMVis/pipelineView.py +115 -0
  671. PYME/LMVis/pointSettingsPanel.py +135 -0
  672. PYME/LMVis/progGraph.py +59 -0
  673. PYME/LMVis/quadTreeSettings.py +90 -0
  674. PYME/LMVis/rendGauss.py +158 -0
  675. PYME/LMVis/renderers.py +576 -0
  676. PYME/LMVis/sessionpaths.py +136 -0
  677. PYME/LMVis/setup.py +39 -0
  678. PYME/LMVis/setup_exe.py +71 -0
  679. PYME/LMVis/shader_programs/DefaultShaderProgram.py +149 -0
  680. PYME/LMVis/shader_programs/GLProgram.py +119 -0
  681. PYME/LMVis/shader_programs/GouraudShaderProgram.py +157 -0
  682. PYME/LMVis/shader_programs/PointSpriteShaderProgram.py +163 -0
  683. PYME/LMVis/shader_programs/ShaderProgramFactory.py +54 -0
  684. PYME/LMVis/shader_programs/TesselShaderProgram.py +47 -0
  685. PYME/LMVis/shader_programs/WireFrameShaderProgram.py +50 -0
  686. PYME/LMVis/shader_programs/__init__.py +20 -0
  687. PYME/LMVis/shader_programs/oit_compositor.py +23 -0
  688. PYME/LMVis/shader_programs/shader_loader.py +84 -0
  689. PYME/LMVis/shader_programs/shader_program.py +168 -0
  690. PYME/LMVis/shader_programs/shaders/bigflatpoints_fs.glsl +16 -0
  691. PYME/LMVis/shader_programs/shaders/bigpoints_gs.glsl +40 -0
  692. PYME/LMVis/shader_programs/shaders/bigpointsprites_fs.glsl +20 -0
  693. PYME/LMVis/shader_programs/shaders/bigspheres_fs.glsl +53 -0
  694. PYME/LMVis/shader_programs/shaders/compose_fs.glsl +41 -0
  695. PYME/LMVis/shader_programs/shaders/compose_vs.glsl +25 -0
  696. PYME/LMVis/shader_programs/shaders/default_fs.glsl +27 -0
  697. PYME/LMVis/shader_programs/shaders/default_vs.glsl +88 -0
  698. PYME/LMVis/shader_programs/shaders/flatpoints_fs.glsl +27 -0
  699. PYME/LMVis/shader_programs/shaders/gouraud_flatpoints_fs.glsl +30 -0
  700. PYME/LMVis/shader_programs/shaders/gouraud_fs.glsl +26 -0
  701. PYME/LMVis/shader_programs/shaders/gouraud_oit_fs.glsl +68 -0
  702. PYME/LMVis/shader_programs/shaders/gouraud_vs.glsl +135 -0
  703. PYME/LMVis/shader_programs/shaders/image_fs.glsl +60 -0
  704. PYME/LMVis/shader_programs/shaders/image_vs.glsl +79 -0
  705. PYME/LMVis/shader_programs/shaders/phong_fs.glsl +43 -0
  706. PYME/LMVis/shader_programs/shaders/phong_vs.glsl +45 -0
  707. PYME/LMVis/shader_programs/shaders/pointsprites_fs.glsl +33 -0
  708. PYME/LMVis/shader_programs/shaders/pointsprites_vs.glsl +77 -0
  709. PYME/LMVis/shader_programs/shaders/spheres_fs.glsl +102 -0
  710. PYME/LMVis/shader_programs/shaders/tessel_fs.glsl +23 -0
  711. PYME/LMVis/shader_programs/shaders/tessel_vs.glsl +37 -0
  712. PYME/LMVis/shader_programs/shaders/text_fs.glsl +42 -0
  713. PYME/LMVis/shader_programs/shaders/text_vs.glsl +84 -0
  714. PYME/LMVis/shader_programs/shaders/widelines_fs.glsl +19 -0
  715. PYME/LMVis/shader_programs/shaders/widelines_gs.glsl +56 -0
  716. PYME/LMVis/shader_programs/shaders/widelines_vs.glsl +51 -0
  717. PYME/LMVis/statusLog.py +57 -0
  718. PYME/LMVis/triBlobs.py +142 -0
  719. PYME/LMVis/view_clipping_pane.py +429 -0
  720. PYME/LMVis/views.py +275 -0
  721. PYME/LMVis/visCore.py +1005 -0
  722. PYME/LMVis/visHelpers.py +880 -0
  723. PYME/LMVis/visHelpersMin.py +230 -0
  724. PYME/LMVis/workspaceTree.py +238 -0
  725. PYME/__init__.py +22 -0
  726. PYME/cluster/HTTPDataServer.py +1063 -0
  727. PYME/cluster/HTTPRulePusher.py +382 -0
  728. PYME/cluster/HTTPTaskPusher.py +377 -0
  729. PYME/cluster/PYMERuleNodeServer.py +192 -0
  730. PYME/cluster/PYMERuleServer.py +109 -0
  731. PYME/cluster/__init__.py +0 -0
  732. PYME/cluster/clusterUI/accounts/__init__.py +0 -0
  733. PYME/cluster/clusterUI/accounts/admin.py +85 -0
  734. PYME/cluster/clusterUI/accounts/forms.py +8 -0
  735. PYME/cluster/clusterUI/accounts/migrations/0001_initial.py +31 -0
  736. PYME/cluster/clusterUI/accounts/migrations/__init__.py +0 -0
  737. PYME/cluster/clusterUI/accounts/models.py +44 -0
  738. PYME/cluster/clusterUI/accounts/templates/accounts/user_form.html +13 -0
  739. PYME/cluster/clusterUI/accounts/templates/registration/initial_complete.html +6 -0
  740. PYME/cluster/clusterUI/accounts/templates/registration/initial_confirm.html +13 -0
  741. PYME/cluster/clusterUI/accounts/templates/registration/initial_done.html +7 -0
  742. PYME/cluster/clusterUI/accounts/templates/registration/verification.html +2 -0
  743. PYME/cluster/clusterUI/accounts/templates/registration/verification_subject.txt +1 -0
  744. PYME/cluster/clusterUI/accounts/urls.py +19 -0
  745. PYME/cluster/clusterUI/accounts/views.py +36 -0
  746. PYME/cluster/clusterUI/clusterUI/__init__.py +0 -0
  747. PYME/cluster/clusterUI/clusterUI/settings.py +147 -0
  748. PYME/cluster/clusterUI/clusterUI/urls.py +31 -0
  749. PYME/cluster/clusterUI/clusterUI/wsgi.py +16 -0
  750. PYME/cluster/clusterUI/clusterbrowser/__init__.py +0 -0
  751. PYME/cluster/clusterUI/clusterbrowser/admin.py +3 -0
  752. PYME/cluster/clusterUI/clusterbrowser/apps.py +7 -0
  753. PYME/cluster/clusterUI/clusterbrowser/migrations/__init__.py +0 -0
  754. PYME/cluster/clusterUI/clusterbrowser/models.py +5 -0
  755. PYME/cluster/clusterUI/clusterbrowser/templates/base.html +129 -0
  756. PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/dirlisting.html +231 -0
  757. PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/form_new_folder.html +18 -0
  758. PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/form_upload_file.html +17 -0
  759. PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/lightlisting.html +25 -0
  760. PYME/cluster/clusterUI/clusterbrowser/templates/registration/login.html +38 -0
  761. PYME/cluster/clusterUI/clusterbrowser/urls.py +10 -0
  762. PYME/cluster/clusterUI/clusterbrowser/views.py +148 -0
  763. PYME/cluster/clusterUI/clusterstatus/__init__.py +0 -0
  764. PYME/cluster/clusterUI/clusterstatus/admin.py +3 -0
  765. PYME/cluster/clusterUI/clusterstatus/apps.py +7 -0
  766. PYME/cluster/clusterUI/clusterstatus/migrations/__init__.py +0 -0
  767. PYME/cluster/clusterUI/clusterstatus/models.py +5 -0
  768. PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/load_content.html +29 -0
  769. PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/queue_info.html +28 -0
  770. PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/queue_info_content.html +50 -0
  771. PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/status_dash.html +29 -0
  772. PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/status_dash_content.html +90 -0
  773. PYME/cluster/clusterUI/clusterstatus/urls.py +9 -0
  774. PYME/cluster/clusterUI/clusterstatus/views.py +69 -0
  775. PYME/cluster/clusterUI/clusterui_tornado.py +117 -0
  776. PYME/cluster/clusterUI/deploy.py +62 -0
  777. PYME/cluster/clusterUI/localization/__init__.py +0 -0
  778. PYME/cluster/clusterUI/localization/admin.py +3 -0
  779. PYME/cluster/clusterUI/localization/apps.py +7 -0
  780. PYME/cluster/clusterUI/localization/migrations/__init__.py +0 -0
  781. PYME/cluster/clusterUI/localization/models.py +5 -0
  782. PYME/cluster/clusterUI/localization/templates/localization/settings_form.html +67 -0
  783. PYME/cluster/clusterUI/localization/urls.py +10 -0
  784. PYME/cluster/clusterUI/localization/views.py +170 -0
  785. PYME/cluster/clusterUI/manage.py +17 -0
  786. PYME/cluster/clusterUI/recipes/__init__.py +0 -0
  787. PYME/cluster/clusterUI/recipes/admin.py +3 -0
  788. PYME/cluster/clusterUI/recipes/migrations/__init__.py +0 -0
  789. PYME/cluster/clusterUI/recipes/models.py +3 -0
  790. PYME/cluster/clusterUI/recipes/templates/recipes/extra_inputs.html +35 -0
  791. PYME/cluster/clusterUI/recipes/templates/recipes/form_recipe.html +82 -0
  792. PYME/cluster/clusterUI/recipes/templates/recipes/input_list.html +7 -0
  793. PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editor.html +28 -0
  794. PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editor_common.html +46 -0
  795. PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editrun.html +93 -0
  796. PYME/cluster/clusterUI/recipes/templates/recipes/recipe_standalone.html +100 -0
  797. PYME/cluster/clusterUI/recipes/templates/recipes/recipe_template.html +109 -0
  798. PYME/cluster/clusterUI/recipes/urls.py +17 -0
  799. PYME/cluster/clusterUI/recipes/views.py +109 -0
  800. PYME/cluster/cluster_of_one.py +204 -0
  801. PYME/cluster/dataserver_wsgi.py +615 -0
  802. PYME/cluster/distribution.py +71 -0
  803. PYME/cluster/rulenodeserver.py +487 -0
  804. PYME/cluster/rules.py +979 -0
  805. PYME/cluster/ruleserver.py +1106 -0
  806. PYME/cluster/status.py +101 -0
  807. PYME/cluster/taskWorkerHTTP.py +522 -0
  808. PYME/cluster/webdav.py +1102 -0
  809. PYME/config.py +659 -0
  810. PYME/contrib/TextCtrlAutoComplete.py +582 -0
  811. PYME/contrib/__init__.py +7 -0
  812. PYME/contrib/aniso/__init__.py +2 -0
  813. PYME/contrib/aniso/aniso.py +268 -0
  814. PYME/contrib/auiFloatBook.py +94 -0
  815. PYME/contrib/congrid.py +127 -0
  816. PYME/contrib/dispatch/__init__.py +19 -0
  817. PYME/contrib/dispatch/dispatcher.py +289 -0
  818. PYME/contrib/gohlke/__init__.py +1 -0
  819. PYME/contrib/gohlke/_tifffile.cp313-win_amd64.dll.a +0 -0
  820. PYME/contrib/gohlke/_tifffile.cp313-win_amd64.pyd +0 -0
  821. PYME/contrib/gohlke/czifile.py +1289 -0
  822. PYME/contrib/gohlke/fcsfiles.py +514 -0
  823. PYME/contrib/gohlke/setup.py +54 -0
  824. PYME/contrib/gohlke/tifffile.py +3095 -0
  825. PYME/contrib/listctrlMixins.py +896 -0
  826. PYME/contrib/lzw.py +838 -0
  827. PYME/contrib/pad/__init__.py +13 -0
  828. PYME/contrib/pad/info_pad.py +18 -0
  829. PYME/contrib/pad/pad.py +670 -0
  830. PYME/contrib/setup.py +38 -0
  831. PYME/contrib/wxPlotPanel.py +137 -0
  832. PYME/experimental/SimReconstruction.py +49 -0
  833. PYME/experimental/__init__.pxd +0 -0
  834. PYME/experimental/__init__.py +4 -0
  835. PYME/experimental/_octree.cp313-win_amd64.dll.a +0 -0
  836. PYME/experimental/_octree.cp313-win_amd64.pyd +0 -0
  837. PYME/experimental/_octree.pyx +477 -0
  838. PYME/experimental/_treap.cp313-win_amd64.dll.a +0 -0
  839. PYME/experimental/_treap.cp313-win_amd64.pyd +0 -0
  840. PYME/experimental/_treap.pyx +267 -0
  841. PYME/experimental/_triangle_mesh.cp313-win_amd64.dll.a +0 -0
  842. PYME/experimental/_triangle_mesh.cp313-win_amd64.pyd +0 -0
  843. PYME/experimental/_triangle_mesh.pxd +149 -0
  844. PYME/experimental/_triangle_mesh.pyx +2787 -0
  845. PYME/experimental/aqavg.py +40 -0
  846. PYME/experimental/dcimgFileChucker.py +375 -0
  847. PYME/experimental/dcimgSpoolShim.py +174 -0
  848. PYME/experimental/dcimg_chuck_test.py +78 -0
  849. PYME/experimental/dual_marching_cubes.py +801 -0
  850. PYME/experimental/dual_marching_cubes_v2.py +645 -0
  851. PYME/experimental/expectationMaximisation.py +298 -0
  852. PYME/experimental/func_octree.cp313-win_amd64.dll.a +0 -0
  853. PYME/experimental/func_octree.cp313-win_amd64.pyd +0 -0
  854. PYME/experimental/func_octree.pyx +381 -0
  855. PYME/experimental/fusionRadial.py +520 -0
  856. PYME/experimental/fusionUtils.py +522 -0
  857. PYME/experimental/isosurface.py +147 -0
  858. PYME/experimental/labview_spooling_hacks.py +48 -0
  859. PYME/experimental/marching_cubes.py +811 -0
  860. PYME/experimental/marching_tetrahedra.py +343 -0
  861. PYME/experimental/modified_marching_cubes.py +1245 -0
  862. PYME/experimental/music.py +25 -0
  863. PYME/experimental/octree.py +188 -0
  864. PYME/experimental/pSpaceMap.py +34 -0
  865. PYME/experimental/pointFitConfoc.py +112 -0
  866. PYME/experimental/scanner_control.py +107 -0
  867. PYME/experimental/setup.py +109 -0
  868. PYME/experimental/spark.py +31 -0
  869. PYME/experimental/tcHist.py +71 -0
  870. PYME/experimental/treap.py +262 -0
  871. PYME/experimental/triangle_mesh.py +2287 -0
  872. PYME/experimental/triangle_mesh_utils.cp313-win_amd64.dll.a +0 -0
  873. PYME/experimental/triangle_mesh_utils.cp313-win_amd64.pyd +0 -0
  874. PYME/experimental/triangle_utils.py +87 -0
  875. PYME/experimental/triangular_mesh.py +2255 -0
  876. PYME/experimental/zMotionArtifactUtils.py +55 -0
  877. PYME/localization/FitFactories/AstigGaussFitFR.py +175 -0
  878. PYME/localization/FitFactories/AstigGaussGPUFitFR.py +326 -0
  879. PYME/localization/FitFactories/BeadConvolvedAstigGaussFit.py +206 -0
  880. PYME/localization/FitFactories/ChecksumFR.py +82 -0
  881. PYME/localization/FitFactories/ChecksumGPUFR.py +213 -0
  882. PYME/localization/FitFactories/ChecksumMultifitSR.py +86 -0
  883. PYME/localization/FitFactories/ConfocCOIR.py +93 -0
  884. PYME/localization/FitFactories/Dumbell3DFitR.py +193 -0
  885. PYME/localization/FitFactories/DumbellFitR.py +163 -0
  886. PYME/localization/FitFactories/FFBase.py +403 -0
  887. PYME/localization/FitFactories/Gauss3DFitR.py +213 -0
  888. PYME/localization/FitFactories/GaussFitConstrR.py +177 -0
  889. PYME/localization/FitFactories/GaussMultifitLinesR.py +351 -0
  890. PYME/localization/FitFactories/GaussMultifitR.py +326 -0
  891. PYME/localization/FitFactories/GaussMultifitSR.py +373 -0
  892. PYME/localization/FitFactories/InterpFitR.py +236 -0
  893. PYME/localization/FitFactories/InterpFitWFR.py +111 -0
  894. PYME/localization/FitFactories/Interpolators/CSInterpolator.py +148 -0
  895. PYME/localization/FitFactories/Interpolators/CubeSInterpolatorP.py +121 -0
  896. PYME/localization/FitFactories/Interpolators/CubicSplineInterpolator.py +69 -0
  897. PYME/localization/FitFactories/Interpolators/LinearInterpolator.py +135 -0
  898. PYME/localization/FitFactories/Interpolators/LinearPInterpolatorP.py +95 -0
  899. PYME/localization/FitFactories/Interpolators/__init__.py +33 -0
  900. PYME/localization/FitFactories/Interpolators/baseInterpolator.py +202 -0
  901. PYME/localization/FitFactories/LatFitCOIR.py +82 -0
  902. PYME/localization/FitFactories/LatGaussFitFR.py +220 -0
  903. PYME/localization/FitFactories/LatObjFindFR.py +85 -0
  904. PYME/localization/FitFactories/LatPSFFitR.py +142 -0
  905. PYME/localization/FitFactories/MultiviewFitInterpNR.py +400 -0
  906. PYME/localization/FitFactories/PRInterpFitQR.py +192 -0
  907. PYME/localization/FitFactories/PRInterpFitR.py +223 -0
  908. PYME/localization/FitFactories/ROIExtractNR.py +93 -0
  909. PYME/localization/FitFactories/SpecGaussFitFR.py +174 -0
  910. PYME/localization/FitFactories/SplitterFitCOIR.py +142 -0
  911. PYME/localization/FitFactories/SplitterFitFNR.py +312 -0
  912. PYME/localization/FitFactories/SplitterFitFusionR.py +318 -0
  913. PYME/localization/FitFactories/SplitterFitInterpBNR.py +357 -0
  914. PYME/localization/FitFactories/SplitterFitInterpNR.py +343 -0
  915. PYME/localization/FitFactories/SplitterFitScavNR.py +352 -0
  916. PYME/localization/FitFactories/SplitterMultifitSR.py +410 -0
  917. PYME/localization/FitFactories/SplitterObjFindR.py +194 -0
  918. PYME/localization/FitFactories/SplitterROIExtractNR.py +91 -0
  919. PYME/localization/FitFactories/SplitterShiftEstFR.py +230 -0
  920. PYME/localization/FitFactories/__init__.py +103 -0
  921. PYME/localization/FitFactories/fitCommon.py +195 -0
  922. PYME/localization/FitFactories/zEstimators/__init__.py +29 -0
  923. PYME/localization/FitFactories/zEstimators/astigEstimator.py +173 -0
  924. PYME/localization/FitFactories/zEstimators/biplaneEstimator.py +209 -0
  925. PYME/localization/FitFactories/zEstimators/genericDualEstimator.py +232 -0
  926. PYME/localization/FitFactories/zEstimators/genericEstimator.py +224 -0
  927. PYME/localization/FitFactories/zEstimators/priEstimator.py +255 -0
  928. PYME/localization/MetaDataEdit.py +543 -0
  929. PYME/localization/Test/30_9_series_A_1.sf +0 -0
  930. PYME/localization/Test/PRI.md +45 -0
  931. PYME/localization/Test/PRI_qr.md +52 -0
  932. PYME/localization/Test/PRI_r.md +52 -0
  933. PYME/localization/Test/__init__.py +22 -0
  934. PYME/localization/Test/astig.md +50 -0
  935. PYME/localization/Test/astigCOI.md +50 -0
  936. PYME/localization/Test/astig_gauss.md +52 -0
  937. PYME/localization/Test/astig_pe.md +50 -0
  938. PYME/localization/Test/astig_splitter.md +66 -0
  939. PYME/localization/Test/astig_splitterCOI.md +67 -0
  940. PYME/localization/Test/astig_splitterQ.md +66 -0
  941. PYME/localization/Test/astig_theory.md +50 -0
  942. PYME/localization/Test/astig_theory.psf +0 -0
  943. PYME/localization/Test/astig_theory.tif +0 -0
  944. PYME/localization/Test/beads1.psf +0 -0
  945. PYME/localization/Test/beads1.tif +0 -0
  946. PYME/localization/Test/biplane_splitter.md +75 -0
  947. PYME/localization/Test/biplane_splitter2.md +103 -0
  948. PYME/localization/Test/biplane_splitter3.md +115 -0
  949. PYME/localization/Test/defoc.md +48 -0
  950. PYME/localization/Test/dumbell_3d.md +52 -0
  951. PYME/localization/Test/fitTestJig.py +172 -0
  952. PYME/localization/Test/fitTestJigSCMOS.py +487 -0
  953. PYME/localization/Test/fitTestJigWC.py +225 -0
  954. PYME/localization/Test/gauss.md +50 -0
  955. PYME/localization/Test/gaussCOI.md +50 -0
  956. PYME/localization/Test/pri_pe.md +50 -0
  957. PYME/localization/Test/pri_theory.md +51 -0
  958. PYME/localization/Test/pri_theory.psf +0 -0
  959. PYME/localization/Test/pri_theory.tif +0 -0
  960. PYME/localization/Test/psf_astig.psf +0 -0
  961. PYME/localization/Test/psf_astig.tif +0 -0
  962. PYME/localization/Test/psf_astig_bg_d.psf +0 -0
  963. PYME/localization/Test/psf_astig_bg_d.tif +0 -0
  964. PYME/localization/Test/psf_astig_pe.psf +0 -0
  965. PYME/localization/Test/psf_astig_pe.tif +0 -0
  966. PYME/localization/Test/psf_decon.psf +0 -0
  967. PYME/localization/Test/psf_decon.tif +0 -0
  968. PYME/localization/Test/psf_decon_pe.psf +0 -0
  969. PYME/localization/Test/psf_decon_pe.tif +0 -0
  970. PYME/localization/Test/psf_guess.psf +0 -0
  971. PYME/localization/Test/splitter.md +63 -0
  972. PYME/localization/Test/splitter_scav.md +63 -0
  973. PYME/localization/Test/test.psf +0 -0
  974. PYME/localization/Test/test.tif +0 -0
  975. PYME/localization/Test/test_decon.psf +0 -0
  976. PYME/localization/Test/test_decon.tif +0 -0
  977. PYME/localization/Test/test_pe.psf +0 -0
  978. PYME/localization/Test/test_pe.tif +0 -0
  979. PYME/localization/Test/wf_theory.psf +0 -0
  980. PYME/localization/Test/wf_theory2.psf +0 -0
  981. PYME/localization/__init__.py +17 -0
  982. PYME/localization/autopsf/__init__.py +1 -0
  983. PYME/localization/autopsf/autopsf.py +486 -0
  984. PYME/localization/autopsf/roifit.py +310 -0
  985. PYME/localization/cInterp/__init__.py +24 -0
  986. PYME/localization/cInterp/cInterp.cp313-win_amd64.dll.a +0 -0
  987. PYME/localization/cInterp/cInterp.cp313-win_amd64.pyd +0 -0
  988. PYME/localization/cInterp/setup.py +54 -0
  989. PYME/localization/cModels/__init__.py +24 -0
  990. PYME/localization/cModels/gauss_app.cp313-win_amd64.dll.a +0 -0
  991. PYME/localization/cModels/gauss_app.cp313-win_amd64.pyd +0 -0
  992. PYME/localization/ofind.py +444 -0
  993. PYME/localization/ofind3d.py +306 -0
  994. PYME/localization/ofind_nofilt.py +128 -0
  995. PYME/localization/ofind_pri.py +478 -0
  996. PYME/localization/ofind_split.py +399 -0
  997. PYME/localization/ofind_xcorr.py +351 -0
  998. PYME/localization/ofind_xcorr_fw.py +441 -0
  999. PYME/localization/remFitBuf.py +657 -0
  1000. PYME/localization/setup.py +56 -0
  1001. PYME/localization/splitting.py +240 -0
  1002. PYME/localization/twist.py +60 -0
  1003. PYME/misc/TiSettings.py +36 -0
  1004. PYME/misc/TiffImagePlugin.py +838 -0
  1005. PYME/misc/VolProj.py +144 -0
  1006. PYME/misc/__init__.py +25 -0
  1007. PYME/misc/aligned_array.py +10 -0
  1008. PYME/misc/aniso.py +29 -0
  1009. PYME/misc/big_sur_fix.py +20 -0
  1010. PYME/misc/check_for_updates.py +139 -0
  1011. PYME/misc/colormaps.py +199 -0
  1012. PYME/misc/colorsys.py +201 -0
  1013. PYME/misc/computerName.py +33 -0
  1014. PYME/misc/coverslipGeometries.py +60 -0
  1015. PYME/misc/cython_numpy_monkey.py +40 -0
  1016. PYME/misc/depGraph.py +406 -0
  1017. PYME/misc/dirSize.py +31 -0
  1018. PYME/misc/diskCleanup.py +64 -0
  1019. PYME/misc/djangoRecarray.py +57 -0
  1020. PYME/misc/django_widgets.py +27 -0
  1021. PYME/misc/editgrid.py +101 -0
  1022. PYME/misc/eventSpy.py +122 -0
  1023. PYME/misc/exceptions.py +30 -0
  1024. PYME/misc/facsPlot.py +89 -0
  1025. PYME/misc/fbpIcons.py +90 -0
  1026. PYME/misc/fftw_compat.py +28 -0
  1027. PYME/misc/findCycles.py +91 -0
  1028. PYME/misc/fortran_interrupt_defeat.py +43 -0
  1029. PYME/misc/glassModel.py +64 -0
  1030. PYME/misc/hash32.py +41 -0
  1031. PYME/misc/hillcurve.py +88 -0
  1032. PYME/misc/hybrid_ns.py +84 -0
  1033. PYME/misc/kdFit.py +72 -0
  1034. PYME/misc/locate.py +10 -0
  1035. PYME/misc/memUsage.py +65 -0
  1036. PYME/misc/memmap.py +52 -0
  1037. PYME/misc/mock_ctypes.py +28 -0
  1038. PYME/misc/mock_traits.py +59 -0
  1039. PYME/misc/mock_traitsui.py +29 -0
  1040. PYME/misc/pyme_zeroconf.py +287 -0
  1041. PYME/misc/pyro_tracebacks.py +32 -0
  1042. PYME/misc/read_agf.py +605 -0
  1043. PYME/misc/sffake.py +16 -0
  1044. PYME/misc/snells.py +71 -0
  1045. PYME/misc/sqlite_ns.py +132 -0
  1046. PYME/misc/sqlitendarray.py +56 -0
  1047. PYME/misc/taskDef.py +44 -0
  1048. PYME/misc/tempDB.py +56 -0
  1049. PYME/misc/wxThread.py +33 -0
  1050. PYME/misc/zemax.py +259 -0
  1051. PYME/misc/zernike.py +151 -0
  1052. PYME/pyme_warnings.py +70 -0
  1053. PYME/recipes/Recipes/STEDDeconvolution.yaml +14 -0
  1054. PYME/recipes/Recipes/STEDMinistacks.yaml +15 -0
  1055. PYME/recipes/Recipes/STED_COP3.yaml +25 -0
  1056. PYME/recipes/Recipes/blobMeas.yaml +19 -0
  1057. PYME/recipes/Recipes/blobMeas2.yaml +37 -0
  1058. PYME/recipes/Recipes/blobMeasSR.yaml +66 -0
  1059. PYME/recipes/Recipes/coloc.yaml +43 -0
  1060. PYME/recipes/Recipes/coloc_roi_masked.yaml +46 -0
  1061. PYME/recipes/Recipes/multiblob.yaml +38 -0
  1062. PYME/recipes/Recipes/pre_particleTracking.yaml +30 -0
  1063. PYME/recipes/Recipes/segmentAndMeasureLoci.yaml +41 -0
  1064. PYME/recipes/__init__.py +6 -0
  1065. PYME/recipes/acquisition.py +158 -0
  1066. PYME/recipes/bakeshop.py +32 -0
  1067. PYME/recipes/base.py +1393 -0
  1068. PYME/recipes/batchProcess.py +147 -0
  1069. PYME/recipes/filters.py +394 -0
  1070. PYME/recipes/fudges.py +41 -0
  1071. PYME/recipes/graphing.py +108 -0
  1072. PYME/recipes/html_recipe_editor.py +90 -0
  1073. PYME/recipes/localisations.py +1386 -0
  1074. PYME/recipes/machine_learning.py +286 -0
  1075. PYME/recipes/measurement.py +1062 -0
  1076. PYME/recipes/modules.py +50 -0
  1077. PYME/recipes/multiview.py +435 -0
  1078. PYME/recipes/output.py +667 -0
  1079. PYME/recipes/pointcloud.py +510 -0
  1080. PYME/recipes/processing.py +2954 -0
  1081. PYME/recipes/pyramid.py +206 -0
  1082. PYME/recipes/recipe.py +965 -0
  1083. PYME/recipes/recipeGui.py +1029 -0
  1084. PYME/recipes/recipeLayout.py +499 -0
  1085. PYME/recipes/runRecipe.py +140 -0
  1086. PYME/recipes/setup.py +37 -0
  1087. PYME/recipes/simulation.py +91 -0
  1088. PYME/recipes/skfilters.py +143 -0
  1089. PYME/recipes/surface_fitting.py +776 -0
  1090. PYME/recipes/tablefilters.py +275 -0
  1091. PYME/recipes/tracking.py +343 -0
  1092. PYME/recipes/traits.py +157 -0
  1093. PYME/recipes/vertical_recipe_display.py +373 -0
  1094. PYME/resources/__init__.py +23 -0
  1095. PYME/resources/config_template/distributor.yaml +14 -0
  1096. PYME/resources/config_template/nodeserver.yaml +15 -0
  1097. PYME/resources/icons/LUT.png +0 -0
  1098. PYME/resources/icons/YSM_Shield.png +0 -0
  1099. PYME/resources/icons/YSM_logo.png +0 -0
  1100. PYME/resources/icons/arrow.png +0 -0
  1101. PYME/resources/icons/crosshairs.png +0 -0
  1102. PYME/resources/icons/line_select.png +0 -0
  1103. PYME/resources/icons/logo_fmhs.png +0 -0
  1104. PYME/resources/icons/media-playback-pause.png +0 -0
  1105. PYME/resources/icons/media-playback-start.png +0 -0
  1106. PYME/resources/icons/media-skip-backward.png +0 -0
  1107. PYME/resources/icons/media-skip-forward.png +0 -0
  1108. PYME/resources/icons/mesh.png +0 -0
  1109. PYME/resources/icons/mesh.svg +28 -0
  1110. PYME/resources/icons/pmacquire.icns +0 -0
  1111. PYME/resources/icons/pmacquire.ico +0 -0
  1112. PYME/resources/icons/pmanal.icns +0 -0
  1113. PYME/resources/icons/pmanal.ico +0 -0
  1114. PYME/resources/icons/pmvis.icns +0 -0
  1115. PYME/resources/icons/pmvis.ico +0 -0
  1116. PYME/resources/icons/points.png +0 -0
  1117. PYME/resources/icons/points.svg +16 -0
  1118. PYME/resources/icons/pymeLogo.png +0 -0
  1119. PYME/resources/icons/rect_select.png +0 -0
  1120. PYME/resources/icons/squiggle_select.png +0 -0
  1121. PYME/resources/icons/text3800.icns +0 -0
  1122. PYME/resources/icons/text3800.ico +0 -0
  1123. PYME/resources/icons/text3800.png +0 -0
  1124. PYME/resources/icons/text3800.tif +0 -0
  1125. PYME/resources/icons/text5377.icns +0 -0
  1126. PYME/resources/icons/text5377.ico +0 -0
  1127. PYME/resources/icons/text5377.png +0 -0
  1128. PYME/resources/icons/tracks.png +0 -0
  1129. PYME/resources/icons/tracks.svg +19 -0
  1130. PYME/resources/icons/view-front.png +0 -0
  1131. PYME/resources/icons/view-home.png +0 -0
  1132. PYME/resources/icons/view-right.png +0 -0
  1133. PYME/resources/icons/view-top.png +0 -0
  1134. PYME/resources/test_datasets/README.md +8 -0
  1135. PYME/resources/test_datasets/t_im.tif +0 -0
  1136. PYME/resources/test_datasets/test_csv.csv +4282 -0
  1137. PYME/resources/test_datasets/test_hdf.hdf +0 -0
  1138. PYME/resources/web/rule_inline.html +21 -0
  1139. PYME/resources/web/ruleserver.html +75 -0
  1140. PYME/resources/web/static/bootstrap.min.js +7 -0
  1141. PYME/resources/web/static/cluster.css +137 -0
  1142. PYME/resources/web/static/css/bootstrap-theme.css +587 -0
  1143. PYME/resources/web/static/css/bootstrap-theme.min.css +6 -0
  1144. PYME/resources/web/static/css/bootstrap.css +6757 -0
  1145. PYME/resources/web/static/css/bootstrap.min.css +6 -0
  1146. PYME/resources/web/static/css/flat_design_colors_full.css +306 -0
  1147. PYME/resources/web/static/css/recipe_editor.css +106 -0
  1148. PYME/resources/web/static/dashboard.css +106 -0
  1149. PYME/resources/web/static/fileselector.js +77 -0
  1150. PYME/resources/web/static/fonts/glyphicons-halflings-regular.eot +0 -0
  1151. PYME/resources/web/static/fonts/glyphicons-halflings-regular.svg +288 -0
  1152. PYME/resources/web/static/fonts/glyphicons-halflings-regular.ttf +0 -0
  1153. PYME/resources/web/static/fonts/glyphicons-halflings-regular.woff +0 -0
  1154. PYME/resources/web/static/fonts/glyphicons-halflings-regular.woff2 +0 -0
  1155. PYME/resources/web/static/images/osd_flat/LICENSE.txt +116 -0
  1156. PYME/resources/web/static/images/osd_flat/README.md +9 -0
  1157. PYME/resources/web/static/images/osd_flat/fullpage_grouphover.png +0 -0
  1158. PYME/resources/web/static/images/osd_flat/fullpage_hover.png +0 -0
  1159. PYME/resources/web/static/images/osd_flat/fullpage_pressed.png +0 -0
  1160. PYME/resources/web/static/images/osd_flat/fullpage_rest.png +0 -0
  1161. PYME/resources/web/static/images/osd_flat/home_grouphover.png +0 -0
  1162. PYME/resources/web/static/images/osd_flat/home_hover.png +0 -0
  1163. PYME/resources/web/static/images/osd_flat/home_pressed.png +0 -0
  1164. PYME/resources/web/static/images/osd_flat/home_rest.png +0 -0
  1165. PYME/resources/web/static/images/osd_flat/next_grouphover.png +0 -0
  1166. PYME/resources/web/static/images/osd_flat/next_hover.png +0 -0
  1167. PYME/resources/web/static/images/osd_flat/next_pressed.png +0 -0
  1168. PYME/resources/web/static/images/osd_flat/next_rest.png +0 -0
  1169. PYME/resources/web/static/images/osd_flat/previous_grouphover.png +0 -0
  1170. PYME/resources/web/static/images/osd_flat/previous_hover.png +0 -0
  1171. PYME/resources/web/static/images/osd_flat/previous_pressed.png +0 -0
  1172. PYME/resources/web/static/images/osd_flat/previous_rest.png +0 -0
  1173. PYME/resources/web/static/images/osd_flat/rotateleft_grouphover.png +0 -0
  1174. PYME/resources/web/static/images/osd_flat/rotateleft_hover.png +0 -0
  1175. PYME/resources/web/static/images/osd_flat/rotateleft_pressed.png +0 -0
  1176. PYME/resources/web/static/images/osd_flat/rotateleft_rest.png +0 -0
  1177. PYME/resources/web/static/images/osd_flat/rotateright_grouphover.png +0 -0
  1178. PYME/resources/web/static/images/osd_flat/rotateright_hover.png +0 -0
  1179. PYME/resources/web/static/images/osd_flat/rotateright_pressed.png +0 -0
  1180. PYME/resources/web/static/images/osd_flat/rotateright_rest.png +0 -0
  1181. PYME/resources/web/static/images/osd_flat/zoomin_grouphover.png +0 -0
  1182. PYME/resources/web/static/images/osd_flat/zoomin_hover.png +0 -0
  1183. PYME/resources/web/static/images/osd_flat/zoomin_pressed.png +0 -0
  1184. PYME/resources/web/static/images/osd_flat/zoomin_rest.png +0 -0
  1185. PYME/resources/web/static/images/osd_flat/zoomout_grouphover.png +0 -0
  1186. PYME/resources/web/static/images/osd_flat/zoomout_hover.png +0 -0
  1187. PYME/resources/web/static/images/osd_flat/zoomout_pressed.png +0 -0
  1188. PYME/resources/web/static/images/osd_flat/zoomout_rest.png +0 -0
  1189. PYME/resources/web/static/jigna-vue-bare.js +1395 -0
  1190. PYME/resources/web/static/jquery.min.js +2 -0
  1191. PYME/resources/web/static/jstree.min.js +6 -0
  1192. PYME/resources/web/static/openSeadragonGL.js +102 -0
  1193. PYME/resources/web/static/openseadragon-svg-overlay.js +103 -0
  1194. PYME/resources/web/static/openseadragon-viewerinputhook.min.js +6 -0
  1195. PYME/resources/web/static/openseadragon.min.js +9 -0
  1196. PYME/resources/web/static/recipe_editor.js +119 -0
  1197. PYME/resources/web/static/shaders/fragment/lut.glsl +20 -0
  1198. PYME/resources/web/static/shaders/fragment/none.glsl +17 -0
  1199. PYME/resources/web/static/shaders/fragment/outline.glsl +43 -0
  1200. PYME/resources/web/static/shaders/fragment/rect.glsl +7 -0
  1201. PYME/resources/web/static/shaders/fragment/sobel3.glsl +71 -0
  1202. PYME/resources/web/static/shaders/fragment/white.glsl +4 -0
  1203. PYME/resources/web/static/shaders/vertex/rect.glsl +22 -0
  1204. PYME/resources/web/static/shaders/vertex/square.glsl +9 -0
  1205. PYME/resources/web/static/utils.js +3 -0
  1206. PYME/resources/web/static/viaWebGL.js +217 -0
  1207. PYME/setup.py +109 -0
  1208. PYME/setup_exe.py +57 -0
  1209. PYME/simulation/__init__.py +0 -0
  1210. PYME/simulation/locify.py +319 -0
  1211. PYME/simulation/pointsets.py +279 -0
  1212. PYME/simulation/wormlike.py +99 -0
  1213. PYME/simulation/wormlike2.py +198 -0
  1214. PYME/simulation/wormlike3.py +197 -0
  1215. PYME/simulation/wormlike_curled.py +104 -0
  1216. PYME/tileviewer/__init__.py +0 -0
  1217. PYME/tileviewer/templates/roi_list.html +12 -0
  1218. PYME/tileviewer/templates/tileviewer.html +247 -0
  1219. PYME/tileviewer/tileviewer.py +207 -0
  1220. PYME/ui/AUIFrame.py +279 -0
  1221. PYME/ui/MetadataTree.py +469 -0
  1222. PYME/ui/__init__.py +4 -0
  1223. PYME/ui/about_dlg.py +29 -0
  1224. PYME/ui/autoFoldPanel.py +643 -0
  1225. PYME/ui/cascading_layout.py +45 -0
  1226. PYME/ui/crop_dialog.py +145 -0
  1227. PYME/ui/custom_traits_editors.py +508 -0
  1228. PYME/ui/editFilterDialog.py +80 -0
  1229. PYME/ui/editList.py +40 -0
  1230. PYME/ui/fastGraph.py +240 -0
  1231. PYME/ui/filterPane.py +348 -0
  1232. PYME/ui/histLimits.py +543 -0
  1233. PYME/ui/layerFoldPanel.py +232 -0
  1234. PYME/ui/manualFoldPanel.py +870 -0
  1235. PYME/ui/mytimer.py +116 -0
  1236. PYME/ui/patch_traitsui.py +151 -0
  1237. PYME/ui/progress.py +160 -0
  1238. PYME/ui/recArrayView.py +145 -0
  1239. PYME/ui/selection.py +71 -0
  1240. PYME/ui/shell.py +37 -0
  1241. PYME/ui/traitsui_constants.py +91 -0
  1242. PYME/ui/wx_compat.py +43 -0
  1243. PYME/update_version.py +159 -0
  1244. PYME/util/__init__.py +3 -0
  1245. PYME/util/authenticate.py +164 -0
  1246. PYME/util/execfile.py +21 -0
  1247. PYME/util/fProfile/__init__.py +1 -0
  1248. PYME/util/fProfile/convertProfile.py +117 -0
  1249. PYME/util/fProfile/fProfile.py +162 -0
  1250. PYME/util/fProfile/html/404.html +60 -0
  1251. PYME/util/fProfile/html/css/main.css +258 -0
  1252. PYME/util/fProfile/html/css/normalize.css +427 -0
  1253. PYME/util/fProfile/html/css/normalize.min.css +1 -0
  1254. PYME/util/fProfile/html/index.html +64 -0
  1255. PYME/util/fProfile/html/js/main.js +492 -0
  1256. PYME/util/fProfile/html/js/plugins.js +24 -0
  1257. PYME/util/fProfile/html/js/vendor/crossfilter.min.js +1 -0
  1258. PYME/util/fProfile/html/js/vendor/jquery-1.11.2.min.js +4 -0
  1259. PYME/util/fProfile/html/js/vendor/modernizr-2.8.3.min.js +4 -0
  1260. PYME/util/fProfile/html/js/vendor/tinycolor-min.js +4 -0
  1261. PYME/util/fProfile/viewProfile.py +30 -0
  1262. PYME/util/install_dependencies.py +95 -0
  1263. PYME/util/log_verbosity.py +11 -0
  1264. PYME/util/mProfile/__init__.py +1 -0
  1265. PYME/util/mProfile/colorize_db_t.py +297 -0
  1266. PYME/util/mProfile/mProfile.py +164 -0
  1267. PYME/util/mProfile/p.py +101 -0
  1268. PYME/util/mProfile/tProfile.py +165 -0
  1269. PYME/util/pymelauncher.py +47 -0
  1270. PYME/util/shmarray/__init__.py +0 -0
  1271. PYME/util/shmarray/shmTest.py +74 -0
  1272. PYME/util/shmarray/shmarray.py +165 -0
  1273. PYME/util/webframework.py +365 -0
  1274. PYME/version.py +62 -0
  1275. python_microscopy-25.11.20.dist-info/METADATA +68 -0
  1276. python_microscopy-25.11.20.dist-info/RECORD +1278 -0
  1277. python_microscopy-25.11.20.dist-info/WHEEL +4 -0
  1278. python_microscopy-25.11.20.dist-info/entry_points.txt +18 -0
@@ -0,0 +1,1395 @@
1
+ (function (){
2
+
3
+ ///// EventTarget /////////////////////////////////////////////////////////////
4
+ // Copyright (c) 2010 Nicholas C. Zakas. All rights reserved.
5
+ // MIT License
6
+ ///////////////////////////////////////////////////////////////////////////////
7
+
8
+ var EventTarget = function(){
9
+ this._listeners = {};
10
+ };
11
+
12
+ EventTarget.prototype = {
13
+
14
+ constructor: EventTarget,
15
+
16
+ add_listener: function(obj, event_name, listener, thisArg){
17
+ var id = this._to_id(obj);
18
+
19
+ if (this._listeners[id] === undefined){
20
+ this._listeners[id] = {};
21
+ }
22
+
23
+ if (this._listeners[id][event_name] === undefined) {
24
+ this._listeners[id][event_name] = [];
25
+ }
26
+
27
+ this._listeners[id][event_name].push({thisArg: thisArg, listener: listener});
28
+ },
29
+
30
+ fire_event: function(obj, event){
31
+ var id = this._to_id(obj);
32
+
33
+ if (typeof event == "string"){
34
+ event = { name: event };
35
+ }
36
+ if (!event.target){
37
+ event.target = obj;
38
+ }
39
+
40
+ if (!event.name){ //falsy
41
+ throw new Error("Event object missing 'name' property.");
42
+ }
43
+
44
+ if (this._listeners[id] === undefined) {
45
+ return;
46
+ }
47
+
48
+ if (this._listeners[id][event.name] instanceof Array){
49
+ var listeners = this._listeners[id][event.name];
50
+ for (var i=0, len=listeners.length; i < len; i++){
51
+ listener = listeners[i].listener;
52
+ thisArg = listeners[i].thisArg;
53
+ listener.call(thisArg, event);
54
+ }
55
+ }
56
+ },
57
+
58
+ remove_listener: function(obj, event_name, listener){
59
+ var id = this._to_id(obj);
60
+
61
+ if (this._listeners[id][event_name] instanceof Array){
62
+ var listeners = this._listeners[id][event_name];
63
+ for (var i=0, len=listeners.length; i < len; i++){
64
+ if (listeners[i] === listener){
65
+ listeners.splice(i, 1);
66
+ break;
67
+ }
68
+ }
69
+ }
70
+ },
71
+
72
+ //// Private protocol /////////////////////////////////////////////////////
73
+
74
+ _to_id: function(obj){
75
+ if (obj.__id__ !== undefined) {
76
+ return obj.__id__;
77
+ }
78
+ else {
79
+ return obj;
80
+ }
81
+ }
82
+ };
83
+
84
+
85
+ ///////////////////////////////////////////////////////////////////////////////
86
+ // Jigna
87
+ ///////////////////////////////////////////////////////////////////////////////
88
+
89
+ // Namespace for all Jigna-related objects.
90
+ var jigna = new EventTarget();
91
+
92
+ jigna.initialize = function(options) {
93
+ options = options || {};
94
+ this.ready = $.Deferred();
95
+ this.debug = options.debug;
96
+ this.async = options.async;
97
+ this.client = options.async ? new jigna.AsyncClient() : new jigna.Client();
98
+ this.client.initialize();
99
+ return this.ready;
100
+ };
101
+
102
+ jigna.models = {};
103
+
104
+ jigna.add_listener('jigna', 'model_added', function(event){
105
+ var models = event.data;
106
+ for (var model_name in models) {
107
+ jigna.models[model_name] = models[model_name];
108
+ }
109
+
110
+ jigna.fire_event('jigna', 'object_changed');
111
+ });
112
+
113
+ jigna.threaded = function(obj, method_name, args) {
114
+ args = Array.prototype.slice.call(arguments, 2);
115
+ return this.client.call_instance_method_thread(obj.__id__, method_name, args);
116
+ };
117
+
118
+
119
+ ///////////////////////////////////////////////////////////////////////////////
120
+ // Client
121
+ ///////////////////////////////////////////////////////////////////////////////
122
+
123
+ jigna.Client = function() {};
124
+
125
+ jigna.Client.prototype.initialize = function() {
126
+ // jigna.Client protocol.
127
+ this.bridge = this._get_bridge();
128
+
129
+ // Private protocol.
130
+ this._id_to_proxy_map = {};
131
+ this._proxy_factory = this._create_proxy_factory();
132
+
133
+ // Add all of the models being edited
134
+ jigna.add_listener(
135
+ 'jigna',
136
+ 'context_updated',
137
+ function(event){this._add_models(event.data);},
138
+ this
139
+ );
140
+
141
+ // Wait for the bridge to be ready, and when it is ready, update the
142
+ // context so that initial models are added to jigna scope
143
+ var client = this;
144
+ this.bridge.ready.done(function(){
145
+ client.update_context();
146
+ });
147
+ };
148
+
149
+ jigna.Client.prototype.handle_event = function(jsonized_event) {
150
+ /* Handle an event from the server. */
151
+ var event = JSON.parse(jsonized_event);
152
+ jigna.fire_event(event.obj, event);
153
+ };
154
+
155
+ jigna.Client.prototype.on_object_changed = function(event){
156
+ if (jigna.debug) {
157
+ this.print_JS_message('------------on_object_changed--------------');
158
+ this.print_JS_message('object id : ' + event.obj);
159
+ this.print_JS_message('attribute : ' + event.name);
160
+ this.print_JS_message('items event: ' + event.items_event);
161
+ this.print_JS_message('new type : ' + event.data.type);
162
+ this.print_JS_message('new value : ' + event.data.value);
163
+ this.print_JS_message('new info : ' + event.data.info);
164
+ this.print_JS_message('-------------------------------------------');
165
+ }
166
+
167
+ var proxy = this._id_to_proxy_map[event.obj];
168
+
169
+ // If the *contents* of a list/dict have changed then we need to update
170
+ // the associated proxy to reflect the change.
171
+ if (event.items_event) {
172
+ var collection_proxy = this._id_to_proxy_map[event.data.value];
173
+ // The collection proxy can be undefined if on the Python side you
174
+ // have re-initialized a list/dict with the same value that it
175
+ // previously had, e.g.
176
+ //
177
+ // class Person(HasTraits):
178
+ // friends = List([1, 2, 3])
179
+ //
180
+ // fred = Person()
181
+ // fred.friends = [1, 2, 3] # No trait changed event!!
182
+ //
183
+ // This is because even though traits does copy on assignment for
184
+ // lists/dicts (and hence the new list will have a new Id), it fires
185
+ // the trait change events only if it considers the old and new values
186
+ // to be different (ie. if does not compare the identity of the lists).
187
+ //
188
+ // For us(!), it means that we won't have seen the new list before we
189
+ // get an items changed event on it.
190
+ if (collection_proxy === undefined) {
191
+ proxy.__cache__[event.name] = this._create_proxy(
192
+ event.data.type, event.data.value, event.data.info
193
+ );
194
+
195
+ } else {
196
+ this._proxy_factory.update_proxy(
197
+ collection_proxy, event.data.type, event.data.info
198
+ );
199
+ }
200
+
201
+ } else {
202
+ proxy.__cache__[event.name] = this._unmarshal(event.data);
203
+ }
204
+
205
+ // Angular listens to this event and forces a digest cycle which is how it
206
+ // detects changes in its watchers.
207
+ jigna.fire_event('jigna', {name: 'object_changed', object: proxy});
208
+ };
209
+
210
+ jigna.Client.prototype.send_request = function(request) {
211
+ /* Send a request to the server and wait for (and return) the response. */
212
+
213
+ var jsonized_request = JSON.stringify(request);
214
+ var jsonized_response = this.bridge.send_request(jsonized_request);
215
+
216
+ return JSON.parse(jsonized_response).result;
217
+ };
218
+
219
+ // Convenience methods for each kind of request //////////////////////////////
220
+
221
+ jigna.Client.prototype.call_instance_method = function(id, method_name, args) {
222
+ /* Call an instance method */
223
+
224
+ var request = {
225
+ kind : 'call_instance_method',
226
+ id : id,
227
+ method_name : method_name,
228
+ args : this._marshal_all(args)
229
+ };
230
+
231
+ var response = this.send_request(request);
232
+ var result = this._unmarshal(response);
233
+
234
+ return result;
235
+ };
236
+
237
+ jigna.Client.prototype.call_instance_method_thread = function(id, method_name, args) {
238
+ /* Call an instance method in a thread. Useful if the method takes long to
239
+ execute and you don't want to block the UI during that time.*/
240
+
241
+ var request = {
242
+ kind : 'call_instance_method_thread',
243
+ id : id,
244
+ method_name : method_name,
245
+ args : this._marshal_all(args),
246
+ };
247
+
248
+ // the response of a threaded request is a marshalled version of a python
249
+ // future object. We attach 'done' and 'error' handlers on that object to
250
+ // resolve/reject our own deferred.
251
+ var response = this.send_request(request);
252
+ var future_obj = this._unmarshal(response);
253
+
254
+ var deferred = new $.Deferred();
255
+
256
+ jigna.add_listener(future_obj, 'done', function(event){
257
+ deferred.resolve(event.data);
258
+ });
259
+
260
+ jigna.add_listener(future_obj, 'error', function(event){
261
+ deferred.reject(event.data);
262
+ });
263
+
264
+ return deferred.promise();
265
+ };
266
+
267
+ jigna.Client.prototype.get_attribute = function(proxy, attribute) {
268
+ /* Get the specified attribute of the proxy from the server. */
269
+
270
+ var request = this._create_request(proxy, attribute);
271
+
272
+ var response = this.send_request(request);
273
+ var result = this._unmarshal(response);
274
+
275
+ return result;
276
+ };
277
+
278
+ jigna.Client.prototype.print_JS_message = function(message) {
279
+ var request = {
280
+ kind: 'print_JS_message',
281
+ value: message
282
+ };
283
+
284
+ this.send_request(request);
285
+ };
286
+
287
+ jigna.Client.prototype.set_instance_attribute = function(id, attribute_name, value) {
288
+ var request = {
289
+ kind : 'set_instance_attribute',
290
+ id : id,
291
+ attribute_name : attribute_name,
292
+ value : this._marshal(value)
293
+ };
294
+
295
+ this.send_request(request);
296
+ };
297
+
298
+ jigna.Client.prototype.set_item = function(id, index, value) {
299
+ var request = {
300
+ kind : 'set_item',
301
+ id : id,
302
+ index : index,
303
+ value : this._marshal(value)
304
+ };
305
+
306
+ this.send_request(request);
307
+ };
308
+
309
+ jigna.Client.prototype.update_context = function() {
310
+ var request = {kind : 'update_context'};
311
+
312
+ this.send_request(request);
313
+ };
314
+
315
+ // Private protocol //////////////////////////////////////////////////////////
316
+
317
+ jigna.Client.prototype._add_model = function(model_name, id, info) {
318
+ // Create a proxy for the object identified by the Id...
319
+ var proxy = this._create_proxy('instance', id, info);
320
+
321
+ // fire the event to let the UI toolkit know that a new model was added
322
+ var data = {};
323
+ data[model_name] = proxy;
324
+
325
+ jigna.fire_event('jigna', {
326
+ name: 'model_added',
327
+ data: data,
328
+ });
329
+
330
+ return proxy;
331
+ };
332
+
333
+ jigna.Client.prototype._add_models = function(context) {
334
+ var client = this;
335
+ var models = {};
336
+ $.each(context, function(model_name, model) {
337
+ if (jigna.models[model_name] === undefined) {
338
+ proxy = client._add_model(model_name, model.value, model.info);
339
+ models[model_name] = proxy;
340
+ }
341
+ });
342
+
343
+ // Resolve the jigna.ready deferred, at this point the initial set of
344
+ // models are set. For example vue.js can now use these data models to
345
+ // create the initial Vue instance.
346
+ jigna.ready.resolve();
347
+
348
+ return models;
349
+ };
350
+
351
+ jigna.Client.prototype._create_proxy_factory = function() {
352
+ return new jigna.ProxyFactory(this);
353
+ };
354
+
355
+ jigna.Client.prototype._create_proxy = function(type, obj, info) {
356
+ if (type === 'primitive') {
357
+ return obj;
358
+ }
359
+ else {
360
+ var proxy = this._proxy_factory.create_proxy(type, obj, info);
361
+ this._id_to_proxy_map[obj] = proxy;
362
+ return proxy;
363
+ }
364
+ };
365
+
366
+ jigna.Client.prototype._create_request = function(proxy, attribute) {
367
+ /* Create the request object for getting the given attribute of the proxy. */
368
+
369
+ var request;
370
+ if (proxy.__type__ === 'instance') {
371
+ request = {
372
+ kind : 'get_instance_attribute',
373
+ id : proxy.__id__,
374
+ attribute_name : attribute
375
+ };
376
+ }
377
+ else if ((proxy.__type__ === 'list') || (proxy.__type__ === 'dict')) {
378
+ request = {
379
+ kind : 'get_item',
380
+ id : proxy.__id__,
381
+ index : attribute
382
+ };
383
+ }
384
+ return request;
385
+ };
386
+
387
+ jigna.Client.prototype._get_bridge = function() {
388
+ var bridge, qt_bridge;
389
+
390
+ // Are we using the intra-process Qt Bridge...
391
+ qt_bridge = window['qt_bridge'];
392
+ if (qt_bridge !== undefined) {
393
+ bridge = new jigna.QtBridge(this, qt_bridge);
394
+ // ... or the inter-process web bridge?
395
+ } else {
396
+ bridge = new jigna.WebBridge(this);
397
+ }
398
+
399
+ return bridge;
400
+ };
401
+
402
+ jigna.Client.prototype._marshal = function(obj) {
403
+ var type, value;
404
+
405
+ if (obj instanceof jigna.Proxy) {
406
+ type = obj.__type__;
407
+ value = obj.__id__;
408
+
409
+ } else {
410
+ type = 'primitive';
411
+ value = obj;
412
+ }
413
+
414
+ return {'type' : type, 'value' : value};
415
+ };
416
+
417
+ jigna.Client.prototype._marshal_all = function(objs) {
418
+ var index;
419
+
420
+ for (index in objs) {
421
+ objs[index] = this._marshal(objs[index]);
422
+ }
423
+
424
+ // For convenience, as we modify the array in-place.
425
+ return objs;
426
+ };
427
+
428
+ jigna.Client.prototype._unmarshal = function(obj) {
429
+
430
+ if (obj === null) {
431
+ return null;
432
+ }
433
+
434
+ if (obj.type === 'primitive') {
435
+ return obj.value;
436
+
437
+ } else {
438
+ value = this._id_to_proxy_map[obj.value];
439
+ if (value === undefined) {
440
+ return this._create_proxy(obj.type, obj.value, obj.info);
441
+ }
442
+ else {
443
+ return value;
444
+ }
445
+ }
446
+ };
447
+
448
+
449
+ ///////////////////////////////////////////////////////////////////////////////
450
+ // AsyncClient
451
+ ///////////////////////////////////////////////////////////////////////////////
452
+
453
+ // Inherit AsyncClient from Client
454
+ // Source: MDN docs (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create)
455
+ jigna.AsyncClient = function() {};
456
+ jigna.AsyncClient.prototype = Object.create(jigna.Client.prototype);
457
+ jigna.AsyncClient.prototype.constructor = jigna.AsyncClient;
458
+
459
+ jigna.AsyncClient.prototype.send_request = function(request) {
460
+ /* Send a request to the server and wait for (and return) the response. */
461
+
462
+ var jsonized_request = JSON.stringify(request);
463
+
464
+ var deferred = new $.Deferred();
465
+ this.bridge.send_request_async(jsonized_request).done(function(jsonized_response){
466
+ deferred.resolve(JSON.parse(jsonized_response).result);
467
+ });
468
+
469
+ return deferred.promise();
470
+ };
471
+
472
+ jigna.AsyncClient.prototype.call_instance_method = function(id, method_name, args) {
473
+ /* Calls an instance method. Do not use this to call any long running
474
+ methods.
475
+
476
+ Note: Since this is an async client, it won't block the UI even if you
477
+ call a long running method here but the UI updates (progress bars etc)
478
+ won't be available until the server completes running that method.
479
+ */
480
+ var request = {
481
+ kind : 'call_instance_method',
482
+ id : id,
483
+ method_name : method_name,
484
+ args : this._marshal_all(args)
485
+ };
486
+ var client = this;
487
+
488
+ var deferred = new $.Deferred();
489
+ this.send_request(request).done(function(response){
490
+ deferred.resolve(client._unmarshal(response));
491
+ });
492
+
493
+ return deferred.promise();
494
+ };
495
+
496
+ jigna.AsyncClient.prototype.call_instance_method_thread = function(id, method_name, args) {
497
+ /* Calls an instance method in a thread on the server. Use this to call
498
+ any long running method on the server otherwise you won't get any UI
499
+ updates on the client.
500
+ */
501
+ var request = {
502
+ kind : 'call_instance_method_thread',
503
+ id : id,
504
+ method_name : method_name,
505
+ args : this._marshal_all(args),
506
+ };
507
+ var client = this;
508
+
509
+ // Note that this deferred is resolved when the method called in a thread
510
+ // finishes, not when the request to call the method finishes.
511
+ // This is done to make this similar to the sync client so that the users
512
+ // can attach their handlers when the method is done.
513
+ var deferred = new $.Deferred();
514
+
515
+ this.send_request(request).done(function(response){
516
+
517
+ var future_obj = client._unmarshal(response);
518
+ // the response of a threaded request is a marshalled version of a python
519
+ // future object. We attach 'done' and 'error' handlers on that object to
520
+ // resolve/reject our own deferred.
521
+
522
+ jigna.add_listener(future_obj, 'done', function(event){
523
+ deferred.resolve(event.data);
524
+ });
525
+
526
+ jigna.add_listener(future_obj, 'error', function(event){
527
+ deferred.reject(event.data);
528
+ });
529
+
530
+ });
531
+
532
+ return deferred.promise();
533
+ };
534
+
535
+ jigna.AsyncClient.prototype.get_attribute = function(proxy, attribute) {
536
+ /* Get the specified attribute of the proxy from the server. */
537
+ var client = this;
538
+
539
+ // start a new request only if a request for getting that attribute isn't
540
+ // already sent
541
+ if (proxy.__state__[attribute] != 'busy') {
542
+ proxy.__state__[attribute] = 'busy';
543
+
544
+ var request = this._create_request(proxy, attribute);
545
+ this.send_request(request).done(function(response){
546
+ // update the proxy cache
547
+ proxy.__cache__[attribute] = client._unmarshal(response);
548
+
549
+ // fire the object changed event to trigger fresh fetches from
550
+ // the cache
551
+ jigna.fire_event('jigna', {name: 'object_changed', object: proxy});
552
+
553
+ // set the state as free again so that further fetches ask the
554
+ // server again
555
+ proxy.__state__[attribute] = undefined;
556
+
557
+ });
558
+ }
559
+
560
+ return proxy.__cache__[attribute];
561
+ };
562
+
563
+ jigna.AsyncClient.prototype.on_object_changed = function(event){
564
+ if (jigna.debug) {
565
+ this.print_JS_message('------------on_object_changed--------------');
566
+ this.print_JS_message('object id : ' + event.obj);
567
+ this.print_JS_message('attribute : ' + event.name);
568
+ this.print_JS_message('items event: ' + event.items_event);
569
+ this.print_JS_message('new type : ' + event.data.type);
570
+ this.print_JS_message('new value : ' + event.data.value);
571
+ this.print_JS_message('new info : ' + event.data.info);
572
+ this.print_JS_message('-------------------------------------------');
573
+ }
574
+
575
+ var proxy = this._id_to_proxy_map[event.obj];
576
+
577
+ // If the *contents* of a list/dict have changed then we need to update
578
+ // the associated proxy to reflect the change.
579
+ if (event.items_event) {
580
+ var collection_proxy = this._id_to_proxy_map[event.data.value];
581
+ // The collection proxy can be undefined if on the Python side you
582
+ // have re-initialized a list/dict with the same value that it
583
+ // previously had, e.g.
584
+ //
585
+ // class Person(HasTraits):
586
+ // friends = List([1, 2, 3])
587
+ //
588
+ // fred = Person()
589
+ // fred.friends = [1, 2, 3] # No trait changed event!!
590
+ //
591
+ // This is because even though traits does copy on assignment for
592
+ // lists/dicts (and hence the new list will have a new Id), it fires
593
+ // the trait change events only if it considers the old and new values
594
+ // to be different (ie. if does not compare the identity of the lists).
595
+ //
596
+ // For us(!), it means that we won't have seen the new list before we
597
+ // get an items changed event on it.
598
+ if (collection_proxy === undefined) {
599
+ // In the async case, we do not create a new proxy instead we
600
+ // update the id_to_proxy map and update the proxy with the
601
+ // dict/list event info.
602
+ collection_proxy = proxy.__cache__[event.name];
603
+ this._id_to_proxy_map[event.data.value] = collection_proxy;
604
+ }
605
+ this._proxy_factory.update_proxy(
606
+ collection_proxy, event.data.type, event.data.info
607
+ );
608
+
609
+ } else {
610
+ proxy.__cache__[event.name] = this._unmarshal(event.data);
611
+ }
612
+
613
+ // Angular listens to this event and forces a digest cycle which is how it
614
+ // detects changes in its watchers.
615
+ jigna.fire_event('jigna', {name: 'object_changed', object: proxy});
616
+ };
617
+
618
+ // Private protocol //////////////////////////////////////////////////////////
619
+
620
+ jigna.AsyncClient.prototype._create_proxy_factory = function() {
621
+ return new jigna.AsyncProxyFactory(this);
622
+ };
623
+
624
+
625
+ ///////////////////////////////////////////////////////////////////////////////
626
+ // ProxyFactory
627
+ ///////////////////////////////////////////////////////////////////////////////
628
+
629
+ jigna.ProxyFactory = function(client) {
630
+ // Private protocol.
631
+ this._client = client;
632
+
633
+ // We create a constructor for each Python class and then create the
634
+ // actual proxies from those.
635
+ this._type_to_constructor_map = {};
636
+
637
+ // Create a new instance constructor when a "new_type" event is fired.
638
+ jigna.add_listener(
639
+ 'jigna',
640
+ 'new_type',
641
+ function(event){this._create_instance_constructor(event.data);},
642
+ this
643
+ );
644
+
645
+ };
646
+
647
+ jigna.ProxyFactory.prototype.create_proxy = function(type, id, info) {
648
+ /* Create a proxy for the given type, id and value. */
649
+
650
+ var factory_method = this['_create_' + type + '_proxy'];
651
+ if (factory_method === undefined) {
652
+ throw 'cannot create proxy for: ' + type;
653
+ }
654
+
655
+ return factory_method.apply(this, [id, info]);
656
+ };
657
+
658
+ jigna.ProxyFactory.prototype.update_proxy = function(proxy, type, info) {
659
+ /* Update the given proxy.
660
+ *
661
+ * This is only used for list and dict proxies when their items have
662
+ * changed.
663
+ */
664
+
665
+ var factory_method = this['_update_' + type + '_proxy'];
666
+ if (factory_method === undefined) {
667
+ throw 'cannot update proxy for: ' + type;
668
+ }
669
+
670
+ return factory_method.apply(this, [proxy, info]);
671
+ };
672
+
673
+ // Private protocol ////////////////////////////////////////////////////////////
674
+
675
+ // Instance proxy creation /////////////////////////////////////////////////////
676
+
677
+ jigna.ProxyFactory.prototype._add_instance_method = function(proxy, method_name){
678
+ proxy[method_name] = function() {
679
+ // In here, 'this' refers to the proxy!
680
+ var args = Array.prototype.slice.call(arguments);
681
+
682
+ return this.__client__.call_instance_method(
683
+ this.__id__, method_name, args
684
+ );
685
+ };
686
+ };
687
+
688
+ jigna.ProxyFactory.prototype._add_instance_attribute = function(proxy, attribute_name){
689
+ var descriptor, get, set;
690
+
691
+ get = function() {
692
+ // In here, 'this' refers to the proxy!
693
+ var value = this.__cache__[attribute_name];
694
+ if (value === undefined) {
695
+ value = this.__client__.get_attribute(this, attribute_name);
696
+ this.__cache__[attribute_name] = value;
697
+ }
698
+
699
+ return value;
700
+ };
701
+
702
+ set = function(value) {
703
+ // In here, 'this' refers to the proxy!
704
+ //
705
+ // If the proxy is for a 'HasTraits' instance then we don't need
706
+ // to set the cached value here as the value will get updated when
707
+ // we get the corresponding trait event. However, setting the value
708
+ // here means that we can create jigna UIs for non-traits objects - it
709
+ // just means we won't react to external changes to the model(s).
710
+ this.__cache__[attribute_name] = value;
711
+ this.__client__.set_instance_attribute(
712
+ this.__id__, attribute_name, value
713
+ );
714
+ };
715
+
716
+ descriptor = {enumerable:true, get:get, set:set, configurable:true};
717
+ Object.defineProperty(proxy, attribute_name, descriptor);
718
+ };
719
+
720
+ jigna.ProxyFactory.prototype._add_instance_event = function(proxy, event_name){
721
+ var descriptor, set;
722
+
723
+ set = function(value) {
724
+ this.__cache__[event_name] = value;
725
+ this.__client__.set_instance_attribute(
726
+ this.__id__, event_name, value
727
+ );
728
+ };
729
+
730
+ descriptor = {enumerable:false, set:set, configurable: true};
731
+ Object.defineProperty(proxy, event_name, descriptor);
732
+ };
733
+
734
+ jigna.ProxyFactory.prototype._create_instance_constructor = function(info) {
735
+ var constructor = this._type_to_constructor_map[info.type_name];
736
+ if (constructor !== undefined) {
737
+ return constructor;
738
+ }
739
+
740
+ constructor = function(type, id, client) {
741
+ jigna.Proxy.call(this, type, id, client);
742
+
743
+ /* Listen for changes to the object that the proxy is a proxy for! */
744
+ var index;
745
+ var info = this.__info__;
746
+
747
+ for (index in info.attribute_names) {
748
+ jigna.add_listener(
749
+ this,
750
+ info.attribute_names[index],
751
+ client.on_object_changed,
752
+ client
753
+ );
754
+ }
755
+
756
+ for (index in info.event_names) {
757
+ jigna.add_listener(
758
+ this,
759
+ info.event_names[index],
760
+ client.on_object_changed,
761
+ client
762
+ );
763
+ }
764
+ };
765
+
766
+ // This is the standard way to set up protoype inheritance in JS.
767
+ //
768
+ // The line below says "when the function 'constructor' is called via the
769
+ // 'new' operator, then set the prototype of the created object to the
770
+ // given object".
771
+ constructor.prototype = Object.create(jigna.Proxy.prototype);
772
+ constructor.prototype.constructor = constructor;
773
+
774
+ for (index in info.attribute_names) {
775
+ this._add_instance_attribute(
776
+ constructor.prototype, info.attribute_names[index]
777
+ );
778
+ }
779
+
780
+ for (index in info.event_names) {
781
+ this._add_instance_event(
782
+ constructor.prototype, info.event_names[index]
783
+ );
784
+ }
785
+
786
+ for (index in info.method_names) {
787
+ this._add_instance_method(
788
+ constructor.prototype, info.method_names[index]
789
+ );
790
+ }
791
+
792
+ // The info is only sent to us once per type, and so we store it in the
793
+ // prototype so that we can use it in the constructor to get the names
794
+ // of any atttributes and events.
795
+ Object.defineProperty(
796
+ constructor.prototype, '__info__', {value : info}
797
+ );
798
+
799
+ // This property is not actually used by jigna itself. It is only there to
800
+ // make it easy to see what the type of the server-side object is when
801
+ // debugging the JS code in the web inspector.
802
+ Object.defineProperty(
803
+ constructor.prototype, '__type_name__', {value : info.type_name}
804
+ );
805
+
806
+ this._type_to_constructor_map[info.type_name] = constructor;
807
+
808
+ return constructor;
809
+ }
810
+
811
+ jigna.ProxyFactory.prototype._create_instance_proxy = function(id, info) {
812
+ var constructor, proxy;
813
+
814
+ // We create a constructor for each Python class and then create the
815
+ // actual proxies as from those.
816
+ constructor = this._type_to_constructor_map[info.type_name];
817
+ if (constructor === undefined) {
818
+ constructor = this._create_instance_constructor(info);
819
+ }
820
+
821
+ return new constructor('instance', id, this._client);
822
+ };
823
+
824
+ // Dict proxy creation /////////////////////////////////////////////////////////
825
+
826
+ jigna.ProxyFactory.prototype._create_dict_proxy = function(id, info) {
827
+ var proxy = new jigna.Proxy('dict', id, this._client);
828
+ this._populate_dict_proxy(proxy, info);
829
+
830
+ return proxy;
831
+ };
832
+
833
+ jigna.ProxyFactory.prototype._delete_dict_keys = function(proxy) {
834
+ /* Delete all keys of a previously used dict proxy. */
835
+ var index, keys;
836
+
837
+ keys = Object.keys(proxy);
838
+ for (index in keys) {
839
+ delete proxy[keys[index]];
840
+ }
841
+ };
842
+
843
+ jigna.ProxyFactory.prototype._populate_dict_proxy = function(proxy, info) {
844
+ var index;
845
+
846
+ for (index in info.keys) {
847
+ this._add_item_attribute(proxy, info.keys[index]);
848
+ }
849
+ };
850
+
851
+ jigna.ProxyFactory.prototype._update_dict_proxy = function(proxy, info) {
852
+ proxy.__cache__ = {}
853
+ this._delete_dict_keys(proxy);
854
+ this._populate_dict_proxy(proxy, info);
855
+ };
856
+
857
+ // List proxy creation /////////////////////////////////////////////////////////
858
+
859
+ jigna.ProxyFactory.prototype._create_list_proxy = function(id, info) {
860
+ var proxy = new jigna.ListProxy('list', id, this._client);
861
+ this._populate_list_proxy(proxy, info);
862
+
863
+ return proxy;
864
+ };
865
+
866
+ jigna.ProxyFactory.prototype._delete_list_items = function(proxy) {
867
+ /* Delete all items of a previously used list proxy. */
868
+
869
+ for (var index=proxy.length-1; index >= 0; index--) {
870
+ delete proxy[index];
871
+ }
872
+ };
873
+
874
+ jigna.ProxyFactory.prototype._populate_list_proxy = function(proxy, info) {
875
+ /* Populate the items in a list proxy. */
876
+
877
+ for (var index=0; index < info.length; index++) {
878
+ this._add_item_attribute(proxy, index);
879
+ }
880
+
881
+ return proxy;
882
+ };
883
+
884
+ jigna.ProxyFactory.prototype._update_list_proxy = function(proxy, info) {
885
+ /* Update the given proxy.
886
+ *
887
+ * This removes all previous items and then repopulates the proxy with
888
+ * items that reflect the (possibly) new length.
889
+ */
890
+ this._delete_list_items(proxy);
891
+ this._populate_list_proxy(proxy, info);
892
+
893
+ // Get rid of any cached items (items we have already requested from the
894
+ // server-side.
895
+ proxy.__cache__ = []
896
+ };
897
+
898
+ // Common for list and dict proxies ////////////////////////////////////////////
899
+
900
+ jigna.ProxyFactory.prototype._add_item_attribute = function(proxy, index){
901
+ var descriptor, get, set;
902
+
903
+ get = function() {
904
+ // In here, 'this' refers to the proxy!
905
+ var value = this.__cache__[index];
906
+ if (value === undefined) {
907
+ value = this.__client__.get_attribute(this, index);
908
+ this.__cache__[index] = value;
909
+ }
910
+
911
+ return value;
912
+ };
913
+
914
+ set = function(value) {
915
+ // In here, 'this' refers to the proxy!
916
+ this.__cache__[index] = value;
917
+ this.__client__.set_item(this.__id__, index, value);
918
+ };
919
+
920
+ descriptor = {enumerable:true, get:get, set:set, configurable:true};
921
+ Object.defineProperty(proxy, index, descriptor);
922
+ };
923
+
924
+
925
+ /////////////////////////////////////////////////////////////////////////////
926
+ // AsyncProxyFactory
927
+ /////////////////////////////////////////////////////////////////////////////
928
+
929
+ jigna._SavedData = function(data) {
930
+ // Used internally to save marshaled data to unmarshal later.
931
+ this.data = data;
932
+ };
933
+
934
+ jigna.AsyncProxyFactory = function(client) {
935
+ jigna.ProxyFactory.call(this, client);
936
+ };
937
+
938
+ jigna.AsyncProxyFactory.prototype = Object.create(
939
+ jigna.ProxyFactory.prototype
940
+ );
941
+
942
+ jigna.AsyncProxyFactory.prototype.constructor = jigna.AsyncProxyFactory
943
+
944
+ jigna.AsyncProxyFactory.prototype._add_instance_attribute = function(proxy, attribute_name){
945
+ var descriptor, get, set;
946
+
947
+ get = function() {
948
+ // In here, 'this' refers to the proxy!
949
+ var value = this.__cache__[attribute_name];
950
+ if (value === undefined) {
951
+ value = this.__client__.get_attribute(this, attribute_name);
952
+ if (value === undefined) {
953
+ var info = this.__info__;
954
+ if (info && (info.attribute_values !== undefined)) {
955
+ var index = info.attribute_names.indexOf(attribute_name);
956
+ value = this.__client__._unmarshal(
957
+ info.attribute_values[index]
958
+ );
959
+ }
960
+ } else {
961
+ this.__cache__[attribute_name] = value;
962
+ }
963
+ }
964
+
965
+ return value;
966
+ };
967
+
968
+ set = function(value) {
969
+ // In here, 'this' refers to the proxy!
970
+ //
971
+ // If the proxy is for a 'HasTraits' instance then we don't need
972
+ // to set the cached value here as the value will get updated when
973
+ // we get the corresponding trait event. However, setting the value
974
+ // here means that we can create jigna UIs for non-traits objects - it
975
+ // just means we won't react to external changes to the model(s).
976
+ this.__cache__[attribute_name] = value;
977
+ this.__client__.set_instance_attribute(
978
+ this.__id__, attribute_name, value
979
+ );
980
+ };
981
+
982
+ descriptor = {enumerable:true, get:get, set:set, configurable:true};
983
+ Object.defineProperty(proxy, attribute_name, descriptor);
984
+ };
985
+
986
+ jigna.AsyncProxyFactory.prototype._populate_dict_proxy = function(proxy, info) {
987
+ var index, key;
988
+ var values = info.values;
989
+
990
+ for (index=0; index < info.keys.length; index++) {
991
+ key = info.keys[index];
992
+ this._add_item_attribute(proxy, key);
993
+ proxy.__cache__[key] = new jigna._SavedData(values.data[index]);
994
+ }
995
+ };
996
+
997
+ jigna.AsyncProxyFactory.prototype._update_dict_proxy = function(proxy, info) {
998
+ var removed = info.removed;
999
+ var cache = proxy.__cache__;
1000
+ var key;
1001
+
1002
+ // Add the keys in the added.
1003
+ this._populate_dict_proxy(proxy, info.added);
1004
+
1005
+ for (var index=0; index < removed.length; index++) {
1006
+ key = removed[index];
1007
+ delete cache[key];
1008
+ delete proxy[key];
1009
+ }
1010
+ };
1011
+
1012
+ jigna.AsyncProxyFactory.prototype._populate_list_proxy = function(proxy, info) {
1013
+ /* Populate the items in a list proxy. */
1014
+
1015
+ var data = info.data;
1016
+ for (var index=0; index < info.length; index++) {
1017
+ this._add_item_attribute(proxy, index);
1018
+ proxy.__cache__[index] = new jigna._SavedData(data[index]);
1019
+ }
1020
+
1021
+ return proxy;
1022
+ };
1023
+
1024
+ jigna.AsyncProxyFactory.prototype._update_list_proxy = function(proxy, info) {
1025
+ /* Update the given proxy. */
1026
+
1027
+ if (info.index === undefined) {
1028
+ // This is an extended slice. Note that one cannot increase the size
1029
+ // of the list with an extended slice. So one is either deleting
1030
+ // elements or changing them.
1031
+ var index;
1032
+ var added = info.added;
1033
+ var removed = info.removed - added.length;
1034
+ var cache = proxy.__cache__;
1035
+ var end = cache.length;
1036
+ if (removed > 0) {
1037
+ // Delete the proxy indices at the end.
1038
+ for (index=end; index > (end-removed) ; index--) {
1039
+ delete proxy[index-1];
1040
+ }
1041
+ var to_remove = [];
1042
+ for (index=info.start; index<info.stop; index+=info.step) {
1043
+ to_remove.push(index);
1044
+ }
1045
+ // Delete the cached entries in sequence from the back.
1046
+ for (index=to_remove.length; index > 0; index--) {
1047
+ cache.splice(to_remove[index-1], 1);
1048
+ }
1049
+ } else {
1050
+ // When nothing is removed, just update the cache entries.
1051
+ for (var i=0; i < added.length; i++) {
1052
+ index = info.start + i*info.step;
1053
+ cache[index] = new jigna._SavedData(added.data[i]);
1054
+ }
1055
+ }
1056
+ } else {
1057
+ // This is not an extended slice.
1058
+ var splice_args = [info.index, info.removed].concat(
1059
+ info.added.data.map(function(x) {return new jigna._SavedData(x);})
1060
+ );
1061
+
1062
+ var extra = splice_args.length - 2 - splice_args[1];
1063
+ var cache = proxy.__cache__;
1064
+ var end = cache.length;
1065
+ if (extra < 0) {
1066
+ for (var index=end; index > (end+extra) ; index--) {
1067
+ delete proxy[index-1];
1068
+ }
1069
+ } else {
1070
+ for (var index=0; index < extra; index++){
1071
+ this._add_item_attribute(proxy, end+index);
1072
+ }
1073
+ }
1074
+ cache.splice.apply(cache, splice_args);
1075
+ }
1076
+ };
1077
+
1078
+
1079
+ // Common for list and dict proxies ////////////////////////////////////////////
1080
+
1081
+ jigna.AsyncProxyFactory.prototype._add_item_attribute = function(proxy, index){
1082
+ var descriptor, get, set;
1083
+
1084
+ get = function() {
1085
+ // In here, 'this' refers to the proxy!
1086
+ var value = this.__cache__[index];
1087
+ if (value === undefined) {
1088
+ value = this.__client__.get_attribute(this, index);
1089
+ this.__cache__[index] = value;
1090
+ } else if (value instanceof jigna._SavedData) {
1091
+ value = this.__client__._unmarshal(value.data);
1092
+ this.__cache__[index] = value;
1093
+ }
1094
+
1095
+ return value;
1096
+ };
1097
+
1098
+ set = function(value) {
1099
+ // In here, 'this' refers to the proxy!
1100
+ this.__cache__[index] = value;
1101
+ this.__client__.set_item(this.__id__, index, value);
1102
+ };
1103
+
1104
+ descriptor = {enumerable:true, get:get, set:set, configurable:true};
1105
+ Object.defineProperty(proxy, index, descriptor);
1106
+ };
1107
+
1108
+
1109
+ ///////////////////////////////////////////////////////////////////////////////
1110
+ // Proxy
1111
+ ///////////////////////////////////////////////////////////////////////////////
1112
+
1113
+ jigna.Proxy = function(type, id, client) {
1114
+ // We use the '__attribute__' pattern to reduce the risk of name clashes
1115
+ // with the actuall attribute and methods on the object that we are a
1116
+ // proxy for.
1117
+ Object.defineProperty(this, '__type__', {value : type});
1118
+ Object.defineProperty(this, '__id__', {value : id});
1119
+ Object.defineProperty(this, '__client__', {value : client});
1120
+ Object.defineProperty(this, '__cache__', {value : {}, writable: true});
1121
+
1122
+ // The state for each attribute can be 'busy' or undefined, if 'busy' it
1123
+ // implies that the server is waiting to receive the value.
1124
+ Object.defineProperty(this, '__state__', {value : {}});
1125
+ };
1126
+
1127
+
1128
+ // SubArray.js ////////////////////////////////////////////////////////////////
1129
+ // (C) Copyright Juriy Zaytsev
1130
+ // Source: 1. https://github.com/kangax/array_subclassing
1131
+ // 2. http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-
1132
+ // to-subclass-an-array/
1133
+ ///////////////////////////////////////////////////////////////////////////////
1134
+
1135
+ var makeSubArray = (function(){
1136
+
1137
+ var MAX_SIGNED_INT_VALUE = Math.pow(2, 32) - 1,
1138
+ hasOwnProperty = Object.prototype.hasOwnProperty;
1139
+
1140
+ function ToUint32(value) {
1141
+ return value >>> 0;
1142
+ }
1143
+
1144
+ function getMaxIndexProperty(object) {
1145
+ var maxIndex = -1, isValidProperty;
1146
+
1147
+ for (var prop in object) {
1148
+
1149
+ // int conversion of the property
1150
+ int_prop = ToUint32(prop);
1151
+
1152
+ isValidProperty = (
1153
+ String(int_prop) === prop &&
1154
+ int_prop !== MAX_SIGNED_INT_VALUE &&
1155
+ hasOwnProperty.call(object, prop)
1156
+ );
1157
+
1158
+ if (isValidProperty && int_prop > maxIndex) {
1159
+ maxIndex = prop;
1160
+ }
1161
+ }
1162
+ return maxIndex;
1163
+ }
1164
+
1165
+ return function(methods) {
1166
+ var length = 0;
1167
+ methods = methods || { };
1168
+
1169
+ methods.length = {
1170
+ get: function() {
1171
+ var maxIndexProperty = +getMaxIndexProperty(this);
1172
+ return Math.max(length, maxIndexProperty + 1);
1173
+ },
1174
+ set: function(value) {
1175
+ var constrainedValue = ToUint32(value);
1176
+ if (constrainedValue !== +value) {
1177
+ throw new RangeError();
1178
+ }
1179
+ for (var i = constrainedValue, len = this.length; i < len; i++) {
1180
+ delete this[i];
1181
+ }
1182
+ length = constrainedValue;
1183
+ }
1184
+ };
1185
+
1186
+ methods.toString = {
1187
+ value: Array.prototype.join
1188
+ };
1189
+
1190
+ return Object.create(Array.prototype, methods);
1191
+ };
1192
+ })();
1193
+
1194
+ jigna.SubArray = function() {
1195
+ var arr = makeSubArray();
1196
+
1197
+ if (arguments.length === 1) {
1198
+ arr.length = arguments[0];
1199
+ }
1200
+ else {
1201
+ arr.push.apply(arr, arguments);
1202
+ }
1203
+ return arr;
1204
+ };
1205
+
1206
+
1207
+ ///////////////////////////////////////////////////////////////////////////////
1208
+ // ListProxy
1209
+ ///////////////////////////////////////////////////////////////////////////////
1210
+
1211
+ // ListProxy is handled separately because it has to do special handling
1212
+ // to behave as regular Javascript `Array` objects
1213
+ // See "Wrappers. Prototype chain injection" section in this article:
1214
+ // http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-to-subclass-an-array/
1215
+
1216
+ jigna.ListProxy = function(type, id, client) {
1217
+
1218
+ var arr = new jigna.SubArray();
1219
+
1220
+ // fixme: repetition of property definition
1221
+ Object.defineProperty(arr, '__type__', {value : type});
1222
+ Object.defineProperty(arr, '__id__', {value : id});
1223
+ Object.defineProperty(arr, '__client__', {value : client});
1224
+ Object.defineProperty(arr, '__cache__', {value : [], writable: true});
1225
+
1226
+ // The state for each attribute can be 'busy' or undefined, if 'busy' it
1227
+ // implies that the server is waiting to receive the value.
1228
+ Object.defineProperty(arr, '__state__', {value : {}});
1229
+
1230
+ return arr;
1231
+ };
1232
+
1233
+
1234
+ ///////////////////////////////////////////////////////////////////////////////
1235
+ // QtBridge (intra-process)
1236
+ ///////////////////////////////////////////////////////////////////////////////
1237
+
1238
+ jigna.QtBridge = function(client, qt_bridge) {
1239
+ this.ready = new $.Deferred();
1240
+
1241
+ // Private protocol
1242
+ this._client = client;
1243
+ this._qt_bridge = qt_bridge;
1244
+
1245
+ this.ready.resolve();
1246
+ };
1247
+
1248
+ jigna.QtBridge.prototype.handle_event = function(jsonized_event) {
1249
+ /* Handle an event from the server. */
1250
+ this._client.handle_event(jsonized_event);
1251
+ };
1252
+
1253
+ jigna.QtBridge.prototype.send_request = function(jsonized_request) {
1254
+ /* Send a request to the server and wait for the reply. */
1255
+
1256
+ result = this._qt_bridge.handle_request(jsonized_request);
1257
+
1258
+ return result;
1259
+ };
1260
+
1261
+ jigna.QtBridge.prototype.send_request_async = function(jsonized_request) {
1262
+ /* A dummy async version of the send_request method. Since QtBridge is
1263
+ single process, this method indeed waits for the reply but presents
1264
+ a deferred API so that the AsyncClient can use it. Mainly for testing
1265
+ purposes only. */
1266
+
1267
+ var deferred = new $.Deferred();
1268
+
1269
+ deferred.resolve(this._qt_bridge.handle_request(jsonized_request));
1270
+
1271
+ return deferred.promise();
1272
+ };
1273
+
1274
+
1275
+ ///////////////////////////////////////////////////////////////////////////////
1276
+ // WebBridge
1277
+ ///////////////////////////////////////////////////////////////////////////////
1278
+
1279
+ jigna.WebBridge = function(client) {
1280
+ this._client = client;
1281
+
1282
+ // The jigna_server attribute can be set by a client to point to a
1283
+ // different Jigna server.
1284
+ var jigna_server = window['jigna_server'];
1285
+ if (jigna_server === undefined) {
1286
+ jigna_server = window.location.host;
1287
+ }
1288
+ this._server_url = 'http://' + jigna_server;
1289
+
1290
+ var url = 'ws://' + jigna_server + '/_jigna_ws';
1291
+
1292
+ this._deferred_requests = {};
1293
+ this._request_ids = [];
1294
+ for (var index=0; index < 1024; index++) {
1295
+ this._request_ids.push(index);
1296
+ }
1297
+
1298
+ this._web_socket = new WebSocket(url);
1299
+ this.ready = new $.Deferred();
1300
+ var bridge = this;
1301
+ this._web_socket.onopen = function() {
1302
+ bridge.ready.resolve();
1303
+ };
1304
+ this._web_socket.onmessage = function(event) {
1305
+ bridge.handle_event(event.data);
1306
+ };
1307
+ };
1308
+
1309
+ jigna.WebBridge.prototype.handle_event = function(jsonized_event) {
1310
+ /* Handle an event from the server. */
1311
+ var response = JSON.parse(jsonized_event);
1312
+ var request_id = response[0];
1313
+ var jsonized_response = response[1];
1314
+ if (request_id === -1) {
1315
+ this._client.handle_event(jsonized_response);
1316
+ }
1317
+ else {
1318
+ var deferred = this._pop_deferred_request(request_id);
1319
+ deferred.resolve(jsonized_response);
1320
+ }
1321
+ };
1322
+
1323
+ jigna.WebBridge.prototype.send_request = function(jsonized_request) {
1324
+ /* Send a request to the server and wait for the reply. */
1325
+
1326
+ var jsonized_response;
1327
+
1328
+ $.ajax(
1329
+ {
1330
+ url : '/_jigna',
1331
+ type : 'GET',
1332
+ data : {'data': jsonized_request},
1333
+ success : function(result) {jsonized_response = result;},
1334
+ error : function(status, error) {
1335
+ console.warning("Error: " + error);
1336
+ },
1337
+ async : false
1338
+ }
1339
+ );
1340
+
1341
+ return jsonized_response;
1342
+ };
1343
+
1344
+ jigna.WebBridge.prototype.send_request_async = function(jsonized_request) {
1345
+ /* Send a request to the server and do not wait and return a Promise
1346
+ which is resolved upon completion of the request.
1347
+ */
1348
+
1349
+ var deferred = new $.Deferred();
1350
+ var request_id = this._push_deferred_request(deferred);
1351
+ var bridge = this;
1352
+ this.ready.done(function() {
1353
+ bridge._web_socket.send(JSON.stringify([request_id, jsonized_request]));
1354
+ });
1355
+ return deferred.promise();
1356
+ };
1357
+
1358
+ //// Private protocol /////////////////////////////////////////////////////
1359
+
1360
+ jigna.WebBridge.prototype._pop_deferred_request = function(request_id) {
1361
+ var deferred = this._deferred_requests[request_id];
1362
+ delete this._deferred_requests[request_id];
1363
+ this._request_ids.push(request_id);
1364
+ return deferred;
1365
+ };
1366
+
1367
+ jigna.WebBridge.prototype._push_deferred_request = function(deferred) {
1368
+ var id = this._request_ids.pop();
1369
+ if (id === undefined) {
1370
+ console.error("In _push_deferred_request, request_id is undefined.");
1371
+ }
1372
+ this._deferred_requests[id] = deferred;
1373
+ return id;
1374
+ };
1375
+
1376
+
1377
+ // A Horrible hack to update objects. This was gleaned from the vuejs
1378
+ // code. The problem we have is that vuejs cannot listen to changes to
1379
+ // model changes because we use getters/setters. Internally vue uses an
1380
+ // observer to notify dependent elements. We use the __ob__ attribute
1381
+ // to get the observer and call its `dep.notify()`, this makes
1382
+ // everything work really well.
1383
+ jigna.add_listener('jigna', 'object_changed', function (event) {
1384
+ var obj = event.object;
1385
+ if (obj && obj.__ob__) {
1386
+ obj.__ob__.dep.notify();
1387
+ }
1388
+ });
1389
+
1390
+
1391
+ window.$ = $;
1392
+ window.Vue = Vue;
1393
+ window.jigna = jigna;
1394
+
1395
+ })();