python-microscopy 25.11.20__cp313-cp313-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- PYME/Acquire/ActionManager.py +450 -0
- PYME/Acquire/ExecTools.py +235 -0
- PYME/Acquire/Hardware/AAOptoelectronics/MDS.py +175 -0
- PYME/Acquire/Hardware/AAOptoelectronics/__init__.py +0 -0
- PYME/Acquire/Hardware/ARCoptix/__init__.py +0 -0
- PYME/Acquire/Hardware/ARCoptix/lcdriver.py +149 -0
- PYME/Acquire/Hardware/ARCoptix/lcserver32.py +123 -0
- PYME/Acquire/Hardware/AndorIXon/AndorCam.py +1095 -0
- PYME/Acquire/Hardware/AndorIXon/AndorControlFrame.py +312 -0
- PYME/Acquire/Hardware/AndorIXon/AndorIXon.py +737 -0
- PYME/Acquire/Hardware/AndorIXon/__init__.py +27 -0
- PYME/Acquire/Hardware/AndorNeo/AndorNeo.py +644 -0
- PYME/Acquire/Hardware/AndorNeo/AndorNeoControlFrame.py +161 -0
- PYME/Acquire/Hardware/AndorNeo/AndorZyla.py +761 -0
- PYME/Acquire/Hardware/AndorNeo/SDK3.py +307 -0
- PYME/Acquire/Hardware/AndorNeo/SDK3Cam.py +171 -0
- PYME/Acquire/Hardware/AndorNeo/ZylaControlPanel.py +105 -0
- PYME/Acquire/Hardware/AndorNeo/__init__.py +22 -0
- PYME/Acquire/Hardware/AndorNeo/parseAtdebug.py +46 -0
- PYME/Acquire/Hardware/AndorNeo/plotTimings.py +73 -0
- PYME/Acquire/Hardware/AndorNeo/testNeo.py +62 -0
- PYME/Acquire/Hardware/Camera.py +1199 -0
- PYME/Acquire/Hardware/CameraSkeleton.py +642 -0
- PYME/Acquire/Hardware/Coherent/OBIS.py +147 -0
- PYME/Acquire/Hardware/Coherent/Sapphire.py +162 -0
- PYME/Acquire/Hardware/Coherent/__init__.py +0 -0
- PYME/Acquire/Hardware/DMDGui.py +198 -0
- PYME/Acquire/Hardware/DigiData/DigiData.py +95 -0
- PYME/Acquire/Hardware/DigiData/DigiDataClient.py +30 -0
- PYME/Acquire/Hardware/DigiData/RemoteDigiData.py +51 -0
- PYME/Acquire/Hardware/DigiData/__init__.py +24 -0
- PYME/Acquire/Hardware/DigiData/axDD132x.py +348 -0
- PYME/Acquire/Hardware/EMCCDTheory.py +41 -0
- PYME/Acquire/Hardware/ExciterWheel.py +167 -0
- PYME/Acquire/Hardware/FilterWheel.py +184 -0
- PYME/Acquire/Hardware/FocCorr.py +106 -0
- PYME/Acquire/Hardware/FocCorrR.py +196 -0
- PYME/Acquire/Hardware/FrFilter.py +51 -0
- PYME/Acquire/Hardware/GCS/GCS_DLL.py +370 -0
- PYME/Acquire/Hardware/GCS/__init__.py +0 -0
- PYME/Acquire/Hardware/GCS/gcs.py +210 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/HamamatsuDCAM.py +662 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/HamamatsuORCA.py +602 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/Hamamatsu_control_panel.py +54 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/__init__.py +23 -0
- PYME/Acquire/Hardware/LaserControlFrame.py +160 -0
- PYME/Acquire/Hardware/MPBCommunications/MPBCW.py +132 -0
- PYME/Acquire/Hardware/MPBCommunications/__init__.py +0 -0
- PYME/Acquire/Hardware/Mercury/Mercury.py +269 -0
- PYME/Acquire/Hardware/Mercury/PI_Mercury_GCS_DLL.py +857 -0
- PYME/Acquire/Hardware/Mercury/__init__.py +22 -0
- PYME/Acquire/Hardware/Mercury/mercuryStepper.py +203 -0
- PYME/Acquire/Hardware/Mercury/mercuryStepperGCS.py +281 -0
- PYME/Acquire/Hardware/NikonTE2000.py +68 -0
- PYME/Acquire/Hardware/NikonTi.py +214 -0
- PYME/Acquire/Hardware/NikonTiGUI.py +81 -0
- PYME/Acquire/Hardware/OrielCornerstone.py +125 -0
- PYME/Acquire/Hardware/PM100USB.py +51 -0
- PYME/Acquire/Hardware/Piezos/__init__.py +22 -0
- PYME/Acquire/Hardware/Piezos/base_piezo.py +108 -0
- PYME/Acquire/Hardware/Piezos/offsetPiezo.py +162 -0
- PYME/Acquire/Hardware/Piezos/offsetPiezoREST.py +308 -0
- PYME/Acquire/Hardware/Piezos/piezo_c867.py +486 -0
- PYME/Acquire/Hardware/Piezos/piezo_e255.py +68 -0
- PYME/Acquire/Hardware/Piezos/piezo_e662.py +61 -0
- PYME/Acquire/Hardware/Piezos/piezo_e709.py +434 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816.py +452 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816_corr.py +70 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816_dll.py +518 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816b.py +70 -0
- PYME/Acquire/Hardware/Piezos/piezo_pipython_gcs.py +560 -0
- PYME/Acquire/Hardware/Piezos/piezo_test.py +55 -0
- PYME/Acquire/Hardware/Simulator/EmpiricalHist.py +273 -0
- PYME/Acquire/Hardware/Simulator/__init__.py +22 -0
- PYME/Acquire/Hardware/Simulator/dSimControl.py +961 -0
- PYME/Acquire/Hardware/Simulator/fakeCam.py +651 -0
- PYME/Acquire/Hardware/Simulator/fakePiezo.py +95 -0
- PYME/Acquire/Hardware/Simulator/fluor.py +336 -0
- PYME/Acquire/Hardware/Simulator/illuminate.cp313-win_amd64.dll.a +0 -0
- PYME/Acquire/Hardware/Simulator/illuminate.cp313-win_amd64.pyd +0 -0
- PYME/Acquire/Hardware/Simulator/illuminate.pyx +93 -0
- PYME/Acquire/Hardware/Simulator/lasersliders.py +90 -0
- PYME/Acquire/Hardware/Simulator/rend_im.py +446 -0
- PYME/Acquire/Hardware/Simulator/setup.py +69 -0
- PYME/Acquire/Hardware/Simulator/simcontrol.py +348 -0
- PYME/Acquire/Hardware/Simulator/simui_wx.py +794 -0
- PYME/Acquire/Hardware/Tango/__init__.py +0 -0
- PYME/Acquire/Hardware/Tango/marzhauser_tango.py +583 -0
- PYME/Acquire/Hardware/TiLightCrafter.py +388 -0
- PYME/Acquire/Hardware/__init__.py +22 -0
- PYME/Acquire/Hardware/aotf.py +271 -0
- PYME/Acquire/Hardware/arclampshutterpanel.py +71 -0
- PYME/Acquire/Hardware/cameraSoftwareBuffer.py +215 -0
- PYME/Acquire/Hardware/camera_noise.py +270 -0
- PYME/Acquire/Hardware/ccdAdjPanel.py +188 -0
- PYME/Acquire/Hardware/ccdCalibrator.py +161 -0
- PYME/Acquire/Hardware/cobaltLaser.py +108 -0
- PYME/Acquire/Hardware/cobaltLaser561.py +94 -0
- PYME/Acquire/Hardware/comports.py +26 -0
- PYME/Acquire/Hardware/driftTrackGUI.py +488 -0
- PYME/Acquire/Hardware/driftTracking.py +595 -0
- PYME/Acquire/Hardware/fakeShutters.py +52 -0
- PYME/Acquire/Hardware/focusKeys.py +204 -0
- PYME/Acquire/Hardware/focus_locks/__init__.py +0 -0
- PYME/Acquire/Hardware/focus_locks/reflection_focus_lock.py +684 -0
- PYME/Acquire/Hardware/frZStage.py +117 -0
- PYME/Acquire/Hardware/fw102.py +38 -0
- PYME/Acquire/Hardware/ids_peak_cam.py +561 -0
- PYME/Acquire/Hardware/ioslave.py +305 -0
- PYME/Acquire/Hardware/lasers.py +292 -0
- PYME/Acquire/Hardware/matchboxLaser.py +58 -0
- PYME/Acquire/Hardware/microscope_adapter.py +104 -0
- PYME/Acquire/Hardware/mpd_picosecond_delayer.py +395 -0
- PYME/Acquire/Hardware/multiview.py +287 -0
- PYME/Acquire/Hardware/olympusix81.py +59 -0
- PYME/Acquire/Hardware/pco/__init__.py +0 -0
- PYME/Acquire/Hardware/pco/pco_cam.py +348 -0
- PYME/Acquire/Hardware/pco/pco_edge_42_lt.py +34 -0
- PYME/Acquire/Hardware/pco/pco_sdk.py +1645 -0
- PYME/Acquire/Hardware/pco/pco_sdk_cam.py +518 -0
- PYME/Acquire/Hardware/pco/pco_sdk_cam_control_panel.py +54 -0
- PYME/Acquire/Hardware/phoxxLaser.py +199 -0
- PYME/Acquire/Hardware/phoxxLaserOLD.py +242 -0
- PYME/Acquire/Hardware/priorLumen.py +102 -0
- PYME/Acquire/Hardware/priorarclampshutter.py +52 -0
- PYME/Acquire/Hardware/setup.py +50 -0
- PYME/Acquire/Hardware/spacenav.py +148 -0
- PYME/Acquire/Hardware/splitter.py +394 -0
- PYME/Acquire/Hardware/thorlabsPiezo.py +98 -0
- PYME/Acquire/Hardware/thorlabs_cam.py +136 -0
- PYME/Acquire/Hardware/thorlabs_mff_flipper.py +400 -0
- PYME/Acquire/Hardware/toptica_ibeam.py +51 -0
- PYME/Acquire/Hardware/uc480/AndorControlFrame.py +308 -0
- PYME/Acquire/Hardware/uc480/__init__.py +27 -0
- PYME/Acquire/Hardware/uc480/uCam480.py +695 -0
- PYME/Acquire/Hardware/uc480/uc480.py +189 -0
- PYME/Acquire/Hardware/uc480/uc480Deprecated.py +87 -0
- PYME/Acquire/Hardware/uc480/uc480_h.py +767 -0
- PYME/Acquire/Hardware/uc480/uc480_h_gen.py +62 -0
- PYME/Acquire/Hardware/uc480/ucCamControlFrame.py +83 -0
- PYME/Acquire/Hardware/ueye.py +702 -0
- PYME/Acquire/PYMEAcquire.py +186 -0
- PYME/Acquire/Protocols/DMDMFM.py +74 -0
- PYME/Acquire/Protocols/__init__.py +22 -0
- PYME/Acquire/Protocols/darkCalibrate.py +56 -0
- PYME/Acquire/Protocols/dual671_470.py +45 -0
- PYME/Acquire/Protocols/dual671_488.py +46 -0
- PYME/Acquire/Protocols/gainCal.py +53 -0
- PYME/Acquire/Protocols/htsms-cal-psf.py +32 -0
- PYME/Acquire/Protocols/htsms-cal-registration.py +52 -0
- PYME/Acquire/Protocols/htsms-flow.py +29 -0
- PYME/Acquire/Protocols/htsms-staggered.py +31 -0
- PYME/Acquire/Protocols/htsms-tile.py +68 -0
- PYME/Acquire/Protocols/htsms-two-color.py +29 -0
- PYME/Acquire/Protocols/htsms-widefield.py +32 -0
- PYME/Acquire/Protocols/paint671.py +61 -0
- PYME/Acquire/Protocols/photoconversion.py +52 -0
- PYME/Acquire/Protocols/photoconversion2.py +55 -0
- PYME/Acquire/Protocols/prebleach488.py +70 -0
- PYME/Acquire/Protocols/prebleach490.py +69 -0
- PYME/Acquire/Protocols/prebleach561.py +72 -0
- PYME/Acquire/Protocols/prebleach561NeomEos2.py +70 -0
- PYME/Acquire/Protocols/prebleach561NeomEos2ND1.py +70 -0
- PYME/Acquire/Protocols/prebleach642.py +70 -0
- PYME/Acquire/Protocols/prebleach671.py +69 -0
- PYME/Acquire/Protocols/prebleach671ND1.py +58 -0
- PYME/Acquire/Protocols/prebleach671ND2.py +57 -0
- PYME/Acquire/Protocols/prebleach671Neo.py +69 -0
- PYME/Acquire/Protocols/recover671.py +62 -0
- PYME/Acquire/Protocols/sequence642_488.py +85 -0
- PYME/Acquire/Protocols/sequence642_561.py +87 -0
- PYME/Acquire/Protocols/shiftfield.py +198 -0
- PYME/Acquire/Protocols/simul488.py +59 -0
- PYME/Acquire/Protocols/simul642.py +63 -0
- PYME/Acquire/Protocols/simul642HTSMS.py +63 -0
- PYME/Acquire/Protocols/simulPA.py +37 -0
- PYME/Acquire/Protocols/simulSIM.py +76 -0
- PYME/Acquire/Protocols/simulStep.py +62 -0
- PYME/Acquire/Protocols/spdscan.py +178 -0
- PYME/Acquire/Protocols/standard470.py +45 -0
- PYME/Acquire/Protocols/standard488.py +47 -0
- PYME/Acquire/Protocols/standard671.py +48 -0
- PYME/Acquire/Protocols/standard671_no532.py +47 -0
- PYME/Acquire/Protocols/standardArclamp.py +46 -0
- PYME/Acquire/Protocols/strip_tile.py +204 -0
- PYME/Acquire/Protocols/tile.py +204 -0
- PYME/Acquire/Protocols/tile3D.py +192 -0
- PYME/Acquire/Protocols/tile671.py +190 -0
- PYME/Acquire/Protocols/tile_triggered.py +189 -0
- PYME/Acquire/Scripts/init.py +232 -0
- PYME/Acquire/Scripts/init_N1_Ti_Exeter_ZIx.py +374 -0
- PYME/Acquire/Scripts/init_N2_Ti_Zyla_lasers.py +290 -0
- PYME/Acquire/Scripts/init_Neo.py +266 -0
- PYME/Acquire/Scripts/init_NeoSim.py +159 -0
- PYME/Acquire/Scripts/init_TIRF.py +232 -0
- PYME/Acquire/Scripts/init_TIRF_Neo.py +242 -0
- PYME/Acquire/Scripts/init_TIRF_NeoO.py +241 -0
- PYME/Acquire/Scripts/init_TIRF_onecam.py +233 -0
- PYME/Acquire/Scripts/init_Ti.py +257 -0
- PYME/Acquire/Scripts/init_UOA_n.py +256 -0
- PYME/Acquire/Scripts/init_UOA_n2.py +246 -0
- PYME/Acquire/Scripts/init_Y1.py +249 -0
- PYME/Acquire/Scripts/init_Zyla.py +260 -0
- PYME/Acquire/Scripts/init_drift_tracking.py +80 -0
- PYME/Acquire/Scripts/init_emccd_basic.py +277 -0
- PYME/Acquire/Scripts/init_htsms.py +277 -0
- PYME/Acquire/Scripts/init_htsms_focus_lock.py +132 -0
- PYME/Acquire/Scripts/init_micrpi.py +45 -0
- PYME/Acquire/Scripts/init_orca.py +70 -0
- PYME/Acquire/Scripts/init_pco.py +49 -0
- PYME/Acquire/Scripts/init_rev.py +74 -0
- PYME/Acquire/Scripts/init_sim100.py +169 -0
- PYME/Acquire/Scripts/init_sim103.py +169 -0
- PYME/Acquire/Scripts/init_sim2.py +211 -0
- PYME/Acquire/Scripts/init_sim50.py +169 -0
- PYME/Acquire/Scripts/init_sim75.py +169 -0
- PYME/Acquire/Scripts/init_sim_drift_tracking.py +166 -0
- PYME/Acquire/Scripts/init_sim_htsms.py +224 -0
- PYME/Acquire/Scripts/init_sim_htsms_n.py +233 -0
- PYME/Acquire/Scripts/init_sim_main.py +229 -0
- PYME/Acquire/Scripts/init_sim_min.py +197 -0
- PYME/Acquire/Scripts/init_sim_rem.py +176 -0
- PYME/Acquire/Scripts/init_smi1.py +110 -0
- PYME/Acquire/Scripts/init_spectro.py +78 -0
- PYME/Acquire/Scripts/init_spim.py +116 -0
- PYME/Acquire/Scripts/init_thorcam.py +62 -0
- PYME/Acquire/Scripts/init_twophoton.py +112 -0
- PYME/Acquire/Scripts/init_uc480.py +262 -0
- PYME/Acquire/Scripts/init_ueye.py +261 -0
- PYME/Acquire/SpoolController.py +958 -0
- PYME/Acquire/Utils/MultiPointScanner.py +80 -0
- PYME/Acquire/Utils/__init__.py +13 -0
- PYME/Acquire/Utils/failsafe.py +157 -0
- PYME/Acquire/Utils/fastTiler.py +153 -0
- PYME/Acquire/Utils/pointScanner.py +496 -0
- PYME/Acquire/Utils/sarcSpacing.py +86 -0
- PYME/Acquire/Utils/strip_tiler.py +93 -0
- PYME/Acquire/Utils/tiler.py +464 -0
- PYME/Acquire/Utils/vibrationAnalysis.py +65 -0
- PYME/Acquire/__init__.py +44 -0
- PYME/Acquire/acquire_client.py +90 -0
- PYME/Acquire/acquire_server.py +316 -0
- PYME/Acquire/acquirebase.py +139 -0
- PYME/Acquire/acquiremainframe.py +716 -0
- PYME/Acquire/acquirewx.py +61 -0
- PYME/Acquire/acquisition_base.py +148 -0
- PYME/Acquire/actions.py +209 -0
- PYME/Acquire/autofocus.py +54 -0
- PYME/Acquire/eventLog.py +95 -0
- PYME/Acquire/event_loop.py +119 -0
- PYME/Acquire/frameWrangler.py +530 -0
- PYME/Acquire/htsms/__init__.py +8 -0
- PYME/Acquire/htsms/rule_ui.py +970 -0
- PYME/Acquire/htsms/rule_ui_v2.py +573 -0
- PYME/Acquire/htsms/tweeter.py +222 -0
- PYME/Acquire/microscope.py +1050 -0
- PYME/Acquire/positionTracker.py +181 -0
- PYME/Acquire/protocol.py +299 -0
- PYME/Acquire/protocol_acquisition.py +404 -0
- PYME/Acquire/sampleInformation.py +591 -0
- PYME/Acquire/sampleInformationDjangoDirect.py +446 -0
- PYME/Acquire/setup.py +52 -0
- PYME/Acquire/stackSettings.py +295 -0
- PYME/Acquire/stage_leveling.py +285 -0
- PYME/Acquire/ui/AnalysisSettingsUI.py +184 -0
- PYME/Acquire/ui/HDFSpoolFrame.py +584 -0
- PYME/Acquire/ui/__init__.py +0 -0
- PYME/Acquire/ui/actionUI.py +892 -0
- PYME/Acquire/ui/focus_lock_gui.py +149 -0
- PYME/Acquire/ui/intensity_trace.py +143 -0
- PYME/Acquire/ui/intsliders.py +222 -0
- PYME/Acquire/ui/lasersliders.py +329 -0
- PYME/Acquire/ui/mpd_picosecond_delay_panel.py +69 -0
- PYME/Acquire/ui/multiview_select.py +77 -0
- PYME/Acquire/ui/positionUI.py +519 -0
- PYME/Acquire/ui/preflight.py +58 -0
- PYME/Acquire/ui/scanner_panel.py +41 -0
- PYME/Acquire/ui/selectCameraPanel.py +46 -0
- PYME/Acquire/ui/seqdialog.py +501 -0
- PYME/Acquire/ui/splashScreen.py +175 -0
- PYME/Acquire/ui/spool_panel.py +830 -0
- PYME/Acquire/ui/tile_panel.py +556 -0
- PYME/Acquire/ui/tilesettingsui.py +91 -0
- PYME/Acquire/ui/voxelSizeDialog.py +149 -0
- PYME/Acquire/webui/__init__.py +36 -0
- PYME/Acquire/webui/ipy.py +361 -0
- PYME/Acquire/webui/static/css/pyme-bootstrap.css +9908 -0
- PYME/Acquire/webui/static/css/pymeacquire.css +85 -0
- PYME/Acquire/webui/static/js/pymeacquire.js +375 -0
- PYME/Acquire/webui/static/js/pzf.js +95 -0
- PYME/Acquire/webui/templates/PYMEAcquire.html +232 -0
- PYME/Acquire/webui/templates/login.html +84 -0
- PYME/Acquire/webui/templates/xtermpage.html +106 -0
- PYME/Acquire/xyztc.py +418 -0
- PYME/Acquire/zScanner.py +287 -0
- PYME/Analysis/BleachProfile/__init__.py +26 -0
- PYME/Analysis/BleachProfile/deMod.py +91 -0
- PYME/Analysis/BleachProfile/fitRecover.py +90 -0
- PYME/Analysis/BleachProfile/intensProf.py +519 -0
- PYME/Analysis/BleachProfile/kinModels.py +507 -0
- PYME/Analysis/BleachProfile/rawIntensity.py +227 -0
- PYME/Analysis/BleachProfile/rollins.py +555 -0
- PYME/Analysis/Colocalisation/__init__.py +27 -0
- PYME/Analysis/Colocalisation/colocScaleDep.py +126 -0
- PYME/Analysis/Colocalisation/correlationCoeffs.py +198 -0
- PYME/Analysis/Colocalisation/distColoc.py +110 -0
- PYME/Analysis/Colocalisation/edtColoc.py +191 -0
- PYME/Analysis/MetaData.py +278 -0
- PYME/Analysis/PSFEst/__init__.py +27 -0
- PYME/Analysis/PSFEst/dec.py +283 -0
- PYME/Analysis/PSFEst/extractImages.py +316 -0
- PYME/Analysis/PSFEst/fit_psf_zernikes.py +194 -0
- PYME/Analysis/PSFEst/psfQuality.py +225 -0
- PYME/Analysis/PSFGen/__init__.py +40 -0
- PYME/Analysis/PSFGen/fourier.py +138 -0
- PYME/Analysis/PSFGen/fourierHNA.py +1108 -0
- PYME/Analysis/PSFGen/fourierHNA2.py +979 -0
- PYME/Analysis/PSFGen/genCRBcurves.py +185 -0
- PYME/Analysis/PSFGen/nijboer_zernike.py +79 -0
- PYME/Analysis/PSFGen/ps_app.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/PSFGen/ps_app.cp313-win_amd64.pyd +0 -0
- PYME/Analysis/PSFGen/test_ps_app.py +24 -0
- PYME/Analysis/Tracking/__init__.py +3 -0
- PYME/Analysis/Tracking/msd.py +57 -0
- PYME/Analysis/Tracking/trackUtils.py +528 -0
- PYME/Analysis/Tracking/tracking.py +152 -0
- PYME/Analysis/__init__.py +30 -0
- PYME/Analysis/_fithelpers.py +161 -0
- PYME/Analysis/angleFilter.py +287 -0
- PYME/Analysis/annealThresh.py +157 -0
- PYME/Analysis/autoencoder_classifier.py +45 -0
- PYME/Analysis/binAvg.py +144 -0
- PYME/Analysis/composite.py +183 -0
- PYME/Analysis/cramerRao.py +259 -0
- PYME/Analysis/deTile.py +441 -0
- PYME/Analysis/density_filter.py +45 -0
- PYME/Analysis/distributed_pyramid.py +426 -0
- PYME/Analysis/fiducial_matching.py +220 -0
- PYME/Analysis/gen_sCMOS_maps.py +355 -0
- PYME/Analysis/graphing_filters.py +311 -0
- PYME/Analysis/implicitFilter.py +359 -0
- PYME/Analysis/keep_pairs.py +69 -0
- PYME/Analysis/optic_flow.py +108 -0
- PYME/Analysis/piecewise.py +36 -0
- PYME/Analysis/piecewiseMapping.py +304 -0
- PYME/Analysis/piezo_movement_correction.py +153 -0
- PYME/Analysis/points/DeClump/__init__.py +78 -0
- PYME/Analysis/points/DeClump/deClump.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/points/DeClump/deClump.cp313-win_amd64.pyd +0 -0
- PYME/Analysis/points/DeClump/deClumpGUI.py +87 -0
- PYME/Analysis/points/DeClump/pyDeClump.py +284 -0
- PYME/Analysis/points/DeClump/testClump.py +40 -0
- PYME/Analysis/points/DistHist/__init__.py +25 -0
- PYME/Analysis/points/DistHist/distHist.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/points/DistHist/distHist.cp313-win_amd64.pyd +0 -0
- PYME/Analysis/points/DistHist/distHistThreaded.py +71 -0
- PYME/Analysis/points/DistHist/setup.py +54 -0
- PYME/Analysis/points/EdgeDB/__init__.py +24 -0
- PYME/Analysis/points/EdgeDB/edgeDB.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/points/EdgeDB/edgeDB.cp313-win_amd64.pyd +0 -0
- PYME/Analysis/points/EdgeDB/edgeTest.py +66 -0
- PYME/Analysis/points/EdgeDB/edges.py +102 -0
- PYME/Analysis/points/EdgeDB/segment.py +75 -0
- PYME/Analysis/points/EdgeDB/setup.py +54 -0
- PYME/Analysis/points/QuadTree/QTrend.py +232 -0
- PYME/Analysis/points/QuadTree/__init__.py +25 -0
- PYME/Analysis/points/QuadTree/pointQT.py +227 -0
- PYME/Analysis/points/QuadTree/pointQTF.py +254 -0
- PYME/Analysis/points/QuadTree/qtUtils.py +36 -0
- PYME/Analysis/points/QuadTree/rendQT.py +118 -0
- PYME/Analysis/points/SoftRend/__init__.py +24 -0
- PYME/Analysis/points/SoftRend/setup.py +61 -0
- PYME/Analysis/points/SoftRend/testTetrahedra.py +41 -0
- PYME/Analysis/points/SoftRend/triRend.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/points/SoftRend/triRend.cp313-win_amd64.pyd +0 -0
- PYME/Analysis/points/__init__.py +3 -0
- PYME/Analysis/points/arcfit/__init__.py +1 -0
- PYME/Analysis/points/arcfit/arcmf.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/points/arcfit/arcmf.cp313-win_amd64.pyd +0 -0
- PYME/Analysis/points/arcfit/setup.py +51 -0
- PYME/Analysis/points/astigmatism/__init__.py +0 -0
- PYME/Analysis/points/astigmatism/astigTools.py +338 -0
- PYME/Analysis/points/astigmatism/astiglookup.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/points/astigmatism/astiglookup.cp313-win_amd64.pyd +0 -0
- PYME/Analysis/points/astigmatism/setup.py +54 -0
- PYME/Analysis/points/cluster_morphology.py +199 -0
- PYME/Analysis/points/coordinate_tools.py +278 -0
- PYME/Analysis/points/features/__init__.py +0 -0
- PYME/Analysis/points/features/metal.py +46 -0
- PYME/Analysis/points/features/shaders/vect_feat_3d.metal +49 -0
- PYME/Analysis/points/fiducials.py +142 -0
- PYME/Analysis/points/gen3DTriangs.py +796 -0
- PYME/Analysis/points/moments.py +143 -0
- PYME/Analysis/points/multiview.py +458 -0
- PYME/Analysis/points/objectMeasure.py +206 -0
- PYME/Analysis/points/qpaint.py +97 -0
- PYME/Analysis/points/rings.py +372 -0
- PYME/Analysis/points/ripleys.py +427 -0
- PYME/Analysis/points/segmentLL.py +134 -0
- PYME/Analysis/points/setup.py +56 -0
- PYME/Analysis/points/spherical_harmonics.py +909 -0
- PYME/Analysis/points/surfit.py +829 -0
- PYME/Analysis/points/tCluster.py +75 -0
- PYME/Analysis/points/traveling_salesperson/__init__.py +0 -0
- PYME/Analysis/points/traveling_salesperson/queue_opt.py +117 -0
- PYME/Analysis/points/traveling_salesperson/sectioned_two_opt.py +327 -0
- PYME/Analysis/points/traveling_salesperson/setup.py +40 -0
- PYME/Analysis/points/traveling_salesperson/sort.py +78 -0
- PYME/Analysis/points/traveling_salesperson/two_opt.py +189 -0
- PYME/Analysis/points/traveling_salesperson/two_opt_utils.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/points/traveling_salesperson/two_opt_utils.cp313-win_amd64.pyd +0 -0
- PYME/Analysis/points/traveling_salesperson/two_opt_utils.pyx +41 -0
- PYME/Analysis/points/twoColour.py +572 -0
- PYME/Analysis/points/twoColourPlot.py +107 -0
- PYME/Analysis/processLogger.py +129 -0
- PYME/Analysis/profile_extraction.py +72 -0
- PYME/Analysis/setup.py +60 -0
- PYME/Analysis/splitting.py +372 -0
- PYME/Analysis/svmSegment.py +214 -0
- PYME/Analysis/thresholding.py +192 -0
- PYME/Analysis/tile_pyramid.py +938 -0
- PYME/Analysis/widefieldify.py +54 -0
- PYME/DSView/DisplayOptionsPanel.py +503 -0
- PYME/DSView/LUT/__init__.py +33 -0
- PYME/DSView/LUT/lut.cp313-win_amd64.dll.a +0 -0
- PYME/DSView/LUT/lut.cp313-win_amd64.pyd +0 -0
- PYME/DSView/LUT/setup.py +54 -0
- PYME/DSView/OpenSequenceDialog.py +83 -0
- PYME/DSView/OverlaysPanel.py +111 -0
- PYME/DSView/__init__.py +32 -0
- PYME/DSView/arrayViewPanel.py +1035 -0
- PYME/DSView/displayOptions.py +453 -0
- PYME/DSView/displaySettingsPanel.py +271 -0
- PYME/DSView/dsviewer.py +542 -0
- PYME/DSView/eventLogViewer.py +805 -0
- PYME/DSView/fitInfo.py +486 -0
- PYME/DSView/htmlServe.py +72 -0
- PYME/DSView/logparser.py +100 -0
- PYME/DSView/modules/LMAnalysis.py +1053 -0
- PYME/DSView/modules/LMDisplay.py +194 -0
- PYME/DSView/modules/__init__.py +162 -0
- PYME/DSView/modules/_base.py +39 -0
- PYME/DSView/modules/annotation.py +725 -0
- PYME/DSView/modules/arrayView.py +71 -0
- PYME/DSView/modules/blobFinding.py +455 -0
- PYME/DSView/modules/blobMeasure.py +1093 -0
- PYME/DSView/modules/camera_maps.py +38 -0
- PYME/DSView/modules/coloc.py +414 -0
- PYME/DSView/modules/composite.py +715 -0
- PYME/DSView/modules/convnet.py +24 -0
- PYME/DSView/modules/cropping.py +133 -0
- PYME/DSView/modules/dark_and_flatfield.py +31 -0
- PYME/DSView/modules/deconvolution.py +499 -0
- PYME/DSView/modules/eventView.py +80 -0
- PYME/DSView/modules/extractBlobs.py +46 -0
- PYME/DSView/modules/fastGraphPanel.py +85 -0
- PYME/DSView/modules/filtering.py +335 -0
- PYME/DSView/modules/flowView.py +268 -0
- PYME/DSView/modules/fourierRingCorrelation.py +172 -0
- PYME/DSView/modules/gl_image_view.py +12 -0
- PYME/DSView/modules/graphViewPanel.py +272 -0
- PYME/DSView/modules/measure/__init__.py +1 -0
- PYME/DSView/modules/measure/filterPan.py +239 -0
- PYME/DSView/modules/metadataView.py +28 -0
- PYME/DSView/modules/multithreshold.py +98 -0
- PYME/DSView/modules/neuroglancer.py +129 -0
- PYME/DSView/modules/object_tagging.py +157 -0
- PYME/DSView/modules/particleTracking.py +463 -0
- PYME/DSView/modules/playback.py +256 -0
- PYME/DSView/modules/prebleachExtraction.py +75 -0
- PYME/DSView/modules/profileFitting.py +137 -0
- PYME/DSView/modules/profilePlotting.py +408 -0
- PYME/DSView/modules/projections.py +48 -0
- PYME/DSView/modules/psfExtraction.py +570 -0
- PYME/DSView/modules/psfGeneration.py +138 -0
- PYME/DSView/modules/psfTools.py +661 -0
- PYME/DSView/modules/pupilTools.py +204 -0
- PYME/DSView/modules/pupilView.py +139 -0
- PYME/DSView/modules/recipes.py +266 -0
- PYME/DSView/modules/redimension.py +75 -0
- PYME/DSView/modules/segmentation.py +192 -0
- PYME/DSView/modules/sheetView.py +24 -0
- PYME/DSView/modules/shell.py +39 -0
- PYME/DSView/modules/shiftfield_estimation.py +433 -0
- PYME/DSView/modules/sparkprepare.py +94 -0
- PYME/DSView/modules/splitter.py +148 -0
- PYME/DSView/modules/synchronise.py +64 -0
- PYME/DSView/modules/templates/astigCal.html +42 -0
- PYME/DSView/modules/templates/measureView.html +69 -0
- PYME/DSView/modules/templates/measureView2.html +48 -0
- PYME/DSView/modules/templates/measureView3.html +98 -0
- PYME/DSView/modules/templates/trackView.html +139 -0
- PYME/DSView/modules/templates/tracksOverview.html +21 -0
- PYME/DSView/modules/tiling.py +147 -0
- PYME/DSView/modules/unmixing.py +148 -0
- PYME/DSView/modules/vis3D.py +320 -0
- PYME/DSView/modules/visgui.py +163 -0
- PYME/DSView/modules/webview.py +14 -0
- PYME/DSView/overlays.py +295 -0
- PYME/DSView/scrolledImagePanel.py +188 -0
- PYME/DSView/setup.py +53 -0
- PYME/DSView/splashScreen.py +158 -0
- PYME/DSView/voxSizeDialog.py +84 -0
- PYME/Deconv/__init__.py +35 -0
- PYME/Deconv/beadGen.py +55 -0
- PYME/Deconv/dec.py +659 -0
- PYME/Deconv/decTask.py +65 -0
- PYME/Deconv/decThread.py +113 -0
- PYME/Deconv/dec_test.py +47 -0
- PYME/Deconv/deconvDialogs.py +417 -0
- PYME/Deconv/fftwWisdom.py +62 -0
- PYME/Deconv/richardsonLucy.py +141 -0
- PYME/Deconv/richardsonLucyMV.py +151 -0
- PYME/Deconv/richardsonLucyMVM.py +218 -0
- PYME/Deconv/test_block_dec.py +46 -0
- PYME/Deconv/tq_block_dec.py +331 -0
- PYME/Deconv/wiener.py +163 -0
- PYME/IO/DataSources/AlignDataSource.py +91 -0
- PYME/IO/DataSources/ArrayDataSource.py +260 -0
- PYME/IO/DataSources/BGSDataSource.py +353 -0
- PYME/IO/DataSources/BaseDataSource.py +457 -0
- PYME/IO/DataSources/BioformatsDataSource.py +178 -0
- PYME/IO/DataSources/BufferedDataSource.py +99 -0
- PYME/IO/DataSources/ClusterPZFDataSource.py +124 -0
- PYME/IO/DataSources/ConcatenatedDataSource.py +56 -0
- PYME/IO/DataSources/CropDataSource.py +243 -0
- PYME/IO/DataSources/DcimgDataSource.py +54 -0
- PYME/IO/DataSources/ElectronsPerSecondDataSource.py +61 -0
- PYME/IO/DataSources/FlatFieldDataSource.py +77 -0
- PYME/IO/DataSources/HDFDataSource.py +160 -0
- PYME/IO/DataSources/HTTPDataSource.py +80 -0
- PYME/IO/DataSources/ImageSeriesDataSource.py +123 -0
- PYME/IO/DataSources/MultiviewDataSource.py +99 -0
- PYME/IO/DataSources/OBFDataSource.py +67 -0
- PYME/IO/DataSources/RandomDataSource.py +23 -0
- PYME/IO/DataSources/SupertileDatasource.py +148 -0
- PYME/IO/DataSources/TQDataSource.py +41 -0
- PYME/IO/DataSources/TiffDataSource.py +193 -0
- PYME/IO/DataSources/TileDataSource.py +91 -0
- PYME/IO/DataSources/UnsplitDataSource.py +92 -0
- PYME/IO/DataSources/__init__.py +59 -0
- PYME/IO/FileUtils/IJLut.py +43 -0
- PYME/IO/FileUtils/RawToHdf5.py +105 -0
- PYME/IO/FileUtils/SPAD.py +54 -0
- PYME/IO/FileUtils/TiffSeqToHdf5.py +87 -0
- PYME/IO/FileUtils/__init__.py +24 -0
- PYME/IO/FileUtils/compHdf.py +39 -0
- PYME/IO/FileUtils/fileID.py +246 -0
- PYME/IO/FileUtils/fnlGen.py +40 -0
- PYME/IO/FileUtils/freeSpace.py +59 -0
- PYME/IO/FileUtils/h5-thumbnailer.py +85 -0
- PYME/IO/FileUtils/h5ExFrames.py +98 -0
- PYME/IO/FileUtils/h5ToTiffSeries.py +50 -0
- PYME/IO/FileUtils/h5r-thumbnailer.py +118 -0
- PYME/IO/FileUtils/h5rFormatDef.py +99 -0
- PYME/IO/FileUtils/h5rToTxt.py +77 -0
- PYME/IO/FileUtils/nameUtils.py +300 -0
- PYME/IO/FileUtils/obf_support.py +538 -0
- PYME/IO/FileUtils/ply.py +147 -0
- PYME/IO/FileUtils/readSpeckle.py +78 -0
- PYME/IO/FileUtils/readTiff.py +64 -0
- PYME/IO/FileUtils/saveTiffStack.py +137 -0
- PYME/IO/FileUtils/setup.py +36 -0
- PYME/IO/FileUtils/sf-thumbnailer.py +76 -0
- PYME/IO/FileUtils/stl.py +44 -0
- PYME/IO/FileUtils/thumbnailDatabase.py +104 -0
- PYME/IO/HTTPSpooler_v2.py +141 -0
- PYME/IO/MetaDataHandler.py +1072 -0
- PYME/IO/PZFFormat.py +375 -0
- PYME/IO/Spooler.py +279 -0
- PYME/IO/__init__.py +12 -0
- PYME/IO/acquisition_backends.py +353 -0
- PYME/IO/buffer_helpers.cp313-win_amd64.dll.a +0 -0
- PYME/IO/buffer_helpers.cp313-win_amd64.pyd +0 -0
- PYME/IO/buffer_helpers.pyx +190 -0
- PYME/IO/buffers.py +291 -0
- PYME/IO/clusterDuplication.py +204 -0
- PYME/IO/clusterExport.py +152 -0
- PYME/IO/clusterGlob.py +108 -0
- PYME/IO/clusterIO.py +1076 -0
- PYME/IO/clusterListing.py +232 -0
- PYME/IO/clusterResults.py +206 -0
- PYME/IO/clusterUpload.py +49 -0
- PYME/IO/cluster_directory.py +419 -0
- PYME/IO/cluster_streaming.py +216 -0
- PYME/IO/compatibility.py +12 -0
- PYME/IO/countdir/__init__.py +5 -0
- PYME/IO/countdir/setup.py +58 -0
- PYME/IO/csv_flavours.py +251 -0
- PYME/IO/dataExporter.py +470 -0
- PYME/IO/dataWrap.py +108 -0
- PYME/IO/dcimg.py +167 -0
- PYME/IO/events.py +161 -0
- PYME/IO/h5File.py +148 -0
- PYME/IO/h5rFile.py +323 -0
- PYME/IO/image.py +1447 -0
- PYME/IO/load_psf.py +26 -0
- PYME/IO/pyme_h5ls.py +58 -0
- PYME/IO/ragged.py +138 -0
- PYME/IO/rgb_image.py +94 -0
- PYME/IO/tabular.py +1338 -0
- PYME/IO/testClusterSpooling.py +199 -0
- PYME/IO/unifiedIO.py +301 -0
- PYME/LMVis/Extras/QPobjectSegment.py +220 -0
- PYME/LMVis/Extras/__init__.py +55 -0
- PYME/LMVis/Extras/animation.py +359 -0
- PYME/LMVis/Extras/annotation.py +78 -0
- PYME/LMVis/Extras/clusterAnalysis.py +460 -0
- PYME/LMVis/Extras/dockedPanel.py +69 -0
- PYME/LMVis/Extras/extra_layers.py +373 -0
- PYME/LMVis/Extras/fiducial.py +230 -0
- PYME/LMVis/Extras/flagZMotionArtifacts.py +60 -0
- PYME/LMVis/Extras/fusionUtils.py +9 -0
- PYME/LMVis/Extras/multiColourAnalysis.py +103 -0
- PYME/LMVis/Extras/multiviewMapping.py +489 -0
- PYME/LMVis/Extras/objectMeasurements.py +246 -0
- PYME/LMVis/Extras/particleTracking.py +272 -0
- PYME/LMVis/Extras/perFrameVariable.py +77 -0
- PYME/LMVis/Extras/photophysics.py +72 -0
- PYME/LMVis/Extras/pointSetGeneration.py +232 -0
- PYME/LMVis/Extras/pointwiseColoc.py +54 -0
- PYME/LMVis/Extras/saved_views.py +125 -0
- PYME/LMVis/Extras/scaleBox.py +115 -0
- PYME/LMVis/Extras/sequentialSpecies.py +125 -0
- PYME/LMVis/Extras/setBGImage.py +74 -0
- PYME/LMVis/Extras/shiftmapGenerator.py +138 -0
- PYME/LMVis/Extras/showShortcuts.py +69 -0
- PYME/LMVis/Extras/snapshot.py +135 -0
- PYME/LMVis/Extras/spherical_harmonics.py +98 -0
- PYME/LMVis/Extras/subsets.py +15 -0
- PYME/LMVis/Extras/surface_fitting.py +52 -0
- PYME/LMVis/Extras/temperaturePlot.py +53 -0
- PYME/LMVis/Extras/vibration.py +112 -0
- PYME/LMVis/VisGUI.py +506 -0
- PYME/LMVis/__init__.py +39 -0
- PYME/LMVis/colourFilterGUI.py +77 -0
- PYME/LMVis/colourPanel.py +491 -0
- PYME/LMVis/displayPane.py +462 -0
- PYME/LMVis/dyeRatios.py +116 -0
- PYME/LMVis/genImageDialog.py +298 -0
- PYME/LMVis/gl_offScreenHandler.py +134 -0
- PYME/LMVis/gl_render.py +1302 -0
- PYME/LMVis/gl_render3D.py +1453 -0
- PYME/LMVis/gl_render3D_shaders.py +1213 -0
- PYME/LMVis/glcanvas_core.py +1157 -0
- PYME/LMVis/imageView.py +752 -0
- PYME/LMVis/imageView2.py +372 -0
- PYME/LMVis/importTextDialog.py +342 -0
- PYME/LMVis/layer_panel.py +231 -0
- PYME/LMVis/layers/AxesOverlayLayer.py +126 -0
- PYME/LMVis/layers/LUTOverlayLayer.py +346 -0
- PYME/LMVis/layers/OverlayLayer.py +46 -0
- PYME/LMVis/layers/ScaleBarOverlayLayer.py +97 -0
- PYME/LMVis/layers/ScaleBoxOverlayLayer.py +181 -0
- PYME/LMVis/layers/SelectionOverlayLayer.py +124 -0
- PYME/LMVis/layers/__init__.py +53 -0
- PYME/LMVis/layers/base.py +319 -0
- PYME/LMVis/layers/image_layer.py +363 -0
- PYME/LMVis/layers/labels.py +186 -0
- PYME/LMVis/layers/layer_defaults.py +97 -0
- PYME/LMVis/layers/mesh.py +378 -0
- PYME/LMVis/layers/octree.py +194 -0
- PYME/LMVis/layers/pointcloud.py +372 -0
- PYME/LMVis/layers/quiver.py +271 -0
- PYME/LMVis/layers/text.py +250 -0
- PYME/LMVis/layers/tracks.py +309 -0
- PYME/LMVis/mv_math.py +78 -0
- PYME/LMVis/objectDarkMeasure.py +120 -0
- PYME/LMVis/pipeline.py +1227 -0
- PYME/LMVis/pipelineView.py +115 -0
- PYME/LMVis/pointSettingsPanel.py +135 -0
- PYME/LMVis/progGraph.py +59 -0
- PYME/LMVis/quadTreeSettings.py +90 -0
- PYME/LMVis/rendGauss.py +158 -0
- PYME/LMVis/renderers.py +576 -0
- PYME/LMVis/sessionpaths.py +136 -0
- PYME/LMVis/setup.py +39 -0
- PYME/LMVis/setup_exe.py +71 -0
- PYME/LMVis/shader_programs/DefaultShaderProgram.py +149 -0
- PYME/LMVis/shader_programs/GLProgram.py +119 -0
- PYME/LMVis/shader_programs/GouraudShaderProgram.py +157 -0
- PYME/LMVis/shader_programs/PointSpriteShaderProgram.py +163 -0
- PYME/LMVis/shader_programs/ShaderProgramFactory.py +54 -0
- PYME/LMVis/shader_programs/TesselShaderProgram.py +47 -0
- PYME/LMVis/shader_programs/WireFrameShaderProgram.py +50 -0
- PYME/LMVis/shader_programs/__init__.py +20 -0
- PYME/LMVis/shader_programs/oit_compositor.py +23 -0
- PYME/LMVis/shader_programs/shader_loader.py +84 -0
- PYME/LMVis/shader_programs/shader_program.py +168 -0
- PYME/LMVis/shader_programs/shaders/bigflatpoints_fs.glsl +16 -0
- PYME/LMVis/shader_programs/shaders/bigpoints_gs.glsl +40 -0
- PYME/LMVis/shader_programs/shaders/bigpointsprites_fs.glsl +20 -0
- PYME/LMVis/shader_programs/shaders/bigspheres_fs.glsl +53 -0
- PYME/LMVis/shader_programs/shaders/compose_fs.glsl +41 -0
- PYME/LMVis/shader_programs/shaders/compose_vs.glsl +25 -0
- PYME/LMVis/shader_programs/shaders/default_fs.glsl +27 -0
- PYME/LMVis/shader_programs/shaders/default_vs.glsl +88 -0
- PYME/LMVis/shader_programs/shaders/flatpoints_fs.glsl +27 -0
- PYME/LMVis/shader_programs/shaders/gouraud_flatpoints_fs.glsl +30 -0
- PYME/LMVis/shader_programs/shaders/gouraud_fs.glsl +26 -0
- PYME/LMVis/shader_programs/shaders/gouraud_oit_fs.glsl +68 -0
- PYME/LMVis/shader_programs/shaders/gouraud_vs.glsl +135 -0
- PYME/LMVis/shader_programs/shaders/image_fs.glsl +60 -0
- PYME/LMVis/shader_programs/shaders/image_vs.glsl +79 -0
- PYME/LMVis/shader_programs/shaders/phong_fs.glsl +43 -0
- PYME/LMVis/shader_programs/shaders/phong_vs.glsl +45 -0
- PYME/LMVis/shader_programs/shaders/pointsprites_fs.glsl +33 -0
- PYME/LMVis/shader_programs/shaders/pointsprites_vs.glsl +77 -0
- PYME/LMVis/shader_programs/shaders/spheres_fs.glsl +102 -0
- PYME/LMVis/shader_programs/shaders/tessel_fs.glsl +23 -0
- PYME/LMVis/shader_programs/shaders/tessel_vs.glsl +37 -0
- PYME/LMVis/shader_programs/shaders/text_fs.glsl +42 -0
- PYME/LMVis/shader_programs/shaders/text_vs.glsl +84 -0
- PYME/LMVis/shader_programs/shaders/widelines_fs.glsl +19 -0
- PYME/LMVis/shader_programs/shaders/widelines_gs.glsl +56 -0
- PYME/LMVis/shader_programs/shaders/widelines_vs.glsl +51 -0
- PYME/LMVis/statusLog.py +57 -0
- PYME/LMVis/triBlobs.py +142 -0
- PYME/LMVis/view_clipping_pane.py +429 -0
- PYME/LMVis/views.py +275 -0
- PYME/LMVis/visCore.py +1005 -0
- PYME/LMVis/visHelpers.py +880 -0
- PYME/LMVis/visHelpersMin.py +230 -0
- PYME/LMVis/workspaceTree.py +238 -0
- PYME/__init__.py +22 -0
- PYME/cluster/HTTPDataServer.py +1063 -0
- PYME/cluster/HTTPRulePusher.py +382 -0
- PYME/cluster/HTTPTaskPusher.py +377 -0
- PYME/cluster/PYMERuleNodeServer.py +192 -0
- PYME/cluster/PYMERuleServer.py +109 -0
- PYME/cluster/__init__.py +0 -0
- PYME/cluster/clusterUI/accounts/__init__.py +0 -0
- PYME/cluster/clusterUI/accounts/admin.py +85 -0
- PYME/cluster/clusterUI/accounts/forms.py +8 -0
- PYME/cluster/clusterUI/accounts/migrations/0001_initial.py +31 -0
- PYME/cluster/clusterUI/accounts/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/accounts/models.py +44 -0
- PYME/cluster/clusterUI/accounts/templates/accounts/user_form.html +13 -0
- PYME/cluster/clusterUI/accounts/templates/registration/initial_complete.html +6 -0
- PYME/cluster/clusterUI/accounts/templates/registration/initial_confirm.html +13 -0
- PYME/cluster/clusterUI/accounts/templates/registration/initial_done.html +7 -0
- PYME/cluster/clusterUI/accounts/templates/registration/verification.html +2 -0
- PYME/cluster/clusterUI/accounts/templates/registration/verification_subject.txt +1 -0
- PYME/cluster/clusterUI/accounts/urls.py +19 -0
- PYME/cluster/clusterUI/accounts/views.py +36 -0
- PYME/cluster/clusterUI/clusterUI/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterUI/settings.py +147 -0
- PYME/cluster/clusterUI/clusterUI/urls.py +31 -0
- PYME/cluster/clusterUI/clusterUI/wsgi.py +16 -0
- PYME/cluster/clusterUI/clusterbrowser/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterbrowser/admin.py +3 -0
- PYME/cluster/clusterUI/clusterbrowser/apps.py +7 -0
- PYME/cluster/clusterUI/clusterbrowser/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterbrowser/models.py +5 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/base.html +129 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/dirlisting.html +231 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/form_new_folder.html +18 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/form_upload_file.html +17 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/lightlisting.html +25 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/registration/login.html +38 -0
- PYME/cluster/clusterUI/clusterbrowser/urls.py +10 -0
- PYME/cluster/clusterUI/clusterbrowser/views.py +148 -0
- PYME/cluster/clusterUI/clusterstatus/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterstatus/admin.py +3 -0
- PYME/cluster/clusterUI/clusterstatus/apps.py +7 -0
- PYME/cluster/clusterUI/clusterstatus/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterstatus/models.py +5 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/load_content.html +29 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/queue_info.html +28 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/queue_info_content.html +50 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/status_dash.html +29 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/status_dash_content.html +90 -0
- PYME/cluster/clusterUI/clusterstatus/urls.py +9 -0
- PYME/cluster/clusterUI/clusterstatus/views.py +69 -0
- PYME/cluster/clusterUI/clusterui_tornado.py +117 -0
- PYME/cluster/clusterUI/deploy.py +62 -0
- PYME/cluster/clusterUI/localization/__init__.py +0 -0
- PYME/cluster/clusterUI/localization/admin.py +3 -0
- PYME/cluster/clusterUI/localization/apps.py +7 -0
- PYME/cluster/clusterUI/localization/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/localization/models.py +5 -0
- PYME/cluster/clusterUI/localization/templates/localization/settings_form.html +67 -0
- PYME/cluster/clusterUI/localization/urls.py +10 -0
- PYME/cluster/clusterUI/localization/views.py +170 -0
- PYME/cluster/clusterUI/manage.py +17 -0
- PYME/cluster/clusterUI/recipes/__init__.py +0 -0
- PYME/cluster/clusterUI/recipes/admin.py +3 -0
- PYME/cluster/clusterUI/recipes/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/recipes/models.py +3 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/extra_inputs.html +35 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/form_recipe.html +82 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/input_list.html +7 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editor.html +28 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editor_common.html +46 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editrun.html +93 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_standalone.html +100 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_template.html +109 -0
- PYME/cluster/clusterUI/recipes/urls.py +17 -0
- PYME/cluster/clusterUI/recipes/views.py +109 -0
- PYME/cluster/cluster_of_one.py +204 -0
- PYME/cluster/dataserver_wsgi.py +615 -0
- PYME/cluster/distribution.py +71 -0
- PYME/cluster/rulenodeserver.py +487 -0
- PYME/cluster/rules.py +979 -0
- PYME/cluster/ruleserver.py +1106 -0
- PYME/cluster/status.py +101 -0
- PYME/cluster/taskWorkerHTTP.py +522 -0
- PYME/cluster/webdav.py +1102 -0
- PYME/config.py +659 -0
- PYME/contrib/TextCtrlAutoComplete.py +582 -0
- PYME/contrib/__init__.py +7 -0
- PYME/contrib/aniso/__init__.py +2 -0
- PYME/contrib/aniso/aniso.py +268 -0
- PYME/contrib/auiFloatBook.py +94 -0
- PYME/contrib/congrid.py +127 -0
- PYME/contrib/dispatch/__init__.py +19 -0
- PYME/contrib/dispatch/dispatcher.py +289 -0
- PYME/contrib/gohlke/__init__.py +1 -0
- PYME/contrib/gohlke/_tifffile.cp313-win_amd64.dll.a +0 -0
- PYME/contrib/gohlke/_tifffile.cp313-win_amd64.pyd +0 -0
- PYME/contrib/gohlke/czifile.py +1289 -0
- PYME/contrib/gohlke/fcsfiles.py +514 -0
- PYME/contrib/gohlke/setup.py +54 -0
- PYME/contrib/gohlke/tifffile.py +3095 -0
- PYME/contrib/listctrlMixins.py +896 -0
- PYME/contrib/lzw.py +838 -0
- PYME/contrib/pad/__init__.py +13 -0
- PYME/contrib/pad/info_pad.py +18 -0
- PYME/contrib/pad/pad.py +670 -0
- PYME/contrib/setup.py +38 -0
- PYME/contrib/wxPlotPanel.py +137 -0
- PYME/experimental/SimReconstruction.py +49 -0
- PYME/experimental/__init__.pxd +0 -0
- PYME/experimental/__init__.py +4 -0
- PYME/experimental/_octree.cp313-win_amd64.dll.a +0 -0
- PYME/experimental/_octree.cp313-win_amd64.pyd +0 -0
- PYME/experimental/_octree.pyx +477 -0
- PYME/experimental/_treap.cp313-win_amd64.dll.a +0 -0
- PYME/experimental/_treap.cp313-win_amd64.pyd +0 -0
- PYME/experimental/_treap.pyx +267 -0
- PYME/experimental/_triangle_mesh.cp313-win_amd64.dll.a +0 -0
- PYME/experimental/_triangle_mesh.cp313-win_amd64.pyd +0 -0
- PYME/experimental/_triangle_mesh.pxd +149 -0
- PYME/experimental/_triangle_mesh.pyx +2787 -0
- PYME/experimental/aqavg.py +40 -0
- PYME/experimental/dcimgFileChucker.py +375 -0
- PYME/experimental/dcimgSpoolShim.py +174 -0
- PYME/experimental/dcimg_chuck_test.py +78 -0
- PYME/experimental/dual_marching_cubes.py +801 -0
- PYME/experimental/dual_marching_cubes_v2.py +645 -0
- PYME/experimental/expectationMaximisation.py +298 -0
- PYME/experimental/func_octree.cp313-win_amd64.dll.a +0 -0
- PYME/experimental/func_octree.cp313-win_amd64.pyd +0 -0
- PYME/experimental/func_octree.pyx +381 -0
- PYME/experimental/fusionRadial.py +520 -0
- PYME/experimental/fusionUtils.py +522 -0
- PYME/experimental/isosurface.py +147 -0
- PYME/experimental/labview_spooling_hacks.py +48 -0
- PYME/experimental/marching_cubes.py +811 -0
- PYME/experimental/marching_tetrahedra.py +343 -0
- PYME/experimental/modified_marching_cubes.py +1245 -0
- PYME/experimental/music.py +25 -0
- PYME/experimental/octree.py +188 -0
- PYME/experimental/pSpaceMap.py +34 -0
- PYME/experimental/pointFitConfoc.py +112 -0
- PYME/experimental/scanner_control.py +107 -0
- PYME/experimental/setup.py +109 -0
- PYME/experimental/spark.py +31 -0
- PYME/experimental/tcHist.py +71 -0
- PYME/experimental/treap.py +262 -0
- PYME/experimental/triangle_mesh.py +2287 -0
- PYME/experimental/triangle_mesh_utils.cp313-win_amd64.dll.a +0 -0
- PYME/experimental/triangle_mesh_utils.cp313-win_amd64.pyd +0 -0
- PYME/experimental/triangle_utils.py +87 -0
- PYME/experimental/triangular_mesh.py +2255 -0
- PYME/experimental/zMotionArtifactUtils.py +55 -0
- PYME/localization/FitFactories/AstigGaussFitFR.py +175 -0
- PYME/localization/FitFactories/AstigGaussGPUFitFR.py +326 -0
- PYME/localization/FitFactories/BeadConvolvedAstigGaussFit.py +206 -0
- PYME/localization/FitFactories/ChecksumFR.py +82 -0
- PYME/localization/FitFactories/ChecksumGPUFR.py +213 -0
- PYME/localization/FitFactories/ChecksumMultifitSR.py +86 -0
- PYME/localization/FitFactories/ConfocCOIR.py +93 -0
- PYME/localization/FitFactories/Dumbell3DFitR.py +193 -0
- PYME/localization/FitFactories/DumbellFitR.py +163 -0
- PYME/localization/FitFactories/FFBase.py +403 -0
- PYME/localization/FitFactories/Gauss3DFitR.py +213 -0
- PYME/localization/FitFactories/GaussFitConstrR.py +177 -0
- PYME/localization/FitFactories/GaussMultifitLinesR.py +351 -0
- PYME/localization/FitFactories/GaussMultifitR.py +326 -0
- PYME/localization/FitFactories/GaussMultifitSR.py +373 -0
- PYME/localization/FitFactories/InterpFitR.py +236 -0
- PYME/localization/FitFactories/InterpFitWFR.py +111 -0
- PYME/localization/FitFactories/Interpolators/CSInterpolator.py +148 -0
- PYME/localization/FitFactories/Interpolators/CubeSInterpolatorP.py +121 -0
- PYME/localization/FitFactories/Interpolators/CubicSplineInterpolator.py +69 -0
- PYME/localization/FitFactories/Interpolators/LinearInterpolator.py +135 -0
- PYME/localization/FitFactories/Interpolators/LinearPInterpolatorP.py +95 -0
- PYME/localization/FitFactories/Interpolators/__init__.py +33 -0
- PYME/localization/FitFactories/Interpolators/baseInterpolator.py +202 -0
- PYME/localization/FitFactories/LatFitCOIR.py +82 -0
- PYME/localization/FitFactories/LatGaussFitFR.py +220 -0
- PYME/localization/FitFactories/LatObjFindFR.py +85 -0
- PYME/localization/FitFactories/LatPSFFitR.py +142 -0
- PYME/localization/FitFactories/MultiviewFitInterpNR.py +400 -0
- PYME/localization/FitFactories/PRInterpFitQR.py +192 -0
- PYME/localization/FitFactories/PRInterpFitR.py +223 -0
- PYME/localization/FitFactories/ROIExtractNR.py +93 -0
- PYME/localization/FitFactories/SpecGaussFitFR.py +174 -0
- PYME/localization/FitFactories/SplitterFitCOIR.py +142 -0
- PYME/localization/FitFactories/SplitterFitFNR.py +312 -0
- PYME/localization/FitFactories/SplitterFitFusionR.py +318 -0
- PYME/localization/FitFactories/SplitterFitInterpBNR.py +357 -0
- PYME/localization/FitFactories/SplitterFitInterpNR.py +343 -0
- PYME/localization/FitFactories/SplitterFitScavNR.py +352 -0
- PYME/localization/FitFactories/SplitterMultifitSR.py +410 -0
- PYME/localization/FitFactories/SplitterObjFindR.py +194 -0
- PYME/localization/FitFactories/SplitterROIExtractNR.py +91 -0
- PYME/localization/FitFactories/SplitterShiftEstFR.py +230 -0
- PYME/localization/FitFactories/__init__.py +103 -0
- PYME/localization/FitFactories/fitCommon.py +195 -0
- PYME/localization/FitFactories/zEstimators/__init__.py +29 -0
- PYME/localization/FitFactories/zEstimators/astigEstimator.py +173 -0
- PYME/localization/FitFactories/zEstimators/biplaneEstimator.py +209 -0
- PYME/localization/FitFactories/zEstimators/genericDualEstimator.py +232 -0
- PYME/localization/FitFactories/zEstimators/genericEstimator.py +224 -0
- PYME/localization/FitFactories/zEstimators/priEstimator.py +255 -0
- PYME/localization/MetaDataEdit.py +543 -0
- PYME/localization/Test/30_9_series_A_1.sf +0 -0
- PYME/localization/Test/PRI.md +45 -0
- PYME/localization/Test/PRI_qr.md +52 -0
- PYME/localization/Test/PRI_r.md +52 -0
- PYME/localization/Test/__init__.py +22 -0
- PYME/localization/Test/astig.md +50 -0
- PYME/localization/Test/astigCOI.md +50 -0
- PYME/localization/Test/astig_gauss.md +52 -0
- PYME/localization/Test/astig_pe.md +50 -0
- PYME/localization/Test/astig_splitter.md +66 -0
- PYME/localization/Test/astig_splitterCOI.md +67 -0
- PYME/localization/Test/astig_splitterQ.md +66 -0
- PYME/localization/Test/astig_theory.md +50 -0
- PYME/localization/Test/astig_theory.psf +0 -0
- PYME/localization/Test/astig_theory.tif +0 -0
- PYME/localization/Test/beads1.psf +0 -0
- PYME/localization/Test/beads1.tif +0 -0
- PYME/localization/Test/biplane_splitter.md +75 -0
- PYME/localization/Test/biplane_splitter2.md +103 -0
- PYME/localization/Test/biplane_splitter3.md +115 -0
- PYME/localization/Test/defoc.md +48 -0
- PYME/localization/Test/dumbell_3d.md +52 -0
- PYME/localization/Test/fitTestJig.py +172 -0
- PYME/localization/Test/fitTestJigSCMOS.py +487 -0
- PYME/localization/Test/fitTestJigWC.py +225 -0
- PYME/localization/Test/gauss.md +50 -0
- PYME/localization/Test/gaussCOI.md +50 -0
- PYME/localization/Test/pri_pe.md +50 -0
- PYME/localization/Test/pri_theory.md +51 -0
- PYME/localization/Test/pri_theory.psf +0 -0
- PYME/localization/Test/pri_theory.tif +0 -0
- PYME/localization/Test/psf_astig.psf +0 -0
- PYME/localization/Test/psf_astig.tif +0 -0
- PYME/localization/Test/psf_astig_bg_d.psf +0 -0
- PYME/localization/Test/psf_astig_bg_d.tif +0 -0
- PYME/localization/Test/psf_astig_pe.psf +0 -0
- PYME/localization/Test/psf_astig_pe.tif +0 -0
- PYME/localization/Test/psf_decon.psf +0 -0
- PYME/localization/Test/psf_decon.tif +0 -0
- PYME/localization/Test/psf_decon_pe.psf +0 -0
- PYME/localization/Test/psf_decon_pe.tif +0 -0
- PYME/localization/Test/psf_guess.psf +0 -0
- PYME/localization/Test/splitter.md +63 -0
- PYME/localization/Test/splitter_scav.md +63 -0
- PYME/localization/Test/test.psf +0 -0
- PYME/localization/Test/test.tif +0 -0
- PYME/localization/Test/test_decon.psf +0 -0
- PYME/localization/Test/test_decon.tif +0 -0
- PYME/localization/Test/test_pe.psf +0 -0
- PYME/localization/Test/test_pe.tif +0 -0
- PYME/localization/Test/wf_theory.psf +0 -0
- PYME/localization/Test/wf_theory2.psf +0 -0
- PYME/localization/__init__.py +17 -0
- PYME/localization/autopsf/__init__.py +1 -0
- PYME/localization/autopsf/autopsf.py +486 -0
- PYME/localization/autopsf/roifit.py +310 -0
- PYME/localization/cInterp/__init__.py +24 -0
- PYME/localization/cInterp/cInterp.cp313-win_amd64.dll.a +0 -0
- PYME/localization/cInterp/cInterp.cp313-win_amd64.pyd +0 -0
- PYME/localization/cInterp/setup.py +54 -0
- PYME/localization/cModels/__init__.py +24 -0
- PYME/localization/cModels/gauss_app.cp313-win_amd64.dll.a +0 -0
- PYME/localization/cModels/gauss_app.cp313-win_amd64.pyd +0 -0
- PYME/localization/ofind.py +444 -0
- PYME/localization/ofind3d.py +306 -0
- PYME/localization/ofind_nofilt.py +128 -0
- PYME/localization/ofind_pri.py +478 -0
- PYME/localization/ofind_split.py +399 -0
- PYME/localization/ofind_xcorr.py +351 -0
- PYME/localization/ofind_xcorr_fw.py +441 -0
- PYME/localization/remFitBuf.py +657 -0
- PYME/localization/setup.py +56 -0
- PYME/localization/splitting.py +240 -0
- PYME/localization/twist.py +60 -0
- PYME/misc/TiSettings.py +36 -0
- PYME/misc/TiffImagePlugin.py +838 -0
- PYME/misc/VolProj.py +144 -0
- PYME/misc/__init__.py +25 -0
- PYME/misc/aligned_array.py +10 -0
- PYME/misc/aniso.py +29 -0
- PYME/misc/big_sur_fix.py +20 -0
- PYME/misc/check_for_updates.py +139 -0
- PYME/misc/colormaps.py +199 -0
- PYME/misc/colorsys.py +201 -0
- PYME/misc/computerName.py +33 -0
- PYME/misc/coverslipGeometries.py +60 -0
- PYME/misc/cython_numpy_monkey.py +40 -0
- PYME/misc/depGraph.py +406 -0
- PYME/misc/dirSize.py +31 -0
- PYME/misc/diskCleanup.py +64 -0
- PYME/misc/djangoRecarray.py +57 -0
- PYME/misc/django_widgets.py +27 -0
- PYME/misc/editgrid.py +101 -0
- PYME/misc/eventSpy.py +122 -0
- PYME/misc/exceptions.py +30 -0
- PYME/misc/facsPlot.py +89 -0
- PYME/misc/fbpIcons.py +90 -0
- PYME/misc/fftw_compat.py +28 -0
- PYME/misc/findCycles.py +91 -0
- PYME/misc/fortran_interrupt_defeat.py +43 -0
- PYME/misc/glassModel.py +64 -0
- PYME/misc/hash32.py +41 -0
- PYME/misc/hillcurve.py +88 -0
- PYME/misc/hybrid_ns.py +84 -0
- PYME/misc/kdFit.py +72 -0
- PYME/misc/locate.py +10 -0
- PYME/misc/memUsage.py +65 -0
- PYME/misc/memmap.py +52 -0
- PYME/misc/mock_ctypes.py +28 -0
- PYME/misc/mock_traits.py +59 -0
- PYME/misc/mock_traitsui.py +29 -0
- PYME/misc/pyme_zeroconf.py +287 -0
- PYME/misc/pyro_tracebacks.py +32 -0
- PYME/misc/read_agf.py +605 -0
- PYME/misc/sffake.py +16 -0
- PYME/misc/snells.py +71 -0
- PYME/misc/sqlite_ns.py +132 -0
- PYME/misc/sqlitendarray.py +56 -0
- PYME/misc/taskDef.py +44 -0
- PYME/misc/tempDB.py +56 -0
- PYME/misc/wxThread.py +33 -0
- PYME/misc/zemax.py +259 -0
- PYME/misc/zernike.py +151 -0
- PYME/pyme_warnings.py +70 -0
- PYME/recipes/Recipes/STEDDeconvolution.yaml +14 -0
- PYME/recipes/Recipes/STEDMinistacks.yaml +15 -0
- PYME/recipes/Recipes/STED_COP3.yaml +25 -0
- PYME/recipes/Recipes/blobMeas.yaml +19 -0
- PYME/recipes/Recipes/blobMeas2.yaml +37 -0
- PYME/recipes/Recipes/blobMeasSR.yaml +66 -0
- PYME/recipes/Recipes/coloc.yaml +43 -0
- PYME/recipes/Recipes/coloc_roi_masked.yaml +46 -0
- PYME/recipes/Recipes/multiblob.yaml +38 -0
- PYME/recipes/Recipes/pre_particleTracking.yaml +30 -0
- PYME/recipes/Recipes/segmentAndMeasureLoci.yaml +41 -0
- PYME/recipes/__init__.py +6 -0
- PYME/recipes/acquisition.py +158 -0
- PYME/recipes/bakeshop.py +32 -0
- PYME/recipes/base.py +1393 -0
- PYME/recipes/batchProcess.py +147 -0
- PYME/recipes/filters.py +394 -0
- PYME/recipes/fudges.py +41 -0
- PYME/recipes/graphing.py +108 -0
- PYME/recipes/html_recipe_editor.py +90 -0
- PYME/recipes/localisations.py +1386 -0
- PYME/recipes/machine_learning.py +286 -0
- PYME/recipes/measurement.py +1062 -0
- PYME/recipes/modules.py +50 -0
- PYME/recipes/multiview.py +435 -0
- PYME/recipes/output.py +667 -0
- PYME/recipes/pointcloud.py +510 -0
- PYME/recipes/processing.py +2954 -0
- PYME/recipes/pyramid.py +206 -0
- PYME/recipes/recipe.py +965 -0
- PYME/recipes/recipeGui.py +1029 -0
- PYME/recipes/recipeLayout.py +499 -0
- PYME/recipes/runRecipe.py +140 -0
- PYME/recipes/setup.py +37 -0
- PYME/recipes/simulation.py +91 -0
- PYME/recipes/skfilters.py +143 -0
- PYME/recipes/surface_fitting.py +776 -0
- PYME/recipes/tablefilters.py +275 -0
- PYME/recipes/tracking.py +343 -0
- PYME/recipes/traits.py +157 -0
- PYME/recipes/vertical_recipe_display.py +373 -0
- PYME/resources/__init__.py +23 -0
- PYME/resources/config_template/distributor.yaml +14 -0
- PYME/resources/config_template/nodeserver.yaml +15 -0
- PYME/resources/icons/LUT.png +0 -0
- PYME/resources/icons/YSM_Shield.png +0 -0
- PYME/resources/icons/YSM_logo.png +0 -0
- PYME/resources/icons/arrow.png +0 -0
- PYME/resources/icons/crosshairs.png +0 -0
- PYME/resources/icons/line_select.png +0 -0
- PYME/resources/icons/logo_fmhs.png +0 -0
- PYME/resources/icons/media-playback-pause.png +0 -0
- PYME/resources/icons/media-playback-start.png +0 -0
- PYME/resources/icons/media-skip-backward.png +0 -0
- PYME/resources/icons/media-skip-forward.png +0 -0
- PYME/resources/icons/mesh.png +0 -0
- PYME/resources/icons/mesh.svg +28 -0
- PYME/resources/icons/pmacquire.icns +0 -0
- PYME/resources/icons/pmacquire.ico +0 -0
- PYME/resources/icons/pmanal.icns +0 -0
- PYME/resources/icons/pmanal.ico +0 -0
- PYME/resources/icons/pmvis.icns +0 -0
- PYME/resources/icons/pmvis.ico +0 -0
- PYME/resources/icons/points.png +0 -0
- PYME/resources/icons/points.svg +16 -0
- PYME/resources/icons/pymeLogo.png +0 -0
- PYME/resources/icons/rect_select.png +0 -0
- PYME/resources/icons/squiggle_select.png +0 -0
- PYME/resources/icons/text3800.icns +0 -0
- PYME/resources/icons/text3800.ico +0 -0
- PYME/resources/icons/text3800.png +0 -0
- PYME/resources/icons/text3800.tif +0 -0
- PYME/resources/icons/text5377.icns +0 -0
- PYME/resources/icons/text5377.ico +0 -0
- PYME/resources/icons/text5377.png +0 -0
- PYME/resources/icons/tracks.png +0 -0
- PYME/resources/icons/tracks.svg +19 -0
- PYME/resources/icons/view-front.png +0 -0
- PYME/resources/icons/view-home.png +0 -0
- PYME/resources/icons/view-right.png +0 -0
- PYME/resources/icons/view-top.png +0 -0
- PYME/resources/test_datasets/README.md +8 -0
- PYME/resources/test_datasets/t_im.tif +0 -0
- PYME/resources/test_datasets/test_csv.csv +4282 -0
- PYME/resources/test_datasets/test_hdf.hdf +0 -0
- PYME/resources/web/rule_inline.html +21 -0
- PYME/resources/web/ruleserver.html +75 -0
- PYME/resources/web/static/bootstrap.min.js +7 -0
- PYME/resources/web/static/cluster.css +137 -0
- PYME/resources/web/static/css/bootstrap-theme.css +587 -0
- PYME/resources/web/static/css/bootstrap-theme.min.css +6 -0
- PYME/resources/web/static/css/bootstrap.css +6757 -0
- PYME/resources/web/static/css/bootstrap.min.css +6 -0
- PYME/resources/web/static/css/flat_design_colors_full.css +306 -0
- PYME/resources/web/static/css/recipe_editor.css +106 -0
- PYME/resources/web/static/dashboard.css +106 -0
- PYME/resources/web/static/fileselector.js +77 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.eot +0 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.svg +288 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.ttf +0 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.woff +0 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.woff2 +0 -0
- PYME/resources/web/static/images/osd_flat/LICENSE.txt +116 -0
- PYME/resources/web/static/images/osd_flat/README.md +9 -0
- PYME/resources/web/static/images/osd_flat/fullpage_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/fullpage_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/fullpage_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/fullpage_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_rest.png +0 -0
- PYME/resources/web/static/jigna-vue-bare.js +1395 -0
- PYME/resources/web/static/jquery.min.js +2 -0
- PYME/resources/web/static/jstree.min.js +6 -0
- PYME/resources/web/static/openSeadragonGL.js +102 -0
- PYME/resources/web/static/openseadragon-svg-overlay.js +103 -0
- PYME/resources/web/static/openseadragon-viewerinputhook.min.js +6 -0
- PYME/resources/web/static/openseadragon.min.js +9 -0
- PYME/resources/web/static/recipe_editor.js +119 -0
- PYME/resources/web/static/shaders/fragment/lut.glsl +20 -0
- PYME/resources/web/static/shaders/fragment/none.glsl +17 -0
- PYME/resources/web/static/shaders/fragment/outline.glsl +43 -0
- PYME/resources/web/static/shaders/fragment/rect.glsl +7 -0
- PYME/resources/web/static/shaders/fragment/sobel3.glsl +71 -0
- PYME/resources/web/static/shaders/fragment/white.glsl +4 -0
- PYME/resources/web/static/shaders/vertex/rect.glsl +22 -0
- PYME/resources/web/static/shaders/vertex/square.glsl +9 -0
- PYME/resources/web/static/utils.js +3 -0
- PYME/resources/web/static/viaWebGL.js +217 -0
- PYME/setup.py +109 -0
- PYME/setup_exe.py +57 -0
- PYME/simulation/__init__.py +0 -0
- PYME/simulation/locify.py +319 -0
- PYME/simulation/pointsets.py +279 -0
- PYME/simulation/wormlike.py +99 -0
- PYME/simulation/wormlike2.py +198 -0
- PYME/simulation/wormlike3.py +197 -0
- PYME/simulation/wormlike_curled.py +104 -0
- PYME/tileviewer/__init__.py +0 -0
- PYME/tileviewer/templates/roi_list.html +12 -0
- PYME/tileviewer/templates/tileviewer.html +247 -0
- PYME/tileviewer/tileviewer.py +207 -0
- PYME/ui/AUIFrame.py +279 -0
- PYME/ui/MetadataTree.py +469 -0
- PYME/ui/__init__.py +4 -0
- PYME/ui/about_dlg.py +29 -0
- PYME/ui/autoFoldPanel.py +643 -0
- PYME/ui/cascading_layout.py +45 -0
- PYME/ui/crop_dialog.py +145 -0
- PYME/ui/custom_traits_editors.py +508 -0
- PYME/ui/editFilterDialog.py +80 -0
- PYME/ui/editList.py +40 -0
- PYME/ui/fastGraph.py +240 -0
- PYME/ui/filterPane.py +348 -0
- PYME/ui/histLimits.py +543 -0
- PYME/ui/layerFoldPanel.py +232 -0
- PYME/ui/manualFoldPanel.py +870 -0
- PYME/ui/mytimer.py +116 -0
- PYME/ui/patch_traitsui.py +151 -0
- PYME/ui/progress.py +160 -0
- PYME/ui/recArrayView.py +145 -0
- PYME/ui/selection.py +71 -0
- PYME/ui/shell.py +37 -0
- PYME/ui/traitsui_constants.py +91 -0
- PYME/ui/wx_compat.py +43 -0
- PYME/update_version.py +159 -0
- PYME/util/__init__.py +3 -0
- PYME/util/authenticate.py +164 -0
- PYME/util/execfile.py +21 -0
- PYME/util/fProfile/__init__.py +1 -0
- PYME/util/fProfile/convertProfile.py +117 -0
- PYME/util/fProfile/fProfile.py +162 -0
- PYME/util/fProfile/html/404.html +60 -0
- PYME/util/fProfile/html/css/main.css +258 -0
- PYME/util/fProfile/html/css/normalize.css +427 -0
- PYME/util/fProfile/html/css/normalize.min.css +1 -0
- PYME/util/fProfile/html/index.html +64 -0
- PYME/util/fProfile/html/js/main.js +492 -0
- PYME/util/fProfile/html/js/plugins.js +24 -0
- PYME/util/fProfile/html/js/vendor/crossfilter.min.js +1 -0
- PYME/util/fProfile/html/js/vendor/jquery-1.11.2.min.js +4 -0
- PYME/util/fProfile/html/js/vendor/modernizr-2.8.3.min.js +4 -0
- PYME/util/fProfile/html/js/vendor/tinycolor-min.js +4 -0
- PYME/util/fProfile/viewProfile.py +30 -0
- PYME/util/install_dependencies.py +95 -0
- PYME/util/log_verbosity.py +11 -0
- PYME/util/mProfile/__init__.py +1 -0
- PYME/util/mProfile/colorize_db_t.py +297 -0
- PYME/util/mProfile/mProfile.py +164 -0
- PYME/util/mProfile/p.py +101 -0
- PYME/util/mProfile/tProfile.py +165 -0
- PYME/util/pymelauncher.py +47 -0
- PYME/util/shmarray/__init__.py +0 -0
- PYME/util/shmarray/shmTest.py +74 -0
- PYME/util/shmarray/shmarray.py +165 -0
- PYME/util/webframework.py +365 -0
- PYME/version.py +62 -0
- python_microscopy-25.11.20.dist-info/METADATA +68 -0
- python_microscopy-25.11.20.dist-info/RECORD +1278 -0
- python_microscopy-25.11.20.dist-info/WHEEL +4 -0
- python_microscopy-25.11.20.dist-info/entry_points.txt +18 -0
|
@@ -0,0 +1,1062 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
from __future__ import print_function
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
Created on Mon May 25 17:10:02 2015
|
|
6
|
+
|
|
7
|
+
@author: david
|
|
8
|
+
"""
|
|
9
|
+
from .base import ModuleBase, register_module, Filter
|
|
10
|
+
from .traits import Input, Output, Float, Enum, CStr, Bool, Int, List, Dict, Any, observe
|
|
11
|
+
import numpy as np
|
|
12
|
+
#import pandas as pd
|
|
13
|
+
from PYME.IO import tabular
|
|
14
|
+
from PYME.IO import MetaDataHandler
|
|
15
|
+
import os
|
|
16
|
+
from six.moves import xrange
|
|
17
|
+
import logging
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
@register_module('MultifitBlobs')
|
|
22
|
+
class MultifitBlobs(ModuleBase):
|
|
23
|
+
inputImage = Output('input')
|
|
24
|
+
outputName = CStr('positions')
|
|
25
|
+
blobSigma = Float(45.0)
|
|
26
|
+
threshold = Float(2.0)
|
|
27
|
+
scale = Float(1000)
|
|
28
|
+
|
|
29
|
+
def run(self, inputImage):
|
|
30
|
+
from PYME.localization.FitFactories import GaussMultifitSR
|
|
31
|
+
import pandas as pd
|
|
32
|
+
|
|
33
|
+
# mdh = MetaDataHandler.NestedClassMDHandler(inputImage.mdh)
|
|
34
|
+
#mdh['Analysis.PSFSigma'] = self.blobSigma
|
|
35
|
+
|
|
36
|
+
res = []
|
|
37
|
+
|
|
38
|
+
for i in range(inputImage.data.shape[2]):
|
|
39
|
+
md = MetaDataHandler.NestedClassMDHandler(mdh)
|
|
40
|
+
md['tIndex'] = i
|
|
41
|
+
ff = GaussMultifitSR.FitFactory(self.scale*inputImage.data[:,:,i], md, noiseSigma=np.ones_like(inputImage.data[:,:,i].squeeze()))
|
|
42
|
+
|
|
43
|
+
res.append(tabular.FitResultsSource(ff.FindAndFit(self.threshold)))
|
|
44
|
+
|
|
45
|
+
#FIXME - this shouldn't be a DataFrame
|
|
46
|
+
res = pd.DataFrame(np.vstack(res))
|
|
47
|
+
#res.mdh = mdh
|
|
48
|
+
|
|
49
|
+
return res
|
|
50
|
+
|
|
51
|
+
@register_module('FitDumbells')
|
|
52
|
+
class FitDumbells(ModuleBase):
|
|
53
|
+
inputImage = Input('input')
|
|
54
|
+
inputPositions = Input('objPostiions')
|
|
55
|
+
outputName = Output('fitResults')
|
|
56
|
+
|
|
57
|
+
def run(self, inputImage, inputPositions):
|
|
58
|
+
from PYME.localization.FitFactories import DumbellFitR
|
|
59
|
+
from PYME.IO import MetaDataHandler
|
|
60
|
+
|
|
61
|
+
md = MetaDataHandler.NestedClassMDHandler()
|
|
62
|
+
#set metadata entries needed for fitting to suitable defaults
|
|
63
|
+
md['Camera.ADOffset'] = inputImage.data[:,:,0].min()
|
|
64
|
+
md['Camera.TrueEMGain'] = 1.0
|
|
65
|
+
md['Camera.ElectronsPerCount'] = 1.0
|
|
66
|
+
md['Camera.ReadNoise'] = 1.0
|
|
67
|
+
md['Camera.NoiseFactor'] = 1.0
|
|
68
|
+
|
|
69
|
+
#copy across the entries from the real image, replacing the defaults
|
|
70
|
+
#if necessary
|
|
71
|
+
md.copyEntriesFrom(inputImage.mdh)
|
|
72
|
+
|
|
73
|
+
r = np.zeros(len(inputPositions['x']), dtype=DumbellFitR.FitResultsDType)
|
|
74
|
+
|
|
75
|
+
ff_t = -1
|
|
76
|
+
|
|
77
|
+
ps = inputImage.pixelSize
|
|
78
|
+
|
|
79
|
+
for x, y, t, i in zip(inputPositions['x'], inputPositions['y'], inputPositions['t'], range(len(inputPositions['x']))):
|
|
80
|
+
if not t == ff_t:
|
|
81
|
+
md['tIndex'] = t
|
|
82
|
+
ff = DumbellFitR.FitFactory(inputImage.data[:,:,t], md)
|
|
83
|
+
ff_t = t
|
|
84
|
+
|
|
85
|
+
r[i] = ff.FromPoint(x/ps, y/ps)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
res = tabular.FitResultsSource(r)
|
|
89
|
+
res.mdh = md
|
|
90
|
+
|
|
91
|
+
return res
|
|
92
|
+
|
|
93
|
+
@register_module('DetectPoints2D')
|
|
94
|
+
class DetectPoints2D(ModuleBase):
|
|
95
|
+
"""
|
|
96
|
+
Detect point-like objects using a sombrero (or Difference of Gaussians) filter
|
|
97
|
+
|
|
98
|
+
Parameters
|
|
99
|
+
----------
|
|
100
|
+
input_name : Input
|
|
101
|
+
PYME.IO.ImageStack
|
|
102
|
+
snr_threshold : Bool
|
|
103
|
+
How should we interpret the threshold? If True, the signal-to-noise (SNR) is estimated at each pixel, and the threshold
|
|
104
|
+
applied at each pixel is this estimate multiplied by the 'threshold' parameter. If False, the threshold parameter is used
|
|
105
|
+
directly.
|
|
106
|
+
NB - this cannot be set in conjunction with multithreshold.
|
|
107
|
+
multithreshold : Bool
|
|
108
|
+
If true, detect objects at multiple decreasing thresholds, removing detected objects before progressing to the next step.
|
|
109
|
+
This is similar to the CLEAN algorithm from astromy and useful for detecting weak point-like objects
|
|
110
|
+
in the immediate vicinity of strong ones.
|
|
111
|
+
NB - this cannot be set together with snr_threshold.
|
|
112
|
+
threshold : Float
|
|
113
|
+
The intensity threshold applied during detection if 'snr_threshold' is False, otherwise this scalar is first
|
|
114
|
+
multiplied by the SNR estimate at each pixel before the threshold is applied. When multithreshold is set, the
|
|
115
|
+
highest threshold is max_intensity/2, the lowest is threshold*max_intensity.
|
|
116
|
+
filter_radius_lowpass : Float
|
|
117
|
+
The std. deviation (in pixels) of the lowpass part of the sombrero. Should match the expected object size.
|
|
118
|
+
filter_radius_highpass : Float
|
|
119
|
+
The std deviation (in pixels) of the highpass part of the sombrero. Ideally > 2x the object size, but less than the
|
|
120
|
+
spacing between objects.
|
|
121
|
+
blur_radius : Float
|
|
122
|
+
Used with multithrehold. Std deviation in pixels of a Gaussian filter used to blur the segmented image with at each threshold step
|
|
123
|
+
prior to subtraction. Should be set so the Gaussian width approximates the PSF width. Most critical if you want to
|
|
124
|
+
reliably detect points on the slope of a brighter point, as making this too large will lead to a "halo of exclusion" around bright points.
|
|
125
|
+
Conversely, setting it to small will lead to spurious detections due to incomplete removal of the bright point.
|
|
126
|
+
debounce_radius : Int
|
|
127
|
+
Radius is pixels to check for other detected points. If multiple points are found within this radius the brightest
|
|
128
|
+
will be preserved and the other(s) will be removed
|
|
129
|
+
edge_mask_width : Int
|
|
130
|
+
Thickness of border region to exclude detecting points from.
|
|
131
|
+
|
|
132
|
+
Returns
|
|
133
|
+
-------
|
|
134
|
+
output_name : Output
|
|
135
|
+
PYME.IO.tabular containing x and y coordinates of each point, as well as the frame index they were detected on
|
|
136
|
+
|
|
137
|
+
Notes
|
|
138
|
+
-----
|
|
139
|
+
|
|
140
|
+
Input image series should already be camera corrected (see Processing.FlatfieldAndDarkCorrect)
|
|
141
|
+
|
|
142
|
+
"""
|
|
143
|
+
|
|
144
|
+
input_name = Input('input')
|
|
145
|
+
|
|
146
|
+
threshold = Float(1.)
|
|
147
|
+
debounce_radius = Int(4)
|
|
148
|
+
snr_threshold = Bool(True)
|
|
149
|
+
muiltithreshold = Bool(False)
|
|
150
|
+
edge_mask_width = Int(5)
|
|
151
|
+
filter_radius_lowpass = Float(1.0)
|
|
152
|
+
filter_radius_highpass = Float(3.0)
|
|
153
|
+
blur_radius = Float(1.5)
|
|
154
|
+
|
|
155
|
+
output_name = Output('candidate_points')
|
|
156
|
+
|
|
157
|
+
def run(self, input_name):
|
|
158
|
+
from PYME.localization.ofind import ObjectIdentifier
|
|
159
|
+
from PYME.localization.remFitBuf import fitTask
|
|
160
|
+
|
|
161
|
+
if self.snr_threshold and self.muiltithreshold:
|
|
162
|
+
raise RuntimeError('Cannot specify both snr_threshold and multithreshold simultaeneously')
|
|
163
|
+
|
|
164
|
+
x, y, t = [], [], []
|
|
165
|
+
# note that ObjectIdentifier is only 2D-aware
|
|
166
|
+
for ti in range(input_name.data.shape[2]):
|
|
167
|
+
frame = input_name.data.getSlice(ti)
|
|
168
|
+
finder = ObjectIdentifier(frame * (frame > 0), filterRadiusLowpass=self.filter_radius_lowpass, filterRadiusHighpass=self.filter_radius_highpass)
|
|
169
|
+
|
|
170
|
+
if self.snr_threshold: # calculate a per-pixel threshold based on an estimate of the SNR
|
|
171
|
+
sigma = fitTask.calcSigma(input_name.mdh, frame).squeeze()
|
|
172
|
+
threshold = sigma * self.threshold
|
|
173
|
+
else:
|
|
174
|
+
threshold = self.threshold
|
|
175
|
+
|
|
176
|
+
if self.muiltithreshold:
|
|
177
|
+
thresholdSteps = "default"
|
|
178
|
+
else:
|
|
179
|
+
thresholdSteps = 0
|
|
180
|
+
|
|
181
|
+
finder.FindObjects(threshold, numThresholdSteps=thresholdSteps, debounceRadius=self.debounce_radius, maskEdgeWidth=self.edge_mask_width)
|
|
182
|
+
|
|
183
|
+
x.append(finder.x[:])
|
|
184
|
+
y.append(finder.y[:])
|
|
185
|
+
t.append(ti * np.ones_like(finder.x[:]))
|
|
186
|
+
|
|
187
|
+
return tabular.DictSource({'x': np.concatenate(x, axis=0), 'y': np.concatenate(y, axis=0),
|
|
188
|
+
't': np.concatenate(t, axis=0)})
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
@register_module('FitPoints')
|
|
193
|
+
class FitPoints(ModuleBase):
|
|
194
|
+
"""
|
|
195
|
+
Apply one of the fit modules from PYME.localization.FitFactories to each of
|
|
196
|
+
the points in the provided in inputPositions.
|
|
197
|
+
|
|
198
|
+
Parameters
|
|
199
|
+
----------
|
|
200
|
+
inputImage: PYME.IO.image.ImageStack
|
|
201
|
+
FitPoints does not do the camera correction normally done during
|
|
202
|
+
localization analysis in PYME. To accomplish this using recipe modules,
|
|
203
|
+
run your ImageStack through `processing.FlatfieldAndDarkCorrect` first.
|
|
204
|
+
inputPositions: PYME.IO.tabular
|
|
205
|
+
positions to fit in units of nanometers. If inputImage is missing voxelsize
|
|
206
|
+
metadata, a pixel size of 1 nm is assumed.
|
|
207
|
+
outputName: PYME.IO.tabular
|
|
208
|
+
see selected fit module datatype for fit result and fit error parameters
|
|
209
|
+
|
|
210
|
+
"""
|
|
211
|
+
inputImage = Input('input')
|
|
212
|
+
inputPositions = Input('objPositions')
|
|
213
|
+
outputName = Output('fitResults')
|
|
214
|
+
fitModule = CStr('LatGaussFitFR')
|
|
215
|
+
roiHalfSize = Int(7)
|
|
216
|
+
channel = Int(0)
|
|
217
|
+
parameters = Dict(str, Any) #fit parameters ('Analysis' metadata entries)
|
|
218
|
+
|
|
219
|
+
@observe('fitModule')
|
|
220
|
+
def _on_fit_module_change(self, event=None):
|
|
221
|
+
# populate parameters for the given fit module
|
|
222
|
+
from PYME.localization.FitFactories import import_fit_factory
|
|
223
|
+
fitMod = import_fit_factory(self.fitModule)
|
|
224
|
+
|
|
225
|
+
try:
|
|
226
|
+
params = fitMod.PARAMETERS
|
|
227
|
+
|
|
228
|
+
# add default value for any parameters which are absent
|
|
229
|
+
for p in params:
|
|
230
|
+
if not p.paramName in self.parameters:
|
|
231
|
+
self.parameters[p.paramName] = p.default
|
|
232
|
+
|
|
233
|
+
# remove any parameters which don't belong to the selected fit factory
|
|
234
|
+
pnames = [p.paramName for p in params]
|
|
235
|
+
for k in self.parameters.keys():
|
|
236
|
+
if not k in pnames:
|
|
237
|
+
self.parameters.pop(k)
|
|
238
|
+
|
|
239
|
+
except AttributeError:
|
|
240
|
+
pass
|
|
241
|
+
|
|
242
|
+
def __init__(self, *args, **kwargs):
|
|
243
|
+
super().__init__(*args, **kwargs)
|
|
244
|
+
|
|
245
|
+
self._on_fit_module_change()
|
|
246
|
+
|
|
247
|
+
def run(self, inputImage, inputPositions):
|
|
248
|
+
from PYME.localization.FitFactories import import_fit_factory
|
|
249
|
+
from PYME.IO import MetaDataHandler
|
|
250
|
+
|
|
251
|
+
md = MetaDataHandler.NestedClassMDHandler()
|
|
252
|
+
#set metadata entries needed for fitting to suitable defaults
|
|
253
|
+
md['Camera.ADOffset'] = inputImage.data[:, :, 0].min()
|
|
254
|
+
md['Camera.TrueEMGain'] = 1.0
|
|
255
|
+
md['Camera.ElectronsPerCount'] = 1.0
|
|
256
|
+
md['Camera.ReadNoise'] = 1.0
|
|
257
|
+
md['Camera.NoiseFactor'] = 1.0
|
|
258
|
+
|
|
259
|
+
md['voxelsize.x'] = .001
|
|
260
|
+
md['voxelsize.y'] = .001
|
|
261
|
+
|
|
262
|
+
#copy across the entries from the real image, replacing the defaults
|
|
263
|
+
#if necessary
|
|
264
|
+
md.copyEntriesFrom(inputImage.mdh)
|
|
265
|
+
|
|
266
|
+
#copy fitting parameters into metadata
|
|
267
|
+
md.update(self.parameters)
|
|
268
|
+
|
|
269
|
+
fitMod = import_fit_factory(self.fitModule) #import our fitting module
|
|
270
|
+
|
|
271
|
+
r = np.zeros(len(inputPositions['x']), dtype=fitMod.FitResultsDType)
|
|
272
|
+
|
|
273
|
+
ff_t = -1
|
|
274
|
+
|
|
275
|
+
ps = inputImage.pixelSize
|
|
276
|
+
print('pixel size: %s' % ps)
|
|
277
|
+
|
|
278
|
+
for x, y, t, i in zip(inputPositions['x'], inputPositions['y'], inputPositions['t'].astype(int), range(len(inputPositions['x']))):
|
|
279
|
+
if not t == ff_t:
|
|
280
|
+
md['tIndex'] = t
|
|
281
|
+
ff = fitMod.FitFactory(np.atleast_3d(inputImage.data[:, :, t, self.channel]), md)
|
|
282
|
+
ff_t = t
|
|
283
|
+
|
|
284
|
+
#print x/ps, y/ps
|
|
285
|
+
r[i] = ff.FromPoint(x/ps, y/ps, roiHalfSize=self.roiHalfSize)
|
|
286
|
+
|
|
287
|
+
res = tabular.FitResultsSource(r, sort=False)
|
|
288
|
+
res.mdh = md
|
|
289
|
+
|
|
290
|
+
return res
|
|
291
|
+
|
|
292
|
+
@register_module('IntensityAtPoints')
|
|
293
|
+
class IntensityAtPoints(ModuleBase):
|
|
294
|
+
""" Apply one of the fit modules from PYME.localization.FitFactories to each of the points in the provided
|
|
295
|
+
in inputPositions
|
|
296
|
+
"""
|
|
297
|
+
inputImage = Input('input')
|
|
298
|
+
inputPositions = Input('objPostiions')
|
|
299
|
+
outputName = Output('fitResults')
|
|
300
|
+
radii = List([3, 5, 7, 9, 11])
|
|
301
|
+
mode = Enum(['sum', 'mean'])
|
|
302
|
+
#fitModule = CStr('LatGaussFitFR')
|
|
303
|
+
|
|
304
|
+
def __init__(self, *args, **kwargs):
|
|
305
|
+
self._mask_cache = {}
|
|
306
|
+
ModuleBase.__init__(self, *args, **kwargs)
|
|
307
|
+
|
|
308
|
+
def _get_mask(self, r):
|
|
309
|
+
#if not '_mask_cache' in dir(self):
|
|
310
|
+
# self._mask_cache = {}
|
|
311
|
+
|
|
312
|
+
if not r in self._mask_cache.keys():
|
|
313
|
+
x_, y_ = np.mgrid[-r:(r+1.), -r:(r+1.)]
|
|
314
|
+
self._mask_cache[r] = 1.0*((x_*x_ + y_*y_) < r*r)
|
|
315
|
+
|
|
316
|
+
return self._mask_cache[r]
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
def _get_mean(self, data, x, y, t, radius):
|
|
320
|
+
roi = data[(x-radius):(x + radius + 1), (y-radius):(y + radius + 1), t].squeeze()
|
|
321
|
+
mask = self._get_mask(radius)
|
|
322
|
+
|
|
323
|
+
return (roi.squeeze()*mask).sum()/mask.sum()
|
|
324
|
+
|
|
325
|
+
def _get_sum(self, data, x, y, t, radius):
|
|
326
|
+
print(data.shape, x, y, t)
|
|
327
|
+
roi = data[int(x - radius):int(x + radius + 1), int(y - radius):int(y + radius + 1), int(t)].squeeze()
|
|
328
|
+
mask = self._get_mask(radius)
|
|
329
|
+
|
|
330
|
+
print(mask.shape, roi.shape)#, (roi * mask).shape
|
|
331
|
+
|
|
332
|
+
return (roi.squeeze() * mask).sum()
|
|
333
|
+
|
|
334
|
+
def run(self, inputImage, inputPositions):
|
|
335
|
+
#from PYME.localization.FitFactories import DumbellFitR
|
|
336
|
+
from PYME.IO import MetaDataHandler
|
|
337
|
+
|
|
338
|
+
md = MetaDataHandler.NestedClassMDHandler()
|
|
339
|
+
#set metadata entries needed for fitting to suitable defaults
|
|
340
|
+
md['Camera.ADOffset'] = inputImage.data[:, :, 0].min()
|
|
341
|
+
md['Camera.TrueEMGain'] = 1.0
|
|
342
|
+
md['Camera.ElectronsPerCount'] = 1.0
|
|
343
|
+
md['Camera.ReadNoise'] = 1.0
|
|
344
|
+
md['Camera.NoiseFactor'] = 1.0
|
|
345
|
+
|
|
346
|
+
#copy across the entries from the real image, replacing the defaults
|
|
347
|
+
#if necessary
|
|
348
|
+
md.copyEntriesFrom(inputImage.mdh)
|
|
349
|
+
|
|
350
|
+
res = np.zeros(len(inputPositions['x']), dtype=[('r%d' % r, 'f4') for r in self.radii])
|
|
351
|
+
ff_t = -1
|
|
352
|
+
|
|
353
|
+
aggFunc = getattr(self, '_get_%s' % self.mode)
|
|
354
|
+
|
|
355
|
+
ps = inputImage.pixelSize
|
|
356
|
+
print('pixel size: %s' % ps)
|
|
357
|
+
for x, y, t, i in zip(inputPositions['x'], inputPositions['y'], inputPositions['t'], range(len(inputPositions['x']))):
|
|
358
|
+
for r in self.radii:
|
|
359
|
+
res[i]['r%d' % r] = aggFunc(inputImage.data, np.round(x / ps), np.round(y / ps), t, r)
|
|
360
|
+
|
|
361
|
+
res = tabular.RecArraySource(res)
|
|
362
|
+
res.mdh = md
|
|
363
|
+
|
|
364
|
+
return res
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
class ExtractROIs(ModuleBase):
|
|
368
|
+
"""
|
|
369
|
+
Extract ROIs around input positions and return them as an ImageStack. Points
|
|
370
|
+
too close to the edge of the input image will be filtered. The ROI-relative
|
|
371
|
+
positions are also determined (distance from the upper left hand corner of
|
|
372
|
+
each ROI to the point about which it was cropped).
|
|
373
|
+
|
|
374
|
+
Parameters
|
|
375
|
+
----------
|
|
376
|
+
input_series : PYME.IO.image.ImageStack
|
|
377
|
+
series to crop ROIs from
|
|
378
|
+
input_positions : PYME.IO.tabular.TabularBase
|
|
379
|
+
positions to extract
|
|
380
|
+
roi_half_size : int
|
|
381
|
+
size of ROIs to extract, as a half size, so final ROI size will be
|
|
382
|
+
`2 * roi_half_size + 1`.
|
|
383
|
+
output_relative_positions : PYME.IO.tabular.TabularBase
|
|
384
|
+
distances [nm] from ROI upper left hand corner (x, y = 0, 0) to
|
|
385
|
+
corresponding extraction position.
|
|
386
|
+
output_rois : PYME.IO.image.ImageStack
|
|
387
|
+
extracted ROIs as an image stack. Dimension 2 (typically z/t)
|
|
388
|
+
corresponds to position index.
|
|
389
|
+
|
|
390
|
+
Notes
|
|
391
|
+
-----
|
|
392
|
+
- Positions too close to the frame edge, which will result in ROIs cropped
|
|
393
|
+
being smaller than specified, will be removed and not included in the module
|
|
394
|
+
outputs.
|
|
395
|
+
- Multiview positions are not supported, and must be 'unmapped' to the
|
|
396
|
+
original camera positions first.
|
|
397
|
+
"""
|
|
398
|
+
input_series = Input('series')
|
|
399
|
+
input_positions = Input('positions')
|
|
400
|
+
|
|
401
|
+
roi_half_size = Int(7)
|
|
402
|
+
|
|
403
|
+
output_relative_positions = Output('relative_positions')
|
|
404
|
+
output_rois = Output('roi_stack')
|
|
405
|
+
|
|
406
|
+
def run(self, input_series, input_positions):
|
|
407
|
+
from PYME.IO.image import ImageStack
|
|
408
|
+
|
|
409
|
+
ox_nm, oy_nm, oz = input_series.origin
|
|
410
|
+
vs_nm = np.array([input_series.voxelsize_nm.x, input_series.voxelsize_nm.y])
|
|
411
|
+
roi_half_nm = (self.roi_half_size + 1) * vs_nm
|
|
412
|
+
x_max, y_max = (input_series.data.shape[:2] * vs_nm) - roi_half_nm
|
|
413
|
+
|
|
414
|
+
edge_filtered = tabular.ResultsFilter(input_positions,
|
|
415
|
+
x=[ox_nm + roi_half_nm[0], x_max],
|
|
416
|
+
y=[oy_nm + roi_half_nm[1], y_max])
|
|
417
|
+
n_filtered = len(input_positions) - len(edge_filtered)
|
|
418
|
+
if n_filtered > 0:
|
|
419
|
+
logger.error('%d positions too close to edge, filtering.' % n_filtered)
|
|
420
|
+
|
|
421
|
+
extracted = FitPoints(fitModule='ROIExtractNR',
|
|
422
|
+
roiHalfSize=self.roi_half_size,
|
|
423
|
+
channel=0).apply_simple(inputImage=input_series,
|
|
424
|
+
inputPositions=edge_filtered)
|
|
425
|
+
|
|
426
|
+
# get roi edge position. FFBase._get_roi rounds before extracting
|
|
427
|
+
relative_positions = edge_filtered.to_recarray()
|
|
428
|
+
x_edge = np.round(edge_filtered['x'] / input_series.voxelsize_nm.x) - self.roi_half_size
|
|
429
|
+
y_edge = np.round(edge_filtered['y'] / input_series.voxelsize_nm.y) - self.roi_half_size
|
|
430
|
+
# subtract off ofset to ROI edge
|
|
431
|
+
relative_positions['x'] = edge_filtered['x'] - (x_edge * input_series.voxelsize_nm.x)
|
|
432
|
+
relative_positions['y'] = edge_filtered['y'] - (y_edge * input_series.voxelsize_nm.y)
|
|
433
|
+
relative_positions['fitResults_x0'] = relative_positions['x']
|
|
434
|
+
relative_positions['fitResults_y0'] = relative_positions['y']
|
|
435
|
+
relative_positions = tabular.RecArraySource(relative_positions)
|
|
436
|
+
relative_positions.mdh = MetaDataHandler.NestedClassMDHandler(input_positions.mdh)
|
|
437
|
+
relative_positions.mdh['ExtractROIs.RoiHalfSize'] = self.roi_half_size
|
|
438
|
+
|
|
439
|
+
|
|
440
|
+
return {'output_rois' : ImageStack(data=np.moveaxis(extracted['data'], 0, 2),
|
|
441
|
+
mdh=input_series.mdh),
|
|
442
|
+
'output_relative_positions' : relative_positions}
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
@register_module('MeanNeighbourDistances')
|
|
446
|
+
class MeanNeighbourDistances(ModuleBase):
|
|
447
|
+
"""Calculates mean distance to nearest neighbour in a triangulation of the
|
|
448
|
+
supplied points"""
|
|
449
|
+
inputPositions = Input('input')
|
|
450
|
+
outputName = Output('neighbourDists')
|
|
451
|
+
key = CStr('neighbourDists')
|
|
452
|
+
|
|
453
|
+
def run(self, inputPositions):
|
|
454
|
+
from matplotlib import delaunay
|
|
455
|
+
from PYME.LMVis import visHelpers
|
|
456
|
+
|
|
457
|
+
x, y = inputPositions['x'], inputPositions['y']
|
|
458
|
+
#triangulate the data
|
|
459
|
+
T = delaunay.Triangulation(x + .1*np.random.normal(size=len(x)), y + .1*np.random.normal(size=len(x)))
|
|
460
|
+
#find the average edge lengths leading away from a given point
|
|
461
|
+
res = np.array(visHelpers.calcNeighbourDists(T))
|
|
462
|
+
|
|
463
|
+
return tabular.DictSource({self.key:res})
|
|
464
|
+
|
|
465
|
+
@register_module('NearestNeighbourDistances')
|
|
466
|
+
class NearestNeighbourDistances(ModuleBase):
|
|
467
|
+
"""Calculates the nearest neighbour distances between supplied points using
|
|
468
|
+
a kdtree"""
|
|
469
|
+
inputChan0 = Input('input')
|
|
470
|
+
inputChan1 = Input('')
|
|
471
|
+
outputName = Output('neighbourDists')
|
|
472
|
+
columns = List(['x', 'y'])
|
|
473
|
+
key = CStr('neighbourDists')
|
|
474
|
+
|
|
475
|
+
def run(self, inputChan0, inputChan1 = 0):
|
|
476
|
+
from scipy.spatial import cKDTree
|
|
477
|
+
|
|
478
|
+
if not inputChan1:
|
|
479
|
+
inputChan1 = inputChan0
|
|
480
|
+
singleChan = True # flag to not pair molecules with themselves
|
|
481
|
+
else:
|
|
482
|
+
singleChan = False
|
|
483
|
+
|
|
484
|
+
#create a kdtree
|
|
485
|
+
p1 = np.vstack([inputChan0[k] for k in self.columns]).T
|
|
486
|
+
p2 = np.vstack([inputChan1[k] for k in self.columns]).T
|
|
487
|
+
kdt = cKDTree(p1)
|
|
488
|
+
|
|
489
|
+
if singleChan:
|
|
490
|
+
#query the two closest entries - the closest entry will be the orig point paired with itself, so ignore it
|
|
491
|
+
d, i = kdt.query(p2, 2)
|
|
492
|
+
d = d[:, 1]
|
|
493
|
+
else:
|
|
494
|
+
d, i = kdt.query(p2, 1)
|
|
495
|
+
|
|
496
|
+
return tabular.DictSource({self.key: d})
|
|
497
|
+
|
|
498
|
+
@register_module('PairwiseDistanceHistogram')
|
|
499
|
+
class PairwiseDistanceHistogram(ModuleBase):
|
|
500
|
+
"""Calculates a histogram of pairwise distances"""
|
|
501
|
+
inputPositions = Input('input')
|
|
502
|
+
inputPositions2 = Input('')
|
|
503
|
+
outputName = Output('distHist')
|
|
504
|
+
nbins = Int(50)
|
|
505
|
+
binSize = Float(50.)
|
|
506
|
+
threaded = Bool(False)
|
|
507
|
+
|
|
508
|
+
def run(self, inputPositions, inputPositions2):
|
|
509
|
+
from PYME.Analysis.points import DistHist
|
|
510
|
+
|
|
511
|
+
pos1 = inputPositions2 if inputPositions2 else inputPositions
|
|
512
|
+
|
|
513
|
+
if np.count_nonzero(inputPositions['z']) == 0 and np.count_nonzero(pos1['z']) == 0:
|
|
514
|
+
if self.threaded:
|
|
515
|
+
res = DistHist.distanceHistogramThreaded(inputPositions['x'], inputPositions['y'], pos1['x'], pos1['y'], self.nbins, self.binSize)
|
|
516
|
+
else:
|
|
517
|
+
res = DistHist.distanceHistogram(inputPositions['x'], inputPositions['y'], pos1['x'], pos1['y'], self.nbins, self.binSize)
|
|
518
|
+
else:
|
|
519
|
+
if self.threaded:
|
|
520
|
+
res = DistHist.distanceHistogram3DThreaded(inputPositions['x'], inputPositions['y'], inputPositions['z'],
|
|
521
|
+
pos1['x'], pos1['y'], pos1['z'], self.nbins, self.binSize)
|
|
522
|
+
else:
|
|
523
|
+
res = DistHist.distanceHistogram3D(inputPositions['x'], inputPositions['y'], inputPositions['z'],
|
|
524
|
+
pos1['x'], pos1['y'], pos1['z'], self.nbins, self.binSize)
|
|
525
|
+
|
|
526
|
+
d = self.binSize*np.arange(self.nbins)
|
|
527
|
+
|
|
528
|
+
return tabular.DictSource({'bins': d, 'counts': res})
|
|
529
|
+
|
|
530
|
+
@register_module('Histogram')
|
|
531
|
+
class Histogram(ModuleBase):
|
|
532
|
+
"""Calculates a histogram of a given measurement key"""
|
|
533
|
+
inputMeasurements = Input('input')
|
|
534
|
+
outputName = Output('hist')
|
|
535
|
+
key = CStr('key')
|
|
536
|
+
nbins = Int(50)
|
|
537
|
+
left = Float(0.)
|
|
538
|
+
right = Float(1000)
|
|
539
|
+
normalize = Bool(False)
|
|
540
|
+
|
|
541
|
+
def run(self, inputMeasurements):
|
|
542
|
+
v = inputMeasurements[self.key]
|
|
543
|
+
|
|
544
|
+
edges = np.linspace(self.left, self.right, self.nbins)
|
|
545
|
+
res = np.histogram(v, edges, normed=self.normalize)[0]
|
|
546
|
+
|
|
547
|
+
return tabular.DictSource({'bins' : 0.5*(edges[:-1] + edges[1:]), 'counts' : res})
|
|
548
|
+
|
|
549
|
+
|
|
550
|
+
@register_module('ImageHistogram')
|
|
551
|
+
class ImageHistogram(ModuleBase):
|
|
552
|
+
"""Calculates a histogram of a given measurement key"""
|
|
553
|
+
inputImage = Input('input')
|
|
554
|
+
outputName = Output('hist')
|
|
555
|
+
inputMask = Input('')
|
|
556
|
+
nbins = Int(50)
|
|
557
|
+
left = Float(0.)
|
|
558
|
+
right = Float(1000)
|
|
559
|
+
normalize = Bool(False)
|
|
560
|
+
|
|
561
|
+
def run(self, inputImage, inputMask=None):
|
|
562
|
+
vals = inputImage.data[:,:,:].ravel()
|
|
563
|
+
|
|
564
|
+
if inputMask:
|
|
565
|
+
m = inputMask.data[:,:,:].ravel() >0
|
|
566
|
+
vals = vals[m]
|
|
567
|
+
|
|
568
|
+
edges = np.linspace(self.left, self.right, self.nbins)
|
|
569
|
+
res = np.histogram(vals, edges, normed=self.normalize)[0]
|
|
570
|
+
|
|
571
|
+
return tabular.DictSource({'bins' : 0.5*(edges[:-1] + edges[1:]), 'counts' : res})
|
|
572
|
+
|
|
573
|
+
@register_module('ImageCumulativeHistogram')
|
|
574
|
+
class ImageCumulativeHistogram(ModuleBase):
|
|
575
|
+
"""Calculates a histogram of a given measurement key"""
|
|
576
|
+
inputImage = Input('input')
|
|
577
|
+
outputName = Output('hist')
|
|
578
|
+
inputMask = Input('')
|
|
579
|
+
#nbins = Int(50)
|
|
580
|
+
#left = Float(0.)
|
|
581
|
+
#right = Float(1000)
|
|
582
|
+
|
|
583
|
+
def run(self, inputImage, inputMask=None):
|
|
584
|
+
vals = inputImage.data[:,:,:].ravel()
|
|
585
|
+
|
|
586
|
+
if inputMask:
|
|
587
|
+
m = inputMask.data[:,:,:].ravel() > 0
|
|
588
|
+
vals = vals[m]
|
|
589
|
+
|
|
590
|
+
yvals = np.linspace(0, 1.0, len(vals))
|
|
591
|
+
xvals = np.sort(vals)
|
|
592
|
+
|
|
593
|
+
return tabular.DictSource({'bins' : xvals, 'counts' : yvals})
|
|
594
|
+
|
|
595
|
+
@register_module('BinnedHistogram')
|
|
596
|
+
class BinnedHistogram(ModuleBase):
|
|
597
|
+
"""Calculates a histogram of a given measurement key, binned by a separate value"""
|
|
598
|
+
inputImage = Input('input')
|
|
599
|
+
binBy = CStr('indepvar')
|
|
600
|
+
outputName = Output('hist')
|
|
601
|
+
inputMask = Input('')
|
|
602
|
+
|
|
603
|
+
nbins = Int(50)
|
|
604
|
+
left = Float(0.)
|
|
605
|
+
right = Float(1000)
|
|
606
|
+
|
|
607
|
+
def run(self, inputImage, binBy, inputMask=None):
|
|
608
|
+
from PYME.Analysis import binAvg
|
|
609
|
+
vals = inputImage.data[:, :, :].ravel()
|
|
610
|
+
binby = binBy.data[:,:,:].ravel()
|
|
611
|
+
|
|
612
|
+
if inputMask:
|
|
613
|
+
m = inputMask.data[:, :, :].ravel() > 0
|
|
614
|
+
|
|
615
|
+
vals = vals[m]
|
|
616
|
+
binby = binby[m]
|
|
617
|
+
|
|
618
|
+
#mask out NaNs
|
|
619
|
+
m2 = ~np.isnan(vals)
|
|
620
|
+
vals = vals[m2]
|
|
621
|
+
binby = binby[m2]
|
|
622
|
+
|
|
623
|
+
edges = np.linspace(self.left, self.right, self.nbins)
|
|
624
|
+
|
|
625
|
+
bn, bm, bs = binAvg.binAvg(binby, vals, edges)
|
|
626
|
+
|
|
627
|
+
return tabular.DictSource({'bins': 0.5*(edges[:-1] + edges[1:]), 'counts': bn, 'means' : bm})
|
|
628
|
+
|
|
629
|
+
|
|
630
|
+
|
|
631
|
+
# there are some measurements we don't want / are not particlarly useful (i.e. the ones which just return the image)
|
|
632
|
+
# some of these changed in recent versions of skimage (2022), so try both new and old versions
|
|
633
|
+
_MEASURE2D_KEYS_TO_IGNORE = ['convex_image',
|
|
634
|
+
'filled_image',
|
|
635
|
+
'image_convex',
|
|
636
|
+
'image_filled',
|
|
637
|
+
'image',
|
|
638
|
+
'intensity_image',
|
|
639
|
+
'image_intensity']
|
|
640
|
+
|
|
641
|
+
# euler_number calculation can be buggy and cause crashes
|
|
642
|
+
_MEASURE2D_KEYS_TO_IGNORE.append('euler_number')
|
|
643
|
+
|
|
644
|
+
@register_module('Measure2D')
|
|
645
|
+
class Measure2D(ModuleBase):
|
|
646
|
+
"""Perform 2D morphological measurements based on an image mask and optional intensity image.
|
|
647
|
+
|
|
648
|
+
**Note:** To perform mesurements on multi-colour images, split channels first and measure each channel
|
|
649
|
+
separately.
|
|
650
|
+
|
|
651
|
+
**Note:** Measure2D currently works on *flattened* data where z and t dimensions have been collapsed
|
|
652
|
+
to a single "frame" dimension. TODO - fix this (or at least record the corresponding z and t indices for
|
|
653
|
+
each measurement).
|
|
654
|
+
"""
|
|
655
|
+
inputLabels = Input('labels')
|
|
656
|
+
inputIntensity = Input('data')
|
|
657
|
+
outputName = Output('measurements')
|
|
658
|
+
|
|
659
|
+
measureContour = Bool(True)
|
|
660
|
+
|
|
661
|
+
def run(self, inputLabels, inputIntensity):
|
|
662
|
+
|
|
663
|
+
#define the measurement class, which behaves like an input filter
|
|
664
|
+
class measurements(tabular.TabularBase):
|
|
665
|
+
_name = 'Measue 2D source'
|
|
666
|
+
ps = inputLabels.pixelSize
|
|
667
|
+
|
|
668
|
+
def __init__(self):
|
|
669
|
+
self.measures = []
|
|
670
|
+
self.contours = []
|
|
671
|
+
self.frameNos = []
|
|
672
|
+
|
|
673
|
+
self._keys = []
|
|
674
|
+
|
|
675
|
+
def addFrameMeasures(self, frameNo, measurements, contours = None):
|
|
676
|
+
if len(measurements) == 0:
|
|
677
|
+
return
|
|
678
|
+
|
|
679
|
+
if len(self.measures) == 0:
|
|
680
|
+
#first time we've called this - determine our data type
|
|
681
|
+
self._keys = ['t', 'x', 'y'] + [r for r in dir(measurements[0]) if not (r.startswith('_') or r in _MEASURE2D_KEYS_TO_IGNORE)]
|
|
682
|
+
|
|
683
|
+
if not contours is None:
|
|
684
|
+
self._keys += ['contour']
|
|
685
|
+
|
|
686
|
+
self.measures.extend(measurements)
|
|
687
|
+
self.frameNos.extend([frameNo for i in xrange(len(measurements))])
|
|
688
|
+
|
|
689
|
+
if contours:
|
|
690
|
+
self.contours.extend(contours)
|
|
691
|
+
|
|
692
|
+
def keys(self):
|
|
693
|
+
return self._keys
|
|
694
|
+
|
|
695
|
+
def __getitem__(self, keys):
|
|
696
|
+
if isinstance(keys, tuple) and len(keys) > 1:
|
|
697
|
+
key = keys[0]
|
|
698
|
+
sl = keys[1]
|
|
699
|
+
else:
|
|
700
|
+
key = keys
|
|
701
|
+
sl = slice(None)
|
|
702
|
+
|
|
703
|
+
|
|
704
|
+
#print key, sl
|
|
705
|
+
|
|
706
|
+
if not key in self._keys:
|
|
707
|
+
raise KeyError("'%s' key not defined" % key)
|
|
708
|
+
|
|
709
|
+
if key == 't':
|
|
710
|
+
return np.array(self.frameNos[sl])
|
|
711
|
+
elif key == 'contour':
|
|
712
|
+
return np.array(self.contours[sl], dtype='O')
|
|
713
|
+
elif key == 'x':
|
|
714
|
+
return self.ps*np.array([r.centroid[0] for r in self.measures[sl]])
|
|
715
|
+
elif key == 'y':
|
|
716
|
+
return self.ps*np.array([r.centroid[1] for r in self.measures[sl]])
|
|
717
|
+
else:
|
|
718
|
+
l = [getattr(r, key) for r in self.measures[sl]]
|
|
719
|
+
|
|
720
|
+
if not (('image' in key) or (key == 'coords')):#np.isscalar(l[0]):
|
|
721
|
+
a = np.array(l)
|
|
722
|
+
return a
|
|
723
|
+
else:
|
|
724
|
+
a = np.empty(len(l), dtype='O')
|
|
725
|
+
for i, li in enumerate(l):
|
|
726
|
+
a[i] = li
|
|
727
|
+
|
|
728
|
+
return a
|
|
729
|
+
|
|
730
|
+
# def toDataFrame(self, keys=None):
|
|
731
|
+
# import pandas as pd
|
|
732
|
+
# if keys == None:
|
|
733
|
+
# keys = self._keys
|
|
734
|
+
#
|
|
735
|
+
# d = {k: self.__getitem__(k) for k in keys}
|
|
736
|
+
#
|
|
737
|
+
# return pd.DataFrame(d)
|
|
738
|
+
|
|
739
|
+
|
|
740
|
+
# end measuremnt class def
|
|
741
|
+
|
|
742
|
+
assert (inputLabels.data_xyztc.shape[4 ==1]), 'Measure2D labels must have a single colour channel'
|
|
743
|
+
|
|
744
|
+
m = measurements()
|
|
745
|
+
|
|
746
|
+
if inputIntensity:
|
|
747
|
+
assert (inputLabels.data_xyztc.shape == inputIntensity.data_xyztc.shape), 'Measure2D labels and intensity must be the same shape'
|
|
748
|
+
|
|
749
|
+
for i in xrange(inputLabels.data.shape[2]):
|
|
750
|
+
m.addFrameMeasures(i, *self._measureFrame(i, inputLabels, inputIntensity))
|
|
751
|
+
|
|
752
|
+
#m.mdh = inputLabels.mdh
|
|
753
|
+
|
|
754
|
+
return m
|
|
755
|
+
|
|
756
|
+
def _measureFrame(self, frameNo, labels, intensity):
|
|
757
|
+
import skimage.measure
|
|
758
|
+
|
|
759
|
+
li = labels.data_xytc[:,:,frameNo, 0].squeeze().astype('i')
|
|
760
|
+
|
|
761
|
+
if intensity:
|
|
762
|
+
it = intensity.data_xytc[:,:,frameNo, 0].squeeze()
|
|
763
|
+
else:
|
|
764
|
+
it = None
|
|
765
|
+
|
|
766
|
+
rp = skimage.measure.regionprops(li, it, cache=True)
|
|
767
|
+
|
|
768
|
+
#print len(rp), li.max()
|
|
769
|
+
|
|
770
|
+
if self.measureContour:
|
|
771
|
+
ct = []
|
|
772
|
+
for r in rp:
|
|
773
|
+
#print i, (li == (i+1)).sum()
|
|
774
|
+
#c = skimage.measure.find_contours(r['image'], .5)
|
|
775
|
+
c = skimage.measure.find_contours((li == r.label), .5)
|
|
776
|
+
if len(c) == 0:
|
|
777
|
+
c = [np.zeros((2,2))]
|
|
778
|
+
#ct.append(c[0] + np.array(r['bbox'])[:2][None,:])
|
|
779
|
+
ct.append(c[0])
|
|
780
|
+
else:
|
|
781
|
+
ct = None
|
|
782
|
+
|
|
783
|
+
|
|
784
|
+
|
|
785
|
+
return rp, ct
|
|
786
|
+
|
|
787
|
+
|
|
788
|
+
|
|
789
|
+
@register_module('Plot')
|
|
790
|
+
class Plot(ModuleBase):
|
|
791
|
+
"""Take just certain columns of a variable"""
|
|
792
|
+
input0 = Input('measurements')
|
|
793
|
+
input1 = Input('')
|
|
794
|
+
input2 = Input('')
|
|
795
|
+
input3 = Input('')
|
|
796
|
+
xkey = CStr('')
|
|
797
|
+
ykey = CStr('')
|
|
798
|
+
type = Enum(['line', 'bar'])
|
|
799
|
+
outputName = Output('outGraph')
|
|
800
|
+
|
|
801
|
+
def execute(self, namespace):
|
|
802
|
+
ms = []
|
|
803
|
+
labs = []
|
|
804
|
+
if not self.input0 == '':
|
|
805
|
+
ms.append(namespace[self.input0])
|
|
806
|
+
labs.append(self.input0)
|
|
807
|
+
if not self.input1 == '':
|
|
808
|
+
ms.append(namespace[self.input1])
|
|
809
|
+
labs.append(self.input1)
|
|
810
|
+
if not self.input2 == '':
|
|
811
|
+
ms.append(namespace[self.input2])
|
|
812
|
+
labs.append(self.input2)
|
|
813
|
+
if not self.input3 == '':
|
|
814
|
+
ms.append(namespace[self.input3])
|
|
815
|
+
labs.append(self.input3)
|
|
816
|
+
|
|
817
|
+
# import pylab
|
|
818
|
+
import matplotlib.pyplot as plt
|
|
819
|
+
|
|
820
|
+
plt.figure()
|
|
821
|
+
for meas in ms:
|
|
822
|
+
if self.type == 'bar':
|
|
823
|
+
xv = meas[self.xkey]
|
|
824
|
+
plt.bar(xv, meas[self.ykey], align='center', width=(xv[1] - xv[0]))
|
|
825
|
+
else:
|
|
826
|
+
plt.plot(meas[self.xkey], meas[self.ykey])
|
|
827
|
+
|
|
828
|
+
plt.grid()
|
|
829
|
+
plt.legend(labs)
|
|
830
|
+
plt.xlabel(self.xkey)
|
|
831
|
+
plt.ylabel(self.ykey)
|
|
832
|
+
#namespace[self.outputName] = out
|
|
833
|
+
|
|
834
|
+
@register_module('AddMetadataToMeasurements')
|
|
835
|
+
class AddMetadataToMeasurements(ModuleBase):
|
|
836
|
+
"""Adds metadata entries as extra column(s) to the output
|
|
837
|
+
|
|
838
|
+
This was written to allow key parameters or experimental variables to be tracked prior to aggregating / concatenating
|
|
839
|
+
measurements from multiple different images. By adding, e.g. the sample labelling, or a particular experimental
|
|
840
|
+
parameter to an output table as an extra column we can then aggregate and group that data in processing.
|
|
841
|
+
"""
|
|
842
|
+
inputMeasurements = Input('measurements')
|
|
843
|
+
inputImage = Input('input')
|
|
844
|
+
keys = CStr('SampleNotes')
|
|
845
|
+
metadataKeys = CStr('Sample.Notes')
|
|
846
|
+
outputName = Output('annotatedMeasurements')
|
|
847
|
+
string_length = Int(128, desc='Ammount of storage (characters) to allocate for string values')
|
|
848
|
+
|
|
849
|
+
def run(self, inputMeasurements, inputImage):
|
|
850
|
+
from PYME.IO import MetaDataHandler
|
|
851
|
+
res = {}
|
|
852
|
+
res.update(inputMeasurements)
|
|
853
|
+
|
|
854
|
+
nEntries = len(list(res.values())[0])
|
|
855
|
+
for k, mdk in zip(self.keys.split(), self.metadataKeys.split()):
|
|
856
|
+
if mdk == 'seriesName':
|
|
857
|
+
#import os
|
|
858
|
+
v = os.path.split(inputImage.seriesName)[1]
|
|
859
|
+
else:
|
|
860
|
+
v = inputImage.mdh[mdk]
|
|
861
|
+
|
|
862
|
+
if isinstance(v, str):
|
|
863
|
+
# use bytes/cstring dtype (rather than U) so that
|
|
864
|
+
# pytables doesn't bork on us
|
|
865
|
+
res[k] = np.array([v]*nEntries, dtype='S%d'%self.string_length)
|
|
866
|
+
else:
|
|
867
|
+
res[k] = np.array([v]*nEntries)
|
|
868
|
+
|
|
869
|
+
#res = pd.DataFrame(res)
|
|
870
|
+
res = tabular.DictSource(res)
|
|
871
|
+
#if 'mdh' in dir(meas):
|
|
872
|
+
res.mdh = MetaDataHandler.DictMDHandler(inputImage.mdh)
|
|
873
|
+
|
|
874
|
+
return res
|
|
875
|
+
|
|
876
|
+
|
|
877
|
+
@register_module('IdentifyOverlappingROIs')
|
|
878
|
+
class IdentifyOverlappingROIs(ModuleBase):
|
|
879
|
+
"""
|
|
880
|
+
|
|
881
|
+
Filter input ROI positions such that ROIs of a given size will not overlap. Output maintains all points, but with
|
|
882
|
+
the addition of a column indicating whether the point has been rejected due to overlap or not.
|
|
883
|
+
|
|
884
|
+
Parameters
|
|
885
|
+
----------
|
|
886
|
+
input : Input
|
|
887
|
+
PYME.IO.tabular containing x and y coordinates. Compatible with measurement output for Supertile coordinates,
|
|
888
|
+
e.g. 'x_um'
|
|
889
|
+
roi_size_pixels: Int
|
|
890
|
+
Size of ROI to be used in calculating overlap.
|
|
891
|
+
reject_key: CStr
|
|
892
|
+
Name of column to add to output datasource encoding whether a point has been rejected due to overlap (1) or
|
|
893
|
+
kept (0).
|
|
894
|
+
output: Output
|
|
895
|
+
PYME.IO.tabular
|
|
896
|
+
|
|
897
|
+
Notes
|
|
898
|
+
-----
|
|
899
|
+
Currently roi overlap is defined as being within sqrt(2) * roi_size. Obviously two square ROIs can be roi_size + 1
|
|
900
|
+
away from each other and not overlap if they are arranged correctly, so the current check is a little more happy-to-
|
|
901
|
+
toss points then it could be.
|
|
902
|
+
|
|
903
|
+
"""
|
|
904
|
+
input = Input('input')
|
|
905
|
+
roi_size_pixels = Int(256)
|
|
906
|
+
reject_key = CStr('rejected')
|
|
907
|
+
output = Output('cluster_metrics')
|
|
908
|
+
|
|
909
|
+
def run(self, input):
|
|
910
|
+
from scipy.spatial import KDTree
|
|
911
|
+
|
|
912
|
+
try:
|
|
913
|
+
positions = np.stack([input['x_um'], input['y_um']], axis=1)
|
|
914
|
+
far_flung = np.sqrt(2) * input.mdh['Pyramid.PixelSize'] * self.roi_size_pixels # [micrometers]
|
|
915
|
+
except KeyError:
|
|
916
|
+
positions = np.stack([input['x'], input['y']], axis=1) / 1e3 # assume x and y were in [nanometers]
|
|
917
|
+
far_flung = np.sqrt(2) * input.mdh['voxelsize.x'] * self.roi_size_pixels # [micrometers]
|
|
918
|
+
|
|
919
|
+
tree = KDTree(positions)
|
|
920
|
+
|
|
921
|
+
|
|
922
|
+
neighbors = tree.query_ball_tree(tree, r=far_flung, p=2)
|
|
923
|
+
|
|
924
|
+
tossing = set()
|
|
925
|
+
for ind, close in enumerate(neighbors):
|
|
926
|
+
if ind not in tossing and len(close) > 1: # ignore points we've already decided to reject
|
|
927
|
+
# reject points too close to our current indexed point
|
|
928
|
+
# TODO - don't reject points inside of this circular radius if their square ROIs don't actually overlap
|
|
929
|
+
close.remove(ind)
|
|
930
|
+
tossing.update(close)
|
|
931
|
+
|
|
932
|
+
out = tabular.MappingFilter(input)
|
|
933
|
+
reject = np.zeros(tree.n, dtype=int)
|
|
934
|
+
reject[list(tossing)] = 1
|
|
935
|
+
out.addColumn(self.reject_key, reject)
|
|
936
|
+
|
|
937
|
+
return out
|
|
938
|
+
|
|
939
|
+
|
|
940
|
+
@register_module('ChunkedTravelingSalesperson')
|
|
941
|
+
class ChunkedTravelingSalesperson(ModuleBase):
|
|
942
|
+
"""
|
|
943
|
+
|
|
944
|
+
Optimize route visiting each position in an input dataset exactly once, starting from the last point in the input.
|
|
945
|
+
2-opt algorithm is used, and points are chunked (very) roughly into a grid based on an assumption of uniform density
|
|
946
|
+
and the points_per_chunk argument. After the chunks are individually optimized, a modified two-opt algorithm is run
|
|
947
|
+
on the section end-points, so section order can be optimized as well as whether sections are traversed forwards or
|
|
948
|
+
backwards.
|
|
949
|
+
|
|
950
|
+
Parameters
|
|
951
|
+
----------
|
|
952
|
+
input : Input
|
|
953
|
+
PYME.IO.tabular containing x and y coordinates. Compatible with measurement output for Supertile coordinates,
|
|
954
|
+
e.g. 'x_um'
|
|
955
|
+
epsilon: Float
|
|
956
|
+
Relative improvement threshold used to stop algorithm when gains become negligible
|
|
957
|
+
points_per_chunk: Int
|
|
958
|
+
Number of points desired to be in each chunk that a two-opt algorithm is run on. Larger chunks tend toward more
|
|
959
|
+
ideal paths, but much larger computational complexity.
|
|
960
|
+
n_processes: Int
|
|
961
|
+
Number of processes to split the chunk tasks among. Setting of zero defaults to using one process per CPU core.
|
|
962
|
+
output: Output
|
|
963
|
+
PYME.IO.tabular
|
|
964
|
+
|
|
965
|
+
"""
|
|
966
|
+
input = Input('input')
|
|
967
|
+
epsilon = Float(0.001)
|
|
968
|
+
points_per_chunk = Int(500)
|
|
969
|
+
n_processes = Int(0)
|
|
970
|
+
output = Output('sorted')
|
|
971
|
+
|
|
972
|
+
def execute(self, namespace):
|
|
973
|
+
from PYME.Analysis.points.traveling_salesperson import sectioned_two_opt
|
|
974
|
+
|
|
975
|
+
points = namespace[self.input]
|
|
976
|
+
|
|
977
|
+
try:
|
|
978
|
+
positions = np.stack([points['x_um'], points['y_um']], axis=1)
|
|
979
|
+
except KeyError:
|
|
980
|
+
positions = np.stack([points['x'], points['y']], axis=1) / 1e3
|
|
981
|
+
|
|
982
|
+
final_route = sectioned_two_opt.tsp_chunk_two_opt_multiproc(positions, self.epsilon, self.points_per_chunk,
|
|
983
|
+
self.n_processes)
|
|
984
|
+
|
|
985
|
+
# note that we sorted the positions / sections once before, need to propagate that through before sorting
|
|
986
|
+
out = tabular.DictSource({k: points[k][final_route] for k in points.keys()})
|
|
987
|
+
out.mdh = MetaDataHandler.NestedClassMDHandler()
|
|
988
|
+
try:
|
|
989
|
+
out.mdh.copyEntriesFrom(points.mdh)
|
|
990
|
+
except AttributeError:
|
|
991
|
+
pass
|
|
992
|
+
|
|
993
|
+
# use the already sorted output to get the final distance
|
|
994
|
+
try:
|
|
995
|
+
og_distance = np.sqrt((points['x_um'][1:] - points['x_um'][:-1]) ** 2 + (points['y_um'][1:] - points['y_um'][:-1]) ** 2).sum()
|
|
996
|
+
final_distance = np.sqrt((out['x_um'][1:] - out['x_um'][:-1]) ** 2 + (out['y_um'][1:] - out['y_um'][:-1]) ** 2).sum()
|
|
997
|
+
except KeyError:
|
|
998
|
+
og_distance = np.sqrt((points['x'][1:] - points['x'][:-1]) ** 2 + (points['y'][1:] - points['y'][:-1]) ** 2).sum() / 1e3
|
|
999
|
+
final_distance = np.sqrt((out['x'][1:] - out['x'][:-1]) ** 2 + (out['y'][1:] - out['y'][:-1]) ** 2).sum() / 1e3
|
|
1000
|
+
|
|
1001
|
+
out.mdh['TravelingSalesperson.OriginalDistance'] = og_distance
|
|
1002
|
+
out.mdh['TravelingSalesperson.Distance'] = final_distance
|
|
1003
|
+
|
|
1004
|
+
namespace[self.output] = out
|
|
1005
|
+
|
|
1006
|
+
|
|
1007
|
+
|
|
1008
|
+
|
|
1009
|
+
@register_module('TravelingSalesperson')
|
|
1010
|
+
class TravelingSalesperson(ModuleBase):
|
|
1011
|
+
"""
|
|
1012
|
+
|
|
1013
|
+
Optimize route visiting each position in an input dataset exactly once, starting from the 0th point or
|
|
1014
|
+
the minimum x + y corner. A greedy sort is done first because it is quite fast and should for average case reduce
|
|
1015
|
+
number of moves from O(nlog(n)) to O(n).
|
|
1016
|
+
|
|
1017
|
+
Parameters
|
|
1018
|
+
----------
|
|
1019
|
+
input : Input
|
|
1020
|
+
PYME.IO.tabular containing x and y coordinates. Compatible with measurement output for Supertile coordinates,
|
|
1021
|
+
e.g. 'x_um'
|
|
1022
|
+
epsilon: Float
|
|
1023
|
+
Relative improvement threshold used to stop algorithm when gains become negligible
|
|
1024
|
+
start_from_corner: Bool
|
|
1025
|
+
Flag to toggle starting from the min(x + y) point [True] or the 0th point in the input positions.
|
|
1026
|
+
output: Output
|
|
1027
|
+
PYME.IO.tabular
|
|
1028
|
+
|
|
1029
|
+
|
|
1030
|
+
"""
|
|
1031
|
+
input = Input('input')
|
|
1032
|
+
epsilon = Float(0.001)
|
|
1033
|
+
start_from_corner = Bool(True)
|
|
1034
|
+
output = Output('sorted')
|
|
1035
|
+
|
|
1036
|
+
def execute(self, namespace):
|
|
1037
|
+
from PYME.Analysis.points.traveling_salesperson import sort
|
|
1038
|
+
|
|
1039
|
+
points = namespace[self.input]
|
|
1040
|
+
|
|
1041
|
+
try:
|
|
1042
|
+
positions = np.stack([points['x_um'], points['y_um']], axis=1)
|
|
1043
|
+
except KeyError:
|
|
1044
|
+
# units don't matter for these calculations, but we want to preserve them on the other side
|
|
1045
|
+
positions = np.stack([points['x'], points['y']], axis=1) / 1e3
|
|
1046
|
+
|
|
1047
|
+
start_index = 0 if not self.start_from_corner else np.argmin(positions.sum(axis=1))
|
|
1048
|
+
|
|
1049
|
+
positions, ogd, final_distance = sort.tsp_sort(positions, start_index, self.epsilon, return_path_length=True)
|
|
1050
|
+
|
|
1051
|
+
out = tabular.DictSource({'x_um': positions[:, 0],
|
|
1052
|
+
'y_um': positions[:, 1]})
|
|
1053
|
+
out.mdh = MetaDataHandler.NestedClassMDHandler()
|
|
1054
|
+
try:
|
|
1055
|
+
out.mdh.copyEntriesFrom(points.mdh)
|
|
1056
|
+
except AttributeError:
|
|
1057
|
+
pass
|
|
1058
|
+
out.mdh['TravelingSalesperson.Distance'] = final_distance
|
|
1059
|
+
out.mdh['TravelingSalesperson.OriginalDistance'] = ogd
|
|
1060
|
+
|
|
1061
|
+
namespace[self.output] = out
|
|
1062
|
+
|