python-microscopy 25.11.20__cp313-cp313-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- PYME/Acquire/ActionManager.py +450 -0
- PYME/Acquire/ExecTools.py +235 -0
- PYME/Acquire/Hardware/AAOptoelectronics/MDS.py +175 -0
- PYME/Acquire/Hardware/AAOptoelectronics/__init__.py +0 -0
- PYME/Acquire/Hardware/ARCoptix/__init__.py +0 -0
- PYME/Acquire/Hardware/ARCoptix/lcdriver.py +149 -0
- PYME/Acquire/Hardware/ARCoptix/lcserver32.py +123 -0
- PYME/Acquire/Hardware/AndorIXon/AndorCam.py +1095 -0
- PYME/Acquire/Hardware/AndorIXon/AndorControlFrame.py +312 -0
- PYME/Acquire/Hardware/AndorIXon/AndorIXon.py +737 -0
- PYME/Acquire/Hardware/AndorIXon/__init__.py +27 -0
- PYME/Acquire/Hardware/AndorNeo/AndorNeo.py +644 -0
- PYME/Acquire/Hardware/AndorNeo/AndorNeoControlFrame.py +161 -0
- PYME/Acquire/Hardware/AndorNeo/AndorZyla.py +761 -0
- PYME/Acquire/Hardware/AndorNeo/SDK3.py +307 -0
- PYME/Acquire/Hardware/AndorNeo/SDK3Cam.py +171 -0
- PYME/Acquire/Hardware/AndorNeo/ZylaControlPanel.py +105 -0
- PYME/Acquire/Hardware/AndorNeo/__init__.py +22 -0
- PYME/Acquire/Hardware/AndorNeo/parseAtdebug.py +46 -0
- PYME/Acquire/Hardware/AndorNeo/plotTimings.py +73 -0
- PYME/Acquire/Hardware/AndorNeo/testNeo.py +62 -0
- PYME/Acquire/Hardware/Camera.py +1199 -0
- PYME/Acquire/Hardware/CameraSkeleton.py +642 -0
- PYME/Acquire/Hardware/Coherent/OBIS.py +147 -0
- PYME/Acquire/Hardware/Coherent/Sapphire.py +162 -0
- PYME/Acquire/Hardware/Coherent/__init__.py +0 -0
- PYME/Acquire/Hardware/DMDGui.py +198 -0
- PYME/Acquire/Hardware/DigiData/DigiData.py +95 -0
- PYME/Acquire/Hardware/DigiData/DigiDataClient.py +30 -0
- PYME/Acquire/Hardware/DigiData/RemoteDigiData.py +51 -0
- PYME/Acquire/Hardware/DigiData/__init__.py +24 -0
- PYME/Acquire/Hardware/DigiData/axDD132x.py +348 -0
- PYME/Acquire/Hardware/EMCCDTheory.py +41 -0
- PYME/Acquire/Hardware/ExciterWheel.py +167 -0
- PYME/Acquire/Hardware/FilterWheel.py +184 -0
- PYME/Acquire/Hardware/FocCorr.py +106 -0
- PYME/Acquire/Hardware/FocCorrR.py +196 -0
- PYME/Acquire/Hardware/FrFilter.py +51 -0
- PYME/Acquire/Hardware/GCS/GCS_DLL.py +370 -0
- PYME/Acquire/Hardware/GCS/__init__.py +0 -0
- PYME/Acquire/Hardware/GCS/gcs.py +210 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/HamamatsuDCAM.py +662 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/HamamatsuORCA.py +602 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/Hamamatsu_control_panel.py +54 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/__init__.py +23 -0
- PYME/Acquire/Hardware/LaserControlFrame.py +160 -0
- PYME/Acquire/Hardware/MPBCommunications/MPBCW.py +132 -0
- PYME/Acquire/Hardware/MPBCommunications/__init__.py +0 -0
- PYME/Acquire/Hardware/Mercury/Mercury.py +269 -0
- PYME/Acquire/Hardware/Mercury/PI_Mercury_GCS_DLL.py +857 -0
- PYME/Acquire/Hardware/Mercury/__init__.py +22 -0
- PYME/Acquire/Hardware/Mercury/mercuryStepper.py +203 -0
- PYME/Acquire/Hardware/Mercury/mercuryStepperGCS.py +281 -0
- PYME/Acquire/Hardware/NikonTE2000.py +68 -0
- PYME/Acquire/Hardware/NikonTi.py +214 -0
- PYME/Acquire/Hardware/NikonTiGUI.py +81 -0
- PYME/Acquire/Hardware/OrielCornerstone.py +125 -0
- PYME/Acquire/Hardware/PM100USB.py +51 -0
- PYME/Acquire/Hardware/Piezos/__init__.py +22 -0
- PYME/Acquire/Hardware/Piezos/base_piezo.py +108 -0
- PYME/Acquire/Hardware/Piezos/offsetPiezo.py +162 -0
- PYME/Acquire/Hardware/Piezos/offsetPiezoREST.py +308 -0
- PYME/Acquire/Hardware/Piezos/piezo_c867.py +486 -0
- PYME/Acquire/Hardware/Piezos/piezo_e255.py +68 -0
- PYME/Acquire/Hardware/Piezos/piezo_e662.py +61 -0
- PYME/Acquire/Hardware/Piezos/piezo_e709.py +434 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816.py +452 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816_corr.py +70 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816_dll.py +518 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816b.py +70 -0
- PYME/Acquire/Hardware/Piezos/piezo_pipython_gcs.py +560 -0
- PYME/Acquire/Hardware/Piezos/piezo_test.py +55 -0
- PYME/Acquire/Hardware/Simulator/EmpiricalHist.py +273 -0
- PYME/Acquire/Hardware/Simulator/__init__.py +22 -0
- PYME/Acquire/Hardware/Simulator/dSimControl.py +961 -0
- PYME/Acquire/Hardware/Simulator/fakeCam.py +651 -0
- PYME/Acquire/Hardware/Simulator/fakePiezo.py +95 -0
- PYME/Acquire/Hardware/Simulator/fluor.py +336 -0
- PYME/Acquire/Hardware/Simulator/illuminate.cp313-win_amd64.dll.a +0 -0
- PYME/Acquire/Hardware/Simulator/illuminate.cp313-win_amd64.pyd +0 -0
- PYME/Acquire/Hardware/Simulator/illuminate.pyx +93 -0
- PYME/Acquire/Hardware/Simulator/lasersliders.py +90 -0
- PYME/Acquire/Hardware/Simulator/rend_im.py +446 -0
- PYME/Acquire/Hardware/Simulator/setup.py +69 -0
- PYME/Acquire/Hardware/Simulator/simcontrol.py +348 -0
- PYME/Acquire/Hardware/Simulator/simui_wx.py +794 -0
- PYME/Acquire/Hardware/Tango/__init__.py +0 -0
- PYME/Acquire/Hardware/Tango/marzhauser_tango.py +583 -0
- PYME/Acquire/Hardware/TiLightCrafter.py +388 -0
- PYME/Acquire/Hardware/__init__.py +22 -0
- PYME/Acquire/Hardware/aotf.py +271 -0
- PYME/Acquire/Hardware/arclampshutterpanel.py +71 -0
- PYME/Acquire/Hardware/cameraSoftwareBuffer.py +215 -0
- PYME/Acquire/Hardware/camera_noise.py +270 -0
- PYME/Acquire/Hardware/ccdAdjPanel.py +188 -0
- PYME/Acquire/Hardware/ccdCalibrator.py +161 -0
- PYME/Acquire/Hardware/cobaltLaser.py +108 -0
- PYME/Acquire/Hardware/cobaltLaser561.py +94 -0
- PYME/Acquire/Hardware/comports.py +26 -0
- PYME/Acquire/Hardware/driftTrackGUI.py +488 -0
- PYME/Acquire/Hardware/driftTracking.py +595 -0
- PYME/Acquire/Hardware/fakeShutters.py +52 -0
- PYME/Acquire/Hardware/focusKeys.py +204 -0
- PYME/Acquire/Hardware/focus_locks/__init__.py +0 -0
- PYME/Acquire/Hardware/focus_locks/reflection_focus_lock.py +684 -0
- PYME/Acquire/Hardware/frZStage.py +117 -0
- PYME/Acquire/Hardware/fw102.py +38 -0
- PYME/Acquire/Hardware/ids_peak_cam.py +561 -0
- PYME/Acquire/Hardware/ioslave.py +305 -0
- PYME/Acquire/Hardware/lasers.py +292 -0
- PYME/Acquire/Hardware/matchboxLaser.py +58 -0
- PYME/Acquire/Hardware/microscope_adapter.py +104 -0
- PYME/Acquire/Hardware/mpd_picosecond_delayer.py +395 -0
- PYME/Acquire/Hardware/multiview.py +287 -0
- PYME/Acquire/Hardware/olympusix81.py +59 -0
- PYME/Acquire/Hardware/pco/__init__.py +0 -0
- PYME/Acquire/Hardware/pco/pco_cam.py +348 -0
- PYME/Acquire/Hardware/pco/pco_edge_42_lt.py +34 -0
- PYME/Acquire/Hardware/pco/pco_sdk.py +1645 -0
- PYME/Acquire/Hardware/pco/pco_sdk_cam.py +518 -0
- PYME/Acquire/Hardware/pco/pco_sdk_cam_control_panel.py +54 -0
- PYME/Acquire/Hardware/phoxxLaser.py +199 -0
- PYME/Acquire/Hardware/phoxxLaserOLD.py +242 -0
- PYME/Acquire/Hardware/priorLumen.py +102 -0
- PYME/Acquire/Hardware/priorarclampshutter.py +52 -0
- PYME/Acquire/Hardware/setup.py +50 -0
- PYME/Acquire/Hardware/spacenav.py +148 -0
- PYME/Acquire/Hardware/splitter.py +394 -0
- PYME/Acquire/Hardware/thorlabsPiezo.py +98 -0
- PYME/Acquire/Hardware/thorlabs_cam.py +136 -0
- PYME/Acquire/Hardware/thorlabs_mff_flipper.py +400 -0
- PYME/Acquire/Hardware/toptica_ibeam.py +51 -0
- PYME/Acquire/Hardware/uc480/AndorControlFrame.py +308 -0
- PYME/Acquire/Hardware/uc480/__init__.py +27 -0
- PYME/Acquire/Hardware/uc480/uCam480.py +695 -0
- PYME/Acquire/Hardware/uc480/uc480.py +189 -0
- PYME/Acquire/Hardware/uc480/uc480Deprecated.py +87 -0
- PYME/Acquire/Hardware/uc480/uc480_h.py +767 -0
- PYME/Acquire/Hardware/uc480/uc480_h_gen.py +62 -0
- PYME/Acquire/Hardware/uc480/ucCamControlFrame.py +83 -0
- PYME/Acquire/Hardware/ueye.py +702 -0
- PYME/Acquire/PYMEAcquire.py +186 -0
- PYME/Acquire/Protocols/DMDMFM.py +74 -0
- PYME/Acquire/Protocols/__init__.py +22 -0
- PYME/Acquire/Protocols/darkCalibrate.py +56 -0
- PYME/Acquire/Protocols/dual671_470.py +45 -0
- PYME/Acquire/Protocols/dual671_488.py +46 -0
- PYME/Acquire/Protocols/gainCal.py +53 -0
- PYME/Acquire/Protocols/htsms-cal-psf.py +32 -0
- PYME/Acquire/Protocols/htsms-cal-registration.py +52 -0
- PYME/Acquire/Protocols/htsms-flow.py +29 -0
- PYME/Acquire/Protocols/htsms-staggered.py +31 -0
- PYME/Acquire/Protocols/htsms-tile.py +68 -0
- PYME/Acquire/Protocols/htsms-two-color.py +29 -0
- PYME/Acquire/Protocols/htsms-widefield.py +32 -0
- PYME/Acquire/Protocols/paint671.py +61 -0
- PYME/Acquire/Protocols/photoconversion.py +52 -0
- PYME/Acquire/Protocols/photoconversion2.py +55 -0
- PYME/Acquire/Protocols/prebleach488.py +70 -0
- PYME/Acquire/Protocols/prebleach490.py +69 -0
- PYME/Acquire/Protocols/prebleach561.py +72 -0
- PYME/Acquire/Protocols/prebleach561NeomEos2.py +70 -0
- PYME/Acquire/Protocols/prebleach561NeomEos2ND1.py +70 -0
- PYME/Acquire/Protocols/prebleach642.py +70 -0
- PYME/Acquire/Protocols/prebleach671.py +69 -0
- PYME/Acquire/Protocols/prebleach671ND1.py +58 -0
- PYME/Acquire/Protocols/prebleach671ND2.py +57 -0
- PYME/Acquire/Protocols/prebleach671Neo.py +69 -0
- PYME/Acquire/Protocols/recover671.py +62 -0
- PYME/Acquire/Protocols/sequence642_488.py +85 -0
- PYME/Acquire/Protocols/sequence642_561.py +87 -0
- PYME/Acquire/Protocols/shiftfield.py +198 -0
- PYME/Acquire/Protocols/simul488.py +59 -0
- PYME/Acquire/Protocols/simul642.py +63 -0
- PYME/Acquire/Protocols/simul642HTSMS.py +63 -0
- PYME/Acquire/Protocols/simulPA.py +37 -0
- PYME/Acquire/Protocols/simulSIM.py +76 -0
- PYME/Acquire/Protocols/simulStep.py +62 -0
- PYME/Acquire/Protocols/spdscan.py +178 -0
- PYME/Acquire/Protocols/standard470.py +45 -0
- PYME/Acquire/Protocols/standard488.py +47 -0
- PYME/Acquire/Protocols/standard671.py +48 -0
- PYME/Acquire/Protocols/standard671_no532.py +47 -0
- PYME/Acquire/Protocols/standardArclamp.py +46 -0
- PYME/Acquire/Protocols/strip_tile.py +204 -0
- PYME/Acquire/Protocols/tile.py +204 -0
- PYME/Acquire/Protocols/tile3D.py +192 -0
- PYME/Acquire/Protocols/tile671.py +190 -0
- PYME/Acquire/Protocols/tile_triggered.py +189 -0
- PYME/Acquire/Scripts/init.py +232 -0
- PYME/Acquire/Scripts/init_N1_Ti_Exeter_ZIx.py +374 -0
- PYME/Acquire/Scripts/init_N2_Ti_Zyla_lasers.py +290 -0
- PYME/Acquire/Scripts/init_Neo.py +266 -0
- PYME/Acquire/Scripts/init_NeoSim.py +159 -0
- PYME/Acquire/Scripts/init_TIRF.py +232 -0
- PYME/Acquire/Scripts/init_TIRF_Neo.py +242 -0
- PYME/Acquire/Scripts/init_TIRF_NeoO.py +241 -0
- PYME/Acquire/Scripts/init_TIRF_onecam.py +233 -0
- PYME/Acquire/Scripts/init_Ti.py +257 -0
- PYME/Acquire/Scripts/init_UOA_n.py +256 -0
- PYME/Acquire/Scripts/init_UOA_n2.py +246 -0
- PYME/Acquire/Scripts/init_Y1.py +249 -0
- PYME/Acquire/Scripts/init_Zyla.py +260 -0
- PYME/Acquire/Scripts/init_drift_tracking.py +80 -0
- PYME/Acquire/Scripts/init_emccd_basic.py +277 -0
- PYME/Acquire/Scripts/init_htsms.py +277 -0
- PYME/Acquire/Scripts/init_htsms_focus_lock.py +132 -0
- PYME/Acquire/Scripts/init_micrpi.py +45 -0
- PYME/Acquire/Scripts/init_orca.py +70 -0
- PYME/Acquire/Scripts/init_pco.py +49 -0
- PYME/Acquire/Scripts/init_rev.py +74 -0
- PYME/Acquire/Scripts/init_sim100.py +169 -0
- PYME/Acquire/Scripts/init_sim103.py +169 -0
- PYME/Acquire/Scripts/init_sim2.py +211 -0
- PYME/Acquire/Scripts/init_sim50.py +169 -0
- PYME/Acquire/Scripts/init_sim75.py +169 -0
- PYME/Acquire/Scripts/init_sim_drift_tracking.py +166 -0
- PYME/Acquire/Scripts/init_sim_htsms.py +224 -0
- PYME/Acquire/Scripts/init_sim_htsms_n.py +233 -0
- PYME/Acquire/Scripts/init_sim_main.py +229 -0
- PYME/Acquire/Scripts/init_sim_min.py +197 -0
- PYME/Acquire/Scripts/init_sim_rem.py +176 -0
- PYME/Acquire/Scripts/init_smi1.py +110 -0
- PYME/Acquire/Scripts/init_spectro.py +78 -0
- PYME/Acquire/Scripts/init_spim.py +116 -0
- PYME/Acquire/Scripts/init_thorcam.py +62 -0
- PYME/Acquire/Scripts/init_twophoton.py +112 -0
- PYME/Acquire/Scripts/init_uc480.py +262 -0
- PYME/Acquire/Scripts/init_ueye.py +261 -0
- PYME/Acquire/SpoolController.py +958 -0
- PYME/Acquire/Utils/MultiPointScanner.py +80 -0
- PYME/Acquire/Utils/__init__.py +13 -0
- PYME/Acquire/Utils/failsafe.py +157 -0
- PYME/Acquire/Utils/fastTiler.py +153 -0
- PYME/Acquire/Utils/pointScanner.py +496 -0
- PYME/Acquire/Utils/sarcSpacing.py +86 -0
- PYME/Acquire/Utils/strip_tiler.py +93 -0
- PYME/Acquire/Utils/tiler.py +464 -0
- PYME/Acquire/Utils/vibrationAnalysis.py +65 -0
- PYME/Acquire/__init__.py +44 -0
- PYME/Acquire/acquire_client.py +90 -0
- PYME/Acquire/acquire_server.py +316 -0
- PYME/Acquire/acquirebase.py +139 -0
- PYME/Acquire/acquiremainframe.py +716 -0
- PYME/Acquire/acquirewx.py +61 -0
- PYME/Acquire/acquisition_base.py +148 -0
- PYME/Acquire/actions.py +209 -0
- PYME/Acquire/autofocus.py +54 -0
- PYME/Acquire/eventLog.py +95 -0
- PYME/Acquire/event_loop.py +119 -0
- PYME/Acquire/frameWrangler.py +530 -0
- PYME/Acquire/htsms/__init__.py +8 -0
- PYME/Acquire/htsms/rule_ui.py +970 -0
- PYME/Acquire/htsms/rule_ui_v2.py +573 -0
- PYME/Acquire/htsms/tweeter.py +222 -0
- PYME/Acquire/microscope.py +1050 -0
- PYME/Acquire/positionTracker.py +181 -0
- PYME/Acquire/protocol.py +299 -0
- PYME/Acquire/protocol_acquisition.py +404 -0
- PYME/Acquire/sampleInformation.py +591 -0
- PYME/Acquire/sampleInformationDjangoDirect.py +446 -0
- PYME/Acquire/setup.py +52 -0
- PYME/Acquire/stackSettings.py +295 -0
- PYME/Acquire/stage_leveling.py +285 -0
- PYME/Acquire/ui/AnalysisSettingsUI.py +184 -0
- PYME/Acquire/ui/HDFSpoolFrame.py +584 -0
- PYME/Acquire/ui/__init__.py +0 -0
- PYME/Acquire/ui/actionUI.py +892 -0
- PYME/Acquire/ui/focus_lock_gui.py +149 -0
- PYME/Acquire/ui/intensity_trace.py +143 -0
- PYME/Acquire/ui/intsliders.py +222 -0
- PYME/Acquire/ui/lasersliders.py +329 -0
- PYME/Acquire/ui/mpd_picosecond_delay_panel.py +69 -0
- PYME/Acquire/ui/multiview_select.py +77 -0
- PYME/Acquire/ui/positionUI.py +519 -0
- PYME/Acquire/ui/preflight.py +58 -0
- PYME/Acquire/ui/scanner_panel.py +41 -0
- PYME/Acquire/ui/selectCameraPanel.py +46 -0
- PYME/Acquire/ui/seqdialog.py +501 -0
- PYME/Acquire/ui/splashScreen.py +175 -0
- PYME/Acquire/ui/spool_panel.py +830 -0
- PYME/Acquire/ui/tile_panel.py +556 -0
- PYME/Acquire/ui/tilesettingsui.py +91 -0
- PYME/Acquire/ui/voxelSizeDialog.py +149 -0
- PYME/Acquire/webui/__init__.py +36 -0
- PYME/Acquire/webui/ipy.py +361 -0
- PYME/Acquire/webui/static/css/pyme-bootstrap.css +9908 -0
- PYME/Acquire/webui/static/css/pymeacquire.css +85 -0
- PYME/Acquire/webui/static/js/pymeacquire.js +375 -0
- PYME/Acquire/webui/static/js/pzf.js +95 -0
- PYME/Acquire/webui/templates/PYMEAcquire.html +232 -0
- PYME/Acquire/webui/templates/login.html +84 -0
- PYME/Acquire/webui/templates/xtermpage.html +106 -0
- PYME/Acquire/xyztc.py +418 -0
- PYME/Acquire/zScanner.py +287 -0
- PYME/Analysis/BleachProfile/__init__.py +26 -0
- PYME/Analysis/BleachProfile/deMod.py +91 -0
- PYME/Analysis/BleachProfile/fitRecover.py +90 -0
- PYME/Analysis/BleachProfile/intensProf.py +519 -0
- PYME/Analysis/BleachProfile/kinModels.py +507 -0
- PYME/Analysis/BleachProfile/rawIntensity.py +227 -0
- PYME/Analysis/BleachProfile/rollins.py +555 -0
- PYME/Analysis/Colocalisation/__init__.py +27 -0
- PYME/Analysis/Colocalisation/colocScaleDep.py +126 -0
- PYME/Analysis/Colocalisation/correlationCoeffs.py +198 -0
- PYME/Analysis/Colocalisation/distColoc.py +110 -0
- PYME/Analysis/Colocalisation/edtColoc.py +191 -0
- PYME/Analysis/MetaData.py +278 -0
- PYME/Analysis/PSFEst/__init__.py +27 -0
- PYME/Analysis/PSFEst/dec.py +283 -0
- PYME/Analysis/PSFEst/extractImages.py +316 -0
- PYME/Analysis/PSFEst/fit_psf_zernikes.py +194 -0
- PYME/Analysis/PSFEst/psfQuality.py +225 -0
- PYME/Analysis/PSFGen/__init__.py +40 -0
- PYME/Analysis/PSFGen/fourier.py +138 -0
- PYME/Analysis/PSFGen/fourierHNA.py +1108 -0
- PYME/Analysis/PSFGen/fourierHNA2.py +979 -0
- PYME/Analysis/PSFGen/genCRBcurves.py +185 -0
- PYME/Analysis/PSFGen/nijboer_zernike.py +79 -0
- PYME/Analysis/PSFGen/ps_app.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/PSFGen/ps_app.cp313-win_amd64.pyd +0 -0
- PYME/Analysis/PSFGen/test_ps_app.py +24 -0
- PYME/Analysis/Tracking/__init__.py +3 -0
- PYME/Analysis/Tracking/msd.py +57 -0
- PYME/Analysis/Tracking/trackUtils.py +528 -0
- PYME/Analysis/Tracking/tracking.py +152 -0
- PYME/Analysis/__init__.py +30 -0
- PYME/Analysis/_fithelpers.py +161 -0
- PYME/Analysis/angleFilter.py +287 -0
- PYME/Analysis/annealThresh.py +157 -0
- PYME/Analysis/autoencoder_classifier.py +45 -0
- PYME/Analysis/binAvg.py +144 -0
- PYME/Analysis/composite.py +183 -0
- PYME/Analysis/cramerRao.py +259 -0
- PYME/Analysis/deTile.py +441 -0
- PYME/Analysis/density_filter.py +45 -0
- PYME/Analysis/distributed_pyramid.py +426 -0
- PYME/Analysis/fiducial_matching.py +220 -0
- PYME/Analysis/gen_sCMOS_maps.py +355 -0
- PYME/Analysis/graphing_filters.py +311 -0
- PYME/Analysis/implicitFilter.py +359 -0
- PYME/Analysis/keep_pairs.py +69 -0
- PYME/Analysis/optic_flow.py +108 -0
- PYME/Analysis/piecewise.py +36 -0
- PYME/Analysis/piecewiseMapping.py +304 -0
- PYME/Analysis/piezo_movement_correction.py +153 -0
- PYME/Analysis/points/DeClump/__init__.py +78 -0
- PYME/Analysis/points/DeClump/deClump.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/points/DeClump/deClump.cp313-win_amd64.pyd +0 -0
- PYME/Analysis/points/DeClump/deClumpGUI.py +87 -0
- PYME/Analysis/points/DeClump/pyDeClump.py +284 -0
- PYME/Analysis/points/DeClump/testClump.py +40 -0
- PYME/Analysis/points/DistHist/__init__.py +25 -0
- PYME/Analysis/points/DistHist/distHist.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/points/DistHist/distHist.cp313-win_amd64.pyd +0 -0
- PYME/Analysis/points/DistHist/distHistThreaded.py +71 -0
- PYME/Analysis/points/DistHist/setup.py +54 -0
- PYME/Analysis/points/EdgeDB/__init__.py +24 -0
- PYME/Analysis/points/EdgeDB/edgeDB.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/points/EdgeDB/edgeDB.cp313-win_amd64.pyd +0 -0
- PYME/Analysis/points/EdgeDB/edgeTest.py +66 -0
- PYME/Analysis/points/EdgeDB/edges.py +102 -0
- PYME/Analysis/points/EdgeDB/segment.py +75 -0
- PYME/Analysis/points/EdgeDB/setup.py +54 -0
- PYME/Analysis/points/QuadTree/QTrend.py +232 -0
- PYME/Analysis/points/QuadTree/__init__.py +25 -0
- PYME/Analysis/points/QuadTree/pointQT.py +227 -0
- PYME/Analysis/points/QuadTree/pointQTF.py +254 -0
- PYME/Analysis/points/QuadTree/qtUtils.py +36 -0
- PYME/Analysis/points/QuadTree/rendQT.py +118 -0
- PYME/Analysis/points/SoftRend/__init__.py +24 -0
- PYME/Analysis/points/SoftRend/setup.py +61 -0
- PYME/Analysis/points/SoftRend/testTetrahedra.py +41 -0
- PYME/Analysis/points/SoftRend/triRend.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/points/SoftRend/triRend.cp313-win_amd64.pyd +0 -0
- PYME/Analysis/points/__init__.py +3 -0
- PYME/Analysis/points/arcfit/__init__.py +1 -0
- PYME/Analysis/points/arcfit/arcmf.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/points/arcfit/arcmf.cp313-win_amd64.pyd +0 -0
- PYME/Analysis/points/arcfit/setup.py +51 -0
- PYME/Analysis/points/astigmatism/__init__.py +0 -0
- PYME/Analysis/points/astigmatism/astigTools.py +338 -0
- PYME/Analysis/points/astigmatism/astiglookup.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/points/astigmatism/astiglookup.cp313-win_amd64.pyd +0 -0
- PYME/Analysis/points/astigmatism/setup.py +54 -0
- PYME/Analysis/points/cluster_morphology.py +199 -0
- PYME/Analysis/points/coordinate_tools.py +278 -0
- PYME/Analysis/points/features/__init__.py +0 -0
- PYME/Analysis/points/features/metal.py +46 -0
- PYME/Analysis/points/features/shaders/vect_feat_3d.metal +49 -0
- PYME/Analysis/points/fiducials.py +142 -0
- PYME/Analysis/points/gen3DTriangs.py +796 -0
- PYME/Analysis/points/moments.py +143 -0
- PYME/Analysis/points/multiview.py +458 -0
- PYME/Analysis/points/objectMeasure.py +206 -0
- PYME/Analysis/points/qpaint.py +97 -0
- PYME/Analysis/points/rings.py +372 -0
- PYME/Analysis/points/ripleys.py +427 -0
- PYME/Analysis/points/segmentLL.py +134 -0
- PYME/Analysis/points/setup.py +56 -0
- PYME/Analysis/points/spherical_harmonics.py +909 -0
- PYME/Analysis/points/surfit.py +829 -0
- PYME/Analysis/points/tCluster.py +75 -0
- PYME/Analysis/points/traveling_salesperson/__init__.py +0 -0
- PYME/Analysis/points/traveling_salesperson/queue_opt.py +117 -0
- PYME/Analysis/points/traveling_salesperson/sectioned_two_opt.py +327 -0
- PYME/Analysis/points/traveling_salesperson/setup.py +40 -0
- PYME/Analysis/points/traveling_salesperson/sort.py +78 -0
- PYME/Analysis/points/traveling_salesperson/two_opt.py +189 -0
- PYME/Analysis/points/traveling_salesperson/two_opt_utils.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/points/traveling_salesperson/two_opt_utils.cp313-win_amd64.pyd +0 -0
- PYME/Analysis/points/traveling_salesperson/two_opt_utils.pyx +41 -0
- PYME/Analysis/points/twoColour.py +572 -0
- PYME/Analysis/points/twoColourPlot.py +107 -0
- PYME/Analysis/processLogger.py +129 -0
- PYME/Analysis/profile_extraction.py +72 -0
- PYME/Analysis/setup.py +60 -0
- PYME/Analysis/splitting.py +372 -0
- PYME/Analysis/svmSegment.py +214 -0
- PYME/Analysis/thresholding.py +192 -0
- PYME/Analysis/tile_pyramid.py +938 -0
- PYME/Analysis/widefieldify.py +54 -0
- PYME/DSView/DisplayOptionsPanel.py +503 -0
- PYME/DSView/LUT/__init__.py +33 -0
- PYME/DSView/LUT/lut.cp313-win_amd64.dll.a +0 -0
- PYME/DSView/LUT/lut.cp313-win_amd64.pyd +0 -0
- PYME/DSView/LUT/setup.py +54 -0
- PYME/DSView/OpenSequenceDialog.py +83 -0
- PYME/DSView/OverlaysPanel.py +111 -0
- PYME/DSView/__init__.py +32 -0
- PYME/DSView/arrayViewPanel.py +1035 -0
- PYME/DSView/displayOptions.py +453 -0
- PYME/DSView/displaySettingsPanel.py +271 -0
- PYME/DSView/dsviewer.py +542 -0
- PYME/DSView/eventLogViewer.py +805 -0
- PYME/DSView/fitInfo.py +486 -0
- PYME/DSView/htmlServe.py +72 -0
- PYME/DSView/logparser.py +100 -0
- PYME/DSView/modules/LMAnalysis.py +1053 -0
- PYME/DSView/modules/LMDisplay.py +194 -0
- PYME/DSView/modules/__init__.py +162 -0
- PYME/DSView/modules/_base.py +39 -0
- PYME/DSView/modules/annotation.py +725 -0
- PYME/DSView/modules/arrayView.py +71 -0
- PYME/DSView/modules/blobFinding.py +455 -0
- PYME/DSView/modules/blobMeasure.py +1093 -0
- PYME/DSView/modules/camera_maps.py +38 -0
- PYME/DSView/modules/coloc.py +414 -0
- PYME/DSView/modules/composite.py +715 -0
- PYME/DSView/modules/convnet.py +24 -0
- PYME/DSView/modules/cropping.py +133 -0
- PYME/DSView/modules/dark_and_flatfield.py +31 -0
- PYME/DSView/modules/deconvolution.py +499 -0
- PYME/DSView/modules/eventView.py +80 -0
- PYME/DSView/modules/extractBlobs.py +46 -0
- PYME/DSView/modules/fastGraphPanel.py +85 -0
- PYME/DSView/modules/filtering.py +335 -0
- PYME/DSView/modules/flowView.py +268 -0
- PYME/DSView/modules/fourierRingCorrelation.py +172 -0
- PYME/DSView/modules/gl_image_view.py +12 -0
- PYME/DSView/modules/graphViewPanel.py +272 -0
- PYME/DSView/modules/measure/__init__.py +1 -0
- PYME/DSView/modules/measure/filterPan.py +239 -0
- PYME/DSView/modules/metadataView.py +28 -0
- PYME/DSView/modules/multithreshold.py +98 -0
- PYME/DSView/modules/neuroglancer.py +129 -0
- PYME/DSView/modules/object_tagging.py +157 -0
- PYME/DSView/modules/particleTracking.py +463 -0
- PYME/DSView/modules/playback.py +256 -0
- PYME/DSView/modules/prebleachExtraction.py +75 -0
- PYME/DSView/modules/profileFitting.py +137 -0
- PYME/DSView/modules/profilePlotting.py +408 -0
- PYME/DSView/modules/projections.py +48 -0
- PYME/DSView/modules/psfExtraction.py +570 -0
- PYME/DSView/modules/psfGeneration.py +138 -0
- PYME/DSView/modules/psfTools.py +661 -0
- PYME/DSView/modules/pupilTools.py +204 -0
- PYME/DSView/modules/pupilView.py +139 -0
- PYME/DSView/modules/recipes.py +266 -0
- PYME/DSView/modules/redimension.py +75 -0
- PYME/DSView/modules/segmentation.py +192 -0
- PYME/DSView/modules/sheetView.py +24 -0
- PYME/DSView/modules/shell.py +39 -0
- PYME/DSView/modules/shiftfield_estimation.py +433 -0
- PYME/DSView/modules/sparkprepare.py +94 -0
- PYME/DSView/modules/splitter.py +148 -0
- PYME/DSView/modules/synchronise.py +64 -0
- PYME/DSView/modules/templates/astigCal.html +42 -0
- PYME/DSView/modules/templates/measureView.html +69 -0
- PYME/DSView/modules/templates/measureView2.html +48 -0
- PYME/DSView/modules/templates/measureView3.html +98 -0
- PYME/DSView/modules/templates/trackView.html +139 -0
- PYME/DSView/modules/templates/tracksOverview.html +21 -0
- PYME/DSView/modules/tiling.py +147 -0
- PYME/DSView/modules/unmixing.py +148 -0
- PYME/DSView/modules/vis3D.py +320 -0
- PYME/DSView/modules/visgui.py +163 -0
- PYME/DSView/modules/webview.py +14 -0
- PYME/DSView/overlays.py +295 -0
- PYME/DSView/scrolledImagePanel.py +188 -0
- PYME/DSView/setup.py +53 -0
- PYME/DSView/splashScreen.py +158 -0
- PYME/DSView/voxSizeDialog.py +84 -0
- PYME/Deconv/__init__.py +35 -0
- PYME/Deconv/beadGen.py +55 -0
- PYME/Deconv/dec.py +659 -0
- PYME/Deconv/decTask.py +65 -0
- PYME/Deconv/decThread.py +113 -0
- PYME/Deconv/dec_test.py +47 -0
- PYME/Deconv/deconvDialogs.py +417 -0
- PYME/Deconv/fftwWisdom.py +62 -0
- PYME/Deconv/richardsonLucy.py +141 -0
- PYME/Deconv/richardsonLucyMV.py +151 -0
- PYME/Deconv/richardsonLucyMVM.py +218 -0
- PYME/Deconv/test_block_dec.py +46 -0
- PYME/Deconv/tq_block_dec.py +331 -0
- PYME/Deconv/wiener.py +163 -0
- PYME/IO/DataSources/AlignDataSource.py +91 -0
- PYME/IO/DataSources/ArrayDataSource.py +260 -0
- PYME/IO/DataSources/BGSDataSource.py +353 -0
- PYME/IO/DataSources/BaseDataSource.py +457 -0
- PYME/IO/DataSources/BioformatsDataSource.py +178 -0
- PYME/IO/DataSources/BufferedDataSource.py +99 -0
- PYME/IO/DataSources/ClusterPZFDataSource.py +124 -0
- PYME/IO/DataSources/ConcatenatedDataSource.py +56 -0
- PYME/IO/DataSources/CropDataSource.py +243 -0
- PYME/IO/DataSources/DcimgDataSource.py +54 -0
- PYME/IO/DataSources/ElectronsPerSecondDataSource.py +61 -0
- PYME/IO/DataSources/FlatFieldDataSource.py +77 -0
- PYME/IO/DataSources/HDFDataSource.py +160 -0
- PYME/IO/DataSources/HTTPDataSource.py +80 -0
- PYME/IO/DataSources/ImageSeriesDataSource.py +123 -0
- PYME/IO/DataSources/MultiviewDataSource.py +99 -0
- PYME/IO/DataSources/OBFDataSource.py +67 -0
- PYME/IO/DataSources/RandomDataSource.py +23 -0
- PYME/IO/DataSources/SupertileDatasource.py +148 -0
- PYME/IO/DataSources/TQDataSource.py +41 -0
- PYME/IO/DataSources/TiffDataSource.py +193 -0
- PYME/IO/DataSources/TileDataSource.py +91 -0
- PYME/IO/DataSources/UnsplitDataSource.py +92 -0
- PYME/IO/DataSources/__init__.py +59 -0
- PYME/IO/FileUtils/IJLut.py +43 -0
- PYME/IO/FileUtils/RawToHdf5.py +105 -0
- PYME/IO/FileUtils/SPAD.py +54 -0
- PYME/IO/FileUtils/TiffSeqToHdf5.py +87 -0
- PYME/IO/FileUtils/__init__.py +24 -0
- PYME/IO/FileUtils/compHdf.py +39 -0
- PYME/IO/FileUtils/fileID.py +246 -0
- PYME/IO/FileUtils/fnlGen.py +40 -0
- PYME/IO/FileUtils/freeSpace.py +59 -0
- PYME/IO/FileUtils/h5-thumbnailer.py +85 -0
- PYME/IO/FileUtils/h5ExFrames.py +98 -0
- PYME/IO/FileUtils/h5ToTiffSeries.py +50 -0
- PYME/IO/FileUtils/h5r-thumbnailer.py +118 -0
- PYME/IO/FileUtils/h5rFormatDef.py +99 -0
- PYME/IO/FileUtils/h5rToTxt.py +77 -0
- PYME/IO/FileUtils/nameUtils.py +300 -0
- PYME/IO/FileUtils/obf_support.py +538 -0
- PYME/IO/FileUtils/ply.py +147 -0
- PYME/IO/FileUtils/readSpeckle.py +78 -0
- PYME/IO/FileUtils/readTiff.py +64 -0
- PYME/IO/FileUtils/saveTiffStack.py +137 -0
- PYME/IO/FileUtils/setup.py +36 -0
- PYME/IO/FileUtils/sf-thumbnailer.py +76 -0
- PYME/IO/FileUtils/stl.py +44 -0
- PYME/IO/FileUtils/thumbnailDatabase.py +104 -0
- PYME/IO/HTTPSpooler_v2.py +141 -0
- PYME/IO/MetaDataHandler.py +1072 -0
- PYME/IO/PZFFormat.py +375 -0
- PYME/IO/Spooler.py +279 -0
- PYME/IO/__init__.py +12 -0
- PYME/IO/acquisition_backends.py +353 -0
- PYME/IO/buffer_helpers.cp313-win_amd64.dll.a +0 -0
- PYME/IO/buffer_helpers.cp313-win_amd64.pyd +0 -0
- PYME/IO/buffer_helpers.pyx +190 -0
- PYME/IO/buffers.py +291 -0
- PYME/IO/clusterDuplication.py +204 -0
- PYME/IO/clusterExport.py +152 -0
- PYME/IO/clusterGlob.py +108 -0
- PYME/IO/clusterIO.py +1076 -0
- PYME/IO/clusterListing.py +232 -0
- PYME/IO/clusterResults.py +206 -0
- PYME/IO/clusterUpload.py +49 -0
- PYME/IO/cluster_directory.py +419 -0
- PYME/IO/cluster_streaming.py +216 -0
- PYME/IO/compatibility.py +12 -0
- PYME/IO/countdir/__init__.py +5 -0
- PYME/IO/countdir/setup.py +58 -0
- PYME/IO/csv_flavours.py +251 -0
- PYME/IO/dataExporter.py +470 -0
- PYME/IO/dataWrap.py +108 -0
- PYME/IO/dcimg.py +167 -0
- PYME/IO/events.py +161 -0
- PYME/IO/h5File.py +148 -0
- PYME/IO/h5rFile.py +323 -0
- PYME/IO/image.py +1447 -0
- PYME/IO/load_psf.py +26 -0
- PYME/IO/pyme_h5ls.py +58 -0
- PYME/IO/ragged.py +138 -0
- PYME/IO/rgb_image.py +94 -0
- PYME/IO/tabular.py +1338 -0
- PYME/IO/testClusterSpooling.py +199 -0
- PYME/IO/unifiedIO.py +301 -0
- PYME/LMVis/Extras/QPobjectSegment.py +220 -0
- PYME/LMVis/Extras/__init__.py +55 -0
- PYME/LMVis/Extras/animation.py +359 -0
- PYME/LMVis/Extras/annotation.py +78 -0
- PYME/LMVis/Extras/clusterAnalysis.py +460 -0
- PYME/LMVis/Extras/dockedPanel.py +69 -0
- PYME/LMVis/Extras/extra_layers.py +373 -0
- PYME/LMVis/Extras/fiducial.py +230 -0
- PYME/LMVis/Extras/flagZMotionArtifacts.py +60 -0
- PYME/LMVis/Extras/fusionUtils.py +9 -0
- PYME/LMVis/Extras/multiColourAnalysis.py +103 -0
- PYME/LMVis/Extras/multiviewMapping.py +489 -0
- PYME/LMVis/Extras/objectMeasurements.py +246 -0
- PYME/LMVis/Extras/particleTracking.py +272 -0
- PYME/LMVis/Extras/perFrameVariable.py +77 -0
- PYME/LMVis/Extras/photophysics.py +72 -0
- PYME/LMVis/Extras/pointSetGeneration.py +232 -0
- PYME/LMVis/Extras/pointwiseColoc.py +54 -0
- PYME/LMVis/Extras/saved_views.py +125 -0
- PYME/LMVis/Extras/scaleBox.py +115 -0
- PYME/LMVis/Extras/sequentialSpecies.py +125 -0
- PYME/LMVis/Extras/setBGImage.py +74 -0
- PYME/LMVis/Extras/shiftmapGenerator.py +138 -0
- PYME/LMVis/Extras/showShortcuts.py +69 -0
- PYME/LMVis/Extras/snapshot.py +135 -0
- PYME/LMVis/Extras/spherical_harmonics.py +98 -0
- PYME/LMVis/Extras/subsets.py +15 -0
- PYME/LMVis/Extras/surface_fitting.py +52 -0
- PYME/LMVis/Extras/temperaturePlot.py +53 -0
- PYME/LMVis/Extras/vibration.py +112 -0
- PYME/LMVis/VisGUI.py +506 -0
- PYME/LMVis/__init__.py +39 -0
- PYME/LMVis/colourFilterGUI.py +77 -0
- PYME/LMVis/colourPanel.py +491 -0
- PYME/LMVis/displayPane.py +462 -0
- PYME/LMVis/dyeRatios.py +116 -0
- PYME/LMVis/genImageDialog.py +298 -0
- PYME/LMVis/gl_offScreenHandler.py +134 -0
- PYME/LMVis/gl_render.py +1302 -0
- PYME/LMVis/gl_render3D.py +1453 -0
- PYME/LMVis/gl_render3D_shaders.py +1213 -0
- PYME/LMVis/glcanvas_core.py +1157 -0
- PYME/LMVis/imageView.py +752 -0
- PYME/LMVis/imageView2.py +372 -0
- PYME/LMVis/importTextDialog.py +342 -0
- PYME/LMVis/layer_panel.py +231 -0
- PYME/LMVis/layers/AxesOverlayLayer.py +126 -0
- PYME/LMVis/layers/LUTOverlayLayer.py +346 -0
- PYME/LMVis/layers/OverlayLayer.py +46 -0
- PYME/LMVis/layers/ScaleBarOverlayLayer.py +97 -0
- PYME/LMVis/layers/ScaleBoxOverlayLayer.py +181 -0
- PYME/LMVis/layers/SelectionOverlayLayer.py +124 -0
- PYME/LMVis/layers/__init__.py +53 -0
- PYME/LMVis/layers/base.py +319 -0
- PYME/LMVis/layers/image_layer.py +363 -0
- PYME/LMVis/layers/labels.py +186 -0
- PYME/LMVis/layers/layer_defaults.py +97 -0
- PYME/LMVis/layers/mesh.py +378 -0
- PYME/LMVis/layers/octree.py +194 -0
- PYME/LMVis/layers/pointcloud.py +372 -0
- PYME/LMVis/layers/quiver.py +271 -0
- PYME/LMVis/layers/text.py +250 -0
- PYME/LMVis/layers/tracks.py +309 -0
- PYME/LMVis/mv_math.py +78 -0
- PYME/LMVis/objectDarkMeasure.py +120 -0
- PYME/LMVis/pipeline.py +1227 -0
- PYME/LMVis/pipelineView.py +115 -0
- PYME/LMVis/pointSettingsPanel.py +135 -0
- PYME/LMVis/progGraph.py +59 -0
- PYME/LMVis/quadTreeSettings.py +90 -0
- PYME/LMVis/rendGauss.py +158 -0
- PYME/LMVis/renderers.py +576 -0
- PYME/LMVis/sessionpaths.py +136 -0
- PYME/LMVis/setup.py +39 -0
- PYME/LMVis/setup_exe.py +71 -0
- PYME/LMVis/shader_programs/DefaultShaderProgram.py +149 -0
- PYME/LMVis/shader_programs/GLProgram.py +119 -0
- PYME/LMVis/shader_programs/GouraudShaderProgram.py +157 -0
- PYME/LMVis/shader_programs/PointSpriteShaderProgram.py +163 -0
- PYME/LMVis/shader_programs/ShaderProgramFactory.py +54 -0
- PYME/LMVis/shader_programs/TesselShaderProgram.py +47 -0
- PYME/LMVis/shader_programs/WireFrameShaderProgram.py +50 -0
- PYME/LMVis/shader_programs/__init__.py +20 -0
- PYME/LMVis/shader_programs/oit_compositor.py +23 -0
- PYME/LMVis/shader_programs/shader_loader.py +84 -0
- PYME/LMVis/shader_programs/shader_program.py +168 -0
- PYME/LMVis/shader_programs/shaders/bigflatpoints_fs.glsl +16 -0
- PYME/LMVis/shader_programs/shaders/bigpoints_gs.glsl +40 -0
- PYME/LMVis/shader_programs/shaders/bigpointsprites_fs.glsl +20 -0
- PYME/LMVis/shader_programs/shaders/bigspheres_fs.glsl +53 -0
- PYME/LMVis/shader_programs/shaders/compose_fs.glsl +41 -0
- PYME/LMVis/shader_programs/shaders/compose_vs.glsl +25 -0
- PYME/LMVis/shader_programs/shaders/default_fs.glsl +27 -0
- PYME/LMVis/shader_programs/shaders/default_vs.glsl +88 -0
- PYME/LMVis/shader_programs/shaders/flatpoints_fs.glsl +27 -0
- PYME/LMVis/shader_programs/shaders/gouraud_flatpoints_fs.glsl +30 -0
- PYME/LMVis/shader_programs/shaders/gouraud_fs.glsl +26 -0
- PYME/LMVis/shader_programs/shaders/gouraud_oit_fs.glsl +68 -0
- PYME/LMVis/shader_programs/shaders/gouraud_vs.glsl +135 -0
- PYME/LMVis/shader_programs/shaders/image_fs.glsl +60 -0
- PYME/LMVis/shader_programs/shaders/image_vs.glsl +79 -0
- PYME/LMVis/shader_programs/shaders/phong_fs.glsl +43 -0
- PYME/LMVis/shader_programs/shaders/phong_vs.glsl +45 -0
- PYME/LMVis/shader_programs/shaders/pointsprites_fs.glsl +33 -0
- PYME/LMVis/shader_programs/shaders/pointsprites_vs.glsl +77 -0
- PYME/LMVis/shader_programs/shaders/spheres_fs.glsl +102 -0
- PYME/LMVis/shader_programs/shaders/tessel_fs.glsl +23 -0
- PYME/LMVis/shader_programs/shaders/tessel_vs.glsl +37 -0
- PYME/LMVis/shader_programs/shaders/text_fs.glsl +42 -0
- PYME/LMVis/shader_programs/shaders/text_vs.glsl +84 -0
- PYME/LMVis/shader_programs/shaders/widelines_fs.glsl +19 -0
- PYME/LMVis/shader_programs/shaders/widelines_gs.glsl +56 -0
- PYME/LMVis/shader_programs/shaders/widelines_vs.glsl +51 -0
- PYME/LMVis/statusLog.py +57 -0
- PYME/LMVis/triBlobs.py +142 -0
- PYME/LMVis/view_clipping_pane.py +429 -0
- PYME/LMVis/views.py +275 -0
- PYME/LMVis/visCore.py +1005 -0
- PYME/LMVis/visHelpers.py +880 -0
- PYME/LMVis/visHelpersMin.py +230 -0
- PYME/LMVis/workspaceTree.py +238 -0
- PYME/__init__.py +22 -0
- PYME/cluster/HTTPDataServer.py +1063 -0
- PYME/cluster/HTTPRulePusher.py +382 -0
- PYME/cluster/HTTPTaskPusher.py +377 -0
- PYME/cluster/PYMERuleNodeServer.py +192 -0
- PYME/cluster/PYMERuleServer.py +109 -0
- PYME/cluster/__init__.py +0 -0
- PYME/cluster/clusterUI/accounts/__init__.py +0 -0
- PYME/cluster/clusterUI/accounts/admin.py +85 -0
- PYME/cluster/clusterUI/accounts/forms.py +8 -0
- PYME/cluster/clusterUI/accounts/migrations/0001_initial.py +31 -0
- PYME/cluster/clusterUI/accounts/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/accounts/models.py +44 -0
- PYME/cluster/clusterUI/accounts/templates/accounts/user_form.html +13 -0
- PYME/cluster/clusterUI/accounts/templates/registration/initial_complete.html +6 -0
- PYME/cluster/clusterUI/accounts/templates/registration/initial_confirm.html +13 -0
- PYME/cluster/clusterUI/accounts/templates/registration/initial_done.html +7 -0
- PYME/cluster/clusterUI/accounts/templates/registration/verification.html +2 -0
- PYME/cluster/clusterUI/accounts/templates/registration/verification_subject.txt +1 -0
- PYME/cluster/clusterUI/accounts/urls.py +19 -0
- PYME/cluster/clusterUI/accounts/views.py +36 -0
- PYME/cluster/clusterUI/clusterUI/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterUI/settings.py +147 -0
- PYME/cluster/clusterUI/clusterUI/urls.py +31 -0
- PYME/cluster/clusterUI/clusterUI/wsgi.py +16 -0
- PYME/cluster/clusterUI/clusterbrowser/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterbrowser/admin.py +3 -0
- PYME/cluster/clusterUI/clusterbrowser/apps.py +7 -0
- PYME/cluster/clusterUI/clusterbrowser/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterbrowser/models.py +5 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/base.html +129 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/dirlisting.html +231 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/form_new_folder.html +18 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/form_upload_file.html +17 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/lightlisting.html +25 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/registration/login.html +38 -0
- PYME/cluster/clusterUI/clusterbrowser/urls.py +10 -0
- PYME/cluster/clusterUI/clusterbrowser/views.py +148 -0
- PYME/cluster/clusterUI/clusterstatus/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterstatus/admin.py +3 -0
- PYME/cluster/clusterUI/clusterstatus/apps.py +7 -0
- PYME/cluster/clusterUI/clusterstatus/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterstatus/models.py +5 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/load_content.html +29 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/queue_info.html +28 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/queue_info_content.html +50 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/status_dash.html +29 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/status_dash_content.html +90 -0
- PYME/cluster/clusterUI/clusterstatus/urls.py +9 -0
- PYME/cluster/clusterUI/clusterstatus/views.py +69 -0
- PYME/cluster/clusterUI/clusterui_tornado.py +117 -0
- PYME/cluster/clusterUI/deploy.py +62 -0
- PYME/cluster/clusterUI/localization/__init__.py +0 -0
- PYME/cluster/clusterUI/localization/admin.py +3 -0
- PYME/cluster/clusterUI/localization/apps.py +7 -0
- PYME/cluster/clusterUI/localization/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/localization/models.py +5 -0
- PYME/cluster/clusterUI/localization/templates/localization/settings_form.html +67 -0
- PYME/cluster/clusterUI/localization/urls.py +10 -0
- PYME/cluster/clusterUI/localization/views.py +170 -0
- PYME/cluster/clusterUI/manage.py +17 -0
- PYME/cluster/clusterUI/recipes/__init__.py +0 -0
- PYME/cluster/clusterUI/recipes/admin.py +3 -0
- PYME/cluster/clusterUI/recipes/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/recipes/models.py +3 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/extra_inputs.html +35 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/form_recipe.html +82 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/input_list.html +7 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editor.html +28 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editor_common.html +46 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editrun.html +93 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_standalone.html +100 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_template.html +109 -0
- PYME/cluster/clusterUI/recipes/urls.py +17 -0
- PYME/cluster/clusterUI/recipes/views.py +109 -0
- PYME/cluster/cluster_of_one.py +204 -0
- PYME/cluster/dataserver_wsgi.py +615 -0
- PYME/cluster/distribution.py +71 -0
- PYME/cluster/rulenodeserver.py +487 -0
- PYME/cluster/rules.py +979 -0
- PYME/cluster/ruleserver.py +1106 -0
- PYME/cluster/status.py +101 -0
- PYME/cluster/taskWorkerHTTP.py +522 -0
- PYME/cluster/webdav.py +1102 -0
- PYME/config.py +659 -0
- PYME/contrib/TextCtrlAutoComplete.py +582 -0
- PYME/contrib/__init__.py +7 -0
- PYME/contrib/aniso/__init__.py +2 -0
- PYME/contrib/aniso/aniso.py +268 -0
- PYME/contrib/auiFloatBook.py +94 -0
- PYME/contrib/congrid.py +127 -0
- PYME/contrib/dispatch/__init__.py +19 -0
- PYME/contrib/dispatch/dispatcher.py +289 -0
- PYME/contrib/gohlke/__init__.py +1 -0
- PYME/contrib/gohlke/_tifffile.cp313-win_amd64.dll.a +0 -0
- PYME/contrib/gohlke/_tifffile.cp313-win_amd64.pyd +0 -0
- PYME/contrib/gohlke/czifile.py +1289 -0
- PYME/contrib/gohlke/fcsfiles.py +514 -0
- PYME/contrib/gohlke/setup.py +54 -0
- PYME/contrib/gohlke/tifffile.py +3095 -0
- PYME/contrib/listctrlMixins.py +896 -0
- PYME/contrib/lzw.py +838 -0
- PYME/contrib/pad/__init__.py +13 -0
- PYME/contrib/pad/info_pad.py +18 -0
- PYME/contrib/pad/pad.py +670 -0
- PYME/contrib/setup.py +38 -0
- PYME/contrib/wxPlotPanel.py +137 -0
- PYME/experimental/SimReconstruction.py +49 -0
- PYME/experimental/__init__.pxd +0 -0
- PYME/experimental/__init__.py +4 -0
- PYME/experimental/_octree.cp313-win_amd64.dll.a +0 -0
- PYME/experimental/_octree.cp313-win_amd64.pyd +0 -0
- PYME/experimental/_octree.pyx +477 -0
- PYME/experimental/_treap.cp313-win_amd64.dll.a +0 -0
- PYME/experimental/_treap.cp313-win_amd64.pyd +0 -0
- PYME/experimental/_treap.pyx +267 -0
- PYME/experimental/_triangle_mesh.cp313-win_amd64.dll.a +0 -0
- PYME/experimental/_triangle_mesh.cp313-win_amd64.pyd +0 -0
- PYME/experimental/_triangle_mesh.pxd +149 -0
- PYME/experimental/_triangle_mesh.pyx +2787 -0
- PYME/experimental/aqavg.py +40 -0
- PYME/experimental/dcimgFileChucker.py +375 -0
- PYME/experimental/dcimgSpoolShim.py +174 -0
- PYME/experimental/dcimg_chuck_test.py +78 -0
- PYME/experimental/dual_marching_cubes.py +801 -0
- PYME/experimental/dual_marching_cubes_v2.py +645 -0
- PYME/experimental/expectationMaximisation.py +298 -0
- PYME/experimental/func_octree.cp313-win_amd64.dll.a +0 -0
- PYME/experimental/func_octree.cp313-win_amd64.pyd +0 -0
- PYME/experimental/func_octree.pyx +381 -0
- PYME/experimental/fusionRadial.py +520 -0
- PYME/experimental/fusionUtils.py +522 -0
- PYME/experimental/isosurface.py +147 -0
- PYME/experimental/labview_spooling_hacks.py +48 -0
- PYME/experimental/marching_cubes.py +811 -0
- PYME/experimental/marching_tetrahedra.py +343 -0
- PYME/experimental/modified_marching_cubes.py +1245 -0
- PYME/experimental/music.py +25 -0
- PYME/experimental/octree.py +188 -0
- PYME/experimental/pSpaceMap.py +34 -0
- PYME/experimental/pointFitConfoc.py +112 -0
- PYME/experimental/scanner_control.py +107 -0
- PYME/experimental/setup.py +109 -0
- PYME/experimental/spark.py +31 -0
- PYME/experimental/tcHist.py +71 -0
- PYME/experimental/treap.py +262 -0
- PYME/experimental/triangle_mesh.py +2287 -0
- PYME/experimental/triangle_mesh_utils.cp313-win_amd64.dll.a +0 -0
- PYME/experimental/triangle_mesh_utils.cp313-win_amd64.pyd +0 -0
- PYME/experimental/triangle_utils.py +87 -0
- PYME/experimental/triangular_mesh.py +2255 -0
- PYME/experimental/zMotionArtifactUtils.py +55 -0
- PYME/localization/FitFactories/AstigGaussFitFR.py +175 -0
- PYME/localization/FitFactories/AstigGaussGPUFitFR.py +326 -0
- PYME/localization/FitFactories/BeadConvolvedAstigGaussFit.py +206 -0
- PYME/localization/FitFactories/ChecksumFR.py +82 -0
- PYME/localization/FitFactories/ChecksumGPUFR.py +213 -0
- PYME/localization/FitFactories/ChecksumMultifitSR.py +86 -0
- PYME/localization/FitFactories/ConfocCOIR.py +93 -0
- PYME/localization/FitFactories/Dumbell3DFitR.py +193 -0
- PYME/localization/FitFactories/DumbellFitR.py +163 -0
- PYME/localization/FitFactories/FFBase.py +403 -0
- PYME/localization/FitFactories/Gauss3DFitR.py +213 -0
- PYME/localization/FitFactories/GaussFitConstrR.py +177 -0
- PYME/localization/FitFactories/GaussMultifitLinesR.py +351 -0
- PYME/localization/FitFactories/GaussMultifitR.py +326 -0
- PYME/localization/FitFactories/GaussMultifitSR.py +373 -0
- PYME/localization/FitFactories/InterpFitR.py +236 -0
- PYME/localization/FitFactories/InterpFitWFR.py +111 -0
- PYME/localization/FitFactories/Interpolators/CSInterpolator.py +148 -0
- PYME/localization/FitFactories/Interpolators/CubeSInterpolatorP.py +121 -0
- PYME/localization/FitFactories/Interpolators/CubicSplineInterpolator.py +69 -0
- PYME/localization/FitFactories/Interpolators/LinearInterpolator.py +135 -0
- PYME/localization/FitFactories/Interpolators/LinearPInterpolatorP.py +95 -0
- PYME/localization/FitFactories/Interpolators/__init__.py +33 -0
- PYME/localization/FitFactories/Interpolators/baseInterpolator.py +202 -0
- PYME/localization/FitFactories/LatFitCOIR.py +82 -0
- PYME/localization/FitFactories/LatGaussFitFR.py +220 -0
- PYME/localization/FitFactories/LatObjFindFR.py +85 -0
- PYME/localization/FitFactories/LatPSFFitR.py +142 -0
- PYME/localization/FitFactories/MultiviewFitInterpNR.py +400 -0
- PYME/localization/FitFactories/PRInterpFitQR.py +192 -0
- PYME/localization/FitFactories/PRInterpFitR.py +223 -0
- PYME/localization/FitFactories/ROIExtractNR.py +93 -0
- PYME/localization/FitFactories/SpecGaussFitFR.py +174 -0
- PYME/localization/FitFactories/SplitterFitCOIR.py +142 -0
- PYME/localization/FitFactories/SplitterFitFNR.py +312 -0
- PYME/localization/FitFactories/SplitterFitFusionR.py +318 -0
- PYME/localization/FitFactories/SplitterFitInterpBNR.py +357 -0
- PYME/localization/FitFactories/SplitterFitInterpNR.py +343 -0
- PYME/localization/FitFactories/SplitterFitScavNR.py +352 -0
- PYME/localization/FitFactories/SplitterMultifitSR.py +410 -0
- PYME/localization/FitFactories/SplitterObjFindR.py +194 -0
- PYME/localization/FitFactories/SplitterROIExtractNR.py +91 -0
- PYME/localization/FitFactories/SplitterShiftEstFR.py +230 -0
- PYME/localization/FitFactories/__init__.py +103 -0
- PYME/localization/FitFactories/fitCommon.py +195 -0
- PYME/localization/FitFactories/zEstimators/__init__.py +29 -0
- PYME/localization/FitFactories/zEstimators/astigEstimator.py +173 -0
- PYME/localization/FitFactories/zEstimators/biplaneEstimator.py +209 -0
- PYME/localization/FitFactories/zEstimators/genericDualEstimator.py +232 -0
- PYME/localization/FitFactories/zEstimators/genericEstimator.py +224 -0
- PYME/localization/FitFactories/zEstimators/priEstimator.py +255 -0
- PYME/localization/MetaDataEdit.py +543 -0
- PYME/localization/Test/30_9_series_A_1.sf +0 -0
- PYME/localization/Test/PRI.md +45 -0
- PYME/localization/Test/PRI_qr.md +52 -0
- PYME/localization/Test/PRI_r.md +52 -0
- PYME/localization/Test/__init__.py +22 -0
- PYME/localization/Test/astig.md +50 -0
- PYME/localization/Test/astigCOI.md +50 -0
- PYME/localization/Test/astig_gauss.md +52 -0
- PYME/localization/Test/astig_pe.md +50 -0
- PYME/localization/Test/astig_splitter.md +66 -0
- PYME/localization/Test/astig_splitterCOI.md +67 -0
- PYME/localization/Test/astig_splitterQ.md +66 -0
- PYME/localization/Test/astig_theory.md +50 -0
- PYME/localization/Test/astig_theory.psf +0 -0
- PYME/localization/Test/astig_theory.tif +0 -0
- PYME/localization/Test/beads1.psf +0 -0
- PYME/localization/Test/beads1.tif +0 -0
- PYME/localization/Test/biplane_splitter.md +75 -0
- PYME/localization/Test/biplane_splitter2.md +103 -0
- PYME/localization/Test/biplane_splitter3.md +115 -0
- PYME/localization/Test/defoc.md +48 -0
- PYME/localization/Test/dumbell_3d.md +52 -0
- PYME/localization/Test/fitTestJig.py +172 -0
- PYME/localization/Test/fitTestJigSCMOS.py +487 -0
- PYME/localization/Test/fitTestJigWC.py +225 -0
- PYME/localization/Test/gauss.md +50 -0
- PYME/localization/Test/gaussCOI.md +50 -0
- PYME/localization/Test/pri_pe.md +50 -0
- PYME/localization/Test/pri_theory.md +51 -0
- PYME/localization/Test/pri_theory.psf +0 -0
- PYME/localization/Test/pri_theory.tif +0 -0
- PYME/localization/Test/psf_astig.psf +0 -0
- PYME/localization/Test/psf_astig.tif +0 -0
- PYME/localization/Test/psf_astig_bg_d.psf +0 -0
- PYME/localization/Test/psf_astig_bg_d.tif +0 -0
- PYME/localization/Test/psf_astig_pe.psf +0 -0
- PYME/localization/Test/psf_astig_pe.tif +0 -0
- PYME/localization/Test/psf_decon.psf +0 -0
- PYME/localization/Test/psf_decon.tif +0 -0
- PYME/localization/Test/psf_decon_pe.psf +0 -0
- PYME/localization/Test/psf_decon_pe.tif +0 -0
- PYME/localization/Test/psf_guess.psf +0 -0
- PYME/localization/Test/splitter.md +63 -0
- PYME/localization/Test/splitter_scav.md +63 -0
- PYME/localization/Test/test.psf +0 -0
- PYME/localization/Test/test.tif +0 -0
- PYME/localization/Test/test_decon.psf +0 -0
- PYME/localization/Test/test_decon.tif +0 -0
- PYME/localization/Test/test_pe.psf +0 -0
- PYME/localization/Test/test_pe.tif +0 -0
- PYME/localization/Test/wf_theory.psf +0 -0
- PYME/localization/Test/wf_theory2.psf +0 -0
- PYME/localization/__init__.py +17 -0
- PYME/localization/autopsf/__init__.py +1 -0
- PYME/localization/autopsf/autopsf.py +486 -0
- PYME/localization/autopsf/roifit.py +310 -0
- PYME/localization/cInterp/__init__.py +24 -0
- PYME/localization/cInterp/cInterp.cp313-win_amd64.dll.a +0 -0
- PYME/localization/cInterp/cInterp.cp313-win_amd64.pyd +0 -0
- PYME/localization/cInterp/setup.py +54 -0
- PYME/localization/cModels/__init__.py +24 -0
- PYME/localization/cModels/gauss_app.cp313-win_amd64.dll.a +0 -0
- PYME/localization/cModels/gauss_app.cp313-win_amd64.pyd +0 -0
- PYME/localization/ofind.py +444 -0
- PYME/localization/ofind3d.py +306 -0
- PYME/localization/ofind_nofilt.py +128 -0
- PYME/localization/ofind_pri.py +478 -0
- PYME/localization/ofind_split.py +399 -0
- PYME/localization/ofind_xcorr.py +351 -0
- PYME/localization/ofind_xcorr_fw.py +441 -0
- PYME/localization/remFitBuf.py +657 -0
- PYME/localization/setup.py +56 -0
- PYME/localization/splitting.py +240 -0
- PYME/localization/twist.py +60 -0
- PYME/misc/TiSettings.py +36 -0
- PYME/misc/TiffImagePlugin.py +838 -0
- PYME/misc/VolProj.py +144 -0
- PYME/misc/__init__.py +25 -0
- PYME/misc/aligned_array.py +10 -0
- PYME/misc/aniso.py +29 -0
- PYME/misc/big_sur_fix.py +20 -0
- PYME/misc/check_for_updates.py +139 -0
- PYME/misc/colormaps.py +199 -0
- PYME/misc/colorsys.py +201 -0
- PYME/misc/computerName.py +33 -0
- PYME/misc/coverslipGeometries.py +60 -0
- PYME/misc/cython_numpy_monkey.py +40 -0
- PYME/misc/depGraph.py +406 -0
- PYME/misc/dirSize.py +31 -0
- PYME/misc/diskCleanup.py +64 -0
- PYME/misc/djangoRecarray.py +57 -0
- PYME/misc/django_widgets.py +27 -0
- PYME/misc/editgrid.py +101 -0
- PYME/misc/eventSpy.py +122 -0
- PYME/misc/exceptions.py +30 -0
- PYME/misc/facsPlot.py +89 -0
- PYME/misc/fbpIcons.py +90 -0
- PYME/misc/fftw_compat.py +28 -0
- PYME/misc/findCycles.py +91 -0
- PYME/misc/fortran_interrupt_defeat.py +43 -0
- PYME/misc/glassModel.py +64 -0
- PYME/misc/hash32.py +41 -0
- PYME/misc/hillcurve.py +88 -0
- PYME/misc/hybrid_ns.py +84 -0
- PYME/misc/kdFit.py +72 -0
- PYME/misc/locate.py +10 -0
- PYME/misc/memUsage.py +65 -0
- PYME/misc/memmap.py +52 -0
- PYME/misc/mock_ctypes.py +28 -0
- PYME/misc/mock_traits.py +59 -0
- PYME/misc/mock_traitsui.py +29 -0
- PYME/misc/pyme_zeroconf.py +287 -0
- PYME/misc/pyro_tracebacks.py +32 -0
- PYME/misc/read_agf.py +605 -0
- PYME/misc/sffake.py +16 -0
- PYME/misc/snells.py +71 -0
- PYME/misc/sqlite_ns.py +132 -0
- PYME/misc/sqlitendarray.py +56 -0
- PYME/misc/taskDef.py +44 -0
- PYME/misc/tempDB.py +56 -0
- PYME/misc/wxThread.py +33 -0
- PYME/misc/zemax.py +259 -0
- PYME/misc/zernike.py +151 -0
- PYME/pyme_warnings.py +70 -0
- PYME/recipes/Recipes/STEDDeconvolution.yaml +14 -0
- PYME/recipes/Recipes/STEDMinistacks.yaml +15 -0
- PYME/recipes/Recipes/STED_COP3.yaml +25 -0
- PYME/recipes/Recipes/blobMeas.yaml +19 -0
- PYME/recipes/Recipes/blobMeas2.yaml +37 -0
- PYME/recipes/Recipes/blobMeasSR.yaml +66 -0
- PYME/recipes/Recipes/coloc.yaml +43 -0
- PYME/recipes/Recipes/coloc_roi_masked.yaml +46 -0
- PYME/recipes/Recipes/multiblob.yaml +38 -0
- PYME/recipes/Recipes/pre_particleTracking.yaml +30 -0
- PYME/recipes/Recipes/segmentAndMeasureLoci.yaml +41 -0
- PYME/recipes/__init__.py +6 -0
- PYME/recipes/acquisition.py +158 -0
- PYME/recipes/bakeshop.py +32 -0
- PYME/recipes/base.py +1393 -0
- PYME/recipes/batchProcess.py +147 -0
- PYME/recipes/filters.py +394 -0
- PYME/recipes/fudges.py +41 -0
- PYME/recipes/graphing.py +108 -0
- PYME/recipes/html_recipe_editor.py +90 -0
- PYME/recipes/localisations.py +1386 -0
- PYME/recipes/machine_learning.py +286 -0
- PYME/recipes/measurement.py +1062 -0
- PYME/recipes/modules.py +50 -0
- PYME/recipes/multiview.py +435 -0
- PYME/recipes/output.py +667 -0
- PYME/recipes/pointcloud.py +510 -0
- PYME/recipes/processing.py +2954 -0
- PYME/recipes/pyramid.py +206 -0
- PYME/recipes/recipe.py +965 -0
- PYME/recipes/recipeGui.py +1029 -0
- PYME/recipes/recipeLayout.py +499 -0
- PYME/recipes/runRecipe.py +140 -0
- PYME/recipes/setup.py +37 -0
- PYME/recipes/simulation.py +91 -0
- PYME/recipes/skfilters.py +143 -0
- PYME/recipes/surface_fitting.py +776 -0
- PYME/recipes/tablefilters.py +275 -0
- PYME/recipes/tracking.py +343 -0
- PYME/recipes/traits.py +157 -0
- PYME/recipes/vertical_recipe_display.py +373 -0
- PYME/resources/__init__.py +23 -0
- PYME/resources/config_template/distributor.yaml +14 -0
- PYME/resources/config_template/nodeserver.yaml +15 -0
- PYME/resources/icons/LUT.png +0 -0
- PYME/resources/icons/YSM_Shield.png +0 -0
- PYME/resources/icons/YSM_logo.png +0 -0
- PYME/resources/icons/arrow.png +0 -0
- PYME/resources/icons/crosshairs.png +0 -0
- PYME/resources/icons/line_select.png +0 -0
- PYME/resources/icons/logo_fmhs.png +0 -0
- PYME/resources/icons/media-playback-pause.png +0 -0
- PYME/resources/icons/media-playback-start.png +0 -0
- PYME/resources/icons/media-skip-backward.png +0 -0
- PYME/resources/icons/media-skip-forward.png +0 -0
- PYME/resources/icons/mesh.png +0 -0
- PYME/resources/icons/mesh.svg +28 -0
- PYME/resources/icons/pmacquire.icns +0 -0
- PYME/resources/icons/pmacquire.ico +0 -0
- PYME/resources/icons/pmanal.icns +0 -0
- PYME/resources/icons/pmanal.ico +0 -0
- PYME/resources/icons/pmvis.icns +0 -0
- PYME/resources/icons/pmvis.ico +0 -0
- PYME/resources/icons/points.png +0 -0
- PYME/resources/icons/points.svg +16 -0
- PYME/resources/icons/pymeLogo.png +0 -0
- PYME/resources/icons/rect_select.png +0 -0
- PYME/resources/icons/squiggle_select.png +0 -0
- PYME/resources/icons/text3800.icns +0 -0
- PYME/resources/icons/text3800.ico +0 -0
- PYME/resources/icons/text3800.png +0 -0
- PYME/resources/icons/text3800.tif +0 -0
- PYME/resources/icons/text5377.icns +0 -0
- PYME/resources/icons/text5377.ico +0 -0
- PYME/resources/icons/text5377.png +0 -0
- PYME/resources/icons/tracks.png +0 -0
- PYME/resources/icons/tracks.svg +19 -0
- PYME/resources/icons/view-front.png +0 -0
- PYME/resources/icons/view-home.png +0 -0
- PYME/resources/icons/view-right.png +0 -0
- PYME/resources/icons/view-top.png +0 -0
- PYME/resources/test_datasets/README.md +8 -0
- PYME/resources/test_datasets/t_im.tif +0 -0
- PYME/resources/test_datasets/test_csv.csv +4282 -0
- PYME/resources/test_datasets/test_hdf.hdf +0 -0
- PYME/resources/web/rule_inline.html +21 -0
- PYME/resources/web/ruleserver.html +75 -0
- PYME/resources/web/static/bootstrap.min.js +7 -0
- PYME/resources/web/static/cluster.css +137 -0
- PYME/resources/web/static/css/bootstrap-theme.css +587 -0
- PYME/resources/web/static/css/bootstrap-theme.min.css +6 -0
- PYME/resources/web/static/css/bootstrap.css +6757 -0
- PYME/resources/web/static/css/bootstrap.min.css +6 -0
- PYME/resources/web/static/css/flat_design_colors_full.css +306 -0
- PYME/resources/web/static/css/recipe_editor.css +106 -0
- PYME/resources/web/static/dashboard.css +106 -0
- PYME/resources/web/static/fileselector.js +77 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.eot +0 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.svg +288 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.ttf +0 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.woff +0 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.woff2 +0 -0
- PYME/resources/web/static/images/osd_flat/LICENSE.txt +116 -0
- PYME/resources/web/static/images/osd_flat/README.md +9 -0
- PYME/resources/web/static/images/osd_flat/fullpage_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/fullpage_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/fullpage_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/fullpage_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_rest.png +0 -0
- PYME/resources/web/static/jigna-vue-bare.js +1395 -0
- PYME/resources/web/static/jquery.min.js +2 -0
- PYME/resources/web/static/jstree.min.js +6 -0
- PYME/resources/web/static/openSeadragonGL.js +102 -0
- PYME/resources/web/static/openseadragon-svg-overlay.js +103 -0
- PYME/resources/web/static/openseadragon-viewerinputhook.min.js +6 -0
- PYME/resources/web/static/openseadragon.min.js +9 -0
- PYME/resources/web/static/recipe_editor.js +119 -0
- PYME/resources/web/static/shaders/fragment/lut.glsl +20 -0
- PYME/resources/web/static/shaders/fragment/none.glsl +17 -0
- PYME/resources/web/static/shaders/fragment/outline.glsl +43 -0
- PYME/resources/web/static/shaders/fragment/rect.glsl +7 -0
- PYME/resources/web/static/shaders/fragment/sobel3.glsl +71 -0
- PYME/resources/web/static/shaders/fragment/white.glsl +4 -0
- PYME/resources/web/static/shaders/vertex/rect.glsl +22 -0
- PYME/resources/web/static/shaders/vertex/square.glsl +9 -0
- PYME/resources/web/static/utils.js +3 -0
- PYME/resources/web/static/viaWebGL.js +217 -0
- PYME/setup.py +109 -0
- PYME/setup_exe.py +57 -0
- PYME/simulation/__init__.py +0 -0
- PYME/simulation/locify.py +319 -0
- PYME/simulation/pointsets.py +279 -0
- PYME/simulation/wormlike.py +99 -0
- PYME/simulation/wormlike2.py +198 -0
- PYME/simulation/wormlike3.py +197 -0
- PYME/simulation/wormlike_curled.py +104 -0
- PYME/tileviewer/__init__.py +0 -0
- PYME/tileviewer/templates/roi_list.html +12 -0
- PYME/tileviewer/templates/tileviewer.html +247 -0
- PYME/tileviewer/tileviewer.py +207 -0
- PYME/ui/AUIFrame.py +279 -0
- PYME/ui/MetadataTree.py +469 -0
- PYME/ui/__init__.py +4 -0
- PYME/ui/about_dlg.py +29 -0
- PYME/ui/autoFoldPanel.py +643 -0
- PYME/ui/cascading_layout.py +45 -0
- PYME/ui/crop_dialog.py +145 -0
- PYME/ui/custom_traits_editors.py +508 -0
- PYME/ui/editFilterDialog.py +80 -0
- PYME/ui/editList.py +40 -0
- PYME/ui/fastGraph.py +240 -0
- PYME/ui/filterPane.py +348 -0
- PYME/ui/histLimits.py +543 -0
- PYME/ui/layerFoldPanel.py +232 -0
- PYME/ui/manualFoldPanel.py +870 -0
- PYME/ui/mytimer.py +116 -0
- PYME/ui/patch_traitsui.py +151 -0
- PYME/ui/progress.py +160 -0
- PYME/ui/recArrayView.py +145 -0
- PYME/ui/selection.py +71 -0
- PYME/ui/shell.py +37 -0
- PYME/ui/traitsui_constants.py +91 -0
- PYME/ui/wx_compat.py +43 -0
- PYME/update_version.py +159 -0
- PYME/util/__init__.py +3 -0
- PYME/util/authenticate.py +164 -0
- PYME/util/execfile.py +21 -0
- PYME/util/fProfile/__init__.py +1 -0
- PYME/util/fProfile/convertProfile.py +117 -0
- PYME/util/fProfile/fProfile.py +162 -0
- PYME/util/fProfile/html/404.html +60 -0
- PYME/util/fProfile/html/css/main.css +258 -0
- PYME/util/fProfile/html/css/normalize.css +427 -0
- PYME/util/fProfile/html/css/normalize.min.css +1 -0
- PYME/util/fProfile/html/index.html +64 -0
- PYME/util/fProfile/html/js/main.js +492 -0
- PYME/util/fProfile/html/js/plugins.js +24 -0
- PYME/util/fProfile/html/js/vendor/crossfilter.min.js +1 -0
- PYME/util/fProfile/html/js/vendor/jquery-1.11.2.min.js +4 -0
- PYME/util/fProfile/html/js/vendor/modernizr-2.8.3.min.js +4 -0
- PYME/util/fProfile/html/js/vendor/tinycolor-min.js +4 -0
- PYME/util/fProfile/viewProfile.py +30 -0
- PYME/util/install_dependencies.py +95 -0
- PYME/util/log_verbosity.py +11 -0
- PYME/util/mProfile/__init__.py +1 -0
- PYME/util/mProfile/colorize_db_t.py +297 -0
- PYME/util/mProfile/mProfile.py +164 -0
- PYME/util/mProfile/p.py +101 -0
- PYME/util/mProfile/tProfile.py +165 -0
- PYME/util/pymelauncher.py +47 -0
- PYME/util/shmarray/__init__.py +0 -0
- PYME/util/shmarray/shmTest.py +74 -0
- PYME/util/shmarray/shmarray.py +165 -0
- PYME/util/webframework.py +365 -0
- PYME/version.py +62 -0
- python_microscopy-25.11.20.dist-info/METADATA +68 -0
- python_microscopy-25.11.20.dist-info/RECORD +1278 -0
- python_microscopy-25.11.20.dist-info/WHEEL +4 -0
- python_microscopy-25.11.20.dist-info/entry_points.txt +18 -0
|
@@ -0,0 +1,1050 @@
|
|
|
1
|
+
#!/usr/bin/python
|
|
2
|
+
|
|
3
|
+
##################
|
|
4
|
+
# funcs.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
|
+
#imports for timing
|
|
25
|
+
#import requests
|
|
26
|
+
#import tables
|
|
27
|
+
#import numpy as np
|
|
28
|
+
#import yaml
|
|
29
|
+
|
|
30
|
+
#import wx
|
|
31
|
+
#from PYME.Acquire import previewaquisator as previewaquisator
|
|
32
|
+
from PYME.Acquire.frameWrangler import FrameWrangler
|
|
33
|
+
|
|
34
|
+
import PYME.Acquire.protocol as protocol
|
|
35
|
+
|
|
36
|
+
from PYME.IO import MetaDataHandler
|
|
37
|
+
from PYME.Acquire.Hardware import ccdCalibrator
|
|
38
|
+
from PYME.Acquire.SpoolController import SpoolController
|
|
39
|
+
from PYME.Acquire.ActionManager import ActionManager
|
|
40
|
+
|
|
41
|
+
import sqlite3
|
|
42
|
+
|
|
43
|
+
import os
|
|
44
|
+
import datetime
|
|
45
|
+
|
|
46
|
+
import warnings
|
|
47
|
+
from PYME.contrib import dispatch
|
|
48
|
+
|
|
49
|
+
#register handlers for ndarrays
|
|
50
|
+
from PYME.misc import sqlitendarray
|
|
51
|
+
|
|
52
|
+
import weakref
|
|
53
|
+
import re
|
|
54
|
+
|
|
55
|
+
import logging
|
|
56
|
+
logger = logging.getLogger(__name__)
|
|
57
|
+
|
|
58
|
+
from contextlib import contextmanager
|
|
59
|
+
|
|
60
|
+
#class DummyJoystick(object):
|
|
61
|
+
# def enable(*args, **kwargs):
|
|
62
|
+
# pass
|
|
63
|
+
|
|
64
|
+
class StateHandler(object):
|
|
65
|
+
def __init__(self, key, getFcn=None, setFcn=None, needCamRestart = False):
|
|
66
|
+
"""Define a state-change handler for a give state key, based on supplied
|
|
67
|
+
get and set functions which interact with the underlying hardware.
|
|
68
|
+
|
|
69
|
+
This wrapper class serves two functions - a) allowing the get and set methods
|
|
70
|
+
to be stored under a single dictionary key in the StateManager, and b)
|
|
71
|
+
making sure a signal is fired when the state changes.
|
|
72
|
+
|
|
73
|
+
Parameters
|
|
74
|
+
----------
|
|
75
|
+
|
|
76
|
+
key : string
|
|
77
|
+
The hardware key - e.g. "Positioning.x", or "Lasers.405.Power". This
|
|
78
|
+
will also be how the hardware state is recorder in the metadata.
|
|
79
|
+
getFcn : function
|
|
80
|
+
The function to call to get the value of the parameter. Should take
|
|
81
|
+
one parameter which is the value to get
|
|
82
|
+
setFcn : function
|
|
83
|
+
The function to call to set the value of the parameter. Should take
|
|
84
|
+
one parameter which is the value to set. Not providing a setFcn results
|
|
85
|
+
in a read-only property.
|
|
86
|
+
needCamRestart : bool
|
|
87
|
+
Does this absolutely need a camera restart (e.g. we are changing which
|
|
88
|
+
camera we are using). Will override other preferences.
|
|
89
|
+
|
|
90
|
+
"""
|
|
91
|
+
self.getValue = getFcn
|
|
92
|
+
self.setFcn = setFcn
|
|
93
|
+
self.key = key
|
|
94
|
+
|
|
95
|
+
self.needCamRestart = needCamRestart
|
|
96
|
+
|
|
97
|
+
self.onChange = dispatch.Signal()
|
|
98
|
+
|
|
99
|
+
def setValue(self, value, force=False):
|
|
100
|
+
"""Set the state of the controlled hardware to the given value and fire
|
|
101
|
+
a signal. The underlying function will not be called if old and new values
|
|
102
|
+
are the same unless force=True.
|
|
103
|
+
"""
|
|
104
|
+
if force or (not self.getValue() == value):
|
|
105
|
+
if not self.setFcn is None:
|
|
106
|
+
self.setFcn(value)
|
|
107
|
+
self.onChange.send(self, key=self.key, value=value)
|
|
108
|
+
else:
|
|
109
|
+
logging.debug('No set method registered for key %s - assuming immutable' % self.key)
|
|
110
|
+
|
|
111
|
+
class StateManager(object):
|
|
112
|
+
"""Manages object (microscope) state by calling an appropriate state-handler
|
|
113
|
+
for a given key.
|
|
114
|
+
|
|
115
|
+
Looks and behaves like a dictionary to the user, with individual pieces of
|
|
116
|
+
hardware registering themselves to handle individual keys.
|
|
117
|
+
"""
|
|
118
|
+
def __init__(self, scope, handlers = {}):
|
|
119
|
+
self._stateHandlers = {}
|
|
120
|
+
self._cachedStates = {}
|
|
121
|
+
|
|
122
|
+
self._stateHandlers.update(handlers)
|
|
123
|
+
|
|
124
|
+
self.scope = weakref.ref(scope)
|
|
125
|
+
self.stateChanged = dispatch.Signal()
|
|
126
|
+
|
|
127
|
+
def __getitem__(self, key):
|
|
128
|
+
#print key
|
|
129
|
+
try:
|
|
130
|
+
handler = self._stateHandlers[key]
|
|
131
|
+
except KeyError:
|
|
132
|
+
raise KeyError('No handler registered for %s' % key)
|
|
133
|
+
|
|
134
|
+
return handler.getValue()
|
|
135
|
+
|
|
136
|
+
def __setitem__(self, key, value):
|
|
137
|
+
self.setItem(key, value)
|
|
138
|
+
#raise NotImplementedError("Cannot set items via the dictionary interface - use setItem()instead")
|
|
139
|
+
#try:
|
|
140
|
+
# handler = self._stateHandlers[key]
|
|
141
|
+
#except KeyError:
|
|
142
|
+
# raise KeyError('No handler registered for %s' % key)
|
|
143
|
+
#
|
|
144
|
+
#return handler.setState(value)
|
|
145
|
+
|
|
146
|
+
def get(self, key, default=None):
|
|
147
|
+
try:
|
|
148
|
+
return self[key]
|
|
149
|
+
except KeyError:
|
|
150
|
+
if default is not None:
|
|
151
|
+
return default
|
|
152
|
+
else:
|
|
153
|
+
raise
|
|
154
|
+
|
|
155
|
+
def setItem(self, key, value, stopCamera=False, force=False):
|
|
156
|
+
""" Set the value of one of our hardware components
|
|
157
|
+
|
|
158
|
+
Parameters
|
|
159
|
+
----------
|
|
160
|
+
|
|
161
|
+
key : string
|
|
162
|
+
The parameter identifier - e.g. "Positioning.x"
|
|
163
|
+
value : object
|
|
164
|
+
The value to set. This can be anything the registered handler understands
|
|
165
|
+
but designing the handlers to accept something which is easily converted
|
|
166
|
+
to text for the Metadata (see PYME.IO.MetaDataHandler) is advised.
|
|
167
|
+
stopCamera : bool
|
|
168
|
+
Should we stop the camera before setting the value and restart afterwards.
|
|
169
|
+
Useful for things like integration time which might not be able to be
|
|
170
|
+
changed on the fly, but also potentially as a way of achieving hardware
|
|
171
|
+
synchronization.
|
|
172
|
+
force : bool
|
|
173
|
+
Whether we should call the set method even if the current state is
|
|
174
|
+
already the desired state.
|
|
175
|
+
|
|
176
|
+
"""
|
|
177
|
+
|
|
178
|
+
return self.setItems({key:value}, stopCamera, force)
|
|
179
|
+
|
|
180
|
+
def setItems(self, stateDict, stopCamera = False, force=False, ignoreMissing=False):
|
|
181
|
+
"""Set multiple items at once - see setItem for details.
|
|
182
|
+
|
|
183
|
+
Parameters
|
|
184
|
+
----------
|
|
185
|
+
|
|
186
|
+
stateDict : dictionary (or dictionary like object)
|
|
187
|
+
a dictionary of key : value pairs for each piece of hardware which
|
|
188
|
+
wants to be updated.
|
|
189
|
+
stopCamera : bool
|
|
190
|
+
Should we stop the camera before setting the values and restart afterwards?
|
|
191
|
+
Useful for things like integration time which might not be able to be
|
|
192
|
+
changed on the fly, but also potentially as a way of achieving hardware
|
|
193
|
+
synchronization.
|
|
194
|
+
force : bool
|
|
195
|
+
Whether we should call the set method even if the current state is
|
|
196
|
+
already the desired state.
|
|
197
|
+
ignoreMissing : bool
|
|
198
|
+
Should we silently ignore keys that we don't have handlers for. Used
|
|
199
|
+
when setting state from e.g. sequence metadata which might have other
|
|
200
|
+
irrelevent info.
|
|
201
|
+
"""
|
|
202
|
+
|
|
203
|
+
restartCamera = False
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
if stopCamera:
|
|
207
|
+
try:
|
|
208
|
+
restartCamera = self.scope().frameWrangler.isRunning()
|
|
209
|
+
self.scope().frameWrangler.stop()
|
|
210
|
+
except AttributeError:
|
|
211
|
+
logger.error("We don't have a camera yet")
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
for key, value in stateDict.items():
|
|
215
|
+
try:
|
|
216
|
+
handler = self._stateHandlers[key]
|
|
217
|
+
if handler.needCamRestart:
|
|
218
|
+
#our hardware absolutely needs a camera restart -
|
|
219
|
+
#e.g. changing integration time on IXon. Override stopCamera
|
|
220
|
+
#setting and force a restart.
|
|
221
|
+
try:
|
|
222
|
+
if self.scope().frameWrangler.isRunning():
|
|
223
|
+
self.scope().frameWrangler.stop()
|
|
224
|
+
restartCamera = True
|
|
225
|
+
except AttributeError:
|
|
226
|
+
logger.error("We don't have a camera yet")
|
|
227
|
+
|
|
228
|
+
handler.setValue(value, force)
|
|
229
|
+
except KeyError:
|
|
230
|
+
if not ignoreMissing:
|
|
231
|
+
raise KeyError('No handler registered for %s' % key)
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
#logger.debug('sending state changed')
|
|
235
|
+
self.stateChanged.send(self)
|
|
236
|
+
|
|
237
|
+
if restartCamera:
|
|
238
|
+
#logger.debug('preparing framewrangler')
|
|
239
|
+
self.scope().frameWrangler.Prepare()
|
|
240
|
+
logger.debug('restarting framewrangler')
|
|
241
|
+
self.scope().frameWrangler.start()
|
|
242
|
+
logger.debug('restarted framewrangler')
|
|
243
|
+
|
|
244
|
+
#return a function which tells us if we're done (for use as a task)
|
|
245
|
+
return lambda : True
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def update(self, state):
|
|
249
|
+
"""Update state from a dictionary
|
|
250
|
+
|
|
251
|
+
Parameters
|
|
252
|
+
----------
|
|
253
|
+
|
|
254
|
+
state : dict
|
|
255
|
+
A dictionary containing the new state
|
|
256
|
+
"""
|
|
257
|
+
return self.setItems(state)
|
|
258
|
+
|
|
259
|
+
def __len__(self):
|
|
260
|
+
return len(self._stateHandlers)
|
|
261
|
+
|
|
262
|
+
def keys(self):
|
|
263
|
+
return self._stateHandlers.keys()
|
|
264
|
+
|
|
265
|
+
def __repr__(self):
|
|
266
|
+
s = 'StateManager:\n'
|
|
267
|
+
for k in self.keys():
|
|
268
|
+
s += '%s : %s\n' % (repr(k), repr(self[k]))
|
|
269
|
+
|
|
270
|
+
return s
|
|
271
|
+
|
|
272
|
+
def registerHandler(self, key, getFcn = None, setFcn=None, needCamRestart = False):
|
|
273
|
+
"""Register a harware key and the ascociated handlers
|
|
274
|
+
|
|
275
|
+
Parameters
|
|
276
|
+
----------
|
|
277
|
+
|
|
278
|
+
key : string
|
|
279
|
+
The hardware key - e.g. "Positioning.x", or "Lasers.405.Power". This
|
|
280
|
+
will also be how the hardware state is recorded in the metadata.
|
|
281
|
+
getFcn : function
|
|
282
|
+
The function to call to get the value of the parameter. Should take
|
|
283
|
+
one parameter which is the value to get
|
|
284
|
+
setFcn : function
|
|
285
|
+
The function to call to set the value of the parameter. Should take
|
|
286
|
+
one parameter which is the value to set. Not providing a setFcn results
|
|
287
|
+
in a read-only property.
|
|
288
|
+
needCamRestart : bool
|
|
289
|
+
Does this absolutely need a camera restart (e.g. we are changing which
|
|
290
|
+
camera we are using). Will override other preferences.
|
|
291
|
+
|
|
292
|
+
Notes
|
|
293
|
+
-----
|
|
294
|
+
There are a few conventions and special key names which should be observed
|
|
295
|
+
as this is how the camera will find hardware.
|
|
296
|
+
|
|
297
|
+
- Keys should be hierachial, separated by dots
|
|
298
|
+
- Piezos and stages should start with "Positioning.", followed by an axis
|
|
299
|
+
name, and use um as a unit.
|
|
300
|
+
- Lasers should start with "Laser." and define both "<lasername>.Power"
|
|
301
|
+
and "<lasername>.On" (this is to allow lasers with external
|
|
302
|
+
switches/shutters as well as )
|
|
303
|
+
|
|
304
|
+
"""
|
|
305
|
+
self._stateHandlers[key] = StateHandler(key, getFcn, setFcn, needCamRestart)
|
|
306
|
+
|
|
307
|
+
def registerChangeListener(self, key, callback):
|
|
308
|
+
""" Registers a function to be called when the state of a particular
|
|
309
|
+
key changes.
|
|
310
|
+
|
|
311
|
+
The *key* and *value* are provided as keyword arguments to the callback
|
|
312
|
+
the callback should accept have the signature `callback(**kwargs)`,
|
|
313
|
+
or `callback(key, value, **kwargs)`. Other keyword arguments might also
|
|
314
|
+
be given.
|
|
315
|
+
"""
|
|
316
|
+
|
|
317
|
+
self._stateHandlers[key].onChange.connect(callback)
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
class Microscope(object):
|
|
325
|
+
"""
|
|
326
|
+
|
|
327
|
+
Attributes
|
|
328
|
+
----------
|
|
329
|
+
frameWrangler : PYME.Acquire.frameWrangler.FrameWrangler
|
|
330
|
+
Initialized in between hardware initializations and gui initializations.
|
|
331
|
+
|
|
332
|
+
"""
|
|
333
|
+
def __init__(self):
|
|
334
|
+
#list of tuples of form (class, chan, name) describing the instaled piezo channels
|
|
335
|
+
self.piezos = []
|
|
336
|
+
self.lasers = []
|
|
337
|
+
self.hardwareChecks = []
|
|
338
|
+
|
|
339
|
+
#entries should be of the form: "x" : (piezo, channel, multiplier)
|
|
340
|
+
# where multiplyier is what to multiply by to get the units to micrometers
|
|
341
|
+
self.positioning = {}
|
|
342
|
+
self.joystick = None
|
|
343
|
+
|
|
344
|
+
self.cam = None
|
|
345
|
+
self.cameras = {}
|
|
346
|
+
self.camControls = {}
|
|
347
|
+
|
|
348
|
+
self.stackNum = 0
|
|
349
|
+
|
|
350
|
+
#self.WantEventNotification = []
|
|
351
|
+
|
|
352
|
+
self.StatusCallbacks = [] #list of functions which provide status information
|
|
353
|
+
self.CleanupFunctions = [] #list of functions to be called at exit
|
|
354
|
+
self.PACallbacks = [] #list of functions to be called when a new aquisator is created
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
self.saturationThreshold = 16383 #14 bit
|
|
358
|
+
self.lastFrameSaturated = False
|
|
359
|
+
#self.cam.saturationIntervened = False
|
|
360
|
+
|
|
361
|
+
self.microscope_name = None
|
|
362
|
+
|
|
363
|
+
self.saturatedMessage = ''
|
|
364
|
+
|
|
365
|
+
protocol.scope = self
|
|
366
|
+
ccdCalibrator.setScope(self)
|
|
367
|
+
self.initDone = False
|
|
368
|
+
|
|
369
|
+
self._OpenSettingsDB()
|
|
370
|
+
|
|
371
|
+
self.spoolController = SpoolController(self)#, defDir, **kwargs)
|
|
372
|
+
|
|
373
|
+
self.state = StateManager(self)
|
|
374
|
+
|
|
375
|
+
self.state.registerHandler('ActiveCamera', self.GetActiveCameraName, self._SetCamera, True)
|
|
376
|
+
self.state.registerHandler('Camera.IntegrationTime', self._GetActiveCameraIntegrationTime, self._SetActiveCameraIntegrationTime, True)
|
|
377
|
+
self.state.registerHandler('Camera.ROI', self._GetActiveCameraROI, self._SetActiveCameraROI, True)
|
|
378
|
+
self.state.registerHandler('Camera.Binning', self._GetActiveCameraBinning, self._SetActiveCameraBinning, True)
|
|
379
|
+
|
|
380
|
+
self.actions = ActionManager(self)
|
|
381
|
+
|
|
382
|
+
MetaDataHandler.provideStartMetadata.append(self.GenStartMetadata)
|
|
383
|
+
|
|
384
|
+
#provision to set global metadata values in startup script
|
|
385
|
+
self.mdh = MetaDataHandler.NestedClassMDHandler()
|
|
386
|
+
|
|
387
|
+
def EnableJoystick(self, enable=True):
|
|
388
|
+
if not self.joystick is None:
|
|
389
|
+
self.joystick.Enable(enable)
|
|
390
|
+
|
|
391
|
+
def GetPos(self):
|
|
392
|
+
res = {}
|
|
393
|
+
|
|
394
|
+
axes = [k.split('.')[-1] for k in self.state.keys() if k.startswith('Positioning.')]
|
|
395
|
+
|
|
396
|
+
for k in axes:
|
|
397
|
+
res[k] = self.state['Positioning.%s' % k]
|
|
398
|
+
|
|
399
|
+
return res
|
|
400
|
+
|
|
401
|
+
def SetPos(self, **kwargs):
|
|
402
|
+
state_updates = {'Positioning.%s' % k : v for k, v in kwargs.items()}
|
|
403
|
+
self.state.setItems(state_updates)
|
|
404
|
+
|
|
405
|
+
def centre_roi_on(self, x, y):
|
|
406
|
+
"""Convenience function to center the ROI on a given location"""
|
|
407
|
+
dx, dy = self.get_roi_offset()
|
|
408
|
+
|
|
409
|
+
self.SetPos(x=(x-dx), y=(y-dy))
|
|
410
|
+
|
|
411
|
+
def get_roi_centre(self):
|
|
412
|
+
"""Convenience function to get the centre of the ROI
|
|
413
|
+
|
|
414
|
+
exists to allow both automatically and manually specified actions to use the same code
|
|
415
|
+
"""
|
|
416
|
+
dx, dy = self.get_roi_offset()
|
|
417
|
+
pos = self.GetPos()
|
|
418
|
+
|
|
419
|
+
return pos['x'] + dx, pos['y'] + dy
|
|
420
|
+
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
def GetPosRange(self):
|
|
424
|
+
#Todo - fix to use positioning
|
|
425
|
+
res = {}
|
|
426
|
+
for k in self.positioning.keys():
|
|
427
|
+
p, c, m = self.positioning[k]
|
|
428
|
+
if m > 0:
|
|
429
|
+
res[k] = (p.GetMin(c)*m,p.GetMax(c)*m)
|
|
430
|
+
else:
|
|
431
|
+
res[k] = (p.GetMax(c)*m,p.GetMin(c)*m)
|
|
432
|
+
|
|
433
|
+
return res
|
|
434
|
+
|
|
435
|
+
@property
|
|
436
|
+
@contextmanager
|
|
437
|
+
def settingsDB(self):
|
|
438
|
+
fstub = os.path.split(__file__)[0]
|
|
439
|
+
dbfname = os.path.join(fstub, 'PYMESettings.db')
|
|
440
|
+
|
|
441
|
+
settingsDB = sqlite3.connect(dbfname, detect_types=sqlite3.PARSE_DECLTYPES | sqlite3.PARSE_COLNAMES)
|
|
442
|
+
#self.settingsDB.isolation_level = None
|
|
443
|
+
yield(settingsDB)
|
|
444
|
+
|
|
445
|
+
settingsDB.commit()
|
|
446
|
+
settingsDB.close()
|
|
447
|
+
|
|
448
|
+
|
|
449
|
+
def _OpenSettingsDB(self):
|
|
450
|
+
with self.settingsDB as conn:
|
|
451
|
+
tableNames = [a[0] for a in conn.execute('SELECT name FROM sqlite_master WHERE type="table"').fetchall()]
|
|
452
|
+
|
|
453
|
+
if not 'CCDCalibration2' in tableNames:
|
|
454
|
+
conn.execute("CREATE TABLE CCDCalibration2 (time timestamp, temperature integer, serial integer, nominalGains ndarray, trueGains ndarray)")
|
|
455
|
+
if not 'VoxelSizes' in tableNames:
|
|
456
|
+
conn.execute("CREATE TABLE VoxelSizes (ID INTEGER PRIMARY KEY, x REAL, y REAL, name TEXT)")
|
|
457
|
+
if not 'VoxelSizeHistory2' in tableNames:
|
|
458
|
+
conn.execute("CREATE TABLE VoxelSizeHistory2 (time timestamp, sizeID INTEGER, camSerial INTEGER)")
|
|
459
|
+
if not 'StartupTimes' in tableNames:
|
|
460
|
+
conn.execute("CREATE TABLE StartupTimes (component TEXT, time REAL)")
|
|
461
|
+
conn.execute("INSERT INTO StartupTimes VALUES ('total', 5)")
|
|
462
|
+
|
|
463
|
+
def GetPixelSize(self,cam=None):
|
|
464
|
+
"""Get the (sample space) pixel size for the current camera
|
|
465
|
+
|
|
466
|
+
Returns
|
|
467
|
+
-------
|
|
468
|
+
|
|
469
|
+
pixelsize : tuple
|
|
470
|
+
the pixel size in the x and y axes, in um
|
|
471
|
+
"""
|
|
472
|
+
|
|
473
|
+
if cam is None:
|
|
474
|
+
cam = self.cam
|
|
475
|
+
with self.settingsDB as conn:
|
|
476
|
+
currVoxelSizeID = conn.execute("SELECT sizeID FROM VoxelSizeHistory2 WHERE camSerial=? ORDER BY time DESC", (cam.GetSerialNumber(),)).fetchone()
|
|
477
|
+
if not currVoxelSizeID is None:
|
|
478
|
+
voxx, voxy = conn.execute("SELECT x,y FROM VoxelSizes WHERE ID=?", currVoxelSizeID).fetchone()
|
|
479
|
+
|
|
480
|
+
return voxx*cam.GetHorizontalBin(), voxy*cam.GetVerticalBin()
|
|
481
|
+
elif hasattr(cam, 'XVals'): # change to looking for attribute so that wrapped (e.g. multiview) cameras still work
|
|
482
|
+
# read voxel size from directly from our simulated camera
|
|
483
|
+
logger.info('Reading voxel size directly from simulated camera')
|
|
484
|
+
vx_um = float(cam.XVals[1] - cam.XVals[0]) / 1.0e3
|
|
485
|
+
vy_um = float(cam.YVals[1] - cam.YVals[0]) / 1.0e3
|
|
486
|
+
return vx_um * cam.GetHorizontalBin(), vy_um * cam.GetVerticalBin()
|
|
487
|
+
|
|
488
|
+
|
|
489
|
+
def GenStartMetadata(self, mdh):
|
|
490
|
+
"""Collects the metadata we want to record at the start of a sequence
|
|
491
|
+
|
|
492
|
+
Parameters
|
|
493
|
+
----------
|
|
494
|
+
|
|
495
|
+
mdh : object derived from PYME.IO.MetaDataHandler.MDHandlerBase
|
|
496
|
+
The metadata handler to which we should write our metadata
|
|
497
|
+
"""
|
|
498
|
+
try:
|
|
499
|
+
voxx, voxy = self.GetPixelSize()
|
|
500
|
+
mdh.setEntry('voxelsize.x', voxx)
|
|
501
|
+
mdh.setEntry('voxelsize.y', voxy)
|
|
502
|
+
mdh.setEntry('voxelsize.units', 'um')
|
|
503
|
+
except TypeError:
|
|
504
|
+
logger.error('No pixel size setting available for current camera - please configure the pixel size')
|
|
505
|
+
pass
|
|
506
|
+
|
|
507
|
+
for p in self.piezos:
|
|
508
|
+
mdh.setEntry('Positioning.%s' % p[2].replace(' ', '_').replace('-', '_'), p[0].GetPos(p[1]))
|
|
509
|
+
|
|
510
|
+
for k, v in self.GetPos().items():
|
|
511
|
+
mdh.setEntry('Positioning.%s' % k.replace(' ', '_').replace('-', '_'), v)
|
|
512
|
+
|
|
513
|
+
try:
|
|
514
|
+
mdh['CameraOrientation.Rotate'] = self.cam.orientation['rotate']
|
|
515
|
+
mdh['CameraOrientation.FlipX'] = self.cam.orientation['flipx']
|
|
516
|
+
mdh['CameraOrientation.FlipY'] = self.cam.orientation['flipy']
|
|
517
|
+
except AttributeError:
|
|
518
|
+
pass
|
|
519
|
+
|
|
520
|
+
if not self.microscope_name is None:
|
|
521
|
+
mdh['MicroscopeName'] = self.microscope_name
|
|
522
|
+
|
|
523
|
+
mdh.update(self.state)
|
|
524
|
+
mdh.copyEntriesFrom(self.mdh)
|
|
525
|
+
|
|
526
|
+
def AddVoxelSizeSetting(self, name, x, y):
|
|
527
|
+
""" Adds a new voxel size setting.
|
|
528
|
+
|
|
529
|
+
The reason for multiple settings is to easily support switching between
|
|
530
|
+
different cameras and/or optical configurations such as tube lenses, splitters,
|
|
531
|
+
etc ...
|
|
532
|
+
|
|
533
|
+
Parameters
|
|
534
|
+
----------
|
|
535
|
+
|
|
536
|
+
name : string
|
|
537
|
+
The name to use for the new setting
|
|
538
|
+
x : float
|
|
539
|
+
the pixelsize along the x axis in um
|
|
540
|
+
y : float
|
|
541
|
+
the pixelsize along the y axis in um
|
|
542
|
+
"""
|
|
543
|
+
with self.settingsDB as conn:
|
|
544
|
+
conn.execute("INSERT INTO VoxelSizes (name, x, y) VALUES (?, ?, ?)", (name, x, y))
|
|
545
|
+
|
|
546
|
+
|
|
547
|
+
|
|
548
|
+
def SetVoxelSize(self, voxelsizename, camName=None):
|
|
549
|
+
"""Set the camera voxel size, from a pre-existing voxel size seting.
|
|
550
|
+
|
|
551
|
+
Parameters
|
|
552
|
+
----------
|
|
553
|
+
|
|
554
|
+
voxelsizename : string
|
|
555
|
+
The name of the voxelsize setting to use. This should have been created
|
|
556
|
+
using the **AddVoxelSize** function.
|
|
557
|
+
camName : string
|
|
558
|
+
The name of the camera to ascociate the setting with. If None, then
|
|
559
|
+
the currently selected camera is used.
|
|
560
|
+
"""
|
|
561
|
+
if camName is None:
|
|
562
|
+
cam = self.cam
|
|
563
|
+
else:
|
|
564
|
+
cam = self.cameras[camName]
|
|
565
|
+
|
|
566
|
+
with self.settingsDB as conn:
|
|
567
|
+
voxelSizeID = conn.execute("SELECT ID FROM VoxelSizes WHERE name=?", (voxelsizename,)).fetchone()[0]
|
|
568
|
+
conn.execute("INSERT INTO VoxelSizeHistory2 VALUES (?, ?, ?)", (datetime.datetime.now(), voxelSizeID, cam.GetSerialNumber()))
|
|
569
|
+
|
|
570
|
+
|
|
571
|
+
|
|
572
|
+
def satCheck(self, source, **kwargs): # check for saturation
|
|
573
|
+
"""Check to see if the current frame is saturated and stop the camera/
|
|
574
|
+
close the shutter if necessary
|
|
575
|
+
|
|
576
|
+
TODO: could use a rewrite / new inspection.
|
|
577
|
+
"""
|
|
578
|
+
import wx
|
|
579
|
+
|
|
580
|
+
if not 'shutterOpen' in dir(self.cam):
|
|
581
|
+
return
|
|
582
|
+
im = source.currentFrame
|
|
583
|
+
IMax = im.max()
|
|
584
|
+
|
|
585
|
+
if not self.cam.shutterOpen:
|
|
586
|
+
self.cam.ADOffset = im.mean()
|
|
587
|
+
elif (IMax >= self.cam.SaturationThreshold): #is saturated
|
|
588
|
+
|
|
589
|
+
source.cam.StopAq()
|
|
590
|
+
|
|
591
|
+
if self.lastFrameSaturated: #last frame was also saturated - our intervention obviously didn't work - close the shutter
|
|
592
|
+
if 'SetShutter' in dir(source.cam):
|
|
593
|
+
source.cam.SetShutter(False)
|
|
594
|
+
source.cam.StartExposure()
|
|
595
|
+
self.saturatedMessage = 'Camera shutter has been closed'
|
|
596
|
+
self.lastFrameSaturated = True
|
|
597
|
+
self.cam.saturationIntervened = True
|
|
598
|
+
wx.MessageBox(self.saturatedMessage, "Saturation detected", wx.OK|wx.ICON_HAND)
|
|
599
|
+
return
|
|
600
|
+
|
|
601
|
+
#fracPixelsSat = (im > self.saturationThreshold).sum().astype('f')/im.size
|
|
602
|
+
|
|
603
|
+
#try turning the e.m. gain off
|
|
604
|
+
if 'SetEMGain' in dir(source.cam) and not source.cam.GetEMGain() == 0:
|
|
605
|
+
self.oldEMGain = source.cam.GetEMGain()
|
|
606
|
+
source.cam.SetEMGain(0)
|
|
607
|
+
if self.oldEMGain < 50: #poor chance of resolving by turning EMGain down alone
|
|
608
|
+
if 'SetShutter' in dir(source.cam):
|
|
609
|
+
source.cam.SetShutter(False)
|
|
610
|
+
self.saturatedMessage = 'Camera shutter closed'
|
|
611
|
+
else:
|
|
612
|
+
self.saturatedMessage = 'EM Gain turned down'
|
|
613
|
+
|
|
614
|
+
source.cam.StartExposure()
|
|
615
|
+
|
|
616
|
+
self.lastFrameSaturated = True
|
|
617
|
+
self.cam.saturationIntervened = True
|
|
618
|
+
wx.MessageBox(self.saturatedMessage, "Saturation detected", wx.OK|wx.ICON_HAND)
|
|
619
|
+
#return
|
|
620
|
+
else:
|
|
621
|
+
if 'SetShutter' in dir(source.cam):
|
|
622
|
+
source.cam.SetShutter(False)
|
|
623
|
+
source.cam.StartExposure()
|
|
624
|
+
self.saturatedMessage = 'Camera shutter closed'
|
|
625
|
+
self.lastFrameSaturated = True
|
|
626
|
+
self.cam.saturationIntervened = True
|
|
627
|
+
wx.MessageBox(self.saturatedMessage, "Saturation detected", wx.OK|wx.ICON_HAND)
|
|
628
|
+
#return
|
|
629
|
+
|
|
630
|
+
self.lastFrameSaturated = True
|
|
631
|
+
|
|
632
|
+
else:
|
|
633
|
+
self.lastFrameSaturated = False
|
|
634
|
+
|
|
635
|
+
|
|
636
|
+
def genStatus(self):
|
|
637
|
+
"""Generate a status message. TODO - move this to the GUI?"""
|
|
638
|
+
stext = ''
|
|
639
|
+
if self.cam.CamReady():
|
|
640
|
+
self.cam.GetStatus()
|
|
641
|
+
stext = 'CCD Temp: %d' % self.cam.GetCCDTemp()
|
|
642
|
+
else:
|
|
643
|
+
stext = '<Camera ERROR>'
|
|
644
|
+
|
|
645
|
+
if 'saturationIntervened' in dir(self.cam):
|
|
646
|
+
if self.lastFrameSaturated:
|
|
647
|
+
stext = stext + ' Camera Saturated!!'
|
|
648
|
+
if self.cam.saturationIntervened:
|
|
649
|
+
stext = stext + ' ' + self.saturatedMessage
|
|
650
|
+
|
|
651
|
+
#if 'step' in dir(self):
|
|
652
|
+
# stext = stext + ' Stepper: (XPos: %1.2f YPos: %1.2f ZPos: %1.2f)' % (self.step.GetPosX(), self.step.GetPosY(), self.step.GetPosZ())
|
|
653
|
+
|
|
654
|
+
#stext = stext + ' Position:
|
|
655
|
+
|
|
656
|
+
if self.frameWrangler.isRunning():
|
|
657
|
+
try:
|
|
658
|
+
stext = stext + ' FPS = (%2.2f/%2.2f)' % (self.cam.GetFPS(),self.frameWrangler.getFPS())
|
|
659
|
+
except (AttributeError, NotImplementedError):
|
|
660
|
+
stext = stext + ' FPS = %2.2f' % self.frameWrangler.getFPS()
|
|
661
|
+
|
|
662
|
+
if 'GetNumImsBuffered' in dir(self.cam):
|
|
663
|
+
stext = stext + ' Buffer Level: %d of %d' % (self.cam.GetNumImsBuffered(), self.cam.GetBufferSize())
|
|
664
|
+
|
|
665
|
+
for sic in self.StatusCallbacks:
|
|
666
|
+
stext = stext + ' ' + sic()
|
|
667
|
+
return stext
|
|
668
|
+
|
|
669
|
+
@property
|
|
670
|
+
def pa(self):
|
|
671
|
+
"""property to catch access of what was previously called the scope.frameWrangler (the PreviewAcquisator)"""
|
|
672
|
+
warnings.warn(".pa is deprecated, please use .frameWrangler instead", DeprecationWarning)
|
|
673
|
+
return self.frameWrangler
|
|
674
|
+
|
|
675
|
+
def startFrameWrangler(self, event_loop=None):
|
|
676
|
+
"""Start the frame wrangler. Gets called during post-init phase of aquiremainframe.
|
|
677
|
+
|
|
678
|
+
"""
|
|
679
|
+
#stop an old acquisition
|
|
680
|
+
try:
|
|
681
|
+
self.frameWrangler.stop()
|
|
682
|
+
except AttributeError:
|
|
683
|
+
pass
|
|
684
|
+
|
|
685
|
+
self.frameWrangler = FrameWrangler(self.cam, event_loop=event_loop)
|
|
686
|
+
self.frameWrangler.HardwareChecks.extend(self.hardwareChecks)
|
|
687
|
+
self.frameWrangler.Prepare()
|
|
688
|
+
|
|
689
|
+
if 'shutterOpen' in dir(self.cam):
|
|
690
|
+
#self.pa.WantFrameGroupNotification.append(self.satCheck)
|
|
691
|
+
#self.frameWrangler.onFrameGroup.connect(self.satCheck)
|
|
692
|
+
pass
|
|
693
|
+
|
|
694
|
+
self.frameWrangler.start()
|
|
695
|
+
self.CleanupFunctions.append(self.frameWrangler.destroy)
|
|
696
|
+
|
|
697
|
+
for cb in self.PACallbacks:
|
|
698
|
+
cb()
|
|
699
|
+
|
|
700
|
+
##############################
|
|
701
|
+
# The microscope object manages multiple cameras
|
|
702
|
+
#
|
|
703
|
+
# The following functions deal with selecting the active camera and
|
|
704
|
+
# performing operations on the currently active camera
|
|
705
|
+
# The integration time and ROI setting functions can be thought of as
|
|
706
|
+
# proxying the underlying calls to the camera
|
|
707
|
+
|
|
708
|
+
def _SetCamera(self, camName):
|
|
709
|
+
"""Set the currently used camera by name, selecting from the dictionary
|
|
710
|
+
self.cameras. Calling code should use self.state['ActiveCamera']= camName
|
|
711
|
+
instead.
|
|
712
|
+
|
|
713
|
+
Parameters
|
|
714
|
+
----------
|
|
715
|
+
|
|
716
|
+
camName : string
|
|
717
|
+
The name of the camera to switch to
|
|
718
|
+
|
|
719
|
+
"""
|
|
720
|
+
#try:
|
|
721
|
+
# self.frameWrangler.stop()
|
|
722
|
+
#except AttributeError:
|
|
723
|
+
# pass
|
|
724
|
+
|
|
725
|
+
#deactivate cameras
|
|
726
|
+
for c in self.cameras.values():
|
|
727
|
+
c.SetActive(False)
|
|
728
|
+
c.SetShutter(False)
|
|
729
|
+
|
|
730
|
+
|
|
731
|
+
|
|
732
|
+
self.cam = self.cameras[camName]
|
|
733
|
+
if 'lightpath' in dir(self):
|
|
734
|
+
self.lightpath.SetPort(self.cam.port)
|
|
735
|
+
|
|
736
|
+
self.cam.SetActive(True)
|
|
737
|
+
try:
|
|
738
|
+
self.cam.SetShutter(self.camControls[camName].cbShutter.GetValue())
|
|
739
|
+
except AttributeError:
|
|
740
|
+
pass #for cameras which don't have a shutter
|
|
741
|
+
|
|
742
|
+
# TODO this needs to move to the GUI
|
|
743
|
+
from PYME.ui import manualFoldPanel as afp
|
|
744
|
+
for k in self.cameras.keys():
|
|
745
|
+
ctrl = self.camControls[k]
|
|
746
|
+
if isinstance(ctrl, afp.foldingPane):
|
|
747
|
+
ctrl.Hide()
|
|
748
|
+
else:
|
|
749
|
+
ctrl.GetParent().Hide() # GetParent().UnPin()
|
|
750
|
+
|
|
751
|
+
ctrl = self.camControls[camName]
|
|
752
|
+
if isinstance(ctrl, afp.foldingPane):
|
|
753
|
+
ctrl.Show()
|
|
754
|
+
ctrl.GetParent().Layout()
|
|
755
|
+
else:
|
|
756
|
+
ctrl.GetParent().Show()
|
|
757
|
+
ctrl.GetParent().GetParent().Layout()
|
|
758
|
+
# End GUI TODO
|
|
759
|
+
|
|
760
|
+
try:
|
|
761
|
+
self.frameWrangler.cam = self.cam
|
|
762
|
+
self.frameWrangler.Prepare()
|
|
763
|
+
|
|
764
|
+
#self.frameWrangler.start()
|
|
765
|
+
except AttributeError:
|
|
766
|
+
pass
|
|
767
|
+
|
|
768
|
+
def GetActiveCameraName(self):
|
|
769
|
+
"""Get the name / key of the currently active camera"""
|
|
770
|
+
for name, cam in self.cameras.items():
|
|
771
|
+
if cam is self.cam:
|
|
772
|
+
return name
|
|
773
|
+
|
|
774
|
+
def _SetActiveCameraIntegrationTime(self, integrationTime):
|
|
775
|
+
"""
|
|
776
|
+
Sets the integration time for the active camera
|
|
777
|
+
Parameters
|
|
778
|
+
----------
|
|
779
|
+
integrationTime: float
|
|
780
|
+
Units of seconds.
|
|
781
|
+
|
|
782
|
+
|
|
783
|
+
Notes
|
|
784
|
+
-----
|
|
785
|
+
This is a state handler, use
|
|
786
|
+
`scope.state['Camera.IntegrationTime'] = integrationTime`
|
|
787
|
+
instead of calling directly
|
|
788
|
+
"""
|
|
789
|
+
self.cam.SetIntegTime(integrationTime)
|
|
790
|
+
|
|
791
|
+
def _GetActiveCameraIntegrationTime(self):
|
|
792
|
+
"""Gets the integration time for the active camera (in seconds)"""
|
|
793
|
+
return self.cam.GetIntegTime()
|
|
794
|
+
|
|
795
|
+
def _SetActiveCameraROI(self, ROI):
|
|
796
|
+
"""Sets the ROI for the active camera
|
|
797
|
+
|
|
798
|
+
NB: This is a state handler, use
|
|
799
|
+
`scope.state['Camera.ROI'] = ROI`
|
|
800
|
+
instead of calling directly
|
|
801
|
+
|
|
802
|
+
Parameters
|
|
803
|
+
----------
|
|
804
|
+
|
|
805
|
+
ROI : tuple / sequence
|
|
806
|
+
The co-ordinates (in pixels) of the ROI, in the form (x0, y0, x1, y1)
|
|
807
|
+
|
|
808
|
+
"""
|
|
809
|
+
logger.debug('Setting camera ROI')
|
|
810
|
+
self.cam.SetROI(*ROI)
|
|
811
|
+
|
|
812
|
+
def _GetActiveCameraROI(self):
|
|
813
|
+
"""Gets the ROI for the active camera
|
|
814
|
+
|
|
815
|
+
Parameters
|
|
816
|
+
----------
|
|
817
|
+
|
|
818
|
+
ROI : tuple / sequence
|
|
819
|
+
The co-ordinates (in pixels) of the ROI, in the form (x0, y0, x1, y1)
|
|
820
|
+
|
|
821
|
+
"""
|
|
822
|
+
|
|
823
|
+
return self.cam.GetROI()
|
|
824
|
+
|
|
825
|
+
def _SetActiveCameraBinning(self, binning):
|
|
826
|
+
"""
|
|
827
|
+
Sets Binning on the active camera
|
|
828
|
+
|
|
829
|
+
Parameters
|
|
830
|
+
----------
|
|
831
|
+
binning : tuple/sequence (binx, biny)
|
|
832
|
+
the binning in x and y respectively
|
|
833
|
+
|
|
834
|
+
"""
|
|
835
|
+
binx, biny = binning
|
|
836
|
+
|
|
837
|
+
self.cam.SetHorizontalBin(binx)
|
|
838
|
+
self.cam.SetVerticalBin(biny)
|
|
839
|
+
|
|
840
|
+
def _GetActiveCameraBinning(self):
|
|
841
|
+
"""
|
|
842
|
+
Sets Binning on the active camera
|
|
843
|
+
|
|
844
|
+
Parameters
|
|
845
|
+
----------
|
|
846
|
+
binning : tuple/sequence (binx, biny)
|
|
847
|
+
the binning in x and y respectively
|
|
848
|
+
|
|
849
|
+
"""
|
|
850
|
+
binx = self.cam.GetHorizontalBin()
|
|
851
|
+
biny = self.cam.GetVerticalBin()
|
|
852
|
+
|
|
853
|
+
return (binx, biny)
|
|
854
|
+
|
|
855
|
+
def PanCamera(self, dx, dy):
|
|
856
|
+
"""Moves / pans the stage my a given offset, in pixels relative to the
|
|
857
|
+
camera, correcting for any differences in rotation and mirroring between
|
|
858
|
+
camera and stage axes.
|
|
859
|
+
|
|
860
|
+
TODO: fix to use state based position setting
|
|
861
|
+
"""
|
|
862
|
+
vx, vy = self.GetPixelSize()
|
|
863
|
+
|
|
864
|
+
p = self.GetPos()
|
|
865
|
+
|
|
866
|
+
ox = p['x']
|
|
867
|
+
oy = p['y']
|
|
868
|
+
|
|
869
|
+
if 'orientation' in dir(self.cam):
|
|
870
|
+
if self.cam.orientation['rotate']:
|
|
871
|
+
dx, dy = dy, dx
|
|
872
|
+
|
|
873
|
+
if self.cam.orientation['flipx']:
|
|
874
|
+
dx *= -1
|
|
875
|
+
|
|
876
|
+
if self.cam.orientation['flipy']:
|
|
877
|
+
dy *= -1
|
|
878
|
+
|
|
879
|
+
self.SetPos(x=(ox + dx*vx), y=(oy + dy*vy))
|
|
880
|
+
|
|
881
|
+
|
|
882
|
+
def turnAllLasersOff(self):
|
|
883
|
+
"""Turn all attached lasers off.
|
|
884
|
+
|
|
885
|
+
TODO - does this fit with the new state based paradigm?
|
|
886
|
+
"""
|
|
887
|
+
import re
|
|
888
|
+
for k in self.state.keys():
|
|
889
|
+
if re.match(r'Lasers\.(?P<laser_name>.*)\.On', k):
|
|
890
|
+
self.state[k] = False
|
|
891
|
+
#for l in self.lasers:
|
|
892
|
+
# l.TurnOff()
|
|
893
|
+
|
|
894
|
+
def initialize(self, init_script_name, locals={}):
|
|
895
|
+
from PYME.Acquire import ExecTools
|
|
896
|
+
|
|
897
|
+
# add ExecTools functions to namespace (for backwards compatibility - note that new scripts should have
|
|
898
|
+
# `from PYME.Acquire.ExecTools import InitBG, joinBGInit, InitGUI, HWNotPresent` as their first line.
|
|
899
|
+
from PYME.Acquire.ExecTools import InitBG, joinBGInit, InitGUI, HWNotPresent
|
|
900
|
+
locals.update(InitBG=InitBG, joinBGInit=joinBGInit, InitGUI=InitGUI, HWNotPresent=HWNotPresent)
|
|
901
|
+
|
|
902
|
+
locals.update(scope=self)
|
|
903
|
+
ExecTools.setDefaultNamespace(locals, globals())
|
|
904
|
+
self._init_thread = ExecTools.execFileBG(init_script_name, locals, globals(), then=self._post_init)
|
|
905
|
+
|
|
906
|
+
return self._init_thread
|
|
907
|
+
|
|
908
|
+
@property
|
|
909
|
+
def initialized(self):
|
|
910
|
+
"""
|
|
911
|
+
Checks if the initialisation thread has run (replaces check of initDone flag which needed to be manually set
|
|
912
|
+
in initialisation script). Semantics are slightly different in that this returns true even if there is an error
|
|
913
|
+
whist the old way of checking would get forever stuck at the splash screen.
|
|
914
|
+
|
|
915
|
+
Returns
|
|
916
|
+
-------
|
|
917
|
+
|
|
918
|
+
True if the initialisation script has run, False otherwise
|
|
919
|
+
|
|
920
|
+
"""
|
|
921
|
+
try:
|
|
922
|
+
return not self._init_thread.is_alive()
|
|
923
|
+
except AttributeError:
|
|
924
|
+
# don't have and _init_thread yet
|
|
925
|
+
return False
|
|
926
|
+
|
|
927
|
+
def wait_for_init(self):
|
|
928
|
+
self._init_thread.join()
|
|
929
|
+
|
|
930
|
+
def _post_init(self):
|
|
931
|
+
"""
|
|
932
|
+
Called after the init script runs to do stuff based on what hardware is present
|
|
933
|
+
"""
|
|
934
|
+
|
|
935
|
+
if len(self.positioning) > 0:
|
|
936
|
+
# we have registered piezos => we can do z-stacks
|
|
937
|
+
from PYME.Acquire import stackSettings
|
|
938
|
+
|
|
939
|
+
# FIXME - this looks like it will create a circular reference
|
|
940
|
+
self.stackSettings = stackSettings.StackSettings(self)
|
|
941
|
+
|
|
942
|
+
def register_piezo(self, piezo, axis_name, multiplier=1, needCamRestart=False, channel=0):
|
|
943
|
+
"""
|
|
944
|
+
Register a piezo with the microscope object
|
|
945
|
+
|
|
946
|
+
Parameters
|
|
947
|
+
----------
|
|
948
|
+
piezo : `PYME.Acquire.Hardware.Piezos.base_piezo.PiezoBase` instance
|
|
949
|
+
the piezo to register
|
|
950
|
+
axis_name : string
|
|
951
|
+
the axis name, e.g. 'x', 'y', 'z'
|
|
952
|
+
multiplier : float, typically either 1 or -1
|
|
953
|
+
what to multiply the positions by to match the directionality in the displayed image and make panning etc
|
|
954
|
+
work.
|
|
955
|
+
needCamRestart : bool
|
|
956
|
+
whether to restart the camera after changing the position (mostly for simulation and fake piezos)
|
|
957
|
+
|
|
958
|
+
Notes
|
|
959
|
+
-----
|
|
960
|
+
|
|
961
|
+
The 'x' and 'y' axes should be defined in terms of the axes of the principle camera (i.e. if a stage moves the
|
|
962
|
+
image on the camera left and right it is the 'x' stage, regardless of the physical motion of the sample). Likewise,
|
|
963
|
+
the multipliers should be set so that a positive movement of the x stage moves the image right, and a positive
|
|
964
|
+
movement of the y stage moves the image down.
|
|
965
|
+
|
|
966
|
+
"""
|
|
967
|
+
try:
|
|
968
|
+
display_name = piezo.gui_description % axis_name
|
|
969
|
+
except:
|
|
970
|
+
display_name = 'Piezo %s' % axis_name
|
|
971
|
+
|
|
972
|
+
self.piezos.append((piezo, channel, display_name))
|
|
973
|
+
|
|
974
|
+
try:
|
|
975
|
+
units_um = float(piezo.units_um)
|
|
976
|
+
except:
|
|
977
|
+
units_um = 1.0
|
|
978
|
+
|
|
979
|
+
self.positioning[axis_name] = (piezo, channel, 1*multiplier*units_um)
|
|
980
|
+
self.state.registerHandler('Positioning.%s' % axis_name, lambda: units_um*multiplier*piezo.GetPos(channel),
|
|
981
|
+
lambda v: piezo.MoveTo(channel, v/(multiplier*units_um)), needCamRestart=needCamRestart)
|
|
982
|
+
|
|
983
|
+
self.state.registerHandler('Positioning.%s_target' % axis_name,
|
|
984
|
+
lambda: units_um*multiplier*piezo.GetTargetPos(channel)) #FIXME - target position does not belong in state ---
|
|
985
|
+
|
|
986
|
+
def register_camera(self, cam, name, port='', rotate=False, flipx=False, flipy=False):
|
|
987
|
+
"""
|
|
988
|
+
Register a camera with the microscope
|
|
989
|
+
|
|
990
|
+
Parameters
|
|
991
|
+
----------
|
|
992
|
+
cam : The camera object
|
|
993
|
+
name : A human-readable name
|
|
994
|
+
port : Which sideport the camera is attached to (used to automatically select the right camera when changing
|
|
995
|
+
sideports & vice versa, but currently only works on the Nikon Ti stand)
|
|
996
|
+
rotate : Is this camera rotated with respect to the cardinal camera (used for multi-camera support)
|
|
997
|
+
flipx : Is this camera flipped in x w.r.t. the cardinal camera (used for multi-camera support)
|
|
998
|
+
flipy : Is this camera flipped in y w.r.t. the cardinal camera (used for multi-camera support)
|
|
999
|
+
|
|
1000
|
+
Notes
|
|
1001
|
+
-----
|
|
1002
|
+
The optional port, rotate, flipx, and flipy parameters all relate to multiple camera support and should be
|
|
1003
|
+
defined with respect to the principle camera (not stages etc which should be in the frame of the principle camera).
|
|
1004
|
+
The support for these parameters is currently pretty limited - they work when panning the sample using the mouse,
|
|
1005
|
+
but are generally ignored in other parts of the code.
|
|
1006
|
+
|
|
1007
|
+
"""
|
|
1008
|
+
cam.port = port
|
|
1009
|
+
cam.orientation = dict(rotate=rotate, flipx=flipx, flipy=flipy)
|
|
1010
|
+
|
|
1011
|
+
self.cameras[name] = cam
|
|
1012
|
+
if self.cam is None:
|
|
1013
|
+
self.cam = cam
|
|
1014
|
+
cam.SetActive(True)
|
|
1015
|
+
|
|
1016
|
+
def get_roi_offset(self):
|
|
1017
|
+
"""
|
|
1018
|
+
Stage (positioning) coordinates are referenced to the (0,0) pixel of the primary camera. Return the offset to
|
|
1019
|
+
the centre of the current ROI. Used when, e.g. moving the stage to centre the current view on a given set of
|
|
1020
|
+
coordinates.
|
|
1021
|
+
|
|
1022
|
+
Returns
|
|
1023
|
+
-------
|
|
1024
|
+
|
|
1025
|
+
roi_offset_x, roi_offset_y : float
|
|
1026
|
+
offsets in um
|
|
1027
|
+
|
|
1028
|
+
"""
|
|
1029
|
+
from PYME.Acquire.Hardware.multiview import MultiviewWrapper
|
|
1030
|
+
from PYME.Acquire.Hardware.Camera import MultiviewCameraMixin
|
|
1031
|
+
|
|
1032
|
+
x0, y0, _, _ = self.state['Camera.ROI']
|
|
1033
|
+
|
|
1034
|
+
if isinstance(self.cam, (MultiviewWrapper, MultiviewCameraMixin)):
|
|
1035
|
+
# fix multiview crazyness
|
|
1036
|
+
if self.cam.multiview_enabled:
|
|
1037
|
+
#always use the 0th ROI for determining relative position, regardless of which ROIs are active
|
|
1038
|
+
x0, y0 = self.cam.view_origins[0]
|
|
1039
|
+
|
|
1040
|
+
roi_offset_x = self.GetPixelSize()[0] * (x0 + 0.5 * self.cam.size_x)
|
|
1041
|
+
roi_offset_y = self.GetPixelSize()[1] * (y0 + 0.5 * self.cam.size_y)
|
|
1042
|
+
else:
|
|
1043
|
+
roi_offset_x = self.GetPixelSize()[0] * (x0 + 0.5 * self.cam.GetPicWidth())
|
|
1044
|
+
roi_offset_y = self.GetPixelSize()[1] * (y0 + 0.5 * self.cam.GetPicHeight())
|
|
1045
|
+
|
|
1046
|
+
return roi_offset_x, roi_offset_y
|
|
1047
|
+
|
|
1048
|
+
def __del__(self):
|
|
1049
|
+
pass
|
|
1050
|
+
#self.settingsDB.close()
|