python-microscopy 25.6.5__cp39-cp39-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- PYME/Acquire/ActionManager.py +450 -0
- PYME/Acquire/ExecTools.py +235 -0
- PYME/Acquire/Hardware/AAOptoelectronics/MDS.py +175 -0
- PYME/Acquire/Hardware/AAOptoelectronics/__init__.py +0 -0
- PYME/Acquire/Hardware/ARCoptix/__init__.py +0 -0
- PYME/Acquire/Hardware/ARCoptix/lcdriver.py +149 -0
- PYME/Acquire/Hardware/ARCoptix/lcserver32.py +123 -0
- PYME/Acquire/Hardware/AndorIXon/AndorCam.py +1095 -0
- PYME/Acquire/Hardware/AndorIXon/AndorControlFrame.py +312 -0
- PYME/Acquire/Hardware/AndorIXon/AndorIXon.py +737 -0
- PYME/Acquire/Hardware/AndorIXon/__init__.py +27 -0
- PYME/Acquire/Hardware/AndorNeo/AndorNeo.py +644 -0
- PYME/Acquire/Hardware/AndorNeo/AndorNeoControlFrame.py +161 -0
- PYME/Acquire/Hardware/AndorNeo/AndorZyla.py +761 -0
- PYME/Acquire/Hardware/AndorNeo/SDK3.py +307 -0
- PYME/Acquire/Hardware/AndorNeo/SDK3Cam.py +171 -0
- PYME/Acquire/Hardware/AndorNeo/ZylaControlPanel.py +105 -0
- PYME/Acquire/Hardware/AndorNeo/__init__.py +22 -0
- PYME/Acquire/Hardware/AndorNeo/parseAtdebug.py +46 -0
- PYME/Acquire/Hardware/AndorNeo/plotTimings.py +73 -0
- PYME/Acquire/Hardware/AndorNeo/testNeo.py +62 -0
- PYME/Acquire/Hardware/Camera.py +1199 -0
- PYME/Acquire/Hardware/CameraSkeleton.py +642 -0
- PYME/Acquire/Hardware/Coherent/OBIS.py +147 -0
- PYME/Acquire/Hardware/Coherent/Sapphire.py +162 -0
- PYME/Acquire/Hardware/Coherent/__init__.py +0 -0
- PYME/Acquire/Hardware/DMDGui.py +198 -0
- PYME/Acquire/Hardware/DigiData/DigiData.py +95 -0
- PYME/Acquire/Hardware/DigiData/DigiDataClient.py +30 -0
- PYME/Acquire/Hardware/DigiData/RemoteDigiData.py +51 -0
- PYME/Acquire/Hardware/DigiData/__init__.py +24 -0
- PYME/Acquire/Hardware/DigiData/axDD132x.py +348 -0
- PYME/Acquire/Hardware/EMCCDTheory.py +41 -0
- PYME/Acquire/Hardware/ExciterWheel.py +167 -0
- PYME/Acquire/Hardware/FilterWheel.py +184 -0
- PYME/Acquire/Hardware/FocCorr.py +106 -0
- PYME/Acquire/Hardware/FocCorrR.py +196 -0
- PYME/Acquire/Hardware/FrFilter.py +51 -0
- PYME/Acquire/Hardware/GCS/GCS_DLL.py +370 -0
- PYME/Acquire/Hardware/GCS/__init__.py +0 -0
- PYME/Acquire/Hardware/GCS/gcs.py +210 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/HamamatsuDCAM.py +662 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/HamamatsuORCA.py +602 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/Hamamatsu_control_panel.py +54 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/__init__.py +23 -0
- PYME/Acquire/Hardware/LaserControlFrame.py +160 -0
- PYME/Acquire/Hardware/MPBCommunications/MPBCW.py +132 -0
- PYME/Acquire/Hardware/MPBCommunications/__init__.py +0 -0
- PYME/Acquire/Hardware/Mercury/Mercury.py +269 -0
- PYME/Acquire/Hardware/Mercury/PI_Mercury_GCS_DLL.py +857 -0
- PYME/Acquire/Hardware/Mercury/__init__.py +22 -0
- PYME/Acquire/Hardware/Mercury/mercuryStepper.py +203 -0
- PYME/Acquire/Hardware/Mercury/mercuryStepperGCS.py +281 -0
- PYME/Acquire/Hardware/NikonTE2000.py +68 -0
- PYME/Acquire/Hardware/NikonTi.py +214 -0
- PYME/Acquire/Hardware/NikonTiGUI.py +81 -0
- PYME/Acquire/Hardware/OrielCornerstone.py +125 -0
- PYME/Acquire/Hardware/PM100USB.py +51 -0
- PYME/Acquire/Hardware/Piezos/__init__.py +22 -0
- PYME/Acquire/Hardware/Piezos/base_piezo.py +108 -0
- PYME/Acquire/Hardware/Piezos/offsetPiezo.py +162 -0
- PYME/Acquire/Hardware/Piezos/offsetPiezoREST.py +308 -0
- PYME/Acquire/Hardware/Piezos/piezo_c867.py +486 -0
- PYME/Acquire/Hardware/Piezos/piezo_e255.py +68 -0
- PYME/Acquire/Hardware/Piezos/piezo_e662.py +61 -0
- PYME/Acquire/Hardware/Piezos/piezo_e709.py +434 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816.py +452 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816_corr.py +70 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816_dll.py +518 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816b.py +70 -0
- PYME/Acquire/Hardware/Piezos/piezo_pipython_gcs.py +560 -0
- PYME/Acquire/Hardware/Piezos/piezo_test.py +55 -0
- PYME/Acquire/Hardware/Simulator/EmpiricalHist.py +273 -0
- PYME/Acquire/Hardware/Simulator/__init__.py +22 -0
- PYME/Acquire/Hardware/Simulator/dSimControl.py +961 -0
- PYME/Acquire/Hardware/Simulator/fakeCam.py +651 -0
- PYME/Acquire/Hardware/Simulator/fakePiezo.py +95 -0
- PYME/Acquire/Hardware/Simulator/fluor.py +336 -0
- PYME/Acquire/Hardware/Simulator/illuminate.cp39-win_amd64.dll.a +0 -0
- PYME/Acquire/Hardware/Simulator/illuminate.cp39-win_amd64.pyd +0 -0
- PYME/Acquire/Hardware/Simulator/illuminate.pyx +93 -0
- PYME/Acquire/Hardware/Simulator/lasersliders.py +90 -0
- PYME/Acquire/Hardware/Simulator/rend_im.py +446 -0
- PYME/Acquire/Hardware/Simulator/setup.py +69 -0
- PYME/Acquire/Hardware/Simulator/simcontrol.py +348 -0
- PYME/Acquire/Hardware/Simulator/simui_wx.py +794 -0
- PYME/Acquire/Hardware/Tango/__init__.py +0 -0
- PYME/Acquire/Hardware/Tango/marzhauser_tango.py +583 -0
- PYME/Acquire/Hardware/TiLightCrafter.py +388 -0
- PYME/Acquire/Hardware/__init__.py +22 -0
- PYME/Acquire/Hardware/aotf.py +271 -0
- PYME/Acquire/Hardware/arclampshutterpanel.py +71 -0
- PYME/Acquire/Hardware/cameraSoftwareBuffer.py +215 -0
- PYME/Acquire/Hardware/camera_noise.py +270 -0
- PYME/Acquire/Hardware/ccdAdjPanel.py +188 -0
- PYME/Acquire/Hardware/ccdCalibrator.py +161 -0
- PYME/Acquire/Hardware/cobaltLaser.py +108 -0
- PYME/Acquire/Hardware/cobaltLaser561.py +94 -0
- PYME/Acquire/Hardware/comports.py +26 -0
- PYME/Acquire/Hardware/driftTrackGUI.py +488 -0
- PYME/Acquire/Hardware/driftTracking.py +595 -0
- PYME/Acquire/Hardware/fakeShutters.py +52 -0
- PYME/Acquire/Hardware/focusKeys.py +204 -0
- PYME/Acquire/Hardware/focus_locks/__init__.py +0 -0
- PYME/Acquire/Hardware/focus_locks/reflection_focus_lock.py +684 -0
- PYME/Acquire/Hardware/frZStage.py +117 -0
- PYME/Acquire/Hardware/fw102.py +38 -0
- PYME/Acquire/Hardware/ids_peak_cam.py +561 -0
- PYME/Acquire/Hardware/ioslave.py +305 -0
- PYME/Acquire/Hardware/lasers.py +292 -0
- PYME/Acquire/Hardware/matchboxLaser.py +58 -0
- PYME/Acquire/Hardware/microscope_adapter.py +104 -0
- PYME/Acquire/Hardware/mpd_picosecond_delayer.py +395 -0
- PYME/Acquire/Hardware/multiview.py +287 -0
- PYME/Acquire/Hardware/olympusix81.py +59 -0
- PYME/Acquire/Hardware/pco/__init__.py +0 -0
- PYME/Acquire/Hardware/pco/pco_cam.py +348 -0
- PYME/Acquire/Hardware/pco/pco_edge_42_lt.py +34 -0
- PYME/Acquire/Hardware/pco/pco_sdk.py +1645 -0
- PYME/Acquire/Hardware/pco/pco_sdk_cam.py +518 -0
- PYME/Acquire/Hardware/pco/pco_sdk_cam_control_panel.py +54 -0
- PYME/Acquire/Hardware/phoxxLaser.py +199 -0
- PYME/Acquire/Hardware/phoxxLaserOLD.py +242 -0
- PYME/Acquire/Hardware/priorLumen.py +102 -0
- PYME/Acquire/Hardware/priorarclampshutter.py +52 -0
- PYME/Acquire/Hardware/setup.py +50 -0
- PYME/Acquire/Hardware/spacenav.py +148 -0
- PYME/Acquire/Hardware/splitter.py +394 -0
- PYME/Acquire/Hardware/thorlabsPiezo.py +98 -0
- PYME/Acquire/Hardware/thorlabs_cam.py +136 -0
- PYME/Acquire/Hardware/thorlabs_mff_flipper.py +400 -0
- PYME/Acquire/Hardware/toptica_ibeam.py +51 -0
- PYME/Acquire/Hardware/uc480/AndorControlFrame.py +308 -0
- PYME/Acquire/Hardware/uc480/__init__.py +27 -0
- PYME/Acquire/Hardware/uc480/uCam480.py +695 -0
- PYME/Acquire/Hardware/uc480/uc480.py +189 -0
- PYME/Acquire/Hardware/uc480/uc480Deprecated.py +87 -0
- PYME/Acquire/Hardware/uc480/uc480_h.py +767 -0
- PYME/Acquire/Hardware/uc480/uc480_h_gen.py +62 -0
- PYME/Acquire/Hardware/uc480/ucCamControlFrame.py +83 -0
- PYME/Acquire/Hardware/ueye.py +702 -0
- PYME/Acquire/PYMEAcquire.py +186 -0
- PYME/Acquire/Protocols/DMDMFM.py +74 -0
- PYME/Acquire/Protocols/__init__.py +22 -0
- PYME/Acquire/Protocols/darkCalibrate.py +56 -0
- PYME/Acquire/Protocols/dual671_470.py +45 -0
- PYME/Acquire/Protocols/dual671_488.py +46 -0
- PYME/Acquire/Protocols/gainCal.py +53 -0
- PYME/Acquire/Protocols/htsms-cal-psf.py +32 -0
- PYME/Acquire/Protocols/htsms-cal-registration.py +52 -0
- PYME/Acquire/Protocols/htsms-flow.py +29 -0
- PYME/Acquire/Protocols/htsms-staggered.py +31 -0
- PYME/Acquire/Protocols/htsms-tile.py +68 -0
- PYME/Acquire/Protocols/htsms-two-color.py +29 -0
- PYME/Acquire/Protocols/htsms-widefield.py +32 -0
- PYME/Acquire/Protocols/paint671.py +61 -0
- PYME/Acquire/Protocols/photoconversion.py +52 -0
- PYME/Acquire/Protocols/photoconversion2.py +55 -0
- PYME/Acquire/Protocols/prebleach488.py +70 -0
- PYME/Acquire/Protocols/prebleach490.py +69 -0
- PYME/Acquire/Protocols/prebleach561.py +72 -0
- PYME/Acquire/Protocols/prebleach561NeomEos2.py +70 -0
- PYME/Acquire/Protocols/prebleach561NeomEos2ND1.py +70 -0
- PYME/Acquire/Protocols/prebleach642.py +70 -0
- PYME/Acquire/Protocols/prebleach671.py +69 -0
- PYME/Acquire/Protocols/prebleach671ND1.py +58 -0
- PYME/Acquire/Protocols/prebleach671ND2.py +57 -0
- PYME/Acquire/Protocols/prebleach671Neo.py +69 -0
- PYME/Acquire/Protocols/recover671.py +62 -0
- PYME/Acquire/Protocols/sequence642_488.py +85 -0
- PYME/Acquire/Protocols/sequence642_561.py +87 -0
- PYME/Acquire/Protocols/shiftfield.py +198 -0
- PYME/Acquire/Protocols/simul488.py +59 -0
- PYME/Acquire/Protocols/simul642.py +63 -0
- PYME/Acquire/Protocols/simul642HTSMS.py +63 -0
- PYME/Acquire/Protocols/simulPA.py +37 -0
- PYME/Acquire/Protocols/simulSIM.py +76 -0
- PYME/Acquire/Protocols/simulStep.py +62 -0
- PYME/Acquire/Protocols/spdscan.py +178 -0
- PYME/Acquire/Protocols/standard470.py +45 -0
- PYME/Acquire/Protocols/standard488.py +47 -0
- PYME/Acquire/Protocols/standard671.py +48 -0
- PYME/Acquire/Protocols/standard671_no532.py +47 -0
- PYME/Acquire/Protocols/standardArclamp.py +46 -0
- PYME/Acquire/Protocols/strip_tile.py +204 -0
- PYME/Acquire/Protocols/tile.py +204 -0
- PYME/Acquire/Protocols/tile3D.py +192 -0
- PYME/Acquire/Protocols/tile671.py +190 -0
- PYME/Acquire/Protocols/tile_triggered.py +189 -0
- PYME/Acquire/Scripts/init.py +232 -0
- PYME/Acquire/Scripts/init_N1_Ti_Exeter_ZIx.py +374 -0
- PYME/Acquire/Scripts/init_N2_Ti_Zyla_lasers.py +290 -0
- PYME/Acquire/Scripts/init_Neo.py +266 -0
- PYME/Acquire/Scripts/init_NeoSim.py +159 -0
- PYME/Acquire/Scripts/init_TIRF.py +232 -0
- PYME/Acquire/Scripts/init_TIRF_Neo.py +242 -0
- PYME/Acquire/Scripts/init_TIRF_NeoO.py +241 -0
- PYME/Acquire/Scripts/init_TIRF_onecam.py +233 -0
- PYME/Acquire/Scripts/init_Ti.py +257 -0
- PYME/Acquire/Scripts/init_UOA_n.py +256 -0
- PYME/Acquire/Scripts/init_UOA_n2.py +246 -0
- PYME/Acquire/Scripts/init_Y1.py +249 -0
- PYME/Acquire/Scripts/init_Zyla.py +260 -0
- PYME/Acquire/Scripts/init_drift_tracking.py +80 -0
- PYME/Acquire/Scripts/init_emccd_basic.py +277 -0
- PYME/Acquire/Scripts/init_htsms.py +277 -0
- PYME/Acquire/Scripts/init_htsms_focus_lock.py +132 -0
- PYME/Acquire/Scripts/init_micrpi.py +45 -0
- PYME/Acquire/Scripts/init_orca.py +70 -0
- PYME/Acquire/Scripts/init_pco.py +49 -0
- PYME/Acquire/Scripts/init_rev.py +74 -0
- PYME/Acquire/Scripts/init_sim100.py +169 -0
- PYME/Acquire/Scripts/init_sim103.py +169 -0
- PYME/Acquire/Scripts/init_sim2.py +211 -0
- PYME/Acquire/Scripts/init_sim50.py +169 -0
- PYME/Acquire/Scripts/init_sim75.py +169 -0
- PYME/Acquire/Scripts/init_sim_drift_tracking.py +166 -0
- PYME/Acquire/Scripts/init_sim_htsms.py +224 -0
- PYME/Acquire/Scripts/init_sim_htsms_n.py +233 -0
- PYME/Acquire/Scripts/init_sim_main.py +229 -0
- PYME/Acquire/Scripts/init_sim_min.py +197 -0
- PYME/Acquire/Scripts/init_sim_rem.py +176 -0
- PYME/Acquire/Scripts/init_smi1.py +110 -0
- PYME/Acquire/Scripts/init_spectro.py +78 -0
- PYME/Acquire/Scripts/init_spim.py +116 -0
- PYME/Acquire/Scripts/init_thorcam.py +62 -0
- PYME/Acquire/Scripts/init_twophoton.py +112 -0
- PYME/Acquire/Scripts/init_uc480.py +262 -0
- PYME/Acquire/Scripts/init_ueye.py +261 -0
- PYME/Acquire/SpoolController.py +958 -0
- PYME/Acquire/Utils/MultiPointScanner.py +80 -0
- PYME/Acquire/Utils/__init__.py +13 -0
- PYME/Acquire/Utils/failsafe.py +157 -0
- PYME/Acquire/Utils/fastTiler.py +153 -0
- PYME/Acquire/Utils/pointScanner.py +496 -0
- PYME/Acquire/Utils/sarcSpacing.py +86 -0
- PYME/Acquire/Utils/strip_tiler.py +93 -0
- PYME/Acquire/Utils/tiler.py +464 -0
- PYME/Acquire/Utils/vibrationAnalysis.py +65 -0
- PYME/Acquire/__init__.py +44 -0
- PYME/Acquire/acquire_client.py +90 -0
- PYME/Acquire/acquire_server.py +316 -0
- PYME/Acquire/acquirebase.py +139 -0
- PYME/Acquire/acquiremainframe.py +716 -0
- PYME/Acquire/acquirewx.py +61 -0
- PYME/Acquire/acquisition_base.py +148 -0
- PYME/Acquire/actions.py +209 -0
- PYME/Acquire/autofocus.py +54 -0
- PYME/Acquire/eventLog.py +95 -0
- PYME/Acquire/event_loop.py +119 -0
- PYME/Acquire/frameWrangler.py +530 -0
- PYME/Acquire/htsms/__init__.py +8 -0
- PYME/Acquire/htsms/rule_ui.py +970 -0
- PYME/Acquire/htsms/rule_ui_v2.py +573 -0
- PYME/Acquire/htsms/tweeter.py +222 -0
- PYME/Acquire/microscope.py +1050 -0
- PYME/Acquire/positionTracker.py +181 -0
- PYME/Acquire/protocol.py +299 -0
- PYME/Acquire/protocol_acquisition.py +404 -0
- PYME/Acquire/sampleInformation.py +591 -0
- PYME/Acquire/sampleInformationDjangoDirect.py +446 -0
- PYME/Acquire/setup.py +52 -0
- PYME/Acquire/stackSettings.py +295 -0
- PYME/Acquire/stage_leveling.py +285 -0
- PYME/Acquire/ui/AnalysisSettingsUI.py +184 -0
- PYME/Acquire/ui/HDFSpoolFrame.py +584 -0
- PYME/Acquire/ui/__init__.py +0 -0
- PYME/Acquire/ui/actionUI.py +892 -0
- PYME/Acquire/ui/focus_lock_gui.py +149 -0
- PYME/Acquire/ui/intensity_trace.py +143 -0
- PYME/Acquire/ui/intsliders.py +222 -0
- PYME/Acquire/ui/lasersliders.py +329 -0
- PYME/Acquire/ui/mpd_picosecond_delay_panel.py +69 -0
- PYME/Acquire/ui/multiview_select.py +77 -0
- PYME/Acquire/ui/positionUI.py +519 -0
- PYME/Acquire/ui/preflight.py +58 -0
- PYME/Acquire/ui/scanner_panel.py +41 -0
- PYME/Acquire/ui/selectCameraPanel.py +46 -0
- PYME/Acquire/ui/seqdialog.py +501 -0
- PYME/Acquire/ui/splashScreen.py +175 -0
- PYME/Acquire/ui/spool_panel.py +830 -0
- PYME/Acquire/ui/tile_panel.py +556 -0
- PYME/Acquire/ui/tilesettingsui.py +91 -0
- PYME/Acquire/ui/voxelSizeDialog.py +149 -0
- PYME/Acquire/webui/__init__.py +36 -0
- PYME/Acquire/webui/ipy.py +361 -0
- PYME/Acquire/webui/static/css/pyme-bootstrap.css +9908 -0
- PYME/Acquire/webui/static/css/pymeacquire.css +85 -0
- PYME/Acquire/webui/static/js/pymeacquire.js +375 -0
- PYME/Acquire/webui/static/js/pzf.js +95 -0
- PYME/Acquire/webui/templates/PYMEAcquire.html +232 -0
- PYME/Acquire/webui/templates/login.html +84 -0
- PYME/Acquire/webui/templates/xtermpage.html +106 -0
- PYME/Acquire/xyztc.py +418 -0
- PYME/Acquire/zScanner.py +287 -0
- PYME/Analysis/BleachProfile/__init__.py +26 -0
- PYME/Analysis/BleachProfile/deMod.py +91 -0
- PYME/Analysis/BleachProfile/fitRecover.py +90 -0
- PYME/Analysis/BleachProfile/intensProf.py +519 -0
- PYME/Analysis/BleachProfile/kinModels.py +507 -0
- PYME/Analysis/BleachProfile/rawIntensity.py +227 -0
- PYME/Analysis/BleachProfile/rollins.py +555 -0
- PYME/Analysis/Colocalisation/__init__.py +27 -0
- PYME/Analysis/Colocalisation/colocScaleDep.py +126 -0
- PYME/Analysis/Colocalisation/correlationCoeffs.py +198 -0
- PYME/Analysis/Colocalisation/distColoc.py +110 -0
- PYME/Analysis/Colocalisation/edtColoc.py +191 -0
- PYME/Analysis/MetaData.py +278 -0
- PYME/Analysis/PSFEst/__init__.py +27 -0
- PYME/Analysis/PSFEst/dec.py +283 -0
- PYME/Analysis/PSFEst/extractImages.py +316 -0
- PYME/Analysis/PSFEst/fit_psf_zernikes.py +194 -0
- PYME/Analysis/PSFEst/psfQuality.py +225 -0
- PYME/Analysis/PSFGen/__init__.py +40 -0
- PYME/Analysis/PSFGen/fourier.py +138 -0
- PYME/Analysis/PSFGen/fourierHNA.py +1108 -0
- PYME/Analysis/PSFGen/fourierHNA2.py +979 -0
- PYME/Analysis/PSFGen/genCRBcurves.py +185 -0
- PYME/Analysis/PSFGen/nijboer_zernike.py +79 -0
- PYME/Analysis/PSFGen/ps_app.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/PSFGen/ps_app.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/PSFGen/test_ps_app.py +24 -0
- PYME/Analysis/Tracking/__init__.py +3 -0
- PYME/Analysis/Tracking/msd.py +57 -0
- PYME/Analysis/Tracking/trackUtils.py +528 -0
- PYME/Analysis/Tracking/tracking.py +152 -0
- PYME/Analysis/__init__.py +30 -0
- PYME/Analysis/_fithelpers.py +161 -0
- PYME/Analysis/angleFilter.py +287 -0
- PYME/Analysis/annealThresh.py +157 -0
- PYME/Analysis/autoencoder_classifier.py +45 -0
- PYME/Analysis/binAvg.py +144 -0
- PYME/Analysis/composite.py +183 -0
- PYME/Analysis/cramerRao.py +259 -0
- PYME/Analysis/deTile.py +441 -0
- PYME/Analysis/density_filter.py +45 -0
- PYME/Analysis/distributed_pyramid.py +426 -0
- PYME/Analysis/fiducial_matching.py +220 -0
- PYME/Analysis/gen_sCMOS_maps.py +355 -0
- PYME/Analysis/graphing_filters.py +311 -0
- PYME/Analysis/implicitFilter.py +359 -0
- PYME/Analysis/keep_pairs.py +69 -0
- PYME/Analysis/optic_flow.py +108 -0
- PYME/Analysis/piecewise.py +36 -0
- PYME/Analysis/piecewiseMapping.py +304 -0
- PYME/Analysis/piezo_movement_correction.py +153 -0
- PYME/Analysis/points/DeClump/__init__.py +78 -0
- PYME/Analysis/points/DeClump/deClump.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/DeClump/deClump.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/DeClump/deClumpGUI.py +87 -0
- PYME/Analysis/points/DeClump/pyDeClump.py +284 -0
- PYME/Analysis/points/DeClump/testClump.py +40 -0
- PYME/Analysis/points/DistHist/__init__.py +25 -0
- PYME/Analysis/points/DistHist/distHist.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/DistHist/distHist.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/DistHist/distHistThreaded.py +71 -0
- PYME/Analysis/points/DistHist/setup.py +54 -0
- PYME/Analysis/points/EdgeDB/__init__.py +24 -0
- PYME/Analysis/points/EdgeDB/edgeDB.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/EdgeDB/edgeDB.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/EdgeDB/edgeTest.py +66 -0
- PYME/Analysis/points/EdgeDB/edges.py +102 -0
- PYME/Analysis/points/EdgeDB/segment.py +75 -0
- PYME/Analysis/points/EdgeDB/setup.py +54 -0
- PYME/Analysis/points/QuadTree/QTrend.py +232 -0
- PYME/Analysis/points/QuadTree/__init__.py +25 -0
- PYME/Analysis/points/QuadTree/pointQT.py +227 -0
- PYME/Analysis/points/QuadTree/pointQTF.py +254 -0
- PYME/Analysis/points/QuadTree/qtUtils.py +36 -0
- PYME/Analysis/points/QuadTree/rendQT.py +118 -0
- PYME/Analysis/points/SoftRend/__init__.py +24 -0
- PYME/Analysis/points/SoftRend/setup.py +61 -0
- PYME/Analysis/points/SoftRend/testTetrahedra.py +41 -0
- PYME/Analysis/points/SoftRend/triRend.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/SoftRend/triRend.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/__init__.py +3 -0
- PYME/Analysis/points/arcfit/__init__.py +1 -0
- PYME/Analysis/points/arcfit/arcmf.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/arcfit/arcmf.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/arcfit/setup.py +51 -0
- PYME/Analysis/points/astigmatism/__init__.py +0 -0
- PYME/Analysis/points/astigmatism/astigTools.py +338 -0
- PYME/Analysis/points/astigmatism/astiglookup.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/astigmatism/astiglookup.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/astigmatism/setup.py +54 -0
- PYME/Analysis/points/cluster_morphology.py +199 -0
- PYME/Analysis/points/coordinate_tools.py +278 -0
- PYME/Analysis/points/features/__init__.py +0 -0
- PYME/Analysis/points/features/metal.py +46 -0
- PYME/Analysis/points/features/shaders/vect_feat_3d.metal +49 -0
- PYME/Analysis/points/fiducials.py +142 -0
- PYME/Analysis/points/gen3DTriangs.py +796 -0
- PYME/Analysis/points/moments.py +143 -0
- PYME/Analysis/points/multiview.py +458 -0
- PYME/Analysis/points/objectMeasure.py +206 -0
- PYME/Analysis/points/qpaint.py +97 -0
- PYME/Analysis/points/rings.py +372 -0
- PYME/Analysis/points/ripleys.py +427 -0
- PYME/Analysis/points/segmentLL.py +134 -0
- PYME/Analysis/points/setup.py +56 -0
- PYME/Analysis/points/spherical_harmonics.py +909 -0
- PYME/Analysis/points/surfit.py +829 -0
- PYME/Analysis/points/tCluster.py +75 -0
- PYME/Analysis/points/traveling_salesperson/__init__.py +0 -0
- PYME/Analysis/points/traveling_salesperson/queue_opt.py +117 -0
- PYME/Analysis/points/traveling_salesperson/sectioned_two_opt.py +327 -0
- PYME/Analysis/points/traveling_salesperson/setup.py +40 -0
- PYME/Analysis/points/traveling_salesperson/sort.py +78 -0
- PYME/Analysis/points/traveling_salesperson/two_opt.py +189 -0
- PYME/Analysis/points/traveling_salesperson/two_opt_utils.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/traveling_salesperson/two_opt_utils.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/traveling_salesperson/two_opt_utils.pyx +41 -0
- PYME/Analysis/points/twoColour.py +572 -0
- PYME/Analysis/points/twoColourPlot.py +107 -0
- PYME/Analysis/processLogger.py +129 -0
- PYME/Analysis/profile_extraction.py +72 -0
- PYME/Analysis/setup.py +60 -0
- PYME/Analysis/splitting.py +372 -0
- PYME/Analysis/svmSegment.py +214 -0
- PYME/Analysis/thresholding.py +192 -0
- PYME/Analysis/tile_pyramid.py +938 -0
- PYME/Analysis/widefieldify.py +54 -0
- PYME/DSView/DisplayOptionsPanel.py +503 -0
- PYME/DSView/LUT/__init__.py +33 -0
- PYME/DSView/LUT/lut.cp39-win_amd64.dll.a +0 -0
- PYME/DSView/LUT/lut.cp39-win_amd64.pyd +0 -0
- PYME/DSView/LUT/setup.py +54 -0
- PYME/DSView/OpenSequenceDialog.py +83 -0
- PYME/DSView/OverlaysPanel.py +111 -0
- PYME/DSView/__init__.py +32 -0
- PYME/DSView/arrayViewPanel.py +1035 -0
- PYME/DSView/displayOptions.py +453 -0
- PYME/DSView/displaySettingsPanel.py +271 -0
- PYME/DSView/dsviewer.py +542 -0
- PYME/DSView/eventLogViewer.py +805 -0
- PYME/DSView/fitInfo.py +486 -0
- PYME/DSView/htmlServe.py +72 -0
- PYME/DSView/logparser.py +100 -0
- PYME/DSView/modules/LMAnalysis.py +1053 -0
- PYME/DSView/modules/LMDisplay.py +194 -0
- PYME/DSView/modules/__init__.py +162 -0
- PYME/DSView/modules/_base.py +39 -0
- PYME/DSView/modules/annotation.py +725 -0
- PYME/DSView/modules/arrayView.py +71 -0
- PYME/DSView/modules/blobFinding.py +455 -0
- PYME/DSView/modules/blobMeasure.py +1093 -0
- PYME/DSView/modules/camera_maps.py +38 -0
- PYME/DSView/modules/coloc.py +414 -0
- PYME/DSView/modules/composite.py +715 -0
- PYME/DSView/modules/convnet.py +24 -0
- PYME/DSView/modules/cropping.py +133 -0
- PYME/DSView/modules/dark_and_flatfield.py +31 -0
- PYME/DSView/modules/deconvolution.py +499 -0
- PYME/DSView/modules/eventView.py +80 -0
- PYME/DSView/modules/extractBlobs.py +46 -0
- PYME/DSView/modules/fastGraphPanel.py +85 -0
- PYME/DSView/modules/filtering.py +335 -0
- PYME/DSView/modules/flowView.py +268 -0
- PYME/DSView/modules/fourierRingCorrelation.py +172 -0
- PYME/DSView/modules/gl_image_view.py +12 -0
- PYME/DSView/modules/graphViewPanel.py +272 -0
- PYME/DSView/modules/measure/__init__.py +1 -0
- PYME/DSView/modules/measure/filterPan.py +239 -0
- PYME/DSView/modules/metadataView.py +28 -0
- PYME/DSView/modules/multithreshold.py +98 -0
- PYME/DSView/modules/neuroglancer.py +129 -0
- PYME/DSView/modules/object_tagging.py +157 -0
- PYME/DSView/modules/particleTracking.py +463 -0
- PYME/DSView/modules/playback.py +256 -0
- PYME/DSView/modules/prebleachExtraction.py +75 -0
- PYME/DSView/modules/profileFitting.py +137 -0
- PYME/DSView/modules/profilePlotting.py +408 -0
- PYME/DSView/modules/projections.py +48 -0
- PYME/DSView/modules/psfExtraction.py +570 -0
- PYME/DSView/modules/psfGeneration.py +138 -0
- PYME/DSView/modules/psfTools.py +661 -0
- PYME/DSView/modules/pupilTools.py +204 -0
- PYME/DSView/modules/pupilView.py +139 -0
- PYME/DSView/modules/recipes.py +266 -0
- PYME/DSView/modules/redimension.py +75 -0
- PYME/DSView/modules/segmentation.py +192 -0
- PYME/DSView/modules/sheetView.py +24 -0
- PYME/DSView/modules/shell.py +39 -0
- PYME/DSView/modules/shiftfield_estimation.py +433 -0
- PYME/DSView/modules/sparkprepare.py +94 -0
- PYME/DSView/modules/splitter.py +148 -0
- PYME/DSView/modules/synchronise.py +64 -0
- PYME/DSView/modules/templates/astigCal.html +42 -0
- PYME/DSView/modules/templates/measureView.html +69 -0
- PYME/DSView/modules/templates/measureView2.html +48 -0
- PYME/DSView/modules/templates/measureView3.html +98 -0
- PYME/DSView/modules/templates/trackView.html +139 -0
- PYME/DSView/modules/templates/tracksOverview.html +21 -0
- PYME/DSView/modules/tiling.py +147 -0
- PYME/DSView/modules/unmixing.py +148 -0
- PYME/DSView/modules/vis3D.py +320 -0
- PYME/DSView/modules/visgui.py +163 -0
- PYME/DSView/modules/webview.py +14 -0
- PYME/DSView/overlays.py +295 -0
- PYME/DSView/scrolledImagePanel.py +188 -0
- PYME/DSView/setup.py +53 -0
- PYME/DSView/splashScreen.py +158 -0
- PYME/DSView/voxSizeDialog.py +84 -0
- PYME/Deconv/__init__.py +35 -0
- PYME/Deconv/beadGen.py +55 -0
- PYME/Deconv/dec.py +659 -0
- PYME/Deconv/decTask.py +65 -0
- PYME/Deconv/decThread.py +113 -0
- PYME/Deconv/dec_test.py +47 -0
- PYME/Deconv/deconvDialogs.py +417 -0
- PYME/Deconv/fftwWisdom.py +62 -0
- PYME/Deconv/richardsonLucy.py +141 -0
- PYME/Deconv/richardsonLucyMV.py +151 -0
- PYME/Deconv/richardsonLucyMVM.py +218 -0
- PYME/Deconv/test_block_dec.py +46 -0
- PYME/Deconv/tq_block_dec.py +331 -0
- PYME/Deconv/wiener.py +163 -0
- PYME/IO/DataSources/AlignDataSource.py +91 -0
- PYME/IO/DataSources/ArrayDataSource.py +260 -0
- PYME/IO/DataSources/BGSDataSource.py +353 -0
- PYME/IO/DataSources/BaseDataSource.py +457 -0
- PYME/IO/DataSources/BioformatsDataSource.py +178 -0
- PYME/IO/DataSources/BufferedDataSource.py +99 -0
- PYME/IO/DataSources/ClusterPZFDataSource.py +124 -0
- PYME/IO/DataSources/ConcatenatedDataSource.py +56 -0
- PYME/IO/DataSources/CropDataSource.py +243 -0
- PYME/IO/DataSources/DcimgDataSource.py +54 -0
- PYME/IO/DataSources/ElectronsPerSecondDataSource.py +61 -0
- PYME/IO/DataSources/FlatFieldDataSource.py +77 -0
- PYME/IO/DataSources/HDFDataSource.py +160 -0
- PYME/IO/DataSources/HTTPDataSource.py +80 -0
- PYME/IO/DataSources/ImageSeriesDataSource.py +123 -0
- PYME/IO/DataSources/MultiviewDataSource.py +99 -0
- PYME/IO/DataSources/OBFDataSource.py +67 -0
- PYME/IO/DataSources/RandomDataSource.py +23 -0
- PYME/IO/DataSources/SupertileDatasource.py +148 -0
- PYME/IO/DataSources/TQDataSource.py +41 -0
- PYME/IO/DataSources/TiffDataSource.py +193 -0
- PYME/IO/DataSources/TileDataSource.py +91 -0
- PYME/IO/DataSources/UnsplitDataSource.py +92 -0
- PYME/IO/DataSources/__init__.py +59 -0
- PYME/IO/FileUtils/IJLut.py +43 -0
- PYME/IO/FileUtils/RawToHdf5.py +105 -0
- PYME/IO/FileUtils/SPAD.py +54 -0
- PYME/IO/FileUtils/TiffSeqToHdf5.py +87 -0
- PYME/IO/FileUtils/__init__.py +24 -0
- PYME/IO/FileUtils/compHdf.py +39 -0
- PYME/IO/FileUtils/fileID.py +246 -0
- PYME/IO/FileUtils/fnlGen.py +40 -0
- PYME/IO/FileUtils/freeSpace.py +59 -0
- PYME/IO/FileUtils/h5-thumbnailer.py +85 -0
- PYME/IO/FileUtils/h5ExFrames.py +98 -0
- PYME/IO/FileUtils/h5ToTiffSeries.py +50 -0
- PYME/IO/FileUtils/h5r-thumbnailer.py +118 -0
- PYME/IO/FileUtils/h5rFormatDef.py +99 -0
- PYME/IO/FileUtils/h5rToTxt.py +77 -0
- PYME/IO/FileUtils/nameUtils.py +300 -0
- PYME/IO/FileUtils/obf_support.py +538 -0
- PYME/IO/FileUtils/ply.py +147 -0
- PYME/IO/FileUtils/readSpeckle.py +78 -0
- PYME/IO/FileUtils/readTiff.py +64 -0
- PYME/IO/FileUtils/saveTiffStack.py +137 -0
- PYME/IO/FileUtils/setup.py +36 -0
- PYME/IO/FileUtils/sf-thumbnailer.py +76 -0
- PYME/IO/FileUtils/stl.py +44 -0
- PYME/IO/FileUtils/thumbnailDatabase.py +104 -0
- PYME/IO/HTTPSpooler_v2.py +141 -0
- PYME/IO/MetaDataHandler.py +1072 -0
- PYME/IO/PZFFormat.py +375 -0
- PYME/IO/Spooler.py +279 -0
- PYME/IO/__init__.py +12 -0
- PYME/IO/acquisition_backends.py +353 -0
- PYME/IO/buffer_helpers.cp39-win_amd64.dll.a +0 -0
- PYME/IO/buffer_helpers.cp39-win_amd64.pyd +0 -0
- PYME/IO/buffer_helpers.pyx +190 -0
- PYME/IO/buffers.py +291 -0
- PYME/IO/clusterDuplication.py +204 -0
- PYME/IO/clusterExport.py +152 -0
- PYME/IO/clusterGlob.py +108 -0
- PYME/IO/clusterIO.py +1076 -0
- PYME/IO/clusterListing.py +232 -0
- PYME/IO/clusterResults.py +206 -0
- PYME/IO/clusterUpload.py +49 -0
- PYME/IO/cluster_directory.py +419 -0
- PYME/IO/cluster_streaming.py +216 -0
- PYME/IO/compatibility.py +12 -0
- PYME/IO/countdir/__init__.py +5 -0
- PYME/IO/countdir/setup.py +58 -0
- PYME/IO/csv_flavours.py +251 -0
- PYME/IO/dataExporter.py +470 -0
- PYME/IO/dataWrap.py +108 -0
- PYME/IO/dcimg.py +167 -0
- PYME/IO/events.py +161 -0
- PYME/IO/h5File.py +148 -0
- PYME/IO/h5rFile.py +323 -0
- PYME/IO/image.py +1447 -0
- PYME/IO/load_psf.py +26 -0
- PYME/IO/pyme_h5ls.py +58 -0
- PYME/IO/ragged.py +138 -0
- PYME/IO/rgb_image.py +94 -0
- PYME/IO/tabular.py +1338 -0
- PYME/IO/testClusterSpooling.py +199 -0
- PYME/IO/unifiedIO.py +301 -0
- PYME/LMVis/Extras/QPobjectSegment.py +220 -0
- PYME/LMVis/Extras/__init__.py +55 -0
- PYME/LMVis/Extras/animation.py +359 -0
- PYME/LMVis/Extras/annotation.py +78 -0
- PYME/LMVis/Extras/clusterAnalysis.py +460 -0
- PYME/LMVis/Extras/dockedPanel.py +69 -0
- PYME/LMVis/Extras/extra_layers.py +373 -0
- PYME/LMVis/Extras/fiducial.py +230 -0
- PYME/LMVis/Extras/flagZMotionArtifacts.py +60 -0
- PYME/LMVis/Extras/fusionUtils.py +9 -0
- PYME/LMVis/Extras/multiColourAnalysis.py +103 -0
- PYME/LMVis/Extras/multiviewMapping.py +489 -0
- PYME/LMVis/Extras/objectMeasurements.py +246 -0
- PYME/LMVis/Extras/particleTracking.py +272 -0
- PYME/LMVis/Extras/perFrameVariable.py +77 -0
- PYME/LMVis/Extras/photophysics.py +72 -0
- PYME/LMVis/Extras/pointSetGeneration.py +232 -0
- PYME/LMVis/Extras/pointwiseColoc.py +54 -0
- PYME/LMVis/Extras/saved_views.py +125 -0
- PYME/LMVis/Extras/scaleBox.py +115 -0
- PYME/LMVis/Extras/sequentialSpecies.py +125 -0
- PYME/LMVis/Extras/setBGImage.py +74 -0
- PYME/LMVis/Extras/shiftmapGenerator.py +138 -0
- PYME/LMVis/Extras/showShortcuts.py +69 -0
- PYME/LMVis/Extras/snapshot.py +135 -0
- PYME/LMVis/Extras/spherical_harmonics.py +98 -0
- PYME/LMVis/Extras/subsets.py +15 -0
- PYME/LMVis/Extras/surface_fitting.py +52 -0
- PYME/LMVis/Extras/temperaturePlot.py +53 -0
- PYME/LMVis/Extras/vibration.py +112 -0
- PYME/LMVis/VisGUI.py +506 -0
- PYME/LMVis/__init__.py +39 -0
- PYME/LMVis/colourFilterGUI.py +77 -0
- PYME/LMVis/colourPanel.py +491 -0
- PYME/LMVis/displayPane.py +462 -0
- PYME/LMVis/dyeRatios.py +116 -0
- PYME/LMVis/genImageDialog.py +298 -0
- PYME/LMVis/gl_offScreenHandler.py +134 -0
- PYME/LMVis/gl_render.py +1302 -0
- PYME/LMVis/gl_render3D.py +1453 -0
- PYME/LMVis/gl_render3D_shaders.py +1213 -0
- PYME/LMVis/glcanvas_core.py +1157 -0
- PYME/LMVis/imageView.py +752 -0
- PYME/LMVis/imageView2.py +372 -0
- PYME/LMVis/importTextDialog.py +342 -0
- PYME/LMVis/layer_panel.py +231 -0
- PYME/LMVis/layers/AxesOverlayLayer.py +126 -0
- PYME/LMVis/layers/LUTOverlayLayer.py +346 -0
- PYME/LMVis/layers/OverlayLayer.py +46 -0
- PYME/LMVis/layers/ScaleBarOverlayLayer.py +97 -0
- PYME/LMVis/layers/ScaleBoxOverlayLayer.py +181 -0
- PYME/LMVis/layers/SelectionOverlayLayer.py +124 -0
- PYME/LMVis/layers/__init__.py +53 -0
- PYME/LMVis/layers/base.py +319 -0
- PYME/LMVis/layers/image_layer.py +363 -0
- PYME/LMVis/layers/labels.py +186 -0
- PYME/LMVis/layers/layer_defaults.py +97 -0
- PYME/LMVis/layers/mesh.py +378 -0
- PYME/LMVis/layers/octree.py +194 -0
- PYME/LMVis/layers/pointcloud.py +372 -0
- PYME/LMVis/layers/quiver.py +271 -0
- PYME/LMVis/layers/text.py +250 -0
- PYME/LMVis/layers/tracks.py +309 -0
- PYME/LMVis/mv_math.py +78 -0
- PYME/LMVis/objectDarkMeasure.py +120 -0
- PYME/LMVis/pipeline.py +1227 -0
- PYME/LMVis/pipelineView.py +115 -0
- PYME/LMVis/pointSettingsPanel.py +135 -0
- PYME/LMVis/progGraph.py +59 -0
- PYME/LMVis/quadTreeSettings.py +90 -0
- PYME/LMVis/rendGauss.py +158 -0
- PYME/LMVis/renderers.py +576 -0
- PYME/LMVis/sessionpaths.py +136 -0
- PYME/LMVis/setup.py +39 -0
- PYME/LMVis/setup_exe.py +71 -0
- PYME/LMVis/shader_programs/DefaultShaderProgram.py +149 -0
- PYME/LMVis/shader_programs/GLProgram.py +119 -0
- PYME/LMVis/shader_programs/GouraudShaderProgram.py +157 -0
- PYME/LMVis/shader_programs/PointSpriteShaderProgram.py +163 -0
- PYME/LMVis/shader_programs/ShaderProgramFactory.py +54 -0
- PYME/LMVis/shader_programs/TesselShaderProgram.py +47 -0
- PYME/LMVis/shader_programs/WireFrameShaderProgram.py +50 -0
- PYME/LMVis/shader_programs/__init__.py +20 -0
- PYME/LMVis/shader_programs/oit_compositor.py +23 -0
- PYME/LMVis/shader_programs/shader_loader.py +84 -0
- PYME/LMVis/shader_programs/shader_program.py +168 -0
- PYME/LMVis/shader_programs/shaders/bigflatpoints_fs.glsl +16 -0
- PYME/LMVis/shader_programs/shaders/bigpoints_gs.glsl +40 -0
- PYME/LMVis/shader_programs/shaders/bigpointsprites_fs.glsl +20 -0
- PYME/LMVis/shader_programs/shaders/bigspheres_fs.glsl +53 -0
- PYME/LMVis/shader_programs/shaders/compose_fs.glsl +41 -0
- PYME/LMVis/shader_programs/shaders/compose_vs.glsl +25 -0
- PYME/LMVis/shader_programs/shaders/default_fs.glsl +27 -0
- PYME/LMVis/shader_programs/shaders/default_vs.glsl +88 -0
- PYME/LMVis/shader_programs/shaders/flatpoints_fs.glsl +27 -0
- PYME/LMVis/shader_programs/shaders/gouraud_flatpoints_fs.glsl +30 -0
- PYME/LMVis/shader_programs/shaders/gouraud_fs.glsl +26 -0
- PYME/LMVis/shader_programs/shaders/gouraud_oit_fs.glsl +68 -0
- PYME/LMVis/shader_programs/shaders/gouraud_vs.glsl +135 -0
- PYME/LMVis/shader_programs/shaders/image_fs.glsl +60 -0
- PYME/LMVis/shader_programs/shaders/image_vs.glsl +79 -0
- PYME/LMVis/shader_programs/shaders/phong_fs.glsl +43 -0
- PYME/LMVis/shader_programs/shaders/phong_vs.glsl +45 -0
- PYME/LMVis/shader_programs/shaders/pointsprites_fs.glsl +33 -0
- PYME/LMVis/shader_programs/shaders/pointsprites_vs.glsl +77 -0
- PYME/LMVis/shader_programs/shaders/spheres_fs.glsl +102 -0
- PYME/LMVis/shader_programs/shaders/tessel_fs.glsl +23 -0
- PYME/LMVis/shader_programs/shaders/tessel_vs.glsl +37 -0
- PYME/LMVis/shader_programs/shaders/text_fs.glsl +42 -0
- PYME/LMVis/shader_programs/shaders/text_vs.glsl +84 -0
- PYME/LMVis/shader_programs/shaders/widelines_fs.glsl +19 -0
- PYME/LMVis/shader_programs/shaders/widelines_gs.glsl +56 -0
- PYME/LMVis/shader_programs/shaders/widelines_vs.glsl +51 -0
- PYME/LMVis/statusLog.py +57 -0
- PYME/LMVis/triBlobs.py +142 -0
- PYME/LMVis/view_clipping_pane.py +429 -0
- PYME/LMVis/views.py +275 -0
- PYME/LMVis/visCore.py +1005 -0
- PYME/LMVis/visHelpers.py +880 -0
- PYME/LMVis/visHelpersMin.py +230 -0
- PYME/LMVis/workspaceTree.py +238 -0
- PYME/__init__.py +22 -0
- PYME/cluster/HTTPDataServer.py +1063 -0
- PYME/cluster/HTTPRulePusher.py +382 -0
- PYME/cluster/HTTPTaskPusher.py +377 -0
- PYME/cluster/PYMERuleNodeServer.py +192 -0
- PYME/cluster/PYMERuleServer.py +109 -0
- PYME/cluster/__init__.py +0 -0
- PYME/cluster/clusterUI/accounts/__init__.py +0 -0
- PYME/cluster/clusterUI/accounts/admin.py +85 -0
- PYME/cluster/clusterUI/accounts/forms.py +8 -0
- PYME/cluster/clusterUI/accounts/migrations/0001_initial.py +31 -0
- PYME/cluster/clusterUI/accounts/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/accounts/models.py +44 -0
- PYME/cluster/clusterUI/accounts/templates/accounts/user_form.html +13 -0
- PYME/cluster/clusterUI/accounts/templates/registration/initial_complete.html +6 -0
- PYME/cluster/clusterUI/accounts/templates/registration/initial_confirm.html +13 -0
- PYME/cluster/clusterUI/accounts/templates/registration/initial_done.html +7 -0
- PYME/cluster/clusterUI/accounts/templates/registration/verification.html +2 -0
- PYME/cluster/clusterUI/accounts/templates/registration/verification_subject.txt +1 -0
- PYME/cluster/clusterUI/accounts/urls.py +19 -0
- PYME/cluster/clusterUI/accounts/views.py +36 -0
- PYME/cluster/clusterUI/clusterUI/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterUI/settings.py +147 -0
- PYME/cluster/clusterUI/clusterUI/urls.py +31 -0
- PYME/cluster/clusterUI/clusterUI/wsgi.py +16 -0
- PYME/cluster/clusterUI/clusterbrowser/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterbrowser/admin.py +3 -0
- PYME/cluster/clusterUI/clusterbrowser/apps.py +7 -0
- PYME/cluster/clusterUI/clusterbrowser/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterbrowser/models.py +5 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/base.html +129 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/dirlisting.html +231 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/form_new_folder.html +18 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/form_upload_file.html +17 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/lightlisting.html +25 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/registration/login.html +38 -0
- PYME/cluster/clusterUI/clusterbrowser/urls.py +10 -0
- PYME/cluster/clusterUI/clusterbrowser/views.py +148 -0
- PYME/cluster/clusterUI/clusterstatus/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterstatus/admin.py +3 -0
- PYME/cluster/clusterUI/clusterstatus/apps.py +7 -0
- PYME/cluster/clusterUI/clusterstatus/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterstatus/models.py +5 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/load_content.html +29 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/queue_info.html +28 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/queue_info_content.html +50 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/status_dash.html +29 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/status_dash_content.html +90 -0
- PYME/cluster/clusterUI/clusterstatus/urls.py +9 -0
- PYME/cluster/clusterUI/clusterstatus/views.py +69 -0
- PYME/cluster/clusterUI/clusterui_tornado.py +117 -0
- PYME/cluster/clusterUI/deploy.py +62 -0
- PYME/cluster/clusterUI/localization/__init__.py +0 -0
- PYME/cluster/clusterUI/localization/admin.py +3 -0
- PYME/cluster/clusterUI/localization/apps.py +7 -0
- PYME/cluster/clusterUI/localization/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/localization/models.py +5 -0
- PYME/cluster/clusterUI/localization/templates/localization/settings_form.html +67 -0
- PYME/cluster/clusterUI/localization/urls.py +10 -0
- PYME/cluster/clusterUI/localization/views.py +170 -0
- PYME/cluster/clusterUI/manage.py +17 -0
- PYME/cluster/clusterUI/recipes/__init__.py +0 -0
- PYME/cluster/clusterUI/recipes/admin.py +3 -0
- PYME/cluster/clusterUI/recipes/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/recipes/models.py +3 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/extra_inputs.html +35 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/form_recipe.html +82 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/input_list.html +7 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editor.html +28 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editor_common.html +46 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editrun.html +93 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_standalone.html +100 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_template.html +109 -0
- PYME/cluster/clusterUI/recipes/urls.py +17 -0
- PYME/cluster/clusterUI/recipes/views.py +109 -0
- PYME/cluster/cluster_of_one.py +200 -0
- PYME/cluster/dataserver_wsgi.py +615 -0
- PYME/cluster/distribution.py +71 -0
- PYME/cluster/rulenodeserver.py +487 -0
- PYME/cluster/rules.py +979 -0
- PYME/cluster/ruleserver.py +1106 -0
- PYME/cluster/status.py +101 -0
- PYME/cluster/taskWorkerHTTP.py +522 -0
- PYME/cluster/webdav.py +1102 -0
- PYME/config.py +659 -0
- PYME/contrib/TextCtrlAutoComplete.py +582 -0
- PYME/contrib/__init__.py +7 -0
- PYME/contrib/aniso/__init__.py +2 -0
- PYME/contrib/aniso/aniso.py +268 -0
- PYME/contrib/auiFloatBook.py +94 -0
- PYME/contrib/congrid.py +127 -0
- PYME/contrib/dispatch/__init__.py +19 -0
- PYME/contrib/dispatch/dispatcher.py +289 -0
- PYME/contrib/gohlke/__init__.py +1 -0
- PYME/contrib/gohlke/_tifffile.cp39-win_amd64.dll.a +0 -0
- PYME/contrib/gohlke/_tifffile.cp39-win_amd64.pyd +0 -0
- PYME/contrib/gohlke/czifile.py +1289 -0
- PYME/contrib/gohlke/fcsfiles.py +514 -0
- PYME/contrib/gohlke/setup.py +54 -0
- PYME/contrib/gohlke/tifffile.py +3095 -0
- PYME/contrib/listctrlMixins.py +896 -0
- PYME/contrib/lzw.py +838 -0
- PYME/contrib/pad/__init__.py +13 -0
- PYME/contrib/pad/info_pad.py +18 -0
- PYME/contrib/pad/pad.py +670 -0
- PYME/contrib/setup.py +38 -0
- PYME/contrib/wxPlotPanel.py +137 -0
- PYME/experimental/SimReconstruction.py +49 -0
- PYME/experimental/__init__.pxd +0 -0
- PYME/experimental/__init__.py +4 -0
- PYME/experimental/_octree.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/_octree.cp39-win_amd64.pyd +0 -0
- PYME/experimental/_octree.pyx +477 -0
- PYME/experimental/_treap.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/_treap.cp39-win_amd64.pyd +0 -0
- PYME/experimental/_treap.pyx +267 -0
- PYME/experimental/_triangle_mesh.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/_triangle_mesh.cp39-win_amd64.pyd +0 -0
- PYME/experimental/_triangle_mesh.pxd +149 -0
- PYME/experimental/_triangle_mesh.pyx +2787 -0
- PYME/experimental/aqavg.py +40 -0
- PYME/experimental/dcimgFileChucker.py +375 -0
- PYME/experimental/dcimgSpoolShim.py +174 -0
- PYME/experimental/dcimg_chuck_test.py +78 -0
- PYME/experimental/dual_marching_cubes.py +801 -0
- PYME/experimental/dual_marching_cubes_v2.py +645 -0
- PYME/experimental/expectationMaximisation.py +298 -0
- PYME/experimental/func_octree.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/func_octree.cp39-win_amd64.pyd +0 -0
- PYME/experimental/func_octree.pyx +381 -0
- PYME/experimental/fusionRadial.py +520 -0
- PYME/experimental/fusionUtils.py +522 -0
- PYME/experimental/isosurface.py +147 -0
- PYME/experimental/labview_spooling_hacks.py +48 -0
- PYME/experimental/marching_cubes.py +811 -0
- PYME/experimental/marching_tetrahedra.py +343 -0
- PYME/experimental/modified_marching_cubes.py +1245 -0
- PYME/experimental/music.py +25 -0
- PYME/experimental/octree.py +188 -0
- PYME/experimental/pSpaceMap.py +34 -0
- PYME/experimental/pointFitConfoc.py +112 -0
- PYME/experimental/scanner_control.py +107 -0
- PYME/experimental/setup.py +109 -0
- PYME/experimental/spark.py +31 -0
- PYME/experimental/tcHist.py +71 -0
- PYME/experimental/treap.py +262 -0
- PYME/experimental/triangle_mesh.py +2287 -0
- PYME/experimental/triangle_mesh_utils.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/triangle_mesh_utils.cp39-win_amd64.pyd +0 -0
- PYME/experimental/triangle_utils.py +87 -0
- PYME/experimental/triangular_mesh.py +2255 -0
- PYME/experimental/zMotionArtifactUtils.py +55 -0
- PYME/localization/FitFactories/AstigGaussFitFR.py +175 -0
- PYME/localization/FitFactories/AstigGaussGPUFitFR.py +326 -0
- PYME/localization/FitFactories/BeadConvolvedAstigGaussFit.py +206 -0
- PYME/localization/FitFactories/ChecksumFR.py +82 -0
- PYME/localization/FitFactories/ChecksumGPUFR.py +213 -0
- PYME/localization/FitFactories/ChecksumMultifitSR.py +86 -0
- PYME/localization/FitFactories/ConfocCOIR.py +93 -0
- PYME/localization/FitFactories/Dumbell3DFitR.py +193 -0
- PYME/localization/FitFactories/DumbellFitR.py +163 -0
- PYME/localization/FitFactories/FFBase.py +403 -0
- PYME/localization/FitFactories/Gauss3DFitR.py +213 -0
- PYME/localization/FitFactories/GaussFitConstrR.py +177 -0
- PYME/localization/FitFactories/GaussMultifitLinesR.py +351 -0
- PYME/localization/FitFactories/GaussMultifitR.py +326 -0
- PYME/localization/FitFactories/GaussMultifitSR.py +373 -0
- PYME/localization/FitFactories/InterpFitR.py +236 -0
- PYME/localization/FitFactories/InterpFitWFR.py +111 -0
- PYME/localization/FitFactories/Interpolators/CSInterpolator.py +148 -0
- PYME/localization/FitFactories/Interpolators/CubeSInterpolatorP.py +121 -0
- PYME/localization/FitFactories/Interpolators/CubicSplineInterpolator.py +69 -0
- PYME/localization/FitFactories/Interpolators/LinearInterpolator.py +135 -0
- PYME/localization/FitFactories/Interpolators/LinearPInterpolatorP.py +95 -0
- PYME/localization/FitFactories/Interpolators/__init__.py +33 -0
- PYME/localization/FitFactories/Interpolators/baseInterpolator.py +202 -0
- PYME/localization/FitFactories/LatFitCOIR.py +82 -0
- PYME/localization/FitFactories/LatGaussFitFR.py +220 -0
- PYME/localization/FitFactories/LatObjFindFR.py +85 -0
- PYME/localization/FitFactories/LatPSFFitR.py +142 -0
- PYME/localization/FitFactories/MultiviewFitInterpNR.py +400 -0
- PYME/localization/FitFactories/PRInterpFitQR.py +192 -0
- PYME/localization/FitFactories/PRInterpFitR.py +223 -0
- PYME/localization/FitFactories/ROIExtractNR.py +93 -0
- PYME/localization/FitFactories/SpecGaussFitFR.py +174 -0
- PYME/localization/FitFactories/SplitterFitCOIR.py +142 -0
- PYME/localization/FitFactories/SplitterFitFNR.py +312 -0
- PYME/localization/FitFactories/SplitterFitFusionR.py +318 -0
- PYME/localization/FitFactories/SplitterFitInterpBNR.py +357 -0
- PYME/localization/FitFactories/SplitterFitInterpNR.py +343 -0
- PYME/localization/FitFactories/SplitterFitScavNR.py +352 -0
- PYME/localization/FitFactories/SplitterMultifitSR.py +410 -0
- PYME/localization/FitFactories/SplitterObjFindR.py +194 -0
- PYME/localization/FitFactories/SplitterROIExtractNR.py +91 -0
- PYME/localization/FitFactories/SplitterShiftEstFR.py +230 -0
- PYME/localization/FitFactories/__init__.py +103 -0
- PYME/localization/FitFactories/fitCommon.py +195 -0
- PYME/localization/FitFactories/zEstimators/__init__.py +29 -0
- PYME/localization/FitFactories/zEstimators/astigEstimator.py +173 -0
- PYME/localization/FitFactories/zEstimators/biplaneEstimator.py +209 -0
- PYME/localization/FitFactories/zEstimators/genericDualEstimator.py +232 -0
- PYME/localization/FitFactories/zEstimators/genericEstimator.py +224 -0
- PYME/localization/FitFactories/zEstimators/priEstimator.py +255 -0
- PYME/localization/MetaDataEdit.py +543 -0
- PYME/localization/Test/30_9_series_A_1.sf +0 -0
- PYME/localization/Test/PRI.md +45 -0
- PYME/localization/Test/PRI_qr.md +52 -0
- PYME/localization/Test/PRI_r.md +52 -0
- PYME/localization/Test/__init__.py +22 -0
- PYME/localization/Test/astig.md +50 -0
- PYME/localization/Test/astigCOI.md +50 -0
- PYME/localization/Test/astig_gauss.md +52 -0
- PYME/localization/Test/astig_pe.md +50 -0
- PYME/localization/Test/astig_splitter.md +66 -0
- PYME/localization/Test/astig_splitterCOI.md +67 -0
- PYME/localization/Test/astig_splitterQ.md +66 -0
- PYME/localization/Test/astig_theory.md +50 -0
- PYME/localization/Test/astig_theory.psf +0 -0
- PYME/localization/Test/astig_theory.tif +0 -0
- PYME/localization/Test/beads1.psf +0 -0
- PYME/localization/Test/beads1.tif +0 -0
- PYME/localization/Test/biplane_splitter.md +75 -0
- PYME/localization/Test/biplane_splitter2.md +103 -0
- PYME/localization/Test/biplane_splitter3.md +115 -0
- PYME/localization/Test/defoc.md +48 -0
- PYME/localization/Test/dumbell_3d.md +52 -0
- PYME/localization/Test/fitTestJig.py +172 -0
- PYME/localization/Test/fitTestJigSCMOS.py +487 -0
- PYME/localization/Test/fitTestJigWC.py +225 -0
- PYME/localization/Test/gauss.md +50 -0
- PYME/localization/Test/gaussCOI.md +50 -0
- PYME/localization/Test/pri_pe.md +50 -0
- PYME/localization/Test/pri_theory.md +51 -0
- PYME/localization/Test/pri_theory.psf +0 -0
- PYME/localization/Test/pri_theory.tif +0 -0
- PYME/localization/Test/psf_astig.psf +0 -0
- PYME/localization/Test/psf_astig.tif +0 -0
- PYME/localization/Test/psf_astig_bg_d.psf +0 -0
- PYME/localization/Test/psf_astig_bg_d.tif +0 -0
- PYME/localization/Test/psf_astig_pe.psf +0 -0
- PYME/localization/Test/psf_astig_pe.tif +0 -0
- PYME/localization/Test/psf_decon.psf +0 -0
- PYME/localization/Test/psf_decon.tif +0 -0
- PYME/localization/Test/psf_decon_pe.psf +0 -0
- PYME/localization/Test/psf_decon_pe.tif +0 -0
- PYME/localization/Test/psf_guess.psf +0 -0
- PYME/localization/Test/splitter.md +63 -0
- PYME/localization/Test/splitter_scav.md +63 -0
- PYME/localization/Test/test.psf +0 -0
- PYME/localization/Test/test.tif +0 -0
- PYME/localization/Test/test_decon.psf +0 -0
- PYME/localization/Test/test_decon.tif +0 -0
- PYME/localization/Test/test_pe.psf +0 -0
- PYME/localization/Test/test_pe.tif +0 -0
- PYME/localization/Test/wf_theory.psf +0 -0
- PYME/localization/Test/wf_theory2.psf +0 -0
- PYME/localization/__init__.py +17 -0
- PYME/localization/autopsf/__init__.py +1 -0
- PYME/localization/autopsf/autopsf.py +486 -0
- PYME/localization/autopsf/roifit.py +310 -0
- PYME/localization/cInterp/__init__.py +24 -0
- PYME/localization/cInterp/cInterp.cp39-win_amd64.dll.a +0 -0
- PYME/localization/cInterp/cInterp.cp39-win_amd64.pyd +0 -0
- PYME/localization/cInterp/setup.py +54 -0
- PYME/localization/cModels/__init__.py +24 -0
- PYME/localization/cModels/gauss_app.cp39-win_amd64.dll.a +0 -0
- PYME/localization/cModels/gauss_app.cp39-win_amd64.pyd +0 -0
- PYME/localization/ofind.py +444 -0
- PYME/localization/ofind3d.py +306 -0
- PYME/localization/ofind_nofilt.py +128 -0
- PYME/localization/ofind_pri.py +478 -0
- PYME/localization/ofind_split.py +399 -0
- PYME/localization/ofind_xcorr.py +351 -0
- PYME/localization/ofind_xcorr_fw.py +441 -0
- PYME/localization/remFitBuf.py +657 -0
- PYME/localization/setup.py +56 -0
- PYME/localization/splitting.py +240 -0
- PYME/localization/twist.py +60 -0
- PYME/misc/TiSettings.py +36 -0
- PYME/misc/TiffImagePlugin.py +838 -0
- PYME/misc/VolProj.py +144 -0
- PYME/misc/__init__.py +25 -0
- PYME/misc/aligned_array.py +10 -0
- PYME/misc/aniso.py +29 -0
- PYME/misc/big_sur_fix.py +20 -0
- PYME/misc/check_for_updates.py +139 -0
- PYME/misc/colormaps.py +199 -0
- PYME/misc/colorsys.py +201 -0
- PYME/misc/computerName.py +33 -0
- PYME/misc/coverslipGeometries.py +60 -0
- PYME/misc/cython_numpy_monkey.py +40 -0
- PYME/misc/depGraph.py +406 -0
- PYME/misc/dirSize.py +31 -0
- PYME/misc/diskCleanup.py +64 -0
- PYME/misc/djangoRecarray.py +57 -0
- PYME/misc/django_widgets.py +27 -0
- PYME/misc/editgrid.py +101 -0
- PYME/misc/eventSpy.py +122 -0
- PYME/misc/exceptions.py +30 -0
- PYME/misc/facsPlot.py +89 -0
- PYME/misc/fbpIcons.py +90 -0
- PYME/misc/fftw_compat.py +28 -0
- PYME/misc/findCycles.py +91 -0
- PYME/misc/fortran_interrupt_defeat.py +43 -0
- PYME/misc/glassModel.py +64 -0
- PYME/misc/hash32.py +41 -0
- PYME/misc/hillcurve.py +88 -0
- PYME/misc/hybrid_ns.py +84 -0
- PYME/misc/kdFit.py +72 -0
- PYME/misc/locate.py +10 -0
- PYME/misc/memUsage.py +65 -0
- PYME/misc/memmap.py +52 -0
- PYME/misc/mock_ctypes.py +28 -0
- PYME/misc/mock_traits.py +59 -0
- PYME/misc/mock_traitsui.py +29 -0
- PYME/misc/pyme_zeroconf.py +287 -0
- PYME/misc/pyro_tracebacks.py +32 -0
- PYME/misc/read_agf.py +605 -0
- PYME/misc/sffake.py +16 -0
- PYME/misc/snells.py +71 -0
- PYME/misc/sqlite_ns.py +132 -0
- PYME/misc/sqlitendarray.py +56 -0
- PYME/misc/taskDef.py +44 -0
- PYME/misc/tempDB.py +56 -0
- PYME/misc/wxThread.py +33 -0
- PYME/misc/zemax.py +259 -0
- PYME/misc/zernike.py +151 -0
- PYME/pyme_warnings.py +70 -0
- PYME/recipes/Recipes/STEDDeconvolution.yaml +14 -0
- PYME/recipes/Recipes/STEDMinistacks.yaml +15 -0
- PYME/recipes/Recipes/STED_COP3.yaml +25 -0
- PYME/recipes/Recipes/blobMeas.yaml +19 -0
- PYME/recipes/Recipes/blobMeas2.yaml +37 -0
- PYME/recipes/Recipes/blobMeasSR.yaml +66 -0
- PYME/recipes/Recipes/coloc.yaml +43 -0
- PYME/recipes/Recipes/coloc_roi_masked.yaml +46 -0
- PYME/recipes/Recipes/multiblob.yaml +38 -0
- PYME/recipes/Recipes/pre_particleTracking.yaml +30 -0
- PYME/recipes/Recipes/segmentAndMeasureLoci.yaml +41 -0
- PYME/recipes/__init__.py +6 -0
- PYME/recipes/acquisition.py +158 -0
- PYME/recipes/bakeshop.py +32 -0
- PYME/recipes/base.py +1393 -0
- PYME/recipes/batchProcess.py +147 -0
- PYME/recipes/filters.py +394 -0
- PYME/recipes/fudges.py +41 -0
- PYME/recipes/graphing.py +108 -0
- PYME/recipes/html_recipe_editor.py +90 -0
- PYME/recipes/localisations.py +1386 -0
- PYME/recipes/machine_learning.py +286 -0
- PYME/recipes/measurement.py +1062 -0
- PYME/recipes/modules.py +50 -0
- PYME/recipes/multiview.py +435 -0
- PYME/recipes/output.py +667 -0
- PYME/recipes/pointcloud.py +510 -0
- PYME/recipes/processing.py +2954 -0
- PYME/recipes/pyramid.py +206 -0
- PYME/recipes/recipe.py +965 -0
- PYME/recipes/recipeGui.py +1029 -0
- PYME/recipes/recipeLayout.py +499 -0
- PYME/recipes/runRecipe.py +140 -0
- PYME/recipes/setup.py +37 -0
- PYME/recipes/simulation.py +91 -0
- PYME/recipes/skfilters.py +143 -0
- PYME/recipes/surface_fitting.py +776 -0
- PYME/recipes/tablefilters.py +275 -0
- PYME/recipes/tracking.py +343 -0
- PYME/recipes/traits.py +157 -0
- PYME/recipes/vertical_recipe_display.py +373 -0
- PYME/resources/__init__.py +23 -0
- PYME/resources/config_template/distributor.yaml +14 -0
- PYME/resources/config_template/nodeserver.yaml +15 -0
- PYME/resources/icons/LUT.png +0 -0
- PYME/resources/icons/YSM_Shield.png +0 -0
- PYME/resources/icons/YSM_logo.png +0 -0
- PYME/resources/icons/arrow.png +0 -0
- PYME/resources/icons/crosshairs.png +0 -0
- PYME/resources/icons/line_select.png +0 -0
- PYME/resources/icons/logo_fmhs.png +0 -0
- PYME/resources/icons/media-playback-pause.png +0 -0
- PYME/resources/icons/media-playback-start.png +0 -0
- PYME/resources/icons/media-skip-backward.png +0 -0
- PYME/resources/icons/media-skip-forward.png +0 -0
- PYME/resources/icons/mesh.png +0 -0
- PYME/resources/icons/mesh.svg +28 -0
- PYME/resources/icons/pmacquire.icns +0 -0
- PYME/resources/icons/pmacquire.ico +0 -0
- PYME/resources/icons/pmanal.icns +0 -0
- PYME/resources/icons/pmanal.ico +0 -0
- PYME/resources/icons/pmvis.icns +0 -0
- PYME/resources/icons/pmvis.ico +0 -0
- PYME/resources/icons/points.png +0 -0
- PYME/resources/icons/points.svg +16 -0
- PYME/resources/icons/pymeLogo.png +0 -0
- PYME/resources/icons/rect_select.png +0 -0
- PYME/resources/icons/squiggle_select.png +0 -0
- PYME/resources/icons/text3800.icns +0 -0
- PYME/resources/icons/text3800.ico +0 -0
- PYME/resources/icons/text3800.png +0 -0
- PYME/resources/icons/text3800.tif +0 -0
- PYME/resources/icons/text5377.icns +0 -0
- PYME/resources/icons/text5377.ico +0 -0
- PYME/resources/icons/text5377.png +0 -0
- PYME/resources/icons/tracks.png +0 -0
- PYME/resources/icons/tracks.svg +19 -0
- PYME/resources/icons/view-front.png +0 -0
- PYME/resources/icons/view-home.png +0 -0
- PYME/resources/icons/view-right.png +0 -0
- PYME/resources/icons/view-top.png +0 -0
- PYME/resources/test_datasets/README.md +8 -0
- PYME/resources/test_datasets/t_im.tif +0 -0
- PYME/resources/test_datasets/test_csv.csv +4282 -0
- PYME/resources/test_datasets/test_hdf.hdf +0 -0
- PYME/resources/web/rule_inline.html +21 -0
- PYME/resources/web/ruleserver.html +75 -0
- PYME/resources/web/static/bootstrap.min.js +7 -0
- PYME/resources/web/static/cluster.css +137 -0
- PYME/resources/web/static/css/bootstrap-theme.css +587 -0
- PYME/resources/web/static/css/bootstrap-theme.min.css +6 -0
- PYME/resources/web/static/css/bootstrap.css +6757 -0
- PYME/resources/web/static/css/bootstrap.min.css +6 -0
- PYME/resources/web/static/css/flat_design_colors_full.css +306 -0
- PYME/resources/web/static/css/recipe_editor.css +106 -0
- PYME/resources/web/static/dashboard.css +106 -0
- PYME/resources/web/static/fileselector.js +77 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.eot +0 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.svg +288 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.ttf +0 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.woff +0 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.woff2 +0 -0
- PYME/resources/web/static/images/osd_flat/LICENSE.txt +116 -0
- PYME/resources/web/static/images/osd_flat/README.md +9 -0
- PYME/resources/web/static/images/osd_flat/fullpage_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/fullpage_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/fullpage_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/fullpage_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_rest.png +0 -0
- PYME/resources/web/static/jigna-vue-bare.js +1395 -0
- PYME/resources/web/static/jquery.min.js +2 -0
- PYME/resources/web/static/jstree.min.js +6 -0
- PYME/resources/web/static/openSeadragonGL.js +102 -0
- PYME/resources/web/static/openseadragon-svg-overlay.js +103 -0
- PYME/resources/web/static/openseadragon-viewerinputhook.min.js +6 -0
- PYME/resources/web/static/openseadragon.min.js +9 -0
- PYME/resources/web/static/recipe_editor.js +119 -0
- PYME/resources/web/static/shaders/fragment/lut.glsl +20 -0
- PYME/resources/web/static/shaders/fragment/none.glsl +17 -0
- PYME/resources/web/static/shaders/fragment/outline.glsl +43 -0
- PYME/resources/web/static/shaders/fragment/rect.glsl +7 -0
- PYME/resources/web/static/shaders/fragment/sobel3.glsl +71 -0
- PYME/resources/web/static/shaders/fragment/white.glsl +4 -0
- PYME/resources/web/static/shaders/vertex/rect.glsl +22 -0
- PYME/resources/web/static/shaders/vertex/square.glsl +9 -0
- PYME/resources/web/static/utils.js +3 -0
- PYME/resources/web/static/viaWebGL.js +217 -0
- PYME/setup.py +109 -0
- PYME/setup_exe.py +57 -0
- PYME/simulation/__init__.py +0 -0
- PYME/simulation/locify.py +319 -0
- PYME/simulation/pointsets.py +279 -0
- PYME/simulation/wormlike.py +99 -0
- PYME/simulation/wormlike2.py +198 -0
- PYME/simulation/wormlike3.py +197 -0
- PYME/simulation/wormlike_curled.py +104 -0
- PYME/tileviewer/__init__.py +0 -0
- PYME/tileviewer/templates/roi_list.html +12 -0
- PYME/tileviewer/templates/tileviewer.html +247 -0
- PYME/tileviewer/tileviewer.py +207 -0
- PYME/ui/AUIFrame.py +279 -0
- PYME/ui/MetadataTree.py +469 -0
- PYME/ui/__init__.py +4 -0
- PYME/ui/about_dlg.py +29 -0
- PYME/ui/autoFoldPanel.py +643 -0
- PYME/ui/cascading_layout.py +45 -0
- PYME/ui/crop_dialog.py +145 -0
- PYME/ui/custom_traits_editors.py +508 -0
- PYME/ui/editFilterDialog.py +80 -0
- PYME/ui/editList.py +40 -0
- PYME/ui/fastGraph.py +240 -0
- PYME/ui/filterPane.py +348 -0
- PYME/ui/histLimits.py +543 -0
- PYME/ui/layerFoldPanel.py +232 -0
- PYME/ui/manualFoldPanel.py +870 -0
- PYME/ui/mytimer.py +116 -0
- PYME/ui/patch_traitsui.py +151 -0
- PYME/ui/progress.py +160 -0
- PYME/ui/recArrayView.py +145 -0
- PYME/ui/selection.py +71 -0
- PYME/ui/shell.py +37 -0
- PYME/ui/traitsui_constants.py +91 -0
- PYME/ui/wx_compat.py +43 -0
- PYME/update_version.py +159 -0
- PYME/util/__init__.py +3 -0
- PYME/util/authenticate.py +164 -0
- PYME/util/execfile.py +21 -0
- PYME/util/fProfile/__init__.py +1 -0
- PYME/util/fProfile/convertProfile.py +117 -0
- PYME/util/fProfile/fProfile.py +162 -0
- PYME/util/fProfile/html/404.html +60 -0
- PYME/util/fProfile/html/css/main.css +258 -0
- PYME/util/fProfile/html/css/normalize.css +427 -0
- PYME/util/fProfile/html/css/normalize.min.css +1 -0
- PYME/util/fProfile/html/index.html +64 -0
- PYME/util/fProfile/html/js/main.js +492 -0
- PYME/util/fProfile/html/js/plugins.js +24 -0
- PYME/util/fProfile/html/js/vendor/crossfilter.min.js +1 -0
- PYME/util/fProfile/html/js/vendor/jquery-1.11.2.min.js +4 -0
- PYME/util/fProfile/html/js/vendor/modernizr-2.8.3.min.js +4 -0
- PYME/util/fProfile/html/js/vendor/tinycolor-min.js +4 -0
- PYME/util/fProfile/viewProfile.py +30 -0
- PYME/util/install_dependencies.py +95 -0
- PYME/util/log_verbosity.py +11 -0
- PYME/util/mProfile/__init__.py +1 -0
- PYME/util/mProfile/colorize_db_t.py +297 -0
- PYME/util/mProfile/mProfile.py +164 -0
- PYME/util/mProfile/p.py +101 -0
- PYME/util/mProfile/tProfile.py +165 -0
- PYME/util/pymelauncher.py +47 -0
- PYME/util/shmarray/__init__.py +0 -0
- PYME/util/shmarray/shmTest.py +74 -0
- PYME/util/shmarray/shmarray.py +165 -0
- PYME/util/webframework.py +365 -0
- PYME/version.py +65 -0
- python_microscopy-25.6.5.dist-info/METADATA +68 -0
- python_microscopy-25.6.5.dist-info/RECORD +1277 -0
- python_microscopy-25.6.5.dist-info/WHEEL +4 -0
|
@@ -0,0 +1,1386 @@
|
|
|
1
|
+
from .base import register_module, ModuleBase, Filter
|
|
2
|
+
from .traits import Input, Output, Float, Enum, CStr, Str, Bool, Int, List, FileOrURI, Dict
|
|
3
|
+
|
|
4
|
+
import numpy as np
|
|
5
|
+
from PYME.IO import tabular
|
|
6
|
+
from PYME.LMVis import renderers
|
|
7
|
+
import logging
|
|
8
|
+
logger = logging.getLogger(__name__)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@register_module('ExtractTableChannel')
|
|
12
|
+
class ExtractTableChannel(ModuleBase):
|
|
13
|
+
"""Create and return a ColourFilter which has filtered out one colour channel from a table of localizations."""
|
|
14
|
+
inputName = Input('measurements')
|
|
15
|
+
channel = CStr('everything')
|
|
16
|
+
outputName = Output('filtered')
|
|
17
|
+
|
|
18
|
+
# def execute(self, namespace):
|
|
19
|
+
# inp = namespace[self.inputName]
|
|
20
|
+
|
|
21
|
+
# map = tabular.ColourFilter(inp, currentColour=self.channel)
|
|
22
|
+
|
|
23
|
+
# if 'mdh' in dir(inp):
|
|
24
|
+
# map.mdh = inp.mdh
|
|
25
|
+
|
|
26
|
+
# namespace[self.outputName] = map
|
|
27
|
+
|
|
28
|
+
def run(self, inputName):
|
|
29
|
+
return tabular.ColourFilter(inputName, currentColour=self.channel)
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
def _colour_choices(self):
|
|
33
|
+
#try and find the available column names
|
|
34
|
+
try:
|
|
35
|
+
return tabular.ColourFilter.get_colour_chans(self._parent.namespace[self.inputName])
|
|
36
|
+
except:
|
|
37
|
+
return []
|
|
38
|
+
|
|
39
|
+
def _view_items(self, params=None):
|
|
40
|
+
from traitsui.api import Item
|
|
41
|
+
from PYME.ui.custom_traits_editors import CBEditor
|
|
42
|
+
return [Item('channel', editor=CBEditor(choices=self._colour_choices)),]
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@register_module('DensityMapping')
|
|
47
|
+
class DensityMapping(ModuleBase):
|
|
48
|
+
""" Use density estimation methods to generate an image from localizations
|
|
49
|
+
|
|
50
|
+
"""
|
|
51
|
+
inputLocalizations = Input('localizations')
|
|
52
|
+
outputImage = Output('output')
|
|
53
|
+
|
|
54
|
+
available_renderers = sorted(renderers.RENDERERS.keys())
|
|
55
|
+
|
|
56
|
+
renderingModule = Enum(available_renderers)#, default_value='Jittered Triangulation')
|
|
57
|
+
|
|
58
|
+
pixelSize = Float(5)
|
|
59
|
+
jitterVariable = CStr('1.0')
|
|
60
|
+
jitterScale = Float(1.0)
|
|
61
|
+
jitterVariableZ = CStr('1.0')
|
|
62
|
+
jitterScaleZ = Float(1.0)
|
|
63
|
+
MCProbability = Float(1.0)
|
|
64
|
+
numSamples = Int(10)
|
|
65
|
+
colours = List(Str, ['all',])
|
|
66
|
+
zBoundsMode = Enum(['manual', 'min-max'])
|
|
67
|
+
zBounds = List(Float, [-500, 500])
|
|
68
|
+
zSliceThickness = Float(50.0)
|
|
69
|
+
softRender = Bool(True)
|
|
70
|
+
xyBoundsMode = Enum(['estimate', 'inherit', 'metadata', 'manual'])
|
|
71
|
+
manualXYBounds = List(Float, [0,0,5e3, 5e3])
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
# def execute(self, namespace):
|
|
75
|
+
# from PYME.IO.image import ImageBounds
|
|
76
|
+
# inp = namespace[self.inputLocalizations]
|
|
77
|
+
# if not isinstance(inp, tabular.ColourFilter):
|
|
78
|
+
# cf = tabular.ColourFilter(inp, None)
|
|
79
|
+
|
|
80
|
+
# print('Created colour filter with chans: %s' % cf.getColourChans())
|
|
81
|
+
# cf.mdh = inp.mdh
|
|
82
|
+
# else:
|
|
83
|
+
# cf = inp
|
|
84
|
+
|
|
85
|
+
# #default to taking min and max localizations as image bounds
|
|
86
|
+
# imb = ImageBounds.estimateFromSource(inp)
|
|
87
|
+
|
|
88
|
+
# if self.zBoundsMode == 'min-max':
|
|
89
|
+
# self.zBounds[0], self.zBounds[1] = float(imb.z0), float(imb.z1)
|
|
90
|
+
|
|
91
|
+
# if (self.xyBoundsMode == 'inherit') and not (getattr(inp, 'imageBounds', None) is None):
|
|
92
|
+
# imb = inp.imageBounds
|
|
93
|
+
# elif self.xyBoundsMode == 'metadata':
|
|
94
|
+
# imb = ImageBounds.extractFromMetadata(inp.mdh)
|
|
95
|
+
# elif self.xyBoundsMode == 'manual':
|
|
96
|
+
# imb.x0, imb.y0, imb.x1, imb.y1 = self.manualXYBounds
|
|
97
|
+
|
|
98
|
+
# cf.imageBounds = imb
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
# renderer = renderers.RENDERERS[str(self.renderingModule)](None, cf)
|
|
102
|
+
|
|
103
|
+
# logger.debug('about to generate')
|
|
104
|
+
|
|
105
|
+
# out = renderer.Generate(self.trait_get())
|
|
106
|
+
|
|
107
|
+
# logger.debug(f'generated:{out.data_xyztc.shape}')
|
|
108
|
+
|
|
109
|
+
# namespace[self.outputImage] = out
|
|
110
|
+
|
|
111
|
+
def run(self, inputLocalizations):
|
|
112
|
+
from PYME.IO.image import ImageBounds
|
|
113
|
+
inp = inputLocalizations
|
|
114
|
+
if not isinstance(inp, tabular.ColourFilter):
|
|
115
|
+
cf = tabular.ColourFilter(inp, None)
|
|
116
|
+
|
|
117
|
+
print('Created colour filter with chans: %s' % cf.getColourChans())
|
|
118
|
+
cf.mdh = inp.mdh
|
|
119
|
+
else:
|
|
120
|
+
cf = inp
|
|
121
|
+
|
|
122
|
+
#default to taking min and max localizations as image bounds
|
|
123
|
+
imb = ImageBounds.estimateFromSource(inp)
|
|
124
|
+
|
|
125
|
+
if self.zBoundsMode == 'min-max':
|
|
126
|
+
self.zBounds[0], self.zBounds[1] = float(imb.z0), float(imb.z1)
|
|
127
|
+
|
|
128
|
+
if (self.xyBoundsMode == 'inherit') and not (getattr(inp, 'imageBounds', None) is None):
|
|
129
|
+
imb = inp.imageBounds
|
|
130
|
+
elif self.xyBoundsMode == 'metadata':
|
|
131
|
+
imb = ImageBounds.extractFromMetadata(inp.mdh)
|
|
132
|
+
elif self.xyBoundsMode == 'manual':
|
|
133
|
+
imb.x0, imb.y0, imb.x1, imb.y1 = self.manualXYBounds
|
|
134
|
+
|
|
135
|
+
cf.imageBounds = imb
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
renderer = renderers.RENDERERS[str(self.renderingModule)](None, cf)
|
|
139
|
+
|
|
140
|
+
logger.debug('about to generate')
|
|
141
|
+
|
|
142
|
+
out = renderer.Generate(self.trait_get())
|
|
143
|
+
|
|
144
|
+
logger.debug(f'generated:{out.data_xyztc.shape}')
|
|
145
|
+
|
|
146
|
+
return out
|
|
147
|
+
|
|
148
|
+
def _view_items(self, params=None):
|
|
149
|
+
from traitsui.api import Group, Item, CSVListEditor
|
|
150
|
+
return [Item('renderingModule'),
|
|
151
|
+
Item('pixelSize'),
|
|
152
|
+
Item('colours', style='text',editor=CSVListEditor(auto_set=False, enter_set=True)),
|
|
153
|
+
#Item('softRender'),
|
|
154
|
+
Group(
|
|
155
|
+
Item('jitterVariable'),
|
|
156
|
+
Item('jitterScale'),
|
|
157
|
+
Item('jitterVariableZ', visible_when='"3D" in renderingModule'),
|
|
158
|
+
Item('jitterScaleZ', visible_when='"3D" in renderingModule'),
|
|
159
|
+
Item('numSamples', visible_when='"Triangulation" in renderingModule'),
|
|
160
|
+
Item('MCProbability', visible_when='"Triangulation" in renderingModule'),
|
|
161
|
+
label='Jittering/Gaussian Size', visible_when='not (("Histogram" in renderingModule) or (renderingModule=="Current"))'),
|
|
162
|
+
Group(
|
|
163
|
+
Item('zSliceThickness'),
|
|
164
|
+
Item('zBoundsMode'),
|
|
165
|
+
Item('zBounds', visible_when='zBoundsMode=="manual"',editor=CSVListEditor(auto_set=False, enter_set=True)),
|
|
166
|
+
label='3D', visible_when='"3D" in renderingModule'),
|
|
167
|
+
Group(
|
|
168
|
+
Item('xyBoundsMode'),
|
|
169
|
+
Item('manualXYBounds', visible_when='xyBoundsMode=="manual"',editor=CSVListEditor(auto_set=False, enter_set=True)),
|
|
170
|
+
label='Output Image Size',
|
|
171
|
+
),
|
|
172
|
+
]
|
|
173
|
+
|
|
174
|
+
class DictWrapper(dict):
|
|
175
|
+
pass
|
|
176
|
+
@register_module('AddPipelineDerivedVars')
|
|
177
|
+
class Pipelineify(ModuleBase):
|
|
178
|
+
"""
|
|
179
|
+
Perform standard mappings, including those derived from acquisition events.
|
|
180
|
+
|
|
181
|
+
Parameters
|
|
182
|
+
----------
|
|
183
|
+
inputFitResults : string - the name of a tabular.TabularBase object
|
|
184
|
+
Typically the FitResults table of an h5r file
|
|
185
|
+
inputEvents : string - name of a tabular.TabularBase object containing acquisition events [optional]
|
|
186
|
+
This is not usually required as the IO methods attach `.events` as a datasource attribute. Use when events come
|
|
187
|
+
from a separate file or when there are intervening processing steps between IO and this module (the `.events`
|
|
188
|
+
attribute does not propagate through recipe modules).
|
|
189
|
+
TODO - do we really want to be attaching events as an attribute or should they be there own entry in the recipe namespace
|
|
190
|
+
TODO - should we change this to the processed events???
|
|
191
|
+
pixelSizeNM : float
|
|
192
|
+
Scaling factor to get 'x' and 'y' into units of nanometers. Useful if handling external data input in pixel units. Defaults to 1.
|
|
193
|
+
|
|
194
|
+
Returns
|
|
195
|
+
-------
|
|
196
|
+
outputLocalizations : tabular.MappingFilter
|
|
197
|
+
|
|
198
|
+
"""
|
|
199
|
+
inputFitResults = Input('FitResults')
|
|
200
|
+
inputEvents = Input('')
|
|
201
|
+
|
|
202
|
+
# Fiducial table input
|
|
203
|
+
# inputDriftResults = Input('')
|
|
204
|
+
# TODO - to replicate the pipeline input processing, we should take inputFitResults and inputDriftResults and output
|
|
205
|
+
# 'Localisations' and 'Fiducials' (the fiducials get some, but not all of the manipulations and extra columns). Should
|
|
206
|
+
# we expand this module, or pass the fiducials though in the same way as the fit results, living with the fact that
|
|
207
|
+
# there will be extra columns?
|
|
208
|
+
|
|
209
|
+
pixelSizeNM = Float(1, label='nanometer units',
|
|
210
|
+
desc="scaling factor to get 'x' and 'y' into units of nanometers. Useful if handling external data input in pixel units")
|
|
211
|
+
|
|
212
|
+
foreshortening = Float(1.0, desc='scaling factor to correct for foreshortening in z')
|
|
213
|
+
|
|
214
|
+
outputLocalizations = Output('Localizations')
|
|
215
|
+
outputEventMaps = Output('event_maps')
|
|
216
|
+
|
|
217
|
+
# def execute(self, namespace):
|
|
218
|
+
# from PYME.LMVis import pipeline
|
|
219
|
+
# fitResults = namespace[self.inputFitResults]
|
|
220
|
+
# mdh = fitResults.mdh
|
|
221
|
+
|
|
222
|
+
# mapped_ds = tabular.MappingFilter(fitResults)
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
# if not self.pixelSizeNM == 1: # TODO - check close instead?
|
|
226
|
+
# mapped_ds.addVariable('pixelSize', self.pixelSizeNM)
|
|
227
|
+
# mapped_ds.setMapping('x', 'x*pixelSize')
|
|
228
|
+
# mapped_ds.setMapping('y', 'y*pixelSize')
|
|
229
|
+
|
|
230
|
+
# #extract information from any events
|
|
231
|
+
# if self.inputEvents != '':
|
|
232
|
+
# # Use specified table for events if given (otherwise look for a `.events` attribute on the input data
|
|
233
|
+
# # TODO: resolve how best to handle events (i.e. should they be a separate table, or should they be attached to data tables)
|
|
234
|
+
# events = namespace.get(self.inputEvents, None)
|
|
235
|
+
# else:
|
|
236
|
+
# try:
|
|
237
|
+
# events = fitResults.events
|
|
238
|
+
# except AttributeError:
|
|
239
|
+
# logger.debug('no events found')
|
|
240
|
+
# events = None
|
|
241
|
+
|
|
242
|
+
# if isinstance(events, tabular.TabularBase):
|
|
243
|
+
# events = events.to_recarray()
|
|
244
|
+
|
|
245
|
+
# ev_maps, ev_charts = pipeline._processEvents(mapped_ds, events, mdh)
|
|
246
|
+
# pipeline._add_missing_ds_keys(mapped_ds, ev_maps)
|
|
247
|
+
|
|
248
|
+
# #Fit module specific filter settings
|
|
249
|
+
# if 'Analysis.FitModule' in mdh.getEntryNames():
|
|
250
|
+
# fitModule = mdh['Analysis.FitModule']
|
|
251
|
+
|
|
252
|
+
# if 'LatGaussFitFR' in fitModule:
|
|
253
|
+
# # TODO - move getPhotonNums() out of pipeline
|
|
254
|
+
# mapped_ds.addColumn('nPhotons', pipeline.getPhotonNums(mapped_ds, mdh))
|
|
255
|
+
|
|
256
|
+
# if 'SplitterFitFNR' in fitModule:
|
|
257
|
+
# mapped_ds.addColumn('nPhotonsg', pipeline.getPhotonNums({'A': mapped_ds['fitResults_Ag'], 'sig': mapped_ds['fitResults_sigma']}, mdh))
|
|
258
|
+
# mapped_ds.addColumn('nPhotonsr', pipeline.getPhotonNums({'A': mapped_ds['fitResults_Ar'], 'sig': mapped_ds['fitResults_sigma']}, mdh))
|
|
259
|
+
# mapped_ds.setMapping('nPhotons', 'nPhotonsg+nPhotonsr')
|
|
260
|
+
|
|
261
|
+
# mapped_ds.mdh = mdh
|
|
262
|
+
|
|
263
|
+
# namespace[self.outputLocalizations] = mapped_ds
|
|
264
|
+
|
|
265
|
+
def run(self, inputFitResults, inputEvents=None):
|
|
266
|
+
from PYME.LMVis import pipeline
|
|
267
|
+
from PYME.IO import MetaDataHandler
|
|
268
|
+
fitResults = inputFitResults
|
|
269
|
+
mdh = MetaDataHandler.DictMDHandler(fitResults.mdh)
|
|
270
|
+
|
|
271
|
+
mapped_ds = tabular.MappingFilter(fitResults)
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
if not self.pixelSizeNM == 1: # TODO - check close instead?
|
|
275
|
+
mapped_ds.addVariable('pixelSize', self.pixelSizeNM)
|
|
276
|
+
mapped_ds.setMapping('x', 'x*pixelSize')
|
|
277
|
+
mapped_ds.setMapping('y', 'y*pixelSize')
|
|
278
|
+
|
|
279
|
+
#extract information from any events
|
|
280
|
+
if inputEvents:
|
|
281
|
+
events = inputEvents
|
|
282
|
+
else:
|
|
283
|
+
try:
|
|
284
|
+
events = fitResults.events
|
|
285
|
+
except AttributeError:
|
|
286
|
+
logger.debug('no events found')
|
|
287
|
+
events = None
|
|
288
|
+
|
|
289
|
+
if isinstance(events, tabular.TabularBase):
|
|
290
|
+
events = events.to_recarray()
|
|
291
|
+
|
|
292
|
+
ev_maps = pipeline._processEvents(mapped_ds, events, mdh)
|
|
293
|
+
pipeline._add_missing_ds_keys(mapped_ds, ev_maps)
|
|
294
|
+
mapped_ds.set_variables(foreShort=self.foreshortening)
|
|
295
|
+
|
|
296
|
+
#Fit module specific filter settings
|
|
297
|
+
if 'Analysis.FitModule' in mdh.getEntryNames():
|
|
298
|
+
fitModule = mdh['Analysis.FitModule']
|
|
299
|
+
|
|
300
|
+
if 'LatGaussFitFR' in fitModule:
|
|
301
|
+
# TODO - move getPhotonNums() out of pipeline
|
|
302
|
+
mapped_ds.addColumn('nPhotons', pipeline.getPhotonNums(mapped_ds, mdh))
|
|
303
|
+
|
|
304
|
+
if 'SplitterFitFNR' in fitModule:
|
|
305
|
+
mapped_ds.addColumn('nPhotonsg', pipeline.getPhotonNums({'A': mapped_ds['fitResults_Ag'], 'sig': mapped_ds['fitResults_sigma']}, mdh))
|
|
306
|
+
mapped_ds.addColumn('nPhotonsr', pipeline.getPhotonNums({'A': mapped_ds['fitResults_Ar'], 'sig': mapped_ds['fitResults_sigma']}, mdh))
|
|
307
|
+
mapped_ds.setMapping('nPhotons', 'nPhotonsg+nPhotonsr')
|
|
308
|
+
|
|
309
|
+
mapped_ds.mdh = mdh
|
|
310
|
+
|
|
311
|
+
return {'outputLocalizations' : mapped_ds, 'outputEventMaps' : DictWrapper(ev_maps)}
|
|
312
|
+
|
|
313
|
+
@register_module("ProcessColour")
|
|
314
|
+
class ProcessColour(ModuleBase):
|
|
315
|
+
input = Input('localizations')
|
|
316
|
+
output = Output('colour_mapped')
|
|
317
|
+
|
|
318
|
+
# ratios & dyes for ratiometric colour - maps species name to floating point ratio
|
|
319
|
+
# Note that these get filled in automatically from the metadata but will get saved with the recipe when the recipe
|
|
320
|
+
# is saved. If you want a generic recipe, you will need to manually remove the dye entries from the .yaml file
|
|
321
|
+
# TODO - do this automatically somehow?
|
|
322
|
+
# TODO - default is to override saved values with those from metadata. Change this?
|
|
323
|
+
species_ratios = Dict(str, float)
|
|
324
|
+
species_dyes = Dict(str, str)
|
|
325
|
+
|
|
326
|
+
ratios_from_metadata = Bool(True)
|
|
327
|
+
|
|
328
|
+
def _get_dye_ratios_from_metadata(self, mdh):
|
|
329
|
+
from PYME.LMVis import dyeRatios
|
|
330
|
+
|
|
331
|
+
labels = mdh.getOrDefault('Sample.Labelling', [])
|
|
332
|
+
seen_structures = []
|
|
333
|
+
|
|
334
|
+
for structure, dye in labels:
|
|
335
|
+
#info might be unicode - convert to a standard string to keep traits happy
|
|
336
|
+
structure = str(structure)
|
|
337
|
+
dye = str(dye)
|
|
338
|
+
|
|
339
|
+
if structure in seen_structures:
|
|
340
|
+
strucname = structure + '_1'
|
|
341
|
+
else:
|
|
342
|
+
strucname = structure
|
|
343
|
+
seen_structures.append(structure)
|
|
344
|
+
|
|
345
|
+
ratio = dyeRatios.getRatio(dye, mdh)
|
|
346
|
+
|
|
347
|
+
if not ratio is None:
|
|
348
|
+
self.species_ratios[strucname] = ratio
|
|
349
|
+
self.species_dyes[strucname] = dye
|
|
350
|
+
|
|
351
|
+
# def execute(self, namespace):
|
|
352
|
+
# input = namespace[self.input]
|
|
353
|
+
# mdh = input.mdh
|
|
354
|
+
|
|
355
|
+
# if self.ratios_from_metadata:
|
|
356
|
+
# # turn off invalidation so we don't get a recursive loop. TODO - fix this properly as it's gross to be changing
|
|
357
|
+
# # our parameters here
|
|
358
|
+
# invalidate = self._invalidate_parent
|
|
359
|
+
# self._invalidate_parent = False
|
|
360
|
+
# self._get_dye_ratios_from_metadata(mdh)
|
|
361
|
+
# self._invalidate_parent = invalidate
|
|
362
|
+
|
|
363
|
+
# output = tabular.MappingFilter(input)
|
|
364
|
+
# output.mdh = mdh
|
|
365
|
+
|
|
366
|
+
# if 'gFrac' in output.keys():
|
|
367
|
+
# #ratiometric
|
|
368
|
+
# #raise NotImplementedError('Ratiometric processing in recipes not implemented yet')
|
|
369
|
+
# for structure, ratio in self.species_ratios.items():
|
|
370
|
+
# if not ratio is None:
|
|
371
|
+
# output.setMapping('p_%s' % structure,
|
|
372
|
+
# 'exp(-(%f - gFrac)**2/(2*error_gFrac**2))/(error_gFrac*sqrt(2*numpy.pi))' % ratio)
|
|
373
|
+
# else:
|
|
374
|
+
# if 'probe' in output.keys():
|
|
375
|
+
# #non-ratiometric (i.e. sequential) colour
|
|
376
|
+
# #color channel is given in 'probe' column
|
|
377
|
+
# output.setMapping('ColourNorm', '1.0 + 0*probe')
|
|
378
|
+
|
|
379
|
+
# for i in range(int(output['probe'].min()), int(output['probe'].max() + 1)):
|
|
380
|
+
# output.setMapping('p_chan%d' % i, '1.0*(probe == %d)' % i)
|
|
381
|
+
|
|
382
|
+
# nSeqCols = mdh.getOrDefault('Protocol.NumberSequentialColors', 1)
|
|
383
|
+
# if nSeqCols > 1:
|
|
384
|
+
# for i in range(nSeqCols):
|
|
385
|
+
# output.setMapping('ColourNorm', '1.0 + 0*t')
|
|
386
|
+
# cr = mdh['Protocol.ColorRange%d' % i]
|
|
387
|
+
# output.setMapping('p_chan%d' % i, '(t>= %d)*(t<%d)' % cr)
|
|
388
|
+
|
|
389
|
+
# cached_output = tabular.CachingResultsFilter(output)
|
|
390
|
+
# #cached_output.mdh = output.mdh
|
|
391
|
+
# namespace[self.output] = cached_output
|
|
392
|
+
|
|
393
|
+
def run(self, input):
|
|
394
|
+
mdh = input.mdh
|
|
395
|
+
|
|
396
|
+
if self.ratios_from_metadata:
|
|
397
|
+
# turn off invalidation so we don't get a recursive loop. TODO - fix this properly as it's gross to be changing
|
|
398
|
+
# our parameters here
|
|
399
|
+
invalidate = self._invalidate_parent
|
|
400
|
+
self._invalidate_parent = False
|
|
401
|
+
self._get_dye_ratios_from_metadata(mdh)
|
|
402
|
+
self._invalidate_parent = invalidate
|
|
403
|
+
|
|
404
|
+
output = tabular.MappingFilter(input)
|
|
405
|
+
output.mdh = mdh
|
|
406
|
+
|
|
407
|
+
if 'gFrac' in output.keys():
|
|
408
|
+
#ratiometric
|
|
409
|
+
#raise NotImplementedError('Ratiometric processing in recipes not implemented yet')
|
|
410
|
+
for structure, ratio in self.species_ratios.items():
|
|
411
|
+
if not ratio is None:
|
|
412
|
+
output.setMapping('p_%s' % structure,
|
|
413
|
+
'exp(-(%f - gFrac)**2/(2*error_gFrac**2))/(error_gFrac*sqrt(2*numpy.pi))' % ratio)
|
|
414
|
+
else:
|
|
415
|
+
if 'probe' in output.keys():
|
|
416
|
+
#non-ratiometric (i.e. sequential) colour
|
|
417
|
+
#color channel is given in 'probe' column
|
|
418
|
+
output.setMapping('ColourNorm', '1.0 + 0*probe')
|
|
419
|
+
|
|
420
|
+
for i in range(int(output['probe'].min()), int(output['probe'].max() + 1)):
|
|
421
|
+
output.setMapping('p_chan%d' % i, '1.0*(probe == %d)' % i)
|
|
422
|
+
|
|
423
|
+
nSeqCols = mdh.getOrDefault('Protocol.NumberSequentialColors', 1)
|
|
424
|
+
if nSeqCols > 1:
|
|
425
|
+
for i in range(nSeqCols):
|
|
426
|
+
output.setMapping('ColourNorm', '1.0 + 0*t')
|
|
427
|
+
cr = mdh['Protocol.ColorRange%d' % i]
|
|
428
|
+
output.setMapping('p_chan%d' % i, '(t>= %d)*(t<%d)' % cr)
|
|
429
|
+
|
|
430
|
+
cached_output = tabular.CachingResultsFilter(output)
|
|
431
|
+
#cached_output.mdh = output.mdh
|
|
432
|
+
return cached_output
|
|
433
|
+
|
|
434
|
+
|
|
435
|
+
@register_module('TimeBlocks')
|
|
436
|
+
class TimeBlocks(ModuleBase):
|
|
437
|
+
"""
|
|
438
|
+
|
|
439
|
+
Divides series into alternating time blocks to generate 2 fake colour channels for Fourier Ring / Fourier shell correlation.
|
|
440
|
+
|
|
441
|
+
This is probably a better approach than taking random subsets as the later will tend to generate unrealistically high
|
|
442
|
+
correlation values for repeated localizations.
|
|
443
|
+
|
|
444
|
+
Adapted from Christian Soeller's 'splitRender' implementation.
|
|
445
|
+
"""
|
|
446
|
+
input = Input('localizations')
|
|
447
|
+
output = Output('time_blocks')
|
|
448
|
+
|
|
449
|
+
block_size = Int(100)
|
|
450
|
+
|
|
451
|
+
# def execute(self, namespace):
|
|
452
|
+
# input = namespace[self.input]
|
|
453
|
+
# mdh = input.mdh
|
|
454
|
+
|
|
455
|
+
# output = tabular.MappingFilter(input)
|
|
456
|
+
# output.mdh = mdh
|
|
457
|
+
|
|
458
|
+
# output.addColumn('block_id', np.mod((output['t']/self.block_size).astype('int'),2))
|
|
459
|
+
|
|
460
|
+
# channel_names = [k for k in input.keys() if k.startswith('p_')]
|
|
461
|
+
|
|
462
|
+
# print(channel_names)
|
|
463
|
+
# print(input.keys())
|
|
464
|
+
|
|
465
|
+
# if len(channel_names) == 0:
|
|
466
|
+
# #single channel data - no channels defined.
|
|
467
|
+
# output.setMapping('ColourNorm', '1.0 + 0*t')
|
|
468
|
+
# output.setMapping('p_block0', '1.0*block_id')
|
|
469
|
+
# output.setMapping('p_block1', '1.0 - block_id')
|
|
470
|
+
# else:
|
|
471
|
+
# #have colour channels - subdivide them
|
|
472
|
+
# for k in channel_names:
|
|
473
|
+
# output.setMapping('%s_block0' % k, '%s*block_id' % k)
|
|
474
|
+
# output.setMapping('%s_block1' % k, '%s*(1.0 - block_id)' % k)
|
|
475
|
+
|
|
476
|
+
# #hide original channel names
|
|
477
|
+
# output.hidden_columns.extend(channel_names)
|
|
478
|
+
|
|
479
|
+
|
|
480
|
+
# namespace[self.output] = output
|
|
481
|
+
|
|
482
|
+
def run(self, input):
|
|
483
|
+
output = tabular.MappingFilter(input)
|
|
484
|
+
|
|
485
|
+
output.addColumn('block_id', np.mod((output['t']/self.block_size).astype('int'),2))
|
|
486
|
+
|
|
487
|
+
channel_names = [k for k in input.keys() if k.startswith('p_')]
|
|
488
|
+
|
|
489
|
+
#print(channel_names)
|
|
490
|
+
#print(input.keys())
|
|
491
|
+
|
|
492
|
+
if len(channel_names) == 0:
|
|
493
|
+
#single channel data - no channels defined.
|
|
494
|
+
output.setMapping('ColourNorm', '1.0 + 0*t')
|
|
495
|
+
output.setMapping('p_block0', '1.0*block_id')
|
|
496
|
+
output.setMapping('p_block1', '1.0 - block_id')
|
|
497
|
+
else:
|
|
498
|
+
#have colour channels - subdivide them
|
|
499
|
+
for k in channel_names:
|
|
500
|
+
output.setMapping('%s_block0' % k, '%s*block_id' % k)
|
|
501
|
+
output.setMapping('%s_block1' % k, '%s*(1.0 - block_id)' % k)
|
|
502
|
+
|
|
503
|
+
#hide original channel names
|
|
504
|
+
output.hidden_columns.extend(channel_names)
|
|
505
|
+
|
|
506
|
+
return output
|
|
507
|
+
|
|
508
|
+
|
|
509
|
+
@register_module('MergeClumps')
|
|
510
|
+
class MergeClumps(ModuleBase):
|
|
511
|
+
"""Create a new mapping object which derives mapped keys from original ones"""
|
|
512
|
+
inputName = Input('clumped')
|
|
513
|
+
outputName = Output('merged')
|
|
514
|
+
labelKey = CStr('clumpIndex')
|
|
515
|
+
discardTrivial = Bool(False)
|
|
516
|
+
|
|
517
|
+
# def execute(self, namespace):
|
|
518
|
+
# from PYME.Analysis.points.DeClump import pyDeClump
|
|
519
|
+
|
|
520
|
+
# inp = namespace[self.inputName]
|
|
521
|
+
# grouped = pyDeClump.mergeClumps(inp, labelKey=self.labelKey)
|
|
522
|
+
# try:
|
|
523
|
+
# grouped.mdh = inp.mdh
|
|
524
|
+
# except AttributeError:
|
|
525
|
+
# pass
|
|
526
|
+
# grouped = pyDeClump.mergeClumps(inp, labelKey=self.labelKey, discard_trivial=self.discardTrivial)
|
|
527
|
+
# try:
|
|
528
|
+
# grouped.mdh = inp.mdh
|
|
529
|
+
# except AttributeError:
|
|
530
|
+
# pass
|
|
531
|
+
|
|
532
|
+
# namespace[self.outputName] = grouped
|
|
533
|
+
|
|
534
|
+
def run(self, inputName):
|
|
535
|
+
from PYME.Analysis.points.DeClump import pyDeClump
|
|
536
|
+
return pyDeClump.mergeClumps(inputName, labelKey=self.labelKey, discard_trivial=self.discardTrivial)
|
|
537
|
+
|
|
538
|
+
|
|
539
|
+
@register_module('IDTransientFrames')
|
|
540
|
+
class IDTransientFrames(ModuleBase): #FIXME - move to multi-view specific module and potentially rename (depending on whether we introduce scoping)
|
|
541
|
+
"""
|
|
542
|
+
Adds an 'isTransient' column to the input datasource so that one can filter localizations that are from frames
|
|
543
|
+
acquired during z-translation
|
|
544
|
+
"""
|
|
545
|
+
inputName = Input('zmapped')
|
|
546
|
+
inputEvents = Input('Events')
|
|
547
|
+
framesPerStep = Float()
|
|
548
|
+
outputName = Output('transientFiltered')
|
|
549
|
+
|
|
550
|
+
# def execute(self, namespace):
|
|
551
|
+
# from PYME.experimental import zMotionArtifactUtils
|
|
552
|
+
|
|
553
|
+
# inp = namespace[self.inputName]
|
|
554
|
+
|
|
555
|
+
# mapped = tabular.MappingFilter(inp)
|
|
556
|
+
|
|
557
|
+
# if 'mdh' not in dir(inp):
|
|
558
|
+
# if self.framesPerStep <= 0:
|
|
559
|
+
# raise RuntimeError('idTransientFrames needs metadata')
|
|
560
|
+
# else:
|
|
561
|
+
# fps = self.framesPerStep
|
|
562
|
+
# else:
|
|
563
|
+
# fps = inp.mdh['StackSettings.FramesPerStep']
|
|
564
|
+
|
|
565
|
+
# mask = zMotionArtifactUtils.flagMotionArtifacts(mapped, namespace[self.inputEvents], fps)
|
|
566
|
+
# mapped.addColumn('piezoUnstable', mask)
|
|
567
|
+
|
|
568
|
+
# mapped.mdh = inp.mdh
|
|
569
|
+
|
|
570
|
+
# namespace[self.outputName] = mapped
|
|
571
|
+
|
|
572
|
+
def run(self, inputName, inputEvents):
|
|
573
|
+
from PYME.experimental import zMotionArtifactUtils
|
|
574
|
+
|
|
575
|
+
mapped = tabular.MappingFilter(inputName)
|
|
576
|
+
|
|
577
|
+
if 'mdh' not in dir(inputName):
|
|
578
|
+
if self.framesPerStep <= 0:
|
|
579
|
+
raise RuntimeError('idTransientFrames needs metadata')
|
|
580
|
+
else:
|
|
581
|
+
fps = self.framesPerStep
|
|
582
|
+
else:
|
|
583
|
+
fps = inputName.mdh['StackSettings.FramesPerStep']
|
|
584
|
+
|
|
585
|
+
mask = zMotionArtifactUtils.flagMotionArtifacts(mapped, inputEvents, fps)
|
|
586
|
+
mapped.addColumn('piezoUnstable', mask)
|
|
587
|
+
|
|
588
|
+
return mapped
|
|
589
|
+
|
|
590
|
+
@register_module('DBSCANClustering')
|
|
591
|
+
class DBSCANClustering(ModuleBase):
|
|
592
|
+
"""
|
|
593
|
+
Performs DBSCAN clustering on input dictionary
|
|
594
|
+
|
|
595
|
+
Parameters
|
|
596
|
+
----------
|
|
597
|
+
searchRadius : float
|
|
598
|
+
search radius for clustering [nm]
|
|
599
|
+
minPtsForCore : int
|
|
600
|
+
number of points within SearchRadius required for a given point to be
|
|
601
|
+
considered a core point
|
|
602
|
+
|
|
603
|
+
Notes
|
|
604
|
+
-----
|
|
605
|
+
|
|
606
|
+
See `sklearn.cluster.dbscan` for more details about the underlying
|
|
607
|
+
algorithm and parameter meanings.
|
|
608
|
+
|
|
609
|
+
"""
|
|
610
|
+
import multiprocessing
|
|
611
|
+
inputName = Input('filtered')
|
|
612
|
+
|
|
613
|
+
columns = List(str, ['x', 'y', 'z'])
|
|
614
|
+
searchRadius = Float(10)
|
|
615
|
+
minClumpSize = Int(1)
|
|
616
|
+
|
|
617
|
+
#exposes sklearn parallelism. Recipe modules are generally assumed
|
|
618
|
+
#to be single-threaded. Enable at your own risk
|
|
619
|
+
multithreaded = Bool(False)
|
|
620
|
+
numberOfJobs = Int(max(multiprocessing.cpu_count()-1,1))
|
|
621
|
+
|
|
622
|
+
clumpColumnName = CStr('dbscanClumpID')
|
|
623
|
+
|
|
624
|
+
outputName = Output('dbscanClustered')
|
|
625
|
+
|
|
626
|
+
# def execute(self, namespace):
|
|
627
|
+
# from sklearn.cluster import dbscan
|
|
628
|
+
|
|
629
|
+
# inp = namespace[self.inputName]
|
|
630
|
+
# mapped = tabular.MappingFilter(inp)
|
|
631
|
+
|
|
632
|
+
# # Note that sklearn gives unclustered points label of -1, and first value starts at 0.
|
|
633
|
+
# if self.multithreaded:
|
|
634
|
+
# core_samp, dbLabels = dbscan(np.vstack([inp[k] for k in self.columns]).T,
|
|
635
|
+
# eps=self.searchRadius, min_samples=self.minClumpSize, n_jobs=self.numberOfJobs)
|
|
636
|
+
# else:
|
|
637
|
+
# #NB try-catch from Christians multithreaded example removed as I think we should see failure here
|
|
638
|
+
# core_samp, dbLabels = dbscan(np.vstack([inp[k] for k in self.columns]).T,
|
|
639
|
+
# eps=self.searchRadius, min_samples=self.minClumpSize)
|
|
640
|
+
|
|
641
|
+
# # shift dbscan labels up by one to match existing convention that a clumpID of 0 corresponds to unclumped
|
|
642
|
+
# mapped.addColumn(str(self.clumpColumnName), dbLabels + 1)
|
|
643
|
+
|
|
644
|
+
# # propogate metadata, if present
|
|
645
|
+
# try:
|
|
646
|
+
# mapped.mdh = inp.mdh
|
|
647
|
+
# except AttributeError:
|
|
648
|
+
# pass
|
|
649
|
+
|
|
650
|
+
# namespace[self.outputName] = mapped
|
|
651
|
+
|
|
652
|
+
def run(self, inputName):
|
|
653
|
+
from sklearn.cluster import dbscan
|
|
654
|
+
|
|
655
|
+
inp = inputName
|
|
656
|
+
mapped = tabular.MappingFilter(inp)
|
|
657
|
+
|
|
658
|
+
# Note that sklearn gives unclustered points label of -1, and first value starts at 0.
|
|
659
|
+
if self.multithreaded:
|
|
660
|
+
core_samp, dbLabels = dbscan(np.vstack([inp[k] for k in self.columns]).T,
|
|
661
|
+
eps=self.searchRadius, min_samples=self.minClumpSize, n_jobs=self.numberOfJobs)
|
|
662
|
+
else:
|
|
663
|
+
#NB try-catch from Christians multithreaded example removed as I think we should see failure here
|
|
664
|
+
core_samp, dbLabels = dbscan(np.vstack([inp[k] for k in self.columns]).T,
|
|
665
|
+
eps=self.searchRadius, min_samples=self.minClumpSize)
|
|
666
|
+
|
|
667
|
+
# shift dbscan labels up by one to match existing convention that a clumpID of 0 corresponds to unclumped
|
|
668
|
+
mapped.addColumn(str(self.clumpColumnName), dbLabels + 1)
|
|
669
|
+
|
|
670
|
+
return mapped
|
|
671
|
+
|
|
672
|
+
@property
|
|
673
|
+
def hide_in_overview(self):
|
|
674
|
+
return ['columns']
|
|
675
|
+
|
|
676
|
+
def _view_items(self, params=None):
|
|
677
|
+
from traitsui.api import Item, TextEditor
|
|
678
|
+
return [Item('columns', editor=TextEditor(auto_set=False, enter_set=True, evaluate=List(str))),
|
|
679
|
+
Item('searchRadius'),
|
|
680
|
+
Item('minClumpSize'),
|
|
681
|
+
Item('multithreaded'),
|
|
682
|
+
Item('numberOfJobs'),
|
|
683
|
+
Item('clumpColumnName'),]
|
|
684
|
+
|
|
685
|
+
|
|
686
|
+
|
|
687
|
+
#TODO - this is very specialized and probably doesn't belong here - at least not in this form
|
|
688
|
+
@register_module('ClusterCountVsImagingTime')
|
|
689
|
+
class ClusterCountVsImagingTime(ModuleBase):
|
|
690
|
+
"""
|
|
691
|
+
WARNING: This module will likely move, dissapear, or be refactored
|
|
692
|
+
|
|
693
|
+
ClusterCountVsImagingTime iteratively filters a dictionary-like object on t, and at each step counts the number of
|
|
694
|
+
labeled objects (e.g. DBSCAN clusters) which contain at least N-points. It does this for two N-points, so one can be
|
|
695
|
+
set according to density with all frames included, and the other can be set for one of the earlier frame-counts.
|
|
696
|
+
|
|
697
|
+
args:
|
|
698
|
+
stepSize: number of frames to add in on each iteration
|
|
699
|
+
labelsKey: key containing labels for each localization
|
|
700
|
+
lowerMinPtsPerCluster:
|
|
701
|
+
higherMinPtsPerCluster:
|
|
702
|
+
|
|
703
|
+
returns:
|
|
704
|
+
dictionary-like object with the following keys:
|
|
705
|
+
t: upper bound on frame number included in calculations on each iteration.
|
|
706
|
+
N_labelsWithLowMinPoints:
|
|
707
|
+
N_labelsWithHighMinPoints:
|
|
708
|
+
|
|
709
|
+
From wikipedia: "While minPts intuitively is the minimum cluster size, in some cases DBSCAN can produce smaller
|
|
710
|
+
clusters. A DBSCAN cluster consists of at least one core point. As other points may be border points to more than
|
|
711
|
+
one cluster, there is no guarantee that at least minPts points are included in every cluster."
|
|
712
|
+
"""
|
|
713
|
+
inputName = Input('input')
|
|
714
|
+
|
|
715
|
+
labelsKey = CStr('dbscanClumpID')
|
|
716
|
+
lowerMinPtsPerCluster = Int(3)
|
|
717
|
+
higherMinPtsPerCluster = Int(6)
|
|
718
|
+
stepSize = Int(3000)
|
|
719
|
+
|
|
720
|
+
outputName = Output('incremented')
|
|
721
|
+
|
|
722
|
+
# def execute(self, namespace):
|
|
723
|
+
# from PYME.IO import tabular
|
|
724
|
+
|
|
725
|
+
# if self.lowerMinPtsPerCluster > self.higherMinPtsPerCluster:
|
|
726
|
+
# print('Swapping low and high MinPtsPerCluster - input was reversed')
|
|
727
|
+
# temp = self.lowerMinPtsPerCluster
|
|
728
|
+
# self.lowerMinPtsPerCluster = self.higherMinPtsPerCluster
|
|
729
|
+
# self.higherMinPtsPerCluster = temp
|
|
730
|
+
|
|
731
|
+
# iters = (int(np.max(namespace[self.inputName]['t']))/int(self.stepSize)) + 2
|
|
732
|
+
|
|
733
|
+
# # other counts
|
|
734
|
+
# lowDensMinPtsClumps = np.empty(iters)
|
|
735
|
+
# lowDensMinPtsClumps[0] = 0
|
|
736
|
+
# hiDensMinPtsClumps = np.empty(iters)
|
|
737
|
+
# hiDensMinPtsClumps[0] = 0
|
|
738
|
+
# t = np.empty(iters)
|
|
739
|
+
# t[0] = 0
|
|
740
|
+
|
|
741
|
+
# inp = tabular.MappingFilter(namespace[self.inputName])
|
|
742
|
+
|
|
743
|
+
# for ind in range(1, iters): # start from 1 since t=[0,0] will yield no clumps
|
|
744
|
+
# # filter time
|
|
745
|
+
# inc = tabular.ResultsFilter(inp, t=[0, self.stepSize * ind])
|
|
746
|
+
# t[ind] = np.max(inc['t'])
|
|
747
|
+
|
|
748
|
+
# cid, counts = np.unique(inc[self.labelsKey], return_counts=True)
|
|
749
|
+
# # cmask = np.in1d(inc['DBSCAN_allFrames'], cid)
|
|
750
|
+
|
|
751
|
+
# cidL = cid[counts >= self.lowerMinPtsPerCluster]
|
|
752
|
+
# lowDensMinPtsClumps[ind] = np.sum(cidL != -1) # ignore unclumped in count
|
|
753
|
+
# cid = cid[counts >= self.higherMinPtsPerCluster]
|
|
754
|
+
# hiDensMinPtsClumps[ind] = np.sum(cid != -1) # ignore unclumped in count
|
|
755
|
+
|
|
756
|
+
|
|
757
|
+
# res = tabular.MappingFilter({'t': t,
|
|
758
|
+
# 'N_labelsWithLowMinPoints': lowDensMinPtsClumps,
|
|
759
|
+
# 'N_labelsWithHighMinPoints': hiDensMinPtsClumps})
|
|
760
|
+
|
|
761
|
+
# # propagate metadata, if present
|
|
762
|
+
# try:
|
|
763
|
+
# res.mdh = namespace[self.inputName].mdh
|
|
764
|
+
# except AttributeError:
|
|
765
|
+
# pass
|
|
766
|
+
|
|
767
|
+
# namespace[self.outputName] = res
|
|
768
|
+
|
|
769
|
+
def run(self, inputName):
|
|
770
|
+
from PYME.IO import tabular
|
|
771
|
+
|
|
772
|
+
inp = tabular.MappingFilter(inputName)
|
|
773
|
+
|
|
774
|
+
if self.lowerMinPtsPerCluster > self.higherMinPtsPerCluster:
|
|
775
|
+
print('Swapping low and high MinPtsPerCluster - input was reversed')
|
|
776
|
+
temp = self.lowerMinPtsPerCluster
|
|
777
|
+
self.lowerMinPtsPerCluster = self.higherMinPtsPerCluster
|
|
778
|
+
self.higherMinPtsPerCluster = temp
|
|
779
|
+
|
|
780
|
+
iters = (int(np.max(inp['t']))/int(self.stepSize)) + 2
|
|
781
|
+
|
|
782
|
+
# other counts
|
|
783
|
+
lowDensMinPtsClumps = np.empty(iters)
|
|
784
|
+
lowDensMinPtsClumps[0] = 0
|
|
785
|
+
hiDensMinPtsClumps = np.empty(iters)
|
|
786
|
+
hiDensMinPtsClumps[0] = 0
|
|
787
|
+
t = np.empty(iters)
|
|
788
|
+
t[0] = 0
|
|
789
|
+
|
|
790
|
+
|
|
791
|
+
for ind in range(1, iters): # start from 1 since t=[0,0] will yield no clumps
|
|
792
|
+
# filter time
|
|
793
|
+
inc = tabular.ResultsFilter(inp, t=[0, self.stepSize * ind])
|
|
794
|
+
t[ind] = np.max(inc['t'])
|
|
795
|
+
|
|
796
|
+
cid, counts = np.unique(inc[self.labelsKey], return_counts=True)
|
|
797
|
+
# cmask = np.in1d(inc['DBSCAN_allFrames'], cid)
|
|
798
|
+
|
|
799
|
+
cidL = cid[counts >= self.lowerMinPtsPerCluster]
|
|
800
|
+
lowDensMinPtsClumps[ind] = np.sum(cidL != -1) # ignore unclumped in count
|
|
801
|
+
cid = cid[counts >= self.higherMinPtsPerCluster]
|
|
802
|
+
hiDensMinPtsClumps[ind] = np.sum(cid != -1) # ignore unclumped in count
|
|
803
|
+
|
|
804
|
+
|
|
805
|
+
return tabular.MappingFilter({'t': t,
|
|
806
|
+
'N_labelsWithLowMinPoints': lowDensMinPtsClumps,
|
|
807
|
+
'N_labelsWithHighMinPoints': hiDensMinPtsClumps})
|
|
808
|
+
|
|
809
|
+
|
|
810
|
+
@register_module('LabelsFromImage')
|
|
811
|
+
class LabelsFromImage(ModuleBase):
|
|
812
|
+
"""
|
|
813
|
+
Maps each point in the input table to a pixel in a labelled image, and extracts the pixel value at that location to
|
|
814
|
+
use as a label for the point data.
|
|
815
|
+
|
|
816
|
+
Inputs
|
|
817
|
+
------
|
|
818
|
+
inputName: Input
|
|
819
|
+
name of tabular input containing positions ('x', 'y', and optionally 'z' columns should be present)
|
|
820
|
+
inputImage: Input
|
|
821
|
+
name of image input containing labels
|
|
822
|
+
|
|
823
|
+
Outputs
|
|
824
|
+
-------
|
|
825
|
+
outputName: Output
|
|
826
|
+
name of tabular output. A mapped version of the tabular input with 2 extra columns
|
|
827
|
+
label_key_name : CStr
|
|
828
|
+
name of new column which will contain the label number from image, mapped to each localization within that label
|
|
829
|
+
label_count_key_name : CStr
|
|
830
|
+
name of new column which will contain the number of localizations within the label that a given localization
|
|
831
|
+
belongs to
|
|
832
|
+
minimum_localizations: Int
|
|
833
|
+
threshold for the number of localizations required to propagate a label through to localizations
|
|
834
|
+
|
|
835
|
+
"""
|
|
836
|
+
inputName = Input('input')
|
|
837
|
+
inputImage = Input('labeled')
|
|
838
|
+
|
|
839
|
+
label_key_name = CStr('objectID')
|
|
840
|
+
label_count_key_name = CStr('NEvents')
|
|
841
|
+
|
|
842
|
+
minimum_localizations = Int(1)
|
|
843
|
+
|
|
844
|
+
outputName = Output('labeled_points')
|
|
845
|
+
|
|
846
|
+
# def execute(self, namespace):
|
|
847
|
+
# from PYME.IO import tabular
|
|
848
|
+
# from PYME.Analysis.points import cluster_morphology
|
|
849
|
+
|
|
850
|
+
# inp = namespace[self.inputName]
|
|
851
|
+
# img = namespace[self.inputImage]
|
|
852
|
+
|
|
853
|
+
# ids, numPerObject = cluster_morphology.get_labels_from_image(img, inp, minimum_localizations=self.minimum_localizations)
|
|
854
|
+
|
|
855
|
+
# labeled = tabular.MappingFilter(inp)
|
|
856
|
+
# labeled.addColumn(self.label_key_name, ids)
|
|
857
|
+
# labeled.addColumn(self.label_count_key_name, numPerObject[ids - 1])
|
|
858
|
+
|
|
859
|
+
# # propagate metadata, if present
|
|
860
|
+
# try:
|
|
861
|
+
# labeled.mdh = namespace[self.inputName].mdh
|
|
862
|
+
# except AttributeError:
|
|
863
|
+
# pass
|
|
864
|
+
|
|
865
|
+
# namespace[self.outputName] = labeled
|
|
866
|
+
|
|
867
|
+
def run(self, inputName, inputImage):
|
|
868
|
+
from PYME.IO import tabular
|
|
869
|
+
from PYME.Analysis.points import cluster_morphology
|
|
870
|
+
|
|
871
|
+
ids, numPerObject = cluster_morphology.get_labels_from_image(inputImage, inputName, minimum_localizations=self.minimum_localizations)
|
|
872
|
+
|
|
873
|
+
labeled = tabular.MappingFilter(inputName)
|
|
874
|
+
labeled.addColumn(self.label_key_name, ids)
|
|
875
|
+
labeled.addColumn(self.label_count_key_name, numPerObject[ids - 1])
|
|
876
|
+
|
|
877
|
+
return labeled
|
|
878
|
+
|
|
879
|
+
|
|
880
|
+
@register_module('MeasureClusters3D')
|
|
881
|
+
class MeasureClusters3D(ModuleBase):
|
|
882
|
+
"""
|
|
883
|
+
Measures the 3D morphology of clusters of points
|
|
884
|
+
|
|
885
|
+
Inputs
|
|
886
|
+
------
|
|
887
|
+
|
|
888
|
+
inputName : name of tabular data containing x, y, and z columns and labels identifying which cluster each point
|
|
889
|
+
belongs to.
|
|
890
|
+
|
|
891
|
+
Outputs
|
|
892
|
+
-------
|
|
893
|
+
|
|
894
|
+
outputName: a new tabular data source containing measurements of the clusters
|
|
895
|
+
|
|
896
|
+
Parameters
|
|
897
|
+
----------
|
|
898
|
+
labelKey: name of column to use as a label identifying clusters
|
|
899
|
+
|
|
900
|
+
Notes
|
|
901
|
+
-----
|
|
902
|
+
|
|
903
|
+
Measures calculated (to be expanded)
|
|
904
|
+
|
|
905
|
+
:count: int
|
|
906
|
+
Number of localizations (points) in the cluster
|
|
907
|
+
:x: float
|
|
908
|
+
x center of mass
|
|
909
|
+
:y: float
|
|
910
|
+
y center of mass
|
|
911
|
+
:z: float
|
|
912
|
+
z center of mass
|
|
913
|
+
:gyrationRadius : float
|
|
914
|
+
root mean square displacement to center of cluster, a measure of compaction or spatial extent see also
|
|
915
|
+
supplemental text of DOI: 10.1038/nature16496
|
|
916
|
+
:axis0 : ndarray, shape (3,)
|
|
917
|
+
principle axis which accounts for the largest variance of the cluster, i.e. corresponds to the largest
|
|
918
|
+
eigenvalue
|
|
919
|
+
:axis1 : ndarray, shape (3,)
|
|
920
|
+
next principle axis
|
|
921
|
+
:axis2 : ndarray, shape (3,)
|
|
922
|
+
principle axis corresponding to the smallest eigenvalue
|
|
923
|
+
:sigma0 : float
|
|
924
|
+
standard deviation along axis0
|
|
925
|
+
:sigma1 : float
|
|
926
|
+
standard deviation along axis1
|
|
927
|
+
:sigma2 : float
|
|
928
|
+
standard deviation along axis2
|
|
929
|
+
:anisotropy : float
|
|
930
|
+
metric of anisotropy based on the spread along principle axes. Standard deviations of alpha * [1, 0, 0],
|
|
931
|
+
where alpha is a scalar, will result in an 'anisotropy' value of 1, i.e. maximally anisotropic. Completely
|
|
932
|
+
isotropic clusters will have equal standard deviations, i.e. alpha * [1, 1, 1], which corresponds to an
|
|
933
|
+
'anisotropy' value of 0. Intermediate cases result in values between 0 and 1.
|
|
934
|
+
:theta : float
|
|
935
|
+
Azimuthal angle, in radians, along which the principle axis (axis0) points
|
|
936
|
+
:phi : float
|
|
937
|
+
Zenith angle, in radians, along which the principle axis (axis0) points
|
|
938
|
+
|
|
939
|
+
"""
|
|
940
|
+
inputName = Input('input')
|
|
941
|
+
labelKey = CStr('clumpIndex')
|
|
942
|
+
|
|
943
|
+
outputName = Output('clusterMeasures')
|
|
944
|
+
|
|
945
|
+
# def execute(self, namespace):
|
|
946
|
+
# from PYME.Analysis.points import cluster_morphology as cmorph
|
|
947
|
+
# import numpy as np
|
|
948
|
+
|
|
949
|
+
# inp = namespace[self.inputName]
|
|
950
|
+
|
|
951
|
+
# labels = inp[self.labelKey].astype(np.int)
|
|
952
|
+
# # make sure labeling scheme is consistent with what pyme conventions
|
|
953
|
+
# if (len(labels) > 0) and (labels.min() < 0):
|
|
954
|
+
# raise UserWarning('This module expects 0-label for unclustered points, and no negative labels')
|
|
955
|
+
|
|
956
|
+
# I = np.argsort(labels)
|
|
957
|
+
# I = I[labels[I] > 0]
|
|
958
|
+
|
|
959
|
+
# x_vals, y_vals, z_vals = inp['x'][I], inp['y'][I], inp['z'][I]
|
|
960
|
+
# labels = labels[I]
|
|
961
|
+
# maxLabel = labels[-1] if (len(labels) > 0) else 0
|
|
962
|
+
|
|
963
|
+
# #find the unique labels, and their separation in the sorted list of points
|
|
964
|
+
# unique_labels, counts = np.unique(labels, return_counts=True)
|
|
965
|
+
|
|
966
|
+
# #allocate memory to store results in
|
|
967
|
+
# measurements = np.zeros(maxLabel, cmorph.measurement_dtype)
|
|
968
|
+
|
|
969
|
+
# # loop over labels, recalling that input is now sorted, and we know how many points are in each label.
|
|
970
|
+
# # Note that missing labels result in zeroed entries (i.e. the initial values are not changed).
|
|
971
|
+
# # Missing values can be filtered out later, if desired, by filtering on the 'counts' column, but having a dense
|
|
972
|
+
# # array where index == label number makes any postprocessing in which we might want to find the data
|
|
973
|
+
# # corresponding to a particular label MUCH easier and faster.
|
|
974
|
+
# indi = 0
|
|
975
|
+
# for label_num, ct in zip(unique_labels, counts):
|
|
976
|
+
# indf = indi + ct
|
|
977
|
+
|
|
978
|
+
# # create x,y,z arrays for this cluster, and calculate center of mass
|
|
979
|
+
# x, y, z = x_vals[indi:indf], y_vals[indi:indf], z_vals[indi:indf]
|
|
980
|
+
|
|
981
|
+
# cluster_index = label_num - 1 # we ignore the unclustered points, and start labeling at 1
|
|
982
|
+
# cmorph.measure_3d(x, y, z, output=measurements[cluster_index])
|
|
983
|
+
|
|
984
|
+
# indi = indf
|
|
985
|
+
|
|
986
|
+
# meas = tabular.RecArraySource(measurements)
|
|
987
|
+
|
|
988
|
+
# try:
|
|
989
|
+
# meas.mdh = namespace[self.inputName].mdh
|
|
990
|
+
# except AttributeError:
|
|
991
|
+
# pass
|
|
992
|
+
|
|
993
|
+
# namespace[self.outputName] = meas
|
|
994
|
+
|
|
995
|
+
|
|
996
|
+
def run(self, inputName):
|
|
997
|
+
from PYME.Analysis.points import cluster_morphology as cmorph
|
|
998
|
+
import numpy as np
|
|
999
|
+
|
|
1000
|
+
inp = inputName
|
|
1001
|
+
|
|
1002
|
+
labels = inp[self.labelKey].astype(int)
|
|
1003
|
+
# make sure labeling scheme is consistent with what pyme conventions
|
|
1004
|
+
if (len(labels) > 0) and (labels.min() < 0):
|
|
1005
|
+
raise UserWarning('This module expects 0-label for unclustered points, and no negative labels')
|
|
1006
|
+
|
|
1007
|
+
I = np.argsort(labels)
|
|
1008
|
+
I = I[labels[I] > 0]
|
|
1009
|
+
|
|
1010
|
+
x_vals, y_vals, z_vals = inp['x'][I], inp['y'][I], inp['z'][I]
|
|
1011
|
+
labels = labels[I]
|
|
1012
|
+
maxLabel = labels[-1] if (len(labels) > 0) else 0
|
|
1013
|
+
|
|
1014
|
+
#find the unique labels, and their separation in the sorted list of points
|
|
1015
|
+
unique_labels, counts = np.unique(labels, return_counts=True)
|
|
1016
|
+
|
|
1017
|
+
#allocate memory to store results in
|
|
1018
|
+
measurements = np.zeros(maxLabel, cmorph.measurement_dtype)
|
|
1019
|
+
|
|
1020
|
+
# loop over labels, recalling that input is now sorted, and we know how many points are in each label.
|
|
1021
|
+
# Note that missing labels result in zeroed entries (i.e. the initial values are not changed).
|
|
1022
|
+
# Missing values can be filtered out later, if desired, by filtering on the 'counts' column, but having a dense
|
|
1023
|
+
# array where index == label number makes any postprocessing in which we might want to find the data
|
|
1024
|
+
# corresponding to a particular label MUCH easier and faster.
|
|
1025
|
+
indi = 0
|
|
1026
|
+
for label_num, ct in zip(unique_labels, counts):
|
|
1027
|
+
indf = indi + ct
|
|
1028
|
+
|
|
1029
|
+
# create x,y,z arrays for this cluster, and calculate center of mass
|
|
1030
|
+
x, y, z = x_vals[indi:indf], y_vals[indi:indf], z_vals[indi:indf]
|
|
1031
|
+
|
|
1032
|
+
cluster_index = label_num - 1 # we ignore the unclustered points, and start labeling at 1
|
|
1033
|
+
cmorph.measure_3d(x, y, z, output=measurements[cluster_index])
|
|
1034
|
+
|
|
1035
|
+
indi = indf
|
|
1036
|
+
|
|
1037
|
+
# propagate the labelKey used to generate these measurements
|
|
1038
|
+
output = tabular.MappingFilter(tabular.RecArraySource(measurements))
|
|
1039
|
+
output.addColumn(self.labelKey, np.arange(maxLabel))
|
|
1040
|
+
return output
|
|
1041
|
+
|
|
1042
|
+
|
|
1043
|
+
@register_module('AddMeasurementsByLabel')
|
|
1044
|
+
class AddMeasurementsByLabel(ModuleBase):
|
|
1045
|
+
input_points = Input('input')
|
|
1046
|
+
input_measurements = Input('clusterMeasures')
|
|
1047
|
+
label_key = CStr('label')
|
|
1048
|
+
output_points = Output('annotated_points')
|
|
1049
|
+
|
|
1050
|
+
def run(self, input_points, input_measurements):
|
|
1051
|
+
"""
|
|
1052
|
+
Propagate measurements from e.g. MeasureClusters3D back to points they were calcualted from.
|
|
1053
|
+
This is particularly useful for visualizing e.g. the gyration radius of a cluster in PYMEVis
|
|
1054
|
+
while looking at the original localization data.
|
|
1055
|
+
|
|
1056
|
+
Parameters
|
|
1057
|
+
----------
|
|
1058
|
+
input_points : PYME.IO.tabular.TabularBase
|
|
1059
|
+
points used to generate the measurements
|
|
1060
|
+
input_measurements : PYME.IO.tabular.TabularBase
|
|
1061
|
+
measurements to propagate back to the points
|
|
1062
|
+
|
|
1063
|
+
Returns
|
|
1064
|
+
-------
|
|
1065
|
+
PYME.IO.tabular.TabularBase
|
|
1066
|
+
point data with new columns added, one for each scalar measurement in input_measurements, which
|
|
1067
|
+
can be accessed by '<label_key>_<measurement_key>', e.g. 'clumpIndex_gyrationRadius'.
|
|
1068
|
+
|
|
1069
|
+
"""
|
|
1070
|
+
from PYME.IO.tabular import MappingFilter
|
|
1071
|
+
|
|
1072
|
+
# only propagate 1D measurements
|
|
1073
|
+
annotations = dict()
|
|
1074
|
+
for k in input_measurements.keys():
|
|
1075
|
+
if input_measurements[k].ndim == 1: #TODO - also check for object dtype?
|
|
1076
|
+
annotations[k] = np.zeros(len(input_points), dtype=input_measurements[k].dtype)
|
|
1077
|
+
|
|
1078
|
+
try:
|
|
1079
|
+
labels = np.unique(input_measurements[self.label_key])
|
|
1080
|
+
except KeyError:
|
|
1081
|
+
logger.exception('Label key %s not found in input_measurements, RISKY: continuing with assumption measurements are sorted by label and all present' % self.label_key)
|
|
1082
|
+
labels = np.arange(1, len(input_measurements) + 1) # MeasureClusters3D ignores the unclustered points 'label 0' so index 0 corresponds to 'label 1'
|
|
1083
|
+
|
|
1084
|
+
for label in labels:
|
|
1085
|
+
points_mask = label == input_points[self.label_key]
|
|
1086
|
+
try:
|
|
1087
|
+
measurement_mask = label == input_measurements[self.label_key]
|
|
1088
|
+
except KeyError:
|
|
1089
|
+
measurement_mask = label - 1 # MeasureClusters3D ignores the unclustered points 'label 0' so index 0 corresponds to 'label 1'
|
|
1090
|
+
|
|
1091
|
+
for k in annotations.keys():
|
|
1092
|
+
annotations[k][points_mask] = input_measurements[k][measurement_mask]
|
|
1093
|
+
|
|
1094
|
+
output_points = MappingFilter(input_points)
|
|
1095
|
+
try:
|
|
1096
|
+
output_points.mdh = input_points.mdh
|
|
1097
|
+
except AttributeError:
|
|
1098
|
+
pass
|
|
1099
|
+
|
|
1100
|
+
for k in annotations.keys():
|
|
1101
|
+
output_points.addColumn(self.label_key + '_' + k, annotations[k])
|
|
1102
|
+
|
|
1103
|
+
return output_points
|
|
1104
|
+
|
|
1105
|
+
|
|
1106
|
+
@register_module('FiducialCorrection')
|
|
1107
|
+
class FiducialCorrection(ModuleBase):
|
|
1108
|
+
"""
|
|
1109
|
+
Maps each point in the input table to a pixel in a labelled image, and extracts the pixel value at that location to
|
|
1110
|
+
use as a label for the point data.
|
|
1111
|
+
|
|
1112
|
+
Inputs
|
|
1113
|
+
------
|
|
1114
|
+
inputName: name of tabular input containing positions ('x', 'y', and optionally 'z' columns should be present)
|
|
1115
|
+
inputImage: name of image input containing labels
|
|
1116
|
+
|
|
1117
|
+
Outputs
|
|
1118
|
+
-------
|
|
1119
|
+
outputName: name of tabular output. A mapped version of the tabular input with 2 extra columns
|
|
1120
|
+
objectID: Label number from image, mapped to each localization within that label
|
|
1121
|
+
NEvents: Number of localizations within the label that a given localization belongs to
|
|
1122
|
+
|
|
1123
|
+
"""
|
|
1124
|
+
inputLocalizations = Input('Localizations')
|
|
1125
|
+
inputFiducials = Input('Fiducials')
|
|
1126
|
+
|
|
1127
|
+
clumpRadiusVar = CStr('error_x')
|
|
1128
|
+
clumpRadiusMultiplier = Float(5.0)
|
|
1129
|
+
timeWindow = Int(25)
|
|
1130
|
+
|
|
1131
|
+
temporalFilter = Enum(['Gaussian', 'Uniform', 'Median'])
|
|
1132
|
+
temporalFilterScale = Float(10.0)
|
|
1133
|
+
|
|
1134
|
+
outputName = Output('corrected_localizations')
|
|
1135
|
+
outputFiducials = Output('corrected_fiducials')
|
|
1136
|
+
|
|
1137
|
+
# def execute(self, namespace):
|
|
1138
|
+
# from PYME.IO import tabular
|
|
1139
|
+
# from PYME.Analysis.points import fiducials
|
|
1140
|
+
|
|
1141
|
+
# locs = namespace[self.inputLocalizations]
|
|
1142
|
+
# fids = namespace[self.inputFiducials]
|
|
1143
|
+
|
|
1144
|
+
# t_fid, fid_trajectory, clump_index = fiducials.extractAverageTrajectory(fids, clumpRadiusVar=self.clumpRadiusVar,
|
|
1145
|
+
# clumpRadiusMultiplier=float(self.clumpRadiusMultiplier),
|
|
1146
|
+
# timeWindow=int(self.timeWindow),
|
|
1147
|
+
# filter=self.temporalFilter, filterScale=float(self.temporalFilterScale))
|
|
1148
|
+
|
|
1149
|
+
# out = tabular.MappingFilter(locs)
|
|
1150
|
+
# t_out = out['t']
|
|
1151
|
+
|
|
1152
|
+
# out_f = tabular.MappingFilter(fids)
|
|
1153
|
+
# out_f.addColumn('clumpIndex', clump_index)
|
|
1154
|
+
# t_out_f = out_f['t']
|
|
1155
|
+
|
|
1156
|
+
# for dim in fid_trajectory.keys():
|
|
1157
|
+
# print(dim)
|
|
1158
|
+
# out.addColumn('fiducial_{0}'.format(dim), np.interp(t_out, t_fid, fid_trajectory[dim]))
|
|
1159
|
+
# out.setMapping(dim, '{0} - fiducial_{0}'.format(dim))
|
|
1160
|
+
|
|
1161
|
+
# out_f.addColumn('fiducial_{0}'.format(dim), np.interp(t_out_f, t_fid, fid_trajectory[dim]))
|
|
1162
|
+
# out_f.setMapping(dim, '{0} - fiducial_{0}'.format(dim))
|
|
1163
|
+
|
|
1164
|
+
# # propagate metadata, if present
|
|
1165
|
+
# try:
|
|
1166
|
+
# out.mdh = locs.mdh
|
|
1167
|
+
# except AttributeError:
|
|
1168
|
+
# pass
|
|
1169
|
+
|
|
1170
|
+
# namespace[self.outputName] = out
|
|
1171
|
+
# namespace[self.outputFiducials] = out_f
|
|
1172
|
+
|
|
1173
|
+
def run(self, inputLocalizations, inputFiducials):
|
|
1174
|
+
from PYME.IO import tabular
|
|
1175
|
+
from PYME.Analysis.points import fiducials
|
|
1176
|
+
from PYME.IO import MetaDataHandler
|
|
1177
|
+
|
|
1178
|
+
t_fid, fid_trajectory, clump_index = fiducials.extractAverageTrajectory(inputFiducials, clumpRadiusVar=self.clumpRadiusVar,
|
|
1179
|
+
clumpRadiusMultiplier=float(self.clumpRadiusMultiplier),
|
|
1180
|
+
timeWindow=int(self.timeWindow),
|
|
1181
|
+
filter=self.temporalFilter, filterScale=float(self.temporalFilterScale))
|
|
1182
|
+
|
|
1183
|
+
out = tabular.MappingFilter(inputLocalizations)
|
|
1184
|
+
t_out = out['t']
|
|
1185
|
+
|
|
1186
|
+
out_f = tabular.MappingFilter(inputFiducials)
|
|
1187
|
+
out_f.addColumn('clumpIndex', clump_index)
|
|
1188
|
+
t_out_f = out_f['t']
|
|
1189
|
+
|
|
1190
|
+
for dim in fid_trajectory.keys():
|
|
1191
|
+
print(dim)
|
|
1192
|
+
out.addColumn('fiducial_{0}'.format(dim), np.interp(t_out, t_fid, fid_trajectory[dim]))
|
|
1193
|
+
out.setMapping(dim, '{0} - fiducial_{0}'.format(dim))
|
|
1194
|
+
|
|
1195
|
+
out_f.addColumn('fiducial_{0}'.format(dim), np.interp(t_out_f, t_fid, fid_trajectory[dim]))
|
|
1196
|
+
out_f.setMapping(dim, '{0} - fiducial_{0}'.format(dim))
|
|
1197
|
+
|
|
1198
|
+
# propagate metadata, if present
|
|
1199
|
+
try:
|
|
1200
|
+
out.mdh = MetaDataHandler.DictMDHandler(inputLocalizations.mdh)
|
|
1201
|
+
except AttributeError:
|
|
1202
|
+
pass
|
|
1203
|
+
|
|
1204
|
+
return {'outputName': out, 'outputFiducials' : out_f}
|
|
1205
|
+
|
|
1206
|
+
|
|
1207
|
+
@register_module('AutocorrelationDriftCorrection')
|
|
1208
|
+
class AutocorrelationDriftCorrection(ModuleBase):
|
|
1209
|
+
"""
|
|
1210
|
+
Perform drift correction using autocorrelation between subsets of the point data
|
|
1211
|
+
|
|
1212
|
+
Inputs
|
|
1213
|
+
------
|
|
1214
|
+
inputName: name of tabular input containing positions ('x', 'y', and 't' columns should be present)
|
|
1215
|
+
step : time step (in frames) with which to traverse the series
|
|
1216
|
+
window: size of time window (in frames). A series of images will be generated from
|
|
1217
|
+
multiple overlapping windows, spaced by `step` frames.
|
|
1218
|
+
binsize: size of histogram bins in nm
|
|
1219
|
+
|
|
1220
|
+
Outputs
|
|
1221
|
+
-------
|
|
1222
|
+
outputName: name of tabular output. A mapped version of the tabular input with 2 extra columns
|
|
1223
|
+
|
|
1224
|
+
"""
|
|
1225
|
+
inputName = Input('Localizations')
|
|
1226
|
+
step = Int(200)
|
|
1227
|
+
window = Int(500)
|
|
1228
|
+
binsize = Float(30)
|
|
1229
|
+
|
|
1230
|
+
outputName = Output('corrected_localizations')
|
|
1231
|
+
|
|
1232
|
+
def calcCorrDrift(self, x, y, t):
|
|
1233
|
+
from scipy import ndimage
|
|
1234
|
+
|
|
1235
|
+
tMax = int(t.max())
|
|
1236
|
+
|
|
1237
|
+
bx = np.arange(x.min(), x.max() + self.binsize, self.binsize)
|
|
1238
|
+
by = np.arange(y.min(), y.max() + self.binsize, self.binsize)
|
|
1239
|
+
|
|
1240
|
+
tInd = t < self.window
|
|
1241
|
+
|
|
1242
|
+
h1 = np.histogram2d(x[tInd], y[tInd], [bx, by])[0]
|
|
1243
|
+
H1 = np.fft.fftn(h1)
|
|
1244
|
+
|
|
1245
|
+
shifts = []
|
|
1246
|
+
tis = []
|
|
1247
|
+
|
|
1248
|
+
for ti in range(0, tMax + 1, self.step):
|
|
1249
|
+
tInd = (t >= ti) * (t < (ti + self.window))
|
|
1250
|
+
h2 = np.histogram2d(x[tInd], y[tInd], [bx, by])[0]
|
|
1251
|
+
|
|
1252
|
+
xc = abs(np.fft.ifftshift(np.fft.ifftn(H1 * np.fft.ifftn(h2))))
|
|
1253
|
+
|
|
1254
|
+
xct = (xc - xc.max() / 3) * (xc > xc.max() / 3)
|
|
1255
|
+
|
|
1256
|
+
shifts.append(ndimage.measurements.center_of_mass(xct))
|
|
1257
|
+
tis.append(ti + self.window / 2.)
|
|
1258
|
+
|
|
1259
|
+
sha = np.array(shifts)
|
|
1260
|
+
|
|
1261
|
+
return np.array(tis), self.binsize * (sha - sha[0])
|
|
1262
|
+
|
|
1263
|
+
# def execute(self, namespace):
|
|
1264
|
+
# from PYME.IO import tabular
|
|
1265
|
+
# locs = namespace[self.inputName]
|
|
1266
|
+
|
|
1267
|
+
# t_shift, shifts = self.calcCorrDrift(locs['x'], locs['y'], locs['t'])
|
|
1268
|
+
# shx = shifts[:, 0]
|
|
1269
|
+
# shy = shifts[:, 1]
|
|
1270
|
+
|
|
1271
|
+
# out = tabular.MappingFilter(locs)
|
|
1272
|
+
# t_out = out['t']
|
|
1273
|
+
# dx = np.interp(t_out, t_shift, shx)
|
|
1274
|
+
# dy = np.interp(t_out, t_shift, shy)
|
|
1275
|
+
|
|
1276
|
+
|
|
1277
|
+
# out.addColumn('dx', dx)
|
|
1278
|
+
# out.addColumn('dy', dy)
|
|
1279
|
+
# out.setMapping('x', 'x + dx')
|
|
1280
|
+
# out.setMapping('y', 'y + dy')
|
|
1281
|
+
|
|
1282
|
+
# # propagate metadata, if present
|
|
1283
|
+
# try:
|
|
1284
|
+
# out.mdh = locs.mdh
|
|
1285
|
+
# except AttributeError:
|
|
1286
|
+
# pass
|
|
1287
|
+
|
|
1288
|
+
# namespace[self.outputName] = out
|
|
1289
|
+
|
|
1290
|
+
def run(self, inputName):
|
|
1291
|
+
from PYME.IO import tabular
|
|
1292
|
+
locs = inputName
|
|
1293
|
+
|
|
1294
|
+
t_shift, shifts = self.calcCorrDrift(locs['x'], locs['y'], locs['t'])
|
|
1295
|
+
shx = shifts[:, 0]
|
|
1296
|
+
shy = shifts[:, 1]
|
|
1297
|
+
|
|
1298
|
+
out = tabular.MappingFilter(locs)
|
|
1299
|
+
t_out = out['t']
|
|
1300
|
+
dx = np.interp(t_out, t_shift, shx)
|
|
1301
|
+
dy = np.interp(t_out, t_shift, shy)
|
|
1302
|
+
|
|
1303
|
+
|
|
1304
|
+
out.addColumn('dx', dx)
|
|
1305
|
+
out.addColumn('dy', dy)
|
|
1306
|
+
out.setMapping('x', 'x + dx')
|
|
1307
|
+
out.setMapping('y', 'y + dy')
|
|
1308
|
+
|
|
1309
|
+
return out
|
|
1310
|
+
|
|
1311
|
+
@register_module('MapAstigZ')
|
|
1312
|
+
class MapAstigZ(ModuleBase):
|
|
1313
|
+
"""
|
|
1314
|
+
|
|
1315
|
+
Uses astigmatism calibration (widths of PSF along each dimension as a function of z) to determine the z-position of
|
|
1316
|
+
localizations relative to the focal plane of the frame during which it was imaged. Note this is the single channel version
|
|
1317
|
+
and does not work for combined biplane and astigmatism (see Multiview.MapAstigZ). It also uses the more robust but less precise
|
|
1318
|
+
dsigma method.
|
|
1319
|
+
|
|
1320
|
+
Parameters
|
|
1321
|
+
----------
|
|
1322
|
+
input_name : traits.Input
|
|
1323
|
+
localizations as PYME.IO.Tabular types
|
|
1324
|
+
astigmatism_calibration_location : traits.File
|
|
1325
|
+
file path or URL to astigmatism calibration file
|
|
1326
|
+
|
|
1327
|
+
Returns
|
|
1328
|
+
-------
|
|
1329
|
+
output_name : traits.Output
|
|
1330
|
+
output is a json wrapped by PYME.IO.ragged.RaggedCache
|
|
1331
|
+
|
|
1332
|
+
Notes
|
|
1333
|
+
-----
|
|
1334
|
+
|
|
1335
|
+
"""
|
|
1336
|
+
input_name = Input('merged')
|
|
1337
|
+
|
|
1338
|
+
astigmatism_calibration_location = FileOrURI('')
|
|
1339
|
+
rough_knot_spacing = Float(50.)
|
|
1340
|
+
z_scale = Float(1.0)
|
|
1341
|
+
|
|
1342
|
+
output_name = Output('zmapped')
|
|
1343
|
+
|
|
1344
|
+
def execute(self, namespace):
|
|
1345
|
+
from PYME.Analysis.points.astigmatism import astigTools
|
|
1346
|
+
from PYME.IO import unifiedIO
|
|
1347
|
+
from PYME.IO import MetaDataHandler
|
|
1348
|
+
import json
|
|
1349
|
+
|
|
1350
|
+
inp = namespace[self.input_name]
|
|
1351
|
+
|
|
1352
|
+
if 'mdh' not in dir(inp):
|
|
1353
|
+
raise RuntimeError('MapAstigZ needs metadata')
|
|
1354
|
+
|
|
1355
|
+
if self.astigmatism_calibration_location == '': # grab calibration from the metadata
|
|
1356
|
+
calibration_location = inp.mdh['Analysis.AstigmatismMapID']
|
|
1357
|
+
else:
|
|
1358
|
+
calibration_location = self.astigmatism_calibration_location
|
|
1359
|
+
|
|
1360
|
+
s = unifiedIO.read(calibration_location)
|
|
1361
|
+
|
|
1362
|
+
astig_calibrations = json.loads(s)
|
|
1363
|
+
|
|
1364
|
+
mapped = tabular.MappingFilter(inp)
|
|
1365
|
+
|
|
1366
|
+
# hack to make this work for non-multi-view data
|
|
1367
|
+
if ('sigmax' not in mapped.keys()) and (inp.mdh.getOrDefault('Multiview.NumROIs', 1) == 1):
|
|
1368
|
+
# if we are single channel it is safe to define sigmax0, sigmay0 as sigmax, sigmay
|
|
1369
|
+
# without any folding etc ...
|
|
1370
|
+
mapped.setMapping('sigmax', 'fitResults_sigmax')
|
|
1371
|
+
mapped.setMapping('sigmay', 'fitResults_sigmay')
|
|
1372
|
+
mapped.setMapping('error_sigmax', 'fitError_sigmax')
|
|
1373
|
+
mapped.setMapping('error_sigmay', 'fitError_sigmay')
|
|
1374
|
+
|
|
1375
|
+
|
|
1376
|
+
z, zerr = astigTools.lookup_astig_z_dsigma(mapped, astig_calibrations, self.rough_knot_spacing, plot=False)
|
|
1377
|
+
|
|
1378
|
+
mapped.addColumn('astigmatic_z', z)
|
|
1379
|
+
mapped.addColumn('astigmatic_z_lookup_error', zerr)
|
|
1380
|
+
mapped.addVariable('z_scale', self.z_scale)
|
|
1381
|
+
mapped.setMapping('z', 'astigmatic_z*z_scale + z')
|
|
1382
|
+
|
|
1383
|
+
mapped.mdh = MetaDataHandler.NestedClassMDHandler(inp.mdh)
|
|
1384
|
+
mapped.mdh['Analysis.astigmatism_calibration_used'] = calibration_location
|
|
1385
|
+
|
|
1386
|
+
namespace[self.output_name] = mapped
|