python-microscopy 25.6.5__cp39-cp39-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- PYME/Acquire/ActionManager.py +450 -0
- PYME/Acquire/ExecTools.py +235 -0
- PYME/Acquire/Hardware/AAOptoelectronics/MDS.py +175 -0
- PYME/Acquire/Hardware/AAOptoelectronics/__init__.py +0 -0
- PYME/Acquire/Hardware/ARCoptix/__init__.py +0 -0
- PYME/Acquire/Hardware/ARCoptix/lcdriver.py +149 -0
- PYME/Acquire/Hardware/ARCoptix/lcserver32.py +123 -0
- PYME/Acquire/Hardware/AndorIXon/AndorCam.py +1095 -0
- PYME/Acquire/Hardware/AndorIXon/AndorControlFrame.py +312 -0
- PYME/Acquire/Hardware/AndorIXon/AndorIXon.py +737 -0
- PYME/Acquire/Hardware/AndorIXon/__init__.py +27 -0
- PYME/Acquire/Hardware/AndorNeo/AndorNeo.py +644 -0
- PYME/Acquire/Hardware/AndorNeo/AndorNeoControlFrame.py +161 -0
- PYME/Acquire/Hardware/AndorNeo/AndorZyla.py +761 -0
- PYME/Acquire/Hardware/AndorNeo/SDK3.py +307 -0
- PYME/Acquire/Hardware/AndorNeo/SDK3Cam.py +171 -0
- PYME/Acquire/Hardware/AndorNeo/ZylaControlPanel.py +105 -0
- PYME/Acquire/Hardware/AndorNeo/__init__.py +22 -0
- PYME/Acquire/Hardware/AndorNeo/parseAtdebug.py +46 -0
- PYME/Acquire/Hardware/AndorNeo/plotTimings.py +73 -0
- PYME/Acquire/Hardware/AndorNeo/testNeo.py +62 -0
- PYME/Acquire/Hardware/Camera.py +1199 -0
- PYME/Acquire/Hardware/CameraSkeleton.py +642 -0
- PYME/Acquire/Hardware/Coherent/OBIS.py +147 -0
- PYME/Acquire/Hardware/Coherent/Sapphire.py +162 -0
- PYME/Acquire/Hardware/Coherent/__init__.py +0 -0
- PYME/Acquire/Hardware/DMDGui.py +198 -0
- PYME/Acquire/Hardware/DigiData/DigiData.py +95 -0
- PYME/Acquire/Hardware/DigiData/DigiDataClient.py +30 -0
- PYME/Acquire/Hardware/DigiData/RemoteDigiData.py +51 -0
- PYME/Acquire/Hardware/DigiData/__init__.py +24 -0
- PYME/Acquire/Hardware/DigiData/axDD132x.py +348 -0
- PYME/Acquire/Hardware/EMCCDTheory.py +41 -0
- PYME/Acquire/Hardware/ExciterWheel.py +167 -0
- PYME/Acquire/Hardware/FilterWheel.py +184 -0
- PYME/Acquire/Hardware/FocCorr.py +106 -0
- PYME/Acquire/Hardware/FocCorrR.py +196 -0
- PYME/Acquire/Hardware/FrFilter.py +51 -0
- PYME/Acquire/Hardware/GCS/GCS_DLL.py +370 -0
- PYME/Acquire/Hardware/GCS/__init__.py +0 -0
- PYME/Acquire/Hardware/GCS/gcs.py +210 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/HamamatsuDCAM.py +662 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/HamamatsuORCA.py +602 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/Hamamatsu_control_panel.py +54 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/__init__.py +23 -0
- PYME/Acquire/Hardware/LaserControlFrame.py +160 -0
- PYME/Acquire/Hardware/MPBCommunications/MPBCW.py +132 -0
- PYME/Acquire/Hardware/MPBCommunications/__init__.py +0 -0
- PYME/Acquire/Hardware/Mercury/Mercury.py +269 -0
- PYME/Acquire/Hardware/Mercury/PI_Mercury_GCS_DLL.py +857 -0
- PYME/Acquire/Hardware/Mercury/__init__.py +22 -0
- PYME/Acquire/Hardware/Mercury/mercuryStepper.py +203 -0
- PYME/Acquire/Hardware/Mercury/mercuryStepperGCS.py +281 -0
- PYME/Acquire/Hardware/NikonTE2000.py +68 -0
- PYME/Acquire/Hardware/NikonTi.py +214 -0
- PYME/Acquire/Hardware/NikonTiGUI.py +81 -0
- PYME/Acquire/Hardware/OrielCornerstone.py +125 -0
- PYME/Acquire/Hardware/PM100USB.py +51 -0
- PYME/Acquire/Hardware/Piezos/__init__.py +22 -0
- PYME/Acquire/Hardware/Piezos/base_piezo.py +108 -0
- PYME/Acquire/Hardware/Piezos/offsetPiezo.py +162 -0
- PYME/Acquire/Hardware/Piezos/offsetPiezoREST.py +308 -0
- PYME/Acquire/Hardware/Piezos/piezo_c867.py +486 -0
- PYME/Acquire/Hardware/Piezos/piezo_e255.py +68 -0
- PYME/Acquire/Hardware/Piezos/piezo_e662.py +61 -0
- PYME/Acquire/Hardware/Piezos/piezo_e709.py +434 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816.py +452 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816_corr.py +70 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816_dll.py +518 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816b.py +70 -0
- PYME/Acquire/Hardware/Piezos/piezo_pipython_gcs.py +560 -0
- PYME/Acquire/Hardware/Piezos/piezo_test.py +55 -0
- PYME/Acquire/Hardware/Simulator/EmpiricalHist.py +273 -0
- PYME/Acquire/Hardware/Simulator/__init__.py +22 -0
- PYME/Acquire/Hardware/Simulator/dSimControl.py +961 -0
- PYME/Acquire/Hardware/Simulator/fakeCam.py +651 -0
- PYME/Acquire/Hardware/Simulator/fakePiezo.py +95 -0
- PYME/Acquire/Hardware/Simulator/fluor.py +336 -0
- PYME/Acquire/Hardware/Simulator/illuminate.cp39-win_amd64.dll.a +0 -0
- PYME/Acquire/Hardware/Simulator/illuminate.cp39-win_amd64.pyd +0 -0
- PYME/Acquire/Hardware/Simulator/illuminate.pyx +93 -0
- PYME/Acquire/Hardware/Simulator/lasersliders.py +90 -0
- PYME/Acquire/Hardware/Simulator/rend_im.py +446 -0
- PYME/Acquire/Hardware/Simulator/setup.py +69 -0
- PYME/Acquire/Hardware/Simulator/simcontrol.py +348 -0
- PYME/Acquire/Hardware/Simulator/simui_wx.py +794 -0
- PYME/Acquire/Hardware/Tango/__init__.py +0 -0
- PYME/Acquire/Hardware/Tango/marzhauser_tango.py +583 -0
- PYME/Acquire/Hardware/TiLightCrafter.py +388 -0
- PYME/Acquire/Hardware/__init__.py +22 -0
- PYME/Acquire/Hardware/aotf.py +271 -0
- PYME/Acquire/Hardware/arclampshutterpanel.py +71 -0
- PYME/Acquire/Hardware/cameraSoftwareBuffer.py +215 -0
- PYME/Acquire/Hardware/camera_noise.py +270 -0
- PYME/Acquire/Hardware/ccdAdjPanel.py +188 -0
- PYME/Acquire/Hardware/ccdCalibrator.py +161 -0
- PYME/Acquire/Hardware/cobaltLaser.py +108 -0
- PYME/Acquire/Hardware/cobaltLaser561.py +94 -0
- PYME/Acquire/Hardware/comports.py +26 -0
- PYME/Acquire/Hardware/driftTrackGUI.py +488 -0
- PYME/Acquire/Hardware/driftTracking.py +595 -0
- PYME/Acquire/Hardware/fakeShutters.py +52 -0
- PYME/Acquire/Hardware/focusKeys.py +204 -0
- PYME/Acquire/Hardware/focus_locks/__init__.py +0 -0
- PYME/Acquire/Hardware/focus_locks/reflection_focus_lock.py +684 -0
- PYME/Acquire/Hardware/frZStage.py +117 -0
- PYME/Acquire/Hardware/fw102.py +38 -0
- PYME/Acquire/Hardware/ids_peak_cam.py +561 -0
- PYME/Acquire/Hardware/ioslave.py +305 -0
- PYME/Acquire/Hardware/lasers.py +292 -0
- PYME/Acquire/Hardware/matchboxLaser.py +58 -0
- PYME/Acquire/Hardware/microscope_adapter.py +104 -0
- PYME/Acquire/Hardware/mpd_picosecond_delayer.py +395 -0
- PYME/Acquire/Hardware/multiview.py +287 -0
- PYME/Acquire/Hardware/olympusix81.py +59 -0
- PYME/Acquire/Hardware/pco/__init__.py +0 -0
- PYME/Acquire/Hardware/pco/pco_cam.py +348 -0
- PYME/Acquire/Hardware/pco/pco_edge_42_lt.py +34 -0
- PYME/Acquire/Hardware/pco/pco_sdk.py +1645 -0
- PYME/Acquire/Hardware/pco/pco_sdk_cam.py +518 -0
- PYME/Acquire/Hardware/pco/pco_sdk_cam_control_panel.py +54 -0
- PYME/Acquire/Hardware/phoxxLaser.py +199 -0
- PYME/Acquire/Hardware/phoxxLaserOLD.py +242 -0
- PYME/Acquire/Hardware/priorLumen.py +102 -0
- PYME/Acquire/Hardware/priorarclampshutter.py +52 -0
- PYME/Acquire/Hardware/setup.py +50 -0
- PYME/Acquire/Hardware/spacenav.py +148 -0
- PYME/Acquire/Hardware/splitter.py +394 -0
- PYME/Acquire/Hardware/thorlabsPiezo.py +98 -0
- PYME/Acquire/Hardware/thorlabs_cam.py +136 -0
- PYME/Acquire/Hardware/thorlabs_mff_flipper.py +400 -0
- PYME/Acquire/Hardware/toptica_ibeam.py +51 -0
- PYME/Acquire/Hardware/uc480/AndorControlFrame.py +308 -0
- PYME/Acquire/Hardware/uc480/__init__.py +27 -0
- PYME/Acquire/Hardware/uc480/uCam480.py +695 -0
- PYME/Acquire/Hardware/uc480/uc480.py +189 -0
- PYME/Acquire/Hardware/uc480/uc480Deprecated.py +87 -0
- PYME/Acquire/Hardware/uc480/uc480_h.py +767 -0
- PYME/Acquire/Hardware/uc480/uc480_h_gen.py +62 -0
- PYME/Acquire/Hardware/uc480/ucCamControlFrame.py +83 -0
- PYME/Acquire/Hardware/ueye.py +702 -0
- PYME/Acquire/PYMEAcquire.py +186 -0
- PYME/Acquire/Protocols/DMDMFM.py +74 -0
- PYME/Acquire/Protocols/__init__.py +22 -0
- PYME/Acquire/Protocols/darkCalibrate.py +56 -0
- PYME/Acquire/Protocols/dual671_470.py +45 -0
- PYME/Acquire/Protocols/dual671_488.py +46 -0
- PYME/Acquire/Protocols/gainCal.py +53 -0
- PYME/Acquire/Protocols/htsms-cal-psf.py +32 -0
- PYME/Acquire/Protocols/htsms-cal-registration.py +52 -0
- PYME/Acquire/Protocols/htsms-flow.py +29 -0
- PYME/Acquire/Protocols/htsms-staggered.py +31 -0
- PYME/Acquire/Protocols/htsms-tile.py +68 -0
- PYME/Acquire/Protocols/htsms-two-color.py +29 -0
- PYME/Acquire/Protocols/htsms-widefield.py +32 -0
- PYME/Acquire/Protocols/paint671.py +61 -0
- PYME/Acquire/Protocols/photoconversion.py +52 -0
- PYME/Acquire/Protocols/photoconversion2.py +55 -0
- PYME/Acquire/Protocols/prebleach488.py +70 -0
- PYME/Acquire/Protocols/prebleach490.py +69 -0
- PYME/Acquire/Protocols/prebleach561.py +72 -0
- PYME/Acquire/Protocols/prebleach561NeomEos2.py +70 -0
- PYME/Acquire/Protocols/prebleach561NeomEos2ND1.py +70 -0
- PYME/Acquire/Protocols/prebleach642.py +70 -0
- PYME/Acquire/Protocols/prebleach671.py +69 -0
- PYME/Acquire/Protocols/prebleach671ND1.py +58 -0
- PYME/Acquire/Protocols/prebleach671ND2.py +57 -0
- PYME/Acquire/Protocols/prebleach671Neo.py +69 -0
- PYME/Acquire/Protocols/recover671.py +62 -0
- PYME/Acquire/Protocols/sequence642_488.py +85 -0
- PYME/Acquire/Protocols/sequence642_561.py +87 -0
- PYME/Acquire/Protocols/shiftfield.py +198 -0
- PYME/Acquire/Protocols/simul488.py +59 -0
- PYME/Acquire/Protocols/simul642.py +63 -0
- PYME/Acquire/Protocols/simul642HTSMS.py +63 -0
- PYME/Acquire/Protocols/simulPA.py +37 -0
- PYME/Acquire/Protocols/simulSIM.py +76 -0
- PYME/Acquire/Protocols/simulStep.py +62 -0
- PYME/Acquire/Protocols/spdscan.py +178 -0
- PYME/Acquire/Protocols/standard470.py +45 -0
- PYME/Acquire/Protocols/standard488.py +47 -0
- PYME/Acquire/Protocols/standard671.py +48 -0
- PYME/Acquire/Protocols/standard671_no532.py +47 -0
- PYME/Acquire/Protocols/standardArclamp.py +46 -0
- PYME/Acquire/Protocols/strip_tile.py +204 -0
- PYME/Acquire/Protocols/tile.py +204 -0
- PYME/Acquire/Protocols/tile3D.py +192 -0
- PYME/Acquire/Protocols/tile671.py +190 -0
- PYME/Acquire/Protocols/tile_triggered.py +189 -0
- PYME/Acquire/Scripts/init.py +232 -0
- PYME/Acquire/Scripts/init_N1_Ti_Exeter_ZIx.py +374 -0
- PYME/Acquire/Scripts/init_N2_Ti_Zyla_lasers.py +290 -0
- PYME/Acquire/Scripts/init_Neo.py +266 -0
- PYME/Acquire/Scripts/init_NeoSim.py +159 -0
- PYME/Acquire/Scripts/init_TIRF.py +232 -0
- PYME/Acquire/Scripts/init_TIRF_Neo.py +242 -0
- PYME/Acquire/Scripts/init_TIRF_NeoO.py +241 -0
- PYME/Acquire/Scripts/init_TIRF_onecam.py +233 -0
- PYME/Acquire/Scripts/init_Ti.py +257 -0
- PYME/Acquire/Scripts/init_UOA_n.py +256 -0
- PYME/Acquire/Scripts/init_UOA_n2.py +246 -0
- PYME/Acquire/Scripts/init_Y1.py +249 -0
- PYME/Acquire/Scripts/init_Zyla.py +260 -0
- PYME/Acquire/Scripts/init_drift_tracking.py +80 -0
- PYME/Acquire/Scripts/init_emccd_basic.py +277 -0
- PYME/Acquire/Scripts/init_htsms.py +277 -0
- PYME/Acquire/Scripts/init_htsms_focus_lock.py +132 -0
- PYME/Acquire/Scripts/init_micrpi.py +45 -0
- PYME/Acquire/Scripts/init_orca.py +70 -0
- PYME/Acquire/Scripts/init_pco.py +49 -0
- PYME/Acquire/Scripts/init_rev.py +74 -0
- PYME/Acquire/Scripts/init_sim100.py +169 -0
- PYME/Acquire/Scripts/init_sim103.py +169 -0
- PYME/Acquire/Scripts/init_sim2.py +211 -0
- PYME/Acquire/Scripts/init_sim50.py +169 -0
- PYME/Acquire/Scripts/init_sim75.py +169 -0
- PYME/Acquire/Scripts/init_sim_drift_tracking.py +166 -0
- PYME/Acquire/Scripts/init_sim_htsms.py +224 -0
- PYME/Acquire/Scripts/init_sim_htsms_n.py +233 -0
- PYME/Acquire/Scripts/init_sim_main.py +229 -0
- PYME/Acquire/Scripts/init_sim_min.py +197 -0
- PYME/Acquire/Scripts/init_sim_rem.py +176 -0
- PYME/Acquire/Scripts/init_smi1.py +110 -0
- PYME/Acquire/Scripts/init_spectro.py +78 -0
- PYME/Acquire/Scripts/init_spim.py +116 -0
- PYME/Acquire/Scripts/init_thorcam.py +62 -0
- PYME/Acquire/Scripts/init_twophoton.py +112 -0
- PYME/Acquire/Scripts/init_uc480.py +262 -0
- PYME/Acquire/Scripts/init_ueye.py +261 -0
- PYME/Acquire/SpoolController.py +958 -0
- PYME/Acquire/Utils/MultiPointScanner.py +80 -0
- PYME/Acquire/Utils/__init__.py +13 -0
- PYME/Acquire/Utils/failsafe.py +157 -0
- PYME/Acquire/Utils/fastTiler.py +153 -0
- PYME/Acquire/Utils/pointScanner.py +496 -0
- PYME/Acquire/Utils/sarcSpacing.py +86 -0
- PYME/Acquire/Utils/strip_tiler.py +93 -0
- PYME/Acquire/Utils/tiler.py +464 -0
- PYME/Acquire/Utils/vibrationAnalysis.py +65 -0
- PYME/Acquire/__init__.py +44 -0
- PYME/Acquire/acquire_client.py +90 -0
- PYME/Acquire/acquire_server.py +316 -0
- PYME/Acquire/acquirebase.py +139 -0
- PYME/Acquire/acquiremainframe.py +716 -0
- PYME/Acquire/acquirewx.py +61 -0
- PYME/Acquire/acquisition_base.py +148 -0
- PYME/Acquire/actions.py +209 -0
- PYME/Acquire/autofocus.py +54 -0
- PYME/Acquire/eventLog.py +95 -0
- PYME/Acquire/event_loop.py +119 -0
- PYME/Acquire/frameWrangler.py +530 -0
- PYME/Acquire/htsms/__init__.py +8 -0
- PYME/Acquire/htsms/rule_ui.py +970 -0
- PYME/Acquire/htsms/rule_ui_v2.py +573 -0
- PYME/Acquire/htsms/tweeter.py +222 -0
- PYME/Acquire/microscope.py +1050 -0
- PYME/Acquire/positionTracker.py +181 -0
- PYME/Acquire/protocol.py +299 -0
- PYME/Acquire/protocol_acquisition.py +404 -0
- PYME/Acquire/sampleInformation.py +591 -0
- PYME/Acquire/sampleInformationDjangoDirect.py +446 -0
- PYME/Acquire/setup.py +52 -0
- PYME/Acquire/stackSettings.py +295 -0
- PYME/Acquire/stage_leveling.py +285 -0
- PYME/Acquire/ui/AnalysisSettingsUI.py +184 -0
- PYME/Acquire/ui/HDFSpoolFrame.py +584 -0
- PYME/Acquire/ui/__init__.py +0 -0
- PYME/Acquire/ui/actionUI.py +892 -0
- PYME/Acquire/ui/focus_lock_gui.py +149 -0
- PYME/Acquire/ui/intensity_trace.py +143 -0
- PYME/Acquire/ui/intsliders.py +222 -0
- PYME/Acquire/ui/lasersliders.py +329 -0
- PYME/Acquire/ui/mpd_picosecond_delay_panel.py +69 -0
- PYME/Acquire/ui/multiview_select.py +77 -0
- PYME/Acquire/ui/positionUI.py +519 -0
- PYME/Acquire/ui/preflight.py +58 -0
- PYME/Acquire/ui/scanner_panel.py +41 -0
- PYME/Acquire/ui/selectCameraPanel.py +46 -0
- PYME/Acquire/ui/seqdialog.py +501 -0
- PYME/Acquire/ui/splashScreen.py +175 -0
- PYME/Acquire/ui/spool_panel.py +830 -0
- PYME/Acquire/ui/tile_panel.py +556 -0
- PYME/Acquire/ui/tilesettingsui.py +91 -0
- PYME/Acquire/ui/voxelSizeDialog.py +149 -0
- PYME/Acquire/webui/__init__.py +36 -0
- PYME/Acquire/webui/ipy.py +361 -0
- PYME/Acquire/webui/static/css/pyme-bootstrap.css +9908 -0
- PYME/Acquire/webui/static/css/pymeacquire.css +85 -0
- PYME/Acquire/webui/static/js/pymeacquire.js +375 -0
- PYME/Acquire/webui/static/js/pzf.js +95 -0
- PYME/Acquire/webui/templates/PYMEAcquire.html +232 -0
- PYME/Acquire/webui/templates/login.html +84 -0
- PYME/Acquire/webui/templates/xtermpage.html +106 -0
- PYME/Acquire/xyztc.py +418 -0
- PYME/Acquire/zScanner.py +287 -0
- PYME/Analysis/BleachProfile/__init__.py +26 -0
- PYME/Analysis/BleachProfile/deMod.py +91 -0
- PYME/Analysis/BleachProfile/fitRecover.py +90 -0
- PYME/Analysis/BleachProfile/intensProf.py +519 -0
- PYME/Analysis/BleachProfile/kinModels.py +507 -0
- PYME/Analysis/BleachProfile/rawIntensity.py +227 -0
- PYME/Analysis/BleachProfile/rollins.py +555 -0
- PYME/Analysis/Colocalisation/__init__.py +27 -0
- PYME/Analysis/Colocalisation/colocScaleDep.py +126 -0
- PYME/Analysis/Colocalisation/correlationCoeffs.py +198 -0
- PYME/Analysis/Colocalisation/distColoc.py +110 -0
- PYME/Analysis/Colocalisation/edtColoc.py +191 -0
- PYME/Analysis/MetaData.py +278 -0
- PYME/Analysis/PSFEst/__init__.py +27 -0
- PYME/Analysis/PSFEst/dec.py +283 -0
- PYME/Analysis/PSFEst/extractImages.py +316 -0
- PYME/Analysis/PSFEst/fit_psf_zernikes.py +194 -0
- PYME/Analysis/PSFEst/psfQuality.py +225 -0
- PYME/Analysis/PSFGen/__init__.py +40 -0
- PYME/Analysis/PSFGen/fourier.py +138 -0
- PYME/Analysis/PSFGen/fourierHNA.py +1108 -0
- PYME/Analysis/PSFGen/fourierHNA2.py +979 -0
- PYME/Analysis/PSFGen/genCRBcurves.py +185 -0
- PYME/Analysis/PSFGen/nijboer_zernike.py +79 -0
- PYME/Analysis/PSFGen/ps_app.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/PSFGen/ps_app.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/PSFGen/test_ps_app.py +24 -0
- PYME/Analysis/Tracking/__init__.py +3 -0
- PYME/Analysis/Tracking/msd.py +57 -0
- PYME/Analysis/Tracking/trackUtils.py +528 -0
- PYME/Analysis/Tracking/tracking.py +152 -0
- PYME/Analysis/__init__.py +30 -0
- PYME/Analysis/_fithelpers.py +161 -0
- PYME/Analysis/angleFilter.py +287 -0
- PYME/Analysis/annealThresh.py +157 -0
- PYME/Analysis/autoencoder_classifier.py +45 -0
- PYME/Analysis/binAvg.py +144 -0
- PYME/Analysis/composite.py +183 -0
- PYME/Analysis/cramerRao.py +259 -0
- PYME/Analysis/deTile.py +441 -0
- PYME/Analysis/density_filter.py +45 -0
- PYME/Analysis/distributed_pyramid.py +426 -0
- PYME/Analysis/fiducial_matching.py +220 -0
- PYME/Analysis/gen_sCMOS_maps.py +355 -0
- PYME/Analysis/graphing_filters.py +311 -0
- PYME/Analysis/implicitFilter.py +359 -0
- PYME/Analysis/keep_pairs.py +69 -0
- PYME/Analysis/optic_flow.py +108 -0
- PYME/Analysis/piecewise.py +36 -0
- PYME/Analysis/piecewiseMapping.py +304 -0
- PYME/Analysis/piezo_movement_correction.py +153 -0
- PYME/Analysis/points/DeClump/__init__.py +78 -0
- PYME/Analysis/points/DeClump/deClump.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/DeClump/deClump.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/DeClump/deClumpGUI.py +87 -0
- PYME/Analysis/points/DeClump/pyDeClump.py +284 -0
- PYME/Analysis/points/DeClump/testClump.py +40 -0
- PYME/Analysis/points/DistHist/__init__.py +25 -0
- PYME/Analysis/points/DistHist/distHist.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/DistHist/distHist.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/DistHist/distHistThreaded.py +71 -0
- PYME/Analysis/points/DistHist/setup.py +54 -0
- PYME/Analysis/points/EdgeDB/__init__.py +24 -0
- PYME/Analysis/points/EdgeDB/edgeDB.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/EdgeDB/edgeDB.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/EdgeDB/edgeTest.py +66 -0
- PYME/Analysis/points/EdgeDB/edges.py +102 -0
- PYME/Analysis/points/EdgeDB/segment.py +75 -0
- PYME/Analysis/points/EdgeDB/setup.py +54 -0
- PYME/Analysis/points/QuadTree/QTrend.py +232 -0
- PYME/Analysis/points/QuadTree/__init__.py +25 -0
- PYME/Analysis/points/QuadTree/pointQT.py +227 -0
- PYME/Analysis/points/QuadTree/pointQTF.py +254 -0
- PYME/Analysis/points/QuadTree/qtUtils.py +36 -0
- PYME/Analysis/points/QuadTree/rendQT.py +118 -0
- PYME/Analysis/points/SoftRend/__init__.py +24 -0
- PYME/Analysis/points/SoftRend/setup.py +61 -0
- PYME/Analysis/points/SoftRend/testTetrahedra.py +41 -0
- PYME/Analysis/points/SoftRend/triRend.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/SoftRend/triRend.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/__init__.py +3 -0
- PYME/Analysis/points/arcfit/__init__.py +1 -0
- PYME/Analysis/points/arcfit/arcmf.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/arcfit/arcmf.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/arcfit/setup.py +51 -0
- PYME/Analysis/points/astigmatism/__init__.py +0 -0
- PYME/Analysis/points/astigmatism/astigTools.py +338 -0
- PYME/Analysis/points/astigmatism/astiglookup.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/astigmatism/astiglookup.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/astigmatism/setup.py +54 -0
- PYME/Analysis/points/cluster_morphology.py +199 -0
- PYME/Analysis/points/coordinate_tools.py +278 -0
- PYME/Analysis/points/features/__init__.py +0 -0
- PYME/Analysis/points/features/metal.py +46 -0
- PYME/Analysis/points/features/shaders/vect_feat_3d.metal +49 -0
- PYME/Analysis/points/fiducials.py +142 -0
- PYME/Analysis/points/gen3DTriangs.py +796 -0
- PYME/Analysis/points/moments.py +143 -0
- PYME/Analysis/points/multiview.py +458 -0
- PYME/Analysis/points/objectMeasure.py +206 -0
- PYME/Analysis/points/qpaint.py +97 -0
- PYME/Analysis/points/rings.py +372 -0
- PYME/Analysis/points/ripleys.py +427 -0
- PYME/Analysis/points/segmentLL.py +134 -0
- PYME/Analysis/points/setup.py +56 -0
- PYME/Analysis/points/spherical_harmonics.py +909 -0
- PYME/Analysis/points/surfit.py +829 -0
- PYME/Analysis/points/tCluster.py +75 -0
- PYME/Analysis/points/traveling_salesperson/__init__.py +0 -0
- PYME/Analysis/points/traveling_salesperson/queue_opt.py +117 -0
- PYME/Analysis/points/traveling_salesperson/sectioned_two_opt.py +327 -0
- PYME/Analysis/points/traveling_salesperson/setup.py +40 -0
- PYME/Analysis/points/traveling_salesperson/sort.py +78 -0
- PYME/Analysis/points/traveling_salesperson/two_opt.py +189 -0
- PYME/Analysis/points/traveling_salesperson/two_opt_utils.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/traveling_salesperson/two_opt_utils.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/traveling_salesperson/two_opt_utils.pyx +41 -0
- PYME/Analysis/points/twoColour.py +572 -0
- PYME/Analysis/points/twoColourPlot.py +107 -0
- PYME/Analysis/processLogger.py +129 -0
- PYME/Analysis/profile_extraction.py +72 -0
- PYME/Analysis/setup.py +60 -0
- PYME/Analysis/splitting.py +372 -0
- PYME/Analysis/svmSegment.py +214 -0
- PYME/Analysis/thresholding.py +192 -0
- PYME/Analysis/tile_pyramid.py +938 -0
- PYME/Analysis/widefieldify.py +54 -0
- PYME/DSView/DisplayOptionsPanel.py +503 -0
- PYME/DSView/LUT/__init__.py +33 -0
- PYME/DSView/LUT/lut.cp39-win_amd64.dll.a +0 -0
- PYME/DSView/LUT/lut.cp39-win_amd64.pyd +0 -0
- PYME/DSView/LUT/setup.py +54 -0
- PYME/DSView/OpenSequenceDialog.py +83 -0
- PYME/DSView/OverlaysPanel.py +111 -0
- PYME/DSView/__init__.py +32 -0
- PYME/DSView/arrayViewPanel.py +1035 -0
- PYME/DSView/displayOptions.py +453 -0
- PYME/DSView/displaySettingsPanel.py +271 -0
- PYME/DSView/dsviewer.py +542 -0
- PYME/DSView/eventLogViewer.py +805 -0
- PYME/DSView/fitInfo.py +486 -0
- PYME/DSView/htmlServe.py +72 -0
- PYME/DSView/logparser.py +100 -0
- PYME/DSView/modules/LMAnalysis.py +1053 -0
- PYME/DSView/modules/LMDisplay.py +194 -0
- PYME/DSView/modules/__init__.py +162 -0
- PYME/DSView/modules/_base.py +39 -0
- PYME/DSView/modules/annotation.py +725 -0
- PYME/DSView/modules/arrayView.py +71 -0
- PYME/DSView/modules/blobFinding.py +455 -0
- PYME/DSView/modules/blobMeasure.py +1093 -0
- PYME/DSView/modules/camera_maps.py +38 -0
- PYME/DSView/modules/coloc.py +414 -0
- PYME/DSView/modules/composite.py +715 -0
- PYME/DSView/modules/convnet.py +24 -0
- PYME/DSView/modules/cropping.py +133 -0
- PYME/DSView/modules/dark_and_flatfield.py +31 -0
- PYME/DSView/modules/deconvolution.py +499 -0
- PYME/DSView/modules/eventView.py +80 -0
- PYME/DSView/modules/extractBlobs.py +46 -0
- PYME/DSView/modules/fastGraphPanel.py +85 -0
- PYME/DSView/modules/filtering.py +335 -0
- PYME/DSView/modules/flowView.py +268 -0
- PYME/DSView/modules/fourierRingCorrelation.py +172 -0
- PYME/DSView/modules/gl_image_view.py +12 -0
- PYME/DSView/modules/graphViewPanel.py +272 -0
- PYME/DSView/modules/measure/__init__.py +1 -0
- PYME/DSView/modules/measure/filterPan.py +239 -0
- PYME/DSView/modules/metadataView.py +28 -0
- PYME/DSView/modules/multithreshold.py +98 -0
- PYME/DSView/modules/neuroglancer.py +129 -0
- PYME/DSView/modules/object_tagging.py +157 -0
- PYME/DSView/modules/particleTracking.py +463 -0
- PYME/DSView/modules/playback.py +256 -0
- PYME/DSView/modules/prebleachExtraction.py +75 -0
- PYME/DSView/modules/profileFitting.py +137 -0
- PYME/DSView/modules/profilePlotting.py +408 -0
- PYME/DSView/modules/projections.py +48 -0
- PYME/DSView/modules/psfExtraction.py +570 -0
- PYME/DSView/modules/psfGeneration.py +138 -0
- PYME/DSView/modules/psfTools.py +661 -0
- PYME/DSView/modules/pupilTools.py +204 -0
- PYME/DSView/modules/pupilView.py +139 -0
- PYME/DSView/modules/recipes.py +266 -0
- PYME/DSView/modules/redimension.py +75 -0
- PYME/DSView/modules/segmentation.py +192 -0
- PYME/DSView/modules/sheetView.py +24 -0
- PYME/DSView/modules/shell.py +39 -0
- PYME/DSView/modules/shiftfield_estimation.py +433 -0
- PYME/DSView/modules/sparkprepare.py +94 -0
- PYME/DSView/modules/splitter.py +148 -0
- PYME/DSView/modules/synchronise.py +64 -0
- PYME/DSView/modules/templates/astigCal.html +42 -0
- PYME/DSView/modules/templates/measureView.html +69 -0
- PYME/DSView/modules/templates/measureView2.html +48 -0
- PYME/DSView/modules/templates/measureView3.html +98 -0
- PYME/DSView/modules/templates/trackView.html +139 -0
- PYME/DSView/modules/templates/tracksOverview.html +21 -0
- PYME/DSView/modules/tiling.py +147 -0
- PYME/DSView/modules/unmixing.py +148 -0
- PYME/DSView/modules/vis3D.py +320 -0
- PYME/DSView/modules/visgui.py +163 -0
- PYME/DSView/modules/webview.py +14 -0
- PYME/DSView/overlays.py +295 -0
- PYME/DSView/scrolledImagePanel.py +188 -0
- PYME/DSView/setup.py +53 -0
- PYME/DSView/splashScreen.py +158 -0
- PYME/DSView/voxSizeDialog.py +84 -0
- PYME/Deconv/__init__.py +35 -0
- PYME/Deconv/beadGen.py +55 -0
- PYME/Deconv/dec.py +659 -0
- PYME/Deconv/decTask.py +65 -0
- PYME/Deconv/decThread.py +113 -0
- PYME/Deconv/dec_test.py +47 -0
- PYME/Deconv/deconvDialogs.py +417 -0
- PYME/Deconv/fftwWisdom.py +62 -0
- PYME/Deconv/richardsonLucy.py +141 -0
- PYME/Deconv/richardsonLucyMV.py +151 -0
- PYME/Deconv/richardsonLucyMVM.py +218 -0
- PYME/Deconv/test_block_dec.py +46 -0
- PYME/Deconv/tq_block_dec.py +331 -0
- PYME/Deconv/wiener.py +163 -0
- PYME/IO/DataSources/AlignDataSource.py +91 -0
- PYME/IO/DataSources/ArrayDataSource.py +260 -0
- PYME/IO/DataSources/BGSDataSource.py +353 -0
- PYME/IO/DataSources/BaseDataSource.py +457 -0
- PYME/IO/DataSources/BioformatsDataSource.py +178 -0
- PYME/IO/DataSources/BufferedDataSource.py +99 -0
- PYME/IO/DataSources/ClusterPZFDataSource.py +124 -0
- PYME/IO/DataSources/ConcatenatedDataSource.py +56 -0
- PYME/IO/DataSources/CropDataSource.py +243 -0
- PYME/IO/DataSources/DcimgDataSource.py +54 -0
- PYME/IO/DataSources/ElectronsPerSecondDataSource.py +61 -0
- PYME/IO/DataSources/FlatFieldDataSource.py +77 -0
- PYME/IO/DataSources/HDFDataSource.py +160 -0
- PYME/IO/DataSources/HTTPDataSource.py +80 -0
- PYME/IO/DataSources/ImageSeriesDataSource.py +123 -0
- PYME/IO/DataSources/MultiviewDataSource.py +99 -0
- PYME/IO/DataSources/OBFDataSource.py +67 -0
- PYME/IO/DataSources/RandomDataSource.py +23 -0
- PYME/IO/DataSources/SupertileDatasource.py +148 -0
- PYME/IO/DataSources/TQDataSource.py +41 -0
- PYME/IO/DataSources/TiffDataSource.py +193 -0
- PYME/IO/DataSources/TileDataSource.py +91 -0
- PYME/IO/DataSources/UnsplitDataSource.py +92 -0
- PYME/IO/DataSources/__init__.py +59 -0
- PYME/IO/FileUtils/IJLut.py +43 -0
- PYME/IO/FileUtils/RawToHdf5.py +105 -0
- PYME/IO/FileUtils/SPAD.py +54 -0
- PYME/IO/FileUtils/TiffSeqToHdf5.py +87 -0
- PYME/IO/FileUtils/__init__.py +24 -0
- PYME/IO/FileUtils/compHdf.py +39 -0
- PYME/IO/FileUtils/fileID.py +246 -0
- PYME/IO/FileUtils/fnlGen.py +40 -0
- PYME/IO/FileUtils/freeSpace.py +59 -0
- PYME/IO/FileUtils/h5-thumbnailer.py +85 -0
- PYME/IO/FileUtils/h5ExFrames.py +98 -0
- PYME/IO/FileUtils/h5ToTiffSeries.py +50 -0
- PYME/IO/FileUtils/h5r-thumbnailer.py +118 -0
- PYME/IO/FileUtils/h5rFormatDef.py +99 -0
- PYME/IO/FileUtils/h5rToTxt.py +77 -0
- PYME/IO/FileUtils/nameUtils.py +300 -0
- PYME/IO/FileUtils/obf_support.py +538 -0
- PYME/IO/FileUtils/ply.py +147 -0
- PYME/IO/FileUtils/readSpeckle.py +78 -0
- PYME/IO/FileUtils/readTiff.py +64 -0
- PYME/IO/FileUtils/saveTiffStack.py +137 -0
- PYME/IO/FileUtils/setup.py +36 -0
- PYME/IO/FileUtils/sf-thumbnailer.py +76 -0
- PYME/IO/FileUtils/stl.py +44 -0
- PYME/IO/FileUtils/thumbnailDatabase.py +104 -0
- PYME/IO/HTTPSpooler_v2.py +141 -0
- PYME/IO/MetaDataHandler.py +1072 -0
- PYME/IO/PZFFormat.py +375 -0
- PYME/IO/Spooler.py +279 -0
- PYME/IO/__init__.py +12 -0
- PYME/IO/acquisition_backends.py +353 -0
- PYME/IO/buffer_helpers.cp39-win_amd64.dll.a +0 -0
- PYME/IO/buffer_helpers.cp39-win_amd64.pyd +0 -0
- PYME/IO/buffer_helpers.pyx +190 -0
- PYME/IO/buffers.py +291 -0
- PYME/IO/clusterDuplication.py +204 -0
- PYME/IO/clusterExport.py +152 -0
- PYME/IO/clusterGlob.py +108 -0
- PYME/IO/clusterIO.py +1076 -0
- PYME/IO/clusterListing.py +232 -0
- PYME/IO/clusterResults.py +206 -0
- PYME/IO/clusterUpload.py +49 -0
- PYME/IO/cluster_directory.py +419 -0
- PYME/IO/cluster_streaming.py +216 -0
- PYME/IO/compatibility.py +12 -0
- PYME/IO/countdir/__init__.py +5 -0
- PYME/IO/countdir/setup.py +58 -0
- PYME/IO/csv_flavours.py +251 -0
- PYME/IO/dataExporter.py +470 -0
- PYME/IO/dataWrap.py +108 -0
- PYME/IO/dcimg.py +167 -0
- PYME/IO/events.py +161 -0
- PYME/IO/h5File.py +148 -0
- PYME/IO/h5rFile.py +323 -0
- PYME/IO/image.py +1447 -0
- PYME/IO/load_psf.py +26 -0
- PYME/IO/pyme_h5ls.py +58 -0
- PYME/IO/ragged.py +138 -0
- PYME/IO/rgb_image.py +94 -0
- PYME/IO/tabular.py +1338 -0
- PYME/IO/testClusterSpooling.py +199 -0
- PYME/IO/unifiedIO.py +301 -0
- PYME/LMVis/Extras/QPobjectSegment.py +220 -0
- PYME/LMVis/Extras/__init__.py +55 -0
- PYME/LMVis/Extras/animation.py +359 -0
- PYME/LMVis/Extras/annotation.py +78 -0
- PYME/LMVis/Extras/clusterAnalysis.py +460 -0
- PYME/LMVis/Extras/dockedPanel.py +69 -0
- PYME/LMVis/Extras/extra_layers.py +373 -0
- PYME/LMVis/Extras/fiducial.py +230 -0
- PYME/LMVis/Extras/flagZMotionArtifacts.py +60 -0
- PYME/LMVis/Extras/fusionUtils.py +9 -0
- PYME/LMVis/Extras/multiColourAnalysis.py +103 -0
- PYME/LMVis/Extras/multiviewMapping.py +489 -0
- PYME/LMVis/Extras/objectMeasurements.py +246 -0
- PYME/LMVis/Extras/particleTracking.py +272 -0
- PYME/LMVis/Extras/perFrameVariable.py +77 -0
- PYME/LMVis/Extras/photophysics.py +72 -0
- PYME/LMVis/Extras/pointSetGeneration.py +232 -0
- PYME/LMVis/Extras/pointwiseColoc.py +54 -0
- PYME/LMVis/Extras/saved_views.py +125 -0
- PYME/LMVis/Extras/scaleBox.py +115 -0
- PYME/LMVis/Extras/sequentialSpecies.py +125 -0
- PYME/LMVis/Extras/setBGImage.py +74 -0
- PYME/LMVis/Extras/shiftmapGenerator.py +138 -0
- PYME/LMVis/Extras/showShortcuts.py +69 -0
- PYME/LMVis/Extras/snapshot.py +135 -0
- PYME/LMVis/Extras/spherical_harmonics.py +98 -0
- PYME/LMVis/Extras/subsets.py +15 -0
- PYME/LMVis/Extras/surface_fitting.py +52 -0
- PYME/LMVis/Extras/temperaturePlot.py +53 -0
- PYME/LMVis/Extras/vibration.py +112 -0
- PYME/LMVis/VisGUI.py +506 -0
- PYME/LMVis/__init__.py +39 -0
- PYME/LMVis/colourFilterGUI.py +77 -0
- PYME/LMVis/colourPanel.py +491 -0
- PYME/LMVis/displayPane.py +462 -0
- PYME/LMVis/dyeRatios.py +116 -0
- PYME/LMVis/genImageDialog.py +298 -0
- PYME/LMVis/gl_offScreenHandler.py +134 -0
- PYME/LMVis/gl_render.py +1302 -0
- PYME/LMVis/gl_render3D.py +1453 -0
- PYME/LMVis/gl_render3D_shaders.py +1213 -0
- PYME/LMVis/glcanvas_core.py +1157 -0
- PYME/LMVis/imageView.py +752 -0
- PYME/LMVis/imageView2.py +372 -0
- PYME/LMVis/importTextDialog.py +342 -0
- PYME/LMVis/layer_panel.py +231 -0
- PYME/LMVis/layers/AxesOverlayLayer.py +126 -0
- PYME/LMVis/layers/LUTOverlayLayer.py +346 -0
- PYME/LMVis/layers/OverlayLayer.py +46 -0
- PYME/LMVis/layers/ScaleBarOverlayLayer.py +97 -0
- PYME/LMVis/layers/ScaleBoxOverlayLayer.py +181 -0
- PYME/LMVis/layers/SelectionOverlayLayer.py +124 -0
- PYME/LMVis/layers/__init__.py +53 -0
- PYME/LMVis/layers/base.py +319 -0
- PYME/LMVis/layers/image_layer.py +363 -0
- PYME/LMVis/layers/labels.py +186 -0
- PYME/LMVis/layers/layer_defaults.py +97 -0
- PYME/LMVis/layers/mesh.py +378 -0
- PYME/LMVis/layers/octree.py +194 -0
- PYME/LMVis/layers/pointcloud.py +372 -0
- PYME/LMVis/layers/quiver.py +271 -0
- PYME/LMVis/layers/text.py +250 -0
- PYME/LMVis/layers/tracks.py +309 -0
- PYME/LMVis/mv_math.py +78 -0
- PYME/LMVis/objectDarkMeasure.py +120 -0
- PYME/LMVis/pipeline.py +1227 -0
- PYME/LMVis/pipelineView.py +115 -0
- PYME/LMVis/pointSettingsPanel.py +135 -0
- PYME/LMVis/progGraph.py +59 -0
- PYME/LMVis/quadTreeSettings.py +90 -0
- PYME/LMVis/rendGauss.py +158 -0
- PYME/LMVis/renderers.py +576 -0
- PYME/LMVis/sessionpaths.py +136 -0
- PYME/LMVis/setup.py +39 -0
- PYME/LMVis/setup_exe.py +71 -0
- PYME/LMVis/shader_programs/DefaultShaderProgram.py +149 -0
- PYME/LMVis/shader_programs/GLProgram.py +119 -0
- PYME/LMVis/shader_programs/GouraudShaderProgram.py +157 -0
- PYME/LMVis/shader_programs/PointSpriteShaderProgram.py +163 -0
- PYME/LMVis/shader_programs/ShaderProgramFactory.py +54 -0
- PYME/LMVis/shader_programs/TesselShaderProgram.py +47 -0
- PYME/LMVis/shader_programs/WireFrameShaderProgram.py +50 -0
- PYME/LMVis/shader_programs/__init__.py +20 -0
- PYME/LMVis/shader_programs/oit_compositor.py +23 -0
- PYME/LMVis/shader_programs/shader_loader.py +84 -0
- PYME/LMVis/shader_programs/shader_program.py +168 -0
- PYME/LMVis/shader_programs/shaders/bigflatpoints_fs.glsl +16 -0
- PYME/LMVis/shader_programs/shaders/bigpoints_gs.glsl +40 -0
- PYME/LMVis/shader_programs/shaders/bigpointsprites_fs.glsl +20 -0
- PYME/LMVis/shader_programs/shaders/bigspheres_fs.glsl +53 -0
- PYME/LMVis/shader_programs/shaders/compose_fs.glsl +41 -0
- PYME/LMVis/shader_programs/shaders/compose_vs.glsl +25 -0
- PYME/LMVis/shader_programs/shaders/default_fs.glsl +27 -0
- PYME/LMVis/shader_programs/shaders/default_vs.glsl +88 -0
- PYME/LMVis/shader_programs/shaders/flatpoints_fs.glsl +27 -0
- PYME/LMVis/shader_programs/shaders/gouraud_flatpoints_fs.glsl +30 -0
- PYME/LMVis/shader_programs/shaders/gouraud_fs.glsl +26 -0
- PYME/LMVis/shader_programs/shaders/gouraud_oit_fs.glsl +68 -0
- PYME/LMVis/shader_programs/shaders/gouraud_vs.glsl +135 -0
- PYME/LMVis/shader_programs/shaders/image_fs.glsl +60 -0
- PYME/LMVis/shader_programs/shaders/image_vs.glsl +79 -0
- PYME/LMVis/shader_programs/shaders/phong_fs.glsl +43 -0
- PYME/LMVis/shader_programs/shaders/phong_vs.glsl +45 -0
- PYME/LMVis/shader_programs/shaders/pointsprites_fs.glsl +33 -0
- PYME/LMVis/shader_programs/shaders/pointsprites_vs.glsl +77 -0
- PYME/LMVis/shader_programs/shaders/spheres_fs.glsl +102 -0
- PYME/LMVis/shader_programs/shaders/tessel_fs.glsl +23 -0
- PYME/LMVis/shader_programs/shaders/tessel_vs.glsl +37 -0
- PYME/LMVis/shader_programs/shaders/text_fs.glsl +42 -0
- PYME/LMVis/shader_programs/shaders/text_vs.glsl +84 -0
- PYME/LMVis/shader_programs/shaders/widelines_fs.glsl +19 -0
- PYME/LMVis/shader_programs/shaders/widelines_gs.glsl +56 -0
- PYME/LMVis/shader_programs/shaders/widelines_vs.glsl +51 -0
- PYME/LMVis/statusLog.py +57 -0
- PYME/LMVis/triBlobs.py +142 -0
- PYME/LMVis/view_clipping_pane.py +429 -0
- PYME/LMVis/views.py +275 -0
- PYME/LMVis/visCore.py +1005 -0
- PYME/LMVis/visHelpers.py +880 -0
- PYME/LMVis/visHelpersMin.py +230 -0
- PYME/LMVis/workspaceTree.py +238 -0
- PYME/__init__.py +22 -0
- PYME/cluster/HTTPDataServer.py +1063 -0
- PYME/cluster/HTTPRulePusher.py +382 -0
- PYME/cluster/HTTPTaskPusher.py +377 -0
- PYME/cluster/PYMERuleNodeServer.py +192 -0
- PYME/cluster/PYMERuleServer.py +109 -0
- PYME/cluster/__init__.py +0 -0
- PYME/cluster/clusterUI/accounts/__init__.py +0 -0
- PYME/cluster/clusterUI/accounts/admin.py +85 -0
- PYME/cluster/clusterUI/accounts/forms.py +8 -0
- PYME/cluster/clusterUI/accounts/migrations/0001_initial.py +31 -0
- PYME/cluster/clusterUI/accounts/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/accounts/models.py +44 -0
- PYME/cluster/clusterUI/accounts/templates/accounts/user_form.html +13 -0
- PYME/cluster/clusterUI/accounts/templates/registration/initial_complete.html +6 -0
- PYME/cluster/clusterUI/accounts/templates/registration/initial_confirm.html +13 -0
- PYME/cluster/clusterUI/accounts/templates/registration/initial_done.html +7 -0
- PYME/cluster/clusterUI/accounts/templates/registration/verification.html +2 -0
- PYME/cluster/clusterUI/accounts/templates/registration/verification_subject.txt +1 -0
- PYME/cluster/clusterUI/accounts/urls.py +19 -0
- PYME/cluster/clusterUI/accounts/views.py +36 -0
- PYME/cluster/clusterUI/clusterUI/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterUI/settings.py +147 -0
- PYME/cluster/clusterUI/clusterUI/urls.py +31 -0
- PYME/cluster/clusterUI/clusterUI/wsgi.py +16 -0
- PYME/cluster/clusterUI/clusterbrowser/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterbrowser/admin.py +3 -0
- PYME/cluster/clusterUI/clusterbrowser/apps.py +7 -0
- PYME/cluster/clusterUI/clusterbrowser/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterbrowser/models.py +5 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/base.html +129 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/dirlisting.html +231 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/form_new_folder.html +18 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/form_upload_file.html +17 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/lightlisting.html +25 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/registration/login.html +38 -0
- PYME/cluster/clusterUI/clusterbrowser/urls.py +10 -0
- PYME/cluster/clusterUI/clusterbrowser/views.py +148 -0
- PYME/cluster/clusterUI/clusterstatus/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterstatus/admin.py +3 -0
- PYME/cluster/clusterUI/clusterstatus/apps.py +7 -0
- PYME/cluster/clusterUI/clusterstatus/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterstatus/models.py +5 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/load_content.html +29 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/queue_info.html +28 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/queue_info_content.html +50 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/status_dash.html +29 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/status_dash_content.html +90 -0
- PYME/cluster/clusterUI/clusterstatus/urls.py +9 -0
- PYME/cluster/clusterUI/clusterstatus/views.py +69 -0
- PYME/cluster/clusterUI/clusterui_tornado.py +117 -0
- PYME/cluster/clusterUI/deploy.py +62 -0
- PYME/cluster/clusterUI/localization/__init__.py +0 -0
- PYME/cluster/clusterUI/localization/admin.py +3 -0
- PYME/cluster/clusterUI/localization/apps.py +7 -0
- PYME/cluster/clusterUI/localization/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/localization/models.py +5 -0
- PYME/cluster/clusterUI/localization/templates/localization/settings_form.html +67 -0
- PYME/cluster/clusterUI/localization/urls.py +10 -0
- PYME/cluster/clusterUI/localization/views.py +170 -0
- PYME/cluster/clusterUI/manage.py +17 -0
- PYME/cluster/clusterUI/recipes/__init__.py +0 -0
- PYME/cluster/clusterUI/recipes/admin.py +3 -0
- PYME/cluster/clusterUI/recipes/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/recipes/models.py +3 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/extra_inputs.html +35 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/form_recipe.html +82 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/input_list.html +7 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editor.html +28 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editor_common.html +46 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editrun.html +93 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_standalone.html +100 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_template.html +109 -0
- PYME/cluster/clusterUI/recipes/urls.py +17 -0
- PYME/cluster/clusterUI/recipes/views.py +109 -0
- PYME/cluster/cluster_of_one.py +200 -0
- PYME/cluster/dataserver_wsgi.py +615 -0
- PYME/cluster/distribution.py +71 -0
- PYME/cluster/rulenodeserver.py +487 -0
- PYME/cluster/rules.py +979 -0
- PYME/cluster/ruleserver.py +1106 -0
- PYME/cluster/status.py +101 -0
- PYME/cluster/taskWorkerHTTP.py +522 -0
- PYME/cluster/webdav.py +1102 -0
- PYME/config.py +659 -0
- PYME/contrib/TextCtrlAutoComplete.py +582 -0
- PYME/contrib/__init__.py +7 -0
- PYME/contrib/aniso/__init__.py +2 -0
- PYME/contrib/aniso/aniso.py +268 -0
- PYME/contrib/auiFloatBook.py +94 -0
- PYME/contrib/congrid.py +127 -0
- PYME/contrib/dispatch/__init__.py +19 -0
- PYME/contrib/dispatch/dispatcher.py +289 -0
- PYME/contrib/gohlke/__init__.py +1 -0
- PYME/contrib/gohlke/_tifffile.cp39-win_amd64.dll.a +0 -0
- PYME/contrib/gohlke/_tifffile.cp39-win_amd64.pyd +0 -0
- PYME/contrib/gohlke/czifile.py +1289 -0
- PYME/contrib/gohlke/fcsfiles.py +514 -0
- PYME/contrib/gohlke/setup.py +54 -0
- PYME/contrib/gohlke/tifffile.py +3095 -0
- PYME/contrib/listctrlMixins.py +896 -0
- PYME/contrib/lzw.py +838 -0
- PYME/contrib/pad/__init__.py +13 -0
- PYME/contrib/pad/info_pad.py +18 -0
- PYME/contrib/pad/pad.py +670 -0
- PYME/contrib/setup.py +38 -0
- PYME/contrib/wxPlotPanel.py +137 -0
- PYME/experimental/SimReconstruction.py +49 -0
- PYME/experimental/__init__.pxd +0 -0
- PYME/experimental/__init__.py +4 -0
- PYME/experimental/_octree.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/_octree.cp39-win_amd64.pyd +0 -0
- PYME/experimental/_octree.pyx +477 -0
- PYME/experimental/_treap.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/_treap.cp39-win_amd64.pyd +0 -0
- PYME/experimental/_treap.pyx +267 -0
- PYME/experimental/_triangle_mesh.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/_triangle_mesh.cp39-win_amd64.pyd +0 -0
- PYME/experimental/_triangle_mesh.pxd +149 -0
- PYME/experimental/_triangle_mesh.pyx +2787 -0
- PYME/experimental/aqavg.py +40 -0
- PYME/experimental/dcimgFileChucker.py +375 -0
- PYME/experimental/dcimgSpoolShim.py +174 -0
- PYME/experimental/dcimg_chuck_test.py +78 -0
- PYME/experimental/dual_marching_cubes.py +801 -0
- PYME/experimental/dual_marching_cubes_v2.py +645 -0
- PYME/experimental/expectationMaximisation.py +298 -0
- PYME/experimental/func_octree.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/func_octree.cp39-win_amd64.pyd +0 -0
- PYME/experimental/func_octree.pyx +381 -0
- PYME/experimental/fusionRadial.py +520 -0
- PYME/experimental/fusionUtils.py +522 -0
- PYME/experimental/isosurface.py +147 -0
- PYME/experimental/labview_spooling_hacks.py +48 -0
- PYME/experimental/marching_cubes.py +811 -0
- PYME/experimental/marching_tetrahedra.py +343 -0
- PYME/experimental/modified_marching_cubes.py +1245 -0
- PYME/experimental/music.py +25 -0
- PYME/experimental/octree.py +188 -0
- PYME/experimental/pSpaceMap.py +34 -0
- PYME/experimental/pointFitConfoc.py +112 -0
- PYME/experimental/scanner_control.py +107 -0
- PYME/experimental/setup.py +109 -0
- PYME/experimental/spark.py +31 -0
- PYME/experimental/tcHist.py +71 -0
- PYME/experimental/treap.py +262 -0
- PYME/experimental/triangle_mesh.py +2287 -0
- PYME/experimental/triangle_mesh_utils.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/triangle_mesh_utils.cp39-win_amd64.pyd +0 -0
- PYME/experimental/triangle_utils.py +87 -0
- PYME/experimental/triangular_mesh.py +2255 -0
- PYME/experimental/zMotionArtifactUtils.py +55 -0
- PYME/localization/FitFactories/AstigGaussFitFR.py +175 -0
- PYME/localization/FitFactories/AstigGaussGPUFitFR.py +326 -0
- PYME/localization/FitFactories/BeadConvolvedAstigGaussFit.py +206 -0
- PYME/localization/FitFactories/ChecksumFR.py +82 -0
- PYME/localization/FitFactories/ChecksumGPUFR.py +213 -0
- PYME/localization/FitFactories/ChecksumMultifitSR.py +86 -0
- PYME/localization/FitFactories/ConfocCOIR.py +93 -0
- PYME/localization/FitFactories/Dumbell3DFitR.py +193 -0
- PYME/localization/FitFactories/DumbellFitR.py +163 -0
- PYME/localization/FitFactories/FFBase.py +403 -0
- PYME/localization/FitFactories/Gauss3DFitR.py +213 -0
- PYME/localization/FitFactories/GaussFitConstrR.py +177 -0
- PYME/localization/FitFactories/GaussMultifitLinesR.py +351 -0
- PYME/localization/FitFactories/GaussMultifitR.py +326 -0
- PYME/localization/FitFactories/GaussMultifitSR.py +373 -0
- PYME/localization/FitFactories/InterpFitR.py +236 -0
- PYME/localization/FitFactories/InterpFitWFR.py +111 -0
- PYME/localization/FitFactories/Interpolators/CSInterpolator.py +148 -0
- PYME/localization/FitFactories/Interpolators/CubeSInterpolatorP.py +121 -0
- PYME/localization/FitFactories/Interpolators/CubicSplineInterpolator.py +69 -0
- PYME/localization/FitFactories/Interpolators/LinearInterpolator.py +135 -0
- PYME/localization/FitFactories/Interpolators/LinearPInterpolatorP.py +95 -0
- PYME/localization/FitFactories/Interpolators/__init__.py +33 -0
- PYME/localization/FitFactories/Interpolators/baseInterpolator.py +202 -0
- PYME/localization/FitFactories/LatFitCOIR.py +82 -0
- PYME/localization/FitFactories/LatGaussFitFR.py +220 -0
- PYME/localization/FitFactories/LatObjFindFR.py +85 -0
- PYME/localization/FitFactories/LatPSFFitR.py +142 -0
- PYME/localization/FitFactories/MultiviewFitInterpNR.py +400 -0
- PYME/localization/FitFactories/PRInterpFitQR.py +192 -0
- PYME/localization/FitFactories/PRInterpFitR.py +223 -0
- PYME/localization/FitFactories/ROIExtractNR.py +93 -0
- PYME/localization/FitFactories/SpecGaussFitFR.py +174 -0
- PYME/localization/FitFactories/SplitterFitCOIR.py +142 -0
- PYME/localization/FitFactories/SplitterFitFNR.py +312 -0
- PYME/localization/FitFactories/SplitterFitFusionR.py +318 -0
- PYME/localization/FitFactories/SplitterFitInterpBNR.py +357 -0
- PYME/localization/FitFactories/SplitterFitInterpNR.py +343 -0
- PYME/localization/FitFactories/SplitterFitScavNR.py +352 -0
- PYME/localization/FitFactories/SplitterMultifitSR.py +410 -0
- PYME/localization/FitFactories/SplitterObjFindR.py +194 -0
- PYME/localization/FitFactories/SplitterROIExtractNR.py +91 -0
- PYME/localization/FitFactories/SplitterShiftEstFR.py +230 -0
- PYME/localization/FitFactories/__init__.py +103 -0
- PYME/localization/FitFactories/fitCommon.py +195 -0
- PYME/localization/FitFactories/zEstimators/__init__.py +29 -0
- PYME/localization/FitFactories/zEstimators/astigEstimator.py +173 -0
- PYME/localization/FitFactories/zEstimators/biplaneEstimator.py +209 -0
- PYME/localization/FitFactories/zEstimators/genericDualEstimator.py +232 -0
- PYME/localization/FitFactories/zEstimators/genericEstimator.py +224 -0
- PYME/localization/FitFactories/zEstimators/priEstimator.py +255 -0
- PYME/localization/MetaDataEdit.py +543 -0
- PYME/localization/Test/30_9_series_A_1.sf +0 -0
- PYME/localization/Test/PRI.md +45 -0
- PYME/localization/Test/PRI_qr.md +52 -0
- PYME/localization/Test/PRI_r.md +52 -0
- PYME/localization/Test/__init__.py +22 -0
- PYME/localization/Test/astig.md +50 -0
- PYME/localization/Test/astigCOI.md +50 -0
- PYME/localization/Test/astig_gauss.md +52 -0
- PYME/localization/Test/astig_pe.md +50 -0
- PYME/localization/Test/astig_splitter.md +66 -0
- PYME/localization/Test/astig_splitterCOI.md +67 -0
- PYME/localization/Test/astig_splitterQ.md +66 -0
- PYME/localization/Test/astig_theory.md +50 -0
- PYME/localization/Test/astig_theory.psf +0 -0
- PYME/localization/Test/astig_theory.tif +0 -0
- PYME/localization/Test/beads1.psf +0 -0
- PYME/localization/Test/beads1.tif +0 -0
- PYME/localization/Test/biplane_splitter.md +75 -0
- PYME/localization/Test/biplane_splitter2.md +103 -0
- PYME/localization/Test/biplane_splitter3.md +115 -0
- PYME/localization/Test/defoc.md +48 -0
- PYME/localization/Test/dumbell_3d.md +52 -0
- PYME/localization/Test/fitTestJig.py +172 -0
- PYME/localization/Test/fitTestJigSCMOS.py +487 -0
- PYME/localization/Test/fitTestJigWC.py +225 -0
- PYME/localization/Test/gauss.md +50 -0
- PYME/localization/Test/gaussCOI.md +50 -0
- PYME/localization/Test/pri_pe.md +50 -0
- PYME/localization/Test/pri_theory.md +51 -0
- PYME/localization/Test/pri_theory.psf +0 -0
- PYME/localization/Test/pri_theory.tif +0 -0
- PYME/localization/Test/psf_astig.psf +0 -0
- PYME/localization/Test/psf_astig.tif +0 -0
- PYME/localization/Test/psf_astig_bg_d.psf +0 -0
- PYME/localization/Test/psf_astig_bg_d.tif +0 -0
- PYME/localization/Test/psf_astig_pe.psf +0 -0
- PYME/localization/Test/psf_astig_pe.tif +0 -0
- PYME/localization/Test/psf_decon.psf +0 -0
- PYME/localization/Test/psf_decon.tif +0 -0
- PYME/localization/Test/psf_decon_pe.psf +0 -0
- PYME/localization/Test/psf_decon_pe.tif +0 -0
- PYME/localization/Test/psf_guess.psf +0 -0
- PYME/localization/Test/splitter.md +63 -0
- PYME/localization/Test/splitter_scav.md +63 -0
- PYME/localization/Test/test.psf +0 -0
- PYME/localization/Test/test.tif +0 -0
- PYME/localization/Test/test_decon.psf +0 -0
- PYME/localization/Test/test_decon.tif +0 -0
- PYME/localization/Test/test_pe.psf +0 -0
- PYME/localization/Test/test_pe.tif +0 -0
- PYME/localization/Test/wf_theory.psf +0 -0
- PYME/localization/Test/wf_theory2.psf +0 -0
- PYME/localization/__init__.py +17 -0
- PYME/localization/autopsf/__init__.py +1 -0
- PYME/localization/autopsf/autopsf.py +486 -0
- PYME/localization/autopsf/roifit.py +310 -0
- PYME/localization/cInterp/__init__.py +24 -0
- PYME/localization/cInterp/cInterp.cp39-win_amd64.dll.a +0 -0
- PYME/localization/cInterp/cInterp.cp39-win_amd64.pyd +0 -0
- PYME/localization/cInterp/setup.py +54 -0
- PYME/localization/cModels/__init__.py +24 -0
- PYME/localization/cModels/gauss_app.cp39-win_amd64.dll.a +0 -0
- PYME/localization/cModels/gauss_app.cp39-win_amd64.pyd +0 -0
- PYME/localization/ofind.py +444 -0
- PYME/localization/ofind3d.py +306 -0
- PYME/localization/ofind_nofilt.py +128 -0
- PYME/localization/ofind_pri.py +478 -0
- PYME/localization/ofind_split.py +399 -0
- PYME/localization/ofind_xcorr.py +351 -0
- PYME/localization/ofind_xcorr_fw.py +441 -0
- PYME/localization/remFitBuf.py +657 -0
- PYME/localization/setup.py +56 -0
- PYME/localization/splitting.py +240 -0
- PYME/localization/twist.py +60 -0
- PYME/misc/TiSettings.py +36 -0
- PYME/misc/TiffImagePlugin.py +838 -0
- PYME/misc/VolProj.py +144 -0
- PYME/misc/__init__.py +25 -0
- PYME/misc/aligned_array.py +10 -0
- PYME/misc/aniso.py +29 -0
- PYME/misc/big_sur_fix.py +20 -0
- PYME/misc/check_for_updates.py +139 -0
- PYME/misc/colormaps.py +199 -0
- PYME/misc/colorsys.py +201 -0
- PYME/misc/computerName.py +33 -0
- PYME/misc/coverslipGeometries.py +60 -0
- PYME/misc/cython_numpy_monkey.py +40 -0
- PYME/misc/depGraph.py +406 -0
- PYME/misc/dirSize.py +31 -0
- PYME/misc/diskCleanup.py +64 -0
- PYME/misc/djangoRecarray.py +57 -0
- PYME/misc/django_widgets.py +27 -0
- PYME/misc/editgrid.py +101 -0
- PYME/misc/eventSpy.py +122 -0
- PYME/misc/exceptions.py +30 -0
- PYME/misc/facsPlot.py +89 -0
- PYME/misc/fbpIcons.py +90 -0
- PYME/misc/fftw_compat.py +28 -0
- PYME/misc/findCycles.py +91 -0
- PYME/misc/fortran_interrupt_defeat.py +43 -0
- PYME/misc/glassModel.py +64 -0
- PYME/misc/hash32.py +41 -0
- PYME/misc/hillcurve.py +88 -0
- PYME/misc/hybrid_ns.py +84 -0
- PYME/misc/kdFit.py +72 -0
- PYME/misc/locate.py +10 -0
- PYME/misc/memUsage.py +65 -0
- PYME/misc/memmap.py +52 -0
- PYME/misc/mock_ctypes.py +28 -0
- PYME/misc/mock_traits.py +59 -0
- PYME/misc/mock_traitsui.py +29 -0
- PYME/misc/pyme_zeroconf.py +287 -0
- PYME/misc/pyro_tracebacks.py +32 -0
- PYME/misc/read_agf.py +605 -0
- PYME/misc/sffake.py +16 -0
- PYME/misc/snells.py +71 -0
- PYME/misc/sqlite_ns.py +132 -0
- PYME/misc/sqlitendarray.py +56 -0
- PYME/misc/taskDef.py +44 -0
- PYME/misc/tempDB.py +56 -0
- PYME/misc/wxThread.py +33 -0
- PYME/misc/zemax.py +259 -0
- PYME/misc/zernike.py +151 -0
- PYME/pyme_warnings.py +70 -0
- PYME/recipes/Recipes/STEDDeconvolution.yaml +14 -0
- PYME/recipes/Recipes/STEDMinistacks.yaml +15 -0
- PYME/recipes/Recipes/STED_COP3.yaml +25 -0
- PYME/recipes/Recipes/blobMeas.yaml +19 -0
- PYME/recipes/Recipes/blobMeas2.yaml +37 -0
- PYME/recipes/Recipes/blobMeasSR.yaml +66 -0
- PYME/recipes/Recipes/coloc.yaml +43 -0
- PYME/recipes/Recipes/coloc_roi_masked.yaml +46 -0
- PYME/recipes/Recipes/multiblob.yaml +38 -0
- PYME/recipes/Recipes/pre_particleTracking.yaml +30 -0
- PYME/recipes/Recipes/segmentAndMeasureLoci.yaml +41 -0
- PYME/recipes/__init__.py +6 -0
- PYME/recipes/acquisition.py +158 -0
- PYME/recipes/bakeshop.py +32 -0
- PYME/recipes/base.py +1393 -0
- PYME/recipes/batchProcess.py +147 -0
- PYME/recipes/filters.py +394 -0
- PYME/recipes/fudges.py +41 -0
- PYME/recipes/graphing.py +108 -0
- PYME/recipes/html_recipe_editor.py +90 -0
- PYME/recipes/localisations.py +1386 -0
- PYME/recipes/machine_learning.py +286 -0
- PYME/recipes/measurement.py +1062 -0
- PYME/recipes/modules.py +50 -0
- PYME/recipes/multiview.py +435 -0
- PYME/recipes/output.py +667 -0
- PYME/recipes/pointcloud.py +510 -0
- PYME/recipes/processing.py +2954 -0
- PYME/recipes/pyramid.py +206 -0
- PYME/recipes/recipe.py +965 -0
- PYME/recipes/recipeGui.py +1029 -0
- PYME/recipes/recipeLayout.py +499 -0
- PYME/recipes/runRecipe.py +140 -0
- PYME/recipes/setup.py +37 -0
- PYME/recipes/simulation.py +91 -0
- PYME/recipes/skfilters.py +143 -0
- PYME/recipes/surface_fitting.py +776 -0
- PYME/recipes/tablefilters.py +275 -0
- PYME/recipes/tracking.py +343 -0
- PYME/recipes/traits.py +157 -0
- PYME/recipes/vertical_recipe_display.py +373 -0
- PYME/resources/__init__.py +23 -0
- PYME/resources/config_template/distributor.yaml +14 -0
- PYME/resources/config_template/nodeserver.yaml +15 -0
- PYME/resources/icons/LUT.png +0 -0
- PYME/resources/icons/YSM_Shield.png +0 -0
- PYME/resources/icons/YSM_logo.png +0 -0
- PYME/resources/icons/arrow.png +0 -0
- PYME/resources/icons/crosshairs.png +0 -0
- PYME/resources/icons/line_select.png +0 -0
- PYME/resources/icons/logo_fmhs.png +0 -0
- PYME/resources/icons/media-playback-pause.png +0 -0
- PYME/resources/icons/media-playback-start.png +0 -0
- PYME/resources/icons/media-skip-backward.png +0 -0
- PYME/resources/icons/media-skip-forward.png +0 -0
- PYME/resources/icons/mesh.png +0 -0
- PYME/resources/icons/mesh.svg +28 -0
- PYME/resources/icons/pmacquire.icns +0 -0
- PYME/resources/icons/pmacquire.ico +0 -0
- PYME/resources/icons/pmanal.icns +0 -0
- PYME/resources/icons/pmanal.ico +0 -0
- PYME/resources/icons/pmvis.icns +0 -0
- PYME/resources/icons/pmvis.ico +0 -0
- PYME/resources/icons/points.png +0 -0
- PYME/resources/icons/points.svg +16 -0
- PYME/resources/icons/pymeLogo.png +0 -0
- PYME/resources/icons/rect_select.png +0 -0
- PYME/resources/icons/squiggle_select.png +0 -0
- PYME/resources/icons/text3800.icns +0 -0
- PYME/resources/icons/text3800.ico +0 -0
- PYME/resources/icons/text3800.png +0 -0
- PYME/resources/icons/text3800.tif +0 -0
- PYME/resources/icons/text5377.icns +0 -0
- PYME/resources/icons/text5377.ico +0 -0
- PYME/resources/icons/text5377.png +0 -0
- PYME/resources/icons/tracks.png +0 -0
- PYME/resources/icons/tracks.svg +19 -0
- PYME/resources/icons/view-front.png +0 -0
- PYME/resources/icons/view-home.png +0 -0
- PYME/resources/icons/view-right.png +0 -0
- PYME/resources/icons/view-top.png +0 -0
- PYME/resources/test_datasets/README.md +8 -0
- PYME/resources/test_datasets/t_im.tif +0 -0
- PYME/resources/test_datasets/test_csv.csv +4282 -0
- PYME/resources/test_datasets/test_hdf.hdf +0 -0
- PYME/resources/web/rule_inline.html +21 -0
- PYME/resources/web/ruleserver.html +75 -0
- PYME/resources/web/static/bootstrap.min.js +7 -0
- PYME/resources/web/static/cluster.css +137 -0
- PYME/resources/web/static/css/bootstrap-theme.css +587 -0
- PYME/resources/web/static/css/bootstrap-theme.min.css +6 -0
- PYME/resources/web/static/css/bootstrap.css +6757 -0
- PYME/resources/web/static/css/bootstrap.min.css +6 -0
- PYME/resources/web/static/css/flat_design_colors_full.css +306 -0
- PYME/resources/web/static/css/recipe_editor.css +106 -0
- PYME/resources/web/static/dashboard.css +106 -0
- PYME/resources/web/static/fileselector.js +77 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.eot +0 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.svg +288 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.ttf +0 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.woff +0 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.woff2 +0 -0
- PYME/resources/web/static/images/osd_flat/LICENSE.txt +116 -0
- PYME/resources/web/static/images/osd_flat/README.md +9 -0
- PYME/resources/web/static/images/osd_flat/fullpage_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/fullpage_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/fullpage_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/fullpage_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_rest.png +0 -0
- PYME/resources/web/static/jigna-vue-bare.js +1395 -0
- PYME/resources/web/static/jquery.min.js +2 -0
- PYME/resources/web/static/jstree.min.js +6 -0
- PYME/resources/web/static/openSeadragonGL.js +102 -0
- PYME/resources/web/static/openseadragon-svg-overlay.js +103 -0
- PYME/resources/web/static/openseadragon-viewerinputhook.min.js +6 -0
- PYME/resources/web/static/openseadragon.min.js +9 -0
- PYME/resources/web/static/recipe_editor.js +119 -0
- PYME/resources/web/static/shaders/fragment/lut.glsl +20 -0
- PYME/resources/web/static/shaders/fragment/none.glsl +17 -0
- PYME/resources/web/static/shaders/fragment/outline.glsl +43 -0
- PYME/resources/web/static/shaders/fragment/rect.glsl +7 -0
- PYME/resources/web/static/shaders/fragment/sobel3.glsl +71 -0
- PYME/resources/web/static/shaders/fragment/white.glsl +4 -0
- PYME/resources/web/static/shaders/vertex/rect.glsl +22 -0
- PYME/resources/web/static/shaders/vertex/square.glsl +9 -0
- PYME/resources/web/static/utils.js +3 -0
- PYME/resources/web/static/viaWebGL.js +217 -0
- PYME/setup.py +109 -0
- PYME/setup_exe.py +57 -0
- PYME/simulation/__init__.py +0 -0
- PYME/simulation/locify.py +319 -0
- PYME/simulation/pointsets.py +279 -0
- PYME/simulation/wormlike.py +99 -0
- PYME/simulation/wormlike2.py +198 -0
- PYME/simulation/wormlike3.py +197 -0
- PYME/simulation/wormlike_curled.py +104 -0
- PYME/tileviewer/__init__.py +0 -0
- PYME/tileviewer/templates/roi_list.html +12 -0
- PYME/tileviewer/templates/tileviewer.html +247 -0
- PYME/tileviewer/tileviewer.py +207 -0
- PYME/ui/AUIFrame.py +279 -0
- PYME/ui/MetadataTree.py +469 -0
- PYME/ui/__init__.py +4 -0
- PYME/ui/about_dlg.py +29 -0
- PYME/ui/autoFoldPanel.py +643 -0
- PYME/ui/cascading_layout.py +45 -0
- PYME/ui/crop_dialog.py +145 -0
- PYME/ui/custom_traits_editors.py +508 -0
- PYME/ui/editFilterDialog.py +80 -0
- PYME/ui/editList.py +40 -0
- PYME/ui/fastGraph.py +240 -0
- PYME/ui/filterPane.py +348 -0
- PYME/ui/histLimits.py +543 -0
- PYME/ui/layerFoldPanel.py +232 -0
- PYME/ui/manualFoldPanel.py +870 -0
- PYME/ui/mytimer.py +116 -0
- PYME/ui/patch_traitsui.py +151 -0
- PYME/ui/progress.py +160 -0
- PYME/ui/recArrayView.py +145 -0
- PYME/ui/selection.py +71 -0
- PYME/ui/shell.py +37 -0
- PYME/ui/traitsui_constants.py +91 -0
- PYME/ui/wx_compat.py +43 -0
- PYME/update_version.py +159 -0
- PYME/util/__init__.py +3 -0
- PYME/util/authenticate.py +164 -0
- PYME/util/execfile.py +21 -0
- PYME/util/fProfile/__init__.py +1 -0
- PYME/util/fProfile/convertProfile.py +117 -0
- PYME/util/fProfile/fProfile.py +162 -0
- PYME/util/fProfile/html/404.html +60 -0
- PYME/util/fProfile/html/css/main.css +258 -0
- PYME/util/fProfile/html/css/normalize.css +427 -0
- PYME/util/fProfile/html/css/normalize.min.css +1 -0
- PYME/util/fProfile/html/index.html +64 -0
- PYME/util/fProfile/html/js/main.js +492 -0
- PYME/util/fProfile/html/js/plugins.js +24 -0
- PYME/util/fProfile/html/js/vendor/crossfilter.min.js +1 -0
- PYME/util/fProfile/html/js/vendor/jquery-1.11.2.min.js +4 -0
- PYME/util/fProfile/html/js/vendor/modernizr-2.8.3.min.js +4 -0
- PYME/util/fProfile/html/js/vendor/tinycolor-min.js +4 -0
- PYME/util/fProfile/viewProfile.py +30 -0
- PYME/util/install_dependencies.py +95 -0
- PYME/util/log_verbosity.py +11 -0
- PYME/util/mProfile/__init__.py +1 -0
- PYME/util/mProfile/colorize_db_t.py +297 -0
- PYME/util/mProfile/mProfile.py +164 -0
- PYME/util/mProfile/p.py +101 -0
- PYME/util/mProfile/tProfile.py +165 -0
- PYME/util/pymelauncher.py +47 -0
- PYME/util/shmarray/__init__.py +0 -0
- PYME/util/shmarray/shmTest.py +74 -0
- PYME/util/shmarray/shmarray.py +165 -0
- PYME/util/webframework.py +365 -0
- PYME/version.py +65 -0
- python_microscopy-25.6.5.dist-info/METADATA +68 -0
- python_microscopy-25.6.5.dist-info/RECORD +1277 -0
- python_microscopy-25.6.5.dist-info/WHEEL +4 -0
PYME/IO/tabular.py
ADDED
|
@@ -0,0 +1,1338 @@
|
|
|
1
|
+
#!/usr/bin/python
|
|
2
|
+
|
|
3
|
+
##################
|
|
4
|
+
# inpFilt.py
|
|
5
|
+
#
|
|
6
|
+
# Copyright David Baddeley, 2009
|
|
7
|
+
# d.baddeley@auckland.ac.nz
|
|
8
|
+
#
|
|
9
|
+
# This program is free software: you can redistribute it and/or modify
|
|
10
|
+
# it under the terms of the GNU General Public License as published by
|
|
11
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
12
|
+
# (at your option) any later version.
|
|
13
|
+
#
|
|
14
|
+
# This program is distributed in the hope that it will be useful,
|
|
15
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
16
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
17
|
+
# GNU General Public License for more details.
|
|
18
|
+
#
|
|
19
|
+
# You should have received a copy of the GNU General Public License
|
|
20
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
21
|
+
#
|
|
22
|
+
##################
|
|
23
|
+
|
|
24
|
+
""" import filters for localisation microscopy results. These masquerade as
|
|
25
|
+
dictionaries which can be looked up to yield the desired data. The visualisation
|
|
26
|
+
routines expect at least 'x' and 'y' to be defined as keys, and may also
|
|
27
|
+
understand additional values, e.g. 'error_x'
|
|
28
|
+
"""
|
|
29
|
+
import types
|
|
30
|
+
import six
|
|
31
|
+
import warnings
|
|
32
|
+
import numpy as np
|
|
33
|
+
|
|
34
|
+
from numpy import * #to allow the use of sin cos etc in mappings
|
|
35
|
+
from PYME.Analysis.piecewise import * #allow piecewise linear mappings
|
|
36
|
+
|
|
37
|
+
import tables
|
|
38
|
+
import logging
|
|
39
|
+
|
|
40
|
+
logger = logging.getLogger(__name__)
|
|
41
|
+
|
|
42
|
+
#helper function for renaming classes
|
|
43
|
+
|
|
44
|
+
def deprecated_name(name):
|
|
45
|
+
def _dec(cls):
|
|
46
|
+
|
|
47
|
+
def _dep_name(*args, **kwargs):
|
|
48
|
+
warnings.warn(VisibleDeprecationWarning('%s is deprecated, use %s instead' % (name, cls.__name__)))
|
|
49
|
+
return cls(*args, **kwargs)
|
|
50
|
+
|
|
51
|
+
globals()[name] = _dep_name
|
|
52
|
+
|
|
53
|
+
return cls
|
|
54
|
+
|
|
55
|
+
return _dec
|
|
56
|
+
|
|
57
|
+
class TabularBase(object):
|
|
58
|
+
_image_bounds = False
|
|
59
|
+
|
|
60
|
+
def toDataFrame(self, keys=None):
|
|
61
|
+
warnings.warn('toDataFrame is deprecated, use to_pandas instead', DeprecationWarning)
|
|
62
|
+
self.to_pandas(keys)
|
|
63
|
+
|
|
64
|
+
def to_pandas(self, keys=None):
|
|
65
|
+
"""
|
|
66
|
+
Convert tabular data to a pandas DataFrame
|
|
67
|
+
"""
|
|
68
|
+
import pandas as pd
|
|
69
|
+
if keys is None:
|
|
70
|
+
keys = self.keys()
|
|
71
|
+
|
|
72
|
+
d = {}
|
|
73
|
+
|
|
74
|
+
for k in keys:
|
|
75
|
+
v = self.__getitem__(k)
|
|
76
|
+
if np.ndim(v) == 1:
|
|
77
|
+
d[k] = v
|
|
78
|
+
else:
|
|
79
|
+
v1 = np.empty(len(v), 'O')
|
|
80
|
+
for i in range(len(v)):
|
|
81
|
+
v1[i] = v[i]
|
|
82
|
+
d[k] = v1
|
|
83
|
+
|
|
84
|
+
return pd.DataFrame(d)
|
|
85
|
+
|
|
86
|
+
def _getKeySlice(self, keys):
|
|
87
|
+
if isinstance(keys, tuple) and len(keys) > 1:
|
|
88
|
+
key = keys[0]
|
|
89
|
+
sl = keys[1]
|
|
90
|
+
else:
|
|
91
|
+
key = keys
|
|
92
|
+
sl = slice(None)
|
|
93
|
+
|
|
94
|
+
#print key, sl
|
|
95
|
+
|
|
96
|
+
return key, sl
|
|
97
|
+
|
|
98
|
+
def to_recarray(self, keys=None):
|
|
99
|
+
"""
|
|
100
|
+
Converts tabular data types into record arrays, which is useful for e.g. saving as an hdf table. In order to be
|
|
101
|
+
converted, the tabular data source must be able to be flattened.
|
|
102
|
+
|
|
103
|
+
Parameters
|
|
104
|
+
----------
|
|
105
|
+
keys : list of fields to be copied into output. Defaults to all existing keys.
|
|
106
|
+
|
|
107
|
+
Returns
|
|
108
|
+
-------
|
|
109
|
+
numpy recarray version of self
|
|
110
|
+
|
|
111
|
+
"""
|
|
112
|
+
from numpy.core import records
|
|
113
|
+
if keys is None:
|
|
114
|
+
keys = list(self.keys())
|
|
115
|
+
|
|
116
|
+
columns = [self.__getitem__(k) for k in keys]
|
|
117
|
+
|
|
118
|
+
filtered_cols = [i for i, v in enumerate(columns) if not v.dtype == 'O']
|
|
119
|
+
|
|
120
|
+
cols = [columns[i] for i in filtered_cols]
|
|
121
|
+
keys_ = [keys[i] for i in filtered_cols]
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
dt = [(k, v.dtype, v.shape[1:]) for k, v in zip(keys_, cols)]
|
|
125
|
+
|
|
126
|
+
#print(dt)
|
|
127
|
+
return records.fromarrays(cols, names=keys_, dtype=dt)
|
|
128
|
+
|
|
129
|
+
def to_hdf(self, filename, tablename='Data', keys=None, metadata=None,
|
|
130
|
+
keep_alive_timeout=0):
|
|
131
|
+
"""
|
|
132
|
+
Writes data to a table in an HDF5 file
|
|
133
|
+
|
|
134
|
+
Parameters
|
|
135
|
+
----------
|
|
136
|
+
|
|
137
|
+
filename: string
|
|
138
|
+
the name of the file to save to
|
|
139
|
+
tablename: string [optional]
|
|
140
|
+
the name of the table within the file to save to. Defaults to "Data"
|
|
141
|
+
keys: list [optional]
|
|
142
|
+
a list of column names to save (if keys == None, all columns are saved)
|
|
143
|
+
metadata: a MetaDataHandler instance [optional]
|
|
144
|
+
associated metadata to write to the file
|
|
145
|
+
keep_alive_timeout: float
|
|
146
|
+
a timeout in seconds. If non-zero, the file is held open after we have finished writing to it until the
|
|
147
|
+
timeout elapses. Useful as a performance optimisation when making multiple writes to a single file,
|
|
148
|
+
potentially across multiple threads. NOTE: the keep_alive_timeout is not garuanteed to be observed - it
|
|
149
|
+
gets set by the first open call of a given session, so if the file is already open due to a previous openH5R
|
|
150
|
+
call, the timeout requested by that call will be used.
|
|
151
|
+
|
|
152
|
+
"""
|
|
153
|
+
from PYME.IO import h5rFile
|
|
154
|
+
|
|
155
|
+
with h5rFile.openH5R(filename, 'a', keep_alive_timeout=keep_alive_timeout) as f:
|
|
156
|
+
f.appendToTable(tablename, self.to_recarray(keys))
|
|
157
|
+
|
|
158
|
+
if metadata is not None:
|
|
159
|
+
f.updateMetadata(metadata)
|
|
160
|
+
|
|
161
|
+
#wait until data is written
|
|
162
|
+
f.flush()
|
|
163
|
+
|
|
164
|
+
def to_csv(self, outFile, keys=None):
|
|
165
|
+
if outFile.endswith('.csv'):
|
|
166
|
+
delim = ', '
|
|
167
|
+
else:
|
|
168
|
+
delim = '\t'
|
|
169
|
+
|
|
170
|
+
if keys is None:
|
|
171
|
+
keys = self.keys()
|
|
172
|
+
|
|
173
|
+
#nRecords = len(ds[keys[0]])
|
|
174
|
+
|
|
175
|
+
def fmt(d):
|
|
176
|
+
if np.isscalar(d):
|
|
177
|
+
if isinstance(d, six.string_types):
|
|
178
|
+
return str(d)
|
|
179
|
+
else:
|
|
180
|
+
return '%e' % d
|
|
181
|
+
else:
|
|
182
|
+
# try to make sure odd objects don't break file formatting
|
|
183
|
+
return ('"%s"' % str(d).replace(delim,' ').replace('\n',' '))
|
|
184
|
+
|
|
185
|
+
of = open(outFile, 'w')
|
|
186
|
+
|
|
187
|
+
of.write('# ' + delim.join(['%s' % k for k in keys]) + '\n')
|
|
188
|
+
|
|
189
|
+
for row in zip(*[self[k] for k in keys]):
|
|
190
|
+
of.write(delim.join([fmt(c) for c in row]) + '\n')
|
|
191
|
+
|
|
192
|
+
of.close()
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def keys(self):
|
|
196
|
+
raise NotImplementedError('Should be over-ridden in derived class')
|
|
197
|
+
|
|
198
|
+
def __getitem__(self, keys):
|
|
199
|
+
raise NotImplementedError('Should be over-ridden in derived class')
|
|
200
|
+
|
|
201
|
+
def __len__(self):
|
|
202
|
+
return len(self[list(self.keys())[0]])
|
|
203
|
+
|
|
204
|
+
def __getattr__(self, item):
|
|
205
|
+
try:
|
|
206
|
+
return self[item]
|
|
207
|
+
except KeyError:
|
|
208
|
+
raise AttributeError("'%s' has not attribute '%s'" % (self.__class__, item))
|
|
209
|
+
|
|
210
|
+
def __dir__(self):
|
|
211
|
+
return list(self.keys()) + list(self.__dict__.keys()) + list(dir(type(self)))
|
|
212
|
+
|
|
213
|
+
def to_JSON(self, keys=None, return_slice=slice(None)):
|
|
214
|
+
# TODO - do we actually use the slice argument? Should the signature better match to_hdf, to_recarray, toDataFrame?
|
|
215
|
+
# TODO - is this redundant when compared to .toDataFrame().to_json()
|
|
216
|
+
import json
|
|
217
|
+
|
|
218
|
+
d= {}
|
|
219
|
+
keys = keys if keys != None else self.keys()
|
|
220
|
+
for k in keys:
|
|
221
|
+
d[k] = self[(k, return_slice)].tolist()
|
|
222
|
+
return json.dumps(d)
|
|
223
|
+
|
|
224
|
+
def _calc_image_bounds(self):
|
|
225
|
+
from PYME.IO.image import ImageBounds
|
|
226
|
+
|
|
227
|
+
try:
|
|
228
|
+
if hasattr(self, 'mdh') and ('scanx' not in self.keys() or 'scany' not in self.keys()) and 'Camera.ROIWidth' in self.mdh.getEntryNames():
|
|
229
|
+
bds = ImageBounds.extractFromMetadata(self.mdh)
|
|
230
|
+
else:
|
|
231
|
+
bds = ImageBounds.estimateFromSource(self)
|
|
232
|
+
except:
|
|
233
|
+
logger.exception('Error estimating image bounds')
|
|
234
|
+
bds = ImageBounds(0,0,0,0,0,0)
|
|
235
|
+
|
|
236
|
+
return bds
|
|
237
|
+
|
|
238
|
+
@property
|
|
239
|
+
def image_bounds(self):
|
|
240
|
+
if self._image_bounds is False:
|
|
241
|
+
self._image_bounds = self._calc_image_bounds()
|
|
242
|
+
|
|
243
|
+
return self._image_bounds
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
# Data sources (File IO, or adapters to other data formats - e.g. recarrays
|
|
247
|
+
###########################################################################
|
|
248
|
+
|
|
249
|
+
@deprecated_name('randomSource')
|
|
250
|
+
class RandomSource(TabularBase):
|
|
251
|
+
_name = "Random Source"
|
|
252
|
+
def __init__(self, xmax, ymax, nsamps):
|
|
253
|
+
"""Uniform random source, for testing and as an example"""
|
|
254
|
+
self.x = xmax*np.random.rand(nsamps)
|
|
255
|
+
self.y = ymax*np.random.rand(nsamps)
|
|
256
|
+
|
|
257
|
+
self._keys = ['x', 'y']
|
|
258
|
+
|
|
259
|
+
def keys(self):
|
|
260
|
+
return self._keys
|
|
261
|
+
|
|
262
|
+
def __getitem__(self, keys):
|
|
263
|
+
key, sl = self._getKeySlice(keys)
|
|
264
|
+
|
|
265
|
+
if not key in self._keys:
|
|
266
|
+
raise KeyError('Key (%s) not defined' % key)
|
|
267
|
+
|
|
268
|
+
if key == 'x':
|
|
269
|
+
return self.x[sl]
|
|
270
|
+
elif key == 'y':
|
|
271
|
+
return self.y[sl]
|
|
272
|
+
|
|
273
|
+
def getInfo(self):
|
|
274
|
+
return 'Random Data Source\n\n %d points' % len(self.x)
|
|
275
|
+
|
|
276
|
+
def unNestNames(nameList, parent=''):
|
|
277
|
+
unList = []
|
|
278
|
+
for n in nameList:
|
|
279
|
+
if isinstance(n, six.string_types):
|
|
280
|
+
unList.append(parent + n)
|
|
281
|
+
else:
|
|
282
|
+
unList += unNestNames(n[1], parent + n[0] + '_')
|
|
283
|
+
return unList
|
|
284
|
+
|
|
285
|
+
def unNestDtype(descr, parent=''):
|
|
286
|
+
unList = []
|
|
287
|
+
for n in descr:
|
|
288
|
+
#print n, n.__class__, len(n)
|
|
289
|
+
if isinstance(n, tuple) and len(n) == 2 and isinstance(n[1],six.string_types):
|
|
290
|
+
unList.append(parent + n[0])
|
|
291
|
+
else:
|
|
292
|
+
unList += unNestDtype(n[1], parent + n[0] + '_')
|
|
293
|
+
return unList
|
|
294
|
+
|
|
295
|
+
def unnest_dtype(dtype, parent=''):
|
|
296
|
+
if isinstance(dtype, np.dtype):
|
|
297
|
+
descr = dtype.descr
|
|
298
|
+
else:
|
|
299
|
+
descr = dtype
|
|
300
|
+
|
|
301
|
+
dt = []
|
|
302
|
+
for node in descr:
|
|
303
|
+
if isinstance(node, tuple):# and len(node) == 2:
|
|
304
|
+
name, t = node[:2]
|
|
305
|
+
if isinstance(t, str):
|
|
306
|
+
dt.append((parent + name, ) + node[1:])
|
|
307
|
+
elif len(node) == 2:
|
|
308
|
+
dt += unnest_dtype(node[1], parent=parent + name + '_')
|
|
309
|
+
else:
|
|
310
|
+
raise RuntimeError('unexpected dtype descr: %s, node: %s' % (descr, node))
|
|
311
|
+
else:
|
|
312
|
+
raise RuntimeError('unexpected dtype descr: %s, node: %s' % (descr, node))
|
|
313
|
+
|
|
314
|
+
if parent == '':
|
|
315
|
+
#cast to a numpy dtype if we are at the top recursion level
|
|
316
|
+
return np.dtype(dt)
|
|
317
|
+
else:
|
|
318
|
+
# otherwise just return the description
|
|
319
|
+
return dt
|
|
320
|
+
|
|
321
|
+
@deprecated_name('fitResultsSource')
|
|
322
|
+
class FitResultsSource(TabularBase):
|
|
323
|
+
_name = "recarrayfi Source"
|
|
324
|
+
def __init__(self, fitResults, sort=True):
|
|
325
|
+
self.setResults(fitResults, sort=sort)
|
|
326
|
+
|
|
327
|
+
def _set_transkeys(self):
|
|
328
|
+
self.transkeys = {'A': 'fitResults_A', 'x': 'fitResults_x0',
|
|
329
|
+
'y': 'fitResults_y0', 'sig': 'fitResults_sigma',
|
|
330
|
+
'error_x': 'fitError_x0', 'error_y': 'fitError_y0', 'error_z': 'fitError_z0', 't': 'tIndex'}
|
|
331
|
+
|
|
332
|
+
for k in list(self.transkeys.keys()):
|
|
333
|
+
if not self.transkeys[k] in self._keys:
|
|
334
|
+
self.transkeys.pop(k)
|
|
335
|
+
|
|
336
|
+
def setResults(self, fitResults, sort=True):
|
|
337
|
+
self.fitResults = fitResults
|
|
338
|
+
|
|
339
|
+
if sort:
|
|
340
|
+
#sort by time
|
|
341
|
+
self.fitResults.sort(order='tIndex')
|
|
342
|
+
|
|
343
|
+
#allow access using unnested original names
|
|
344
|
+
# TODO???? - replace key translation with a np.view call?
|
|
345
|
+
#self._keys = unNestDtype(self.fitResults.dtype.descr)
|
|
346
|
+
self._keys = list(unnest_dtype(self.fitResults.dtype).names)
|
|
347
|
+
|
|
348
|
+
#or shorter aliases
|
|
349
|
+
self._set_transkeys()
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
def keys(self):
|
|
354
|
+
return self._keys + list(self.transkeys.keys())
|
|
355
|
+
|
|
356
|
+
def __getitem__(self, keys):
|
|
357
|
+
key, sl = self._getKeySlice(keys)
|
|
358
|
+
|
|
359
|
+
#if we're using an alias replace with actual key
|
|
360
|
+
if key in self.transkeys.keys():
|
|
361
|
+
key = self.transkeys[key]
|
|
362
|
+
|
|
363
|
+
if not key in self._keys:
|
|
364
|
+
raise KeyError('Key (%s) not found' % key)
|
|
365
|
+
|
|
366
|
+
k = key.split('_')
|
|
367
|
+
|
|
368
|
+
if len(k) == 1: # TODO: evaluate why these are cast as floats
|
|
369
|
+
return self.fitResults[k[0]][sl]
|
|
370
|
+
elif len(k) == 2:
|
|
371
|
+
return self.fitResults[k[0]][k[1]][sl]
|
|
372
|
+
elif len(k) == 3:
|
|
373
|
+
return self.fitResults[k[0]][k[1]][k[2]][sl]
|
|
374
|
+
else:
|
|
375
|
+
raise KeyError("Don't know about deeper nesting yet")
|
|
376
|
+
|
|
377
|
+
def getInfo(self):
|
|
378
|
+
return 'PYME h5r Data Source\n\n %d points' % self.fitResults.shape[0]
|
|
379
|
+
|
|
380
|
+
|
|
381
|
+
|
|
382
|
+
class _BaseHDFSource(FitResultsSource):
|
|
383
|
+
''' Copy of the original BaseHDFSource which used pytables directly rather than h5rFile
|
|
384
|
+
Currently unused, but kept for historical reasons.
|
|
385
|
+
'''
|
|
386
|
+
def __init__(self, h5fFile, tablename='FitResults'):
|
|
387
|
+
""" Data source for use with h5r files as saved by the PYME analysis
|
|
388
|
+
component. Takes either an open h5r file or a string filename to be
|
|
389
|
+
opened."""
|
|
390
|
+
self.tablename = tablename
|
|
391
|
+
|
|
392
|
+
if type(h5fFile) == tables.file.File:
|
|
393
|
+
h5f = h5fFile
|
|
394
|
+
self._own_file = False #did we open the file
|
|
395
|
+
else:
|
|
396
|
+
h5f = tables.open_file(h5fFile)
|
|
397
|
+
self.h5f = h5f
|
|
398
|
+
self._own_file = True
|
|
399
|
+
|
|
400
|
+
#if not tablename in dir(self.h5f.root):
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
try:
|
|
404
|
+
self.fitResults = getattr(h5f.root, tablename)[:]
|
|
405
|
+
except (AttributeError, tables.NoSuchNodeError):
|
|
406
|
+
logger.exception('Was expecting to find a "%s" table' % tablename)
|
|
407
|
+
raise
|
|
408
|
+
|
|
409
|
+
#allow access using unnested original names
|
|
410
|
+
self._keys = unNestNames(getattr(h5f.root, tablename).description._v_nested_names)
|
|
411
|
+
|
|
412
|
+
#close the hdf file (if we opened it)
|
|
413
|
+
#if self._own_file:
|
|
414
|
+
# h5f.close()
|
|
415
|
+
|
|
416
|
+
#or shorter aliases
|
|
417
|
+
|
|
418
|
+
def close(self):
|
|
419
|
+
if self._own_file:
|
|
420
|
+
try:
|
|
421
|
+
self.h5f.close()
|
|
422
|
+
except:
|
|
423
|
+
pass
|
|
424
|
+
|
|
425
|
+
def __del__(self):
|
|
426
|
+
self.close()
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
class BaseHDFSource(FitResultsSource):
|
|
430
|
+
def __init__(self, h5fFile, tablename='FitResults'):
|
|
431
|
+
""" Data source for use with h5r files as saved by the PYME analysis
|
|
432
|
+
component. Takes either an open h5r file or a string filename to be
|
|
433
|
+
opened."""
|
|
434
|
+
from PYME.IO import h5rFile
|
|
435
|
+
self.tablename = tablename
|
|
436
|
+
|
|
437
|
+
if isinstance(h5fFile, tables.file.File):
|
|
438
|
+
try:
|
|
439
|
+
fr = getattr(h5fFile.root, tablename)
|
|
440
|
+
self.fitResults = fr[:]
|
|
441
|
+
|
|
442
|
+
#allow access using unnested original names
|
|
443
|
+
self._keys = unNestNames(fr.description._v_nested_names)
|
|
444
|
+
|
|
445
|
+
except (AttributeError, tables.NoSuchNodeError):
|
|
446
|
+
logger.exception('Was expecting to find a "%s" table' % tablename)
|
|
447
|
+
raise
|
|
448
|
+
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
else:
|
|
452
|
+
if isinstance(h5fFile, h5rFile.H5RFile):
|
|
453
|
+
h5f = h5fFile
|
|
454
|
+
else:
|
|
455
|
+
h5f = h5rFile.openH5R(h5fFile)
|
|
456
|
+
|
|
457
|
+
with h5f:
|
|
458
|
+
self.fitResults = h5f.getTableData(tablename, slice(None))
|
|
459
|
+
if (len(self.fitResults) == 0):
|
|
460
|
+
raise RuntimeError('Was expecting to find a "%s" table' % tablename)
|
|
461
|
+
|
|
462
|
+
#allow access using unnested original names
|
|
463
|
+
self._keys = unNestNames(getattr(h5f._h5file.root, tablename).description._v_nested_names)
|
|
464
|
+
|
|
465
|
+
#close the hdf file (if we opened it)
|
|
466
|
+
#if self._own_file:
|
|
467
|
+
# h5f.close()
|
|
468
|
+
|
|
469
|
+
#or shorter aliases
|
|
470
|
+
|
|
471
|
+
def close(self):
|
|
472
|
+
pass
|
|
473
|
+
|
|
474
|
+
|
|
475
|
+
@deprecated_name('h5rSource')
|
|
476
|
+
class H5RSource(BaseHDFSource):
|
|
477
|
+
_name = "h5r Data Source"
|
|
478
|
+
def __init__(self, h5fFile, tablename='FitResults'):
|
|
479
|
+
BaseHDFSource.__init__(self, h5fFile, tablename)
|
|
480
|
+
|
|
481
|
+
# set up column aliases
|
|
482
|
+
self._set_transkeys()
|
|
483
|
+
|
|
484
|
+
#sort by time
|
|
485
|
+
if 'tIndex' in self._keys:
|
|
486
|
+
I = self.fitResults['tIndex'].argsort()
|
|
487
|
+
self.fitResults = self.fitResults[I]
|
|
488
|
+
#self.fitResults.sort(order='tIndex')
|
|
489
|
+
|
|
490
|
+
|
|
491
|
+
def getInfo(self):
|
|
492
|
+
return 'PYME h5r Data Source\n\n %d points' % self.fitResults.shape[0]
|
|
493
|
+
|
|
494
|
+
|
|
495
|
+
@deprecated_name('h5rDSource')
|
|
496
|
+
class H5RDSource(H5RSource):
|
|
497
|
+
_name = "h5r Drift Source"
|
|
498
|
+
|
|
499
|
+
def __init__(self, h5fFile):
|
|
500
|
+
""" Data source for use with h5r files as saved by the PYME analysis
|
|
501
|
+
component"""
|
|
502
|
+
|
|
503
|
+
H5RSource.__init__(self, h5fFile, 'DriftResults')
|
|
504
|
+
|
|
505
|
+
def getInfo(self):
|
|
506
|
+
return 'PYME h5r Drift Data Source\n\n %d points' % self.fitResults.shape[0]
|
|
507
|
+
|
|
508
|
+
@deprecated_name('hdfSource')
|
|
509
|
+
class HDFSource(H5RSource):
|
|
510
|
+
_name = "hdf Data Source"
|
|
511
|
+
|
|
512
|
+
def __init__(self, h5fFile, tablename='FitResults'):
|
|
513
|
+
BaseHDFSource.__init__(self, h5fFile, tablename)
|
|
514
|
+
#or shorter aliases
|
|
515
|
+
|
|
516
|
+
#sort by time
|
|
517
|
+
if 'tIndex' in self._keys:
|
|
518
|
+
I = self.fitResults['tIndex'].argsort()
|
|
519
|
+
self.fitResults = self.fitResults[I]
|
|
520
|
+
|
|
521
|
+
def keys(self):
|
|
522
|
+
return self._keys #+ self.transkeys.keys()
|
|
523
|
+
|
|
524
|
+
def __getitem__(self, keys):
|
|
525
|
+
key, sl = self._getKeySlice(keys)
|
|
526
|
+
|
|
527
|
+
if not key in self._keys:
|
|
528
|
+
raise KeyError('Key (%s) not found' % key)
|
|
529
|
+
|
|
530
|
+
return self.fitResults[key][sl]
|
|
531
|
+
|
|
532
|
+
|
|
533
|
+
def getInfo(self):
|
|
534
|
+
return 'PYME hdf Data Source\n\n %d points' % self.fitResults.shape[0]
|
|
535
|
+
|
|
536
|
+
# class h5rDSource(inputFilter):
|
|
537
|
+
# _name = "h5r Drift Source"
|
|
538
|
+
# def __init__(self, h5fFile):
|
|
539
|
+
# """ Data source for use with h5r files as saved by the PYME analysis
|
|
540
|
+
# component"""
|
|
541
|
+
#
|
|
542
|
+
# if type(h5fFile) == tables.file.File:
|
|
543
|
+
# self.h5f = h5fFile
|
|
544
|
+
# else:
|
|
545
|
+
# self.h5f = tables.openFile(h5fFile)
|
|
546
|
+
#
|
|
547
|
+
# if not 'DriftResults' in dir(self.h5f.root):
|
|
548
|
+
# raise RuntimeError('Was expecting to find a "DriftResults" table')
|
|
549
|
+
#
|
|
550
|
+
# self.driftResults = self.h5f.root.DriftResults[:]
|
|
551
|
+
#
|
|
552
|
+
# #sort by time
|
|
553
|
+
# self.driftResults.sort(order='tIndex')
|
|
554
|
+
#
|
|
555
|
+
# #allow access using unnested original names
|
|
556
|
+
# self._keys = unNestNames(self.h5f.root.DriftResults.description._v_nestedNames)
|
|
557
|
+
# #or shorter aliases
|
|
558
|
+
# self.transkeys = {'A' : 'fitResults_A', 'x' : 'fitResults_x0',
|
|
559
|
+
# 'y' : 'fitResults_y0', 'sig' : 'fitResults_sigma',
|
|
560
|
+
# 'error_x' : 'fitError_x0', 'error_y' : 'fitError_y0', 't':'tIndex'}
|
|
561
|
+
#
|
|
562
|
+
#
|
|
563
|
+
# def keys(self):
|
|
564
|
+
# return self._keys + self.transkeys.keys()
|
|
565
|
+
#
|
|
566
|
+
# def __getitem__(self, keys):
|
|
567
|
+
# key, sl = self._getKeySlice(keys)
|
|
568
|
+
#
|
|
569
|
+
# #if we're using an alias replace with actual key
|
|
570
|
+
# if key in self.transkeys.keys():
|
|
571
|
+
# key = self.transkeys[key]
|
|
572
|
+
#
|
|
573
|
+
# if not key in self._keys:
|
|
574
|
+
# raise RuntimeError('Key not found')
|
|
575
|
+
#
|
|
576
|
+
# k = key.split('_')
|
|
577
|
+
#
|
|
578
|
+
# if len(k) == 1:
|
|
579
|
+
# return self.driftResults[sl][k[0]].astype('f')
|
|
580
|
+
# elif len(k) == 2:
|
|
581
|
+
# return self.driftResults[sl][k[0]][k[1]].astype('f')
|
|
582
|
+
# elif len(k) == 3:
|
|
583
|
+
# return self.driftResults[sl][k[0]][k[1]][k[2]].astype('f')
|
|
584
|
+
# else:
|
|
585
|
+
# raise RuntimeError("Don't know about deeper nesting yet")
|
|
586
|
+
#
|
|
587
|
+
#
|
|
588
|
+
# def close(self):
|
|
589
|
+
# self.h5f.close()
|
|
590
|
+
#
|
|
591
|
+
# def getInfo(self):
|
|
592
|
+
# return 'PYME h5r Drift Data Source\n\n %d points' % self.h5f.root.DriftResults.shape[0]
|
|
593
|
+
@deprecated_name('textfileSource')
|
|
594
|
+
class TextfileSource(TabularBase):
|
|
595
|
+
_name = "Text File Source"
|
|
596
|
+
def __init__(self, filename, columnnames, delimiter=None, skiprows=0, skip_footer=0, invalid_raise=True, comments='#'):
|
|
597
|
+
""" Input filter for use with delimited text data. Defaults
|
|
598
|
+
to whitespace delimiter. Need to provide a list of variable names
|
|
599
|
+
in the order that they appear in the file. Using 'x', 'y' and 'error_x'
|
|
600
|
+
for the position data and it's error should ensure that this functions
|
|
601
|
+
with the visualisation backends"""
|
|
602
|
+
|
|
603
|
+
#self.res = np.loadtxt(filename, dtype={'names' : columnnames, # TODO: evaluate why these are cast as floats
|
|
604
|
+
# 'formats' : ['f4' for i in range(len(columnnames))]}, delimiter = delimiter, skiprows=skiprows)
|
|
605
|
+
|
|
606
|
+
from PYME import config
|
|
607
|
+
|
|
608
|
+
#print('invalid_raise:', invalid_raise)
|
|
609
|
+
|
|
610
|
+
if config.get('TextFileSource-use_pandas',False):
|
|
611
|
+
logger.info('Opening "%s" using pandas (set TextFileSource-use_pandas: False in config.yaml to use legacy np.genfromtxt instead)' % filename)
|
|
612
|
+
import pandas as pd
|
|
613
|
+
self.res = pd.read_csv(filename,
|
|
614
|
+
comment=comments,
|
|
615
|
+
delimiter=delimiter,
|
|
616
|
+
skiprows=skiprows,
|
|
617
|
+
skipfooter=skip_footer,
|
|
618
|
+
names=columnnames,
|
|
619
|
+
dtype='f4',
|
|
620
|
+
skipinitialspace=True,
|
|
621
|
+
on_bad_lines='error' if invalid_raise else 'warn,'
|
|
622
|
+
).to_records(index=False)
|
|
623
|
+
|
|
624
|
+
else:
|
|
625
|
+
logger.info('Opening %s using np.genfromtxt (set TextFileSource-use_pandas: True in config.yaml to use pandas instead)' % filename)
|
|
626
|
+
self.res = np.genfromtxt(filename,
|
|
627
|
+
comments=comments,
|
|
628
|
+
delimiter=delimiter,
|
|
629
|
+
skip_header=skiprows,
|
|
630
|
+
skip_footer=skip_footer,
|
|
631
|
+
names=columnnames,
|
|
632
|
+
dtype='f4', replace_space='_',
|
|
633
|
+
missing_values=None, filling_values=np.nan, # use NaN to flag missing values
|
|
634
|
+
invalid_raise=invalid_raise,
|
|
635
|
+
encoding='latin-1') # Zeiss Elyra bombs unless we go for latin-1 encoding, maybe make flavour specific?
|
|
636
|
+
|
|
637
|
+
# check for missing values:
|
|
638
|
+
# TODO - is this needed/helpful, or should we propagate missing values further?
|
|
639
|
+
# cast to a non-structured dtype and use the fact than the sum will be NaN if any of the individual values is NaN
|
|
640
|
+
r = self.res.view(('f4', len(columnnames))).sum(1)
|
|
641
|
+
if np.any(np.isnan(r)):
|
|
642
|
+
logger.warning('Text file contains missing values, discarding lines with missing values')
|
|
643
|
+
self.res = self.res[~np.isnan(r)]
|
|
644
|
+
|
|
645
|
+
self._keys = list(columnnames)
|
|
646
|
+
|
|
647
|
+
|
|
648
|
+
def keys(self):
|
|
649
|
+
return self._keys
|
|
650
|
+
|
|
651
|
+
def __getitem__(self, keys):
|
|
652
|
+
key, sl = self._getKeySlice(keys)
|
|
653
|
+
|
|
654
|
+
if not key in self._keys:
|
|
655
|
+
raise KeyError('Key (%s) not found' % key)
|
|
656
|
+
|
|
657
|
+
|
|
658
|
+
return self.res[key][sl]
|
|
659
|
+
|
|
660
|
+
|
|
661
|
+
def getInfo(self):
|
|
662
|
+
return 'Text Data Source\n\n %d points' % len(self.res['x'])
|
|
663
|
+
|
|
664
|
+
|
|
665
|
+
@deprecated_name('matfileSource')
|
|
666
|
+
class MatfileSource(TabularBase):
|
|
667
|
+
_name = "Matlab Source"
|
|
668
|
+
def __init__(self, filename, columnnames, varName='Orte'):
|
|
669
|
+
""" Input filter for use with matlab data where all variables are in in one 2D array (variable).
|
|
670
|
+
Need to provide a variable name within the matfile to and a list of column names
|
|
671
|
+
in the order that they appear in the file. Using 'x', 'y' and 'error_x'
|
|
672
|
+
for the position data and it's error should ensure that this functions
|
|
673
|
+
with the visualisation backends"""
|
|
674
|
+
|
|
675
|
+
import scipy.io
|
|
676
|
+
|
|
677
|
+
self.res = scipy.io.loadmat(filename)[varName].astype('f4') # TODO: evaluate why these are cast as floats
|
|
678
|
+
self.res = np.rec.fromarrays(self.res.T, dtype={'names' : columnnames, 'formats' : ['f4' for i in range(len(columnnames))]})
|
|
679
|
+
|
|
680
|
+
self._keys = list(columnnames)
|
|
681
|
+
|
|
682
|
+
|
|
683
|
+
def keys(self):
|
|
684
|
+
return self._keys
|
|
685
|
+
|
|
686
|
+
def __getitem__(self, key):
|
|
687
|
+
key, sl = self._getKeySlice(key)
|
|
688
|
+
if not key in self._keys:
|
|
689
|
+
raise KeyError('Key (%s) not found' % key)
|
|
690
|
+
|
|
691
|
+
return self.res[key][sl]
|
|
692
|
+
|
|
693
|
+
|
|
694
|
+
def getInfo(self):
|
|
695
|
+
return 'Text Data Source\n\n %d points' % len(self.res['x'])
|
|
696
|
+
|
|
697
|
+
@deprecated_name('matfileColumnSource')
|
|
698
|
+
class MatfileColumnSource(TabularBase):
|
|
699
|
+
_name = "Matlab Column Source"
|
|
700
|
+
|
|
701
|
+
def __init__(self, filename):
|
|
702
|
+
""" Input filter for use with matlab data where the each column is in a separate variable.
|
|
703
|
+
Relies on variables having suitable column names - columns named x, y, z, t, and probe (if multi-colour) should
|
|
704
|
+
be present.
|
|
705
|
+
"""
|
|
706
|
+
|
|
707
|
+
import scipy.io
|
|
708
|
+
|
|
709
|
+
self.res = scipy.io.loadmat(filename) # TODO: evaluate why these are cast as floats
|
|
710
|
+
|
|
711
|
+
self._keys = [k for k in self.res.keys() if not k.startswith('_')]
|
|
712
|
+
|
|
713
|
+
def keys(self):
|
|
714
|
+
return self._keys
|
|
715
|
+
|
|
716
|
+
def __getitem__(self, key):
|
|
717
|
+
key, sl = self._getKeySlice(key)
|
|
718
|
+
if not key in self._keys:
|
|
719
|
+
raise KeyError('Key (%s) not found' % key)
|
|
720
|
+
|
|
721
|
+
return self.res[key][sl].astype('f4').squeeze()
|
|
722
|
+
|
|
723
|
+
def getInfo(self):
|
|
724
|
+
return 'Text Data Source\n\n %d points' % len(self.res['x'])
|
|
725
|
+
|
|
726
|
+
class MatfileMultiColumnSource(MatfileColumnSource):
|
|
727
|
+
def __init__(self, filename):
|
|
728
|
+
MatfileColumnSource.__init__(self, filename)
|
|
729
|
+
|
|
730
|
+
# Unwrap multiple channels in self.res
|
|
731
|
+
tmp_res = {}
|
|
732
|
+
for k in self._keys:
|
|
733
|
+
tmp_res[k] = np.vstack(self.res[k][0]).squeeze()
|
|
734
|
+
n_channels = self.res[self._keys[0]][0].shape[0]
|
|
735
|
+
tmp_res['probe'] = np.vstack(self.res[self._keys[0]][0]*np.zeros(n_channels)+np.arange(n_channels)).squeeze()
|
|
736
|
+
self._keys.append('probe')
|
|
737
|
+
|
|
738
|
+
self.res = tmp_res
|
|
739
|
+
|
|
740
|
+
@deprecated_name('recArrayInput')
|
|
741
|
+
class RecArraySource(TabularBase):
|
|
742
|
+
_name = 'RecArray Source'
|
|
743
|
+
def __init__(self, recordArray):
|
|
744
|
+
self.recArray = recordArray
|
|
745
|
+
self._keys = list(self.recArray.dtype.names)
|
|
746
|
+
|
|
747
|
+
def keys(self):
|
|
748
|
+
return self._keys
|
|
749
|
+
|
|
750
|
+
def __getitem__(self, keys):
|
|
751
|
+
key, sl = self._getKeySlice(keys)
|
|
752
|
+
|
|
753
|
+
if not key in self._keys:
|
|
754
|
+
raise KeyError('Key (%s) not found' % key)
|
|
755
|
+
|
|
756
|
+
return self.recArray[key][sl]
|
|
757
|
+
|
|
758
|
+
def getInfo(self):
|
|
759
|
+
return 'Record Array Source\n\n %d points' % len(self.recArray['x'])
|
|
760
|
+
|
|
761
|
+
|
|
762
|
+
class DictSource(TabularBase):
|
|
763
|
+
_name = 'Dict Source'
|
|
764
|
+
|
|
765
|
+
def __init__(self, source):
|
|
766
|
+
"""
|
|
767
|
+
Create a data source from a dictionary of numpy arrays, where each entry is a column.
|
|
768
|
+
|
|
769
|
+
Parameters
|
|
770
|
+
----------
|
|
771
|
+
source
|
|
772
|
+
|
|
773
|
+
"""
|
|
774
|
+
self._verify(source)
|
|
775
|
+
self._source = source
|
|
776
|
+
|
|
777
|
+
def _verify(self, source):
|
|
778
|
+
L = len(source[list(source.keys())[0]])
|
|
779
|
+
|
|
780
|
+
for k, v in source.items():
|
|
781
|
+
if not isinstance(v, np.ndarray):
|
|
782
|
+
raise TypeError('Column "%s" is not a numpy array' % k)
|
|
783
|
+
|
|
784
|
+
if not len(v) == L:
|
|
785
|
+
raise ValueError('Columns are different lengths')
|
|
786
|
+
|
|
787
|
+
def addColumn(self, name, values):
|
|
788
|
+
if not isinstance(values, np.ndarray):
|
|
789
|
+
raise TypeError('New column "%s" is not a numpy array' % name)
|
|
790
|
+
|
|
791
|
+
if not len(values) == len(self):
|
|
792
|
+
raise ValueError('Columns are different lengths')
|
|
793
|
+
|
|
794
|
+
def keys(self):
|
|
795
|
+
return list(self._source.keys())
|
|
796
|
+
|
|
797
|
+
def __getitem__(self, keys):
|
|
798
|
+
key, sl = self._getKeySlice(keys)
|
|
799
|
+
return self._source[key][sl]
|
|
800
|
+
|
|
801
|
+
class ColumnSource(DictSource):
|
|
802
|
+
_name = 'Column Source'
|
|
803
|
+
def __init__(self, **kwargs):
|
|
804
|
+
"""
|
|
805
|
+
Create a datasource from columns specified by kwargs. Each column should be a numpy array.
|
|
806
|
+
|
|
807
|
+
Parameters
|
|
808
|
+
----------
|
|
809
|
+
kwargs
|
|
810
|
+
"""
|
|
811
|
+
DictSource.__init__(self, dict(kwargs))
|
|
812
|
+
|
|
813
|
+
def scalar_dict_source(d):
|
|
814
|
+
"""
|
|
815
|
+
Creates a tabular data source of length 1 from a scalar data
|
|
816
|
+
"""
|
|
817
|
+
|
|
818
|
+
return DictSource({k : np.asarray([v]) for k, v in d.items()})
|
|
819
|
+
|
|
820
|
+
def scalar_column_source(**kwargs):
|
|
821
|
+
"""
|
|
822
|
+
Creates a tabular data source of length 1 from a scalar data
|
|
823
|
+
"""
|
|
824
|
+
|
|
825
|
+
return ColumnSource(**{k : np.asarray([v]) for k, v in kwargs.items()})
|
|
826
|
+
|
|
827
|
+
# Filters (which remap existing data sources)
|
|
828
|
+
#############################################
|
|
829
|
+
|
|
830
|
+
|
|
831
|
+
class SelectionFilter(TabularBase):
|
|
832
|
+
_name = "Selection Filter"
|
|
833
|
+
|
|
834
|
+
def __init__(self, resultsSource, index):
|
|
835
|
+
""" A filter which relies on a supplied index (either integer or boolean)"""
|
|
836
|
+
|
|
837
|
+
self.resultsSource = resultsSource
|
|
838
|
+
|
|
839
|
+
self.Index = index
|
|
840
|
+
|
|
841
|
+
def __getitem__(self, keys):
|
|
842
|
+
key, sl = self._getKeySlice(keys)
|
|
843
|
+
return self.resultsSource[key][self.Index][sl]
|
|
844
|
+
|
|
845
|
+
def keys(self):
|
|
846
|
+
return list(self.resultsSource.keys())
|
|
847
|
+
|
|
848
|
+
@deprecated_name('resultsFilter')
|
|
849
|
+
class ResultsFilter(SelectionFilter):
|
|
850
|
+
_name = "Results Filter"
|
|
851
|
+
def __init__(self, resultsSource, **kwargs):
|
|
852
|
+
"""Class to permit filtering of fit results - masquarades
|
|
853
|
+
as a dictionary. Takes item ranges as keyword arguments, eg:
|
|
854
|
+
f = resultsFliter(source, x=[0,10], error_x=[0,5]) will return
|
|
855
|
+
an object that behaves like source, but with only those points with
|
|
856
|
+
an x value in the range [0, 10] and a x error in the range [0, 5].
|
|
857
|
+
|
|
858
|
+
The filter class does not have any explicit knowledge of the keys
|
|
859
|
+
supported by the underlying data source."""
|
|
860
|
+
|
|
861
|
+
if not isinstance(resultsSource, TabularBase):
|
|
862
|
+
raise TypeError('Expecting a tabular object for resultsSource')
|
|
863
|
+
|
|
864
|
+
self.resultsSource = resultsSource
|
|
865
|
+
|
|
866
|
+
#by default select everything
|
|
867
|
+
#self.Index = np.ones(self.resultsSource[list(resultsSource.keys())[0]].shape[0]) > 0.5
|
|
868
|
+
self.Index = np.ones(len(self.resultsSource), dtype=bool)
|
|
869
|
+
|
|
870
|
+
for k in kwargs.keys():
|
|
871
|
+
if not k in self.resultsSource.keys():
|
|
872
|
+
raise KeyError('Requested key not present: ' + k)
|
|
873
|
+
|
|
874
|
+
range = kwargs[k]
|
|
875
|
+
if not len(range) == 2:
|
|
876
|
+
raise RuntimeError('Expected an iterable of length 2')
|
|
877
|
+
|
|
878
|
+
self.Index *= (self.resultsSource[k] > range[0])*(self.resultsSource[k] < range[1])
|
|
879
|
+
|
|
880
|
+
|
|
881
|
+
@deprecated_name('randomSelectionFilter')
|
|
882
|
+
class RandomSelectionFilter(SelectionFilter):
|
|
883
|
+
_name = "Random Selection Filter"
|
|
884
|
+
|
|
885
|
+
def __init__(self, resultsSource, num_Samples):
|
|
886
|
+
"""Class to permit filtering of fit results - masquarades
|
|
887
|
+
as a dictionary. Takes item ranges as keyword arguments, eg:
|
|
888
|
+
f = resultsFliter(source, x=[0,10], error_x=[0,5]) will return
|
|
889
|
+
an object that behaves like source, but with only those points with
|
|
890
|
+
an x value in the range [0, 10] and a x error in the range [0, 5].
|
|
891
|
+
|
|
892
|
+
The filter class does not have any explicit knowledge of the keys
|
|
893
|
+
supported by the underlying data source."""
|
|
894
|
+
|
|
895
|
+
if not isinstance(resultsSource, TabularBase):
|
|
896
|
+
raise TypeError('Expecting a tabular object for resultsSource')
|
|
897
|
+
|
|
898
|
+
self.resultsSource = resultsSource
|
|
899
|
+
|
|
900
|
+
#by default select everything
|
|
901
|
+
self.Index = np.random.choice(len(self.resultsSource), num_Samples, replace=False)
|
|
902
|
+
|
|
903
|
+
|
|
904
|
+
@deprecated_name('idFilter')
|
|
905
|
+
class IdFilter(SelectionFilter):
|
|
906
|
+
_name = "Id Filter"
|
|
907
|
+
|
|
908
|
+
def __init__(self, resultsSource, id_column, valid_ids):
|
|
909
|
+
"""Class to permit filtering of fit results - masquarades
|
|
910
|
+
as a dictionary. Takes item ranges as keyword arguments, eg:
|
|
911
|
+
f = resultsFliter(source, x=[0,10], error_x=[0,5]) will return
|
|
912
|
+
an object that behaves like source, but with only those points with
|
|
913
|
+
an x value in the range [0, 10] and a x error in the range [0, 5].
|
|
914
|
+
|
|
915
|
+
The filter class does not have any explicit knowledge of the keys
|
|
916
|
+
supported by the underlying data source."""
|
|
917
|
+
|
|
918
|
+
if not isinstance(resultsSource, TabularBase):
|
|
919
|
+
raise TypeError('Expecting a tabular object for resultsSource')
|
|
920
|
+
|
|
921
|
+
self.resultsSource = resultsSource
|
|
922
|
+
self.id_column = id_column
|
|
923
|
+
self.valid_ids = valid_ids
|
|
924
|
+
|
|
925
|
+
#self.Index = np.zeros(self.resultsSource[list(resultsSource.keys())[0]].shape)
|
|
926
|
+
self.Index = np.zeros(len(self.resultsSource))
|
|
927
|
+
|
|
928
|
+
for id in valid_ids:
|
|
929
|
+
self.Index += (self.resultsSource[id_column] == id)
|
|
930
|
+
|
|
931
|
+
|
|
932
|
+
|
|
933
|
+
self.Index = self.Index > 0.5
|
|
934
|
+
|
|
935
|
+
|
|
936
|
+
@deprecated_name('concatenateFilter')
|
|
937
|
+
class ConcatenateFilter(TabularBase):
|
|
938
|
+
_name = "Concatenation Filter"
|
|
939
|
+
|
|
940
|
+
def __init__(self, source0, source1, *args, concatKey='concatSource'):
|
|
941
|
+
"""Class which concatenates two (or more) tabular data sources. The data sources should have the same keys.
|
|
942
|
+
|
|
943
|
+
The filter class does not have any explicit knowledge of the keys
|
|
944
|
+
supported by the underlying data source."""
|
|
945
|
+
|
|
946
|
+
self.source0 = source0
|
|
947
|
+
#self.source1 = source1
|
|
948
|
+
|
|
949
|
+
self._sources = [source0, source1, ] + list(args)
|
|
950
|
+
self._concat_key = concatKey
|
|
951
|
+
|
|
952
|
+
|
|
953
|
+
def __getitem__(self, keys):
|
|
954
|
+
key, sl = self._getKeySlice(keys)
|
|
955
|
+
if key == self._concat_key:
|
|
956
|
+
return np.hstack([i* np.ones(len(s[list(s.keys())[0]])) for i, s in enumerate(self._sources)])
|
|
957
|
+
#return np.hstack((np.zeros(len(self.source0[list(self.source0.keys())[0]])), np.ones(len(self.source1[list(self.source1.keys())[0]]))))
|
|
958
|
+
else:
|
|
959
|
+
return np.hstack([s[key] for s in self._sources])[sl]
|
|
960
|
+
|
|
961
|
+
def keys(self):
|
|
962
|
+
return set(self.source0.keys()).intersection(*[s.keys() for s in self._sources]).union([self._concat_key,])
|
|
963
|
+
|
|
964
|
+
|
|
965
|
+
@deprecated_name('cachingResultsFilter')
|
|
966
|
+
class CachingResultsFilter(TabularBase):
|
|
967
|
+
_name = "Caching Results Filter"
|
|
968
|
+
def __init__(self, resultsSource, **kwargs):
|
|
969
|
+
"""Class to permit filtering of fit results - masquarades
|
|
970
|
+
as a dictionary. Takes item ranges as keyword arguments, eg:
|
|
971
|
+
f = resultsFliter(source, x=[0,10], error_x=[0,5]) will return
|
|
972
|
+
an object that behaves like source, but with only those points with
|
|
973
|
+
an x value in the range [0, 10] and a x error in the range [0, 5].
|
|
974
|
+
|
|
975
|
+
The filter class does not have any explicit knowledge of the keys
|
|
976
|
+
supported by the underlying data source."""
|
|
977
|
+
|
|
978
|
+
if not isinstance(resultsSource, TabularBase):
|
|
979
|
+
raise TypeError('Expecting a tabular object for resultsSource')
|
|
980
|
+
|
|
981
|
+
self.resultsSource = resultsSource
|
|
982
|
+
self.cache = {}
|
|
983
|
+
|
|
984
|
+
#by default select everything
|
|
985
|
+
self.Index = np.ones(len(self.resultsSource), dtype=bool)
|
|
986
|
+
|
|
987
|
+
for k in kwargs.keys():
|
|
988
|
+
if not k in self.resultsSource.keys():
|
|
989
|
+
raise KeyError('Requested key not present: ' + k)
|
|
990
|
+
|
|
991
|
+
range = kwargs[k]
|
|
992
|
+
if not len(range) == 2:
|
|
993
|
+
raise RuntimeError('Expected an iterable of length 2')
|
|
994
|
+
|
|
995
|
+
self.Index *= (self.resultsSource[k] > range[0])*(self.resultsSource[k] < range[1])
|
|
996
|
+
|
|
997
|
+
|
|
998
|
+
def __getitem__(self, keys):
|
|
999
|
+
key, sl = self._getKeySlice(keys)
|
|
1000
|
+
if key in self.cache.keys():
|
|
1001
|
+
return self.cache[key][sl]
|
|
1002
|
+
else:
|
|
1003
|
+
res = np.array(self.resultsSource[key])[self.Index]
|
|
1004
|
+
self.cache[key] = res
|
|
1005
|
+
return res[sl]
|
|
1006
|
+
|
|
1007
|
+
def keys(self):
|
|
1008
|
+
return list(self.resultsSource.keys())
|
|
1009
|
+
|
|
1010
|
+
@property
|
|
1011
|
+
def mdh(self):
|
|
1012
|
+
return self.resultsSource.mdh
|
|
1013
|
+
|
|
1014
|
+
@deprecated_name('mappingFilter')
|
|
1015
|
+
class MappingFilter(TabularBase):
|
|
1016
|
+
_name = "Mapping Filter"
|
|
1017
|
+
def __init__(self, resultsSource, **kwargs):
|
|
1018
|
+
"""Class to permit transformations (e.g. drift correction) of fit results
|
|
1019
|
+
- masquarades as a dictionary. Takes mappings as keyword arguments, eg:
|
|
1020
|
+
f = resultsFliter(source, xp='x + a*tIndex', yp=compile('y + b*tIndex', '/tmp/test1', 'eval'), a=1, b=2)
|
|
1021
|
+
will return an object that behaves like source, but has additional members
|
|
1022
|
+
xp and yp.
|
|
1023
|
+
|
|
1024
|
+
the mappings should either be code objects, strings (which will be compiled into code objects),
|
|
1025
|
+
or something else (which will be turned into a local variable - eg constants in above example)
|
|
1026
|
+
|
|
1027
|
+
MappingFilter has one optional keyword arguement, modifies_bounds, which is a boolean indicating
|
|
1028
|
+
that the bounds implied by the metadata will no longer match up to the data after mapping - e.g. if
|
|
1029
|
+
the mapping introduces position shifts. For now, this is un-used, but exists as a hook for potential
|
|
1030
|
+
future use cases (see https://github.com/python-microscopy/python-microscopy/pull/1543#issuecomment-2298643266).
|
|
1031
|
+
|
|
1032
|
+
"""
|
|
1033
|
+
|
|
1034
|
+
if not isinstance(resultsSource, TabularBase):
|
|
1035
|
+
warnings.warn(VisibleDeprecationWarning('Mapping filter created with something that is not a tabular object. This will be unsupported in a future release. Consider DictSource or ColumnSource instead'))
|
|
1036
|
+
|
|
1037
|
+
self._modifies_bounds = kwargs.pop('modifies_bounds', False)
|
|
1038
|
+
|
|
1039
|
+
self.resultsSource = resultsSource
|
|
1040
|
+
|
|
1041
|
+
self.mappings = {}
|
|
1042
|
+
self.new_columns = {}
|
|
1043
|
+
self.variables = {}
|
|
1044
|
+
self.hidden_columns = []
|
|
1045
|
+
|
|
1046
|
+
for k in kwargs.keys():
|
|
1047
|
+
v = kwargs[k]
|
|
1048
|
+
self.setMapping(k,v)
|
|
1049
|
+
|
|
1050
|
+
def _calc_image_bounds(self):
|
|
1051
|
+
if self._modifies_bounds and 'x' in self.keys():
|
|
1052
|
+
# it is possible for a mapping to introduce large changes in x and y, hence modifying the image bounds
|
|
1053
|
+
# from their metadata values. We need to estimate bounds from data in this case.
|
|
1054
|
+
from PYME.IO.image import ImageBounds
|
|
1055
|
+
return ImageBounds.estimateFromSource(self)
|
|
1056
|
+
else:
|
|
1057
|
+
return super()._calc_image_bounds()
|
|
1058
|
+
|
|
1059
|
+
def __getitem__(self, keys):
|
|
1060
|
+
key, sl = self._getKeySlice(keys)
|
|
1061
|
+
if key in self.mappings.keys():
|
|
1062
|
+
return self.getMappedResults(key, sl)
|
|
1063
|
+
elif key in self.new_columns.keys():
|
|
1064
|
+
return self.new_columns[key][sl]
|
|
1065
|
+
else:
|
|
1066
|
+
return self.resultsSource[keys]
|
|
1067
|
+
|
|
1068
|
+
def keys(self):
|
|
1069
|
+
keys = list(dict.fromkeys(list(self.resultsSource.keys()) + list(self.mappings.keys()) + list(self.new_columns.keys())))
|
|
1070
|
+
for k in self.hidden_columns:
|
|
1071
|
+
keys.remove(k)
|
|
1072
|
+
|
|
1073
|
+
return keys
|
|
1074
|
+
|
|
1075
|
+
def addVariable(self, name, value):
|
|
1076
|
+
"""
|
|
1077
|
+
Adds a scalar variable to the mapping object. This will be accessible from mappings. An example usage might
|
|
1078
|
+
be to define a scaling parameter for one of our column variables.
|
|
1079
|
+
|
|
1080
|
+
Parameters
|
|
1081
|
+
----------
|
|
1082
|
+
name : string
|
|
1083
|
+
The name we want to be able to access the variable by
|
|
1084
|
+
value : float (or something which can be cast to a float)
|
|
1085
|
+
The value
|
|
1086
|
+
|
|
1087
|
+
"""
|
|
1088
|
+
|
|
1089
|
+
#insert into our __dict__ object (for backwards compatibility - TODO change me to something less hacky)
|
|
1090
|
+
#setattr(self, name, float(value))
|
|
1091
|
+
|
|
1092
|
+
self.variables[name] = float(value)
|
|
1093
|
+
|
|
1094
|
+
def set_variables(self, **kwargs):
|
|
1095
|
+
for k, v in kwargs.items():
|
|
1096
|
+
self.variables[k] = float(v)
|
|
1097
|
+
|
|
1098
|
+
def addColumn(self, name, values):
|
|
1099
|
+
"""
|
|
1100
|
+
Adds a column of values to the mapping.
|
|
1101
|
+
|
|
1102
|
+
Parameters
|
|
1103
|
+
----------
|
|
1104
|
+
name : str
|
|
1105
|
+
The new column name
|
|
1106
|
+
values : array-like
|
|
1107
|
+
The values. This should be the same length as the existing columns.
|
|
1108
|
+
|
|
1109
|
+
"""
|
|
1110
|
+
|
|
1111
|
+
#force to be an array
|
|
1112
|
+
values = np.array(values)
|
|
1113
|
+
|
|
1114
|
+
if not len(values) == len(self.resultsSource[list(self.resultsSource.keys())[0]]):
|
|
1115
|
+
raise RuntimeError('New column does not match the length of existing columns')
|
|
1116
|
+
|
|
1117
|
+
#insert into our __dict__ object (for backwards compatibility - TODO change me to something less hacky)
|
|
1118
|
+
#setattr(self, name, values)
|
|
1119
|
+
|
|
1120
|
+
self.new_columns[name] = values
|
|
1121
|
+
|
|
1122
|
+
|
|
1123
|
+
def setMapping(self, key, mapping):
|
|
1124
|
+
if type(mapping) == types.CodeType:
|
|
1125
|
+
self.mappings[key] = mapping
|
|
1126
|
+
elif isinstance(mapping, six.string_types):
|
|
1127
|
+
self.mappings[key] = compile(mapping, '/tmp/test1', 'eval')
|
|
1128
|
+
else:
|
|
1129
|
+
warnings.warn('setMapping should not be used to add a variable/data column', DeprecationWarning)
|
|
1130
|
+
self.__dict__[key] = mapping
|
|
1131
|
+
|
|
1132
|
+
def getMappedResults(self, key, sl):
|
|
1133
|
+
map = self.mappings[key]
|
|
1134
|
+
|
|
1135
|
+
#get all the variables needed for evaluation into local namespace
|
|
1136
|
+
varnames = map.co_names
|
|
1137
|
+
for vname in varnames:
|
|
1138
|
+
if vname in globals():
|
|
1139
|
+
pass
|
|
1140
|
+
if vname in self.resultsSource.keys(): #look at original results first
|
|
1141
|
+
locals()[vname] = self.resultsSource[vname][sl]
|
|
1142
|
+
elif vname in self.new_columns.keys():
|
|
1143
|
+
locals()[vname] = self.new_columns[vname][sl]
|
|
1144
|
+
elif vname in self.variables.keys():
|
|
1145
|
+
locals()[vname] = self.variables[vname]
|
|
1146
|
+
elif vname in self.__dict__.keys(): #look for constants
|
|
1147
|
+
#FIXME - do we still need this now we have variables
|
|
1148
|
+
locals()[vname] = self.__dict__[vname]
|
|
1149
|
+
elif vname in self.mappings.keys(): #finally try other mappings
|
|
1150
|
+
#try to prevent infinite recursion here if mappings have circular references
|
|
1151
|
+
if not vname == key and not key in self.mappings[vname].co_names:
|
|
1152
|
+
locals()[vname] = self.getMappedResults(vname, sl)
|
|
1153
|
+
else:
|
|
1154
|
+
raise RuntimeError('Circular reference detected in mapping')
|
|
1155
|
+
|
|
1156
|
+
return eval(map)
|
|
1157
|
+
|
|
1158
|
+
class _ChannelFilter(TabularBase):
|
|
1159
|
+
def __init__(self, colour_filter, channel):
|
|
1160
|
+
self.colour_filter = colour_filter
|
|
1161
|
+
self.channel = channel
|
|
1162
|
+
|
|
1163
|
+
def __getitem__(self, keys):
|
|
1164
|
+
return self.colour_filter.get_channel_column(self.channel, keys)
|
|
1165
|
+
|
|
1166
|
+
def keys(self):
|
|
1167
|
+
return list(self.colour_filter.keys())
|
|
1168
|
+
|
|
1169
|
+
@deprecated_name('colourFilter')
|
|
1170
|
+
class ColourFilter(TabularBase):
|
|
1171
|
+
_name = "Colour Filter"
|
|
1172
|
+
def __init__(self, resultsSource, currentColour=None):
|
|
1173
|
+
"""Class to permit filtering by colour
|
|
1174
|
+
"""
|
|
1175
|
+
|
|
1176
|
+
if not isinstance(resultsSource, TabularBase):
|
|
1177
|
+
raise TypeError('Expecting a tabular object for resultsSource')
|
|
1178
|
+
|
|
1179
|
+
self.resultsSource = resultsSource
|
|
1180
|
+
self.currentColour = currentColour
|
|
1181
|
+
self.chromaticShifts = {}
|
|
1182
|
+
|
|
1183
|
+
self.t_p_dye = 0.1
|
|
1184
|
+
self.t_p_other = 0.1
|
|
1185
|
+
self.t_p_background = .01
|
|
1186
|
+
|
|
1187
|
+
@property
|
|
1188
|
+
def index(self):
|
|
1189
|
+
return self._index(self.currentColour)
|
|
1190
|
+
|
|
1191
|
+
def _index(self, channel):
|
|
1192
|
+
colChans = self.getColourChans()
|
|
1193
|
+
if not channel in colChans:
|
|
1194
|
+
return np.ones(len(self.resultsSource[list(self.resultsSource.keys())[0]]), 'bool')
|
|
1195
|
+
else:
|
|
1196
|
+
p_dye = self.resultsSource['p_%s' % channel]
|
|
1197
|
+
|
|
1198
|
+
p_other = 0 * p_dye
|
|
1199
|
+
p_tot = self.t_p_background * self.resultsSource['ColourNorm']
|
|
1200
|
+
|
|
1201
|
+
for k in colChans:
|
|
1202
|
+
p_tot += self.resultsSource['p_%s' % k]
|
|
1203
|
+
if not channel == k:
|
|
1204
|
+
p_other = np.maximum(p_other, self.resultsSource['p_%s' % k])
|
|
1205
|
+
|
|
1206
|
+
p_dye = p_dye / p_tot
|
|
1207
|
+
p_other = p_other / p_tot
|
|
1208
|
+
|
|
1209
|
+
return (p_dye > self.t_p_dye) * (p_other < self.t_p_other)
|
|
1210
|
+
|
|
1211
|
+
|
|
1212
|
+
def __getitem__(self, keys):
|
|
1213
|
+
return self.get_channel_column(self.currentColour, keys)
|
|
1214
|
+
|
|
1215
|
+
def get_channel_column(self, chan, keys):
|
|
1216
|
+
key, sl = self._getKeySlice(keys)
|
|
1217
|
+
colChans = self.getColourChans()
|
|
1218
|
+
|
|
1219
|
+
if not chan in colChans:
|
|
1220
|
+
return self.resultsSource[keys]
|
|
1221
|
+
else:
|
|
1222
|
+
#chromatic shift correction
|
|
1223
|
+
#print self.currentColour
|
|
1224
|
+
if chan in self.chromaticShifts.keys() and key in self.chromaticShifts[chan].keys():
|
|
1225
|
+
return self.resultsSource[key][self._index(chan)][sl] + self.chromaticShifts[chan][key]
|
|
1226
|
+
else:
|
|
1227
|
+
return self.resultsSource[key][self._index(chan)][sl]
|
|
1228
|
+
|
|
1229
|
+
def get_channel_ds(self, chan):
|
|
1230
|
+
return _ChannelFilter(self, chan)
|
|
1231
|
+
|
|
1232
|
+
|
|
1233
|
+
@classmethod
|
|
1234
|
+
def get_colour_chans(cls, resultsSource):
|
|
1235
|
+
return [k[2:] for k in resultsSource.keys() if k.startswith('p_')]
|
|
1236
|
+
|
|
1237
|
+
def getColourChans(self):
|
|
1238
|
+
return self.get_colour_chans(self)
|
|
1239
|
+
|
|
1240
|
+
def setColour(self, colour):
|
|
1241
|
+
self.currentColour = colour
|
|
1242
|
+
|
|
1243
|
+
def keys(self):
|
|
1244
|
+
return list(self.resultsSource.keys())
|
|
1245
|
+
|
|
1246
|
+
|
|
1247
|
+
@deprecated_name('cloneSource')
|
|
1248
|
+
class CloneSource(TabularBase):
|
|
1249
|
+
_name = "Cloned Source"
|
|
1250
|
+
def __init__(self, resultsSource, keys=None):
|
|
1251
|
+
"""Creates an in memory copy of a (filtered) data source"""
|
|
1252
|
+
#resultsSource
|
|
1253
|
+
self.cache = {}
|
|
1254
|
+
|
|
1255
|
+
if not isinstance(resultsSource, TabularBase):
|
|
1256
|
+
raise TypeError('Expecting a tabular object for resultsSource')
|
|
1257
|
+
|
|
1258
|
+
klist = resultsSource.keys() if not keys else keys
|
|
1259
|
+
|
|
1260
|
+
for k in klist:
|
|
1261
|
+
self.cache[k] = resultsSource[k]
|
|
1262
|
+
|
|
1263
|
+
|
|
1264
|
+
|
|
1265
|
+
def __getitem__(self, keys):
|
|
1266
|
+
key, sl = self._getKeySlice(keys)
|
|
1267
|
+
return self.cache[key][sl]
|
|
1268
|
+
|
|
1269
|
+
def keys(self):
|
|
1270
|
+
return list(self.cache.keys())
|
|
1271
|
+
|
|
1272
|
+
class AnndataSource(TabularBase):
|
|
1273
|
+
"""Interfaces with anndata/scanpy/squidpy packages for spatialomics."""
|
|
1274
|
+
_name = "Anndata Source"
|
|
1275
|
+
|
|
1276
|
+
def __init__(self, filename):
|
|
1277
|
+
try:
|
|
1278
|
+
import anndata as ad
|
|
1279
|
+
except ModuleNotFoundError:
|
|
1280
|
+
raise ModuleNotFoundError("No module named anndata. Please install anndata to use this source.")
|
|
1281
|
+
|
|
1282
|
+
# backed='r' keeps us from loading the full file into memory
|
|
1283
|
+
# TODO: Is this the behaviour we want?
|
|
1284
|
+
self.res = ad.read(filename, backed='r')
|
|
1285
|
+
|
|
1286
|
+
# Flatten the anndata structure as best we can to fit our tabular structure
|
|
1287
|
+
self._keys = list(self.res.var_names) + list(self.res.obs.keys())
|
|
1288
|
+
self._keys_attrs = {**{k: 'X' for k in self.res.var_names}, **{k: 'obs' for k in self.res.obs_keys()}}
|
|
1289
|
+
for k, v in self.res.obsm.items():
|
|
1290
|
+
n_var = v.shape[1]
|
|
1291
|
+
if k == "spatial" or k == "spatial3d":
|
|
1292
|
+
if n_var == 2:
|
|
1293
|
+
proposed_keys = ['x', 'y']
|
|
1294
|
+
elif n_var == 3:
|
|
1295
|
+
proposed_keys = ['x', 'y', 'z']
|
|
1296
|
+
else:
|
|
1297
|
+
print(f"Could not load spatial data. Unsupported number of dimensions {n_var}.")
|
|
1298
|
+
proposed_keys = None
|
|
1299
|
+
|
|
1300
|
+
for i, kk in enumerate(proposed_keys):
|
|
1301
|
+
count = 0
|
|
1302
|
+
while proposed_keys[i] in self._keys:
|
|
1303
|
+
proposed_keys[i] = f"{kk}{count}"
|
|
1304
|
+
count += 1
|
|
1305
|
+
self._keys += [proposed_keys[i]]
|
|
1306
|
+
self._keys_attrs.update({proposed_keys[i]: {'obsm': {k: i}}})
|
|
1307
|
+
else:
|
|
1308
|
+
self._keys += [f"{k}_{j}" for j in range(n_var)]
|
|
1309
|
+
self._keys_attrs.update({f"{k}_{j}": {'obsm': {k: j}} for j in range(n_var)})
|
|
1310
|
+
|
|
1311
|
+
def keys(self):
|
|
1312
|
+
return self._keys
|
|
1313
|
+
|
|
1314
|
+
def __getitem__(self, key):
|
|
1315
|
+
key, sl = self._getKeySlice(key)
|
|
1316
|
+
if key not in self._keys:
|
|
1317
|
+
raise KeyError('Key (%s) not found' % key)
|
|
1318
|
+
|
|
1319
|
+
print(f"Getting {key}")
|
|
1320
|
+
|
|
1321
|
+
if self._keys_attrs[key] == "X":
|
|
1322
|
+
x = self.res[sl, key].X
|
|
1323
|
+
if isinstance(x, np.ndarray):
|
|
1324
|
+
return x.squeeze()
|
|
1325
|
+
return x.toarray().squeeze()
|
|
1326
|
+
elif isinstance(self._keys_attrs[key], dict):
|
|
1327
|
+
first_key = next(iter(self._keys_attrs[key]))
|
|
1328
|
+
if first_key == "obsm":
|
|
1329
|
+
d = self._keys_attrs[key][first_key]
|
|
1330
|
+
dkey = next(iter(d))
|
|
1331
|
+
return getattr(self.res, first_key)[dkey][:,d[dkey]]
|
|
1332
|
+
else:
|
|
1333
|
+
raise KeyError(f"Unknown subkeys starting from {first_key}.")
|
|
1334
|
+
else:
|
|
1335
|
+
return getattr(self.res, self._keys_attrs[key])[key][sl].to_numpy().squeeze()
|
|
1336
|
+
|
|
1337
|
+
def getInfo(self):
|
|
1338
|
+
return f"Anndata Data Source\n\n {self.res.X.shape[0]} points"
|