python-microscopy 25.11.20__cp313-cp313-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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.cp313-win_amd64.dll.a +0 -0
- PYME/Acquire/Hardware/Simulator/illuminate.cp313-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.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/PSFGen/ps_app.cp313-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.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/points/DeClump/deClump.cp313-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.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/points/DistHist/distHist.cp313-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.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/points/EdgeDB/edgeDB.cp313-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.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/points/SoftRend/triRend.cp313-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.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/points/arcfit/arcmf.cp313-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.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/points/astigmatism/astiglookup.cp313-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.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/points/traveling_salesperson/two_opt_utils.cp313-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.cp313-win_amd64.dll.a +0 -0
- PYME/DSView/LUT/lut.cp313-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.cp313-win_amd64.dll.a +0 -0
- PYME/IO/buffer_helpers.cp313-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 +204 -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.cp313-win_amd64.dll.a +0 -0
- PYME/contrib/gohlke/_tifffile.cp313-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.cp313-win_amd64.dll.a +0 -0
- PYME/experimental/_octree.cp313-win_amd64.pyd +0 -0
- PYME/experimental/_octree.pyx +477 -0
- PYME/experimental/_treap.cp313-win_amd64.dll.a +0 -0
- PYME/experimental/_treap.cp313-win_amd64.pyd +0 -0
- PYME/experimental/_treap.pyx +267 -0
- PYME/experimental/_triangle_mesh.cp313-win_amd64.dll.a +0 -0
- PYME/experimental/_triangle_mesh.cp313-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.cp313-win_amd64.dll.a +0 -0
- PYME/experimental/func_octree.cp313-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.cp313-win_amd64.dll.a +0 -0
- PYME/experimental/triangle_mesh_utils.cp313-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.cp313-win_amd64.dll.a +0 -0
- PYME/localization/cInterp/cInterp.cp313-win_amd64.pyd +0 -0
- PYME/localization/cInterp/setup.py +54 -0
- PYME/localization/cModels/__init__.py +24 -0
- PYME/localization/cModels/gauss_app.cp313-win_amd64.dll.a +0 -0
- PYME/localization/cModels/gauss_app.cp313-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 +62 -0
- python_microscopy-25.11.20.dist-info/METADATA +68 -0
- python_microscopy-25.11.20.dist-info/RECORD +1278 -0
- python_microscopy-25.11.20.dist-info/WHEEL +4 -0
- python_microscopy-25.11.20.dist-info/entry_points.txt +18 -0
|
@@ -0,0 +1,1072 @@
|
|
|
1
|
+
#!/usr/bin/python
|
|
2
|
+
|
|
3
|
+
##################
|
|
4
|
+
# MetaDataHandler.py
|
|
5
|
+
#
|
|
6
|
+
# Copyright David Baddeley, 2009
|
|
7
|
+
# d.baddeley@auckland.ac.nz
|
|
8
|
+
#
|
|
9
|
+
# This program is free software: you can redistribute it and/or modify
|
|
10
|
+
# it under the terms of the GNU General Public License as published by
|
|
11
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
12
|
+
# (at your option) any later version.
|
|
13
|
+
#
|
|
14
|
+
# This program is distributed in the hope that it will be useful,
|
|
15
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
16
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
17
|
+
# GNU General Public License for more details.
|
|
18
|
+
#
|
|
19
|
+
# You should have received a copy of the GNU General Public License
|
|
20
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
21
|
+
#
|
|
22
|
+
##################
|
|
23
|
+
|
|
24
|
+
#!/usr/bin/python
|
|
25
|
+
"""
|
|
26
|
+
Defines metadata handlers for the saving of acquisition metadata to a variety
|
|
27
|
+
of file formats, as well as keeping track of metadata sources.
|
|
28
|
+
|
|
29
|
+
Metadata sources
|
|
30
|
+
----------------
|
|
31
|
+
|
|
32
|
+
Metadata sources are simply functions, which when called, write information into
|
|
33
|
+
a provided handler. e.g.::
|
|
34
|
+
|
|
35
|
+
def metadataGenerator(mdhandler):
|
|
36
|
+
mdhandler['a.key'] = value
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
These generator functions are registered by adding them to one of two lists exposed
|
|
40
|
+
by this module: **provideStartMetadata** or **provideStopMetadata**. depending on
|
|
41
|
+
whether it makes more sense to record the metadata at the start or stop of an
|
|
42
|
+
acquisition.
|
|
43
|
+
|
|
44
|
+
A good example can be found in PYME.Acquire.Hardware.Camera.AndorIXon.AndorIXon.
|
|
45
|
+
|
|
46
|
+
MetaData Handlers
|
|
47
|
+
-----------------
|
|
48
|
+
|
|
49
|
+
**NestedClassMDHandler**
|
|
50
|
+
An in-memory metadatahandler used to buffer metadata or to store values prior
|
|
51
|
+
to the file format being known.
|
|
52
|
+
**HDFMDHandler**
|
|
53
|
+
For local pytables/hdf5 datasets
|
|
54
|
+
**QueueMDHandler**
|
|
55
|
+
For use with data hosted in a taskqueue
|
|
56
|
+
**XMLMDHandler**
|
|
57
|
+
For use with PYMEs XML metadata format - typically used with .tiff files or
|
|
58
|
+
other data for which it is difficult to embed metadata.
|
|
59
|
+
**SimpleMDHandler**
|
|
60
|
+
Saves and reads metadata as a python script (a series of md[key]=value statements).
|
|
61
|
+
Used where you might want to construct or modify metadata by hand - e.g. with
|
|
62
|
+
foreign source data.
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
The format of a metadata handler is defined by the `MDHandlerBase` class.
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
"""
|
|
69
|
+
try:
|
|
70
|
+
# noinspection PyCompatibility
|
|
71
|
+
from UserDict import DictMixin
|
|
72
|
+
except ImportError:
|
|
73
|
+
#py3
|
|
74
|
+
from collections.abc import MutableMapping as DictMixin
|
|
75
|
+
|
|
76
|
+
import six
|
|
77
|
+
from collections import namedtuple
|
|
78
|
+
|
|
79
|
+
from PYME import config
|
|
80
|
+
|
|
81
|
+
import logging
|
|
82
|
+
logger = logging.getLogger(__name__)
|
|
83
|
+
|
|
84
|
+
#lists where bits of hardware can register the fact that they are capable of
|
|
85
|
+
#providing metadata, by appending a function with the signature:
|
|
86
|
+
#genMetadata(MetaDataHandler)
|
|
87
|
+
provideStartMetadata = []
|
|
88
|
+
provideStopMetadata = []
|
|
89
|
+
|
|
90
|
+
# Define a voxelsize class
|
|
91
|
+
# NB the default units across PYME (everywhere but the metadata) are nm, with metadata being the exception
|
|
92
|
+
# in that it defaults to um
|
|
93
|
+
# this class exists to make things a bit simpler when accessing the metadata
|
|
94
|
+
VoxelSize = namedtuple('VoxelSize', 'x,y,z')
|
|
95
|
+
VoxelSize.units='nm'
|
|
96
|
+
|
|
97
|
+
def instanceinlist(cls, list):
|
|
98
|
+
for c in list:
|
|
99
|
+
if isinstance(cls, c):
|
|
100
|
+
return True
|
|
101
|
+
|
|
102
|
+
return False
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def get_camera_roi_origin(mdh):
|
|
106
|
+
"""
|
|
107
|
+
helper function to allow us to transition to 0 based ROIs.
|
|
108
|
+
|
|
109
|
+
Returns the first of these it finds:
|
|
110
|
+
- [Camera.ROIOriginX, Camera.ROIOriginY]
|
|
111
|
+
- [Camera.ROIPosX -1, Camera.ROIPosY-1]
|
|
112
|
+
- [0,0]
|
|
113
|
+
|
|
114
|
+
NOTE: this is not yet widely supported in calling code (ie you should still write ROIPosX, ROIPosY, although it is
|
|
115
|
+
safe to write both the old and new versions.
|
|
116
|
+
|
|
117
|
+
Parameters
|
|
118
|
+
----------
|
|
119
|
+
mdh : metadata handler
|
|
120
|
+
|
|
121
|
+
Returns
|
|
122
|
+
-------
|
|
123
|
+
|
|
124
|
+
ROIOriginX, ROIOriginY
|
|
125
|
+
|
|
126
|
+
"""
|
|
127
|
+
if 'Camera.ROIOriginX' in mdh.getEntryNames():
|
|
128
|
+
return mdh['Camera.ROIOriginX'], mdh['Camera.ROIOriginY']
|
|
129
|
+
elif 'Camera.ROIPosX' in mdh.getEntryNames():
|
|
130
|
+
return mdh['Camera.ROIPosX']-1, mdh['Camera.ROIPosY']-1
|
|
131
|
+
else:
|
|
132
|
+
return 0,0
|
|
133
|
+
|
|
134
|
+
def get_camera_physical_roi_origin(mdh):
|
|
135
|
+
"""
|
|
136
|
+
Get the camera roi offset to use for positioning. For a standard camera this is the same as the ROI pixel origin,
|
|
137
|
+
but for cameras with an image splitting device this may not be the case. For these cameras, return a position
|
|
138
|
+
relative to the left-most ROI.
|
|
139
|
+
|
|
140
|
+
TODO: This currently works for the HTSMS multiview setup, expand to also work with the dual-view splitters used on
|
|
141
|
+
other setups.
|
|
142
|
+
|
|
143
|
+
Parameters
|
|
144
|
+
----------
|
|
145
|
+
mdh
|
|
146
|
+
|
|
147
|
+
Returns
|
|
148
|
+
-------
|
|
149
|
+
|
|
150
|
+
"""
|
|
151
|
+
if len(mdh.get('Multiview.ActiveViews', [])) > 0:
|
|
152
|
+
# multiview cameras are on, assume the origin of the 0th channel is the stage-origin of all views
|
|
153
|
+
return mdh['Multiview.ROI0Origin']
|
|
154
|
+
else:
|
|
155
|
+
return get_camera_roi_origin(mdh)
|
|
156
|
+
|
|
157
|
+
def origin_nm(mdh, default_pixel_size=1.):
|
|
158
|
+
""" origin, in nm of the **image** ROI from the camera upper left hand pixel - used for
|
|
159
|
+
overlaying with different ROIs.
|
|
160
|
+
|
|
161
|
+
Parameters
|
|
162
|
+
----------
|
|
163
|
+
mdh : PYME.IO.MetaDataHandler
|
|
164
|
+
default_pixel_size : float, optional
|
|
165
|
+
Safe to ignore. Parameter only exists for a niche case in ImageStack, when no
|
|
166
|
+
pixel size is defined. Should probably change to emit a warning if we actually use this fallback.
|
|
167
|
+
|
|
168
|
+
Returns
|
|
169
|
+
-------
|
|
170
|
+
tuple
|
|
171
|
+
x, y, z origin in nanometers
|
|
172
|
+
|
|
173
|
+
Notes
|
|
174
|
+
-----
|
|
175
|
+
|
|
176
|
+
**Use with localisation / point data:** When used with localization data,
|
|
177
|
+
`origin_nm()` returns the origin of the pixel data in the **raw** image series used
|
|
178
|
+
to derive the localisations. Whilst x and y localisations are referenced to the ROI
|
|
179
|
+
(and hence share an origin with the pixel data) z localisations are absolute
|
|
180
|
+
(technically referenced to the 0 position of the z-piezo). As a result, the z-component
|
|
181
|
+
of `origin_nm()` should be ignored when used with localisation data, which does
|
|
182
|
+
not require z origin correction.
|
|
183
|
+
|
|
184
|
+
transferred from image.ImageStack.origin so that it can be used for tabular data too.
|
|
185
|
+
"""
|
|
186
|
+
|
|
187
|
+
if 'Origin.x' in mdh.getEntryNames():
|
|
188
|
+
# Used in composite images, cropped images, and renderings. Takes precendence if defined.
|
|
189
|
+
# Example in PYME.LMVis.renderers.ColourRenderer
|
|
190
|
+
return mdh['Origin.x'], mdh['Origin.y'], mdh['Origin.z']
|
|
191
|
+
|
|
192
|
+
elif ('Camera.ROIPosX' in mdh.getEntryNames()) or ('Camera.ROIOriginX' in mdh.getEntryNames()):
|
|
193
|
+
#has ROI information
|
|
194
|
+
try:
|
|
195
|
+
voxx, voxy, _ = mdh.voxelsize_nm
|
|
196
|
+
except AttributeError:
|
|
197
|
+
voxx = default_pixel_size
|
|
198
|
+
voxy = voxx
|
|
199
|
+
|
|
200
|
+
roi_x0, roi_y0 = get_camera_roi_origin(mdh)
|
|
201
|
+
|
|
202
|
+
ox = (roi_x0) * voxx
|
|
203
|
+
oy = (roi_y0) * voxy
|
|
204
|
+
|
|
205
|
+
oz = 0
|
|
206
|
+
|
|
207
|
+
if 'AcquisitionType' in mdh.getEntryNames() and mdh['AcquisitionType'] == 'Stack':
|
|
208
|
+
oz = mdh['StackSettings.StartPos'] * 1e3
|
|
209
|
+
elif 'Positioning.z' in mdh.getEntryNames():
|
|
210
|
+
oz = mdh['Positioning.z'] * 1e3
|
|
211
|
+
elif 'Positioning.PIFoc' in mdh.getEntryNames():
|
|
212
|
+
oz = mdh['Positioning.PIFoc'] * 1e3
|
|
213
|
+
|
|
214
|
+
return ox, oy, oz
|
|
215
|
+
|
|
216
|
+
elif 'Source.Camera.ROIPosX' in mdh.getEntryNames():
|
|
217
|
+
# TODO - can we somehow defer this and next case to get_camera_roi_corigin()
|
|
218
|
+
#a rendered image with information about the source ROI
|
|
219
|
+
voxx, voxy = 1e3 * mdh['Source.voxelsize.x'], 1e3 * mdh['Source.voxelsize.y']
|
|
220
|
+
|
|
221
|
+
ox = (mdh['Source.Camera.ROIPosX'] - 1) * voxx
|
|
222
|
+
oy = (mdh['Source.Camera.ROIPosY'] - 1) * voxy
|
|
223
|
+
|
|
224
|
+
return ox, oy, 0
|
|
225
|
+
elif 'Source.Camera.ROIOriginX' in mdh.getEntryNames():
|
|
226
|
+
#a rendered image with information about the source ROI
|
|
227
|
+
voxx, voxy = 1e3 * mdh['Source.voxelsize.x'], 1e3 * mdh['Source.voxelsize.y']
|
|
228
|
+
|
|
229
|
+
ox = (mdh['Source.Camera.ROIOriginX']) * voxx
|
|
230
|
+
oy = (mdh['Source.Camera.ROIOriginY']) * voxy
|
|
231
|
+
|
|
232
|
+
return ox, oy, 0
|
|
233
|
+
else:
|
|
234
|
+
return 0, 0, 0
|
|
235
|
+
|
|
236
|
+
def localisation_origin_nm(mdh):
|
|
237
|
+
''' Get the origin of localisation data.
|
|
238
|
+
|
|
239
|
+
Effectively a shortcut for `origin_nm()`, but discarding the z-component as whilst
|
|
240
|
+
x and y co-ordinates in localisation data are referenced to the ROI, the z component
|
|
241
|
+
is absolute.
|
|
242
|
+
'''
|
|
243
|
+
ox, oy, _ = origin_nm(mdh)
|
|
244
|
+
return ox, oy, 0
|
|
245
|
+
|
|
246
|
+
def get_voxelsize_nm(mdh):
|
|
247
|
+
'''
|
|
248
|
+
Helper function to obtain the voxel size, in nm, from the metadata (to replace the many 1e3*mdh['voxelsize.x'] calls)
|
|
249
|
+
|
|
250
|
+
NOTE: supplies a default z voxelsize of 0 if none in metadata.
|
|
251
|
+
|
|
252
|
+
Parameters
|
|
253
|
+
----------
|
|
254
|
+
mdh
|
|
255
|
+
|
|
256
|
+
Returns
|
|
257
|
+
-------
|
|
258
|
+
|
|
259
|
+
'''
|
|
260
|
+
|
|
261
|
+
return VoxelSize(1e3*mdh['voxelsize.x'], 1e3*mdh['voxelsize.y'], 1e3*mdh.get('voxelsize.z', 0))
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
# automatically record pyme version for images generated by PYMEAcquire
|
|
265
|
+
def _record_version(mdh):
|
|
266
|
+
mdh.record_pyme_version()
|
|
267
|
+
|
|
268
|
+
provideStartMetadata.append(_record_version)
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
# compatibility stubs to permit attribute based access while we transition away from NestedClassMDHandler
|
|
272
|
+
class _AttrProxy(object):
|
|
273
|
+
def __init__(self, mdh, parent=None):
|
|
274
|
+
self._mdh = mdh
|
|
275
|
+
self._parent = parent
|
|
276
|
+
|
|
277
|
+
def __getattr__(self, item):
|
|
278
|
+
if self._parent is not None:
|
|
279
|
+
item = '.'.join([self._parent, item])
|
|
280
|
+
|
|
281
|
+
return _attr_access(self._mdh, item)
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
def _attr_access(mdh, key):
|
|
285
|
+
try:
|
|
286
|
+
return mdh[key]
|
|
287
|
+
except KeyError:
|
|
288
|
+
if any([k.startswith(key) for k in mdh.keys()]):
|
|
289
|
+
return _AttrProxy(mdh, parent=key)
|
|
290
|
+
else:
|
|
291
|
+
raise AttributeError('Attribute %s not found' % key)
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
class MDHandlerBase(DictMixin):
|
|
295
|
+
"""Base class from which all metadata handlers are derived.
|
|
296
|
+
|
|
297
|
+
Metadata attributes can be read and set using either a dictionary like
|
|
298
|
+
interface, or by calling the `getEntry` and `setEntry` methods.
|
|
299
|
+
|
|
300
|
+
.. note:: Derived classes **MUST** override `getEntry`, `setEntry`, and `getEntryNames`.
|
|
301
|
+
"""
|
|
302
|
+
#base class to make metadata behave like a dictionary
|
|
303
|
+
def getEntry(self, name):
|
|
304
|
+
"""Returns the entry for a given name.
|
|
305
|
+
|
|
306
|
+
Parameters
|
|
307
|
+
----------
|
|
308
|
+
name : string
|
|
309
|
+
The entry name. This name should be heirachical, and deliminated
|
|
310
|
+
with dots e.g. 'Camera.EMCCDGain'
|
|
311
|
+
|
|
312
|
+
Returns
|
|
313
|
+
-------
|
|
314
|
+
value : object
|
|
315
|
+
The value stored for the given key. This can, in principle, be
|
|
316
|
+
anything that can be pickled. strings, ints, bools and floats are
|
|
317
|
+
all stored in a human readable form in the textual metadata
|
|
318
|
+
representations, wheras more complex objects are base64 encoded.
|
|
319
|
+
"""
|
|
320
|
+
raise NotImplementedError('getEntry must be overridden in derived classes')
|
|
321
|
+
|
|
322
|
+
def setEntry(self, name, value):
|
|
323
|
+
"""Sets the entry for a given name.
|
|
324
|
+
|
|
325
|
+
Parameters
|
|
326
|
+
----------
|
|
327
|
+
name : string
|
|
328
|
+
The entry name. This name should be heirachical, and deliminated
|
|
329
|
+
with dots e.g. 'Camera.EMCCDGain'
|
|
330
|
+
|
|
331
|
+
value : object
|
|
332
|
+
The value stored for the given key. This can, in principle, be
|
|
333
|
+
anything that can be pickled. strings, ints, bools and floats are
|
|
334
|
+
all stored in a human readable form in the textual metadata
|
|
335
|
+
representations, wheras more complex objects are base64 encoded.
|
|
336
|
+
"""
|
|
337
|
+
raise NotImplementedError('setEntry must be overridden in derived classes')
|
|
338
|
+
|
|
339
|
+
def getEntryNames(self):
|
|
340
|
+
"""Returns a list of defined entries.
|
|
341
|
+
|
|
342
|
+
Returns
|
|
343
|
+
-------
|
|
344
|
+
names : list of string
|
|
345
|
+
The keys which are defined in the metadata.
|
|
346
|
+
"""
|
|
347
|
+
raise NotImplementedError('getEntryNames must be overridden in derived classes')
|
|
348
|
+
|
|
349
|
+
def __setitem__(self, name, value):
|
|
350
|
+
self.setEntry(name, value)
|
|
351
|
+
|
|
352
|
+
def __getitem__(self, name):
|
|
353
|
+
try:
|
|
354
|
+
return self.getEntry(name)
|
|
355
|
+
except AttributeError:
|
|
356
|
+
raise KeyError('Key %s not defined' % name)
|
|
357
|
+
|
|
358
|
+
if six.PY3:
|
|
359
|
+
def __len__(self):
|
|
360
|
+
return len(self.getEntryNames())
|
|
361
|
+
|
|
362
|
+
def __iter__(self):
|
|
363
|
+
for k in self.getEntryNames():
|
|
364
|
+
yield k
|
|
365
|
+
|
|
366
|
+
def __delitem__(self, key):
|
|
367
|
+
raise RuntimeError('Cannot delete metadata item')
|
|
368
|
+
|
|
369
|
+
def getOrDefault(self, name, default):
|
|
370
|
+
"""Returns the entry for a given name, of a default value if the key
|
|
371
|
+
is not present.
|
|
372
|
+
|
|
373
|
+
Parameters
|
|
374
|
+
----------
|
|
375
|
+
name : string
|
|
376
|
+
The entry name. This name should be heirachical, and deliminated
|
|
377
|
+
with dots e.g. 'Camera.EMCCDGain'
|
|
378
|
+
default : object
|
|
379
|
+
What to return if the name is not defined
|
|
380
|
+
|
|
381
|
+
Returns
|
|
382
|
+
-------
|
|
383
|
+
value : object
|
|
384
|
+
The value stored for the given key. This can, in principle, be
|
|
385
|
+
anything that can be pickled. strings, ints, bools and floats are
|
|
386
|
+
all stored in a human readable form in the textual metadata
|
|
387
|
+
representations, wheras more complex objects are base64 encoded.
|
|
388
|
+
"""
|
|
389
|
+
try:
|
|
390
|
+
return self.getEntry(name)
|
|
391
|
+
except (KeyError, AttributeError):
|
|
392
|
+
return default
|
|
393
|
+
|
|
394
|
+
def keys(self):
|
|
395
|
+
"""Alias for getEntryNames to make us look like a dictionary"""
|
|
396
|
+
return self.getEntryNames()
|
|
397
|
+
|
|
398
|
+
def copyEntriesFrom(self, mdToCopy):
|
|
399
|
+
"""Copies entries from another metadata object into this one. Duplicate
|
|
400
|
+
keys will be overwritten.
|
|
401
|
+
|
|
402
|
+
Parameters
|
|
403
|
+
----------
|
|
404
|
+
mdToCopy : an instance of a metadata handler
|
|
405
|
+
The metadata handler from which to copy entries.
|
|
406
|
+
"""
|
|
407
|
+
for en in mdToCopy.keys():
|
|
408
|
+
# 9/10/20 DB - change to dictionary access notation so we can also pass a dictionary
|
|
409
|
+
self.setEntry(en, mdToCopy.get(en))
|
|
410
|
+
#self.update(mdToCopy)
|
|
411
|
+
|
|
412
|
+
def mergeEntriesFrom(self, mdToCopy):
|
|
413
|
+
"""Copies entries from another metadata object into this one. Values
|
|
414
|
+
are only copied if they are not already defined locally.
|
|
415
|
+
|
|
416
|
+
Parameters
|
|
417
|
+
----------
|
|
418
|
+
mdToCopy : an instance of a metadata handler
|
|
419
|
+
The metadata handler from which to copy entries.
|
|
420
|
+
"""
|
|
421
|
+
#only copies values if not already defined
|
|
422
|
+
for en in mdToCopy.keys():
|
|
423
|
+
if not en in self.getEntryNames():
|
|
424
|
+
self.setEntry(en, mdToCopy.get(en))
|
|
425
|
+
|
|
426
|
+
def __repr__(self):
|
|
427
|
+
import re
|
|
428
|
+
s = ['%s: %s' % (en, self.getEntry(en) if not re.search(r'Time$',en) else self.tformat(self.getEntry(en))) for en in self.getEntryNames()]
|
|
429
|
+
return '<%s>:\n\n' % self.__class__.__name__ + '\n'.join(s)
|
|
430
|
+
|
|
431
|
+
@staticmethod
|
|
432
|
+
def tformat(timeval):
|
|
433
|
+
import time
|
|
434
|
+
|
|
435
|
+
print(timeval)
|
|
436
|
+
|
|
437
|
+
if isinstance(timeval, six.string_types):
|
|
438
|
+
if timeval == '':
|
|
439
|
+
return timeval
|
|
440
|
+
|
|
441
|
+
timeval = float(timeval)
|
|
442
|
+
|
|
443
|
+
if timeval < 946684800: # timestamp for year 2000 as heuristic
|
|
444
|
+
return timeval
|
|
445
|
+
else:
|
|
446
|
+
return "%s (%s)" % (timeval,time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(timeval)))
|
|
447
|
+
|
|
448
|
+
def GetSimpleString(self):
|
|
449
|
+
"""Writes out metadata in simplfied format.
|
|
450
|
+
|
|
451
|
+
Returns
|
|
452
|
+
-------
|
|
453
|
+
mdstring : string
|
|
454
|
+
The metadata in a simple, human readable format.
|
|
455
|
+
|
|
456
|
+
See Also
|
|
457
|
+
--------
|
|
458
|
+
SimpleMDHandler
|
|
459
|
+
"""
|
|
460
|
+
|
|
461
|
+
try:
|
|
462
|
+
import cPickle as pickle
|
|
463
|
+
except ImportError:
|
|
464
|
+
import pickle
|
|
465
|
+
|
|
466
|
+
import numpy as np
|
|
467
|
+
import six
|
|
468
|
+
|
|
469
|
+
s = ['#PYME Simple Metadata v1\n']
|
|
470
|
+
|
|
471
|
+
for en in self.getEntryNames():
|
|
472
|
+
val = self.getEntry(en)
|
|
473
|
+
|
|
474
|
+
if isinstance(val, six.string_types) or np.isscalar(val): #quote string
|
|
475
|
+
val = repr(val)
|
|
476
|
+
elif not isinstance(val, (int, float, list, dict, tuple)): #not easily recovered from representation
|
|
477
|
+
val = "pickle.loads('''%s''')" % pickle.dumps(val).replace('\n', '\\n')
|
|
478
|
+
|
|
479
|
+
s.append("md['%s'] = %s\n" % (en, val))
|
|
480
|
+
|
|
481
|
+
return s
|
|
482
|
+
|
|
483
|
+
@property
|
|
484
|
+
def voxelsize_nm(self):
|
|
485
|
+
return get_voxelsize_nm(self)
|
|
486
|
+
|
|
487
|
+
def WriteSimple(self, filename):
|
|
488
|
+
"""Dumps metadata to file in simplfied format.
|
|
489
|
+
|
|
490
|
+
Parameters
|
|
491
|
+
----------
|
|
492
|
+
filename : string
|
|
493
|
+
The the filename to write to. Should end in .md.
|
|
494
|
+
|
|
495
|
+
See Also
|
|
496
|
+
--------
|
|
497
|
+
SimpleMDHandler
|
|
498
|
+
"""
|
|
499
|
+
s = self.GetSimpleString()
|
|
500
|
+
f = open(filename, 'w')
|
|
501
|
+
f.writelines(s)
|
|
502
|
+
f.close()
|
|
503
|
+
|
|
504
|
+
def to_JSON(self):
|
|
505
|
+
import json
|
|
506
|
+
import numpy as np
|
|
507
|
+
|
|
508
|
+
class CustomEncoder(json.JSONEncoder):
|
|
509
|
+
def default(self, obj):
|
|
510
|
+
if isinstance(obj, np.generic):
|
|
511
|
+
return obj.tolist()
|
|
512
|
+
try:
|
|
513
|
+
return obj.to_JSON()
|
|
514
|
+
except AttributeError:
|
|
515
|
+
return json.JSONEncoder.default(self, obj)
|
|
516
|
+
|
|
517
|
+
d = {k: self.getEntry(k) for k in self.getEntryNames()}
|
|
518
|
+
|
|
519
|
+
return json.dumps(d, indent=2, sort_keys=True, cls=CustomEncoder)
|
|
520
|
+
|
|
521
|
+
def __getattr__(self, key):
|
|
522
|
+
""" Compatibility stub to support transition away from NestedClassMDHandler"""
|
|
523
|
+
import warnings
|
|
524
|
+
warnings.warn('Metadata access should use dictionary based or getEntry() syntax, not attribute based access', DeprecationWarning)
|
|
525
|
+
_attr_access(self, key)
|
|
526
|
+
|
|
527
|
+
def record_pyme_version(self):
|
|
528
|
+
""" Write version info to metadata"""
|
|
529
|
+
from PYME.version import detailed_version
|
|
530
|
+
|
|
531
|
+
self['PYME.Version'] = detailed_version()
|
|
532
|
+
|
|
533
|
+
class HDFMDHandler(MDHandlerBase):
|
|
534
|
+
def __init__(self, h5file, mdToCopy=None):
|
|
535
|
+
self.h5file = h5file
|
|
536
|
+
self.md = None
|
|
537
|
+
|
|
538
|
+
if self.h5file.__contains__('/MetaData'):
|
|
539
|
+
self.md = self.h5file.root.MetaData
|
|
540
|
+
else:
|
|
541
|
+
self.md = self.h5file.create_group(self.h5file.root, 'MetaData')
|
|
542
|
+
|
|
543
|
+
if not mdToCopy is None:
|
|
544
|
+
self.copyEntriesFrom(mdToCopy)
|
|
545
|
+
|
|
546
|
+
|
|
547
|
+
def setEntry(self,entryName, value):
|
|
548
|
+
entPath = entryName.split('.')
|
|
549
|
+
en = entPath[-1]
|
|
550
|
+
ep = entPath[:-1]
|
|
551
|
+
|
|
552
|
+
currGroup = self.h5file._get_or_create_path('/'.join(['', 'MetaData']+ ep), True)
|
|
553
|
+
currGroup._f_setattr(en, value)
|
|
554
|
+
|
|
555
|
+
if config.get('HDF-ZealousFlush', False):
|
|
556
|
+
self.h5file.flush()
|
|
557
|
+
|
|
558
|
+
|
|
559
|
+
def getEntry(self,entryName):
|
|
560
|
+
entPath = entryName.split('.')
|
|
561
|
+
en = entPath[-1]
|
|
562
|
+
ep = entPath[:-1]
|
|
563
|
+
|
|
564
|
+
res = self.h5file.get_node_attr('/'.join(['', 'MetaData']+ ep), en)
|
|
565
|
+
|
|
566
|
+
if isinstance(res, bytes):
|
|
567
|
+
res = res.decode('ascii')
|
|
568
|
+
|
|
569
|
+
#dodgy hack to get around a problem with zero length strings not
|
|
570
|
+
#being picklable if they are numpy (rather than pure python) types
|
|
571
|
+
#this code should convert a numpy empty string into a python empty string
|
|
572
|
+
if res == '':
|
|
573
|
+
return ''
|
|
574
|
+
|
|
575
|
+
return res
|
|
576
|
+
|
|
577
|
+
|
|
578
|
+
|
|
579
|
+
def getEntryNames(self):
|
|
580
|
+
entryNames = []
|
|
581
|
+
for a in [self.md] + list(self.md._f_walknodes()):
|
|
582
|
+
entryNames.extend(['.'.join(a._v_pathname.split('/')[2:] +[ i]) for i in a._v_attrs._f_list()])
|
|
583
|
+
|
|
584
|
+
return entryNames
|
|
585
|
+
|
|
586
|
+
class QueueMDHandler(MDHandlerBase):
|
|
587
|
+
def __init__(self, tq, queueName, mdToCopy=None):
|
|
588
|
+
self.tq = tq
|
|
589
|
+
self.queueName = queueName
|
|
590
|
+
self.md = None
|
|
591
|
+
|
|
592
|
+
if not mdToCopy is None:
|
|
593
|
+
self.copyEntriesFrom(mdToCopy)
|
|
594
|
+
|
|
595
|
+
def copyEntriesFrom(self, mdToCopy):
|
|
596
|
+
self.tq.setQueueMetaDataEntries(self.queueName, mdToCopy)
|
|
597
|
+
|
|
598
|
+
def setEntry(self,entryName, value):
|
|
599
|
+
self.tq.setQueueMetaData(self.queueName, entryName, value)
|
|
600
|
+
|
|
601
|
+
|
|
602
|
+
def getEntry(self,entryName):
|
|
603
|
+
#print entryName
|
|
604
|
+
return self.tq.getQueueMetaData(self.queueName, entryName)
|
|
605
|
+
|
|
606
|
+
|
|
607
|
+
def getEntryNames(self):
|
|
608
|
+
return self.tq.getQueueMetaDataKeys(self.queueName)
|
|
609
|
+
|
|
610
|
+
|
|
611
|
+
|
|
612
|
+
class NestedClassMDHandler(MDHandlerBase):
|
|
613
|
+
def __init__(self, mdToCopy=None):
|
|
614
|
+
if not mdToCopy is None:
|
|
615
|
+
self.copyEntriesFrom(mdToCopy)
|
|
616
|
+
|
|
617
|
+
|
|
618
|
+
def setEntry(self,entryName, value):
|
|
619
|
+
entPath = entryName.split('.')
|
|
620
|
+
if len(entPath) == 1: #direct child of this node
|
|
621
|
+
self.__dict__[entPath[0]] = value
|
|
622
|
+
else:
|
|
623
|
+
if not entPath[0] in dir(self):
|
|
624
|
+
self.__dict__[entPath[0]] = NestedClassMDHandler()
|
|
625
|
+
self.__dict__[entPath[0]].setEntry('.'.join(entPath[1:]), value)
|
|
626
|
+
|
|
627
|
+
|
|
628
|
+
def getEntry(self,entryName):
|
|
629
|
+
#print(entryName)
|
|
630
|
+
return eval('self.'+entryName)
|
|
631
|
+
# try:
|
|
632
|
+
# return eval('self.'+entryName)
|
|
633
|
+
# except AttributeError:
|
|
634
|
+
# raise KeyError('No entry found for %s' % entryName)
|
|
635
|
+
|
|
636
|
+
|
|
637
|
+
def getEntryNames(self):
|
|
638
|
+
en = []
|
|
639
|
+
for k in self.__dict__.keys():
|
|
640
|
+
if hasattr(self.__dict__[k], 'getEntryNames') and not self.__dict__[k].__module__ == 'Pyro.core':
|
|
641
|
+
en += [k + '.' + kp for kp in self.__dict__[k].getEntryNames()]
|
|
642
|
+
else:
|
|
643
|
+
en.append(k)
|
|
644
|
+
|
|
645
|
+
return en
|
|
646
|
+
|
|
647
|
+
def __getattr__(self, item):
|
|
648
|
+
'''Replace __getattr__ of base class which spoofs nested class like attribute access with a move vanilla implementation'''
|
|
649
|
+
try:
|
|
650
|
+
return self.__dict__[item]
|
|
651
|
+
except KeyError:
|
|
652
|
+
raise AttributeError('NestedClassMDHandler has no attribute "%s"' % item)
|
|
653
|
+
|
|
654
|
+
class DictMDHandler(MDHandlerBase):
|
|
655
|
+
"""Simple implementation using a dict.
|
|
656
|
+
|
|
657
|
+
Should eventually replace most instances of NestedClassMDHandler
|
|
658
|
+
|
|
659
|
+
Adds a writable flag to enable read-only metadata (currently unused, but gives us the option of enforcing good
|
|
660
|
+
behaviour in, e.g., recipe modules, in the future). TODO - propagate writable flag up to base?
|
|
661
|
+
"""
|
|
662
|
+
def __init__(self, mdToCopy=None, writable=True):
|
|
663
|
+
self._storage = {}
|
|
664
|
+
self._writable = True
|
|
665
|
+
if not mdToCopy is None:
|
|
666
|
+
self.copyEntriesFrom(mdToCopy)
|
|
667
|
+
|
|
668
|
+
# set our writable after we've done the initial copy
|
|
669
|
+
self._writable = writable
|
|
670
|
+
|
|
671
|
+
import warnings
|
|
672
|
+
warnings.warn('DictMDHandler is not yet fully supported, and will likely cause failures for anything related to localisation fitting')
|
|
673
|
+
|
|
674
|
+
def setEntry(self, entryName, value):
|
|
675
|
+
if not self._writable:
|
|
676
|
+
raise RuntimeError('metadata handler is read-only')
|
|
677
|
+
|
|
678
|
+
self._storage[entryName] = value
|
|
679
|
+
|
|
680
|
+
def getEntry(self, entryName):
|
|
681
|
+
return self._storage[entryName]
|
|
682
|
+
|
|
683
|
+
def getEntryNames(self):
|
|
684
|
+
return list(self._storage.keys())
|
|
685
|
+
|
|
686
|
+
def set_readonly(self):
|
|
687
|
+
self._writable = False
|
|
688
|
+
|
|
689
|
+
class CachingMDHandler(MDHandlerBase):
|
|
690
|
+
def __init__(self, mdToCache):
|
|
691
|
+
self.mdToCache = mdToCache
|
|
692
|
+
|
|
693
|
+
if not mdToCache is None:
|
|
694
|
+
self.cache = dict(mdToCache.items())
|
|
695
|
+
|
|
696
|
+
@classmethod
|
|
697
|
+
def recreate(cls, cache):
|
|
698
|
+
c = cls(None)
|
|
699
|
+
c.cache = cache
|
|
700
|
+
|
|
701
|
+
def __reduce__(self):
|
|
702
|
+
return (CachingMDHandler.recreate, (self.cache,))
|
|
703
|
+
|
|
704
|
+
def getEntry(self, entryName):
|
|
705
|
+
return self.cache[entryName]
|
|
706
|
+
|
|
707
|
+
def setEntry(self, entryName, value):
|
|
708
|
+
self.cache[entryName] = value
|
|
709
|
+
if not self.mdToCache is None:
|
|
710
|
+
self.mdToCache.setEntry(entryName, value)
|
|
711
|
+
|
|
712
|
+
def getEntryNames(self):
|
|
713
|
+
return self.cache.keys()
|
|
714
|
+
|
|
715
|
+
|
|
716
|
+
class CopyOnWriteMDHandler(MDHandlerBase):
|
|
717
|
+
def __init__(self, orig_md):
|
|
718
|
+
self._orig_md = orig_md
|
|
719
|
+
|
|
720
|
+
self._cache = dict()
|
|
721
|
+
|
|
722
|
+
def getEntry(self, entryName):
|
|
723
|
+
try:
|
|
724
|
+
return self._cache[entryName]
|
|
725
|
+
except KeyError:
|
|
726
|
+
return self._orig_md.getEntry(entryName)
|
|
727
|
+
|
|
728
|
+
def setEntry(self, entryName, value):
|
|
729
|
+
self._cache[entryName] = value
|
|
730
|
+
|
|
731
|
+
def getEntryNames(self):
|
|
732
|
+
return sorted(list(set(self._cache.keys()).union(self._orig_md.keys())))
|
|
733
|
+
|
|
734
|
+
|
|
735
|
+
from xml.dom.minidom import getDOMImplementation, parse, parseString
|
|
736
|
+
#from xml.sax.saxutils import escape, unescape
|
|
737
|
+
import base64
|
|
738
|
+
|
|
739
|
+
class SimpleMDHandler(NestedClassMDHandler):
|
|
740
|
+
"""simple metadata format - consists of a python script with a .md extension
|
|
741
|
+
which adds entrys using the dictionary syntax to a metadata handler called md"""
|
|
742
|
+
|
|
743
|
+
def __init__(self, filename = None, mdToCopy=None):
|
|
744
|
+
if not filename is None:
|
|
745
|
+
from PYME.util.execfile import _execfile
|
|
746
|
+
try:
|
|
747
|
+
import cPickle as pickle
|
|
748
|
+
except ImportError:
|
|
749
|
+
import pickle
|
|
750
|
+
|
|
751
|
+
#loading an existing file
|
|
752
|
+
md = self
|
|
753
|
+
fn = __file__
|
|
754
|
+
globals()['__file__'] = filename
|
|
755
|
+
_execfile(filename, locals(), globals())
|
|
756
|
+
globals()['__file__'] = fn
|
|
757
|
+
|
|
758
|
+
if not mdToCopy is None:
|
|
759
|
+
self.copyEntriesFrom(mdToCopy)
|
|
760
|
+
|
|
761
|
+
def write(self, filename):
|
|
762
|
+
s = ''
|
|
763
|
+
for en in self.getEntryNames():
|
|
764
|
+
s += "md['%s'] = %s\n" % (en, self.getEntry(en))
|
|
765
|
+
|
|
766
|
+
fid = open(filename, 'w')
|
|
767
|
+
fid.write(s)
|
|
768
|
+
fid.close()
|
|
769
|
+
|
|
770
|
+
|
|
771
|
+
|
|
772
|
+
class XMLMDHandler(MDHandlerBase):
|
|
773
|
+
def __init__(self, filename = None, mdToCopy=None):
|
|
774
|
+
if not filename is None:
|
|
775
|
+
#loading an existing file
|
|
776
|
+
self.doc = parse(filename)
|
|
777
|
+
self.md = self.doc.documentElement.getElementsByTagName('MetaData')[0]
|
|
778
|
+
else:
|
|
779
|
+
#creating a new document
|
|
780
|
+
self.doc = getDOMImplementation().createDocument(None, 'PYMEImageData', None)
|
|
781
|
+
self.md = self.doc.createElement('MetaData')
|
|
782
|
+
self.doc.documentElement.appendChild(self.md)
|
|
783
|
+
|
|
784
|
+
if not mdToCopy is None:
|
|
785
|
+
self.copyEntriesFrom(mdToCopy)
|
|
786
|
+
|
|
787
|
+
def writeXML(self, filename):
|
|
788
|
+
f = open(filename, 'w')
|
|
789
|
+
f.write(self.doc.toprettyxml())
|
|
790
|
+
f.close()
|
|
791
|
+
|
|
792
|
+
|
|
793
|
+
def setEntry(self,entryName, value):
|
|
794
|
+
try:
|
|
795
|
+
import cPickle as pickle
|
|
796
|
+
except ImportError:
|
|
797
|
+
import pickle
|
|
798
|
+
|
|
799
|
+
import numpy as np
|
|
800
|
+
|
|
801
|
+
entPath = entryName.split('.')
|
|
802
|
+
|
|
803
|
+
node = self.md
|
|
804
|
+
while len(entPath) >= 1:
|
|
805
|
+
el = [e for e in node.childNodes if e.tagName == entPath[0]]
|
|
806
|
+
if len(el) == 0:
|
|
807
|
+
#need to create node
|
|
808
|
+
newNode = self.doc.createElement(entPath[0])
|
|
809
|
+
node.appendChild(newNode)
|
|
810
|
+
node = newNode
|
|
811
|
+
else:
|
|
812
|
+
node = el[0]
|
|
813
|
+
|
|
814
|
+
entPath.pop(0)
|
|
815
|
+
|
|
816
|
+
#typ = type(value) #.__name__
|
|
817
|
+
|
|
818
|
+
if isinstance(value, float):
|
|
819
|
+
node.setAttribute('class', 'float')
|
|
820
|
+
node.setAttribute('value', str(value))#.encode('utf-8'))
|
|
821
|
+
elif isinstance(value, int):
|
|
822
|
+
node.setAttribute('class', 'int')
|
|
823
|
+
node.setAttribute('value', str(value))#.encode('utf-8'))
|
|
824
|
+
elif isinstance(value, six.binary_type):
|
|
825
|
+
node.setAttribute('class', 'str')
|
|
826
|
+
node.setAttribute('value', value)
|
|
827
|
+
elif isinstance(value, six.text_type):
|
|
828
|
+
node.setAttribute('class', 'unicode')
|
|
829
|
+
node.setAttribute('value', str(value))#.encode('utf-8'))
|
|
830
|
+
elif np.isscalar(value):
|
|
831
|
+
node.setAttribute('class', 'float')
|
|
832
|
+
node.setAttribute('value', str(value))#.encode('utf-8'))
|
|
833
|
+
else: #pickle more complicated structures
|
|
834
|
+
node.setAttribute('class', 'pickle')
|
|
835
|
+
#print((value, pickle.dumps(value)))
|
|
836
|
+
node.setAttribute('value', base64.b64encode((pickle.dumps(value))).decode('ascii'))
|
|
837
|
+
|
|
838
|
+
|
|
839
|
+
def getEntry(self,entryName):
|
|
840
|
+
try:
|
|
841
|
+
import cPickle as pickle
|
|
842
|
+
except ImportError:
|
|
843
|
+
import pickle
|
|
844
|
+
|
|
845
|
+
entPath = entryName.split('.')
|
|
846
|
+
|
|
847
|
+
node = self.md
|
|
848
|
+
while len(entPath) >= 1:
|
|
849
|
+
el = [e for e in node.childNodes if e.nodeName == entPath[0]]
|
|
850
|
+
if len(el) == 0:
|
|
851
|
+
#node not there
|
|
852
|
+
raise AttributeError(u'Requested node not found')
|
|
853
|
+
else:
|
|
854
|
+
node = el[0]
|
|
855
|
+
|
|
856
|
+
entPath.pop(0)
|
|
857
|
+
|
|
858
|
+
cls = node.getAttribute('class')
|
|
859
|
+
val = node.getAttribute('value')
|
|
860
|
+
|
|
861
|
+
if val == 'True': #booleans get cls 'int'
|
|
862
|
+
val = True
|
|
863
|
+
elif val == 'False':
|
|
864
|
+
val = False
|
|
865
|
+
elif cls == 'int':
|
|
866
|
+
val = int(val)
|
|
867
|
+
elif cls == 'float':
|
|
868
|
+
val = float(val)
|
|
869
|
+
elif cls == 'unicode':
|
|
870
|
+
if six.PY2:
|
|
871
|
+
val = val.decode('utf8')
|
|
872
|
+
elif cls == 'pickle':
|
|
873
|
+
#return None
|
|
874
|
+
try:
|
|
875
|
+
# note that we seem to need 'latin1' option for pickle.loads after the base64 decoding
|
|
876
|
+
# this seems to work in all instances of older metadata tested so far
|
|
877
|
+
val = pickle.loads(base64.b64decode(val.encode('ascii')),encoding='latin1')
|
|
878
|
+
except:
|
|
879
|
+
logger.exception(u'Error loading metadata from pickle')
|
|
880
|
+
|
|
881
|
+
return val
|
|
882
|
+
|
|
883
|
+
|
|
884
|
+
def getEntryNames(self):
|
|
885
|
+
elements = self.md.getElementsByTagName('*')
|
|
886
|
+
|
|
887
|
+
en = []
|
|
888
|
+
|
|
889
|
+
for e in elements:
|
|
890
|
+
if not e.hasChildNodes(): #we are at the end of the tree
|
|
891
|
+
n = e.nodeName #starting name
|
|
892
|
+
while not e.parentNode == self.md:
|
|
893
|
+
e = e.parentNode
|
|
894
|
+
n = '.'.join((e.nodeName, n))
|
|
895
|
+
|
|
896
|
+
en.append(n)
|
|
897
|
+
|
|
898
|
+
return en
|
|
899
|
+
|
|
900
|
+
|
|
901
|
+
class OMEXMLMDHandler(XMLMDHandler):
|
|
902
|
+
_OME_UNITS_TO_UM = {'m': 1e6, 'mm': 1e3, 'um': 1.0, u'\u00B5m': 1.0, 'nm': 1e-3}
|
|
903
|
+
|
|
904
|
+
@classmethod
|
|
905
|
+
def _get_pixel_size_um(cls, pix, axis, default=0.1):
|
|
906
|
+
axis = axis.upper()
|
|
907
|
+
try:
|
|
908
|
+
ps = float(pix.getAttribute('PhysicalSize%s' % axis))
|
|
909
|
+
except:
|
|
910
|
+
logger.error('No %s pixel size defined, using default' % axis)
|
|
911
|
+
return default
|
|
912
|
+
try:
|
|
913
|
+
ps = ps * cls._OME_UNITS_TO_UM[pix.getAttribute('PhysicalSize%sUnit' % axis)]
|
|
914
|
+
except:
|
|
915
|
+
logger.error('No units defined for axis %s, defaulting to um' % axis)
|
|
916
|
+
return ps
|
|
917
|
+
|
|
918
|
+
return ps
|
|
919
|
+
|
|
920
|
+
def __init__(self, XMLData = None, mdToCopy=None):
|
|
921
|
+
if not XMLData is None:
|
|
922
|
+
#loading an existing file
|
|
923
|
+
self.doc = parseString(XMLData)
|
|
924
|
+
#try:
|
|
925
|
+
try:
|
|
926
|
+
self.md = self.doc.documentElement.getElementsByTagName('MetaData')[0]
|
|
927
|
+
except IndexError:
|
|
928
|
+
self.md = self.doc.createElement('MetaData')
|
|
929
|
+
self.doc.documentElement.appendChild(self.md)
|
|
930
|
+
|
|
931
|
+
#try to load pixel size etc fro OME metadata
|
|
932
|
+
pix = self.doc.getElementsByTagName('Pixels')[0]
|
|
933
|
+
|
|
934
|
+
#using -ve defaults will trigger a voxelsize prompt in the GUI if pixel size metadata is not present
|
|
935
|
+
self['voxelsize.x'] = self._get_pixel_size_um(pix, 'X', -.1)
|
|
936
|
+
self['voxelsize.y'] = self._get_pixel_size_um(pix, 'Y', -.1)
|
|
937
|
+
self['voxelsize.z'] = self._get_pixel_size_um(pix, 'Z', 0.0)
|
|
938
|
+
self['voxelsize.units'] = 'um' #this is a courtesy - to define anything else is an error.
|
|
939
|
+
|
|
940
|
+
try:
|
|
941
|
+
self['Camera.CycleTime'] = float(pix.getAttribute('TimeIncrement'))
|
|
942
|
+
except:
|
|
943
|
+
pass
|
|
944
|
+
|
|
945
|
+
self['OME.SizeX'] = int(pix.getAttribute('SizeX'))
|
|
946
|
+
self['OME.SizeY'] = int(pix.getAttribute('SizeY'))
|
|
947
|
+
self['OME.SizeZ'] = int(pix.getAttribute('SizeZ'))
|
|
948
|
+
self['OME.SizeT'] = int(pix.getAttribute('SizeT'))
|
|
949
|
+
self['OME.SizeC'] = int(pix.getAttribute('SizeC'))
|
|
950
|
+
|
|
951
|
+
self['OME.DimensionOrder'] = pix.getAttribute('DimensionOrder')
|
|
952
|
+
|
|
953
|
+
#except:
|
|
954
|
+
# pass
|
|
955
|
+
|
|
956
|
+
|
|
957
|
+
|
|
958
|
+
|
|
959
|
+
else:
|
|
960
|
+
#creating a new document
|
|
961
|
+
self.doc = getDOMImplementation().createDocument(None, 'OME', None)
|
|
962
|
+
self.doc.documentElement.setAttribute('xmlns', "http://www.openmicroscopy.org/Schemas/OME/2015-01")
|
|
963
|
+
#self.doc.documentElement.setAttribute('xmlns:ROI', "http://www.openmicroscopy.org/Schemas/ROI/2015-01")
|
|
964
|
+
#self.doc.documentElement.setAttribute('xmlns:BIN', "http://www.openmicroscopy.org/Schemas/BinaryFile/2015-01")
|
|
965
|
+
self.doc.documentElement.setAttribute('xmlns:xsi', "http://www.w3.org/2001/XMLSchema-instance")
|
|
966
|
+
self.doc.documentElement.setAttribute('xsi:schemaLocation','http://www.openmicroscopy.org/Schemas/OME/2015-01 http://www.openmicroscopy.org/Schemas/OME/2015-01/ome.xsd')
|
|
967
|
+
|
|
968
|
+
|
|
969
|
+
self.img = self.doc.createElement('Image')
|
|
970
|
+
self.img.setAttribute('ID', 'Image:0')
|
|
971
|
+
self.img.setAttribute('Name', 'Image:0')
|
|
972
|
+
self.doc.documentElement.appendChild(self.img)
|
|
973
|
+
|
|
974
|
+
self.pixels = self.doc.createElement('Pixels')
|
|
975
|
+
self.img.appendChild(self.pixels)
|
|
976
|
+
self.pixels.setAttribute('ID', 'Pixels:0')
|
|
977
|
+
self.pixels.setAttribute('DimensionOrder', 'XYZTC')
|
|
978
|
+
self.pixels.setAttribute('BigEndian', 'false')
|
|
979
|
+
self.pixels.setAttribute('Interleaved', 'false')
|
|
980
|
+
|
|
981
|
+
tf = self.doc.createElement('TiffData')
|
|
982
|
+
self.pixels.appendChild(tf)
|
|
983
|
+
|
|
984
|
+
sa = self.doc.createElement('StructuredAnnotations')
|
|
985
|
+
self.doc.documentElement.appendChild(sa)
|
|
986
|
+
|
|
987
|
+
xa = self.doc.createElement('XMLAnnotation')
|
|
988
|
+
sa.appendChild(xa)
|
|
989
|
+
xa.setAttribute('ID', 'PYME')
|
|
990
|
+
#self.doc = getDOMImplementation().createDocument(None, 'PYMEImageData', None)
|
|
991
|
+
v = self.doc.createElement('Value')
|
|
992
|
+
xa.appendChild(v)
|
|
993
|
+
|
|
994
|
+
self.md = self.doc.createElement('MetaData')
|
|
995
|
+
v.appendChild(self.md)
|
|
996
|
+
|
|
997
|
+
if not mdToCopy is None:
|
|
998
|
+
self.copyEntriesFrom(mdToCopy)
|
|
999
|
+
|
|
1000
|
+
def getXML(self, data = None):
|
|
1001
|
+
#sync the OME data from the ordinary metadata
|
|
1002
|
+
if not data is None:
|
|
1003
|
+
ims = data.shape
|
|
1004
|
+
if (data.ndim == 5):
|
|
1005
|
+
SizeY, SizeX, SizeZ, SizeT, SizeC = ims[:data.ndim]
|
|
1006
|
+
elif(data.ndim == 4):
|
|
1007
|
+
SizeY, SizeX, SizeT, SizeC = ims[:data.ndim]
|
|
1008
|
+
SizeZ = 1
|
|
1009
|
+
else:
|
|
1010
|
+
SizeY, SizeX, SizeT = ims[:3]
|
|
1011
|
+
SizeZ = 1
|
|
1012
|
+
SizeC = 1
|
|
1013
|
+
|
|
1014
|
+
|
|
1015
|
+
if str(data.dtype) in ('float32', 'float64'):
|
|
1016
|
+
self.pixels.setAttribute('Type', 'float')
|
|
1017
|
+
else:
|
|
1018
|
+
self.pixels.setAttribute('Type', str(data.dtype))
|
|
1019
|
+
self.pixels.setAttribute('SizeX', str(SizeX))
|
|
1020
|
+
self.pixels.setAttribute('SizeY', str(SizeY))
|
|
1021
|
+
self.pixels.setAttribute('SizeZ', str(SizeZ))
|
|
1022
|
+
self.pixels.setAttribute('SizeT', str(SizeT))
|
|
1023
|
+
self.pixels.setAttribute('SizeC', str(SizeC))
|
|
1024
|
+
|
|
1025
|
+
for i in range(SizeC):
|
|
1026
|
+
c = self.doc.createElement('Channel')
|
|
1027
|
+
c.setAttribute('ID', 'Channel:0:%d' %i)
|
|
1028
|
+
c.setAttribute('SamplesPerPixel', '1')
|
|
1029
|
+
l = self.doc.createElement('LightPath')
|
|
1030
|
+
c.appendChild(l)
|
|
1031
|
+
self.pixels.appendChild(c)
|
|
1032
|
+
|
|
1033
|
+
if 'voxelsize.x' in self.getEntryNames():
|
|
1034
|
+
self.pixels.setAttribute('PhysicalSizeX', '%3.4f' % self.getEntry('voxelsize.x'))
|
|
1035
|
+
self.pixels.setAttribute('PhysicalSizeY', '%3.4f' % self.getEntry('voxelsize.y'))
|
|
1036
|
+
|
|
1037
|
+
return self.doc.toprettyxml()
|
|
1038
|
+
|
|
1039
|
+
def writeXML(self, filename):
|
|
1040
|
+
f = open(filename, 'w')
|
|
1041
|
+
f.write(self.getXML())
|
|
1042
|
+
f.close()
|
|
1043
|
+
|
|
1044
|
+
# def copyEntriesFrom(self, mdToCopy):
|
|
1045
|
+
# for en in mdToCopy.getEntryNames():
|
|
1046
|
+
# self.setEntry(en, mdToCopy.getEntry(en))
|
|
1047
|
+
|
|
1048
|
+
# def mergeEntriesFrom(self, mdToCopy):
|
|
1049
|
+
# #only copies values if not already defined
|
|
1050
|
+
# for en in mdToCopy.getEntryNames():
|
|
1051
|
+
# if not en in self.getEntryNames():
|
|
1052
|
+
# self.setEntry(en, mdToCopy.getEntry(en))
|
|
1053
|
+
#
|
|
1054
|
+
# def __repr__(self):
|
|
1055
|
+
# s = ['%s: %s' % (en, self.getEntry(en)) for en in self.getEntryNames()]
|
|
1056
|
+
# return '<%s>:\n\n' % self.__class__.__name__ + '\n'.join(s)
|
|
1057
|
+
|
|
1058
|
+
|
|
1059
|
+
def from_json(json_string):
|
|
1060
|
+
import json
|
|
1061
|
+
mdh = NestedClassMDHandler()
|
|
1062
|
+
mdh.update(json.loads(json_string))
|
|
1063
|
+
|
|
1064
|
+
return mdh
|
|
1065
|
+
|
|
1066
|
+
def load_json(filename):
|
|
1067
|
+
import json
|
|
1068
|
+
from PYME.IO import unifiedIO
|
|
1069
|
+
mdh = NestedClassMDHandler()
|
|
1070
|
+
mdh.update(json.loads(unifiedIO.read(filename)))
|
|
1071
|
+
|
|
1072
|
+
return mdh
|