python-microscopy 25.6.5__cp39-cp39-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- PYME/Acquire/ActionManager.py +450 -0
- PYME/Acquire/ExecTools.py +235 -0
- PYME/Acquire/Hardware/AAOptoelectronics/MDS.py +175 -0
- PYME/Acquire/Hardware/AAOptoelectronics/__init__.py +0 -0
- PYME/Acquire/Hardware/ARCoptix/__init__.py +0 -0
- PYME/Acquire/Hardware/ARCoptix/lcdriver.py +149 -0
- PYME/Acquire/Hardware/ARCoptix/lcserver32.py +123 -0
- PYME/Acquire/Hardware/AndorIXon/AndorCam.py +1095 -0
- PYME/Acquire/Hardware/AndorIXon/AndorControlFrame.py +312 -0
- PYME/Acquire/Hardware/AndorIXon/AndorIXon.py +737 -0
- PYME/Acquire/Hardware/AndorIXon/__init__.py +27 -0
- PYME/Acquire/Hardware/AndorNeo/AndorNeo.py +644 -0
- PYME/Acquire/Hardware/AndorNeo/AndorNeoControlFrame.py +161 -0
- PYME/Acquire/Hardware/AndorNeo/AndorZyla.py +761 -0
- PYME/Acquire/Hardware/AndorNeo/SDK3.py +307 -0
- PYME/Acquire/Hardware/AndorNeo/SDK3Cam.py +171 -0
- PYME/Acquire/Hardware/AndorNeo/ZylaControlPanel.py +105 -0
- PYME/Acquire/Hardware/AndorNeo/__init__.py +22 -0
- PYME/Acquire/Hardware/AndorNeo/parseAtdebug.py +46 -0
- PYME/Acquire/Hardware/AndorNeo/plotTimings.py +73 -0
- PYME/Acquire/Hardware/AndorNeo/testNeo.py +62 -0
- PYME/Acquire/Hardware/Camera.py +1199 -0
- PYME/Acquire/Hardware/CameraSkeleton.py +642 -0
- PYME/Acquire/Hardware/Coherent/OBIS.py +147 -0
- PYME/Acquire/Hardware/Coherent/Sapphire.py +162 -0
- PYME/Acquire/Hardware/Coherent/__init__.py +0 -0
- PYME/Acquire/Hardware/DMDGui.py +198 -0
- PYME/Acquire/Hardware/DigiData/DigiData.py +95 -0
- PYME/Acquire/Hardware/DigiData/DigiDataClient.py +30 -0
- PYME/Acquire/Hardware/DigiData/RemoteDigiData.py +51 -0
- PYME/Acquire/Hardware/DigiData/__init__.py +24 -0
- PYME/Acquire/Hardware/DigiData/axDD132x.py +348 -0
- PYME/Acquire/Hardware/EMCCDTheory.py +41 -0
- PYME/Acquire/Hardware/ExciterWheel.py +167 -0
- PYME/Acquire/Hardware/FilterWheel.py +184 -0
- PYME/Acquire/Hardware/FocCorr.py +106 -0
- PYME/Acquire/Hardware/FocCorrR.py +196 -0
- PYME/Acquire/Hardware/FrFilter.py +51 -0
- PYME/Acquire/Hardware/GCS/GCS_DLL.py +370 -0
- PYME/Acquire/Hardware/GCS/__init__.py +0 -0
- PYME/Acquire/Hardware/GCS/gcs.py +210 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/HamamatsuDCAM.py +662 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/HamamatsuORCA.py +602 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/Hamamatsu_control_panel.py +54 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/__init__.py +23 -0
- PYME/Acquire/Hardware/LaserControlFrame.py +160 -0
- PYME/Acquire/Hardware/MPBCommunications/MPBCW.py +132 -0
- PYME/Acquire/Hardware/MPBCommunications/__init__.py +0 -0
- PYME/Acquire/Hardware/Mercury/Mercury.py +269 -0
- PYME/Acquire/Hardware/Mercury/PI_Mercury_GCS_DLL.py +857 -0
- PYME/Acquire/Hardware/Mercury/__init__.py +22 -0
- PYME/Acquire/Hardware/Mercury/mercuryStepper.py +203 -0
- PYME/Acquire/Hardware/Mercury/mercuryStepperGCS.py +281 -0
- PYME/Acquire/Hardware/NikonTE2000.py +68 -0
- PYME/Acquire/Hardware/NikonTi.py +214 -0
- PYME/Acquire/Hardware/NikonTiGUI.py +81 -0
- PYME/Acquire/Hardware/OrielCornerstone.py +125 -0
- PYME/Acquire/Hardware/PM100USB.py +51 -0
- PYME/Acquire/Hardware/Piezos/__init__.py +22 -0
- PYME/Acquire/Hardware/Piezos/base_piezo.py +108 -0
- PYME/Acquire/Hardware/Piezos/offsetPiezo.py +162 -0
- PYME/Acquire/Hardware/Piezos/offsetPiezoREST.py +308 -0
- PYME/Acquire/Hardware/Piezos/piezo_c867.py +486 -0
- PYME/Acquire/Hardware/Piezos/piezo_e255.py +68 -0
- PYME/Acquire/Hardware/Piezos/piezo_e662.py +61 -0
- PYME/Acquire/Hardware/Piezos/piezo_e709.py +434 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816.py +452 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816_corr.py +70 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816_dll.py +518 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816b.py +70 -0
- PYME/Acquire/Hardware/Piezos/piezo_pipython_gcs.py +560 -0
- PYME/Acquire/Hardware/Piezos/piezo_test.py +55 -0
- PYME/Acquire/Hardware/Simulator/EmpiricalHist.py +273 -0
- PYME/Acquire/Hardware/Simulator/__init__.py +22 -0
- PYME/Acquire/Hardware/Simulator/dSimControl.py +961 -0
- PYME/Acquire/Hardware/Simulator/fakeCam.py +651 -0
- PYME/Acquire/Hardware/Simulator/fakePiezo.py +95 -0
- PYME/Acquire/Hardware/Simulator/fluor.py +336 -0
- PYME/Acquire/Hardware/Simulator/illuminate.cp39-win_amd64.dll.a +0 -0
- PYME/Acquire/Hardware/Simulator/illuminate.cp39-win_amd64.pyd +0 -0
- PYME/Acquire/Hardware/Simulator/illuminate.pyx +93 -0
- PYME/Acquire/Hardware/Simulator/lasersliders.py +90 -0
- PYME/Acquire/Hardware/Simulator/rend_im.py +446 -0
- PYME/Acquire/Hardware/Simulator/setup.py +69 -0
- PYME/Acquire/Hardware/Simulator/simcontrol.py +348 -0
- PYME/Acquire/Hardware/Simulator/simui_wx.py +794 -0
- PYME/Acquire/Hardware/Tango/__init__.py +0 -0
- PYME/Acquire/Hardware/Tango/marzhauser_tango.py +583 -0
- PYME/Acquire/Hardware/TiLightCrafter.py +388 -0
- PYME/Acquire/Hardware/__init__.py +22 -0
- PYME/Acquire/Hardware/aotf.py +271 -0
- PYME/Acquire/Hardware/arclampshutterpanel.py +71 -0
- PYME/Acquire/Hardware/cameraSoftwareBuffer.py +215 -0
- PYME/Acquire/Hardware/camera_noise.py +270 -0
- PYME/Acquire/Hardware/ccdAdjPanel.py +188 -0
- PYME/Acquire/Hardware/ccdCalibrator.py +161 -0
- PYME/Acquire/Hardware/cobaltLaser.py +108 -0
- PYME/Acquire/Hardware/cobaltLaser561.py +94 -0
- PYME/Acquire/Hardware/comports.py +26 -0
- PYME/Acquire/Hardware/driftTrackGUI.py +488 -0
- PYME/Acquire/Hardware/driftTracking.py +595 -0
- PYME/Acquire/Hardware/fakeShutters.py +52 -0
- PYME/Acquire/Hardware/focusKeys.py +204 -0
- PYME/Acquire/Hardware/focus_locks/__init__.py +0 -0
- PYME/Acquire/Hardware/focus_locks/reflection_focus_lock.py +684 -0
- PYME/Acquire/Hardware/frZStage.py +117 -0
- PYME/Acquire/Hardware/fw102.py +38 -0
- PYME/Acquire/Hardware/ids_peak_cam.py +561 -0
- PYME/Acquire/Hardware/ioslave.py +305 -0
- PYME/Acquire/Hardware/lasers.py +292 -0
- PYME/Acquire/Hardware/matchboxLaser.py +58 -0
- PYME/Acquire/Hardware/microscope_adapter.py +104 -0
- PYME/Acquire/Hardware/mpd_picosecond_delayer.py +395 -0
- PYME/Acquire/Hardware/multiview.py +287 -0
- PYME/Acquire/Hardware/olympusix81.py +59 -0
- PYME/Acquire/Hardware/pco/__init__.py +0 -0
- PYME/Acquire/Hardware/pco/pco_cam.py +348 -0
- PYME/Acquire/Hardware/pco/pco_edge_42_lt.py +34 -0
- PYME/Acquire/Hardware/pco/pco_sdk.py +1645 -0
- PYME/Acquire/Hardware/pco/pco_sdk_cam.py +518 -0
- PYME/Acquire/Hardware/pco/pco_sdk_cam_control_panel.py +54 -0
- PYME/Acquire/Hardware/phoxxLaser.py +199 -0
- PYME/Acquire/Hardware/phoxxLaserOLD.py +242 -0
- PYME/Acquire/Hardware/priorLumen.py +102 -0
- PYME/Acquire/Hardware/priorarclampshutter.py +52 -0
- PYME/Acquire/Hardware/setup.py +50 -0
- PYME/Acquire/Hardware/spacenav.py +148 -0
- PYME/Acquire/Hardware/splitter.py +394 -0
- PYME/Acquire/Hardware/thorlabsPiezo.py +98 -0
- PYME/Acquire/Hardware/thorlabs_cam.py +136 -0
- PYME/Acquire/Hardware/thorlabs_mff_flipper.py +400 -0
- PYME/Acquire/Hardware/toptica_ibeam.py +51 -0
- PYME/Acquire/Hardware/uc480/AndorControlFrame.py +308 -0
- PYME/Acquire/Hardware/uc480/__init__.py +27 -0
- PYME/Acquire/Hardware/uc480/uCam480.py +695 -0
- PYME/Acquire/Hardware/uc480/uc480.py +189 -0
- PYME/Acquire/Hardware/uc480/uc480Deprecated.py +87 -0
- PYME/Acquire/Hardware/uc480/uc480_h.py +767 -0
- PYME/Acquire/Hardware/uc480/uc480_h_gen.py +62 -0
- PYME/Acquire/Hardware/uc480/ucCamControlFrame.py +83 -0
- PYME/Acquire/Hardware/ueye.py +702 -0
- PYME/Acquire/PYMEAcquire.py +186 -0
- PYME/Acquire/Protocols/DMDMFM.py +74 -0
- PYME/Acquire/Protocols/__init__.py +22 -0
- PYME/Acquire/Protocols/darkCalibrate.py +56 -0
- PYME/Acquire/Protocols/dual671_470.py +45 -0
- PYME/Acquire/Protocols/dual671_488.py +46 -0
- PYME/Acquire/Protocols/gainCal.py +53 -0
- PYME/Acquire/Protocols/htsms-cal-psf.py +32 -0
- PYME/Acquire/Protocols/htsms-cal-registration.py +52 -0
- PYME/Acquire/Protocols/htsms-flow.py +29 -0
- PYME/Acquire/Protocols/htsms-staggered.py +31 -0
- PYME/Acquire/Protocols/htsms-tile.py +68 -0
- PYME/Acquire/Protocols/htsms-two-color.py +29 -0
- PYME/Acquire/Protocols/htsms-widefield.py +32 -0
- PYME/Acquire/Protocols/paint671.py +61 -0
- PYME/Acquire/Protocols/photoconversion.py +52 -0
- PYME/Acquire/Protocols/photoconversion2.py +55 -0
- PYME/Acquire/Protocols/prebleach488.py +70 -0
- PYME/Acquire/Protocols/prebleach490.py +69 -0
- PYME/Acquire/Protocols/prebleach561.py +72 -0
- PYME/Acquire/Protocols/prebleach561NeomEos2.py +70 -0
- PYME/Acquire/Protocols/prebleach561NeomEos2ND1.py +70 -0
- PYME/Acquire/Protocols/prebleach642.py +70 -0
- PYME/Acquire/Protocols/prebleach671.py +69 -0
- PYME/Acquire/Protocols/prebleach671ND1.py +58 -0
- PYME/Acquire/Protocols/prebleach671ND2.py +57 -0
- PYME/Acquire/Protocols/prebleach671Neo.py +69 -0
- PYME/Acquire/Protocols/recover671.py +62 -0
- PYME/Acquire/Protocols/sequence642_488.py +85 -0
- PYME/Acquire/Protocols/sequence642_561.py +87 -0
- PYME/Acquire/Protocols/shiftfield.py +198 -0
- PYME/Acquire/Protocols/simul488.py +59 -0
- PYME/Acquire/Protocols/simul642.py +63 -0
- PYME/Acquire/Protocols/simul642HTSMS.py +63 -0
- PYME/Acquire/Protocols/simulPA.py +37 -0
- PYME/Acquire/Protocols/simulSIM.py +76 -0
- PYME/Acquire/Protocols/simulStep.py +62 -0
- PYME/Acquire/Protocols/spdscan.py +178 -0
- PYME/Acquire/Protocols/standard470.py +45 -0
- PYME/Acquire/Protocols/standard488.py +47 -0
- PYME/Acquire/Protocols/standard671.py +48 -0
- PYME/Acquire/Protocols/standard671_no532.py +47 -0
- PYME/Acquire/Protocols/standardArclamp.py +46 -0
- PYME/Acquire/Protocols/strip_tile.py +204 -0
- PYME/Acquire/Protocols/tile.py +204 -0
- PYME/Acquire/Protocols/tile3D.py +192 -0
- PYME/Acquire/Protocols/tile671.py +190 -0
- PYME/Acquire/Protocols/tile_triggered.py +189 -0
- PYME/Acquire/Scripts/init.py +232 -0
- PYME/Acquire/Scripts/init_N1_Ti_Exeter_ZIx.py +374 -0
- PYME/Acquire/Scripts/init_N2_Ti_Zyla_lasers.py +290 -0
- PYME/Acquire/Scripts/init_Neo.py +266 -0
- PYME/Acquire/Scripts/init_NeoSim.py +159 -0
- PYME/Acquire/Scripts/init_TIRF.py +232 -0
- PYME/Acquire/Scripts/init_TIRF_Neo.py +242 -0
- PYME/Acquire/Scripts/init_TIRF_NeoO.py +241 -0
- PYME/Acquire/Scripts/init_TIRF_onecam.py +233 -0
- PYME/Acquire/Scripts/init_Ti.py +257 -0
- PYME/Acquire/Scripts/init_UOA_n.py +256 -0
- PYME/Acquire/Scripts/init_UOA_n2.py +246 -0
- PYME/Acquire/Scripts/init_Y1.py +249 -0
- PYME/Acquire/Scripts/init_Zyla.py +260 -0
- PYME/Acquire/Scripts/init_drift_tracking.py +80 -0
- PYME/Acquire/Scripts/init_emccd_basic.py +277 -0
- PYME/Acquire/Scripts/init_htsms.py +277 -0
- PYME/Acquire/Scripts/init_htsms_focus_lock.py +132 -0
- PYME/Acquire/Scripts/init_micrpi.py +45 -0
- PYME/Acquire/Scripts/init_orca.py +70 -0
- PYME/Acquire/Scripts/init_pco.py +49 -0
- PYME/Acquire/Scripts/init_rev.py +74 -0
- PYME/Acquire/Scripts/init_sim100.py +169 -0
- PYME/Acquire/Scripts/init_sim103.py +169 -0
- PYME/Acquire/Scripts/init_sim2.py +211 -0
- PYME/Acquire/Scripts/init_sim50.py +169 -0
- PYME/Acquire/Scripts/init_sim75.py +169 -0
- PYME/Acquire/Scripts/init_sim_drift_tracking.py +166 -0
- PYME/Acquire/Scripts/init_sim_htsms.py +224 -0
- PYME/Acquire/Scripts/init_sim_htsms_n.py +233 -0
- PYME/Acquire/Scripts/init_sim_main.py +229 -0
- PYME/Acquire/Scripts/init_sim_min.py +197 -0
- PYME/Acquire/Scripts/init_sim_rem.py +176 -0
- PYME/Acquire/Scripts/init_smi1.py +110 -0
- PYME/Acquire/Scripts/init_spectro.py +78 -0
- PYME/Acquire/Scripts/init_spim.py +116 -0
- PYME/Acquire/Scripts/init_thorcam.py +62 -0
- PYME/Acquire/Scripts/init_twophoton.py +112 -0
- PYME/Acquire/Scripts/init_uc480.py +262 -0
- PYME/Acquire/Scripts/init_ueye.py +261 -0
- PYME/Acquire/SpoolController.py +958 -0
- PYME/Acquire/Utils/MultiPointScanner.py +80 -0
- PYME/Acquire/Utils/__init__.py +13 -0
- PYME/Acquire/Utils/failsafe.py +157 -0
- PYME/Acquire/Utils/fastTiler.py +153 -0
- PYME/Acquire/Utils/pointScanner.py +496 -0
- PYME/Acquire/Utils/sarcSpacing.py +86 -0
- PYME/Acquire/Utils/strip_tiler.py +93 -0
- PYME/Acquire/Utils/tiler.py +464 -0
- PYME/Acquire/Utils/vibrationAnalysis.py +65 -0
- PYME/Acquire/__init__.py +44 -0
- PYME/Acquire/acquire_client.py +90 -0
- PYME/Acquire/acquire_server.py +316 -0
- PYME/Acquire/acquirebase.py +139 -0
- PYME/Acquire/acquiremainframe.py +716 -0
- PYME/Acquire/acquirewx.py +61 -0
- PYME/Acquire/acquisition_base.py +148 -0
- PYME/Acquire/actions.py +209 -0
- PYME/Acquire/autofocus.py +54 -0
- PYME/Acquire/eventLog.py +95 -0
- PYME/Acquire/event_loop.py +119 -0
- PYME/Acquire/frameWrangler.py +530 -0
- PYME/Acquire/htsms/__init__.py +8 -0
- PYME/Acquire/htsms/rule_ui.py +970 -0
- PYME/Acquire/htsms/rule_ui_v2.py +573 -0
- PYME/Acquire/htsms/tweeter.py +222 -0
- PYME/Acquire/microscope.py +1050 -0
- PYME/Acquire/positionTracker.py +181 -0
- PYME/Acquire/protocol.py +299 -0
- PYME/Acquire/protocol_acquisition.py +404 -0
- PYME/Acquire/sampleInformation.py +591 -0
- PYME/Acquire/sampleInformationDjangoDirect.py +446 -0
- PYME/Acquire/setup.py +52 -0
- PYME/Acquire/stackSettings.py +295 -0
- PYME/Acquire/stage_leveling.py +285 -0
- PYME/Acquire/ui/AnalysisSettingsUI.py +184 -0
- PYME/Acquire/ui/HDFSpoolFrame.py +584 -0
- PYME/Acquire/ui/__init__.py +0 -0
- PYME/Acquire/ui/actionUI.py +892 -0
- PYME/Acquire/ui/focus_lock_gui.py +149 -0
- PYME/Acquire/ui/intensity_trace.py +143 -0
- PYME/Acquire/ui/intsliders.py +222 -0
- PYME/Acquire/ui/lasersliders.py +329 -0
- PYME/Acquire/ui/mpd_picosecond_delay_panel.py +69 -0
- PYME/Acquire/ui/multiview_select.py +77 -0
- PYME/Acquire/ui/positionUI.py +519 -0
- PYME/Acquire/ui/preflight.py +58 -0
- PYME/Acquire/ui/scanner_panel.py +41 -0
- PYME/Acquire/ui/selectCameraPanel.py +46 -0
- PYME/Acquire/ui/seqdialog.py +501 -0
- PYME/Acquire/ui/splashScreen.py +175 -0
- PYME/Acquire/ui/spool_panel.py +830 -0
- PYME/Acquire/ui/tile_panel.py +556 -0
- PYME/Acquire/ui/tilesettingsui.py +91 -0
- PYME/Acquire/ui/voxelSizeDialog.py +149 -0
- PYME/Acquire/webui/__init__.py +36 -0
- PYME/Acquire/webui/ipy.py +361 -0
- PYME/Acquire/webui/static/css/pyme-bootstrap.css +9908 -0
- PYME/Acquire/webui/static/css/pymeacquire.css +85 -0
- PYME/Acquire/webui/static/js/pymeacquire.js +375 -0
- PYME/Acquire/webui/static/js/pzf.js +95 -0
- PYME/Acquire/webui/templates/PYMEAcquire.html +232 -0
- PYME/Acquire/webui/templates/login.html +84 -0
- PYME/Acquire/webui/templates/xtermpage.html +106 -0
- PYME/Acquire/xyztc.py +418 -0
- PYME/Acquire/zScanner.py +287 -0
- PYME/Analysis/BleachProfile/__init__.py +26 -0
- PYME/Analysis/BleachProfile/deMod.py +91 -0
- PYME/Analysis/BleachProfile/fitRecover.py +90 -0
- PYME/Analysis/BleachProfile/intensProf.py +519 -0
- PYME/Analysis/BleachProfile/kinModels.py +507 -0
- PYME/Analysis/BleachProfile/rawIntensity.py +227 -0
- PYME/Analysis/BleachProfile/rollins.py +555 -0
- PYME/Analysis/Colocalisation/__init__.py +27 -0
- PYME/Analysis/Colocalisation/colocScaleDep.py +126 -0
- PYME/Analysis/Colocalisation/correlationCoeffs.py +198 -0
- PYME/Analysis/Colocalisation/distColoc.py +110 -0
- PYME/Analysis/Colocalisation/edtColoc.py +191 -0
- PYME/Analysis/MetaData.py +278 -0
- PYME/Analysis/PSFEst/__init__.py +27 -0
- PYME/Analysis/PSFEst/dec.py +283 -0
- PYME/Analysis/PSFEst/extractImages.py +316 -0
- PYME/Analysis/PSFEst/fit_psf_zernikes.py +194 -0
- PYME/Analysis/PSFEst/psfQuality.py +225 -0
- PYME/Analysis/PSFGen/__init__.py +40 -0
- PYME/Analysis/PSFGen/fourier.py +138 -0
- PYME/Analysis/PSFGen/fourierHNA.py +1108 -0
- PYME/Analysis/PSFGen/fourierHNA2.py +979 -0
- PYME/Analysis/PSFGen/genCRBcurves.py +185 -0
- PYME/Analysis/PSFGen/nijboer_zernike.py +79 -0
- PYME/Analysis/PSFGen/ps_app.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/PSFGen/ps_app.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/PSFGen/test_ps_app.py +24 -0
- PYME/Analysis/Tracking/__init__.py +3 -0
- PYME/Analysis/Tracking/msd.py +57 -0
- PYME/Analysis/Tracking/trackUtils.py +528 -0
- PYME/Analysis/Tracking/tracking.py +152 -0
- PYME/Analysis/__init__.py +30 -0
- PYME/Analysis/_fithelpers.py +161 -0
- PYME/Analysis/angleFilter.py +287 -0
- PYME/Analysis/annealThresh.py +157 -0
- PYME/Analysis/autoencoder_classifier.py +45 -0
- PYME/Analysis/binAvg.py +144 -0
- PYME/Analysis/composite.py +183 -0
- PYME/Analysis/cramerRao.py +259 -0
- PYME/Analysis/deTile.py +441 -0
- PYME/Analysis/density_filter.py +45 -0
- PYME/Analysis/distributed_pyramid.py +426 -0
- PYME/Analysis/fiducial_matching.py +220 -0
- PYME/Analysis/gen_sCMOS_maps.py +355 -0
- PYME/Analysis/graphing_filters.py +311 -0
- PYME/Analysis/implicitFilter.py +359 -0
- PYME/Analysis/keep_pairs.py +69 -0
- PYME/Analysis/optic_flow.py +108 -0
- PYME/Analysis/piecewise.py +36 -0
- PYME/Analysis/piecewiseMapping.py +304 -0
- PYME/Analysis/piezo_movement_correction.py +153 -0
- PYME/Analysis/points/DeClump/__init__.py +78 -0
- PYME/Analysis/points/DeClump/deClump.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/DeClump/deClump.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/DeClump/deClumpGUI.py +87 -0
- PYME/Analysis/points/DeClump/pyDeClump.py +284 -0
- PYME/Analysis/points/DeClump/testClump.py +40 -0
- PYME/Analysis/points/DistHist/__init__.py +25 -0
- PYME/Analysis/points/DistHist/distHist.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/DistHist/distHist.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/DistHist/distHistThreaded.py +71 -0
- PYME/Analysis/points/DistHist/setup.py +54 -0
- PYME/Analysis/points/EdgeDB/__init__.py +24 -0
- PYME/Analysis/points/EdgeDB/edgeDB.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/EdgeDB/edgeDB.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/EdgeDB/edgeTest.py +66 -0
- PYME/Analysis/points/EdgeDB/edges.py +102 -0
- PYME/Analysis/points/EdgeDB/segment.py +75 -0
- PYME/Analysis/points/EdgeDB/setup.py +54 -0
- PYME/Analysis/points/QuadTree/QTrend.py +232 -0
- PYME/Analysis/points/QuadTree/__init__.py +25 -0
- PYME/Analysis/points/QuadTree/pointQT.py +227 -0
- PYME/Analysis/points/QuadTree/pointQTF.py +254 -0
- PYME/Analysis/points/QuadTree/qtUtils.py +36 -0
- PYME/Analysis/points/QuadTree/rendQT.py +118 -0
- PYME/Analysis/points/SoftRend/__init__.py +24 -0
- PYME/Analysis/points/SoftRend/setup.py +61 -0
- PYME/Analysis/points/SoftRend/testTetrahedra.py +41 -0
- PYME/Analysis/points/SoftRend/triRend.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/SoftRend/triRend.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/__init__.py +3 -0
- PYME/Analysis/points/arcfit/__init__.py +1 -0
- PYME/Analysis/points/arcfit/arcmf.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/arcfit/arcmf.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/arcfit/setup.py +51 -0
- PYME/Analysis/points/astigmatism/__init__.py +0 -0
- PYME/Analysis/points/astigmatism/astigTools.py +338 -0
- PYME/Analysis/points/astigmatism/astiglookup.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/astigmatism/astiglookup.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/astigmatism/setup.py +54 -0
- PYME/Analysis/points/cluster_morphology.py +199 -0
- PYME/Analysis/points/coordinate_tools.py +278 -0
- PYME/Analysis/points/features/__init__.py +0 -0
- PYME/Analysis/points/features/metal.py +46 -0
- PYME/Analysis/points/features/shaders/vect_feat_3d.metal +49 -0
- PYME/Analysis/points/fiducials.py +142 -0
- PYME/Analysis/points/gen3DTriangs.py +796 -0
- PYME/Analysis/points/moments.py +143 -0
- PYME/Analysis/points/multiview.py +458 -0
- PYME/Analysis/points/objectMeasure.py +206 -0
- PYME/Analysis/points/qpaint.py +97 -0
- PYME/Analysis/points/rings.py +372 -0
- PYME/Analysis/points/ripleys.py +427 -0
- PYME/Analysis/points/segmentLL.py +134 -0
- PYME/Analysis/points/setup.py +56 -0
- PYME/Analysis/points/spherical_harmonics.py +909 -0
- PYME/Analysis/points/surfit.py +829 -0
- PYME/Analysis/points/tCluster.py +75 -0
- PYME/Analysis/points/traveling_salesperson/__init__.py +0 -0
- PYME/Analysis/points/traveling_salesperson/queue_opt.py +117 -0
- PYME/Analysis/points/traveling_salesperson/sectioned_two_opt.py +327 -0
- PYME/Analysis/points/traveling_salesperson/setup.py +40 -0
- PYME/Analysis/points/traveling_salesperson/sort.py +78 -0
- PYME/Analysis/points/traveling_salesperson/two_opt.py +189 -0
- PYME/Analysis/points/traveling_salesperson/two_opt_utils.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/traveling_salesperson/two_opt_utils.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/traveling_salesperson/two_opt_utils.pyx +41 -0
- PYME/Analysis/points/twoColour.py +572 -0
- PYME/Analysis/points/twoColourPlot.py +107 -0
- PYME/Analysis/processLogger.py +129 -0
- PYME/Analysis/profile_extraction.py +72 -0
- PYME/Analysis/setup.py +60 -0
- PYME/Analysis/splitting.py +372 -0
- PYME/Analysis/svmSegment.py +214 -0
- PYME/Analysis/thresholding.py +192 -0
- PYME/Analysis/tile_pyramid.py +938 -0
- PYME/Analysis/widefieldify.py +54 -0
- PYME/DSView/DisplayOptionsPanel.py +503 -0
- PYME/DSView/LUT/__init__.py +33 -0
- PYME/DSView/LUT/lut.cp39-win_amd64.dll.a +0 -0
- PYME/DSView/LUT/lut.cp39-win_amd64.pyd +0 -0
- PYME/DSView/LUT/setup.py +54 -0
- PYME/DSView/OpenSequenceDialog.py +83 -0
- PYME/DSView/OverlaysPanel.py +111 -0
- PYME/DSView/__init__.py +32 -0
- PYME/DSView/arrayViewPanel.py +1035 -0
- PYME/DSView/displayOptions.py +453 -0
- PYME/DSView/displaySettingsPanel.py +271 -0
- PYME/DSView/dsviewer.py +542 -0
- PYME/DSView/eventLogViewer.py +805 -0
- PYME/DSView/fitInfo.py +486 -0
- PYME/DSView/htmlServe.py +72 -0
- PYME/DSView/logparser.py +100 -0
- PYME/DSView/modules/LMAnalysis.py +1053 -0
- PYME/DSView/modules/LMDisplay.py +194 -0
- PYME/DSView/modules/__init__.py +162 -0
- PYME/DSView/modules/_base.py +39 -0
- PYME/DSView/modules/annotation.py +725 -0
- PYME/DSView/modules/arrayView.py +71 -0
- PYME/DSView/modules/blobFinding.py +455 -0
- PYME/DSView/modules/blobMeasure.py +1093 -0
- PYME/DSView/modules/camera_maps.py +38 -0
- PYME/DSView/modules/coloc.py +414 -0
- PYME/DSView/modules/composite.py +715 -0
- PYME/DSView/modules/convnet.py +24 -0
- PYME/DSView/modules/cropping.py +133 -0
- PYME/DSView/modules/dark_and_flatfield.py +31 -0
- PYME/DSView/modules/deconvolution.py +499 -0
- PYME/DSView/modules/eventView.py +80 -0
- PYME/DSView/modules/extractBlobs.py +46 -0
- PYME/DSView/modules/fastGraphPanel.py +85 -0
- PYME/DSView/modules/filtering.py +335 -0
- PYME/DSView/modules/flowView.py +268 -0
- PYME/DSView/modules/fourierRingCorrelation.py +172 -0
- PYME/DSView/modules/gl_image_view.py +12 -0
- PYME/DSView/modules/graphViewPanel.py +272 -0
- PYME/DSView/modules/measure/__init__.py +1 -0
- PYME/DSView/modules/measure/filterPan.py +239 -0
- PYME/DSView/modules/metadataView.py +28 -0
- PYME/DSView/modules/multithreshold.py +98 -0
- PYME/DSView/modules/neuroglancer.py +129 -0
- PYME/DSView/modules/object_tagging.py +157 -0
- PYME/DSView/modules/particleTracking.py +463 -0
- PYME/DSView/modules/playback.py +256 -0
- PYME/DSView/modules/prebleachExtraction.py +75 -0
- PYME/DSView/modules/profileFitting.py +137 -0
- PYME/DSView/modules/profilePlotting.py +408 -0
- PYME/DSView/modules/projections.py +48 -0
- PYME/DSView/modules/psfExtraction.py +570 -0
- PYME/DSView/modules/psfGeneration.py +138 -0
- PYME/DSView/modules/psfTools.py +661 -0
- PYME/DSView/modules/pupilTools.py +204 -0
- PYME/DSView/modules/pupilView.py +139 -0
- PYME/DSView/modules/recipes.py +266 -0
- PYME/DSView/modules/redimension.py +75 -0
- PYME/DSView/modules/segmentation.py +192 -0
- PYME/DSView/modules/sheetView.py +24 -0
- PYME/DSView/modules/shell.py +39 -0
- PYME/DSView/modules/shiftfield_estimation.py +433 -0
- PYME/DSView/modules/sparkprepare.py +94 -0
- PYME/DSView/modules/splitter.py +148 -0
- PYME/DSView/modules/synchronise.py +64 -0
- PYME/DSView/modules/templates/astigCal.html +42 -0
- PYME/DSView/modules/templates/measureView.html +69 -0
- PYME/DSView/modules/templates/measureView2.html +48 -0
- PYME/DSView/modules/templates/measureView3.html +98 -0
- PYME/DSView/modules/templates/trackView.html +139 -0
- PYME/DSView/modules/templates/tracksOverview.html +21 -0
- PYME/DSView/modules/tiling.py +147 -0
- PYME/DSView/modules/unmixing.py +148 -0
- PYME/DSView/modules/vis3D.py +320 -0
- PYME/DSView/modules/visgui.py +163 -0
- PYME/DSView/modules/webview.py +14 -0
- PYME/DSView/overlays.py +295 -0
- PYME/DSView/scrolledImagePanel.py +188 -0
- PYME/DSView/setup.py +53 -0
- PYME/DSView/splashScreen.py +158 -0
- PYME/DSView/voxSizeDialog.py +84 -0
- PYME/Deconv/__init__.py +35 -0
- PYME/Deconv/beadGen.py +55 -0
- PYME/Deconv/dec.py +659 -0
- PYME/Deconv/decTask.py +65 -0
- PYME/Deconv/decThread.py +113 -0
- PYME/Deconv/dec_test.py +47 -0
- PYME/Deconv/deconvDialogs.py +417 -0
- PYME/Deconv/fftwWisdom.py +62 -0
- PYME/Deconv/richardsonLucy.py +141 -0
- PYME/Deconv/richardsonLucyMV.py +151 -0
- PYME/Deconv/richardsonLucyMVM.py +218 -0
- PYME/Deconv/test_block_dec.py +46 -0
- PYME/Deconv/tq_block_dec.py +331 -0
- PYME/Deconv/wiener.py +163 -0
- PYME/IO/DataSources/AlignDataSource.py +91 -0
- PYME/IO/DataSources/ArrayDataSource.py +260 -0
- PYME/IO/DataSources/BGSDataSource.py +353 -0
- PYME/IO/DataSources/BaseDataSource.py +457 -0
- PYME/IO/DataSources/BioformatsDataSource.py +178 -0
- PYME/IO/DataSources/BufferedDataSource.py +99 -0
- PYME/IO/DataSources/ClusterPZFDataSource.py +124 -0
- PYME/IO/DataSources/ConcatenatedDataSource.py +56 -0
- PYME/IO/DataSources/CropDataSource.py +243 -0
- PYME/IO/DataSources/DcimgDataSource.py +54 -0
- PYME/IO/DataSources/ElectronsPerSecondDataSource.py +61 -0
- PYME/IO/DataSources/FlatFieldDataSource.py +77 -0
- PYME/IO/DataSources/HDFDataSource.py +160 -0
- PYME/IO/DataSources/HTTPDataSource.py +80 -0
- PYME/IO/DataSources/ImageSeriesDataSource.py +123 -0
- PYME/IO/DataSources/MultiviewDataSource.py +99 -0
- PYME/IO/DataSources/OBFDataSource.py +67 -0
- PYME/IO/DataSources/RandomDataSource.py +23 -0
- PYME/IO/DataSources/SupertileDatasource.py +148 -0
- PYME/IO/DataSources/TQDataSource.py +41 -0
- PYME/IO/DataSources/TiffDataSource.py +193 -0
- PYME/IO/DataSources/TileDataSource.py +91 -0
- PYME/IO/DataSources/UnsplitDataSource.py +92 -0
- PYME/IO/DataSources/__init__.py +59 -0
- PYME/IO/FileUtils/IJLut.py +43 -0
- PYME/IO/FileUtils/RawToHdf5.py +105 -0
- PYME/IO/FileUtils/SPAD.py +54 -0
- PYME/IO/FileUtils/TiffSeqToHdf5.py +87 -0
- PYME/IO/FileUtils/__init__.py +24 -0
- PYME/IO/FileUtils/compHdf.py +39 -0
- PYME/IO/FileUtils/fileID.py +246 -0
- PYME/IO/FileUtils/fnlGen.py +40 -0
- PYME/IO/FileUtils/freeSpace.py +59 -0
- PYME/IO/FileUtils/h5-thumbnailer.py +85 -0
- PYME/IO/FileUtils/h5ExFrames.py +98 -0
- PYME/IO/FileUtils/h5ToTiffSeries.py +50 -0
- PYME/IO/FileUtils/h5r-thumbnailer.py +118 -0
- PYME/IO/FileUtils/h5rFormatDef.py +99 -0
- PYME/IO/FileUtils/h5rToTxt.py +77 -0
- PYME/IO/FileUtils/nameUtils.py +300 -0
- PYME/IO/FileUtils/obf_support.py +538 -0
- PYME/IO/FileUtils/ply.py +147 -0
- PYME/IO/FileUtils/readSpeckle.py +78 -0
- PYME/IO/FileUtils/readTiff.py +64 -0
- PYME/IO/FileUtils/saveTiffStack.py +137 -0
- PYME/IO/FileUtils/setup.py +36 -0
- PYME/IO/FileUtils/sf-thumbnailer.py +76 -0
- PYME/IO/FileUtils/stl.py +44 -0
- PYME/IO/FileUtils/thumbnailDatabase.py +104 -0
- PYME/IO/HTTPSpooler_v2.py +141 -0
- PYME/IO/MetaDataHandler.py +1072 -0
- PYME/IO/PZFFormat.py +375 -0
- PYME/IO/Spooler.py +279 -0
- PYME/IO/__init__.py +12 -0
- PYME/IO/acquisition_backends.py +353 -0
- PYME/IO/buffer_helpers.cp39-win_amd64.dll.a +0 -0
- PYME/IO/buffer_helpers.cp39-win_amd64.pyd +0 -0
- PYME/IO/buffer_helpers.pyx +190 -0
- PYME/IO/buffers.py +291 -0
- PYME/IO/clusterDuplication.py +204 -0
- PYME/IO/clusterExport.py +152 -0
- PYME/IO/clusterGlob.py +108 -0
- PYME/IO/clusterIO.py +1076 -0
- PYME/IO/clusterListing.py +232 -0
- PYME/IO/clusterResults.py +206 -0
- PYME/IO/clusterUpload.py +49 -0
- PYME/IO/cluster_directory.py +419 -0
- PYME/IO/cluster_streaming.py +216 -0
- PYME/IO/compatibility.py +12 -0
- PYME/IO/countdir/__init__.py +5 -0
- PYME/IO/countdir/setup.py +58 -0
- PYME/IO/csv_flavours.py +251 -0
- PYME/IO/dataExporter.py +470 -0
- PYME/IO/dataWrap.py +108 -0
- PYME/IO/dcimg.py +167 -0
- PYME/IO/events.py +161 -0
- PYME/IO/h5File.py +148 -0
- PYME/IO/h5rFile.py +323 -0
- PYME/IO/image.py +1447 -0
- PYME/IO/load_psf.py +26 -0
- PYME/IO/pyme_h5ls.py +58 -0
- PYME/IO/ragged.py +138 -0
- PYME/IO/rgb_image.py +94 -0
- PYME/IO/tabular.py +1338 -0
- PYME/IO/testClusterSpooling.py +199 -0
- PYME/IO/unifiedIO.py +301 -0
- PYME/LMVis/Extras/QPobjectSegment.py +220 -0
- PYME/LMVis/Extras/__init__.py +55 -0
- PYME/LMVis/Extras/animation.py +359 -0
- PYME/LMVis/Extras/annotation.py +78 -0
- PYME/LMVis/Extras/clusterAnalysis.py +460 -0
- PYME/LMVis/Extras/dockedPanel.py +69 -0
- PYME/LMVis/Extras/extra_layers.py +373 -0
- PYME/LMVis/Extras/fiducial.py +230 -0
- PYME/LMVis/Extras/flagZMotionArtifacts.py +60 -0
- PYME/LMVis/Extras/fusionUtils.py +9 -0
- PYME/LMVis/Extras/multiColourAnalysis.py +103 -0
- PYME/LMVis/Extras/multiviewMapping.py +489 -0
- PYME/LMVis/Extras/objectMeasurements.py +246 -0
- PYME/LMVis/Extras/particleTracking.py +272 -0
- PYME/LMVis/Extras/perFrameVariable.py +77 -0
- PYME/LMVis/Extras/photophysics.py +72 -0
- PYME/LMVis/Extras/pointSetGeneration.py +232 -0
- PYME/LMVis/Extras/pointwiseColoc.py +54 -0
- PYME/LMVis/Extras/saved_views.py +125 -0
- PYME/LMVis/Extras/scaleBox.py +115 -0
- PYME/LMVis/Extras/sequentialSpecies.py +125 -0
- PYME/LMVis/Extras/setBGImage.py +74 -0
- PYME/LMVis/Extras/shiftmapGenerator.py +138 -0
- PYME/LMVis/Extras/showShortcuts.py +69 -0
- PYME/LMVis/Extras/snapshot.py +135 -0
- PYME/LMVis/Extras/spherical_harmonics.py +98 -0
- PYME/LMVis/Extras/subsets.py +15 -0
- PYME/LMVis/Extras/surface_fitting.py +52 -0
- PYME/LMVis/Extras/temperaturePlot.py +53 -0
- PYME/LMVis/Extras/vibration.py +112 -0
- PYME/LMVis/VisGUI.py +506 -0
- PYME/LMVis/__init__.py +39 -0
- PYME/LMVis/colourFilterGUI.py +77 -0
- PYME/LMVis/colourPanel.py +491 -0
- PYME/LMVis/displayPane.py +462 -0
- PYME/LMVis/dyeRatios.py +116 -0
- PYME/LMVis/genImageDialog.py +298 -0
- PYME/LMVis/gl_offScreenHandler.py +134 -0
- PYME/LMVis/gl_render.py +1302 -0
- PYME/LMVis/gl_render3D.py +1453 -0
- PYME/LMVis/gl_render3D_shaders.py +1213 -0
- PYME/LMVis/glcanvas_core.py +1157 -0
- PYME/LMVis/imageView.py +752 -0
- PYME/LMVis/imageView2.py +372 -0
- PYME/LMVis/importTextDialog.py +342 -0
- PYME/LMVis/layer_panel.py +231 -0
- PYME/LMVis/layers/AxesOverlayLayer.py +126 -0
- PYME/LMVis/layers/LUTOverlayLayer.py +346 -0
- PYME/LMVis/layers/OverlayLayer.py +46 -0
- PYME/LMVis/layers/ScaleBarOverlayLayer.py +97 -0
- PYME/LMVis/layers/ScaleBoxOverlayLayer.py +181 -0
- PYME/LMVis/layers/SelectionOverlayLayer.py +124 -0
- PYME/LMVis/layers/__init__.py +53 -0
- PYME/LMVis/layers/base.py +319 -0
- PYME/LMVis/layers/image_layer.py +363 -0
- PYME/LMVis/layers/labels.py +186 -0
- PYME/LMVis/layers/layer_defaults.py +97 -0
- PYME/LMVis/layers/mesh.py +378 -0
- PYME/LMVis/layers/octree.py +194 -0
- PYME/LMVis/layers/pointcloud.py +372 -0
- PYME/LMVis/layers/quiver.py +271 -0
- PYME/LMVis/layers/text.py +250 -0
- PYME/LMVis/layers/tracks.py +309 -0
- PYME/LMVis/mv_math.py +78 -0
- PYME/LMVis/objectDarkMeasure.py +120 -0
- PYME/LMVis/pipeline.py +1227 -0
- PYME/LMVis/pipelineView.py +115 -0
- PYME/LMVis/pointSettingsPanel.py +135 -0
- PYME/LMVis/progGraph.py +59 -0
- PYME/LMVis/quadTreeSettings.py +90 -0
- PYME/LMVis/rendGauss.py +158 -0
- PYME/LMVis/renderers.py +576 -0
- PYME/LMVis/sessionpaths.py +136 -0
- PYME/LMVis/setup.py +39 -0
- PYME/LMVis/setup_exe.py +71 -0
- PYME/LMVis/shader_programs/DefaultShaderProgram.py +149 -0
- PYME/LMVis/shader_programs/GLProgram.py +119 -0
- PYME/LMVis/shader_programs/GouraudShaderProgram.py +157 -0
- PYME/LMVis/shader_programs/PointSpriteShaderProgram.py +163 -0
- PYME/LMVis/shader_programs/ShaderProgramFactory.py +54 -0
- PYME/LMVis/shader_programs/TesselShaderProgram.py +47 -0
- PYME/LMVis/shader_programs/WireFrameShaderProgram.py +50 -0
- PYME/LMVis/shader_programs/__init__.py +20 -0
- PYME/LMVis/shader_programs/oit_compositor.py +23 -0
- PYME/LMVis/shader_programs/shader_loader.py +84 -0
- PYME/LMVis/shader_programs/shader_program.py +168 -0
- PYME/LMVis/shader_programs/shaders/bigflatpoints_fs.glsl +16 -0
- PYME/LMVis/shader_programs/shaders/bigpoints_gs.glsl +40 -0
- PYME/LMVis/shader_programs/shaders/bigpointsprites_fs.glsl +20 -0
- PYME/LMVis/shader_programs/shaders/bigspheres_fs.glsl +53 -0
- PYME/LMVis/shader_programs/shaders/compose_fs.glsl +41 -0
- PYME/LMVis/shader_programs/shaders/compose_vs.glsl +25 -0
- PYME/LMVis/shader_programs/shaders/default_fs.glsl +27 -0
- PYME/LMVis/shader_programs/shaders/default_vs.glsl +88 -0
- PYME/LMVis/shader_programs/shaders/flatpoints_fs.glsl +27 -0
- PYME/LMVis/shader_programs/shaders/gouraud_flatpoints_fs.glsl +30 -0
- PYME/LMVis/shader_programs/shaders/gouraud_fs.glsl +26 -0
- PYME/LMVis/shader_programs/shaders/gouraud_oit_fs.glsl +68 -0
- PYME/LMVis/shader_programs/shaders/gouraud_vs.glsl +135 -0
- PYME/LMVis/shader_programs/shaders/image_fs.glsl +60 -0
- PYME/LMVis/shader_programs/shaders/image_vs.glsl +79 -0
- PYME/LMVis/shader_programs/shaders/phong_fs.glsl +43 -0
- PYME/LMVis/shader_programs/shaders/phong_vs.glsl +45 -0
- PYME/LMVis/shader_programs/shaders/pointsprites_fs.glsl +33 -0
- PYME/LMVis/shader_programs/shaders/pointsprites_vs.glsl +77 -0
- PYME/LMVis/shader_programs/shaders/spheres_fs.glsl +102 -0
- PYME/LMVis/shader_programs/shaders/tessel_fs.glsl +23 -0
- PYME/LMVis/shader_programs/shaders/tessel_vs.glsl +37 -0
- PYME/LMVis/shader_programs/shaders/text_fs.glsl +42 -0
- PYME/LMVis/shader_programs/shaders/text_vs.glsl +84 -0
- PYME/LMVis/shader_programs/shaders/widelines_fs.glsl +19 -0
- PYME/LMVis/shader_programs/shaders/widelines_gs.glsl +56 -0
- PYME/LMVis/shader_programs/shaders/widelines_vs.glsl +51 -0
- PYME/LMVis/statusLog.py +57 -0
- PYME/LMVis/triBlobs.py +142 -0
- PYME/LMVis/view_clipping_pane.py +429 -0
- PYME/LMVis/views.py +275 -0
- PYME/LMVis/visCore.py +1005 -0
- PYME/LMVis/visHelpers.py +880 -0
- PYME/LMVis/visHelpersMin.py +230 -0
- PYME/LMVis/workspaceTree.py +238 -0
- PYME/__init__.py +22 -0
- PYME/cluster/HTTPDataServer.py +1063 -0
- PYME/cluster/HTTPRulePusher.py +382 -0
- PYME/cluster/HTTPTaskPusher.py +377 -0
- PYME/cluster/PYMERuleNodeServer.py +192 -0
- PYME/cluster/PYMERuleServer.py +109 -0
- PYME/cluster/__init__.py +0 -0
- PYME/cluster/clusterUI/accounts/__init__.py +0 -0
- PYME/cluster/clusterUI/accounts/admin.py +85 -0
- PYME/cluster/clusterUI/accounts/forms.py +8 -0
- PYME/cluster/clusterUI/accounts/migrations/0001_initial.py +31 -0
- PYME/cluster/clusterUI/accounts/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/accounts/models.py +44 -0
- PYME/cluster/clusterUI/accounts/templates/accounts/user_form.html +13 -0
- PYME/cluster/clusterUI/accounts/templates/registration/initial_complete.html +6 -0
- PYME/cluster/clusterUI/accounts/templates/registration/initial_confirm.html +13 -0
- PYME/cluster/clusterUI/accounts/templates/registration/initial_done.html +7 -0
- PYME/cluster/clusterUI/accounts/templates/registration/verification.html +2 -0
- PYME/cluster/clusterUI/accounts/templates/registration/verification_subject.txt +1 -0
- PYME/cluster/clusterUI/accounts/urls.py +19 -0
- PYME/cluster/clusterUI/accounts/views.py +36 -0
- PYME/cluster/clusterUI/clusterUI/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterUI/settings.py +147 -0
- PYME/cluster/clusterUI/clusterUI/urls.py +31 -0
- PYME/cluster/clusterUI/clusterUI/wsgi.py +16 -0
- PYME/cluster/clusterUI/clusterbrowser/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterbrowser/admin.py +3 -0
- PYME/cluster/clusterUI/clusterbrowser/apps.py +7 -0
- PYME/cluster/clusterUI/clusterbrowser/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterbrowser/models.py +5 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/base.html +129 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/dirlisting.html +231 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/form_new_folder.html +18 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/form_upload_file.html +17 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/lightlisting.html +25 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/registration/login.html +38 -0
- PYME/cluster/clusterUI/clusterbrowser/urls.py +10 -0
- PYME/cluster/clusterUI/clusterbrowser/views.py +148 -0
- PYME/cluster/clusterUI/clusterstatus/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterstatus/admin.py +3 -0
- PYME/cluster/clusterUI/clusterstatus/apps.py +7 -0
- PYME/cluster/clusterUI/clusterstatus/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterstatus/models.py +5 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/load_content.html +29 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/queue_info.html +28 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/queue_info_content.html +50 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/status_dash.html +29 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/status_dash_content.html +90 -0
- PYME/cluster/clusterUI/clusterstatus/urls.py +9 -0
- PYME/cluster/clusterUI/clusterstatus/views.py +69 -0
- PYME/cluster/clusterUI/clusterui_tornado.py +117 -0
- PYME/cluster/clusterUI/deploy.py +62 -0
- PYME/cluster/clusterUI/localization/__init__.py +0 -0
- PYME/cluster/clusterUI/localization/admin.py +3 -0
- PYME/cluster/clusterUI/localization/apps.py +7 -0
- PYME/cluster/clusterUI/localization/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/localization/models.py +5 -0
- PYME/cluster/clusterUI/localization/templates/localization/settings_form.html +67 -0
- PYME/cluster/clusterUI/localization/urls.py +10 -0
- PYME/cluster/clusterUI/localization/views.py +170 -0
- PYME/cluster/clusterUI/manage.py +17 -0
- PYME/cluster/clusterUI/recipes/__init__.py +0 -0
- PYME/cluster/clusterUI/recipes/admin.py +3 -0
- PYME/cluster/clusterUI/recipes/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/recipes/models.py +3 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/extra_inputs.html +35 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/form_recipe.html +82 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/input_list.html +7 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editor.html +28 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editor_common.html +46 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editrun.html +93 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_standalone.html +100 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_template.html +109 -0
- PYME/cluster/clusterUI/recipes/urls.py +17 -0
- PYME/cluster/clusterUI/recipes/views.py +109 -0
- PYME/cluster/cluster_of_one.py +200 -0
- PYME/cluster/dataserver_wsgi.py +615 -0
- PYME/cluster/distribution.py +71 -0
- PYME/cluster/rulenodeserver.py +487 -0
- PYME/cluster/rules.py +979 -0
- PYME/cluster/ruleserver.py +1106 -0
- PYME/cluster/status.py +101 -0
- PYME/cluster/taskWorkerHTTP.py +522 -0
- PYME/cluster/webdav.py +1102 -0
- PYME/config.py +659 -0
- PYME/contrib/TextCtrlAutoComplete.py +582 -0
- PYME/contrib/__init__.py +7 -0
- PYME/contrib/aniso/__init__.py +2 -0
- PYME/contrib/aniso/aniso.py +268 -0
- PYME/contrib/auiFloatBook.py +94 -0
- PYME/contrib/congrid.py +127 -0
- PYME/contrib/dispatch/__init__.py +19 -0
- PYME/contrib/dispatch/dispatcher.py +289 -0
- PYME/contrib/gohlke/__init__.py +1 -0
- PYME/contrib/gohlke/_tifffile.cp39-win_amd64.dll.a +0 -0
- PYME/contrib/gohlke/_tifffile.cp39-win_amd64.pyd +0 -0
- PYME/contrib/gohlke/czifile.py +1289 -0
- PYME/contrib/gohlke/fcsfiles.py +514 -0
- PYME/contrib/gohlke/setup.py +54 -0
- PYME/contrib/gohlke/tifffile.py +3095 -0
- PYME/contrib/listctrlMixins.py +896 -0
- PYME/contrib/lzw.py +838 -0
- PYME/contrib/pad/__init__.py +13 -0
- PYME/contrib/pad/info_pad.py +18 -0
- PYME/contrib/pad/pad.py +670 -0
- PYME/contrib/setup.py +38 -0
- PYME/contrib/wxPlotPanel.py +137 -0
- PYME/experimental/SimReconstruction.py +49 -0
- PYME/experimental/__init__.pxd +0 -0
- PYME/experimental/__init__.py +4 -0
- PYME/experimental/_octree.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/_octree.cp39-win_amd64.pyd +0 -0
- PYME/experimental/_octree.pyx +477 -0
- PYME/experimental/_treap.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/_treap.cp39-win_amd64.pyd +0 -0
- PYME/experimental/_treap.pyx +267 -0
- PYME/experimental/_triangle_mesh.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/_triangle_mesh.cp39-win_amd64.pyd +0 -0
- PYME/experimental/_triangle_mesh.pxd +149 -0
- PYME/experimental/_triangle_mesh.pyx +2787 -0
- PYME/experimental/aqavg.py +40 -0
- PYME/experimental/dcimgFileChucker.py +375 -0
- PYME/experimental/dcimgSpoolShim.py +174 -0
- PYME/experimental/dcimg_chuck_test.py +78 -0
- PYME/experimental/dual_marching_cubes.py +801 -0
- PYME/experimental/dual_marching_cubes_v2.py +645 -0
- PYME/experimental/expectationMaximisation.py +298 -0
- PYME/experimental/func_octree.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/func_octree.cp39-win_amd64.pyd +0 -0
- PYME/experimental/func_octree.pyx +381 -0
- PYME/experimental/fusionRadial.py +520 -0
- PYME/experimental/fusionUtils.py +522 -0
- PYME/experimental/isosurface.py +147 -0
- PYME/experimental/labview_spooling_hacks.py +48 -0
- PYME/experimental/marching_cubes.py +811 -0
- PYME/experimental/marching_tetrahedra.py +343 -0
- PYME/experimental/modified_marching_cubes.py +1245 -0
- PYME/experimental/music.py +25 -0
- PYME/experimental/octree.py +188 -0
- PYME/experimental/pSpaceMap.py +34 -0
- PYME/experimental/pointFitConfoc.py +112 -0
- PYME/experimental/scanner_control.py +107 -0
- PYME/experimental/setup.py +109 -0
- PYME/experimental/spark.py +31 -0
- PYME/experimental/tcHist.py +71 -0
- PYME/experimental/treap.py +262 -0
- PYME/experimental/triangle_mesh.py +2287 -0
- PYME/experimental/triangle_mesh_utils.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/triangle_mesh_utils.cp39-win_amd64.pyd +0 -0
- PYME/experimental/triangle_utils.py +87 -0
- PYME/experimental/triangular_mesh.py +2255 -0
- PYME/experimental/zMotionArtifactUtils.py +55 -0
- PYME/localization/FitFactories/AstigGaussFitFR.py +175 -0
- PYME/localization/FitFactories/AstigGaussGPUFitFR.py +326 -0
- PYME/localization/FitFactories/BeadConvolvedAstigGaussFit.py +206 -0
- PYME/localization/FitFactories/ChecksumFR.py +82 -0
- PYME/localization/FitFactories/ChecksumGPUFR.py +213 -0
- PYME/localization/FitFactories/ChecksumMultifitSR.py +86 -0
- PYME/localization/FitFactories/ConfocCOIR.py +93 -0
- PYME/localization/FitFactories/Dumbell3DFitR.py +193 -0
- PYME/localization/FitFactories/DumbellFitR.py +163 -0
- PYME/localization/FitFactories/FFBase.py +403 -0
- PYME/localization/FitFactories/Gauss3DFitR.py +213 -0
- PYME/localization/FitFactories/GaussFitConstrR.py +177 -0
- PYME/localization/FitFactories/GaussMultifitLinesR.py +351 -0
- PYME/localization/FitFactories/GaussMultifitR.py +326 -0
- PYME/localization/FitFactories/GaussMultifitSR.py +373 -0
- PYME/localization/FitFactories/InterpFitR.py +236 -0
- PYME/localization/FitFactories/InterpFitWFR.py +111 -0
- PYME/localization/FitFactories/Interpolators/CSInterpolator.py +148 -0
- PYME/localization/FitFactories/Interpolators/CubeSInterpolatorP.py +121 -0
- PYME/localization/FitFactories/Interpolators/CubicSplineInterpolator.py +69 -0
- PYME/localization/FitFactories/Interpolators/LinearInterpolator.py +135 -0
- PYME/localization/FitFactories/Interpolators/LinearPInterpolatorP.py +95 -0
- PYME/localization/FitFactories/Interpolators/__init__.py +33 -0
- PYME/localization/FitFactories/Interpolators/baseInterpolator.py +202 -0
- PYME/localization/FitFactories/LatFitCOIR.py +82 -0
- PYME/localization/FitFactories/LatGaussFitFR.py +220 -0
- PYME/localization/FitFactories/LatObjFindFR.py +85 -0
- PYME/localization/FitFactories/LatPSFFitR.py +142 -0
- PYME/localization/FitFactories/MultiviewFitInterpNR.py +400 -0
- PYME/localization/FitFactories/PRInterpFitQR.py +192 -0
- PYME/localization/FitFactories/PRInterpFitR.py +223 -0
- PYME/localization/FitFactories/ROIExtractNR.py +93 -0
- PYME/localization/FitFactories/SpecGaussFitFR.py +174 -0
- PYME/localization/FitFactories/SplitterFitCOIR.py +142 -0
- PYME/localization/FitFactories/SplitterFitFNR.py +312 -0
- PYME/localization/FitFactories/SplitterFitFusionR.py +318 -0
- PYME/localization/FitFactories/SplitterFitInterpBNR.py +357 -0
- PYME/localization/FitFactories/SplitterFitInterpNR.py +343 -0
- PYME/localization/FitFactories/SplitterFitScavNR.py +352 -0
- PYME/localization/FitFactories/SplitterMultifitSR.py +410 -0
- PYME/localization/FitFactories/SplitterObjFindR.py +194 -0
- PYME/localization/FitFactories/SplitterROIExtractNR.py +91 -0
- PYME/localization/FitFactories/SplitterShiftEstFR.py +230 -0
- PYME/localization/FitFactories/__init__.py +103 -0
- PYME/localization/FitFactories/fitCommon.py +195 -0
- PYME/localization/FitFactories/zEstimators/__init__.py +29 -0
- PYME/localization/FitFactories/zEstimators/astigEstimator.py +173 -0
- PYME/localization/FitFactories/zEstimators/biplaneEstimator.py +209 -0
- PYME/localization/FitFactories/zEstimators/genericDualEstimator.py +232 -0
- PYME/localization/FitFactories/zEstimators/genericEstimator.py +224 -0
- PYME/localization/FitFactories/zEstimators/priEstimator.py +255 -0
- PYME/localization/MetaDataEdit.py +543 -0
- PYME/localization/Test/30_9_series_A_1.sf +0 -0
- PYME/localization/Test/PRI.md +45 -0
- PYME/localization/Test/PRI_qr.md +52 -0
- PYME/localization/Test/PRI_r.md +52 -0
- PYME/localization/Test/__init__.py +22 -0
- PYME/localization/Test/astig.md +50 -0
- PYME/localization/Test/astigCOI.md +50 -0
- PYME/localization/Test/astig_gauss.md +52 -0
- PYME/localization/Test/astig_pe.md +50 -0
- PYME/localization/Test/astig_splitter.md +66 -0
- PYME/localization/Test/astig_splitterCOI.md +67 -0
- PYME/localization/Test/astig_splitterQ.md +66 -0
- PYME/localization/Test/astig_theory.md +50 -0
- PYME/localization/Test/astig_theory.psf +0 -0
- PYME/localization/Test/astig_theory.tif +0 -0
- PYME/localization/Test/beads1.psf +0 -0
- PYME/localization/Test/beads1.tif +0 -0
- PYME/localization/Test/biplane_splitter.md +75 -0
- PYME/localization/Test/biplane_splitter2.md +103 -0
- PYME/localization/Test/biplane_splitter3.md +115 -0
- PYME/localization/Test/defoc.md +48 -0
- PYME/localization/Test/dumbell_3d.md +52 -0
- PYME/localization/Test/fitTestJig.py +172 -0
- PYME/localization/Test/fitTestJigSCMOS.py +487 -0
- PYME/localization/Test/fitTestJigWC.py +225 -0
- PYME/localization/Test/gauss.md +50 -0
- PYME/localization/Test/gaussCOI.md +50 -0
- PYME/localization/Test/pri_pe.md +50 -0
- PYME/localization/Test/pri_theory.md +51 -0
- PYME/localization/Test/pri_theory.psf +0 -0
- PYME/localization/Test/pri_theory.tif +0 -0
- PYME/localization/Test/psf_astig.psf +0 -0
- PYME/localization/Test/psf_astig.tif +0 -0
- PYME/localization/Test/psf_astig_bg_d.psf +0 -0
- PYME/localization/Test/psf_astig_bg_d.tif +0 -0
- PYME/localization/Test/psf_astig_pe.psf +0 -0
- PYME/localization/Test/psf_astig_pe.tif +0 -0
- PYME/localization/Test/psf_decon.psf +0 -0
- PYME/localization/Test/psf_decon.tif +0 -0
- PYME/localization/Test/psf_decon_pe.psf +0 -0
- PYME/localization/Test/psf_decon_pe.tif +0 -0
- PYME/localization/Test/psf_guess.psf +0 -0
- PYME/localization/Test/splitter.md +63 -0
- PYME/localization/Test/splitter_scav.md +63 -0
- PYME/localization/Test/test.psf +0 -0
- PYME/localization/Test/test.tif +0 -0
- PYME/localization/Test/test_decon.psf +0 -0
- PYME/localization/Test/test_decon.tif +0 -0
- PYME/localization/Test/test_pe.psf +0 -0
- PYME/localization/Test/test_pe.tif +0 -0
- PYME/localization/Test/wf_theory.psf +0 -0
- PYME/localization/Test/wf_theory2.psf +0 -0
- PYME/localization/__init__.py +17 -0
- PYME/localization/autopsf/__init__.py +1 -0
- PYME/localization/autopsf/autopsf.py +486 -0
- PYME/localization/autopsf/roifit.py +310 -0
- PYME/localization/cInterp/__init__.py +24 -0
- PYME/localization/cInterp/cInterp.cp39-win_amd64.dll.a +0 -0
- PYME/localization/cInterp/cInterp.cp39-win_amd64.pyd +0 -0
- PYME/localization/cInterp/setup.py +54 -0
- PYME/localization/cModels/__init__.py +24 -0
- PYME/localization/cModels/gauss_app.cp39-win_amd64.dll.a +0 -0
- PYME/localization/cModels/gauss_app.cp39-win_amd64.pyd +0 -0
- PYME/localization/ofind.py +444 -0
- PYME/localization/ofind3d.py +306 -0
- PYME/localization/ofind_nofilt.py +128 -0
- PYME/localization/ofind_pri.py +478 -0
- PYME/localization/ofind_split.py +399 -0
- PYME/localization/ofind_xcorr.py +351 -0
- PYME/localization/ofind_xcorr_fw.py +441 -0
- PYME/localization/remFitBuf.py +657 -0
- PYME/localization/setup.py +56 -0
- PYME/localization/splitting.py +240 -0
- PYME/localization/twist.py +60 -0
- PYME/misc/TiSettings.py +36 -0
- PYME/misc/TiffImagePlugin.py +838 -0
- PYME/misc/VolProj.py +144 -0
- PYME/misc/__init__.py +25 -0
- PYME/misc/aligned_array.py +10 -0
- PYME/misc/aniso.py +29 -0
- PYME/misc/big_sur_fix.py +20 -0
- PYME/misc/check_for_updates.py +139 -0
- PYME/misc/colormaps.py +199 -0
- PYME/misc/colorsys.py +201 -0
- PYME/misc/computerName.py +33 -0
- PYME/misc/coverslipGeometries.py +60 -0
- PYME/misc/cython_numpy_monkey.py +40 -0
- PYME/misc/depGraph.py +406 -0
- PYME/misc/dirSize.py +31 -0
- PYME/misc/diskCleanup.py +64 -0
- PYME/misc/djangoRecarray.py +57 -0
- PYME/misc/django_widgets.py +27 -0
- PYME/misc/editgrid.py +101 -0
- PYME/misc/eventSpy.py +122 -0
- PYME/misc/exceptions.py +30 -0
- PYME/misc/facsPlot.py +89 -0
- PYME/misc/fbpIcons.py +90 -0
- PYME/misc/fftw_compat.py +28 -0
- PYME/misc/findCycles.py +91 -0
- PYME/misc/fortran_interrupt_defeat.py +43 -0
- PYME/misc/glassModel.py +64 -0
- PYME/misc/hash32.py +41 -0
- PYME/misc/hillcurve.py +88 -0
- PYME/misc/hybrid_ns.py +84 -0
- PYME/misc/kdFit.py +72 -0
- PYME/misc/locate.py +10 -0
- PYME/misc/memUsage.py +65 -0
- PYME/misc/memmap.py +52 -0
- PYME/misc/mock_ctypes.py +28 -0
- PYME/misc/mock_traits.py +59 -0
- PYME/misc/mock_traitsui.py +29 -0
- PYME/misc/pyme_zeroconf.py +287 -0
- PYME/misc/pyro_tracebacks.py +32 -0
- PYME/misc/read_agf.py +605 -0
- PYME/misc/sffake.py +16 -0
- PYME/misc/snells.py +71 -0
- PYME/misc/sqlite_ns.py +132 -0
- PYME/misc/sqlitendarray.py +56 -0
- PYME/misc/taskDef.py +44 -0
- PYME/misc/tempDB.py +56 -0
- PYME/misc/wxThread.py +33 -0
- PYME/misc/zemax.py +259 -0
- PYME/misc/zernike.py +151 -0
- PYME/pyme_warnings.py +70 -0
- PYME/recipes/Recipes/STEDDeconvolution.yaml +14 -0
- PYME/recipes/Recipes/STEDMinistacks.yaml +15 -0
- PYME/recipes/Recipes/STED_COP3.yaml +25 -0
- PYME/recipes/Recipes/blobMeas.yaml +19 -0
- PYME/recipes/Recipes/blobMeas2.yaml +37 -0
- PYME/recipes/Recipes/blobMeasSR.yaml +66 -0
- PYME/recipes/Recipes/coloc.yaml +43 -0
- PYME/recipes/Recipes/coloc_roi_masked.yaml +46 -0
- PYME/recipes/Recipes/multiblob.yaml +38 -0
- PYME/recipes/Recipes/pre_particleTracking.yaml +30 -0
- PYME/recipes/Recipes/segmentAndMeasureLoci.yaml +41 -0
- PYME/recipes/__init__.py +6 -0
- PYME/recipes/acquisition.py +158 -0
- PYME/recipes/bakeshop.py +32 -0
- PYME/recipes/base.py +1393 -0
- PYME/recipes/batchProcess.py +147 -0
- PYME/recipes/filters.py +394 -0
- PYME/recipes/fudges.py +41 -0
- PYME/recipes/graphing.py +108 -0
- PYME/recipes/html_recipe_editor.py +90 -0
- PYME/recipes/localisations.py +1386 -0
- PYME/recipes/machine_learning.py +286 -0
- PYME/recipes/measurement.py +1062 -0
- PYME/recipes/modules.py +50 -0
- PYME/recipes/multiview.py +435 -0
- PYME/recipes/output.py +667 -0
- PYME/recipes/pointcloud.py +510 -0
- PYME/recipes/processing.py +2954 -0
- PYME/recipes/pyramid.py +206 -0
- PYME/recipes/recipe.py +965 -0
- PYME/recipes/recipeGui.py +1029 -0
- PYME/recipes/recipeLayout.py +499 -0
- PYME/recipes/runRecipe.py +140 -0
- PYME/recipes/setup.py +37 -0
- PYME/recipes/simulation.py +91 -0
- PYME/recipes/skfilters.py +143 -0
- PYME/recipes/surface_fitting.py +776 -0
- PYME/recipes/tablefilters.py +275 -0
- PYME/recipes/tracking.py +343 -0
- PYME/recipes/traits.py +157 -0
- PYME/recipes/vertical_recipe_display.py +373 -0
- PYME/resources/__init__.py +23 -0
- PYME/resources/config_template/distributor.yaml +14 -0
- PYME/resources/config_template/nodeserver.yaml +15 -0
- PYME/resources/icons/LUT.png +0 -0
- PYME/resources/icons/YSM_Shield.png +0 -0
- PYME/resources/icons/YSM_logo.png +0 -0
- PYME/resources/icons/arrow.png +0 -0
- PYME/resources/icons/crosshairs.png +0 -0
- PYME/resources/icons/line_select.png +0 -0
- PYME/resources/icons/logo_fmhs.png +0 -0
- PYME/resources/icons/media-playback-pause.png +0 -0
- PYME/resources/icons/media-playback-start.png +0 -0
- PYME/resources/icons/media-skip-backward.png +0 -0
- PYME/resources/icons/media-skip-forward.png +0 -0
- PYME/resources/icons/mesh.png +0 -0
- PYME/resources/icons/mesh.svg +28 -0
- PYME/resources/icons/pmacquire.icns +0 -0
- PYME/resources/icons/pmacquire.ico +0 -0
- PYME/resources/icons/pmanal.icns +0 -0
- PYME/resources/icons/pmanal.ico +0 -0
- PYME/resources/icons/pmvis.icns +0 -0
- PYME/resources/icons/pmvis.ico +0 -0
- PYME/resources/icons/points.png +0 -0
- PYME/resources/icons/points.svg +16 -0
- PYME/resources/icons/pymeLogo.png +0 -0
- PYME/resources/icons/rect_select.png +0 -0
- PYME/resources/icons/squiggle_select.png +0 -0
- PYME/resources/icons/text3800.icns +0 -0
- PYME/resources/icons/text3800.ico +0 -0
- PYME/resources/icons/text3800.png +0 -0
- PYME/resources/icons/text3800.tif +0 -0
- PYME/resources/icons/text5377.icns +0 -0
- PYME/resources/icons/text5377.ico +0 -0
- PYME/resources/icons/text5377.png +0 -0
- PYME/resources/icons/tracks.png +0 -0
- PYME/resources/icons/tracks.svg +19 -0
- PYME/resources/icons/view-front.png +0 -0
- PYME/resources/icons/view-home.png +0 -0
- PYME/resources/icons/view-right.png +0 -0
- PYME/resources/icons/view-top.png +0 -0
- PYME/resources/test_datasets/README.md +8 -0
- PYME/resources/test_datasets/t_im.tif +0 -0
- PYME/resources/test_datasets/test_csv.csv +4282 -0
- PYME/resources/test_datasets/test_hdf.hdf +0 -0
- PYME/resources/web/rule_inline.html +21 -0
- PYME/resources/web/ruleserver.html +75 -0
- PYME/resources/web/static/bootstrap.min.js +7 -0
- PYME/resources/web/static/cluster.css +137 -0
- PYME/resources/web/static/css/bootstrap-theme.css +587 -0
- PYME/resources/web/static/css/bootstrap-theme.min.css +6 -0
- PYME/resources/web/static/css/bootstrap.css +6757 -0
- PYME/resources/web/static/css/bootstrap.min.css +6 -0
- PYME/resources/web/static/css/flat_design_colors_full.css +306 -0
- PYME/resources/web/static/css/recipe_editor.css +106 -0
- PYME/resources/web/static/dashboard.css +106 -0
- PYME/resources/web/static/fileselector.js +77 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.eot +0 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.svg +288 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.ttf +0 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.woff +0 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.woff2 +0 -0
- PYME/resources/web/static/images/osd_flat/LICENSE.txt +116 -0
- PYME/resources/web/static/images/osd_flat/README.md +9 -0
- PYME/resources/web/static/images/osd_flat/fullpage_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/fullpage_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/fullpage_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/fullpage_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_rest.png +0 -0
- PYME/resources/web/static/jigna-vue-bare.js +1395 -0
- PYME/resources/web/static/jquery.min.js +2 -0
- PYME/resources/web/static/jstree.min.js +6 -0
- PYME/resources/web/static/openSeadragonGL.js +102 -0
- PYME/resources/web/static/openseadragon-svg-overlay.js +103 -0
- PYME/resources/web/static/openseadragon-viewerinputhook.min.js +6 -0
- PYME/resources/web/static/openseadragon.min.js +9 -0
- PYME/resources/web/static/recipe_editor.js +119 -0
- PYME/resources/web/static/shaders/fragment/lut.glsl +20 -0
- PYME/resources/web/static/shaders/fragment/none.glsl +17 -0
- PYME/resources/web/static/shaders/fragment/outline.glsl +43 -0
- PYME/resources/web/static/shaders/fragment/rect.glsl +7 -0
- PYME/resources/web/static/shaders/fragment/sobel3.glsl +71 -0
- PYME/resources/web/static/shaders/fragment/white.glsl +4 -0
- PYME/resources/web/static/shaders/vertex/rect.glsl +22 -0
- PYME/resources/web/static/shaders/vertex/square.glsl +9 -0
- PYME/resources/web/static/utils.js +3 -0
- PYME/resources/web/static/viaWebGL.js +217 -0
- PYME/setup.py +109 -0
- PYME/setup_exe.py +57 -0
- PYME/simulation/__init__.py +0 -0
- PYME/simulation/locify.py +319 -0
- PYME/simulation/pointsets.py +279 -0
- PYME/simulation/wormlike.py +99 -0
- PYME/simulation/wormlike2.py +198 -0
- PYME/simulation/wormlike3.py +197 -0
- PYME/simulation/wormlike_curled.py +104 -0
- PYME/tileviewer/__init__.py +0 -0
- PYME/tileviewer/templates/roi_list.html +12 -0
- PYME/tileviewer/templates/tileviewer.html +247 -0
- PYME/tileviewer/tileviewer.py +207 -0
- PYME/ui/AUIFrame.py +279 -0
- PYME/ui/MetadataTree.py +469 -0
- PYME/ui/__init__.py +4 -0
- PYME/ui/about_dlg.py +29 -0
- PYME/ui/autoFoldPanel.py +643 -0
- PYME/ui/cascading_layout.py +45 -0
- PYME/ui/crop_dialog.py +145 -0
- PYME/ui/custom_traits_editors.py +508 -0
- PYME/ui/editFilterDialog.py +80 -0
- PYME/ui/editList.py +40 -0
- PYME/ui/fastGraph.py +240 -0
- PYME/ui/filterPane.py +348 -0
- PYME/ui/histLimits.py +543 -0
- PYME/ui/layerFoldPanel.py +232 -0
- PYME/ui/manualFoldPanel.py +870 -0
- PYME/ui/mytimer.py +116 -0
- PYME/ui/patch_traitsui.py +151 -0
- PYME/ui/progress.py +160 -0
- PYME/ui/recArrayView.py +145 -0
- PYME/ui/selection.py +71 -0
- PYME/ui/shell.py +37 -0
- PYME/ui/traitsui_constants.py +91 -0
- PYME/ui/wx_compat.py +43 -0
- PYME/update_version.py +159 -0
- PYME/util/__init__.py +3 -0
- PYME/util/authenticate.py +164 -0
- PYME/util/execfile.py +21 -0
- PYME/util/fProfile/__init__.py +1 -0
- PYME/util/fProfile/convertProfile.py +117 -0
- PYME/util/fProfile/fProfile.py +162 -0
- PYME/util/fProfile/html/404.html +60 -0
- PYME/util/fProfile/html/css/main.css +258 -0
- PYME/util/fProfile/html/css/normalize.css +427 -0
- PYME/util/fProfile/html/css/normalize.min.css +1 -0
- PYME/util/fProfile/html/index.html +64 -0
- PYME/util/fProfile/html/js/main.js +492 -0
- PYME/util/fProfile/html/js/plugins.js +24 -0
- PYME/util/fProfile/html/js/vendor/crossfilter.min.js +1 -0
- PYME/util/fProfile/html/js/vendor/jquery-1.11.2.min.js +4 -0
- PYME/util/fProfile/html/js/vendor/modernizr-2.8.3.min.js +4 -0
- PYME/util/fProfile/html/js/vendor/tinycolor-min.js +4 -0
- PYME/util/fProfile/viewProfile.py +30 -0
- PYME/util/install_dependencies.py +95 -0
- PYME/util/log_verbosity.py +11 -0
- PYME/util/mProfile/__init__.py +1 -0
- PYME/util/mProfile/colorize_db_t.py +297 -0
- PYME/util/mProfile/mProfile.py +164 -0
- PYME/util/mProfile/p.py +101 -0
- PYME/util/mProfile/tProfile.py +165 -0
- PYME/util/pymelauncher.py +47 -0
- PYME/util/shmarray/__init__.py +0 -0
- PYME/util/shmarray/shmTest.py +74 -0
- PYME/util/shmarray/shmarray.py +165 -0
- PYME/util/webframework.py +365 -0
- PYME/version.py +65 -0
- python_microscopy-25.6.5.dist-info/METADATA +68 -0
- python_microscopy-25.6.5.dist-info/RECORD +1277 -0
- python_microscopy-25.6.5.dist-info/WHEEL +4 -0
PYME/LMVis/pipeline.py
ADDED
|
@@ -0,0 +1,1227 @@
|
|
|
1
|
+
|
|
2
|
+
#!/usr/bin/python
|
|
3
|
+
|
|
4
|
+
###############
|
|
5
|
+
# pipeline.py
|
|
6
|
+
#
|
|
7
|
+
# Copyright David Baddeley, 2012
|
|
8
|
+
# d.baddeley@auckland.ac.nz
|
|
9
|
+
#
|
|
10
|
+
# This program is free software: you can redistribute it and/or modify
|
|
11
|
+
# it under the terms of the GNU General Public License as published by
|
|
12
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
13
|
+
# (at your option) any later version.
|
|
14
|
+
#
|
|
15
|
+
# This program is distributed in the hope that it will be useful,
|
|
16
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
17
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
18
|
+
# GNU General Public License for more details.
|
|
19
|
+
#
|
|
20
|
+
# You should have received a copy of the GNU General Public License
|
|
21
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
22
|
+
#
|
|
23
|
+
################
|
|
24
|
+
from PYME.IO import tabular
|
|
25
|
+
from PYME.IO.image import ImageBounds
|
|
26
|
+
from PYME.LMVis import dyeRatios
|
|
27
|
+
from PYME.LMVis import statusLog
|
|
28
|
+
|
|
29
|
+
try:
|
|
30
|
+
# make sure pipeline works when wx is not avalable
|
|
31
|
+
# TODO - move blob stuff into a recipe module and remove from pipeline.
|
|
32
|
+
from PYME.LMVis.triBlobs import BlobSettings
|
|
33
|
+
except ImportError:
|
|
34
|
+
# create a dummy class
|
|
35
|
+
class BlobSettings:
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
from PYME.Analysis import piecewiseMapping
|
|
39
|
+
from PYME.IO import MetaDataHandler
|
|
40
|
+
|
|
41
|
+
import warnings
|
|
42
|
+
|
|
43
|
+
#from traits.api import HasTraits
|
|
44
|
+
#from traitsui.api import View
|
|
45
|
+
#from PYME.recipes.base import ModuleCollection
|
|
46
|
+
from PYME.recipes import Recipe
|
|
47
|
+
|
|
48
|
+
import numpy as np
|
|
49
|
+
import scipy.special
|
|
50
|
+
import os
|
|
51
|
+
|
|
52
|
+
from PYME.contrib import dispatch
|
|
53
|
+
|
|
54
|
+
from PYME.Analysis.BleachProfile.kinModels import getPhotonNums
|
|
55
|
+
|
|
56
|
+
import logging
|
|
57
|
+
logger = logging.getLogger(__name__)
|
|
58
|
+
|
|
59
|
+
def _processPriSplit(ds):
|
|
60
|
+
"""set mappings ascociated with the use of a splitter"""
|
|
61
|
+
|
|
62
|
+
ds.setMapping('gFrac', 'fitResults_ratio')
|
|
63
|
+
ds.setMapping('error_gFrac', 'fitError_ratio')
|
|
64
|
+
|
|
65
|
+
ds.setMapping('fitResults_Ag', 'gFrac*A')
|
|
66
|
+
ds.setMapping('fitResults_Ar', '(1.0 - gFrac)*A + error_gFrac*A')
|
|
67
|
+
ds.setMapping('fitError_Ag', 'gFrac*fitError_A + error_gFrac*A')
|
|
68
|
+
ds.setMapping('fitError_Ar', '(1.0 - gFrac)*fitError_A')
|
|
69
|
+
#ds.setMapping('fitError_Ag', '1*sqrt(fitResults_Ag/1e-3)')
|
|
70
|
+
#ds.setMapping('fitError_Ar', '1*sqrt(fitResults_Ar/1e-3)')
|
|
71
|
+
|
|
72
|
+
sg = ds['fitError_Ag']
|
|
73
|
+
sr = ds['fitError_Ar']
|
|
74
|
+
g = ds['fitResults_Ag']
|
|
75
|
+
r = ds['fitResults_Ar']
|
|
76
|
+
I = ds['A']
|
|
77
|
+
|
|
78
|
+
colNorm = np.sqrt(2 * np.pi) * sg * sr / (2 * np.sqrt(sg ** 2 + sr ** 2) * I) * (
|
|
79
|
+
scipy.special.erf((sg ** 2 * r + sr ** 2 * (I - g)) / (np.sqrt(2) * sg * sr * np.sqrt(sg ** 2 + sr ** 2)))
|
|
80
|
+
- scipy.special.erf((sg ** 2 * (r - I) - sr ** 2 * g) / (np.sqrt(2) * sg * sr * np.sqrt(sg ** 2 + sr ** 2))))
|
|
81
|
+
|
|
82
|
+
colNorm /= (sg * sr)
|
|
83
|
+
|
|
84
|
+
ds.addColumn('ColourNorm', colNorm)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def _processSplitter(ds):
|
|
88
|
+
"""set mappings ascociated with the use of a splitter"""
|
|
89
|
+
|
|
90
|
+
#ds.gF_zcorr = 0
|
|
91
|
+
ds.setMapping('A', 'fitResults_Ag + fitResults_Ar')
|
|
92
|
+
if 'fitResults_z0' in ds.keys():
|
|
93
|
+
ds.addVariable('gF_zcorr', 0)
|
|
94
|
+
ds.setMapping('gFrac', 'fitResults_Ag/(fitResults_Ag + fitResults_Ar) + gF_zcorr*fitResults_z0')
|
|
95
|
+
else:
|
|
96
|
+
ds.setMapping('gFrac', 'fitResults_Ag/(fitResults_Ag + fitResults_Ar)')
|
|
97
|
+
|
|
98
|
+
if 'fitError_Ag' in ds.keys():
|
|
99
|
+
ds.setMapping('error_gFrac',
|
|
100
|
+
'sqrt((fitError_Ag/fitResults_Ag)**2 + (fitError_Ag**2 + fitError_Ar**2)/(fitResults_Ag + fitResults_Ar)**2)*fitResults_Ag/(fitResults_Ag + fitResults_Ar)')
|
|
101
|
+
else:
|
|
102
|
+
ds.setMapping('error_gFrac', '0*x + 0.01')
|
|
103
|
+
ds.setMapping('fitError_Ag', '1*sqrt(fitResults_Ag/1)')
|
|
104
|
+
ds.setMapping('fitError_Ar', '1*sqrt(fitResults_Ar/1)')
|
|
105
|
+
|
|
106
|
+
sg = ds['fitError_Ag']
|
|
107
|
+
sr = ds['fitError_Ar']
|
|
108
|
+
g = ds['fitResults_Ag']
|
|
109
|
+
r = ds['fitResults_Ar']
|
|
110
|
+
I = ds['A']
|
|
111
|
+
|
|
112
|
+
colNorm = np.sqrt(2 * np.pi) * sg * sr / (2 * np.sqrt(sg ** 2 + sr ** 2) * I) * (
|
|
113
|
+
scipy.special.erf((sg ** 2 * r + sr ** 2 * (I - g)) / (np.sqrt(2) * sg * sr * np.sqrt(sg ** 2 + sr ** 2)))
|
|
114
|
+
- scipy.special.erf((sg ** 2 * (r - I) - sr ** 2 * g) / (np.sqrt(2) * sg * sr * np.sqrt(sg ** 2 + sr ** 2))))
|
|
115
|
+
|
|
116
|
+
ds.addColumn('ColourNorm', colNorm)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def _add_eventvars_to_ds(ds, ev_mappings):
|
|
120
|
+
zm = ev_mappings.get('zm', None)
|
|
121
|
+
if zm:
|
|
122
|
+
z_focus = 1.e3 * zm(ds['t'])
|
|
123
|
+
ds.addColumn('focus', z_focus)
|
|
124
|
+
|
|
125
|
+
piezo_moving = ev_mappings.get('piezo_moving')
|
|
126
|
+
if piezo_moving:
|
|
127
|
+
ds.addColumn('piezoMoving', piezo_moving(ds['t']))
|
|
128
|
+
|
|
129
|
+
xm = ev_mappings.get('xm', None)
|
|
130
|
+
if xm:
|
|
131
|
+
# todo - comment on why the -0.01??
|
|
132
|
+
scan_x = 1.e3 * xm(ds['t'] - .01)
|
|
133
|
+
ds.addColumn('scanx', scan_x)
|
|
134
|
+
|
|
135
|
+
# scanned acquisition re-mapping temporarily disabled because we abuse the scanner for taking shift-fields (where
|
|
136
|
+
# we don't want re-mapping to occur) TODO - either detect shift-fields here, or implement remapping later.
|
|
137
|
+
#ds.setMapping('x', 'x + scanx')
|
|
138
|
+
|
|
139
|
+
ym = ev_mappings.get('ym', None)
|
|
140
|
+
if ym:
|
|
141
|
+
scan_y = 1.e3 * ym(ds['t'] - .01)
|
|
142
|
+
ds.addColumn('scany', scan_y)
|
|
143
|
+
|
|
144
|
+
# temporarily disabled - see scanx
|
|
145
|
+
#ds.setMapping('y', 'y + scany')
|
|
146
|
+
|
|
147
|
+
driftx = ev_mappings.get('driftx', None)
|
|
148
|
+
drifty = ev_mappings.get('drifty', None)
|
|
149
|
+
driftz = ev_mappings.get('driftz', None)
|
|
150
|
+
if driftx:
|
|
151
|
+
ds.addColumn('driftx', driftx(ds['t'] - .01))
|
|
152
|
+
ds.addColumn('drifty', drifty(ds['t'] - .01))
|
|
153
|
+
ds.addColumn('driftz', driftz(ds['t'] - .01))
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def _add_missing_ds_keys(mapped_ds, ev_mappings={}):
|
|
157
|
+
"""
|
|
158
|
+
VisGUI, and various rendering and postprocessing commands rely on having certain parameters defined or re-mapped
|
|
159
|
+
within a data source. Take care of these here.
|
|
160
|
+
|
|
161
|
+
Parameters
|
|
162
|
+
----------
|
|
163
|
+
mapped_ds
|
|
164
|
+
|
|
165
|
+
"""
|
|
166
|
+
_add_eventvars_to_ds(mapped_ds, ev_mappings)
|
|
167
|
+
|
|
168
|
+
#handle special cases which get detected by looking for the presence or
|
|
169
|
+
#absence of certain variables in the data.
|
|
170
|
+
if 'fitResults_Ag' in mapped_ds.keys():
|
|
171
|
+
#if we used the splitter set up a number of mappings e.g. total amplitude and ratio
|
|
172
|
+
_processSplitter(mapped_ds)
|
|
173
|
+
|
|
174
|
+
if 'fitResults_ratio' in mapped_ds.keys():
|
|
175
|
+
#if we used the splitter set up a number of mappings e.g. total amplitude and ratio
|
|
176
|
+
_processPriSplit(mapped_ds)
|
|
177
|
+
|
|
178
|
+
if 'fitResults_sigxl' in mapped_ds.keys():
|
|
179
|
+
#fast, quickpalm like astigmatic fitting
|
|
180
|
+
mapped_ds.setMapping('sig', 'fitResults_sigxl + fitResults_sigyu')
|
|
181
|
+
mapped_ds.setMapping('sig_d', 'fitResults_sigxl - fitResults_sigyu')
|
|
182
|
+
|
|
183
|
+
mapped_ds.addVariable('dsigd_dz', -30.)
|
|
184
|
+
mapped_ds.setMapping('fitResults_z0', 'dsigd_dz*sig_d')
|
|
185
|
+
if not 'y' in mapped_ds.keys():
|
|
186
|
+
mapped_ds.setMapping('y', '10*t')
|
|
187
|
+
|
|
188
|
+
# set up correction for foreshortening and z focus stepping
|
|
189
|
+
if not 'foreShort' in dir(mapped_ds):
|
|
190
|
+
mapped_ds.addVariable('foreShort', 1.)
|
|
191
|
+
|
|
192
|
+
if not 'focus' in mapped_ds.keys():
|
|
193
|
+
# set up a dummy focus variable if not already present
|
|
194
|
+
mapped_ds.setMapping('focus', '0*x')
|
|
195
|
+
|
|
196
|
+
if not 'z' in mapped_ds.keys():
|
|
197
|
+
if 'fitResults_z0' in mapped_ds.keys():
|
|
198
|
+
mapped_ds.setMapping('z', 'fitResults_z0 + foreShort*focus')
|
|
199
|
+
elif 'astigmatic_z' in mapped_ds.keys():
|
|
200
|
+
mapped_ds.setMapping('z', 'astigmatic_z + foreShort*focus')
|
|
201
|
+
elif 'astigZ' in mapped_ds.keys(): # legacy handling
|
|
202
|
+
mapped_ds.setMapping('z', 'astigZ + foreShort*focus')
|
|
203
|
+
else:
|
|
204
|
+
mapped_ds.setMapping('z', 'foreShort*focus')
|
|
205
|
+
|
|
206
|
+
if not 'A' in mapped_ds.keys() and 'fitResults_photons' in mapped_ds.keys():
|
|
207
|
+
mapped_ds.setMapping('A', 'fitResults_photons')
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def _processEvents(ds, events, mdh):
|
|
212
|
+
"""Read data from events table and translate it into mappings for,
|
|
213
|
+
e.g. z position"""
|
|
214
|
+
|
|
215
|
+
#eventCharts = []
|
|
216
|
+
ev_mappings = {}
|
|
217
|
+
|
|
218
|
+
if not events is None:
|
|
219
|
+
evKeyNames = set()
|
|
220
|
+
for e in events:
|
|
221
|
+
evKeyNames.add(e['EventName'])
|
|
222
|
+
|
|
223
|
+
if b'ProtocolFocus' in evKeyNames:
|
|
224
|
+
zm = piecewiseMapping.GeneratePMFromEventList(events, mdh, mdh['StartTime'], mdh['Protocol.PiezoStartPos'], eventName=b'ProtocolFocus')
|
|
225
|
+
ev_mappings['z_command'] = zm
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
if b'PiezoOnTarget' in evKeyNames:
|
|
229
|
+
# Sometimes we also emit PiezoOnTarget events with the actual piezo position, rather than where we
|
|
230
|
+
# told it to go, use these preferentially
|
|
231
|
+
# TODO - deprecate in favour of, e.g. 'FocusOnTarget' events which are offset-corrected - see issue 766
|
|
232
|
+
from PYME.Analysis import piezo_movement_correction
|
|
233
|
+
spoofed_evts = piezo_movement_correction.spoof_focus_events_from_ontarget(events, mdh)
|
|
234
|
+
zm = piecewiseMapping.GeneratePMFromEventList(spoofed_evts, mdh, mdh['StartTime'], mdh['Protocol.PiezoStartPos'], eventName=b'ProtocolFocus')
|
|
235
|
+
ev_mappings['z_ontarget'] = zm
|
|
236
|
+
ev_mappings['piezo_moving'] = piecewiseMapping.bool_map_between_events(events, mdh, b'ProtocolFocus', b'PiezoOnTarget',default=False)
|
|
237
|
+
|
|
238
|
+
# the z position we use for localizations gets the ontarget info if present
|
|
239
|
+
ev_mappings['zm'] = zm
|
|
240
|
+
#eventCharts.append(('Focus [um]', zm, b'ProtocolFocus'))
|
|
241
|
+
|
|
242
|
+
if b'ScannerXPos' in evKeyNames:
|
|
243
|
+
x0 = 0
|
|
244
|
+
if 'Positioning.Stage_X' in mdh.getEntryNames():
|
|
245
|
+
x0 = mdh.getEntry('Positioning.Stage_X')
|
|
246
|
+
xm = piecewiseMapping.GeneratePMFromEventList(events, mdh, mdh['StartTime'], x0, b'ScannerXPos', 0)
|
|
247
|
+
ev_mappings['xm'] = xm
|
|
248
|
+
#eventCharts.append(('XPos [um]', xm, 'ScannerXPos'))
|
|
249
|
+
|
|
250
|
+
if b'ScannerYPos' in evKeyNames:
|
|
251
|
+
y0 = 0
|
|
252
|
+
if 'Positioning.Stage_Y' in mdh.getEntryNames():
|
|
253
|
+
y0 = mdh.getEntry('Positioning.Stage_Y')
|
|
254
|
+
ym = piecewiseMapping.GeneratePMFromEventList(events, mdh, mdh.getEntry('StartTime'), y0, b'ScannerYPos', 0)
|
|
255
|
+
ev_mappings['ym'] = ym
|
|
256
|
+
#eventCharts.append(('YPos [um]', ym, 'ScannerYPos'))
|
|
257
|
+
|
|
258
|
+
if b'ShiftMeasure' in evKeyNames:
|
|
259
|
+
driftx = piecewiseMapping.GeneratePMFromEventList(events, mdh, mdh.getEntry('StartTime'), 0, b'ShiftMeasure',
|
|
260
|
+
0)
|
|
261
|
+
drifty = piecewiseMapping.GeneratePMFromEventList(events, mdh, mdh.getEntry('StartTime'), 0, b'ShiftMeasure',
|
|
262
|
+
1)
|
|
263
|
+
driftz = piecewiseMapping.GeneratePMFromEventList(events, mdh, mdh.getEntry('StartTime'), 0, b'ShiftMeasure',
|
|
264
|
+
2)
|
|
265
|
+
|
|
266
|
+
ev_mappings['driftx'] = driftx
|
|
267
|
+
ev_mappings['drifty'] = drifty
|
|
268
|
+
ev_mappings['driftz'] = driftz
|
|
269
|
+
|
|
270
|
+
#eventCharts.append(('X Drift [px]', driftx, 'ShiftMeasure'))
|
|
271
|
+
#eventCharts.append(('Y Drift [px]', drifty, 'ShiftMeasure'))
|
|
272
|
+
#eventCharts.append(('Z Drift [px]', driftz, 'ShiftMeasure'))
|
|
273
|
+
|
|
274
|
+
# self.eventCharts = eventCharts
|
|
275
|
+
# self.ev_mappings = ev_mappings
|
|
276
|
+
elif all(k in mdh.keys() for k in ['StackSettings.FramesPerStep', 'StackSettings.StepSize',
|
|
277
|
+
'StackSettings.NumSteps', 'StackSettings.NumCycles']):
|
|
278
|
+
# TODO - Remove this code - anytime we get here it's generally the result of an error in the input data
|
|
279
|
+
# This should be handled upstream when spooling
|
|
280
|
+
logger.warning('Spoofing focus from metadata: this usually implies an error in the input data (missing events) and results might vary')
|
|
281
|
+
try:
|
|
282
|
+
# if we dont have events file, see if we can use metadata to spoof focus
|
|
283
|
+
from PYME.experimental import labview_spooling_hacks
|
|
284
|
+
|
|
285
|
+
position, frames = labview_spooling_hacks.spoof_focus_from_metadata(mdh)
|
|
286
|
+
zm = piecewiseMapping.piecewiseMap(0, frames, position, mdh['Camera.CycleTime'], xIsSecs=False)
|
|
287
|
+
ev_mappings['z_command'] = zm
|
|
288
|
+
#eventCharts.append(('Focus [um]', zm, b'ProtocolFocus'))
|
|
289
|
+
|
|
290
|
+
except:
|
|
291
|
+
# It doesn't really matter if this fails, print our traceback anyway
|
|
292
|
+
logger.exception('Error trying to fudge focus positions')
|
|
293
|
+
|
|
294
|
+
return ev_mappings #, eventCharts
|
|
295
|
+
|
|
296
|
+
class Pipeline(object):
|
|
297
|
+
def __init__(self, filename=None, visFr=None, execute_on_invalidation=True):
|
|
298
|
+
self.filter = None
|
|
299
|
+
self.mapping = None
|
|
300
|
+
self.colourFilter = None
|
|
301
|
+
self.events = None
|
|
302
|
+
|
|
303
|
+
self.recipe = Recipe(execute_on_invalidation=execute_on_invalidation)
|
|
304
|
+
self.recipe.recipe_executed.connect(self.Rebuild)
|
|
305
|
+
|
|
306
|
+
self.selectedDataSourceKey = None
|
|
307
|
+
self.filterKeys = {'error_x': (0,30), 'error_y':(0,30),'A':(5,20000), 'sig' : (95, 200)}
|
|
308
|
+
|
|
309
|
+
self.blobSettings = BlobSettings()
|
|
310
|
+
self.objects = None
|
|
311
|
+
|
|
312
|
+
#self.imageBounds = ImageBounds(0,0,0,0)
|
|
313
|
+
#self.mdh = MetaDataHandler.NestedClassMDHandler()
|
|
314
|
+
|
|
315
|
+
self.Triangles = None
|
|
316
|
+
self.edb = None
|
|
317
|
+
self.Quads = None
|
|
318
|
+
self.GeneratedMeasures = {}
|
|
319
|
+
|
|
320
|
+
self.QTGoalPixelSize = 5
|
|
321
|
+
|
|
322
|
+
self._extra_chan_num = 0
|
|
323
|
+
|
|
324
|
+
self.filesToClose = []
|
|
325
|
+
|
|
326
|
+
#define a signal which a GUI can hook if the pipeline is rebuilt (i.e. the output changes)
|
|
327
|
+
self.onRebuild = dispatch.Signal()
|
|
328
|
+
|
|
329
|
+
#a cached list of our keys to be used to decide whether to fire a keys changed signal
|
|
330
|
+
self._keys = None
|
|
331
|
+
#define a signal which can be hooked if the pipeline keys have changed
|
|
332
|
+
self.onKeysChanged = dispatch.Signal()
|
|
333
|
+
|
|
334
|
+
self.ready = False
|
|
335
|
+
#self.visFr = visFr
|
|
336
|
+
|
|
337
|
+
if not filename is None:
|
|
338
|
+
self.OpenFile(filename)
|
|
339
|
+
|
|
340
|
+
#renderers.renderMetadataProviders.append(self.SaveMetadata)
|
|
341
|
+
|
|
342
|
+
@property
|
|
343
|
+
def mdh(self):
|
|
344
|
+
return self.selectedDataSource.mdh
|
|
345
|
+
|
|
346
|
+
@property
|
|
347
|
+
def imageBounds(self):
|
|
348
|
+
x0, y0, x1, y1, z0, z1 = 1e9, 1e9, -1e9, -1e9, 1e9, -1e9
|
|
349
|
+
for ds in self.dataSources.values():
|
|
350
|
+
try:
|
|
351
|
+
ib = ds.image_bounds
|
|
352
|
+
x0 = min(x0, ib.x0)
|
|
353
|
+
y0 = min(y0, ib.y0)
|
|
354
|
+
x1 = max(x1, ib.x1)
|
|
355
|
+
y1 = max(y1, ib.y1)
|
|
356
|
+
z0 = min(z0, ib.z0)
|
|
357
|
+
z1 = max(z1, ib.z1)
|
|
358
|
+
except AttributeError:
|
|
359
|
+
pass
|
|
360
|
+
|
|
361
|
+
return ImageBounds(x0, y0, x1, y1, z0, z1)
|
|
362
|
+
|
|
363
|
+
@property
|
|
364
|
+
def output(self):
|
|
365
|
+
return self.colourFilter
|
|
366
|
+
|
|
367
|
+
def __getitem__(self, keys):
|
|
368
|
+
"""gets values from the 'tail' of the pipeline (ie the colourFilter)"""
|
|
369
|
+
|
|
370
|
+
return self.output[keys]
|
|
371
|
+
|
|
372
|
+
def keys(self):
|
|
373
|
+
return self.output.keys()
|
|
374
|
+
|
|
375
|
+
def __getattr__(self, item):
|
|
376
|
+
try:
|
|
377
|
+
#if 'colourFilter in '
|
|
378
|
+
if self.output is None:
|
|
379
|
+
raise AttributeError('colourFilter not yet created')
|
|
380
|
+
|
|
381
|
+
return self.output[item]
|
|
382
|
+
except KeyError:
|
|
383
|
+
raise AttributeError("'%s' has not attribute '%s'" % (self.__class__, item))
|
|
384
|
+
|
|
385
|
+
def __dir__(self):
|
|
386
|
+
if self.output is None:
|
|
387
|
+
return list(self.__dict__.keys()) + list(dir(type(self)))
|
|
388
|
+
else:
|
|
389
|
+
return list(self.output.keys()) + list(self.__dict__.keys()) + list(dir(type(self)))
|
|
390
|
+
|
|
391
|
+
#compatibility redirects
|
|
392
|
+
@property
|
|
393
|
+
def fluorSpecies(self):
|
|
394
|
+
#warnings.warn(DeprecationWarning('Use colour_mapper.species_ratios instead'))
|
|
395
|
+
raise DeprecationWarning('Use colour_mapper.species_ratios instead')
|
|
396
|
+
return self.colour_mapper.species_ratios
|
|
397
|
+
|
|
398
|
+
@property
|
|
399
|
+
def fluorSpeciesDyes(self):
|
|
400
|
+
#warnings.warn(DeprecationWarning('Use colour_mapper.species_dyes instead'))
|
|
401
|
+
raise DeprecationWarning('Use colour_mapper.species_dyes instead')
|
|
402
|
+
return self.colour_mapper.species_dyes
|
|
403
|
+
|
|
404
|
+
|
|
405
|
+
@property
|
|
406
|
+
def chromaticShifts(self):
|
|
407
|
+
return self.colourFilter.chromaticShifts
|
|
408
|
+
|
|
409
|
+
#end compatibility redirects
|
|
410
|
+
|
|
411
|
+
@property
|
|
412
|
+
def dataSources(self):
|
|
413
|
+
return self.recipe.namespace
|
|
414
|
+
|
|
415
|
+
@property
|
|
416
|
+
def layer_datasources(self):
|
|
417
|
+
lds = {'output':self.colourFilter}
|
|
418
|
+
lds.update(self.dataSources)
|
|
419
|
+
return lds
|
|
420
|
+
|
|
421
|
+
@property
|
|
422
|
+
def layer_data_source_names(self):
|
|
423
|
+
"""
|
|
424
|
+
Return a list of names of datasources we can use with dotted channel selection
|
|
425
|
+
|
|
426
|
+
There is a little bit of magic here as we augment the names with dotted names for colour channel selection
|
|
427
|
+
"""
|
|
428
|
+
names = []#'']
|
|
429
|
+
for k, v in self.layer_datasources.items():
|
|
430
|
+
names.append(k)
|
|
431
|
+
if isinstance(v, tabular.ColourFilter):
|
|
432
|
+
for c in v.getColourChans():
|
|
433
|
+
names.append('.'.join([k, c]))
|
|
434
|
+
|
|
435
|
+
return names
|
|
436
|
+
|
|
437
|
+
def get_layer_data(self, dsname):
|
|
438
|
+
"""
|
|
439
|
+
Returns layer data for a given name. The principle difference to just accessing self.dataSources directly is that
|
|
440
|
+
we do some magic relating to allow colour channels to be accessed with the dot notation e.g. dsname.colour_channel
|
|
441
|
+
|
|
442
|
+
"""
|
|
443
|
+
if dsname == '':
|
|
444
|
+
return self
|
|
445
|
+
|
|
446
|
+
parts = dsname.split('.')
|
|
447
|
+
if len(parts) == 2:
|
|
448
|
+
# special case - permit access to channels using dot notation
|
|
449
|
+
# NB: only works if our underlying datasource is a ColourFilter
|
|
450
|
+
ds, channel = parts
|
|
451
|
+
if ds == 'output':
|
|
452
|
+
return self.colourFilter.get_channel_ds(channel)
|
|
453
|
+
else:
|
|
454
|
+
return self.dataSources.get(ds, None).get_channel_ds(channel)
|
|
455
|
+
else:
|
|
456
|
+
if dsname =='output':
|
|
457
|
+
return self.colourFilter
|
|
458
|
+
else:
|
|
459
|
+
return self.dataSources.get(dsname, None)
|
|
460
|
+
|
|
461
|
+
@property
|
|
462
|
+
def selectedDataSource(self):
|
|
463
|
+
"""
|
|
464
|
+
|
|
465
|
+
The currently selected data source (an instance of tabular.inputFilter derived class)
|
|
466
|
+
|
|
467
|
+
"""
|
|
468
|
+
if self.selectedDataSourceKey is None:
|
|
469
|
+
return None
|
|
470
|
+
else:
|
|
471
|
+
return self.dataSources[self.selectedDataSourceKey]
|
|
472
|
+
|
|
473
|
+
def selectDataSource(self, dskey):
|
|
474
|
+
"""
|
|
475
|
+
Set the currently selected data source
|
|
476
|
+
|
|
477
|
+
Parameters
|
|
478
|
+
----------
|
|
479
|
+
dskey : string
|
|
480
|
+
The data source name
|
|
481
|
+
|
|
482
|
+
"""
|
|
483
|
+
if not dskey in self.dataSources.keys():
|
|
484
|
+
raise KeyError('Data Source "%s" not found' % dskey)
|
|
485
|
+
|
|
486
|
+
self.selectedDataSourceKey = dskey
|
|
487
|
+
|
|
488
|
+
#remove any keys from the filter which are not present in the data
|
|
489
|
+
for k in list(self.filterKeys.keys()):
|
|
490
|
+
if not k in self.selectedDataSource.keys():
|
|
491
|
+
self.filterKeys.pop(k)
|
|
492
|
+
|
|
493
|
+
self.Rebuild()
|
|
494
|
+
|
|
495
|
+
def new_ds_name(self, stub, return_count=False):
|
|
496
|
+
"""
|
|
497
|
+
Generate a name for a new, unused, pipeline step output based on a stub
|
|
498
|
+
|
|
499
|
+
FIXME - should this be in ModuleCollection instead?
|
|
500
|
+
FIXME - should this use recipe.outputs as well?
|
|
501
|
+
|
|
502
|
+
Parameters
|
|
503
|
+
----------
|
|
504
|
+
stub - string to start the name with
|
|
505
|
+
|
|
506
|
+
Returns
|
|
507
|
+
-------
|
|
508
|
+
|
|
509
|
+
"""
|
|
510
|
+
count = 0
|
|
511
|
+
pattern = stub + '%d'
|
|
512
|
+
|
|
513
|
+
name = pattern % count
|
|
514
|
+
while name in self.dataSources.keys():
|
|
515
|
+
count += 1
|
|
516
|
+
name = pattern % count
|
|
517
|
+
|
|
518
|
+
if return_count:
|
|
519
|
+
return name, count
|
|
520
|
+
|
|
521
|
+
return name
|
|
522
|
+
|
|
523
|
+
def _get_session_datasources(self):
|
|
524
|
+
"""
|
|
525
|
+
Return a dictionary of datasources which are suitable for listing in a session file
|
|
526
|
+
|
|
527
|
+
"""
|
|
528
|
+
from PYME import pyme_warnings as warnings
|
|
529
|
+
out = {}
|
|
530
|
+
for k in self.recipe.inferred_data:
|
|
531
|
+
ds = self.dataSources[k]
|
|
532
|
+
|
|
533
|
+
if hasattr(ds, 'filename'):
|
|
534
|
+
fn = ds.filename
|
|
535
|
+
|
|
536
|
+
q = getattr(ds, 'query', None)
|
|
537
|
+
if q:
|
|
538
|
+
fn += '?' + q
|
|
539
|
+
|
|
540
|
+
out[k] = fn
|
|
541
|
+
else:
|
|
542
|
+
#logger.error('Data source %s has no filename, skipping. Session will be incomplete.' % k)
|
|
543
|
+
if not warnings.warn('Data source %s has no filename, skipping. Session will be incomplete.' % k, allow_cancel=True):
|
|
544
|
+
raise RuntimeError('Session save cancelled')
|
|
545
|
+
|
|
546
|
+
return out
|
|
547
|
+
|
|
548
|
+
def get_session(self):
|
|
549
|
+
"""
|
|
550
|
+
Return a dictionary of the current session
|
|
551
|
+
|
|
552
|
+
"""
|
|
553
|
+
return {'datasources': self._get_session_datasources(),
|
|
554
|
+
'recipe': self.recipe.get_cleaned_module_list(),
|
|
555
|
+
'selected_datasource': self.selectedDataSourceKey}
|
|
556
|
+
|
|
557
|
+
def addColumn(self, name, values, default = 0):
|
|
558
|
+
"""
|
|
559
|
+
Adds a column to the currently selected data source. Attempts to guess whether the size matches the input or
|
|
560
|
+
the output, and adds padding values appropriately if it matches the output.
|
|
561
|
+
|
|
562
|
+
Parameters
|
|
563
|
+
----------
|
|
564
|
+
name : str
|
|
565
|
+
The column name
|
|
566
|
+
values : array like
|
|
567
|
+
The values
|
|
568
|
+
default : float
|
|
569
|
+
The default value to pad with if we've given an output-sized array
|
|
570
|
+
|
|
571
|
+
"""
|
|
572
|
+
import warnings
|
|
573
|
+
warnings.warn('Deprecated. You should not add columns to the pipeline as this injects data and is not captured by the recipe', DeprecationWarning)
|
|
574
|
+
|
|
575
|
+
ds_len = len(self.selectedDataSource[self.selectedDataSource.keys()[0]])
|
|
576
|
+
val_len = len(values)
|
|
577
|
+
|
|
578
|
+
if val_len == ds_len:
|
|
579
|
+
#length matches the length of our input data source - do a simple add
|
|
580
|
+
self.selectedDataSource.addColumn(name, values)
|
|
581
|
+
elif val_len == len(self[self.keys()[0]]):
|
|
582
|
+
|
|
583
|
+
col_index = self.colourFilter.index
|
|
584
|
+
|
|
585
|
+
idx = np.copy(self.filter.Index)
|
|
586
|
+
idx[self.filter.Index] = col_index
|
|
587
|
+
|
|
588
|
+
ds_vals = np.zeros(ds_len) + default
|
|
589
|
+
ds_vals[idx] = np.array(values)
|
|
590
|
+
|
|
591
|
+
self.selectedDataSource.addColumn(name, ds_vals)
|
|
592
|
+
else:
|
|
593
|
+
raise RuntimeError("Length of new column doesn't match either the input or output lengths")
|
|
594
|
+
|
|
595
|
+
def addDataSource(self, dskey, ds, add_missing_vars=True):
|
|
596
|
+
"""
|
|
597
|
+
Add a new data source
|
|
598
|
+
|
|
599
|
+
Parameters
|
|
600
|
+
----------
|
|
601
|
+
dskey : str
|
|
602
|
+
The name of the new data source
|
|
603
|
+
ds : an tabular.inputFilter derived class
|
|
604
|
+
The new data source
|
|
605
|
+
|
|
606
|
+
"""
|
|
607
|
+
#check that we have a suitable object - note that this could potentially be relaxed
|
|
608
|
+
assert isinstance(ds, tabular.TabularBase)
|
|
609
|
+
|
|
610
|
+
if not isinstance(ds, tabular.MappingFilter):
|
|
611
|
+
#wrap with a mapping filter
|
|
612
|
+
ds = tabular.MappingFilter(ds)
|
|
613
|
+
|
|
614
|
+
#add keys which might not already be defined
|
|
615
|
+
if add_missing_vars:
|
|
616
|
+
_add_missing_ds_keys(ds,self.ev_mappings)
|
|
617
|
+
|
|
618
|
+
if getattr(ds, 'mdh', None) is None:
|
|
619
|
+
try:
|
|
620
|
+
ds.mdh = self.mdh
|
|
621
|
+
except AttributeError:
|
|
622
|
+
logger.error('No metadata defined in pipeline')
|
|
623
|
+
pass
|
|
624
|
+
|
|
625
|
+
self.dataSources[dskey] = ds
|
|
626
|
+
|
|
627
|
+
|
|
628
|
+
|
|
629
|
+
def Rebuild(self, **kwargs):
|
|
630
|
+
"""
|
|
631
|
+
Rebuild the pipeline. Called when the selected data source is changed/modified and/or the filter is changed.
|
|
632
|
+
|
|
633
|
+
"""
|
|
634
|
+
for s in self.dataSources.values():
|
|
635
|
+
if 'setMapping' in dir(s):
|
|
636
|
+
#keep raw measurements available
|
|
637
|
+
s.setMapping('x_raw', 'x')
|
|
638
|
+
s.setMapping('y_raw', 'y')
|
|
639
|
+
|
|
640
|
+
if 'z' in s.keys():
|
|
641
|
+
s.setMapping('z_raw', 'z')
|
|
642
|
+
|
|
643
|
+
if not self.selectedDataSource is None:
|
|
644
|
+
if not self.mapping is None:
|
|
645
|
+
# copy any mapping we might have made across to the new mapping filter (should fix drift correction)
|
|
646
|
+
# TODO - make drift correction a recipe module so that we don't need this code. Long term we should be
|
|
647
|
+
# ditching the mapping filter here.
|
|
648
|
+
old_mapping = self.mapping
|
|
649
|
+
self.mapping = tabular.MappingFilter(self.selectedDataSource)
|
|
650
|
+
self.mapping.mappings.update(old_mapping.mappings)
|
|
651
|
+
else:
|
|
652
|
+
self.mapping = tabular.MappingFilter(self.selectedDataSource)
|
|
653
|
+
|
|
654
|
+
#the filter, however needs to be re-generated with new keys and or data source
|
|
655
|
+
self.filter = tabular.ResultsFilter(self.mapping, **self.filterKeys)
|
|
656
|
+
|
|
657
|
+
#we can also recycle the colour filter
|
|
658
|
+
if self.colourFilter is None:
|
|
659
|
+
self.colourFilter = tabular.ColourFilter(self.filter)
|
|
660
|
+
else:
|
|
661
|
+
self.colourFilter.resultsSource = self.filter
|
|
662
|
+
|
|
663
|
+
#self._process_colour()
|
|
664
|
+
|
|
665
|
+
self.ready = True
|
|
666
|
+
|
|
667
|
+
self.ClearGenerated()
|
|
668
|
+
|
|
669
|
+
def ClearGenerated(self):
|
|
670
|
+
self.Triangles = None
|
|
671
|
+
self.edb = None
|
|
672
|
+
self.GeneratedMeasures = {}
|
|
673
|
+
self.Quads = None
|
|
674
|
+
|
|
675
|
+
self.onRebuild.send_robust(sender=self)
|
|
676
|
+
|
|
677
|
+
#check to see if any of the keys have changed - if so, fire a keys changed event so the GUI can update
|
|
678
|
+
newKeys = self.keys()
|
|
679
|
+
if not newKeys == self._keys:
|
|
680
|
+
self.onKeysChanged.send_robust(sender=self)
|
|
681
|
+
|
|
682
|
+
def CloseFiles(self):
|
|
683
|
+
while len(self.filesToClose) > 0:
|
|
684
|
+
self.filesToClose.pop().close()
|
|
685
|
+
|
|
686
|
+
def _ds_from_file(self, filename, **kwargs):
|
|
687
|
+
"""
|
|
688
|
+
loads a data set from a file
|
|
689
|
+
|
|
690
|
+
Parameters
|
|
691
|
+
----------
|
|
692
|
+
filename : str
|
|
693
|
+
kwargs : any additional arguments (see OpenFile)
|
|
694
|
+
|
|
695
|
+
Returns
|
|
696
|
+
-------
|
|
697
|
+
ds : tabular.TabularBase
|
|
698
|
+
the datasource, complete with metadatahandler and events if found.
|
|
699
|
+
|
|
700
|
+
"""
|
|
701
|
+
from PYME.IO import unifiedIO # TODO - what is the launch time penalty here for importing clusterUI and finding a nameserver?
|
|
702
|
+
|
|
703
|
+
mdh = MetaDataHandler.NestedClassMDHandler()
|
|
704
|
+
events = None
|
|
705
|
+
|
|
706
|
+
# load from file(/cluster, downloading a copy of the file if needed)
|
|
707
|
+
_original_filename = filename
|
|
708
|
+
#TODO - move unifiedIO call down into recipe IO
|
|
709
|
+
with unifiedIO.local_or_temp_filename(filename) as filename:
|
|
710
|
+
# TODO - check that loading isn't lazy (i.e. we need to make a copy of data in memory whilst in the
|
|
711
|
+
# context manager in order to be safe with unifiedIO and cluster data). From a quick look, it would seem
|
|
712
|
+
# that _ds_from_file() copies the data, but potentially keeps the file open which could be problematic.
|
|
713
|
+
# This won't effect local file loading even if loading is lazy (i.e. shouldn't cause a regression)
|
|
714
|
+
|
|
715
|
+
fn, query = filename.split('?', 1) if '?' in filename else (filename, '')
|
|
716
|
+
ext = os.path.splitext(fn)[1]
|
|
717
|
+
|
|
718
|
+
if ext == '.h5r':
|
|
719
|
+
import tables
|
|
720
|
+
h5f = tables.open_file(filename)
|
|
721
|
+
self.filesToClose.append(h5f)
|
|
722
|
+
|
|
723
|
+
h5r_tables = self.recipe._get_tables_from_hdf5(filename, h5f=h5f)
|
|
724
|
+
|
|
725
|
+
try:
|
|
726
|
+
driftDS = h5r_tables['DriftResults']
|
|
727
|
+
self.driftInputMapping = tabular.MappingFilter(driftDS)
|
|
728
|
+
self.addDataSource('Fiducials', self.driftInputMapping)
|
|
729
|
+
except KeyError:
|
|
730
|
+
logger.debug('No drift data found')
|
|
731
|
+
driftDS = None
|
|
732
|
+
|
|
733
|
+
try:
|
|
734
|
+
ds = h5r_tables['FitResults']
|
|
735
|
+
except KeyError:
|
|
736
|
+
logger.exception('No FitResults table found')
|
|
737
|
+
if driftDS is not None:
|
|
738
|
+
ds = driftDS
|
|
739
|
+
logger.debug('Using fiducial data as localisations')
|
|
740
|
+
else:
|
|
741
|
+
raise
|
|
742
|
+
|
|
743
|
+
# really old files might not have metadata, so test for it before assuming
|
|
744
|
+
if 'MetaData' in h5f.root:
|
|
745
|
+
mdh = MetaDataHandler.HDFMDHandler(h5f)
|
|
746
|
+
|
|
747
|
+
if ('Events' in h5f.root) and ('StartTime' in mdh.keys()):
|
|
748
|
+
events = h5f.root.Events[:]
|
|
749
|
+
|
|
750
|
+
elif ext == '.hdf':
|
|
751
|
+
#recipe output - handles generically formatted .h5
|
|
752
|
+
import tables
|
|
753
|
+
h5f = tables.open_file(filename)
|
|
754
|
+
self.filesToClose.append(h5f)
|
|
755
|
+
|
|
756
|
+
#defer our IO to the recipe IO method - TODO - do this for other file types as well
|
|
757
|
+
self.recipe._inject_tables_from_hdf5('', filename, '.hdf', h5f=h5f)
|
|
758
|
+
#self.recipe.load_inputs({'':)
|
|
759
|
+
|
|
760
|
+
for dsname, ds_ in self.dataSources.items():
|
|
761
|
+
#loop through tables until we get one which defines x. If no table defines x, take the last table to be added
|
|
762
|
+
#TODO make this logic better.
|
|
763
|
+
ds = ds_
|
|
764
|
+
if 'x' in ds.keys():
|
|
765
|
+
# TODO - get rid of some of the grossness here
|
|
766
|
+
mdh = getattr(ds, 'mdh', mdh)
|
|
767
|
+
events = getattr(ds, 'events', events)
|
|
768
|
+
break
|
|
769
|
+
|
|
770
|
+
else:
|
|
771
|
+
self.recipe._load_input(filename, 'FitResults', default_to_image=False, args=kwargs)
|
|
772
|
+
ds = self.dataSources['FitResults']
|
|
773
|
+
|
|
774
|
+
|
|
775
|
+
# make sure mdh is writable (file-based might not be)
|
|
776
|
+
ds.mdh = MetaDataHandler.NestedClassMDHandler(mdToCopy=mdh)
|
|
777
|
+
if events is not None:
|
|
778
|
+
# only set the .events attribute if we actually have events.
|
|
779
|
+
# ensure that events are sorted in increasing time order
|
|
780
|
+
ds.events = events[np.argsort(events['Time'])]
|
|
781
|
+
|
|
782
|
+
ds.filename = _original_filename # store the original filename / URI so that we can use it for saving sessions later.
|
|
783
|
+
return ds
|
|
784
|
+
|
|
785
|
+
def _clear_session(self, clobber_recipe=True):
|
|
786
|
+
#close any files we had open previously
|
|
787
|
+
while len(self.filesToClose) > 0:
|
|
788
|
+
self.filesToClose.pop().close()
|
|
789
|
+
|
|
790
|
+
# clear our state
|
|
791
|
+
# nb - equivalent to clearing recipe namespace
|
|
792
|
+
self.dataSources.clear()
|
|
793
|
+
|
|
794
|
+
if clobber_recipe:
|
|
795
|
+
# clear any processing modules from the pipeline
|
|
796
|
+
# call with clobber_recipe = False in a 'Open a new file with the processing pipeline I've set up' use case
|
|
797
|
+
# TODO: Add an "File-->Open [preserving recipe]" menu option or similar
|
|
798
|
+
self.recipe.modules = []
|
|
799
|
+
|
|
800
|
+
if 'zm' in dir(self):
|
|
801
|
+
del self.zm
|
|
802
|
+
|
|
803
|
+
self.filter = None
|
|
804
|
+
self.mapping = None
|
|
805
|
+
self.colourFilter = None
|
|
806
|
+
self.events = None
|
|
807
|
+
|
|
808
|
+
def load_session(self, session_info):
|
|
809
|
+
self._clear_session()
|
|
810
|
+
|
|
811
|
+
self.load_extra_datasources(**session_info['datasources'])
|
|
812
|
+
self.recipe._update_from_module_list(session_info['recipe'])
|
|
813
|
+
self.recipe.execute()
|
|
814
|
+
|
|
815
|
+
self.selectDataSource(session_info['selected_datasource'])
|
|
816
|
+
|
|
817
|
+
self.Rebuild()
|
|
818
|
+
|
|
819
|
+
def _create_default_recipe(self, pixel_size= 1.0, ds_keys = []):
|
|
820
|
+
from PYME.recipes.localisations import ProcessColour, Pipelineify
|
|
821
|
+
from PYME.recipes.tablefilters import FilterTable
|
|
822
|
+
|
|
823
|
+
add_pipeline_variables = Pipelineify(self.recipe,
|
|
824
|
+
inputFitResults='FitResults',
|
|
825
|
+
pixelSizeNM=pixel_size, #kwargs.get('PixelSize', 1.),
|
|
826
|
+
outputLocalizations='Localizations',
|
|
827
|
+
outputEventMaps= 'event_maps')
|
|
828
|
+
self.recipe.add_module(add_pipeline_variables)
|
|
829
|
+
|
|
830
|
+
#self._get_dye_ratios_from_metadata()
|
|
831
|
+
|
|
832
|
+
colour_mapper = ProcessColour(self.recipe, input='Localizations', output='colour_mapped')
|
|
833
|
+
self.recipe.add_module(colour_mapper)
|
|
834
|
+
self.recipe.add_module(FilterTable(self.recipe, inputName='colour_mapped', outputName='filtered_localizations', filters={k:list(v) for k, v in self.filterKeys.items() if k in ds_keys}))
|
|
835
|
+
|
|
836
|
+
|
|
837
|
+
def OpenFile(self, filename= '', ds = None, clobber_recipe=True, create_default_recipe=None, **kwargs):
|
|
838
|
+
"""Open a file - accepts optional keyword arguments for use with files
|
|
839
|
+
saved as .txt and .mat. These are:
|
|
840
|
+
|
|
841
|
+
FieldNames: a list of names for the fields in the text file or
|
|
842
|
+
matlab variable.
|
|
843
|
+
VarName: the name of the variable in the .mat file which
|
|
844
|
+
contains the data.
|
|
845
|
+
SkipRows: Number of header rows to skip for txt file data
|
|
846
|
+
|
|
847
|
+
PixelSize: Pixel size if not in nm
|
|
848
|
+
|
|
849
|
+
"""
|
|
850
|
+
self._clear_session(clobber_recipe=clobber_recipe)
|
|
851
|
+
|
|
852
|
+
self.filename = filename
|
|
853
|
+
|
|
854
|
+
if ds is None:
|
|
855
|
+
ds = self._ds_from_file(filename, **kwargs)
|
|
856
|
+
self.events = getattr(ds, 'events', None)
|
|
857
|
+
#self.mdh.copyEntriesFrom(ds.mdh)
|
|
858
|
+
|
|
859
|
+
# skip the MappingFilter wrapping, etc. in self.addDataSource and add this datasource as-is
|
|
860
|
+
self.dataSources['FitResults'] = ds
|
|
861
|
+
|
|
862
|
+
# Fit module specific filter settings
|
|
863
|
+
# TODO - put all the defaults here and use a local variable rather than in __init__ (self.filterKeys is largely an artifact of pre-recipe based pipeline)
|
|
864
|
+
if 'Analysis.FitModule' in ds.mdh.getEntryNames():
|
|
865
|
+
fitModule = ds.mdh['Analysis.FitModule']
|
|
866
|
+
if 'Interp' in fitModule:
|
|
867
|
+
self.filterKeys['A'] = (5, 100000)
|
|
868
|
+
if fitModule == 'SplitterShiftEstFR':
|
|
869
|
+
self.filterKeys['fitError_dx'] = (0, 10)
|
|
870
|
+
self.filterKeys['fitError_dy'] = (0, 10)
|
|
871
|
+
|
|
872
|
+
if create_default_recipe is None:
|
|
873
|
+
create_default_recipe = clobber_recipe
|
|
874
|
+
|
|
875
|
+
if create_default_recipe:
|
|
876
|
+
self._create_default_recipe(pixel_size=kwargs.get('PixelSize', 1.0), ds_keys = ds.keys())
|
|
877
|
+
else:
|
|
878
|
+
logger.warn('Opening file without clobbering recipe, filter and ratiometric colour settings might not be handled properly')
|
|
879
|
+
# FIXME - should we update filter keys and/or make the filter more robust
|
|
880
|
+
# FIXME - do we need to do anything about colour settings?
|
|
881
|
+
|
|
882
|
+
self.recipe.execute()
|
|
883
|
+
self.filterKeys = {}
|
|
884
|
+
if 'filtered_localizations' in self.dataSources.keys():
|
|
885
|
+
self.selectDataSource('filtered_localizations') #NB - this rebuilds the pipeline
|
|
886
|
+
else:
|
|
887
|
+
# TODO - replace / remove this fallback with something better. This is currently required
|
|
888
|
+
# when we use/abuse the pipeline in dh5view, but that should ideally be replaced with
|
|
889
|
+
# something cleaner. This (and case above) should probably also be conditional on `clobber_recipe`
|
|
890
|
+
# as if opening with an existing recipe we would likely want to keep selectedDataSource constant as well.
|
|
891
|
+
self.selectDataSource('FitResults')
|
|
892
|
+
|
|
893
|
+
# Retrieve or estimate image bounds
|
|
894
|
+
# if False: # 'imgBounds' in kwargs.keys():
|
|
895
|
+
# # TODO - why is this disabled? Current usage would appear to be when opening from LMAnalysis
|
|
896
|
+
# # during real-time localization, to force image bounds to match raw data, but also potentially useful
|
|
897
|
+
# # for other scenarios where metadata is not fully present.
|
|
898
|
+
# self.imageBounds = kwargs['imgBounds']
|
|
899
|
+
# elif ('scanx' not in self.selectedDataSource.keys() or 'scany' not in self.selectedDataSource.keys()) and 'Camera.ROIWidth' in self.mdh.getEntryNames():
|
|
900
|
+
# self.imageBounds = ImageBounds.extractFromMetadata(self.mdh)
|
|
901
|
+
# else:
|
|
902
|
+
# self.imageBounds = ImageBounds.estimateFromSource(self.selectedDataSource)
|
|
903
|
+
|
|
904
|
+
#self._process_colour()
|
|
905
|
+
|
|
906
|
+
@property
|
|
907
|
+
def ev_mappings(self):
|
|
908
|
+
try:
|
|
909
|
+
return self.dataSources['event_maps']
|
|
910
|
+
except KeyError:
|
|
911
|
+
logger.exception('No event mappings found')
|
|
912
|
+
return {}
|
|
913
|
+
|
|
914
|
+
@property
|
|
915
|
+
def eventCharts(self):
|
|
916
|
+
charts = []
|
|
917
|
+
if 'zm' in self.ev_mappings:
|
|
918
|
+
charts.append(('Focus [um]', self.ev_mappings['zm'], b'ProtocolFocus'))
|
|
919
|
+
elif 'z_command' in self.ev_mappings:
|
|
920
|
+
charts.append(('Focus [um]', self.ev_mappings['z_command'], b'ProtocolFocus'))
|
|
921
|
+
|
|
922
|
+
if 'xm' in self.ev_mappings:
|
|
923
|
+
charts.append(('XPos [um]', self.ev_mappings['xm'], 'ScannerXPos'))
|
|
924
|
+
|
|
925
|
+
if 'ym' in self.ev_mappings:
|
|
926
|
+
charts.append(('YPos [um]', self.ev_mappings['ym'], 'ScannerYPos'))
|
|
927
|
+
|
|
928
|
+
if 'driftx' in self.ev_mappings:
|
|
929
|
+
charts.append(('X Drift [px]', self.ev_mappings['driftx'], 'ShiftMeasure'))
|
|
930
|
+
charts.append(('Y Drift [px]', self.ev_mappings['drifty'], 'ShiftMeasure'))
|
|
931
|
+
charts.append(('Z Drift [px]', self.ev_mappings['driftz'], 'ShiftMeasure'))
|
|
932
|
+
|
|
933
|
+
|
|
934
|
+
return charts
|
|
935
|
+
|
|
936
|
+
|
|
937
|
+
def load_extra_datasources(self, **kwargs):
|
|
938
|
+
''' Load additional input data files into the pipeline.
|
|
939
|
+
|
|
940
|
+
Takes keyword arguments with the following format:
|
|
941
|
+
namespace_key=filename
|
|
942
|
+
|
|
943
|
+
e.g.
|
|
944
|
+
load_extra_datadources(fitResults='fitResults.mat', drift='drift.mat')
|
|
945
|
+
'''
|
|
946
|
+
|
|
947
|
+
self.recipe.load_inputs(kwargs)
|
|
948
|
+
|
|
949
|
+
|
|
950
|
+
@property
|
|
951
|
+
def colour_mapper(self):
|
|
952
|
+
""" Search for a colour mapper rather than use a hard coded reference - allows loading of saved pipelines with colour mapping"""
|
|
953
|
+
from PYME.recipes.localisations import ProcessColour
|
|
954
|
+
|
|
955
|
+
# find ProcessColour instance(s) in the pipeline
|
|
956
|
+
mappers = [m for m in self.recipe.modules if isinstance(m, ProcessColour)]
|
|
957
|
+
|
|
958
|
+
if len(mappers) > 0:
|
|
959
|
+
#return the first mapper we find
|
|
960
|
+
return mappers[0]
|
|
961
|
+
|
|
962
|
+
else:
|
|
963
|
+
return None
|
|
964
|
+
|
|
965
|
+
def OpenChannel(self, filename='', ds=None, channel_name='', **kwargs):
|
|
966
|
+
"""Open a file - accepts optional keyword arguments for use with files
|
|
967
|
+
saved as .txt and .mat. These are:
|
|
968
|
+
|
|
969
|
+
FieldNames: a list of names for the fields in the text file or
|
|
970
|
+
matlab variable.
|
|
971
|
+
VarName: the name of the variable in the .mat file which
|
|
972
|
+
contains the data.
|
|
973
|
+
SkipRows: Number of header rows to skip for txt file data
|
|
974
|
+
|
|
975
|
+
PixelSize: Pixel size if not in nm
|
|
976
|
+
|
|
977
|
+
"""
|
|
978
|
+
if channel_name == '' or channel_name is None:
|
|
979
|
+
#select a channel name automatically
|
|
980
|
+
channel_name = 'Channel%d' % self._extra_chan_num
|
|
981
|
+
self._extra_chan_num += 1
|
|
982
|
+
|
|
983
|
+
if ds is None:
|
|
984
|
+
#load from file
|
|
985
|
+
ds = self._ds_from_file(filename, **kwargs)
|
|
986
|
+
|
|
987
|
+
#wrap the data source with a mapping so we can fiddle with things
|
|
988
|
+
#e.g. combining z position and focus
|
|
989
|
+
mapped_ds = tabular.MappingFilter(ds)
|
|
990
|
+
|
|
991
|
+
if 'PixelSize' in kwargs.keys():
|
|
992
|
+
mapped_ds.addVariable('pixelSize', kwargs['PixelSize'])
|
|
993
|
+
mapped_ds.setMapping('x', 'x*pixelSize')
|
|
994
|
+
mapped_ds.setMapping('y', 'y*pixelSize')
|
|
995
|
+
|
|
996
|
+
|
|
997
|
+
self.addDataSource(channel_name, mapped_ds)
|
|
998
|
+
|
|
999
|
+
|
|
1000
|
+
|
|
1001
|
+
def _process_colour(self):
|
|
1002
|
+
"""
|
|
1003
|
+
Locate any colour / channel information and munge it into a format that the colourFilter understands.
|
|
1004
|
+
|
|
1005
|
+
We currently accept 3 ways of specifying channels:
|
|
1006
|
+
|
|
1007
|
+
- ratiometric colour, where 'gFrac' is defined to be the ratio between our observation channels
|
|
1008
|
+
- defining a 'probe' column in the input data which gives a channel index for each point
|
|
1009
|
+
- specifying colour ranges in the metadata
|
|
1010
|
+
|
|
1011
|
+
All of these get munged into the p_dye type entries that the colour filter needs.
|
|
1012
|
+
|
|
1013
|
+
"""
|
|
1014
|
+
#clear out old colour keys
|
|
1015
|
+
warnings.warn(DeprecationWarning('This should not be called (colour now handled by the ProcessColour recipe module)'))
|
|
1016
|
+
for k in self.mapping.mappings.keys():
|
|
1017
|
+
if k.startswith('p_'):
|
|
1018
|
+
self.mapping.mappings.pop(k)
|
|
1019
|
+
|
|
1020
|
+
if 'gFrac' in self.selectedDataSource.keys():
|
|
1021
|
+
#ratiometric
|
|
1022
|
+
for structure, ratio in self.fluorSpecies.items():
|
|
1023
|
+
if not ratio is None:
|
|
1024
|
+
self.mapping.setMapping('p_%s' % structure, 'exp(-(%f - gFrac)**2/(2*error_gFrac**2))/(error_gFrac*sqrt(2*numpy.pi))' % ratio)
|
|
1025
|
+
else:
|
|
1026
|
+
if 'probe' in self.mapping.keys():
|
|
1027
|
+
#non-ratiometric (i.e. sequential) colour
|
|
1028
|
+
#color channel is given in 'probe' column
|
|
1029
|
+
self.mapping.setMapping('ColourNorm', '1.0 + 0*probe')
|
|
1030
|
+
|
|
1031
|
+
for i in range(int(self.mapping['probe'].min()), int(self.mapping['probe'].max() + 1)):
|
|
1032
|
+
self.mapping.setMapping('p_chan%d' % i, '1.0*(probe == %d)' % i)
|
|
1033
|
+
|
|
1034
|
+
nSeqCols = self.mdh.getOrDefault('Protocol.NumberSequentialColors', 1)
|
|
1035
|
+
if nSeqCols > 1:
|
|
1036
|
+
for i in range(nSeqCols):
|
|
1037
|
+
self.mapping.setMapping('ColourNorm', '1.0 + 0*t')
|
|
1038
|
+
cr = self.mdh['Protocol.ColorRange%d' % i]
|
|
1039
|
+
self.mapping.setMapping('p_chan%d' % i, '(t>= %d)*(t<%d)' % cr)
|
|
1040
|
+
|
|
1041
|
+
#self.ClearGenerated()
|
|
1042
|
+
|
|
1043
|
+
|
|
1044
|
+
def _get_dye_ratios_from_metadata(self):
|
|
1045
|
+
warnings.warn(DeprecationWarning('This should not be called (colour now handled by the ProcessColour recipe module)'))
|
|
1046
|
+
labels = self.mdh.getOrDefault('Sample.Labelling', [])
|
|
1047
|
+
seen_structures = []
|
|
1048
|
+
|
|
1049
|
+
for structure, dye in labels:
|
|
1050
|
+
if structure in seen_structures:
|
|
1051
|
+
strucname = structure + '_1'
|
|
1052
|
+
else:
|
|
1053
|
+
strucname = structure
|
|
1054
|
+
seen_structures.append(structure)
|
|
1055
|
+
|
|
1056
|
+
ratio = dyeRatios.getRatio(dye, self.mdh)
|
|
1057
|
+
|
|
1058
|
+
if not ratio is None:
|
|
1059
|
+
self.fluorSpecies[strucname] = ratio
|
|
1060
|
+
self.fluorSpeciesDyes[strucname] = dye
|
|
1061
|
+
#self.mapping.setMapping('p_%s' % structure, '(1.0/(ColourNorm*2*numpy.pi*fitError_Ag*fitError_Ar))*exp(-(fitResults_Ag - %f*A)**2/(2*fitError_Ag**2) - (fitResults_Ar - %f*A)**2/(2*fitError_Ar**2))' % (ratio, 1-ratio))
|
|
1062
|
+
#self.mapping.setMapping('p_%s' % structure, 'exp(-(%f - gFrac)**2/(2*error_gFrac**2))/(error_gFrac*sqrt(2*numpy.pi))' % ratio)
|
|
1063
|
+
|
|
1064
|
+
|
|
1065
|
+
def getNeighbourDists(self, forceRetriang = False):
|
|
1066
|
+
from PYME.LMVis import visHelpers
|
|
1067
|
+
|
|
1068
|
+
if forceRetriang or not 'neighbourDistances' in self.GeneratedMeasures.keys():
|
|
1069
|
+
statNeigh = statusLog.StatusLogger("Calculating mean neighbour distances ...")
|
|
1070
|
+
self.GeneratedMeasures['neighbourDistances'] = np.array(visHelpers.calcNeighbourDists(self.getTriangles(forceRetriang)))
|
|
1071
|
+
|
|
1072
|
+
return self.GeneratedMeasures['neighbourDistances']
|
|
1073
|
+
|
|
1074
|
+
def getTriangles(self, recalc = False):
|
|
1075
|
+
from matplotlib import tri
|
|
1076
|
+
|
|
1077
|
+
if self.Triangles is None or recalc:
|
|
1078
|
+
statTri = statusLog.StatusLogger("Generating Triangulation ...")
|
|
1079
|
+
self.Triangles = tri.Triangulation(self.colourFilter['x'] + .1*np.random.normal(size=len(self.colourFilter['x'])), self.colourFilter['y']+ .1*np.random.normal(size=len(self.colourFilter['x'])))
|
|
1080
|
+
|
|
1081
|
+
#reset things which will have changed
|
|
1082
|
+
self.edb = None
|
|
1083
|
+
try:
|
|
1084
|
+
self.GeneratedMeasures.pop('neighbourDistances')
|
|
1085
|
+
except KeyError:
|
|
1086
|
+
pass
|
|
1087
|
+
|
|
1088
|
+
return self.Triangles
|
|
1089
|
+
|
|
1090
|
+
def getEdb(self):
|
|
1091
|
+
from PYME.Analysis.points.EdgeDB import edges
|
|
1092
|
+
if self.edb is None:
|
|
1093
|
+
self.edb = edges.EdgeDB(self.getTriangles())
|
|
1094
|
+
|
|
1095
|
+
return self.edb
|
|
1096
|
+
|
|
1097
|
+
def getBlobs(self):
|
|
1098
|
+
from PYME.Analysis.points.EdgeDB import edges
|
|
1099
|
+
|
|
1100
|
+
tri = self.getTriangles()
|
|
1101
|
+
edb = self.getEdb()
|
|
1102
|
+
|
|
1103
|
+
|
|
1104
|
+
if self.blobSettings.jittering == 0:
|
|
1105
|
+
self.objIndices = edges.objectIndices(edb.segment(self.blobSettings.distThreshold), self.blobSettings.minSize)
|
|
1106
|
+
self.objects = [np.vstack((tri.x[oi], tri.y[oi])).T for oi in self.objIndices]
|
|
1107
|
+
else:
|
|
1108
|
+
from matplotlib import tri
|
|
1109
|
+
|
|
1110
|
+
ndists = self.getNeighbourDists()
|
|
1111
|
+
|
|
1112
|
+
x_ = np.hstack([self['x'] + 0.5*ndists*np.random.normal(size=ndists.size) for i in range(self.blobSettings.jittering)])
|
|
1113
|
+
y_ = np.hstack([self['y'] + 0.5*ndists*np.random.normal(size=ndists.size) for i in range(self.blobSettings.jittering)])
|
|
1114
|
+
|
|
1115
|
+
T = tri.Triangulation(x_, y_)
|
|
1116
|
+
edb = edges.EdgeDB(T)
|
|
1117
|
+
|
|
1118
|
+
objIndices = edges.objectIndices(edb.segment(self.blobSettings.distThreshold), self.blobSettings.minSize)
|
|
1119
|
+
self.objects = [np.vstack((T.x[oi], T.y[oi])).T for oi in objIndices]
|
|
1120
|
+
|
|
1121
|
+
return self.objects, self.blobSettings.distThreshold
|
|
1122
|
+
|
|
1123
|
+
def GenQuads(self, max_leaf_size=10):
|
|
1124
|
+
from PYME.Analysis.points.QuadTree import pointQT
|
|
1125
|
+
|
|
1126
|
+
di = max(self.imageBounds.x1 - self.imageBounds.x0,
|
|
1127
|
+
self.imageBounds.y1 - self.imageBounds.y0)
|
|
1128
|
+
|
|
1129
|
+
numPixels = di/self.QTGoalPixelSize
|
|
1130
|
+
|
|
1131
|
+
di = self.QTGoalPixelSize*2**np.ceil(np.log2(numPixels))
|
|
1132
|
+
|
|
1133
|
+
|
|
1134
|
+
self.Quads = pointQT.qtRoot(self.imageBounds.x0, self.imageBounds.x0+di,
|
|
1135
|
+
self.imageBounds.y0, self.imageBounds.y0 + di)
|
|
1136
|
+
|
|
1137
|
+
for xi, yi in zip(self['x'],self['y']):
|
|
1138
|
+
self.Quads.insert(pointQT.qtRec(xi,yi, None), max_leaf_size)
|
|
1139
|
+
|
|
1140
|
+
def measureObjects(self):
|
|
1141
|
+
from PYME.Analysis.points import objectMeasure
|
|
1142
|
+
|
|
1143
|
+
self.objectMeasures = objectMeasure.measureObjects(self.objects, self.objThreshold)
|
|
1144
|
+
|
|
1145
|
+
return self.objectMeasures
|
|
1146
|
+
|
|
1147
|
+
def save_txt(self, outFile, keys=None):
|
|
1148
|
+
if outFile.endswith('.csv'):
|
|
1149
|
+
delim = ', '
|
|
1150
|
+
else:
|
|
1151
|
+
delim = '\t'
|
|
1152
|
+
|
|
1153
|
+
if keys is None:
|
|
1154
|
+
keys = self.keys()
|
|
1155
|
+
|
|
1156
|
+
#nRecords = len(ds[keys[0]])
|
|
1157
|
+
|
|
1158
|
+
of = open(outFile, 'w')
|
|
1159
|
+
|
|
1160
|
+
of.write('#' + delim.join(['%s' % k for k in keys]) + '\n')
|
|
1161
|
+
|
|
1162
|
+
for row in zip(*[self[k] for k in keys]):
|
|
1163
|
+
of.write(delim.join(['%e' % c for c in row]) + '\n')
|
|
1164
|
+
|
|
1165
|
+
of.close()
|
|
1166
|
+
|
|
1167
|
+
def save_hdf(self, filename):
|
|
1168
|
+
self.colourFilter.to_hdf(filename, tablename='Localizations', metadata=self.mdh)
|
|
1169
|
+
|
|
1170
|
+
def to_recarray(self, keys=None):
|
|
1171
|
+
return self.colourFilter.to_recarray(keys=keys)
|
|
1172
|
+
|
|
1173
|
+
def toDataFrame(self, keys=None):
|
|
1174
|
+
import pandas as pd
|
|
1175
|
+
if keys is None:
|
|
1176
|
+
keys = self.keys()
|
|
1177
|
+
|
|
1178
|
+
d = {k: self[k] for k in keys}
|
|
1179
|
+
|
|
1180
|
+
return pd.DataFrame(d)
|
|
1181
|
+
|
|
1182
|
+
@property
|
|
1183
|
+
def dtypes(self):
|
|
1184
|
+
return {k: str(self[k, :2].dtype) for k in self.keys()}
|
|
1185
|
+
|
|
1186
|
+
def _repr_html_(self):
|
|
1187
|
+
import jinja2
|
|
1188
|
+
TEMPLATE = """
|
|
1189
|
+
<h3> LMVis.pipeline.Pipeline viewing {{ pipe.filename }} </h3>
|
|
1190
|
+
<br>
|
|
1191
|
+
{{ recipe_svg }}
|
|
1192
|
+
<b> Data Sources: </b> {% for k in pipe.dataSources.keys() %} {% if k != pipe.selectedDataSourceKey %} {{ k }} - [{{ pipe.dataSources[k]|length }} evts], {% endif %} {% endfor %} <b> {{ pipe.selectedDataSourceKey }} - [{{ pipe.dataSources[pipe.selectedDataSourceKey]|length }} evts]</b>
|
|
1193
|
+
<br>
|
|
1194
|
+
<b> Columns: </b> {{ grouped_keys }}
|
|
1195
|
+
"""
|
|
1196
|
+
|
|
1197
|
+
try:
|
|
1198
|
+
svg = self.recipe.to_svg()
|
|
1199
|
+
except:
|
|
1200
|
+
svg = None
|
|
1201
|
+
|
|
1202
|
+
fr_keys = []
|
|
1203
|
+
fe_keys = []
|
|
1204
|
+
sl_keys = []
|
|
1205
|
+
st_keys = []
|
|
1206
|
+
|
|
1207
|
+
for k in self.keys():
|
|
1208
|
+
if k.startswith('fitResults'):
|
|
1209
|
+
fr_keys.append(k)
|
|
1210
|
+
elif k.startswith('fitError'):
|
|
1211
|
+
fe_keys.append(k)
|
|
1212
|
+
elif k.startswith('slicesUsed'):
|
|
1213
|
+
sl_keys.append(k)
|
|
1214
|
+
else:
|
|
1215
|
+
st_keys.append(k)
|
|
1216
|
+
|
|
1217
|
+
grouped_keys = sorted(st_keys) + sorted(fr_keys) + sorted(fe_keys) + sorted(sl_keys)
|
|
1218
|
+
|
|
1219
|
+
return jinja2.Template(TEMPLATE).render(pipe=self, recipe_svg = svg, grouped_keys=', '.join(grouped_keys))
|
|
1220
|
+
|
|
1221
|
+
|
|
1222
|
+
|
|
1223
|
+
|
|
1224
|
+
|
|
1225
|
+
|
|
1226
|
+
|
|
1227
|
+
|