python-microscopy 25.6.5__cp39-cp39-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- PYME/Acquire/ActionManager.py +450 -0
- PYME/Acquire/ExecTools.py +235 -0
- PYME/Acquire/Hardware/AAOptoelectronics/MDS.py +175 -0
- PYME/Acquire/Hardware/AAOptoelectronics/__init__.py +0 -0
- PYME/Acquire/Hardware/ARCoptix/__init__.py +0 -0
- PYME/Acquire/Hardware/ARCoptix/lcdriver.py +149 -0
- PYME/Acquire/Hardware/ARCoptix/lcserver32.py +123 -0
- PYME/Acquire/Hardware/AndorIXon/AndorCam.py +1095 -0
- PYME/Acquire/Hardware/AndorIXon/AndorControlFrame.py +312 -0
- PYME/Acquire/Hardware/AndorIXon/AndorIXon.py +737 -0
- PYME/Acquire/Hardware/AndorIXon/__init__.py +27 -0
- PYME/Acquire/Hardware/AndorNeo/AndorNeo.py +644 -0
- PYME/Acquire/Hardware/AndorNeo/AndorNeoControlFrame.py +161 -0
- PYME/Acquire/Hardware/AndorNeo/AndorZyla.py +761 -0
- PYME/Acquire/Hardware/AndorNeo/SDK3.py +307 -0
- PYME/Acquire/Hardware/AndorNeo/SDK3Cam.py +171 -0
- PYME/Acquire/Hardware/AndorNeo/ZylaControlPanel.py +105 -0
- PYME/Acquire/Hardware/AndorNeo/__init__.py +22 -0
- PYME/Acquire/Hardware/AndorNeo/parseAtdebug.py +46 -0
- PYME/Acquire/Hardware/AndorNeo/plotTimings.py +73 -0
- PYME/Acquire/Hardware/AndorNeo/testNeo.py +62 -0
- PYME/Acquire/Hardware/Camera.py +1199 -0
- PYME/Acquire/Hardware/CameraSkeleton.py +642 -0
- PYME/Acquire/Hardware/Coherent/OBIS.py +147 -0
- PYME/Acquire/Hardware/Coherent/Sapphire.py +162 -0
- PYME/Acquire/Hardware/Coherent/__init__.py +0 -0
- PYME/Acquire/Hardware/DMDGui.py +198 -0
- PYME/Acquire/Hardware/DigiData/DigiData.py +95 -0
- PYME/Acquire/Hardware/DigiData/DigiDataClient.py +30 -0
- PYME/Acquire/Hardware/DigiData/RemoteDigiData.py +51 -0
- PYME/Acquire/Hardware/DigiData/__init__.py +24 -0
- PYME/Acquire/Hardware/DigiData/axDD132x.py +348 -0
- PYME/Acquire/Hardware/EMCCDTheory.py +41 -0
- PYME/Acquire/Hardware/ExciterWheel.py +167 -0
- PYME/Acquire/Hardware/FilterWheel.py +184 -0
- PYME/Acquire/Hardware/FocCorr.py +106 -0
- PYME/Acquire/Hardware/FocCorrR.py +196 -0
- PYME/Acquire/Hardware/FrFilter.py +51 -0
- PYME/Acquire/Hardware/GCS/GCS_DLL.py +370 -0
- PYME/Acquire/Hardware/GCS/__init__.py +0 -0
- PYME/Acquire/Hardware/GCS/gcs.py +210 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/HamamatsuDCAM.py +662 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/HamamatsuORCA.py +602 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/Hamamatsu_control_panel.py +54 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/__init__.py +23 -0
- PYME/Acquire/Hardware/LaserControlFrame.py +160 -0
- PYME/Acquire/Hardware/MPBCommunications/MPBCW.py +132 -0
- PYME/Acquire/Hardware/MPBCommunications/__init__.py +0 -0
- PYME/Acquire/Hardware/Mercury/Mercury.py +269 -0
- PYME/Acquire/Hardware/Mercury/PI_Mercury_GCS_DLL.py +857 -0
- PYME/Acquire/Hardware/Mercury/__init__.py +22 -0
- PYME/Acquire/Hardware/Mercury/mercuryStepper.py +203 -0
- PYME/Acquire/Hardware/Mercury/mercuryStepperGCS.py +281 -0
- PYME/Acquire/Hardware/NikonTE2000.py +68 -0
- PYME/Acquire/Hardware/NikonTi.py +214 -0
- PYME/Acquire/Hardware/NikonTiGUI.py +81 -0
- PYME/Acquire/Hardware/OrielCornerstone.py +125 -0
- PYME/Acquire/Hardware/PM100USB.py +51 -0
- PYME/Acquire/Hardware/Piezos/__init__.py +22 -0
- PYME/Acquire/Hardware/Piezos/base_piezo.py +108 -0
- PYME/Acquire/Hardware/Piezos/offsetPiezo.py +162 -0
- PYME/Acquire/Hardware/Piezos/offsetPiezoREST.py +308 -0
- PYME/Acquire/Hardware/Piezos/piezo_c867.py +486 -0
- PYME/Acquire/Hardware/Piezos/piezo_e255.py +68 -0
- PYME/Acquire/Hardware/Piezos/piezo_e662.py +61 -0
- PYME/Acquire/Hardware/Piezos/piezo_e709.py +434 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816.py +452 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816_corr.py +70 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816_dll.py +518 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816b.py +70 -0
- PYME/Acquire/Hardware/Piezos/piezo_pipython_gcs.py +560 -0
- PYME/Acquire/Hardware/Piezos/piezo_test.py +55 -0
- PYME/Acquire/Hardware/Simulator/EmpiricalHist.py +273 -0
- PYME/Acquire/Hardware/Simulator/__init__.py +22 -0
- PYME/Acquire/Hardware/Simulator/dSimControl.py +961 -0
- PYME/Acquire/Hardware/Simulator/fakeCam.py +651 -0
- PYME/Acquire/Hardware/Simulator/fakePiezo.py +95 -0
- PYME/Acquire/Hardware/Simulator/fluor.py +336 -0
- PYME/Acquire/Hardware/Simulator/illuminate.cp39-win_amd64.dll.a +0 -0
- PYME/Acquire/Hardware/Simulator/illuminate.cp39-win_amd64.pyd +0 -0
- PYME/Acquire/Hardware/Simulator/illuminate.pyx +93 -0
- PYME/Acquire/Hardware/Simulator/lasersliders.py +90 -0
- PYME/Acquire/Hardware/Simulator/rend_im.py +446 -0
- PYME/Acquire/Hardware/Simulator/setup.py +69 -0
- PYME/Acquire/Hardware/Simulator/simcontrol.py +348 -0
- PYME/Acquire/Hardware/Simulator/simui_wx.py +794 -0
- PYME/Acquire/Hardware/Tango/__init__.py +0 -0
- PYME/Acquire/Hardware/Tango/marzhauser_tango.py +583 -0
- PYME/Acquire/Hardware/TiLightCrafter.py +388 -0
- PYME/Acquire/Hardware/__init__.py +22 -0
- PYME/Acquire/Hardware/aotf.py +271 -0
- PYME/Acquire/Hardware/arclampshutterpanel.py +71 -0
- PYME/Acquire/Hardware/cameraSoftwareBuffer.py +215 -0
- PYME/Acquire/Hardware/camera_noise.py +270 -0
- PYME/Acquire/Hardware/ccdAdjPanel.py +188 -0
- PYME/Acquire/Hardware/ccdCalibrator.py +161 -0
- PYME/Acquire/Hardware/cobaltLaser.py +108 -0
- PYME/Acquire/Hardware/cobaltLaser561.py +94 -0
- PYME/Acquire/Hardware/comports.py +26 -0
- PYME/Acquire/Hardware/driftTrackGUI.py +488 -0
- PYME/Acquire/Hardware/driftTracking.py +595 -0
- PYME/Acquire/Hardware/fakeShutters.py +52 -0
- PYME/Acquire/Hardware/focusKeys.py +204 -0
- PYME/Acquire/Hardware/focus_locks/__init__.py +0 -0
- PYME/Acquire/Hardware/focus_locks/reflection_focus_lock.py +684 -0
- PYME/Acquire/Hardware/frZStage.py +117 -0
- PYME/Acquire/Hardware/fw102.py +38 -0
- PYME/Acquire/Hardware/ids_peak_cam.py +561 -0
- PYME/Acquire/Hardware/ioslave.py +305 -0
- PYME/Acquire/Hardware/lasers.py +292 -0
- PYME/Acquire/Hardware/matchboxLaser.py +58 -0
- PYME/Acquire/Hardware/microscope_adapter.py +104 -0
- PYME/Acquire/Hardware/mpd_picosecond_delayer.py +395 -0
- PYME/Acquire/Hardware/multiview.py +287 -0
- PYME/Acquire/Hardware/olympusix81.py +59 -0
- PYME/Acquire/Hardware/pco/__init__.py +0 -0
- PYME/Acquire/Hardware/pco/pco_cam.py +348 -0
- PYME/Acquire/Hardware/pco/pco_edge_42_lt.py +34 -0
- PYME/Acquire/Hardware/pco/pco_sdk.py +1645 -0
- PYME/Acquire/Hardware/pco/pco_sdk_cam.py +518 -0
- PYME/Acquire/Hardware/pco/pco_sdk_cam_control_panel.py +54 -0
- PYME/Acquire/Hardware/phoxxLaser.py +199 -0
- PYME/Acquire/Hardware/phoxxLaserOLD.py +242 -0
- PYME/Acquire/Hardware/priorLumen.py +102 -0
- PYME/Acquire/Hardware/priorarclampshutter.py +52 -0
- PYME/Acquire/Hardware/setup.py +50 -0
- PYME/Acquire/Hardware/spacenav.py +148 -0
- PYME/Acquire/Hardware/splitter.py +394 -0
- PYME/Acquire/Hardware/thorlabsPiezo.py +98 -0
- PYME/Acquire/Hardware/thorlabs_cam.py +136 -0
- PYME/Acquire/Hardware/thorlabs_mff_flipper.py +400 -0
- PYME/Acquire/Hardware/toptica_ibeam.py +51 -0
- PYME/Acquire/Hardware/uc480/AndorControlFrame.py +308 -0
- PYME/Acquire/Hardware/uc480/__init__.py +27 -0
- PYME/Acquire/Hardware/uc480/uCam480.py +695 -0
- PYME/Acquire/Hardware/uc480/uc480.py +189 -0
- PYME/Acquire/Hardware/uc480/uc480Deprecated.py +87 -0
- PYME/Acquire/Hardware/uc480/uc480_h.py +767 -0
- PYME/Acquire/Hardware/uc480/uc480_h_gen.py +62 -0
- PYME/Acquire/Hardware/uc480/ucCamControlFrame.py +83 -0
- PYME/Acquire/Hardware/ueye.py +702 -0
- PYME/Acquire/PYMEAcquire.py +186 -0
- PYME/Acquire/Protocols/DMDMFM.py +74 -0
- PYME/Acquire/Protocols/__init__.py +22 -0
- PYME/Acquire/Protocols/darkCalibrate.py +56 -0
- PYME/Acquire/Protocols/dual671_470.py +45 -0
- PYME/Acquire/Protocols/dual671_488.py +46 -0
- PYME/Acquire/Protocols/gainCal.py +53 -0
- PYME/Acquire/Protocols/htsms-cal-psf.py +32 -0
- PYME/Acquire/Protocols/htsms-cal-registration.py +52 -0
- PYME/Acquire/Protocols/htsms-flow.py +29 -0
- PYME/Acquire/Protocols/htsms-staggered.py +31 -0
- PYME/Acquire/Protocols/htsms-tile.py +68 -0
- PYME/Acquire/Protocols/htsms-two-color.py +29 -0
- PYME/Acquire/Protocols/htsms-widefield.py +32 -0
- PYME/Acquire/Protocols/paint671.py +61 -0
- PYME/Acquire/Protocols/photoconversion.py +52 -0
- PYME/Acquire/Protocols/photoconversion2.py +55 -0
- PYME/Acquire/Protocols/prebleach488.py +70 -0
- PYME/Acquire/Protocols/prebleach490.py +69 -0
- PYME/Acquire/Protocols/prebleach561.py +72 -0
- PYME/Acquire/Protocols/prebleach561NeomEos2.py +70 -0
- PYME/Acquire/Protocols/prebleach561NeomEos2ND1.py +70 -0
- PYME/Acquire/Protocols/prebleach642.py +70 -0
- PYME/Acquire/Protocols/prebleach671.py +69 -0
- PYME/Acquire/Protocols/prebleach671ND1.py +58 -0
- PYME/Acquire/Protocols/prebleach671ND2.py +57 -0
- PYME/Acquire/Protocols/prebleach671Neo.py +69 -0
- PYME/Acquire/Protocols/recover671.py +62 -0
- PYME/Acquire/Protocols/sequence642_488.py +85 -0
- PYME/Acquire/Protocols/sequence642_561.py +87 -0
- PYME/Acquire/Protocols/shiftfield.py +198 -0
- PYME/Acquire/Protocols/simul488.py +59 -0
- PYME/Acquire/Protocols/simul642.py +63 -0
- PYME/Acquire/Protocols/simul642HTSMS.py +63 -0
- PYME/Acquire/Protocols/simulPA.py +37 -0
- PYME/Acquire/Protocols/simulSIM.py +76 -0
- PYME/Acquire/Protocols/simulStep.py +62 -0
- PYME/Acquire/Protocols/spdscan.py +178 -0
- PYME/Acquire/Protocols/standard470.py +45 -0
- PYME/Acquire/Protocols/standard488.py +47 -0
- PYME/Acquire/Protocols/standard671.py +48 -0
- PYME/Acquire/Protocols/standard671_no532.py +47 -0
- PYME/Acquire/Protocols/standardArclamp.py +46 -0
- PYME/Acquire/Protocols/strip_tile.py +204 -0
- PYME/Acquire/Protocols/tile.py +204 -0
- PYME/Acquire/Protocols/tile3D.py +192 -0
- PYME/Acquire/Protocols/tile671.py +190 -0
- PYME/Acquire/Protocols/tile_triggered.py +189 -0
- PYME/Acquire/Scripts/init.py +232 -0
- PYME/Acquire/Scripts/init_N1_Ti_Exeter_ZIx.py +374 -0
- PYME/Acquire/Scripts/init_N2_Ti_Zyla_lasers.py +290 -0
- PYME/Acquire/Scripts/init_Neo.py +266 -0
- PYME/Acquire/Scripts/init_NeoSim.py +159 -0
- PYME/Acquire/Scripts/init_TIRF.py +232 -0
- PYME/Acquire/Scripts/init_TIRF_Neo.py +242 -0
- PYME/Acquire/Scripts/init_TIRF_NeoO.py +241 -0
- PYME/Acquire/Scripts/init_TIRF_onecam.py +233 -0
- PYME/Acquire/Scripts/init_Ti.py +257 -0
- PYME/Acquire/Scripts/init_UOA_n.py +256 -0
- PYME/Acquire/Scripts/init_UOA_n2.py +246 -0
- PYME/Acquire/Scripts/init_Y1.py +249 -0
- PYME/Acquire/Scripts/init_Zyla.py +260 -0
- PYME/Acquire/Scripts/init_drift_tracking.py +80 -0
- PYME/Acquire/Scripts/init_emccd_basic.py +277 -0
- PYME/Acquire/Scripts/init_htsms.py +277 -0
- PYME/Acquire/Scripts/init_htsms_focus_lock.py +132 -0
- PYME/Acquire/Scripts/init_micrpi.py +45 -0
- PYME/Acquire/Scripts/init_orca.py +70 -0
- PYME/Acquire/Scripts/init_pco.py +49 -0
- PYME/Acquire/Scripts/init_rev.py +74 -0
- PYME/Acquire/Scripts/init_sim100.py +169 -0
- PYME/Acquire/Scripts/init_sim103.py +169 -0
- PYME/Acquire/Scripts/init_sim2.py +211 -0
- PYME/Acquire/Scripts/init_sim50.py +169 -0
- PYME/Acquire/Scripts/init_sim75.py +169 -0
- PYME/Acquire/Scripts/init_sim_drift_tracking.py +166 -0
- PYME/Acquire/Scripts/init_sim_htsms.py +224 -0
- PYME/Acquire/Scripts/init_sim_htsms_n.py +233 -0
- PYME/Acquire/Scripts/init_sim_main.py +229 -0
- PYME/Acquire/Scripts/init_sim_min.py +197 -0
- PYME/Acquire/Scripts/init_sim_rem.py +176 -0
- PYME/Acquire/Scripts/init_smi1.py +110 -0
- PYME/Acquire/Scripts/init_spectro.py +78 -0
- PYME/Acquire/Scripts/init_spim.py +116 -0
- PYME/Acquire/Scripts/init_thorcam.py +62 -0
- PYME/Acquire/Scripts/init_twophoton.py +112 -0
- PYME/Acquire/Scripts/init_uc480.py +262 -0
- PYME/Acquire/Scripts/init_ueye.py +261 -0
- PYME/Acquire/SpoolController.py +958 -0
- PYME/Acquire/Utils/MultiPointScanner.py +80 -0
- PYME/Acquire/Utils/__init__.py +13 -0
- PYME/Acquire/Utils/failsafe.py +157 -0
- PYME/Acquire/Utils/fastTiler.py +153 -0
- PYME/Acquire/Utils/pointScanner.py +496 -0
- PYME/Acquire/Utils/sarcSpacing.py +86 -0
- PYME/Acquire/Utils/strip_tiler.py +93 -0
- PYME/Acquire/Utils/tiler.py +464 -0
- PYME/Acquire/Utils/vibrationAnalysis.py +65 -0
- PYME/Acquire/__init__.py +44 -0
- PYME/Acquire/acquire_client.py +90 -0
- PYME/Acquire/acquire_server.py +316 -0
- PYME/Acquire/acquirebase.py +139 -0
- PYME/Acquire/acquiremainframe.py +716 -0
- PYME/Acquire/acquirewx.py +61 -0
- PYME/Acquire/acquisition_base.py +148 -0
- PYME/Acquire/actions.py +209 -0
- PYME/Acquire/autofocus.py +54 -0
- PYME/Acquire/eventLog.py +95 -0
- PYME/Acquire/event_loop.py +119 -0
- PYME/Acquire/frameWrangler.py +530 -0
- PYME/Acquire/htsms/__init__.py +8 -0
- PYME/Acquire/htsms/rule_ui.py +970 -0
- PYME/Acquire/htsms/rule_ui_v2.py +573 -0
- PYME/Acquire/htsms/tweeter.py +222 -0
- PYME/Acquire/microscope.py +1050 -0
- PYME/Acquire/positionTracker.py +181 -0
- PYME/Acquire/protocol.py +299 -0
- PYME/Acquire/protocol_acquisition.py +404 -0
- PYME/Acquire/sampleInformation.py +591 -0
- PYME/Acquire/sampleInformationDjangoDirect.py +446 -0
- PYME/Acquire/setup.py +52 -0
- PYME/Acquire/stackSettings.py +295 -0
- PYME/Acquire/stage_leveling.py +285 -0
- PYME/Acquire/ui/AnalysisSettingsUI.py +184 -0
- PYME/Acquire/ui/HDFSpoolFrame.py +584 -0
- PYME/Acquire/ui/__init__.py +0 -0
- PYME/Acquire/ui/actionUI.py +892 -0
- PYME/Acquire/ui/focus_lock_gui.py +149 -0
- PYME/Acquire/ui/intensity_trace.py +143 -0
- PYME/Acquire/ui/intsliders.py +222 -0
- PYME/Acquire/ui/lasersliders.py +329 -0
- PYME/Acquire/ui/mpd_picosecond_delay_panel.py +69 -0
- PYME/Acquire/ui/multiview_select.py +77 -0
- PYME/Acquire/ui/positionUI.py +519 -0
- PYME/Acquire/ui/preflight.py +58 -0
- PYME/Acquire/ui/scanner_panel.py +41 -0
- PYME/Acquire/ui/selectCameraPanel.py +46 -0
- PYME/Acquire/ui/seqdialog.py +501 -0
- PYME/Acquire/ui/splashScreen.py +175 -0
- PYME/Acquire/ui/spool_panel.py +830 -0
- PYME/Acquire/ui/tile_panel.py +556 -0
- PYME/Acquire/ui/tilesettingsui.py +91 -0
- PYME/Acquire/ui/voxelSizeDialog.py +149 -0
- PYME/Acquire/webui/__init__.py +36 -0
- PYME/Acquire/webui/ipy.py +361 -0
- PYME/Acquire/webui/static/css/pyme-bootstrap.css +9908 -0
- PYME/Acquire/webui/static/css/pymeacquire.css +85 -0
- PYME/Acquire/webui/static/js/pymeacquire.js +375 -0
- PYME/Acquire/webui/static/js/pzf.js +95 -0
- PYME/Acquire/webui/templates/PYMEAcquire.html +232 -0
- PYME/Acquire/webui/templates/login.html +84 -0
- PYME/Acquire/webui/templates/xtermpage.html +106 -0
- PYME/Acquire/xyztc.py +418 -0
- PYME/Acquire/zScanner.py +287 -0
- PYME/Analysis/BleachProfile/__init__.py +26 -0
- PYME/Analysis/BleachProfile/deMod.py +91 -0
- PYME/Analysis/BleachProfile/fitRecover.py +90 -0
- PYME/Analysis/BleachProfile/intensProf.py +519 -0
- PYME/Analysis/BleachProfile/kinModels.py +507 -0
- PYME/Analysis/BleachProfile/rawIntensity.py +227 -0
- PYME/Analysis/BleachProfile/rollins.py +555 -0
- PYME/Analysis/Colocalisation/__init__.py +27 -0
- PYME/Analysis/Colocalisation/colocScaleDep.py +126 -0
- PYME/Analysis/Colocalisation/correlationCoeffs.py +198 -0
- PYME/Analysis/Colocalisation/distColoc.py +110 -0
- PYME/Analysis/Colocalisation/edtColoc.py +191 -0
- PYME/Analysis/MetaData.py +278 -0
- PYME/Analysis/PSFEst/__init__.py +27 -0
- PYME/Analysis/PSFEst/dec.py +283 -0
- PYME/Analysis/PSFEst/extractImages.py +316 -0
- PYME/Analysis/PSFEst/fit_psf_zernikes.py +194 -0
- PYME/Analysis/PSFEst/psfQuality.py +225 -0
- PYME/Analysis/PSFGen/__init__.py +40 -0
- PYME/Analysis/PSFGen/fourier.py +138 -0
- PYME/Analysis/PSFGen/fourierHNA.py +1108 -0
- PYME/Analysis/PSFGen/fourierHNA2.py +979 -0
- PYME/Analysis/PSFGen/genCRBcurves.py +185 -0
- PYME/Analysis/PSFGen/nijboer_zernike.py +79 -0
- PYME/Analysis/PSFGen/ps_app.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/PSFGen/ps_app.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/PSFGen/test_ps_app.py +24 -0
- PYME/Analysis/Tracking/__init__.py +3 -0
- PYME/Analysis/Tracking/msd.py +57 -0
- PYME/Analysis/Tracking/trackUtils.py +528 -0
- PYME/Analysis/Tracking/tracking.py +152 -0
- PYME/Analysis/__init__.py +30 -0
- PYME/Analysis/_fithelpers.py +161 -0
- PYME/Analysis/angleFilter.py +287 -0
- PYME/Analysis/annealThresh.py +157 -0
- PYME/Analysis/autoencoder_classifier.py +45 -0
- PYME/Analysis/binAvg.py +144 -0
- PYME/Analysis/composite.py +183 -0
- PYME/Analysis/cramerRao.py +259 -0
- PYME/Analysis/deTile.py +441 -0
- PYME/Analysis/density_filter.py +45 -0
- PYME/Analysis/distributed_pyramid.py +426 -0
- PYME/Analysis/fiducial_matching.py +220 -0
- PYME/Analysis/gen_sCMOS_maps.py +355 -0
- PYME/Analysis/graphing_filters.py +311 -0
- PYME/Analysis/implicitFilter.py +359 -0
- PYME/Analysis/keep_pairs.py +69 -0
- PYME/Analysis/optic_flow.py +108 -0
- PYME/Analysis/piecewise.py +36 -0
- PYME/Analysis/piecewiseMapping.py +304 -0
- PYME/Analysis/piezo_movement_correction.py +153 -0
- PYME/Analysis/points/DeClump/__init__.py +78 -0
- PYME/Analysis/points/DeClump/deClump.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/DeClump/deClump.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/DeClump/deClumpGUI.py +87 -0
- PYME/Analysis/points/DeClump/pyDeClump.py +284 -0
- PYME/Analysis/points/DeClump/testClump.py +40 -0
- PYME/Analysis/points/DistHist/__init__.py +25 -0
- PYME/Analysis/points/DistHist/distHist.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/DistHist/distHist.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/DistHist/distHistThreaded.py +71 -0
- PYME/Analysis/points/DistHist/setup.py +54 -0
- PYME/Analysis/points/EdgeDB/__init__.py +24 -0
- PYME/Analysis/points/EdgeDB/edgeDB.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/EdgeDB/edgeDB.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/EdgeDB/edgeTest.py +66 -0
- PYME/Analysis/points/EdgeDB/edges.py +102 -0
- PYME/Analysis/points/EdgeDB/segment.py +75 -0
- PYME/Analysis/points/EdgeDB/setup.py +54 -0
- PYME/Analysis/points/QuadTree/QTrend.py +232 -0
- PYME/Analysis/points/QuadTree/__init__.py +25 -0
- PYME/Analysis/points/QuadTree/pointQT.py +227 -0
- PYME/Analysis/points/QuadTree/pointQTF.py +254 -0
- PYME/Analysis/points/QuadTree/qtUtils.py +36 -0
- PYME/Analysis/points/QuadTree/rendQT.py +118 -0
- PYME/Analysis/points/SoftRend/__init__.py +24 -0
- PYME/Analysis/points/SoftRend/setup.py +61 -0
- PYME/Analysis/points/SoftRend/testTetrahedra.py +41 -0
- PYME/Analysis/points/SoftRend/triRend.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/SoftRend/triRend.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/__init__.py +3 -0
- PYME/Analysis/points/arcfit/__init__.py +1 -0
- PYME/Analysis/points/arcfit/arcmf.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/arcfit/arcmf.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/arcfit/setup.py +51 -0
- PYME/Analysis/points/astigmatism/__init__.py +0 -0
- PYME/Analysis/points/astigmatism/astigTools.py +338 -0
- PYME/Analysis/points/astigmatism/astiglookup.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/astigmatism/astiglookup.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/astigmatism/setup.py +54 -0
- PYME/Analysis/points/cluster_morphology.py +199 -0
- PYME/Analysis/points/coordinate_tools.py +278 -0
- PYME/Analysis/points/features/__init__.py +0 -0
- PYME/Analysis/points/features/metal.py +46 -0
- PYME/Analysis/points/features/shaders/vect_feat_3d.metal +49 -0
- PYME/Analysis/points/fiducials.py +142 -0
- PYME/Analysis/points/gen3DTriangs.py +796 -0
- PYME/Analysis/points/moments.py +143 -0
- PYME/Analysis/points/multiview.py +458 -0
- PYME/Analysis/points/objectMeasure.py +206 -0
- PYME/Analysis/points/qpaint.py +97 -0
- PYME/Analysis/points/rings.py +372 -0
- PYME/Analysis/points/ripleys.py +427 -0
- PYME/Analysis/points/segmentLL.py +134 -0
- PYME/Analysis/points/setup.py +56 -0
- PYME/Analysis/points/spherical_harmonics.py +909 -0
- PYME/Analysis/points/surfit.py +829 -0
- PYME/Analysis/points/tCluster.py +75 -0
- PYME/Analysis/points/traveling_salesperson/__init__.py +0 -0
- PYME/Analysis/points/traveling_salesperson/queue_opt.py +117 -0
- PYME/Analysis/points/traveling_salesperson/sectioned_two_opt.py +327 -0
- PYME/Analysis/points/traveling_salesperson/setup.py +40 -0
- PYME/Analysis/points/traveling_salesperson/sort.py +78 -0
- PYME/Analysis/points/traveling_salesperson/two_opt.py +189 -0
- PYME/Analysis/points/traveling_salesperson/two_opt_utils.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/traveling_salesperson/two_opt_utils.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/traveling_salesperson/two_opt_utils.pyx +41 -0
- PYME/Analysis/points/twoColour.py +572 -0
- PYME/Analysis/points/twoColourPlot.py +107 -0
- PYME/Analysis/processLogger.py +129 -0
- PYME/Analysis/profile_extraction.py +72 -0
- PYME/Analysis/setup.py +60 -0
- PYME/Analysis/splitting.py +372 -0
- PYME/Analysis/svmSegment.py +214 -0
- PYME/Analysis/thresholding.py +192 -0
- PYME/Analysis/tile_pyramid.py +938 -0
- PYME/Analysis/widefieldify.py +54 -0
- PYME/DSView/DisplayOptionsPanel.py +503 -0
- PYME/DSView/LUT/__init__.py +33 -0
- PYME/DSView/LUT/lut.cp39-win_amd64.dll.a +0 -0
- PYME/DSView/LUT/lut.cp39-win_amd64.pyd +0 -0
- PYME/DSView/LUT/setup.py +54 -0
- PYME/DSView/OpenSequenceDialog.py +83 -0
- PYME/DSView/OverlaysPanel.py +111 -0
- PYME/DSView/__init__.py +32 -0
- PYME/DSView/arrayViewPanel.py +1035 -0
- PYME/DSView/displayOptions.py +453 -0
- PYME/DSView/displaySettingsPanel.py +271 -0
- PYME/DSView/dsviewer.py +542 -0
- PYME/DSView/eventLogViewer.py +805 -0
- PYME/DSView/fitInfo.py +486 -0
- PYME/DSView/htmlServe.py +72 -0
- PYME/DSView/logparser.py +100 -0
- PYME/DSView/modules/LMAnalysis.py +1053 -0
- PYME/DSView/modules/LMDisplay.py +194 -0
- PYME/DSView/modules/__init__.py +162 -0
- PYME/DSView/modules/_base.py +39 -0
- PYME/DSView/modules/annotation.py +725 -0
- PYME/DSView/modules/arrayView.py +71 -0
- PYME/DSView/modules/blobFinding.py +455 -0
- PYME/DSView/modules/blobMeasure.py +1093 -0
- PYME/DSView/modules/camera_maps.py +38 -0
- PYME/DSView/modules/coloc.py +414 -0
- PYME/DSView/modules/composite.py +715 -0
- PYME/DSView/modules/convnet.py +24 -0
- PYME/DSView/modules/cropping.py +133 -0
- PYME/DSView/modules/dark_and_flatfield.py +31 -0
- PYME/DSView/modules/deconvolution.py +499 -0
- PYME/DSView/modules/eventView.py +80 -0
- PYME/DSView/modules/extractBlobs.py +46 -0
- PYME/DSView/modules/fastGraphPanel.py +85 -0
- PYME/DSView/modules/filtering.py +335 -0
- PYME/DSView/modules/flowView.py +268 -0
- PYME/DSView/modules/fourierRingCorrelation.py +172 -0
- PYME/DSView/modules/gl_image_view.py +12 -0
- PYME/DSView/modules/graphViewPanel.py +272 -0
- PYME/DSView/modules/measure/__init__.py +1 -0
- PYME/DSView/modules/measure/filterPan.py +239 -0
- PYME/DSView/modules/metadataView.py +28 -0
- PYME/DSView/modules/multithreshold.py +98 -0
- PYME/DSView/modules/neuroglancer.py +129 -0
- PYME/DSView/modules/object_tagging.py +157 -0
- PYME/DSView/modules/particleTracking.py +463 -0
- PYME/DSView/modules/playback.py +256 -0
- PYME/DSView/modules/prebleachExtraction.py +75 -0
- PYME/DSView/modules/profileFitting.py +137 -0
- PYME/DSView/modules/profilePlotting.py +408 -0
- PYME/DSView/modules/projections.py +48 -0
- PYME/DSView/modules/psfExtraction.py +570 -0
- PYME/DSView/modules/psfGeneration.py +138 -0
- PYME/DSView/modules/psfTools.py +661 -0
- PYME/DSView/modules/pupilTools.py +204 -0
- PYME/DSView/modules/pupilView.py +139 -0
- PYME/DSView/modules/recipes.py +266 -0
- PYME/DSView/modules/redimension.py +75 -0
- PYME/DSView/modules/segmentation.py +192 -0
- PYME/DSView/modules/sheetView.py +24 -0
- PYME/DSView/modules/shell.py +39 -0
- PYME/DSView/modules/shiftfield_estimation.py +433 -0
- PYME/DSView/modules/sparkprepare.py +94 -0
- PYME/DSView/modules/splitter.py +148 -0
- PYME/DSView/modules/synchronise.py +64 -0
- PYME/DSView/modules/templates/astigCal.html +42 -0
- PYME/DSView/modules/templates/measureView.html +69 -0
- PYME/DSView/modules/templates/measureView2.html +48 -0
- PYME/DSView/modules/templates/measureView3.html +98 -0
- PYME/DSView/modules/templates/trackView.html +139 -0
- PYME/DSView/modules/templates/tracksOverview.html +21 -0
- PYME/DSView/modules/tiling.py +147 -0
- PYME/DSView/modules/unmixing.py +148 -0
- PYME/DSView/modules/vis3D.py +320 -0
- PYME/DSView/modules/visgui.py +163 -0
- PYME/DSView/modules/webview.py +14 -0
- PYME/DSView/overlays.py +295 -0
- PYME/DSView/scrolledImagePanel.py +188 -0
- PYME/DSView/setup.py +53 -0
- PYME/DSView/splashScreen.py +158 -0
- PYME/DSView/voxSizeDialog.py +84 -0
- PYME/Deconv/__init__.py +35 -0
- PYME/Deconv/beadGen.py +55 -0
- PYME/Deconv/dec.py +659 -0
- PYME/Deconv/decTask.py +65 -0
- PYME/Deconv/decThread.py +113 -0
- PYME/Deconv/dec_test.py +47 -0
- PYME/Deconv/deconvDialogs.py +417 -0
- PYME/Deconv/fftwWisdom.py +62 -0
- PYME/Deconv/richardsonLucy.py +141 -0
- PYME/Deconv/richardsonLucyMV.py +151 -0
- PYME/Deconv/richardsonLucyMVM.py +218 -0
- PYME/Deconv/test_block_dec.py +46 -0
- PYME/Deconv/tq_block_dec.py +331 -0
- PYME/Deconv/wiener.py +163 -0
- PYME/IO/DataSources/AlignDataSource.py +91 -0
- PYME/IO/DataSources/ArrayDataSource.py +260 -0
- PYME/IO/DataSources/BGSDataSource.py +353 -0
- PYME/IO/DataSources/BaseDataSource.py +457 -0
- PYME/IO/DataSources/BioformatsDataSource.py +178 -0
- PYME/IO/DataSources/BufferedDataSource.py +99 -0
- PYME/IO/DataSources/ClusterPZFDataSource.py +124 -0
- PYME/IO/DataSources/ConcatenatedDataSource.py +56 -0
- PYME/IO/DataSources/CropDataSource.py +243 -0
- PYME/IO/DataSources/DcimgDataSource.py +54 -0
- PYME/IO/DataSources/ElectronsPerSecondDataSource.py +61 -0
- PYME/IO/DataSources/FlatFieldDataSource.py +77 -0
- PYME/IO/DataSources/HDFDataSource.py +160 -0
- PYME/IO/DataSources/HTTPDataSource.py +80 -0
- PYME/IO/DataSources/ImageSeriesDataSource.py +123 -0
- PYME/IO/DataSources/MultiviewDataSource.py +99 -0
- PYME/IO/DataSources/OBFDataSource.py +67 -0
- PYME/IO/DataSources/RandomDataSource.py +23 -0
- PYME/IO/DataSources/SupertileDatasource.py +148 -0
- PYME/IO/DataSources/TQDataSource.py +41 -0
- PYME/IO/DataSources/TiffDataSource.py +193 -0
- PYME/IO/DataSources/TileDataSource.py +91 -0
- PYME/IO/DataSources/UnsplitDataSource.py +92 -0
- PYME/IO/DataSources/__init__.py +59 -0
- PYME/IO/FileUtils/IJLut.py +43 -0
- PYME/IO/FileUtils/RawToHdf5.py +105 -0
- PYME/IO/FileUtils/SPAD.py +54 -0
- PYME/IO/FileUtils/TiffSeqToHdf5.py +87 -0
- PYME/IO/FileUtils/__init__.py +24 -0
- PYME/IO/FileUtils/compHdf.py +39 -0
- PYME/IO/FileUtils/fileID.py +246 -0
- PYME/IO/FileUtils/fnlGen.py +40 -0
- PYME/IO/FileUtils/freeSpace.py +59 -0
- PYME/IO/FileUtils/h5-thumbnailer.py +85 -0
- PYME/IO/FileUtils/h5ExFrames.py +98 -0
- PYME/IO/FileUtils/h5ToTiffSeries.py +50 -0
- PYME/IO/FileUtils/h5r-thumbnailer.py +118 -0
- PYME/IO/FileUtils/h5rFormatDef.py +99 -0
- PYME/IO/FileUtils/h5rToTxt.py +77 -0
- PYME/IO/FileUtils/nameUtils.py +300 -0
- PYME/IO/FileUtils/obf_support.py +538 -0
- PYME/IO/FileUtils/ply.py +147 -0
- PYME/IO/FileUtils/readSpeckle.py +78 -0
- PYME/IO/FileUtils/readTiff.py +64 -0
- PYME/IO/FileUtils/saveTiffStack.py +137 -0
- PYME/IO/FileUtils/setup.py +36 -0
- PYME/IO/FileUtils/sf-thumbnailer.py +76 -0
- PYME/IO/FileUtils/stl.py +44 -0
- PYME/IO/FileUtils/thumbnailDatabase.py +104 -0
- PYME/IO/HTTPSpooler_v2.py +141 -0
- PYME/IO/MetaDataHandler.py +1072 -0
- PYME/IO/PZFFormat.py +375 -0
- PYME/IO/Spooler.py +279 -0
- PYME/IO/__init__.py +12 -0
- PYME/IO/acquisition_backends.py +353 -0
- PYME/IO/buffer_helpers.cp39-win_amd64.dll.a +0 -0
- PYME/IO/buffer_helpers.cp39-win_amd64.pyd +0 -0
- PYME/IO/buffer_helpers.pyx +190 -0
- PYME/IO/buffers.py +291 -0
- PYME/IO/clusterDuplication.py +204 -0
- PYME/IO/clusterExport.py +152 -0
- PYME/IO/clusterGlob.py +108 -0
- PYME/IO/clusterIO.py +1076 -0
- PYME/IO/clusterListing.py +232 -0
- PYME/IO/clusterResults.py +206 -0
- PYME/IO/clusterUpload.py +49 -0
- PYME/IO/cluster_directory.py +419 -0
- PYME/IO/cluster_streaming.py +216 -0
- PYME/IO/compatibility.py +12 -0
- PYME/IO/countdir/__init__.py +5 -0
- PYME/IO/countdir/setup.py +58 -0
- PYME/IO/csv_flavours.py +251 -0
- PYME/IO/dataExporter.py +470 -0
- PYME/IO/dataWrap.py +108 -0
- PYME/IO/dcimg.py +167 -0
- PYME/IO/events.py +161 -0
- PYME/IO/h5File.py +148 -0
- PYME/IO/h5rFile.py +323 -0
- PYME/IO/image.py +1447 -0
- PYME/IO/load_psf.py +26 -0
- PYME/IO/pyme_h5ls.py +58 -0
- PYME/IO/ragged.py +138 -0
- PYME/IO/rgb_image.py +94 -0
- PYME/IO/tabular.py +1338 -0
- PYME/IO/testClusterSpooling.py +199 -0
- PYME/IO/unifiedIO.py +301 -0
- PYME/LMVis/Extras/QPobjectSegment.py +220 -0
- PYME/LMVis/Extras/__init__.py +55 -0
- PYME/LMVis/Extras/animation.py +359 -0
- PYME/LMVis/Extras/annotation.py +78 -0
- PYME/LMVis/Extras/clusterAnalysis.py +460 -0
- PYME/LMVis/Extras/dockedPanel.py +69 -0
- PYME/LMVis/Extras/extra_layers.py +373 -0
- PYME/LMVis/Extras/fiducial.py +230 -0
- PYME/LMVis/Extras/flagZMotionArtifacts.py +60 -0
- PYME/LMVis/Extras/fusionUtils.py +9 -0
- PYME/LMVis/Extras/multiColourAnalysis.py +103 -0
- PYME/LMVis/Extras/multiviewMapping.py +489 -0
- PYME/LMVis/Extras/objectMeasurements.py +246 -0
- PYME/LMVis/Extras/particleTracking.py +272 -0
- PYME/LMVis/Extras/perFrameVariable.py +77 -0
- PYME/LMVis/Extras/photophysics.py +72 -0
- PYME/LMVis/Extras/pointSetGeneration.py +232 -0
- PYME/LMVis/Extras/pointwiseColoc.py +54 -0
- PYME/LMVis/Extras/saved_views.py +125 -0
- PYME/LMVis/Extras/scaleBox.py +115 -0
- PYME/LMVis/Extras/sequentialSpecies.py +125 -0
- PYME/LMVis/Extras/setBGImage.py +74 -0
- PYME/LMVis/Extras/shiftmapGenerator.py +138 -0
- PYME/LMVis/Extras/showShortcuts.py +69 -0
- PYME/LMVis/Extras/snapshot.py +135 -0
- PYME/LMVis/Extras/spherical_harmonics.py +98 -0
- PYME/LMVis/Extras/subsets.py +15 -0
- PYME/LMVis/Extras/surface_fitting.py +52 -0
- PYME/LMVis/Extras/temperaturePlot.py +53 -0
- PYME/LMVis/Extras/vibration.py +112 -0
- PYME/LMVis/VisGUI.py +506 -0
- PYME/LMVis/__init__.py +39 -0
- PYME/LMVis/colourFilterGUI.py +77 -0
- PYME/LMVis/colourPanel.py +491 -0
- PYME/LMVis/displayPane.py +462 -0
- PYME/LMVis/dyeRatios.py +116 -0
- PYME/LMVis/genImageDialog.py +298 -0
- PYME/LMVis/gl_offScreenHandler.py +134 -0
- PYME/LMVis/gl_render.py +1302 -0
- PYME/LMVis/gl_render3D.py +1453 -0
- PYME/LMVis/gl_render3D_shaders.py +1213 -0
- PYME/LMVis/glcanvas_core.py +1157 -0
- PYME/LMVis/imageView.py +752 -0
- PYME/LMVis/imageView2.py +372 -0
- PYME/LMVis/importTextDialog.py +342 -0
- PYME/LMVis/layer_panel.py +231 -0
- PYME/LMVis/layers/AxesOverlayLayer.py +126 -0
- PYME/LMVis/layers/LUTOverlayLayer.py +346 -0
- PYME/LMVis/layers/OverlayLayer.py +46 -0
- PYME/LMVis/layers/ScaleBarOverlayLayer.py +97 -0
- PYME/LMVis/layers/ScaleBoxOverlayLayer.py +181 -0
- PYME/LMVis/layers/SelectionOverlayLayer.py +124 -0
- PYME/LMVis/layers/__init__.py +53 -0
- PYME/LMVis/layers/base.py +319 -0
- PYME/LMVis/layers/image_layer.py +363 -0
- PYME/LMVis/layers/labels.py +186 -0
- PYME/LMVis/layers/layer_defaults.py +97 -0
- PYME/LMVis/layers/mesh.py +378 -0
- PYME/LMVis/layers/octree.py +194 -0
- PYME/LMVis/layers/pointcloud.py +372 -0
- PYME/LMVis/layers/quiver.py +271 -0
- PYME/LMVis/layers/text.py +250 -0
- PYME/LMVis/layers/tracks.py +309 -0
- PYME/LMVis/mv_math.py +78 -0
- PYME/LMVis/objectDarkMeasure.py +120 -0
- PYME/LMVis/pipeline.py +1227 -0
- PYME/LMVis/pipelineView.py +115 -0
- PYME/LMVis/pointSettingsPanel.py +135 -0
- PYME/LMVis/progGraph.py +59 -0
- PYME/LMVis/quadTreeSettings.py +90 -0
- PYME/LMVis/rendGauss.py +158 -0
- PYME/LMVis/renderers.py +576 -0
- PYME/LMVis/sessionpaths.py +136 -0
- PYME/LMVis/setup.py +39 -0
- PYME/LMVis/setup_exe.py +71 -0
- PYME/LMVis/shader_programs/DefaultShaderProgram.py +149 -0
- PYME/LMVis/shader_programs/GLProgram.py +119 -0
- PYME/LMVis/shader_programs/GouraudShaderProgram.py +157 -0
- PYME/LMVis/shader_programs/PointSpriteShaderProgram.py +163 -0
- PYME/LMVis/shader_programs/ShaderProgramFactory.py +54 -0
- PYME/LMVis/shader_programs/TesselShaderProgram.py +47 -0
- PYME/LMVis/shader_programs/WireFrameShaderProgram.py +50 -0
- PYME/LMVis/shader_programs/__init__.py +20 -0
- PYME/LMVis/shader_programs/oit_compositor.py +23 -0
- PYME/LMVis/shader_programs/shader_loader.py +84 -0
- PYME/LMVis/shader_programs/shader_program.py +168 -0
- PYME/LMVis/shader_programs/shaders/bigflatpoints_fs.glsl +16 -0
- PYME/LMVis/shader_programs/shaders/bigpoints_gs.glsl +40 -0
- PYME/LMVis/shader_programs/shaders/bigpointsprites_fs.glsl +20 -0
- PYME/LMVis/shader_programs/shaders/bigspheres_fs.glsl +53 -0
- PYME/LMVis/shader_programs/shaders/compose_fs.glsl +41 -0
- PYME/LMVis/shader_programs/shaders/compose_vs.glsl +25 -0
- PYME/LMVis/shader_programs/shaders/default_fs.glsl +27 -0
- PYME/LMVis/shader_programs/shaders/default_vs.glsl +88 -0
- PYME/LMVis/shader_programs/shaders/flatpoints_fs.glsl +27 -0
- PYME/LMVis/shader_programs/shaders/gouraud_flatpoints_fs.glsl +30 -0
- PYME/LMVis/shader_programs/shaders/gouraud_fs.glsl +26 -0
- PYME/LMVis/shader_programs/shaders/gouraud_oit_fs.glsl +68 -0
- PYME/LMVis/shader_programs/shaders/gouraud_vs.glsl +135 -0
- PYME/LMVis/shader_programs/shaders/image_fs.glsl +60 -0
- PYME/LMVis/shader_programs/shaders/image_vs.glsl +79 -0
- PYME/LMVis/shader_programs/shaders/phong_fs.glsl +43 -0
- PYME/LMVis/shader_programs/shaders/phong_vs.glsl +45 -0
- PYME/LMVis/shader_programs/shaders/pointsprites_fs.glsl +33 -0
- PYME/LMVis/shader_programs/shaders/pointsprites_vs.glsl +77 -0
- PYME/LMVis/shader_programs/shaders/spheres_fs.glsl +102 -0
- PYME/LMVis/shader_programs/shaders/tessel_fs.glsl +23 -0
- PYME/LMVis/shader_programs/shaders/tessel_vs.glsl +37 -0
- PYME/LMVis/shader_programs/shaders/text_fs.glsl +42 -0
- PYME/LMVis/shader_programs/shaders/text_vs.glsl +84 -0
- PYME/LMVis/shader_programs/shaders/widelines_fs.glsl +19 -0
- PYME/LMVis/shader_programs/shaders/widelines_gs.glsl +56 -0
- PYME/LMVis/shader_programs/shaders/widelines_vs.glsl +51 -0
- PYME/LMVis/statusLog.py +57 -0
- PYME/LMVis/triBlobs.py +142 -0
- PYME/LMVis/view_clipping_pane.py +429 -0
- PYME/LMVis/views.py +275 -0
- PYME/LMVis/visCore.py +1005 -0
- PYME/LMVis/visHelpers.py +880 -0
- PYME/LMVis/visHelpersMin.py +230 -0
- PYME/LMVis/workspaceTree.py +238 -0
- PYME/__init__.py +22 -0
- PYME/cluster/HTTPDataServer.py +1063 -0
- PYME/cluster/HTTPRulePusher.py +382 -0
- PYME/cluster/HTTPTaskPusher.py +377 -0
- PYME/cluster/PYMERuleNodeServer.py +192 -0
- PYME/cluster/PYMERuleServer.py +109 -0
- PYME/cluster/__init__.py +0 -0
- PYME/cluster/clusterUI/accounts/__init__.py +0 -0
- PYME/cluster/clusterUI/accounts/admin.py +85 -0
- PYME/cluster/clusterUI/accounts/forms.py +8 -0
- PYME/cluster/clusterUI/accounts/migrations/0001_initial.py +31 -0
- PYME/cluster/clusterUI/accounts/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/accounts/models.py +44 -0
- PYME/cluster/clusterUI/accounts/templates/accounts/user_form.html +13 -0
- PYME/cluster/clusterUI/accounts/templates/registration/initial_complete.html +6 -0
- PYME/cluster/clusterUI/accounts/templates/registration/initial_confirm.html +13 -0
- PYME/cluster/clusterUI/accounts/templates/registration/initial_done.html +7 -0
- PYME/cluster/clusterUI/accounts/templates/registration/verification.html +2 -0
- PYME/cluster/clusterUI/accounts/templates/registration/verification_subject.txt +1 -0
- PYME/cluster/clusterUI/accounts/urls.py +19 -0
- PYME/cluster/clusterUI/accounts/views.py +36 -0
- PYME/cluster/clusterUI/clusterUI/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterUI/settings.py +147 -0
- PYME/cluster/clusterUI/clusterUI/urls.py +31 -0
- PYME/cluster/clusterUI/clusterUI/wsgi.py +16 -0
- PYME/cluster/clusterUI/clusterbrowser/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterbrowser/admin.py +3 -0
- PYME/cluster/clusterUI/clusterbrowser/apps.py +7 -0
- PYME/cluster/clusterUI/clusterbrowser/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterbrowser/models.py +5 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/base.html +129 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/dirlisting.html +231 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/form_new_folder.html +18 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/form_upload_file.html +17 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/lightlisting.html +25 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/registration/login.html +38 -0
- PYME/cluster/clusterUI/clusterbrowser/urls.py +10 -0
- PYME/cluster/clusterUI/clusterbrowser/views.py +148 -0
- PYME/cluster/clusterUI/clusterstatus/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterstatus/admin.py +3 -0
- PYME/cluster/clusterUI/clusterstatus/apps.py +7 -0
- PYME/cluster/clusterUI/clusterstatus/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterstatus/models.py +5 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/load_content.html +29 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/queue_info.html +28 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/queue_info_content.html +50 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/status_dash.html +29 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/status_dash_content.html +90 -0
- PYME/cluster/clusterUI/clusterstatus/urls.py +9 -0
- PYME/cluster/clusterUI/clusterstatus/views.py +69 -0
- PYME/cluster/clusterUI/clusterui_tornado.py +117 -0
- PYME/cluster/clusterUI/deploy.py +62 -0
- PYME/cluster/clusterUI/localization/__init__.py +0 -0
- PYME/cluster/clusterUI/localization/admin.py +3 -0
- PYME/cluster/clusterUI/localization/apps.py +7 -0
- PYME/cluster/clusterUI/localization/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/localization/models.py +5 -0
- PYME/cluster/clusterUI/localization/templates/localization/settings_form.html +67 -0
- PYME/cluster/clusterUI/localization/urls.py +10 -0
- PYME/cluster/clusterUI/localization/views.py +170 -0
- PYME/cluster/clusterUI/manage.py +17 -0
- PYME/cluster/clusterUI/recipes/__init__.py +0 -0
- PYME/cluster/clusterUI/recipes/admin.py +3 -0
- PYME/cluster/clusterUI/recipes/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/recipes/models.py +3 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/extra_inputs.html +35 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/form_recipe.html +82 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/input_list.html +7 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editor.html +28 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editor_common.html +46 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editrun.html +93 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_standalone.html +100 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_template.html +109 -0
- PYME/cluster/clusterUI/recipes/urls.py +17 -0
- PYME/cluster/clusterUI/recipes/views.py +109 -0
- PYME/cluster/cluster_of_one.py +200 -0
- PYME/cluster/dataserver_wsgi.py +615 -0
- PYME/cluster/distribution.py +71 -0
- PYME/cluster/rulenodeserver.py +487 -0
- PYME/cluster/rules.py +979 -0
- PYME/cluster/ruleserver.py +1106 -0
- PYME/cluster/status.py +101 -0
- PYME/cluster/taskWorkerHTTP.py +522 -0
- PYME/cluster/webdav.py +1102 -0
- PYME/config.py +659 -0
- PYME/contrib/TextCtrlAutoComplete.py +582 -0
- PYME/contrib/__init__.py +7 -0
- PYME/contrib/aniso/__init__.py +2 -0
- PYME/contrib/aniso/aniso.py +268 -0
- PYME/contrib/auiFloatBook.py +94 -0
- PYME/contrib/congrid.py +127 -0
- PYME/contrib/dispatch/__init__.py +19 -0
- PYME/contrib/dispatch/dispatcher.py +289 -0
- PYME/contrib/gohlke/__init__.py +1 -0
- PYME/contrib/gohlke/_tifffile.cp39-win_amd64.dll.a +0 -0
- PYME/contrib/gohlke/_tifffile.cp39-win_amd64.pyd +0 -0
- PYME/contrib/gohlke/czifile.py +1289 -0
- PYME/contrib/gohlke/fcsfiles.py +514 -0
- PYME/contrib/gohlke/setup.py +54 -0
- PYME/contrib/gohlke/tifffile.py +3095 -0
- PYME/contrib/listctrlMixins.py +896 -0
- PYME/contrib/lzw.py +838 -0
- PYME/contrib/pad/__init__.py +13 -0
- PYME/contrib/pad/info_pad.py +18 -0
- PYME/contrib/pad/pad.py +670 -0
- PYME/contrib/setup.py +38 -0
- PYME/contrib/wxPlotPanel.py +137 -0
- PYME/experimental/SimReconstruction.py +49 -0
- PYME/experimental/__init__.pxd +0 -0
- PYME/experimental/__init__.py +4 -0
- PYME/experimental/_octree.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/_octree.cp39-win_amd64.pyd +0 -0
- PYME/experimental/_octree.pyx +477 -0
- PYME/experimental/_treap.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/_treap.cp39-win_amd64.pyd +0 -0
- PYME/experimental/_treap.pyx +267 -0
- PYME/experimental/_triangle_mesh.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/_triangle_mesh.cp39-win_amd64.pyd +0 -0
- PYME/experimental/_triangle_mesh.pxd +149 -0
- PYME/experimental/_triangle_mesh.pyx +2787 -0
- PYME/experimental/aqavg.py +40 -0
- PYME/experimental/dcimgFileChucker.py +375 -0
- PYME/experimental/dcimgSpoolShim.py +174 -0
- PYME/experimental/dcimg_chuck_test.py +78 -0
- PYME/experimental/dual_marching_cubes.py +801 -0
- PYME/experimental/dual_marching_cubes_v2.py +645 -0
- PYME/experimental/expectationMaximisation.py +298 -0
- PYME/experimental/func_octree.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/func_octree.cp39-win_amd64.pyd +0 -0
- PYME/experimental/func_octree.pyx +381 -0
- PYME/experimental/fusionRadial.py +520 -0
- PYME/experimental/fusionUtils.py +522 -0
- PYME/experimental/isosurface.py +147 -0
- PYME/experimental/labview_spooling_hacks.py +48 -0
- PYME/experimental/marching_cubes.py +811 -0
- PYME/experimental/marching_tetrahedra.py +343 -0
- PYME/experimental/modified_marching_cubes.py +1245 -0
- PYME/experimental/music.py +25 -0
- PYME/experimental/octree.py +188 -0
- PYME/experimental/pSpaceMap.py +34 -0
- PYME/experimental/pointFitConfoc.py +112 -0
- PYME/experimental/scanner_control.py +107 -0
- PYME/experimental/setup.py +109 -0
- PYME/experimental/spark.py +31 -0
- PYME/experimental/tcHist.py +71 -0
- PYME/experimental/treap.py +262 -0
- PYME/experimental/triangle_mesh.py +2287 -0
- PYME/experimental/triangle_mesh_utils.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/triangle_mesh_utils.cp39-win_amd64.pyd +0 -0
- PYME/experimental/triangle_utils.py +87 -0
- PYME/experimental/triangular_mesh.py +2255 -0
- PYME/experimental/zMotionArtifactUtils.py +55 -0
- PYME/localization/FitFactories/AstigGaussFitFR.py +175 -0
- PYME/localization/FitFactories/AstigGaussGPUFitFR.py +326 -0
- PYME/localization/FitFactories/BeadConvolvedAstigGaussFit.py +206 -0
- PYME/localization/FitFactories/ChecksumFR.py +82 -0
- PYME/localization/FitFactories/ChecksumGPUFR.py +213 -0
- PYME/localization/FitFactories/ChecksumMultifitSR.py +86 -0
- PYME/localization/FitFactories/ConfocCOIR.py +93 -0
- PYME/localization/FitFactories/Dumbell3DFitR.py +193 -0
- PYME/localization/FitFactories/DumbellFitR.py +163 -0
- PYME/localization/FitFactories/FFBase.py +403 -0
- PYME/localization/FitFactories/Gauss3DFitR.py +213 -0
- PYME/localization/FitFactories/GaussFitConstrR.py +177 -0
- PYME/localization/FitFactories/GaussMultifitLinesR.py +351 -0
- PYME/localization/FitFactories/GaussMultifitR.py +326 -0
- PYME/localization/FitFactories/GaussMultifitSR.py +373 -0
- PYME/localization/FitFactories/InterpFitR.py +236 -0
- PYME/localization/FitFactories/InterpFitWFR.py +111 -0
- PYME/localization/FitFactories/Interpolators/CSInterpolator.py +148 -0
- PYME/localization/FitFactories/Interpolators/CubeSInterpolatorP.py +121 -0
- PYME/localization/FitFactories/Interpolators/CubicSplineInterpolator.py +69 -0
- PYME/localization/FitFactories/Interpolators/LinearInterpolator.py +135 -0
- PYME/localization/FitFactories/Interpolators/LinearPInterpolatorP.py +95 -0
- PYME/localization/FitFactories/Interpolators/__init__.py +33 -0
- PYME/localization/FitFactories/Interpolators/baseInterpolator.py +202 -0
- PYME/localization/FitFactories/LatFitCOIR.py +82 -0
- PYME/localization/FitFactories/LatGaussFitFR.py +220 -0
- PYME/localization/FitFactories/LatObjFindFR.py +85 -0
- PYME/localization/FitFactories/LatPSFFitR.py +142 -0
- PYME/localization/FitFactories/MultiviewFitInterpNR.py +400 -0
- PYME/localization/FitFactories/PRInterpFitQR.py +192 -0
- PYME/localization/FitFactories/PRInterpFitR.py +223 -0
- PYME/localization/FitFactories/ROIExtractNR.py +93 -0
- PYME/localization/FitFactories/SpecGaussFitFR.py +174 -0
- PYME/localization/FitFactories/SplitterFitCOIR.py +142 -0
- PYME/localization/FitFactories/SplitterFitFNR.py +312 -0
- PYME/localization/FitFactories/SplitterFitFusionR.py +318 -0
- PYME/localization/FitFactories/SplitterFitInterpBNR.py +357 -0
- PYME/localization/FitFactories/SplitterFitInterpNR.py +343 -0
- PYME/localization/FitFactories/SplitterFitScavNR.py +352 -0
- PYME/localization/FitFactories/SplitterMultifitSR.py +410 -0
- PYME/localization/FitFactories/SplitterObjFindR.py +194 -0
- PYME/localization/FitFactories/SplitterROIExtractNR.py +91 -0
- PYME/localization/FitFactories/SplitterShiftEstFR.py +230 -0
- PYME/localization/FitFactories/__init__.py +103 -0
- PYME/localization/FitFactories/fitCommon.py +195 -0
- PYME/localization/FitFactories/zEstimators/__init__.py +29 -0
- PYME/localization/FitFactories/zEstimators/astigEstimator.py +173 -0
- PYME/localization/FitFactories/zEstimators/biplaneEstimator.py +209 -0
- PYME/localization/FitFactories/zEstimators/genericDualEstimator.py +232 -0
- PYME/localization/FitFactories/zEstimators/genericEstimator.py +224 -0
- PYME/localization/FitFactories/zEstimators/priEstimator.py +255 -0
- PYME/localization/MetaDataEdit.py +543 -0
- PYME/localization/Test/30_9_series_A_1.sf +0 -0
- PYME/localization/Test/PRI.md +45 -0
- PYME/localization/Test/PRI_qr.md +52 -0
- PYME/localization/Test/PRI_r.md +52 -0
- PYME/localization/Test/__init__.py +22 -0
- PYME/localization/Test/astig.md +50 -0
- PYME/localization/Test/astigCOI.md +50 -0
- PYME/localization/Test/astig_gauss.md +52 -0
- PYME/localization/Test/astig_pe.md +50 -0
- PYME/localization/Test/astig_splitter.md +66 -0
- PYME/localization/Test/astig_splitterCOI.md +67 -0
- PYME/localization/Test/astig_splitterQ.md +66 -0
- PYME/localization/Test/astig_theory.md +50 -0
- PYME/localization/Test/astig_theory.psf +0 -0
- PYME/localization/Test/astig_theory.tif +0 -0
- PYME/localization/Test/beads1.psf +0 -0
- PYME/localization/Test/beads1.tif +0 -0
- PYME/localization/Test/biplane_splitter.md +75 -0
- PYME/localization/Test/biplane_splitter2.md +103 -0
- PYME/localization/Test/biplane_splitter3.md +115 -0
- PYME/localization/Test/defoc.md +48 -0
- PYME/localization/Test/dumbell_3d.md +52 -0
- PYME/localization/Test/fitTestJig.py +172 -0
- PYME/localization/Test/fitTestJigSCMOS.py +487 -0
- PYME/localization/Test/fitTestJigWC.py +225 -0
- PYME/localization/Test/gauss.md +50 -0
- PYME/localization/Test/gaussCOI.md +50 -0
- PYME/localization/Test/pri_pe.md +50 -0
- PYME/localization/Test/pri_theory.md +51 -0
- PYME/localization/Test/pri_theory.psf +0 -0
- PYME/localization/Test/pri_theory.tif +0 -0
- PYME/localization/Test/psf_astig.psf +0 -0
- PYME/localization/Test/psf_astig.tif +0 -0
- PYME/localization/Test/psf_astig_bg_d.psf +0 -0
- PYME/localization/Test/psf_astig_bg_d.tif +0 -0
- PYME/localization/Test/psf_astig_pe.psf +0 -0
- PYME/localization/Test/psf_astig_pe.tif +0 -0
- PYME/localization/Test/psf_decon.psf +0 -0
- PYME/localization/Test/psf_decon.tif +0 -0
- PYME/localization/Test/psf_decon_pe.psf +0 -0
- PYME/localization/Test/psf_decon_pe.tif +0 -0
- PYME/localization/Test/psf_guess.psf +0 -0
- PYME/localization/Test/splitter.md +63 -0
- PYME/localization/Test/splitter_scav.md +63 -0
- PYME/localization/Test/test.psf +0 -0
- PYME/localization/Test/test.tif +0 -0
- PYME/localization/Test/test_decon.psf +0 -0
- PYME/localization/Test/test_decon.tif +0 -0
- PYME/localization/Test/test_pe.psf +0 -0
- PYME/localization/Test/test_pe.tif +0 -0
- PYME/localization/Test/wf_theory.psf +0 -0
- PYME/localization/Test/wf_theory2.psf +0 -0
- PYME/localization/__init__.py +17 -0
- PYME/localization/autopsf/__init__.py +1 -0
- PYME/localization/autopsf/autopsf.py +486 -0
- PYME/localization/autopsf/roifit.py +310 -0
- PYME/localization/cInterp/__init__.py +24 -0
- PYME/localization/cInterp/cInterp.cp39-win_amd64.dll.a +0 -0
- PYME/localization/cInterp/cInterp.cp39-win_amd64.pyd +0 -0
- PYME/localization/cInterp/setup.py +54 -0
- PYME/localization/cModels/__init__.py +24 -0
- PYME/localization/cModels/gauss_app.cp39-win_amd64.dll.a +0 -0
- PYME/localization/cModels/gauss_app.cp39-win_amd64.pyd +0 -0
- PYME/localization/ofind.py +444 -0
- PYME/localization/ofind3d.py +306 -0
- PYME/localization/ofind_nofilt.py +128 -0
- PYME/localization/ofind_pri.py +478 -0
- PYME/localization/ofind_split.py +399 -0
- PYME/localization/ofind_xcorr.py +351 -0
- PYME/localization/ofind_xcorr_fw.py +441 -0
- PYME/localization/remFitBuf.py +657 -0
- PYME/localization/setup.py +56 -0
- PYME/localization/splitting.py +240 -0
- PYME/localization/twist.py +60 -0
- PYME/misc/TiSettings.py +36 -0
- PYME/misc/TiffImagePlugin.py +838 -0
- PYME/misc/VolProj.py +144 -0
- PYME/misc/__init__.py +25 -0
- PYME/misc/aligned_array.py +10 -0
- PYME/misc/aniso.py +29 -0
- PYME/misc/big_sur_fix.py +20 -0
- PYME/misc/check_for_updates.py +139 -0
- PYME/misc/colormaps.py +199 -0
- PYME/misc/colorsys.py +201 -0
- PYME/misc/computerName.py +33 -0
- PYME/misc/coverslipGeometries.py +60 -0
- PYME/misc/cython_numpy_monkey.py +40 -0
- PYME/misc/depGraph.py +406 -0
- PYME/misc/dirSize.py +31 -0
- PYME/misc/diskCleanup.py +64 -0
- PYME/misc/djangoRecarray.py +57 -0
- PYME/misc/django_widgets.py +27 -0
- PYME/misc/editgrid.py +101 -0
- PYME/misc/eventSpy.py +122 -0
- PYME/misc/exceptions.py +30 -0
- PYME/misc/facsPlot.py +89 -0
- PYME/misc/fbpIcons.py +90 -0
- PYME/misc/fftw_compat.py +28 -0
- PYME/misc/findCycles.py +91 -0
- PYME/misc/fortran_interrupt_defeat.py +43 -0
- PYME/misc/glassModel.py +64 -0
- PYME/misc/hash32.py +41 -0
- PYME/misc/hillcurve.py +88 -0
- PYME/misc/hybrid_ns.py +84 -0
- PYME/misc/kdFit.py +72 -0
- PYME/misc/locate.py +10 -0
- PYME/misc/memUsage.py +65 -0
- PYME/misc/memmap.py +52 -0
- PYME/misc/mock_ctypes.py +28 -0
- PYME/misc/mock_traits.py +59 -0
- PYME/misc/mock_traitsui.py +29 -0
- PYME/misc/pyme_zeroconf.py +287 -0
- PYME/misc/pyro_tracebacks.py +32 -0
- PYME/misc/read_agf.py +605 -0
- PYME/misc/sffake.py +16 -0
- PYME/misc/snells.py +71 -0
- PYME/misc/sqlite_ns.py +132 -0
- PYME/misc/sqlitendarray.py +56 -0
- PYME/misc/taskDef.py +44 -0
- PYME/misc/tempDB.py +56 -0
- PYME/misc/wxThread.py +33 -0
- PYME/misc/zemax.py +259 -0
- PYME/misc/zernike.py +151 -0
- PYME/pyme_warnings.py +70 -0
- PYME/recipes/Recipes/STEDDeconvolution.yaml +14 -0
- PYME/recipes/Recipes/STEDMinistacks.yaml +15 -0
- PYME/recipes/Recipes/STED_COP3.yaml +25 -0
- PYME/recipes/Recipes/blobMeas.yaml +19 -0
- PYME/recipes/Recipes/blobMeas2.yaml +37 -0
- PYME/recipes/Recipes/blobMeasSR.yaml +66 -0
- PYME/recipes/Recipes/coloc.yaml +43 -0
- PYME/recipes/Recipes/coloc_roi_masked.yaml +46 -0
- PYME/recipes/Recipes/multiblob.yaml +38 -0
- PYME/recipes/Recipes/pre_particleTracking.yaml +30 -0
- PYME/recipes/Recipes/segmentAndMeasureLoci.yaml +41 -0
- PYME/recipes/__init__.py +6 -0
- PYME/recipes/acquisition.py +158 -0
- PYME/recipes/bakeshop.py +32 -0
- PYME/recipes/base.py +1393 -0
- PYME/recipes/batchProcess.py +147 -0
- PYME/recipes/filters.py +394 -0
- PYME/recipes/fudges.py +41 -0
- PYME/recipes/graphing.py +108 -0
- PYME/recipes/html_recipe_editor.py +90 -0
- PYME/recipes/localisations.py +1386 -0
- PYME/recipes/machine_learning.py +286 -0
- PYME/recipes/measurement.py +1062 -0
- PYME/recipes/modules.py +50 -0
- PYME/recipes/multiview.py +435 -0
- PYME/recipes/output.py +667 -0
- PYME/recipes/pointcloud.py +510 -0
- PYME/recipes/processing.py +2954 -0
- PYME/recipes/pyramid.py +206 -0
- PYME/recipes/recipe.py +965 -0
- PYME/recipes/recipeGui.py +1029 -0
- PYME/recipes/recipeLayout.py +499 -0
- PYME/recipes/runRecipe.py +140 -0
- PYME/recipes/setup.py +37 -0
- PYME/recipes/simulation.py +91 -0
- PYME/recipes/skfilters.py +143 -0
- PYME/recipes/surface_fitting.py +776 -0
- PYME/recipes/tablefilters.py +275 -0
- PYME/recipes/tracking.py +343 -0
- PYME/recipes/traits.py +157 -0
- PYME/recipes/vertical_recipe_display.py +373 -0
- PYME/resources/__init__.py +23 -0
- PYME/resources/config_template/distributor.yaml +14 -0
- PYME/resources/config_template/nodeserver.yaml +15 -0
- PYME/resources/icons/LUT.png +0 -0
- PYME/resources/icons/YSM_Shield.png +0 -0
- PYME/resources/icons/YSM_logo.png +0 -0
- PYME/resources/icons/arrow.png +0 -0
- PYME/resources/icons/crosshairs.png +0 -0
- PYME/resources/icons/line_select.png +0 -0
- PYME/resources/icons/logo_fmhs.png +0 -0
- PYME/resources/icons/media-playback-pause.png +0 -0
- PYME/resources/icons/media-playback-start.png +0 -0
- PYME/resources/icons/media-skip-backward.png +0 -0
- PYME/resources/icons/media-skip-forward.png +0 -0
- PYME/resources/icons/mesh.png +0 -0
- PYME/resources/icons/mesh.svg +28 -0
- PYME/resources/icons/pmacquire.icns +0 -0
- PYME/resources/icons/pmacquire.ico +0 -0
- PYME/resources/icons/pmanal.icns +0 -0
- PYME/resources/icons/pmanal.ico +0 -0
- PYME/resources/icons/pmvis.icns +0 -0
- PYME/resources/icons/pmvis.ico +0 -0
- PYME/resources/icons/points.png +0 -0
- PYME/resources/icons/points.svg +16 -0
- PYME/resources/icons/pymeLogo.png +0 -0
- PYME/resources/icons/rect_select.png +0 -0
- PYME/resources/icons/squiggle_select.png +0 -0
- PYME/resources/icons/text3800.icns +0 -0
- PYME/resources/icons/text3800.ico +0 -0
- PYME/resources/icons/text3800.png +0 -0
- PYME/resources/icons/text3800.tif +0 -0
- PYME/resources/icons/text5377.icns +0 -0
- PYME/resources/icons/text5377.ico +0 -0
- PYME/resources/icons/text5377.png +0 -0
- PYME/resources/icons/tracks.png +0 -0
- PYME/resources/icons/tracks.svg +19 -0
- PYME/resources/icons/view-front.png +0 -0
- PYME/resources/icons/view-home.png +0 -0
- PYME/resources/icons/view-right.png +0 -0
- PYME/resources/icons/view-top.png +0 -0
- PYME/resources/test_datasets/README.md +8 -0
- PYME/resources/test_datasets/t_im.tif +0 -0
- PYME/resources/test_datasets/test_csv.csv +4282 -0
- PYME/resources/test_datasets/test_hdf.hdf +0 -0
- PYME/resources/web/rule_inline.html +21 -0
- PYME/resources/web/ruleserver.html +75 -0
- PYME/resources/web/static/bootstrap.min.js +7 -0
- PYME/resources/web/static/cluster.css +137 -0
- PYME/resources/web/static/css/bootstrap-theme.css +587 -0
- PYME/resources/web/static/css/bootstrap-theme.min.css +6 -0
- PYME/resources/web/static/css/bootstrap.css +6757 -0
- PYME/resources/web/static/css/bootstrap.min.css +6 -0
- PYME/resources/web/static/css/flat_design_colors_full.css +306 -0
- PYME/resources/web/static/css/recipe_editor.css +106 -0
- PYME/resources/web/static/dashboard.css +106 -0
- PYME/resources/web/static/fileselector.js +77 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.eot +0 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.svg +288 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.ttf +0 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.woff +0 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.woff2 +0 -0
- PYME/resources/web/static/images/osd_flat/LICENSE.txt +116 -0
- PYME/resources/web/static/images/osd_flat/README.md +9 -0
- PYME/resources/web/static/images/osd_flat/fullpage_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/fullpage_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/fullpage_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/fullpage_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_rest.png +0 -0
- PYME/resources/web/static/jigna-vue-bare.js +1395 -0
- PYME/resources/web/static/jquery.min.js +2 -0
- PYME/resources/web/static/jstree.min.js +6 -0
- PYME/resources/web/static/openSeadragonGL.js +102 -0
- PYME/resources/web/static/openseadragon-svg-overlay.js +103 -0
- PYME/resources/web/static/openseadragon-viewerinputhook.min.js +6 -0
- PYME/resources/web/static/openseadragon.min.js +9 -0
- PYME/resources/web/static/recipe_editor.js +119 -0
- PYME/resources/web/static/shaders/fragment/lut.glsl +20 -0
- PYME/resources/web/static/shaders/fragment/none.glsl +17 -0
- PYME/resources/web/static/shaders/fragment/outline.glsl +43 -0
- PYME/resources/web/static/shaders/fragment/rect.glsl +7 -0
- PYME/resources/web/static/shaders/fragment/sobel3.glsl +71 -0
- PYME/resources/web/static/shaders/fragment/white.glsl +4 -0
- PYME/resources/web/static/shaders/vertex/rect.glsl +22 -0
- PYME/resources/web/static/shaders/vertex/square.glsl +9 -0
- PYME/resources/web/static/utils.js +3 -0
- PYME/resources/web/static/viaWebGL.js +217 -0
- PYME/setup.py +109 -0
- PYME/setup_exe.py +57 -0
- PYME/simulation/__init__.py +0 -0
- PYME/simulation/locify.py +319 -0
- PYME/simulation/pointsets.py +279 -0
- PYME/simulation/wormlike.py +99 -0
- PYME/simulation/wormlike2.py +198 -0
- PYME/simulation/wormlike3.py +197 -0
- PYME/simulation/wormlike_curled.py +104 -0
- PYME/tileviewer/__init__.py +0 -0
- PYME/tileviewer/templates/roi_list.html +12 -0
- PYME/tileviewer/templates/tileviewer.html +247 -0
- PYME/tileviewer/tileviewer.py +207 -0
- PYME/ui/AUIFrame.py +279 -0
- PYME/ui/MetadataTree.py +469 -0
- PYME/ui/__init__.py +4 -0
- PYME/ui/about_dlg.py +29 -0
- PYME/ui/autoFoldPanel.py +643 -0
- PYME/ui/cascading_layout.py +45 -0
- PYME/ui/crop_dialog.py +145 -0
- PYME/ui/custom_traits_editors.py +508 -0
- PYME/ui/editFilterDialog.py +80 -0
- PYME/ui/editList.py +40 -0
- PYME/ui/fastGraph.py +240 -0
- PYME/ui/filterPane.py +348 -0
- PYME/ui/histLimits.py +543 -0
- PYME/ui/layerFoldPanel.py +232 -0
- PYME/ui/manualFoldPanel.py +870 -0
- PYME/ui/mytimer.py +116 -0
- PYME/ui/patch_traitsui.py +151 -0
- PYME/ui/progress.py +160 -0
- PYME/ui/recArrayView.py +145 -0
- PYME/ui/selection.py +71 -0
- PYME/ui/shell.py +37 -0
- PYME/ui/traitsui_constants.py +91 -0
- PYME/ui/wx_compat.py +43 -0
- PYME/update_version.py +159 -0
- PYME/util/__init__.py +3 -0
- PYME/util/authenticate.py +164 -0
- PYME/util/execfile.py +21 -0
- PYME/util/fProfile/__init__.py +1 -0
- PYME/util/fProfile/convertProfile.py +117 -0
- PYME/util/fProfile/fProfile.py +162 -0
- PYME/util/fProfile/html/404.html +60 -0
- PYME/util/fProfile/html/css/main.css +258 -0
- PYME/util/fProfile/html/css/normalize.css +427 -0
- PYME/util/fProfile/html/css/normalize.min.css +1 -0
- PYME/util/fProfile/html/index.html +64 -0
- PYME/util/fProfile/html/js/main.js +492 -0
- PYME/util/fProfile/html/js/plugins.js +24 -0
- PYME/util/fProfile/html/js/vendor/crossfilter.min.js +1 -0
- PYME/util/fProfile/html/js/vendor/jquery-1.11.2.min.js +4 -0
- PYME/util/fProfile/html/js/vendor/modernizr-2.8.3.min.js +4 -0
- PYME/util/fProfile/html/js/vendor/tinycolor-min.js +4 -0
- PYME/util/fProfile/viewProfile.py +30 -0
- PYME/util/install_dependencies.py +95 -0
- PYME/util/log_verbosity.py +11 -0
- PYME/util/mProfile/__init__.py +1 -0
- PYME/util/mProfile/colorize_db_t.py +297 -0
- PYME/util/mProfile/mProfile.py +164 -0
- PYME/util/mProfile/p.py +101 -0
- PYME/util/mProfile/tProfile.py +165 -0
- PYME/util/pymelauncher.py +47 -0
- PYME/util/shmarray/__init__.py +0 -0
- PYME/util/shmarray/shmTest.py +74 -0
- PYME/util/shmarray/shmarray.py +165 -0
- PYME/util/webframework.py +365 -0
- PYME/version.py +65 -0
- python_microscopy-25.6.5.dist-info/METADATA +68 -0
- python_microscopy-25.6.5.dist-info/RECORD +1277 -0
- python_microscopy-25.6.5.dist-info/WHEEL +4 -0
|
@@ -0,0 +1,958 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
Created on Sat May 28 20:42:16 2016
|
|
4
|
+
|
|
5
|
+
@author: david
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
#import datetime
|
|
10
|
+
from PYME.IO import acquisition_backends
|
|
11
|
+
# TODO: change to use a metadata handler / provideStartMetadata hook
|
|
12
|
+
# MetaDataHandler.provideStartMetadata from the init file when
|
|
13
|
+
# loading the sampleinfo interface, see Acquire/Scripts/init.py
|
|
14
|
+
try:
|
|
15
|
+
from PYME.Acquire import sampleInformation
|
|
16
|
+
sampInf = True
|
|
17
|
+
except:
|
|
18
|
+
print('Could not connect to the sample information database')
|
|
19
|
+
sampInf = False
|
|
20
|
+
#import win32api
|
|
21
|
+
from PYME.IO.FileUtils import nameUtils
|
|
22
|
+
from PYME.IO.FileUtils.nameUtils import numToAlpha, getRelFilename, genHDFDataFilepath
|
|
23
|
+
from PYME.IO import unifiedIO, MetaDataHandler
|
|
24
|
+
|
|
25
|
+
from PYME.Acquire.protocol_acquisition import ProtocolAcquisition
|
|
26
|
+
from PYME.Acquire.xyztc import XYZTCAcquisition, ZStackAcquisition
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
#import PYME.Acquire.Protocols
|
|
30
|
+
import PYME.Acquire.protocol as prot
|
|
31
|
+
from PYME.Acquire.ui import preflight
|
|
32
|
+
from PYME.Acquire import stackSettings
|
|
33
|
+
from PYME import config
|
|
34
|
+
|
|
35
|
+
from PYME.misc import hybrid_ns
|
|
36
|
+
|
|
37
|
+
import os
|
|
38
|
+
import sys
|
|
39
|
+
import json
|
|
40
|
+
|
|
41
|
+
import subprocess
|
|
42
|
+
import threading
|
|
43
|
+
try:
|
|
44
|
+
import queue
|
|
45
|
+
except ImportError:
|
|
46
|
+
# py2, remove this when we can
|
|
47
|
+
import Queue as queue # type: ignore
|
|
48
|
+
|
|
49
|
+
from PYME.contrib import dispatch
|
|
50
|
+
|
|
51
|
+
import logging
|
|
52
|
+
logger = logging.getLogger(__name__)
|
|
53
|
+
|
|
54
|
+
from PYME.util import webframework
|
|
55
|
+
|
|
56
|
+
class ProtocolAcquisitionSettings(object):
|
|
57
|
+
'''
|
|
58
|
+
Manages settings which are specific to protocol-based acquisitions
|
|
59
|
+
'''
|
|
60
|
+
def __init__(self) -> None:
|
|
61
|
+
self.protocol = prot.NullProtocol
|
|
62
|
+
self.protocolZ = prot.NullZProtocol
|
|
63
|
+
self.z_stepped = False # z-step during acquisition
|
|
64
|
+
self.z_dwell = 100 # time to spend at each z level (if z_stepped == True)
|
|
65
|
+
|
|
66
|
+
def set_protocol(self, protocolName=None, reloadProtocol=True):
|
|
67
|
+
"""
|
|
68
|
+
Set the current protocol.
|
|
69
|
+
|
|
70
|
+
Parameters
|
|
71
|
+
----------
|
|
72
|
+
protocolName: str
|
|
73
|
+
path to protocol file including extension
|
|
74
|
+
reloadProtocol : bool
|
|
75
|
+
currently ignored; protocol module is reinitialized regardless.
|
|
76
|
+
|
|
77
|
+
See also: PYME.Acquire.Protocols.
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
if (protocolName is None) or (protocolName == '<None>'):
|
|
81
|
+
self.protocol = prot.NullProtocol
|
|
82
|
+
self.protocolZ = prot.NullZProtocol
|
|
83
|
+
else:
|
|
84
|
+
#pmod = __import__('PYME.Acquire.Protocols.' + protocolName.split('.')[0],fromlist=['PYME', 'Acquire','Protocols'])
|
|
85
|
+
|
|
86
|
+
#if reloadProtocol:
|
|
87
|
+
# reload(pmod) #force module to be reloaded so that changes in the protocol will be recognised
|
|
88
|
+
pmod = prot.get_protocol(protocol_name=protocolName, reloadProtocol=reloadProtocol)
|
|
89
|
+
|
|
90
|
+
self.protocol = pmod.PROTOCOL
|
|
91
|
+
self.protocol.filename = protocolName
|
|
92
|
+
|
|
93
|
+
self.protocolZ = pmod.PROTOCOL_STACK
|
|
94
|
+
self.protocolZ.filename = protocolName
|
|
95
|
+
self.z_dwell = self.protocolZ.dwellTime
|
|
96
|
+
|
|
97
|
+
def get_protocol_for_acquisition(self, settings={}):
|
|
98
|
+
stack = settings.get('z_stepped', self.z_stepped)
|
|
99
|
+
stack_settings = settings.get('stack_settings', None)
|
|
100
|
+
|
|
101
|
+
# try stack settings for z_dwell, then aq settings.
|
|
102
|
+
# precedence is settings > stack_settings > self.z_dwell
|
|
103
|
+
# The reasoning for allowing the dwell time to be set in either the spooling or stack settings is to allow
|
|
104
|
+
# API users to choose which is most coherent for their use case (it would seem logical to put dwell time with
|
|
105
|
+
# the other stack settings, but this becomes problematic when sharing stack settings across modalities - e.g.
|
|
106
|
+
# PALM/STORM and widefield stacks which are likely to share most of the stack settings but have greatly different
|
|
107
|
+
# z dwell times). PYMEAcquire specifies it in the spooling/series settings by default to allow shared usage
|
|
108
|
+
# between modalities.
|
|
109
|
+
if stack_settings:
|
|
110
|
+
if isinstance(stack_settings, dict):
|
|
111
|
+
z_dwell = stack_settings.get('DwellFrames', self.z_dwell)
|
|
112
|
+
else:
|
|
113
|
+
# have a StackSettings object
|
|
114
|
+
# TODO - fix this to be a bit more sane and not use private attributes etc ...
|
|
115
|
+
z_dwell = stack_settings._dwell_frames
|
|
116
|
+
# z_dwell defaults to -1 (with a meaning of ignore) in StackSettings objects if not value is not
|
|
117
|
+
# explicitly provided. In this case, use our internal value instead. The reason for the 'ignore'
|
|
118
|
+
# special value is to allow the same StackSettings object to be used for widefield stacks and
|
|
119
|
+
# localization series (where sharing everything except dwell time makes sense).
|
|
120
|
+
if z_dwell < 1:
|
|
121
|
+
z_dwell = self.z_dwell
|
|
122
|
+
else:
|
|
123
|
+
z_dwell = self.z_dwell
|
|
124
|
+
|
|
125
|
+
z_dwell = settings.get('z_dwell', z_dwell)
|
|
126
|
+
protocol_name = settings.get('protocol_name', None)
|
|
127
|
+
|
|
128
|
+
if protocol_name is None:
|
|
129
|
+
protocol, protocol_z = self.protocol, self.protocolZ
|
|
130
|
+
else:
|
|
131
|
+
pmod = prot.get_protocol(protocol_name)
|
|
132
|
+
protocol, protocol_z = pmod.PROTOCOL, pmod.PROTOCOL_STACK
|
|
133
|
+
|
|
134
|
+
if stack:
|
|
135
|
+
protocol = protocol_z
|
|
136
|
+
protocol.dwellTime = z_dwell
|
|
137
|
+
#print(protocol)
|
|
138
|
+
else:
|
|
139
|
+
protocol = protocol
|
|
140
|
+
|
|
141
|
+
return protocol
|
|
142
|
+
|
|
143
|
+
class SpoolController(object):
|
|
144
|
+
def __init__(self, scope, defDir=genHDFDataFilepath(), defSeries='%(day)d_%(month)d_series'):
|
|
145
|
+
"""Initialise the spooling controller.
|
|
146
|
+
|
|
147
|
+
Parameters
|
|
148
|
+
----------
|
|
149
|
+
scope : microscope instance
|
|
150
|
+
The currently active microscope class (see microscope.py)
|
|
151
|
+
defDir : string pattern
|
|
152
|
+
The default directory to save data to. Any keys of the form `%(<key>)`
|
|
153
|
+
will be substituted using the values defined in `PYME.fileUtils.nameUtils.dateDict`
|
|
154
|
+
defSeries : string pattern
|
|
155
|
+
This specifies a pattern for file naming. Keys will be substituted as for `defDir`
|
|
156
|
+
|
|
157
|
+
"""
|
|
158
|
+
self.scope = scope
|
|
159
|
+
|
|
160
|
+
if int(sys.version[0]) < 3:
|
|
161
|
+
#default to Queue for Py2
|
|
162
|
+
self.spoolType = 'Queue'
|
|
163
|
+
else:
|
|
164
|
+
#else default to file
|
|
165
|
+
self.spoolType = 'File'
|
|
166
|
+
|
|
167
|
+
self._base_dir = nameUtils.get_local_data_directory()
|
|
168
|
+
self._dirname = os.sep.join([self._base_dir, ] + nameUtils.get_spool_subdir())
|
|
169
|
+
self._cluster_dirname = self.get_cluster_dirname(self._dirname)
|
|
170
|
+
|
|
171
|
+
self.seriesStub = defSeries % nameUtils.dateDict
|
|
172
|
+
|
|
173
|
+
self.seriesCounter = 0
|
|
174
|
+
self._series_name = None
|
|
175
|
+
|
|
176
|
+
self.acquisition_types = {
|
|
177
|
+
'ZStackAcquisition': ZStackAcquisition,
|
|
178
|
+
'ProtocolAcquisition': ProtocolAcquisition,
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
self.acquisition_type='ProtocolAcquisition'
|
|
183
|
+
self.protocol_settings = ProtocolAcquisitionSettings()
|
|
184
|
+
|
|
185
|
+
self.onSpoolProgress = dispatch.Signal()
|
|
186
|
+
self.onSpoolStart = dispatch.Signal()
|
|
187
|
+
self.on_stop = dispatch.Signal()
|
|
188
|
+
|
|
189
|
+
self.analysis_mode = 'interactive' # 'interactive' or 'rule-based'
|
|
190
|
+
self.analysis_rule_name = 'default'
|
|
191
|
+
self.analysis_launch_mode = 'triggered' # 'triggered' or 'series-end
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
self._analysis_launchers = queue.Queue(3)
|
|
195
|
+
|
|
196
|
+
self._status_changed_condition = threading.Condition()
|
|
197
|
+
|
|
198
|
+
#settings which were managed by GUI
|
|
199
|
+
self.hdf_compression_level = 2 # zlib compression level that pytables should use (spool to file and queue)
|
|
200
|
+
|
|
201
|
+
self.cluster_h5 = False # spool to h5 on cluster (cluster of one)
|
|
202
|
+
self.pzf_compression_settings=acquisition_backends.ClusterBackend.default_compression_settings # only for cluster spooling
|
|
203
|
+
|
|
204
|
+
#check to see if we have a cluster
|
|
205
|
+
self._N_data_servers = len(hybrid_ns.getNS('_pyme-http').get_advertised_services())
|
|
206
|
+
if self._N_data_servers > 0:
|
|
207
|
+
# switch to cluster as spool method if available.
|
|
208
|
+
self.SetSpoolMethod('Cluster')
|
|
209
|
+
|
|
210
|
+
if self._N_data_servers == 1:
|
|
211
|
+
self.cluster_h5 = True # we have a cluster of one
|
|
212
|
+
|
|
213
|
+
@property
|
|
214
|
+
def available_spool_methods(self):
|
|
215
|
+
if False:#self.acquisition_type == 'ProtocolAcquision':
|
|
216
|
+
return ['File', 'Cluster']
|
|
217
|
+
else:
|
|
218
|
+
return ['File', 'Cluster', 'Memory', 'Tiff folder']
|
|
219
|
+
|
|
220
|
+
def get_info(self):
|
|
221
|
+
info = {'settings' : self.get_settings(),
|
|
222
|
+
'series_name' : self.seriesName,
|
|
223
|
+
'available_spool_methods' : self.available_spool_methods
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
try:
|
|
227
|
+
info['status'] = self.spooler.status()
|
|
228
|
+
except AttributeError:
|
|
229
|
+
info['status'] = {'spooling':False}
|
|
230
|
+
|
|
231
|
+
return info
|
|
232
|
+
|
|
233
|
+
def register_acquisition_type(self, name, cls):
|
|
234
|
+
self.acquisition_types[name] = cls
|
|
235
|
+
|
|
236
|
+
def update_settings(self, settings):
|
|
237
|
+
"""
|
|
238
|
+
Sets the state of the `SpoolController` by calling set-methods or by
|
|
239
|
+
setting attributes.
|
|
240
|
+
|
|
241
|
+
Parameters
|
|
242
|
+
----------
|
|
243
|
+
settings : dict
|
|
244
|
+
keys should be `SpoolController` attributes or properties with
|
|
245
|
+
setters. Not all keys must be present, and example keys include:
|
|
246
|
+
method : str
|
|
247
|
+
One of 'File', 'Cluster', or 'Queue'(py2 only)
|
|
248
|
+
hdf_compression_level: int
|
|
249
|
+
zlib compression level that pytables should use (spool to
|
|
250
|
+
file and queue)
|
|
251
|
+
z_stepped : bool
|
|
252
|
+
toggle z-stepping during acquisition
|
|
253
|
+
z_dwell : int
|
|
254
|
+
number of frames to acquire at each z level (predicated on
|
|
255
|
+
`SpoolController.z_stepped` being True)
|
|
256
|
+
cluster_h5 : bool
|
|
257
|
+
Toggle spooling to single h5 file on cluster rather than pzf
|
|
258
|
+
file per frame. Only applicable to 'Cluster' `method` and
|
|
259
|
+
preferred for PYMEClusterOfOne.
|
|
260
|
+
pzf_compression_settings : dict
|
|
261
|
+
Compression settings relevant for 'Cluster' `method` if
|
|
262
|
+
`cluster_h5` is False. See acquisition_backends.ClusterBackend.default_compression_settings.
|
|
263
|
+
protocol_name : str
|
|
264
|
+
Note that passing the protocol name will force a (re)load of
|
|
265
|
+
the protocol file (even if it is already selected).
|
|
266
|
+
Notable keys which are not supported through this method include
|
|
267
|
+
'series_name', 'seriesName' and 'dirname'.
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
"""
|
|
271
|
+
method = settings.pop('method', None)
|
|
272
|
+
if method and method != self.spoolType:
|
|
273
|
+
self.SetSpoolMethod(method)
|
|
274
|
+
|
|
275
|
+
protocol_name = settings.pop('protocol_name', None)
|
|
276
|
+
if protocol_name:
|
|
277
|
+
self.protocol_settings.SetProtocol(protocol_name)
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
pzf_settings = settings.pop('pzf_compression_settings', None)
|
|
281
|
+
if pzf_settings:
|
|
282
|
+
self.pzf_compression_settings = dict(pzf_settings)
|
|
283
|
+
|
|
284
|
+
for k, v in settings.items():
|
|
285
|
+
if k in ['z_stepped', 'z_dwell']:
|
|
286
|
+
# these settings belong to the protocol
|
|
287
|
+
# TODO - rename to protocol.xx???
|
|
288
|
+
setattr(self.protocol_settings, k, v)
|
|
289
|
+
else:
|
|
290
|
+
setattr(self, k, v)
|
|
291
|
+
|
|
292
|
+
with self._status_changed_condition:
|
|
293
|
+
self._status_changed_condition.notify_all()
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
@property
|
|
298
|
+
def _sep(self):
|
|
299
|
+
if self.spoolType == 'Cluster':
|
|
300
|
+
return '/'
|
|
301
|
+
else:
|
|
302
|
+
return os.sep
|
|
303
|
+
|
|
304
|
+
@property
|
|
305
|
+
def dirname(self):
|
|
306
|
+
return self.get_dirname()
|
|
307
|
+
|
|
308
|
+
def get_dirname(self, subdirectory=None, spoolType=None):
|
|
309
|
+
""" Get the current directory name, including any subdirectories from
|
|
310
|
+
chunking or additional spec.
|
|
311
|
+
|
|
312
|
+
Parameters
|
|
313
|
+
----------
|
|
314
|
+
subdirectory : str, optional
|
|
315
|
+
Directory within current set directory to spool this series. The
|
|
316
|
+
directory will be created if it doesn't already exist.
|
|
317
|
+
|
|
318
|
+
spoolType : str, optional
|
|
319
|
+
Used when using get_dirname externally (e.g. in tiling) to over-ride the spool type.
|
|
320
|
+
|
|
321
|
+
Returns
|
|
322
|
+
-------
|
|
323
|
+
str
|
|
324
|
+
spool directory name
|
|
325
|
+
"""
|
|
326
|
+
|
|
327
|
+
if spoolType is None:
|
|
328
|
+
spoolType = self.spoolType
|
|
329
|
+
|
|
330
|
+
dir = self._dirname if spoolType.lower() != 'cluster' else self._cluster_dirname
|
|
331
|
+
|
|
332
|
+
if subdirectory != None:
|
|
333
|
+
dir = dir + self._sep + subdirectory.replace(os.sep, self._sep)
|
|
334
|
+
|
|
335
|
+
if config.get('acquire-spool_subdirectories', False):
|
|
336
|
+
# limit single directory size for (cluster) IO performance
|
|
337
|
+
subdir = '%03d' % int(self.seriesCounter/100)
|
|
338
|
+
dir = dir + self._sep + subdir
|
|
339
|
+
|
|
340
|
+
return dir
|
|
341
|
+
|
|
342
|
+
def get_cluster_dirname(self, dirname):
|
|
343
|
+
# Typically we'll be below the base directory, which we want to remove
|
|
344
|
+
dir = dirname.replace(self._base_dir + os.sep, '')
|
|
345
|
+
# if we weren't below PYMEData dir, which probably isn't great, at least drop any windows nonsense
|
|
346
|
+
dir = dir.split(':')[-1]
|
|
347
|
+
return unifiedIO.verbose_fix_name(dir.replace(os.sep, '/'))
|
|
348
|
+
|
|
349
|
+
@property
|
|
350
|
+
def seriesName(self):
|
|
351
|
+
# make this a property so that we can defer evaluation to first use
|
|
352
|
+
# this lets us set 'acquire-spool_subdirectories' in the init.py for a specific microscope
|
|
353
|
+
if self._series_name is None:
|
|
354
|
+
#if we've had to quit for whatever reason start where we left off
|
|
355
|
+
#while os.path.exists(os.path.join(self.dirname, self.seriesName + '.h5')):
|
|
356
|
+
self._series_name = self._GenSeriesName()
|
|
357
|
+
self._update_series_counter()
|
|
358
|
+
|
|
359
|
+
return self._series_name
|
|
360
|
+
|
|
361
|
+
@seriesName.setter
|
|
362
|
+
def seriesName(self, val):
|
|
363
|
+
self._series_name = val
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
def _GenSeriesName(self):
|
|
367
|
+
return self.seriesStub + '_' + numToAlpha(self.seriesCounter)
|
|
368
|
+
|
|
369
|
+
def _checkOutputExists(self, fn):
|
|
370
|
+
if self.spoolType == 'Cluster':
|
|
371
|
+
#FIXME - remove dependance on HTTPSpooler
|
|
372
|
+
from PYME.IO import HTTPSpooler_v2 as HTTPSpooler
|
|
373
|
+
# special case for HTTP spooling. Make sure 000\series.pcs -> 000/series.pcs
|
|
374
|
+
pyme_cluster = self.dirname + '/' + fn.replace('\\', '/')
|
|
375
|
+
logger.debug('Looking for %s (.pcs or .h5) on cluster' % pyme_cluster)
|
|
376
|
+
return HTTPSpooler.exists(pyme_cluster + '.pcs') or HTTPSpooler.exists(pyme_cluster + '.h5') or HTTPSpooler.exists(pyme_cluster + '.tiles')
|
|
377
|
+
#return (fn + '.h5/') in HTTPSpooler.clusterIO.listdir(self.dirname)
|
|
378
|
+
else:
|
|
379
|
+
local_stub = os.sep.join([self.dirname, fn])
|
|
380
|
+
local_h5 = local_stub + '.h5'
|
|
381
|
+
logger.debug('Looking for %s on local machine' % local_stub)
|
|
382
|
+
return os.path.exists(local_h5) or os.path.exists(local_stub + '.pcs') or os.path.exists(local_stub + '.tiles')
|
|
383
|
+
|
|
384
|
+
def get_free_space(self):
|
|
385
|
+
"""
|
|
386
|
+
Get available space in the target spool directory
|
|
387
|
+
|
|
388
|
+
Returns
|
|
389
|
+
-------
|
|
390
|
+
|
|
391
|
+
free space in GB
|
|
392
|
+
|
|
393
|
+
"""
|
|
394
|
+
if self.spoolType == 'Cluster':
|
|
395
|
+
from PYME.cluster import status
|
|
396
|
+
nodes = status.get_polled_status()
|
|
397
|
+
free_storage = sum([n['Disk']['free'] for n in nodes])
|
|
398
|
+
return free_storage / 1e9
|
|
399
|
+
else:
|
|
400
|
+
from PYME.IO.FileUtils.freeSpace import get_free_space
|
|
401
|
+
# avoid dirname property here so we can differ building
|
|
402
|
+
# 'acquire-spool_subdirectories' to `start_spooling`
|
|
403
|
+
return get_free_space(self._dirname)/1e9
|
|
404
|
+
|
|
405
|
+
def _update_series_counter(self):
|
|
406
|
+
logger.debug('Updating series counter')
|
|
407
|
+
self.seriesCounter = 0
|
|
408
|
+
self.seriesName = self._GenSeriesName()
|
|
409
|
+
while self._checkOutputExists(self.seriesName):
|
|
410
|
+
self.seriesCounter +=1
|
|
411
|
+
self.seriesName = self._GenSeriesName()
|
|
412
|
+
|
|
413
|
+
def SetSpoolDir(self, dirname):
|
|
414
|
+
"""Set the directory we're spooling into"""
|
|
415
|
+
logger.info('Setting spool dir: %s' % dirname)
|
|
416
|
+
self._dirname = dirname
|
|
417
|
+
self._cluster_dirname = self.get_cluster_dirname(dirname)
|
|
418
|
+
#if we've had to quit for whatever reason start where we left off
|
|
419
|
+
self._update_series_counter()
|
|
420
|
+
|
|
421
|
+
def _ProgressUpate(self, **kwargs):
|
|
422
|
+
with self._status_changed_condition:
|
|
423
|
+
self._status_changed_condition.notify_all()
|
|
424
|
+
|
|
425
|
+
self.onSpoolProgress.send(self)
|
|
426
|
+
|
|
427
|
+
@property
|
|
428
|
+
def acquisition_cls(self):
|
|
429
|
+
return self.acquisition_types[self.acquisition_type]
|
|
430
|
+
|
|
431
|
+
def _get_queue_name(self, fn, pcs=False, subdirectory=None):
|
|
432
|
+
""" Get fully resolved uri to spool to
|
|
433
|
+
|
|
434
|
+
Parameters
|
|
435
|
+
----------
|
|
436
|
+
fn : str
|
|
437
|
+
file stub of the series
|
|
438
|
+
pcs : bool, optional
|
|
439
|
+
sets extension to PYME Cluster Series (pcs) if spooling series as
|
|
440
|
+
plurality of pcs files, by default False (spooling to h5 file)
|
|
441
|
+
subdirectory : str, optional
|
|
442
|
+
Directory within current set directory to spool this series. The
|
|
443
|
+
directory will be created if it doesn't already exist.
|
|
444
|
+
|
|
445
|
+
Returns
|
|
446
|
+
-------
|
|
447
|
+
str
|
|
448
|
+
fully resolved uri to spool to
|
|
449
|
+
"""
|
|
450
|
+
if pcs:
|
|
451
|
+
ext = '.pcs'
|
|
452
|
+
else:
|
|
453
|
+
ext = '.h5'
|
|
454
|
+
|
|
455
|
+
# allow acquisition types (e.g. tiling) to specify their own extension
|
|
456
|
+
ext = getattr(self.acquisition_cls, 'FILE_EXTENSION', ext)
|
|
457
|
+
|
|
458
|
+
return self._sep.join([self.get_dirname(subdirectory), fn + ext])
|
|
459
|
+
|
|
460
|
+
|
|
461
|
+
def start_spooling(self, fn=None, settings={}, preflight_mode='interactive'):
|
|
462
|
+
"""
|
|
463
|
+
|
|
464
|
+
Parameters
|
|
465
|
+
----------
|
|
466
|
+
fn : str, optional
|
|
467
|
+
fn can be hardcoded here, otherwise differs to the seriesName
|
|
468
|
+
property which will create one if need-be.
|
|
469
|
+
settings : dict
|
|
470
|
+
keys should be `SpoolController` attributes or properties with
|
|
471
|
+
setters. Not all keys must be present, and example keys include:
|
|
472
|
+
method : str
|
|
473
|
+
One of 'File', 'Cluster', or 'Queue'(py2 only)
|
|
474
|
+
hdf_compression_level: int
|
|
475
|
+
zlib compression level that pytables should use (spool to
|
|
476
|
+
file and queue)
|
|
477
|
+
z_stepped : bool
|
|
478
|
+
toggle z-stepping during acquisition
|
|
479
|
+
z_dwell : int
|
|
480
|
+
number of frames to acquire at each z level (predicated on
|
|
481
|
+
`SpoolController.z_stepped` being True)
|
|
482
|
+
cluster_h5 : bool
|
|
483
|
+
Toggle spooling to single h5 file on cluster rather than pzf
|
|
484
|
+
file per frame. Only applicable to 'Cluster' `method` and
|
|
485
|
+
preferred for PYMEClusterOfOne.
|
|
486
|
+
pzf_compression_settings : dict
|
|
487
|
+
Compression settings relevant for 'Cluster' `method` if
|
|
488
|
+
`cluster_h5` is False. See acquisition_backends.ClusterBackend.defaultCompSettings.
|
|
489
|
+
protocol_name : str
|
|
490
|
+
Note that passing the protocol name will force a (re)load of
|
|
491
|
+
the protocol file (even if it is already selected).
|
|
492
|
+
max_frames : int, optional
|
|
493
|
+
point at which to end the series automatically, by default
|
|
494
|
+
sys.maxsize
|
|
495
|
+
subdirectory : str, optional
|
|
496
|
+
Directory within current set directory to spool this series. The
|
|
497
|
+
directory will be created if it doesn't already exist.
|
|
498
|
+
extra_metadata : dict, optional
|
|
499
|
+
metadata to supplement this series for entries known prior to
|
|
500
|
+
acquisition which do not have handlers to hook start metadata
|
|
501
|
+
preflight_mode : str (default='interactive')
|
|
502
|
+
What to do when the preflight check fails. Options are 'interactive', 'warn', 'abort' and 'skip' which will
|
|
503
|
+
display a dialog and prompt the user, log a warning and continue, and log an error and abort, or skip completely.
|
|
504
|
+
The former is suitable for interactive acquisition, whereas one of the latter modes is likely better for automated spooling
|
|
505
|
+
via the action manager.
|
|
506
|
+
|
|
507
|
+
"""
|
|
508
|
+
|
|
509
|
+
# these settings were managed by the GUI, but are now managed by the
|
|
510
|
+
# controller, still allow them to be passed in, but default to internals
|
|
511
|
+
|
|
512
|
+
acquisition_type = settings.get('acquisition_type', self.acquisition_type)
|
|
513
|
+
|
|
514
|
+
fn = self.seriesName if fn in ['', None] else fn
|
|
515
|
+
|
|
516
|
+
#compLevel = settings.get('hdf_compression_level', self.hdf_compression_level)
|
|
517
|
+
#pzf_compression_settings = settings.get('pzf_compression_settings', self.pzf_compression_settings)
|
|
518
|
+
cluster_h5 = settings.get('cluster_h5', self.cluster_h5)
|
|
519
|
+
|
|
520
|
+
subdirectory = settings.get('subdirectory', None)
|
|
521
|
+
|
|
522
|
+
# make directories as needed, makedirs(dir, exist_ok=True) once py2 support is dropped
|
|
523
|
+
if (self.spoolType != 'Cluster') and (not os.path.exists(self.get_dirname(subdirectory))):
|
|
524
|
+
os.makedirs(self.get_dirname(subdirectory))
|
|
525
|
+
|
|
526
|
+
if self._checkOutputExists(fn): #check to see if data with the same name exists
|
|
527
|
+
self.seriesCounter +=1
|
|
528
|
+
self.seriesName = self._GenSeriesName()
|
|
529
|
+
|
|
530
|
+
raise IOError('A series with the same name already exists')
|
|
531
|
+
|
|
532
|
+
# update launch analysis settings
|
|
533
|
+
self.analysis_mode = settings.get('analysis_mode', self.analysis_mode)
|
|
534
|
+
self.analysis_rule_name = settings.get('analysis_rule_name', self.analysis_rule_name)
|
|
535
|
+
self.analysis_launch_mode = settings.get('analysis_launch_mode', self.analysis_launch_mode)
|
|
536
|
+
|
|
537
|
+
if self.spoolType == 'Cluster':
|
|
538
|
+
self.queueName = self._get_queue_name(fn, pcs=(not cluster_h5),
|
|
539
|
+
subdirectory=subdirectory)
|
|
540
|
+
else:
|
|
541
|
+
self.queueName = self._get_queue_name(fn, subdirectory=subdirectory)
|
|
542
|
+
|
|
543
|
+
|
|
544
|
+
from PYME.IO import acquisition_backends
|
|
545
|
+
backends = {'File': acquisition_backends.HDFBackend,
|
|
546
|
+
'Cluster': acquisition_backends.ClusterBackend,
|
|
547
|
+
'Memory': acquisition_backends.MemoryBackend,
|
|
548
|
+
'Tiff folder': acquisition_backends.TiffFolderBackend,}
|
|
549
|
+
|
|
550
|
+
backend_kwargs = {}
|
|
551
|
+
if self.spoolType == 'Cluster':
|
|
552
|
+
backend_kwargs['cluster_h5'] = settings.get('cluster_h5', self.cluster_h5)
|
|
553
|
+
backend_kwargs['compression_settings'] = settings.get('pzf_compression_settings', self.pzf_compression_settings)
|
|
554
|
+
elif self.spoolType == 'File':
|
|
555
|
+
backend_kwargs['complevel'] = settings.get('hdf_compression_level', self.hdf_compression_level)
|
|
556
|
+
|
|
557
|
+
# put preflight mode into settings so we can pass it to the protocol acquisition
|
|
558
|
+
settings['preflight_mode'] = preflight_mode
|
|
559
|
+
|
|
560
|
+
|
|
561
|
+
try:
|
|
562
|
+
self.spooler = self.acquisition_cls.from_spool_settings(self.scope, settings, backend=backends[self.spoolType], backend_kwargs=backend_kwargs, series_name=self.queueName, spool_controller=self)
|
|
563
|
+
except KeyError:
|
|
564
|
+
raise RuntimeError('Unknown acquisition type %s' % acquisition_type)
|
|
565
|
+
|
|
566
|
+
self.spooler.on_progress.connect(self._ProgressUpate)
|
|
567
|
+
|
|
568
|
+
|
|
569
|
+
extra_metadata = settings.get('extra_metadata')
|
|
570
|
+
if extra_metadata is not None:
|
|
571
|
+
self.spooler.md.mergeEntriesFrom(MetaDataHandler.DictMDHandler(extra_metadata))
|
|
572
|
+
|
|
573
|
+
# NOTE - stopping and starting the framewrangler has moved to the spooler .start() method
|
|
574
|
+
#self.scope.frameWrangler.stop()
|
|
575
|
+
|
|
576
|
+
try:
|
|
577
|
+
self.spooler.on_stop.connect(self.SpoolStopped)
|
|
578
|
+
self.spooler.start()
|
|
579
|
+
except:
|
|
580
|
+
self.spooler.abort()
|
|
581
|
+
raise
|
|
582
|
+
|
|
583
|
+
# restart frame wrangler
|
|
584
|
+
#self.scope.frameWrangler.Prepare()
|
|
585
|
+
#self.scope.frameWrangler.start()
|
|
586
|
+
|
|
587
|
+
self.onSpoolStart.send(self)
|
|
588
|
+
|
|
589
|
+
if self.spoolType == 'Memory':
|
|
590
|
+
# open a viewer window for the data that is being acquired
|
|
591
|
+
self._display_image()
|
|
592
|
+
|
|
593
|
+
#return a function which can be called to indicate if we are done
|
|
594
|
+
return lambda : self.spooler.spool_complete
|
|
595
|
+
|
|
596
|
+
def estimate_spool_time(self, settings={}, **kwargs):
|
|
597
|
+
"""
|
|
598
|
+
Estimate the time to spool a series based on the current settings
|
|
599
|
+
|
|
600
|
+
used by queued actions to set timeouts etc ... if in doubt, we should
|
|
601
|
+
overestimate.
|
|
602
|
+
|
|
603
|
+
Returns
|
|
604
|
+
-------
|
|
605
|
+
float
|
|
606
|
+
estimated time in seconds
|
|
607
|
+
|
|
608
|
+
FIXME - these are extremely rough estimates
|
|
609
|
+
FIXME - defer to acquisition type
|
|
610
|
+
"""
|
|
611
|
+
|
|
612
|
+
acquisition_type = settings.get('acquisition_type', self.acquisition_type)
|
|
613
|
+
|
|
614
|
+
if acquisition_type == 'ProtocolAcquisition':
|
|
615
|
+
#FIXME - this is a very rough estimate
|
|
616
|
+
n_frames = settings.get('max_frames', 100000)
|
|
617
|
+
|
|
618
|
+
try:
|
|
619
|
+
return 1.25 * n_frames / self.scope.cam.GetFPS() # per series
|
|
620
|
+
except NotImplementedError:
|
|
621
|
+
# specifically the simulated camera here, which has a non-predictable frame rate
|
|
622
|
+
# use a conservative default of 10 s/frame (should not matter as simulation will generally not be doing 10s of thousands of series)
|
|
623
|
+
return 10*n_frames
|
|
624
|
+
|
|
625
|
+
|
|
626
|
+
else:
|
|
627
|
+
# 30 minutes for all other acquisition types
|
|
628
|
+
# TODO - does this need to be longer for tiling??
|
|
629
|
+
return 30*60
|
|
630
|
+
|
|
631
|
+
def get_settings(self, method_only=False):
|
|
632
|
+
"""Get the current settings for the spool controller
|
|
633
|
+
|
|
634
|
+
Used when adding actions to the action manager - this should freeze
|
|
635
|
+
the relevant settings for the acquisition type and method.
|
|
636
|
+
"""
|
|
637
|
+
settings = {'method' : self.spoolType,
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
if self.spoolType == 'File':
|
|
641
|
+
settings['hdf_compression_level'] = self.hdf_compression_level
|
|
642
|
+
|
|
643
|
+
if self.spoolType == 'Cluster':
|
|
644
|
+
settings['cluster_h5'] = self.cluster_h5
|
|
645
|
+
settings['pzf_compression_settings'] = self.pzf_compression_settings
|
|
646
|
+
|
|
647
|
+
if method_only:
|
|
648
|
+
return settings
|
|
649
|
+
|
|
650
|
+
else:
|
|
651
|
+
settings['acquisition_type'] = self.acquisition_type
|
|
652
|
+
|
|
653
|
+
settings['analysis_mode'] = self.analysis_mode
|
|
654
|
+
settings['analysis_launch_mode'] = self.analysis_launch_mode
|
|
655
|
+
settings['analysis_rule_name'] = self.analysis_rule_name
|
|
656
|
+
|
|
657
|
+
settings.update(self.acquisition_types[self.acquisition_type].get_frozen_settings(self.scope, self))
|
|
658
|
+
|
|
659
|
+
return settings
|
|
660
|
+
|
|
661
|
+
|
|
662
|
+
def _display_image(self):
|
|
663
|
+
''' Display the image in a viewer (for memory backend)
|
|
664
|
+
'''
|
|
665
|
+
try:
|
|
666
|
+
assert isinstance(self.spooler.storage, acquisition_backends.MemoryBackend)
|
|
667
|
+
|
|
668
|
+
import wx
|
|
669
|
+
if not wx.App.IsMainLoopRunning():
|
|
670
|
+
logger.debug("No wx app, can't show image")
|
|
671
|
+
return
|
|
672
|
+
|
|
673
|
+
from PYME.DSView import ViewIm3D
|
|
674
|
+
self._view = ViewIm3D(self.spooler.storage.image)
|
|
675
|
+
self.scope.frameWrangler.onFrameGroup.connect(self._update_display)
|
|
676
|
+
except:
|
|
677
|
+
logger.exception('Error displaying image')
|
|
678
|
+
|
|
679
|
+
def _update_display(self, *args, **kwargs):
|
|
680
|
+
''' Update the displayed image (for memory backend)
|
|
681
|
+
'''
|
|
682
|
+
import wx
|
|
683
|
+
wx.CallAfter(self._view.view.Redraw)
|
|
684
|
+
|
|
685
|
+
def _unlink_display(self, *args, **kwargs):
|
|
686
|
+
''' Unlink the display from the frameWrangler (for memory backend)
|
|
687
|
+
'''
|
|
688
|
+
try:
|
|
689
|
+
self.scope.frameWrangler.onFrameGroup.disconnect(self._update_display)
|
|
690
|
+
except:
|
|
691
|
+
pass
|
|
692
|
+
|
|
693
|
+
@property
|
|
694
|
+
def display_dirname(self):
|
|
695
|
+
"""
|
|
696
|
+
Returns a relative directory name for display in user interfaces
|
|
697
|
+
|
|
698
|
+
Returns
|
|
699
|
+
-------
|
|
700
|
+
dirname : str
|
|
701
|
+
current spool directory, relative to local PYMEData directory
|
|
702
|
+
(ideally)
|
|
703
|
+
"""
|
|
704
|
+
dirname = self.dirname
|
|
705
|
+
if self.spoolType == 'Cluster':
|
|
706
|
+
return dirname
|
|
707
|
+
else:
|
|
708
|
+
return dirname.replace(self._base_dir + os.sep, '')
|
|
709
|
+
|
|
710
|
+
def StopSpooling(self, **kwargs):
|
|
711
|
+
"""GUI callback to stop spooling."""
|
|
712
|
+
self.spooler.stop()
|
|
713
|
+
|
|
714
|
+
def SpoolStopped(self, **kwargs):
|
|
715
|
+
self.seriesCounter +=1
|
|
716
|
+
self.seriesName = self._GenSeriesName()
|
|
717
|
+
|
|
718
|
+
logger.info('Spooling stopped')
|
|
719
|
+
|
|
720
|
+
self.on_stop.send(self)
|
|
721
|
+
|
|
722
|
+
if self.analysis_launch_mode == 'series-end':
|
|
723
|
+
self.LaunchAnalysis()
|
|
724
|
+
|
|
725
|
+
try:
|
|
726
|
+
self.spooler.on_progress.disconnect(self._ProgressUpate)
|
|
727
|
+
self._ProgressUpate()
|
|
728
|
+
self._unlink_display()
|
|
729
|
+
except AttributeError:
|
|
730
|
+
pass
|
|
731
|
+
|
|
732
|
+
|
|
733
|
+
@property
|
|
734
|
+
def autostart_analysis(self):
|
|
735
|
+
if 'analysisSettings' in dir(self.scope):
|
|
736
|
+
return self.scope.analysisSettings.propagateToAcquisisitonMetadata
|
|
737
|
+
else:
|
|
738
|
+
return False
|
|
739
|
+
|
|
740
|
+
|
|
741
|
+
def LaunchAnalysis(self):
|
|
742
|
+
from warnings import warn
|
|
743
|
+
warn('LaunchAnalysis is deprecated, use launch_analysis instead', DeprecationWarning)
|
|
744
|
+
self.launch_analysis()
|
|
745
|
+
|
|
746
|
+
def launch_analysis(self):
|
|
747
|
+
"""Launch analysis
|
|
748
|
+
"""
|
|
749
|
+
import posixpath
|
|
750
|
+
|
|
751
|
+
try:
|
|
752
|
+
if not self.spoolType == 'Cluster':
|
|
753
|
+
from PYME import pyme_warnings as warnings
|
|
754
|
+
warnings.warn('Analysis is only supported for cluster spooling', category=RuntimeWarning)
|
|
755
|
+
|
|
756
|
+
if self.analysis_mode == 'interactive':
|
|
757
|
+
subprocess.Popen('%s %s' % (self.dh5view_cmd, self.spooler.getURL()), shell=True)
|
|
758
|
+
|
|
759
|
+
elif self.analysis_mode == 'rule-based':
|
|
760
|
+
seriesName = self.spooler.getURL()
|
|
761
|
+
|
|
762
|
+
try:
|
|
763
|
+
# we have the chained analysis module loaded
|
|
764
|
+
rule_factory = self.scope.analysis_rules[self.analysis_rule_name].rule_factories[0]
|
|
765
|
+
|
|
766
|
+
context = {
|
|
767
|
+
'seriesName': seriesName,
|
|
768
|
+
'inputs': {'input': seriesName}, # needed for recipes
|
|
769
|
+
'output_dir': posixpath.split(seriesName)[0],
|
|
770
|
+
'spooler': self.spooler.storage, # for SpoolLocalLocalization rule completeness check
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
rule = rule_factory.get_rule(context=context)
|
|
774
|
+
# launch analysis in a separate thread
|
|
775
|
+
|
|
776
|
+
except AttributeError:
|
|
777
|
+
# we don't have the chained analysis module loaded
|
|
778
|
+
from PYME.cluster import rules
|
|
779
|
+
import warnings
|
|
780
|
+
warnings.warn('using legacy automated localisation rule - please add the chained analysis module to your init and use this instead', category=RuntimeWarning)
|
|
781
|
+
rule = rules.LocalisationRule(seriesName=seriesName, analysisMetadata=self.scope.analysisSettings.analysisMDH)
|
|
782
|
+
|
|
783
|
+
except KeyError:
|
|
784
|
+
raise RuntimeError('Analysis rule %s not found' % self.analysis_rule_name)
|
|
785
|
+
|
|
786
|
+
t = threading.Thread(target=rule.push)
|
|
787
|
+
t.start()
|
|
788
|
+
# keep track of a couple launching threads to make sure they have ample time to finish before joining
|
|
789
|
+
if self._analysis_launchers.full():
|
|
790
|
+
self._analysis_launchers.get().join()
|
|
791
|
+
self._analysis_launchers.put(t)
|
|
792
|
+
|
|
793
|
+
self._rule_outputs = rule.output_files
|
|
794
|
+
except:
|
|
795
|
+
logger.exception('Error launching analysis')
|
|
796
|
+
|
|
797
|
+
# TODO - do these belong here?
|
|
798
|
+
@property
|
|
799
|
+
def pymevis_cmd(self):
|
|
800
|
+
if sys.platform == 'win32':
|
|
801
|
+
return 'PYMEVis.exe'
|
|
802
|
+
else:
|
|
803
|
+
return 'PYMEVis'
|
|
804
|
+
|
|
805
|
+
@property
|
|
806
|
+
def pymeimage_cmd(self):
|
|
807
|
+
if sys.platform == 'win32':
|
|
808
|
+
return 'PYMEImage.exe'
|
|
809
|
+
else:
|
|
810
|
+
return 'PYMEImage'
|
|
811
|
+
|
|
812
|
+
dh5view_cmd = pymeimage_cmd
|
|
813
|
+
|
|
814
|
+
def open_analysis(self):
|
|
815
|
+
"""Open the currenly running analysis in PYMEVis"""
|
|
816
|
+
import subprocess
|
|
817
|
+
|
|
818
|
+
output = self._rule_outputs.get('results')
|
|
819
|
+
|
|
820
|
+
# get the URL
|
|
821
|
+
if output.endswith('.h5r'):
|
|
822
|
+
uri = output + '?live'
|
|
823
|
+
subprocess.Popen('%s %s' % (self.pymevis_cmd, uri), shell=True)
|
|
824
|
+
elif output.endswith('.h5') or output.endswith('.tif'):
|
|
825
|
+
uri = output
|
|
826
|
+
subprocess.Popen('%s %s' % (self.pymeimage_cmd, uri), shell=True)
|
|
827
|
+
|
|
828
|
+
def open_view(self):
|
|
829
|
+
if hasattr(self.spooler, '_launch_viewer'):
|
|
830
|
+
# TODO - make less special case - maybe defer normal launch to the spooler as well
|
|
831
|
+
self.spooler._launch_viewer()
|
|
832
|
+
else:
|
|
833
|
+
subprocess.Popen('%s %s' % (self.pymeimage_cmd, self.spooler.getURL()), shell=True)
|
|
834
|
+
|
|
835
|
+
|
|
836
|
+
|
|
837
|
+
|
|
838
|
+
# def launch_cluster_analysis(self):
|
|
839
|
+
# from PYME.cluster import rules
|
|
840
|
+
|
|
841
|
+
# seriesName = self.spooler.getURL()
|
|
842
|
+
# try:
|
|
843
|
+
# #HTTPRulePusher.launch_localize(self.scope.analysisSettings.analysisMDH, seriesName)
|
|
844
|
+
# rules.LocalisationRule(seriesName=seriesName, analysisMetadata=self.scope.analysisSettings.analysisMDH).push()
|
|
845
|
+
# except:
|
|
846
|
+
# logger.exception('Error launching analysis for %s' % seriesName)
|
|
847
|
+
|
|
848
|
+
|
|
849
|
+
def SetSpoolMethod(self, method):
|
|
850
|
+
"""Set the spooling method
|
|
851
|
+
|
|
852
|
+
Parameters
|
|
853
|
+
----------
|
|
854
|
+
|
|
855
|
+
method : string
|
|
856
|
+
One of 'File', 'Queue', or 'Cluster'
|
|
857
|
+
"""
|
|
858
|
+
self.spoolType = method
|
|
859
|
+
self._update_series_counter()
|
|
860
|
+
|
|
861
|
+
def __del__(self):
|
|
862
|
+
# make sure our analysis launchers have a chance to finish their job before exiting
|
|
863
|
+
while not self._analysis_launchers.empty():
|
|
864
|
+
self._analysis_launchers.get().join()
|
|
865
|
+
|
|
866
|
+
|
|
867
|
+
|
|
868
|
+
class SpoolControllerWrapper(object):
|
|
869
|
+
def __init__(self, spool_controller):
|
|
870
|
+
self.spool_controller = spool_controller # type: SpoolController
|
|
871
|
+
|
|
872
|
+
@webframework.register_endpoint('/info', output_is_json=False)
|
|
873
|
+
def info(self):
|
|
874
|
+
return self.spool_controller.get_info()
|
|
875
|
+
|
|
876
|
+
@webframework.register_endpoint('/info_longpoll', output_is_json=False)
|
|
877
|
+
def info_longpoll(self):
|
|
878
|
+
with self.spool_controller._status_changed_condition:
|
|
879
|
+
self.spool_controller._status_changed_condition.wait()
|
|
880
|
+
return self.spool_controller.get_info()
|
|
881
|
+
|
|
882
|
+
@webframework.register_endpoint('/settings', output_is_json=False)
|
|
883
|
+
def settings(self, body):
|
|
884
|
+
import json
|
|
885
|
+
try:
|
|
886
|
+
self.spool_controller.update_settings(json.loads(body))
|
|
887
|
+
return 'OK'
|
|
888
|
+
except:
|
|
889
|
+
logger.exception('Error setting spool controller settings')
|
|
890
|
+
return 'Failure'
|
|
891
|
+
|
|
892
|
+
@webframework.register_endpoint('/stop_spooling', output_is_json=False)
|
|
893
|
+
def stop_spooling(self):
|
|
894
|
+
self.spool_controller.StopSpooling()
|
|
895
|
+
return 'OK'
|
|
896
|
+
|
|
897
|
+
@webframework.register_endpoint('/start_spooling', output_is_json=False)
|
|
898
|
+
def start_spooling(self, body, filename=None, preflight_mode='abort'):
|
|
899
|
+
"""
|
|
900
|
+
See also SpoolController.start_spooling()
|
|
901
|
+
|
|
902
|
+
Parameters
|
|
903
|
+
----------
|
|
904
|
+
filename : str, optional
|
|
905
|
+
fn can be hardcoded here, otherwise differs to the seriesName
|
|
906
|
+
property which will create one if need-be.
|
|
907
|
+
preflight_mode : str, default == 'abort'
|
|
908
|
+
One of 'warn', 'abort', 'skip, or 'interactive'. Note that 'interactive' requires an active wx.App
|
|
909
|
+
|
|
910
|
+
The majority of parameters are passed in the request body, which should be a json-formatted dictionary with the
|
|
911
|
+
the following keys (see also `settings` parameter to `SpoolController.start_spooling`
|
|
912
|
+
|
|
913
|
+
z_stepped : bool, optional
|
|
914
|
+
toggle z-stepping during acquisition. By default None, which differs
|
|
915
|
+
to current `SpoolController` state.
|
|
916
|
+
hdf_comp_level : int, optional
|
|
917
|
+
zlib compression level for pytables. Not relevant for `Cluster`
|
|
918
|
+
spool method unless `cluster_h5` is True. By default None, which
|
|
919
|
+
differs to current `SpoolController` state.
|
|
920
|
+
z_dwell : int, optional
|
|
921
|
+
frames per z-step. By default None, which differs to current
|
|
922
|
+
`SpoolController` state.
|
|
923
|
+
max_frames : int, optional
|
|
924
|
+
point at which to end the series automatically, by default
|
|
925
|
+
sys.maxsize
|
|
926
|
+
pzf_compression_settings : dict, optional
|
|
927
|
+
Compression settings relevant for 'Cluster' `method` if `cluster_h5`
|
|
928
|
+
is False. See acquisition_backends.ClusterBackend.defaultCompSettings. By default None,
|
|
929
|
+
which defers to current `SpoolController` state.
|
|
930
|
+
cluster_h5 : bool, optional
|
|
931
|
+
Toggle spooling to single h5 file on cluster rather than pzf file
|
|
932
|
+
per frame. Only applicable to 'Cluster' `method` and preferred for
|
|
933
|
+
PYMEClusterOfOne. By default None, which differs to current
|
|
934
|
+
`SpoolController` state.
|
|
935
|
+
protocol : str, optional
|
|
936
|
+
path to acquisition protocol. By default None which differs to
|
|
937
|
+
current `SpoolController` state.
|
|
938
|
+
subdirectory : str, optional
|
|
939
|
+
Directory within current set directory to spool this series. The
|
|
940
|
+
directory will be created if it doesn't already exist.
|
|
941
|
+
extra_metadata : dict, optional
|
|
942
|
+
metadata to supplement this series for entries known prior to
|
|
943
|
+
acquisition which do not have handlers to hook start metadata
|
|
944
|
+
stack_settings : dict, optional
|
|
945
|
+
The stack settings. See PYME.Acquire.stackSettings.StackSettings. By default the global StackSettings instance
|
|
946
|
+
is used.
|
|
947
|
+
|
|
948
|
+
"""
|
|
949
|
+
import json
|
|
950
|
+
# FIXME - do some sanity checks on filename (this can't be as simple as urlescaping, as we need to support
|
|
951
|
+
# URIs as well as filenames). In practice this is best dealt with by enforcing authentication and only using on a
|
|
952
|
+
# trusted network.
|
|
953
|
+
if len(body) > 0:
|
|
954
|
+
# have settings in message body
|
|
955
|
+
self.spool_controller.start_spooling(filename, settings=json.loads(body), preflight_mode=preflight_mode)
|
|
956
|
+
else:
|
|
957
|
+
self.spool_controller.start_spooling(filename, preflight_mode=preflight_mode)
|
|
958
|
+
return 'OK'
|