python-microscopy 25.6.5__cp39-cp39-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- PYME/Acquire/ActionManager.py +450 -0
- PYME/Acquire/ExecTools.py +235 -0
- PYME/Acquire/Hardware/AAOptoelectronics/MDS.py +175 -0
- PYME/Acquire/Hardware/AAOptoelectronics/__init__.py +0 -0
- PYME/Acquire/Hardware/ARCoptix/__init__.py +0 -0
- PYME/Acquire/Hardware/ARCoptix/lcdriver.py +149 -0
- PYME/Acquire/Hardware/ARCoptix/lcserver32.py +123 -0
- PYME/Acquire/Hardware/AndorIXon/AndorCam.py +1095 -0
- PYME/Acquire/Hardware/AndorIXon/AndorControlFrame.py +312 -0
- PYME/Acquire/Hardware/AndorIXon/AndorIXon.py +737 -0
- PYME/Acquire/Hardware/AndorIXon/__init__.py +27 -0
- PYME/Acquire/Hardware/AndorNeo/AndorNeo.py +644 -0
- PYME/Acquire/Hardware/AndorNeo/AndorNeoControlFrame.py +161 -0
- PYME/Acquire/Hardware/AndorNeo/AndorZyla.py +761 -0
- PYME/Acquire/Hardware/AndorNeo/SDK3.py +307 -0
- PYME/Acquire/Hardware/AndorNeo/SDK3Cam.py +171 -0
- PYME/Acquire/Hardware/AndorNeo/ZylaControlPanel.py +105 -0
- PYME/Acquire/Hardware/AndorNeo/__init__.py +22 -0
- PYME/Acquire/Hardware/AndorNeo/parseAtdebug.py +46 -0
- PYME/Acquire/Hardware/AndorNeo/plotTimings.py +73 -0
- PYME/Acquire/Hardware/AndorNeo/testNeo.py +62 -0
- PYME/Acquire/Hardware/Camera.py +1199 -0
- PYME/Acquire/Hardware/CameraSkeleton.py +642 -0
- PYME/Acquire/Hardware/Coherent/OBIS.py +147 -0
- PYME/Acquire/Hardware/Coherent/Sapphire.py +162 -0
- PYME/Acquire/Hardware/Coherent/__init__.py +0 -0
- PYME/Acquire/Hardware/DMDGui.py +198 -0
- PYME/Acquire/Hardware/DigiData/DigiData.py +95 -0
- PYME/Acquire/Hardware/DigiData/DigiDataClient.py +30 -0
- PYME/Acquire/Hardware/DigiData/RemoteDigiData.py +51 -0
- PYME/Acquire/Hardware/DigiData/__init__.py +24 -0
- PYME/Acquire/Hardware/DigiData/axDD132x.py +348 -0
- PYME/Acquire/Hardware/EMCCDTheory.py +41 -0
- PYME/Acquire/Hardware/ExciterWheel.py +167 -0
- PYME/Acquire/Hardware/FilterWheel.py +184 -0
- PYME/Acquire/Hardware/FocCorr.py +106 -0
- PYME/Acquire/Hardware/FocCorrR.py +196 -0
- PYME/Acquire/Hardware/FrFilter.py +51 -0
- PYME/Acquire/Hardware/GCS/GCS_DLL.py +370 -0
- PYME/Acquire/Hardware/GCS/__init__.py +0 -0
- PYME/Acquire/Hardware/GCS/gcs.py +210 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/HamamatsuDCAM.py +662 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/HamamatsuORCA.py +602 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/Hamamatsu_control_panel.py +54 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/__init__.py +23 -0
- PYME/Acquire/Hardware/LaserControlFrame.py +160 -0
- PYME/Acquire/Hardware/MPBCommunications/MPBCW.py +132 -0
- PYME/Acquire/Hardware/MPBCommunications/__init__.py +0 -0
- PYME/Acquire/Hardware/Mercury/Mercury.py +269 -0
- PYME/Acquire/Hardware/Mercury/PI_Mercury_GCS_DLL.py +857 -0
- PYME/Acquire/Hardware/Mercury/__init__.py +22 -0
- PYME/Acquire/Hardware/Mercury/mercuryStepper.py +203 -0
- PYME/Acquire/Hardware/Mercury/mercuryStepperGCS.py +281 -0
- PYME/Acquire/Hardware/NikonTE2000.py +68 -0
- PYME/Acquire/Hardware/NikonTi.py +214 -0
- PYME/Acquire/Hardware/NikonTiGUI.py +81 -0
- PYME/Acquire/Hardware/OrielCornerstone.py +125 -0
- PYME/Acquire/Hardware/PM100USB.py +51 -0
- PYME/Acquire/Hardware/Piezos/__init__.py +22 -0
- PYME/Acquire/Hardware/Piezos/base_piezo.py +108 -0
- PYME/Acquire/Hardware/Piezos/offsetPiezo.py +162 -0
- PYME/Acquire/Hardware/Piezos/offsetPiezoREST.py +308 -0
- PYME/Acquire/Hardware/Piezos/piezo_c867.py +486 -0
- PYME/Acquire/Hardware/Piezos/piezo_e255.py +68 -0
- PYME/Acquire/Hardware/Piezos/piezo_e662.py +61 -0
- PYME/Acquire/Hardware/Piezos/piezo_e709.py +434 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816.py +452 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816_corr.py +70 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816_dll.py +518 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816b.py +70 -0
- PYME/Acquire/Hardware/Piezos/piezo_pipython_gcs.py +560 -0
- PYME/Acquire/Hardware/Piezos/piezo_test.py +55 -0
- PYME/Acquire/Hardware/Simulator/EmpiricalHist.py +273 -0
- PYME/Acquire/Hardware/Simulator/__init__.py +22 -0
- PYME/Acquire/Hardware/Simulator/dSimControl.py +961 -0
- PYME/Acquire/Hardware/Simulator/fakeCam.py +651 -0
- PYME/Acquire/Hardware/Simulator/fakePiezo.py +95 -0
- PYME/Acquire/Hardware/Simulator/fluor.py +336 -0
- PYME/Acquire/Hardware/Simulator/illuminate.cp39-win_amd64.dll.a +0 -0
- PYME/Acquire/Hardware/Simulator/illuminate.cp39-win_amd64.pyd +0 -0
- PYME/Acquire/Hardware/Simulator/illuminate.pyx +93 -0
- PYME/Acquire/Hardware/Simulator/lasersliders.py +90 -0
- PYME/Acquire/Hardware/Simulator/rend_im.py +446 -0
- PYME/Acquire/Hardware/Simulator/setup.py +69 -0
- PYME/Acquire/Hardware/Simulator/simcontrol.py +348 -0
- PYME/Acquire/Hardware/Simulator/simui_wx.py +794 -0
- PYME/Acquire/Hardware/Tango/__init__.py +0 -0
- PYME/Acquire/Hardware/Tango/marzhauser_tango.py +583 -0
- PYME/Acquire/Hardware/TiLightCrafter.py +388 -0
- PYME/Acquire/Hardware/__init__.py +22 -0
- PYME/Acquire/Hardware/aotf.py +271 -0
- PYME/Acquire/Hardware/arclampshutterpanel.py +71 -0
- PYME/Acquire/Hardware/cameraSoftwareBuffer.py +215 -0
- PYME/Acquire/Hardware/camera_noise.py +270 -0
- PYME/Acquire/Hardware/ccdAdjPanel.py +188 -0
- PYME/Acquire/Hardware/ccdCalibrator.py +161 -0
- PYME/Acquire/Hardware/cobaltLaser.py +108 -0
- PYME/Acquire/Hardware/cobaltLaser561.py +94 -0
- PYME/Acquire/Hardware/comports.py +26 -0
- PYME/Acquire/Hardware/driftTrackGUI.py +488 -0
- PYME/Acquire/Hardware/driftTracking.py +595 -0
- PYME/Acquire/Hardware/fakeShutters.py +52 -0
- PYME/Acquire/Hardware/focusKeys.py +204 -0
- PYME/Acquire/Hardware/focus_locks/__init__.py +0 -0
- PYME/Acquire/Hardware/focus_locks/reflection_focus_lock.py +684 -0
- PYME/Acquire/Hardware/frZStage.py +117 -0
- PYME/Acquire/Hardware/fw102.py +38 -0
- PYME/Acquire/Hardware/ids_peak_cam.py +561 -0
- PYME/Acquire/Hardware/ioslave.py +305 -0
- PYME/Acquire/Hardware/lasers.py +292 -0
- PYME/Acquire/Hardware/matchboxLaser.py +58 -0
- PYME/Acquire/Hardware/microscope_adapter.py +104 -0
- PYME/Acquire/Hardware/mpd_picosecond_delayer.py +395 -0
- PYME/Acquire/Hardware/multiview.py +287 -0
- PYME/Acquire/Hardware/olympusix81.py +59 -0
- PYME/Acquire/Hardware/pco/__init__.py +0 -0
- PYME/Acquire/Hardware/pco/pco_cam.py +348 -0
- PYME/Acquire/Hardware/pco/pco_edge_42_lt.py +34 -0
- PYME/Acquire/Hardware/pco/pco_sdk.py +1645 -0
- PYME/Acquire/Hardware/pco/pco_sdk_cam.py +518 -0
- PYME/Acquire/Hardware/pco/pco_sdk_cam_control_panel.py +54 -0
- PYME/Acquire/Hardware/phoxxLaser.py +199 -0
- PYME/Acquire/Hardware/phoxxLaserOLD.py +242 -0
- PYME/Acquire/Hardware/priorLumen.py +102 -0
- PYME/Acquire/Hardware/priorarclampshutter.py +52 -0
- PYME/Acquire/Hardware/setup.py +50 -0
- PYME/Acquire/Hardware/spacenav.py +148 -0
- PYME/Acquire/Hardware/splitter.py +394 -0
- PYME/Acquire/Hardware/thorlabsPiezo.py +98 -0
- PYME/Acquire/Hardware/thorlabs_cam.py +136 -0
- PYME/Acquire/Hardware/thorlabs_mff_flipper.py +400 -0
- PYME/Acquire/Hardware/toptica_ibeam.py +51 -0
- PYME/Acquire/Hardware/uc480/AndorControlFrame.py +308 -0
- PYME/Acquire/Hardware/uc480/__init__.py +27 -0
- PYME/Acquire/Hardware/uc480/uCam480.py +695 -0
- PYME/Acquire/Hardware/uc480/uc480.py +189 -0
- PYME/Acquire/Hardware/uc480/uc480Deprecated.py +87 -0
- PYME/Acquire/Hardware/uc480/uc480_h.py +767 -0
- PYME/Acquire/Hardware/uc480/uc480_h_gen.py +62 -0
- PYME/Acquire/Hardware/uc480/ucCamControlFrame.py +83 -0
- PYME/Acquire/Hardware/ueye.py +702 -0
- PYME/Acquire/PYMEAcquire.py +186 -0
- PYME/Acquire/Protocols/DMDMFM.py +74 -0
- PYME/Acquire/Protocols/__init__.py +22 -0
- PYME/Acquire/Protocols/darkCalibrate.py +56 -0
- PYME/Acquire/Protocols/dual671_470.py +45 -0
- PYME/Acquire/Protocols/dual671_488.py +46 -0
- PYME/Acquire/Protocols/gainCal.py +53 -0
- PYME/Acquire/Protocols/htsms-cal-psf.py +32 -0
- PYME/Acquire/Protocols/htsms-cal-registration.py +52 -0
- PYME/Acquire/Protocols/htsms-flow.py +29 -0
- PYME/Acquire/Protocols/htsms-staggered.py +31 -0
- PYME/Acquire/Protocols/htsms-tile.py +68 -0
- PYME/Acquire/Protocols/htsms-two-color.py +29 -0
- PYME/Acquire/Protocols/htsms-widefield.py +32 -0
- PYME/Acquire/Protocols/paint671.py +61 -0
- PYME/Acquire/Protocols/photoconversion.py +52 -0
- PYME/Acquire/Protocols/photoconversion2.py +55 -0
- PYME/Acquire/Protocols/prebleach488.py +70 -0
- PYME/Acquire/Protocols/prebleach490.py +69 -0
- PYME/Acquire/Protocols/prebleach561.py +72 -0
- PYME/Acquire/Protocols/prebleach561NeomEos2.py +70 -0
- PYME/Acquire/Protocols/prebleach561NeomEos2ND1.py +70 -0
- PYME/Acquire/Protocols/prebleach642.py +70 -0
- PYME/Acquire/Protocols/prebleach671.py +69 -0
- PYME/Acquire/Protocols/prebleach671ND1.py +58 -0
- PYME/Acquire/Protocols/prebleach671ND2.py +57 -0
- PYME/Acquire/Protocols/prebleach671Neo.py +69 -0
- PYME/Acquire/Protocols/recover671.py +62 -0
- PYME/Acquire/Protocols/sequence642_488.py +85 -0
- PYME/Acquire/Protocols/sequence642_561.py +87 -0
- PYME/Acquire/Protocols/shiftfield.py +198 -0
- PYME/Acquire/Protocols/simul488.py +59 -0
- PYME/Acquire/Protocols/simul642.py +63 -0
- PYME/Acquire/Protocols/simul642HTSMS.py +63 -0
- PYME/Acquire/Protocols/simulPA.py +37 -0
- PYME/Acquire/Protocols/simulSIM.py +76 -0
- PYME/Acquire/Protocols/simulStep.py +62 -0
- PYME/Acquire/Protocols/spdscan.py +178 -0
- PYME/Acquire/Protocols/standard470.py +45 -0
- PYME/Acquire/Protocols/standard488.py +47 -0
- PYME/Acquire/Protocols/standard671.py +48 -0
- PYME/Acquire/Protocols/standard671_no532.py +47 -0
- PYME/Acquire/Protocols/standardArclamp.py +46 -0
- PYME/Acquire/Protocols/strip_tile.py +204 -0
- PYME/Acquire/Protocols/tile.py +204 -0
- PYME/Acquire/Protocols/tile3D.py +192 -0
- PYME/Acquire/Protocols/tile671.py +190 -0
- PYME/Acquire/Protocols/tile_triggered.py +189 -0
- PYME/Acquire/Scripts/init.py +232 -0
- PYME/Acquire/Scripts/init_N1_Ti_Exeter_ZIx.py +374 -0
- PYME/Acquire/Scripts/init_N2_Ti_Zyla_lasers.py +290 -0
- PYME/Acquire/Scripts/init_Neo.py +266 -0
- PYME/Acquire/Scripts/init_NeoSim.py +159 -0
- PYME/Acquire/Scripts/init_TIRF.py +232 -0
- PYME/Acquire/Scripts/init_TIRF_Neo.py +242 -0
- PYME/Acquire/Scripts/init_TIRF_NeoO.py +241 -0
- PYME/Acquire/Scripts/init_TIRF_onecam.py +233 -0
- PYME/Acquire/Scripts/init_Ti.py +257 -0
- PYME/Acquire/Scripts/init_UOA_n.py +256 -0
- PYME/Acquire/Scripts/init_UOA_n2.py +246 -0
- PYME/Acquire/Scripts/init_Y1.py +249 -0
- PYME/Acquire/Scripts/init_Zyla.py +260 -0
- PYME/Acquire/Scripts/init_drift_tracking.py +80 -0
- PYME/Acquire/Scripts/init_emccd_basic.py +277 -0
- PYME/Acquire/Scripts/init_htsms.py +277 -0
- PYME/Acquire/Scripts/init_htsms_focus_lock.py +132 -0
- PYME/Acquire/Scripts/init_micrpi.py +45 -0
- PYME/Acquire/Scripts/init_orca.py +70 -0
- PYME/Acquire/Scripts/init_pco.py +49 -0
- PYME/Acquire/Scripts/init_rev.py +74 -0
- PYME/Acquire/Scripts/init_sim100.py +169 -0
- PYME/Acquire/Scripts/init_sim103.py +169 -0
- PYME/Acquire/Scripts/init_sim2.py +211 -0
- PYME/Acquire/Scripts/init_sim50.py +169 -0
- PYME/Acquire/Scripts/init_sim75.py +169 -0
- PYME/Acquire/Scripts/init_sim_drift_tracking.py +166 -0
- PYME/Acquire/Scripts/init_sim_htsms.py +224 -0
- PYME/Acquire/Scripts/init_sim_htsms_n.py +233 -0
- PYME/Acquire/Scripts/init_sim_main.py +229 -0
- PYME/Acquire/Scripts/init_sim_min.py +197 -0
- PYME/Acquire/Scripts/init_sim_rem.py +176 -0
- PYME/Acquire/Scripts/init_smi1.py +110 -0
- PYME/Acquire/Scripts/init_spectro.py +78 -0
- PYME/Acquire/Scripts/init_spim.py +116 -0
- PYME/Acquire/Scripts/init_thorcam.py +62 -0
- PYME/Acquire/Scripts/init_twophoton.py +112 -0
- PYME/Acquire/Scripts/init_uc480.py +262 -0
- PYME/Acquire/Scripts/init_ueye.py +261 -0
- PYME/Acquire/SpoolController.py +958 -0
- PYME/Acquire/Utils/MultiPointScanner.py +80 -0
- PYME/Acquire/Utils/__init__.py +13 -0
- PYME/Acquire/Utils/failsafe.py +157 -0
- PYME/Acquire/Utils/fastTiler.py +153 -0
- PYME/Acquire/Utils/pointScanner.py +496 -0
- PYME/Acquire/Utils/sarcSpacing.py +86 -0
- PYME/Acquire/Utils/strip_tiler.py +93 -0
- PYME/Acquire/Utils/tiler.py +464 -0
- PYME/Acquire/Utils/vibrationAnalysis.py +65 -0
- PYME/Acquire/__init__.py +44 -0
- PYME/Acquire/acquire_client.py +90 -0
- PYME/Acquire/acquire_server.py +316 -0
- PYME/Acquire/acquirebase.py +139 -0
- PYME/Acquire/acquiremainframe.py +716 -0
- PYME/Acquire/acquirewx.py +61 -0
- PYME/Acquire/acquisition_base.py +148 -0
- PYME/Acquire/actions.py +209 -0
- PYME/Acquire/autofocus.py +54 -0
- PYME/Acquire/eventLog.py +95 -0
- PYME/Acquire/event_loop.py +119 -0
- PYME/Acquire/frameWrangler.py +530 -0
- PYME/Acquire/htsms/__init__.py +8 -0
- PYME/Acquire/htsms/rule_ui.py +970 -0
- PYME/Acquire/htsms/rule_ui_v2.py +573 -0
- PYME/Acquire/htsms/tweeter.py +222 -0
- PYME/Acquire/microscope.py +1050 -0
- PYME/Acquire/positionTracker.py +181 -0
- PYME/Acquire/protocol.py +299 -0
- PYME/Acquire/protocol_acquisition.py +404 -0
- PYME/Acquire/sampleInformation.py +591 -0
- PYME/Acquire/sampleInformationDjangoDirect.py +446 -0
- PYME/Acquire/setup.py +52 -0
- PYME/Acquire/stackSettings.py +295 -0
- PYME/Acquire/stage_leveling.py +285 -0
- PYME/Acquire/ui/AnalysisSettingsUI.py +184 -0
- PYME/Acquire/ui/HDFSpoolFrame.py +584 -0
- PYME/Acquire/ui/__init__.py +0 -0
- PYME/Acquire/ui/actionUI.py +892 -0
- PYME/Acquire/ui/focus_lock_gui.py +149 -0
- PYME/Acquire/ui/intensity_trace.py +143 -0
- PYME/Acquire/ui/intsliders.py +222 -0
- PYME/Acquire/ui/lasersliders.py +329 -0
- PYME/Acquire/ui/mpd_picosecond_delay_panel.py +69 -0
- PYME/Acquire/ui/multiview_select.py +77 -0
- PYME/Acquire/ui/positionUI.py +519 -0
- PYME/Acquire/ui/preflight.py +58 -0
- PYME/Acquire/ui/scanner_panel.py +41 -0
- PYME/Acquire/ui/selectCameraPanel.py +46 -0
- PYME/Acquire/ui/seqdialog.py +501 -0
- PYME/Acquire/ui/splashScreen.py +175 -0
- PYME/Acquire/ui/spool_panel.py +830 -0
- PYME/Acquire/ui/tile_panel.py +556 -0
- PYME/Acquire/ui/tilesettingsui.py +91 -0
- PYME/Acquire/ui/voxelSizeDialog.py +149 -0
- PYME/Acquire/webui/__init__.py +36 -0
- PYME/Acquire/webui/ipy.py +361 -0
- PYME/Acquire/webui/static/css/pyme-bootstrap.css +9908 -0
- PYME/Acquire/webui/static/css/pymeacquire.css +85 -0
- PYME/Acquire/webui/static/js/pymeacquire.js +375 -0
- PYME/Acquire/webui/static/js/pzf.js +95 -0
- PYME/Acquire/webui/templates/PYMEAcquire.html +232 -0
- PYME/Acquire/webui/templates/login.html +84 -0
- PYME/Acquire/webui/templates/xtermpage.html +106 -0
- PYME/Acquire/xyztc.py +418 -0
- PYME/Acquire/zScanner.py +287 -0
- PYME/Analysis/BleachProfile/__init__.py +26 -0
- PYME/Analysis/BleachProfile/deMod.py +91 -0
- PYME/Analysis/BleachProfile/fitRecover.py +90 -0
- PYME/Analysis/BleachProfile/intensProf.py +519 -0
- PYME/Analysis/BleachProfile/kinModels.py +507 -0
- PYME/Analysis/BleachProfile/rawIntensity.py +227 -0
- PYME/Analysis/BleachProfile/rollins.py +555 -0
- PYME/Analysis/Colocalisation/__init__.py +27 -0
- PYME/Analysis/Colocalisation/colocScaleDep.py +126 -0
- PYME/Analysis/Colocalisation/correlationCoeffs.py +198 -0
- PYME/Analysis/Colocalisation/distColoc.py +110 -0
- PYME/Analysis/Colocalisation/edtColoc.py +191 -0
- PYME/Analysis/MetaData.py +278 -0
- PYME/Analysis/PSFEst/__init__.py +27 -0
- PYME/Analysis/PSFEst/dec.py +283 -0
- PYME/Analysis/PSFEst/extractImages.py +316 -0
- PYME/Analysis/PSFEst/fit_psf_zernikes.py +194 -0
- PYME/Analysis/PSFEst/psfQuality.py +225 -0
- PYME/Analysis/PSFGen/__init__.py +40 -0
- PYME/Analysis/PSFGen/fourier.py +138 -0
- PYME/Analysis/PSFGen/fourierHNA.py +1108 -0
- PYME/Analysis/PSFGen/fourierHNA2.py +979 -0
- PYME/Analysis/PSFGen/genCRBcurves.py +185 -0
- PYME/Analysis/PSFGen/nijboer_zernike.py +79 -0
- PYME/Analysis/PSFGen/ps_app.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/PSFGen/ps_app.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/PSFGen/test_ps_app.py +24 -0
- PYME/Analysis/Tracking/__init__.py +3 -0
- PYME/Analysis/Tracking/msd.py +57 -0
- PYME/Analysis/Tracking/trackUtils.py +528 -0
- PYME/Analysis/Tracking/tracking.py +152 -0
- PYME/Analysis/__init__.py +30 -0
- PYME/Analysis/_fithelpers.py +161 -0
- PYME/Analysis/angleFilter.py +287 -0
- PYME/Analysis/annealThresh.py +157 -0
- PYME/Analysis/autoencoder_classifier.py +45 -0
- PYME/Analysis/binAvg.py +144 -0
- PYME/Analysis/composite.py +183 -0
- PYME/Analysis/cramerRao.py +259 -0
- PYME/Analysis/deTile.py +441 -0
- PYME/Analysis/density_filter.py +45 -0
- PYME/Analysis/distributed_pyramid.py +426 -0
- PYME/Analysis/fiducial_matching.py +220 -0
- PYME/Analysis/gen_sCMOS_maps.py +355 -0
- PYME/Analysis/graphing_filters.py +311 -0
- PYME/Analysis/implicitFilter.py +359 -0
- PYME/Analysis/keep_pairs.py +69 -0
- PYME/Analysis/optic_flow.py +108 -0
- PYME/Analysis/piecewise.py +36 -0
- PYME/Analysis/piecewiseMapping.py +304 -0
- PYME/Analysis/piezo_movement_correction.py +153 -0
- PYME/Analysis/points/DeClump/__init__.py +78 -0
- PYME/Analysis/points/DeClump/deClump.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/DeClump/deClump.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/DeClump/deClumpGUI.py +87 -0
- PYME/Analysis/points/DeClump/pyDeClump.py +284 -0
- PYME/Analysis/points/DeClump/testClump.py +40 -0
- PYME/Analysis/points/DistHist/__init__.py +25 -0
- PYME/Analysis/points/DistHist/distHist.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/DistHist/distHist.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/DistHist/distHistThreaded.py +71 -0
- PYME/Analysis/points/DistHist/setup.py +54 -0
- PYME/Analysis/points/EdgeDB/__init__.py +24 -0
- PYME/Analysis/points/EdgeDB/edgeDB.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/EdgeDB/edgeDB.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/EdgeDB/edgeTest.py +66 -0
- PYME/Analysis/points/EdgeDB/edges.py +102 -0
- PYME/Analysis/points/EdgeDB/segment.py +75 -0
- PYME/Analysis/points/EdgeDB/setup.py +54 -0
- PYME/Analysis/points/QuadTree/QTrend.py +232 -0
- PYME/Analysis/points/QuadTree/__init__.py +25 -0
- PYME/Analysis/points/QuadTree/pointQT.py +227 -0
- PYME/Analysis/points/QuadTree/pointQTF.py +254 -0
- PYME/Analysis/points/QuadTree/qtUtils.py +36 -0
- PYME/Analysis/points/QuadTree/rendQT.py +118 -0
- PYME/Analysis/points/SoftRend/__init__.py +24 -0
- PYME/Analysis/points/SoftRend/setup.py +61 -0
- PYME/Analysis/points/SoftRend/testTetrahedra.py +41 -0
- PYME/Analysis/points/SoftRend/triRend.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/SoftRend/triRend.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/__init__.py +3 -0
- PYME/Analysis/points/arcfit/__init__.py +1 -0
- PYME/Analysis/points/arcfit/arcmf.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/arcfit/arcmf.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/arcfit/setup.py +51 -0
- PYME/Analysis/points/astigmatism/__init__.py +0 -0
- PYME/Analysis/points/astigmatism/astigTools.py +338 -0
- PYME/Analysis/points/astigmatism/astiglookup.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/astigmatism/astiglookup.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/astigmatism/setup.py +54 -0
- PYME/Analysis/points/cluster_morphology.py +199 -0
- PYME/Analysis/points/coordinate_tools.py +278 -0
- PYME/Analysis/points/features/__init__.py +0 -0
- PYME/Analysis/points/features/metal.py +46 -0
- PYME/Analysis/points/features/shaders/vect_feat_3d.metal +49 -0
- PYME/Analysis/points/fiducials.py +142 -0
- PYME/Analysis/points/gen3DTriangs.py +796 -0
- PYME/Analysis/points/moments.py +143 -0
- PYME/Analysis/points/multiview.py +458 -0
- PYME/Analysis/points/objectMeasure.py +206 -0
- PYME/Analysis/points/qpaint.py +97 -0
- PYME/Analysis/points/rings.py +372 -0
- PYME/Analysis/points/ripleys.py +427 -0
- PYME/Analysis/points/segmentLL.py +134 -0
- PYME/Analysis/points/setup.py +56 -0
- PYME/Analysis/points/spherical_harmonics.py +909 -0
- PYME/Analysis/points/surfit.py +829 -0
- PYME/Analysis/points/tCluster.py +75 -0
- PYME/Analysis/points/traveling_salesperson/__init__.py +0 -0
- PYME/Analysis/points/traveling_salesperson/queue_opt.py +117 -0
- PYME/Analysis/points/traveling_salesperson/sectioned_two_opt.py +327 -0
- PYME/Analysis/points/traveling_salesperson/setup.py +40 -0
- PYME/Analysis/points/traveling_salesperson/sort.py +78 -0
- PYME/Analysis/points/traveling_salesperson/two_opt.py +189 -0
- PYME/Analysis/points/traveling_salesperson/two_opt_utils.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/traveling_salesperson/two_opt_utils.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/traveling_salesperson/two_opt_utils.pyx +41 -0
- PYME/Analysis/points/twoColour.py +572 -0
- PYME/Analysis/points/twoColourPlot.py +107 -0
- PYME/Analysis/processLogger.py +129 -0
- PYME/Analysis/profile_extraction.py +72 -0
- PYME/Analysis/setup.py +60 -0
- PYME/Analysis/splitting.py +372 -0
- PYME/Analysis/svmSegment.py +214 -0
- PYME/Analysis/thresholding.py +192 -0
- PYME/Analysis/tile_pyramid.py +938 -0
- PYME/Analysis/widefieldify.py +54 -0
- PYME/DSView/DisplayOptionsPanel.py +503 -0
- PYME/DSView/LUT/__init__.py +33 -0
- PYME/DSView/LUT/lut.cp39-win_amd64.dll.a +0 -0
- PYME/DSView/LUT/lut.cp39-win_amd64.pyd +0 -0
- PYME/DSView/LUT/setup.py +54 -0
- PYME/DSView/OpenSequenceDialog.py +83 -0
- PYME/DSView/OverlaysPanel.py +111 -0
- PYME/DSView/__init__.py +32 -0
- PYME/DSView/arrayViewPanel.py +1035 -0
- PYME/DSView/displayOptions.py +453 -0
- PYME/DSView/displaySettingsPanel.py +271 -0
- PYME/DSView/dsviewer.py +542 -0
- PYME/DSView/eventLogViewer.py +805 -0
- PYME/DSView/fitInfo.py +486 -0
- PYME/DSView/htmlServe.py +72 -0
- PYME/DSView/logparser.py +100 -0
- PYME/DSView/modules/LMAnalysis.py +1053 -0
- PYME/DSView/modules/LMDisplay.py +194 -0
- PYME/DSView/modules/__init__.py +162 -0
- PYME/DSView/modules/_base.py +39 -0
- PYME/DSView/modules/annotation.py +725 -0
- PYME/DSView/modules/arrayView.py +71 -0
- PYME/DSView/modules/blobFinding.py +455 -0
- PYME/DSView/modules/blobMeasure.py +1093 -0
- PYME/DSView/modules/camera_maps.py +38 -0
- PYME/DSView/modules/coloc.py +414 -0
- PYME/DSView/modules/composite.py +715 -0
- PYME/DSView/modules/convnet.py +24 -0
- PYME/DSView/modules/cropping.py +133 -0
- PYME/DSView/modules/dark_and_flatfield.py +31 -0
- PYME/DSView/modules/deconvolution.py +499 -0
- PYME/DSView/modules/eventView.py +80 -0
- PYME/DSView/modules/extractBlobs.py +46 -0
- PYME/DSView/modules/fastGraphPanel.py +85 -0
- PYME/DSView/modules/filtering.py +335 -0
- PYME/DSView/modules/flowView.py +268 -0
- PYME/DSView/modules/fourierRingCorrelation.py +172 -0
- PYME/DSView/modules/gl_image_view.py +12 -0
- PYME/DSView/modules/graphViewPanel.py +272 -0
- PYME/DSView/modules/measure/__init__.py +1 -0
- PYME/DSView/modules/measure/filterPan.py +239 -0
- PYME/DSView/modules/metadataView.py +28 -0
- PYME/DSView/modules/multithreshold.py +98 -0
- PYME/DSView/modules/neuroglancer.py +129 -0
- PYME/DSView/modules/object_tagging.py +157 -0
- PYME/DSView/modules/particleTracking.py +463 -0
- PYME/DSView/modules/playback.py +256 -0
- PYME/DSView/modules/prebleachExtraction.py +75 -0
- PYME/DSView/modules/profileFitting.py +137 -0
- PYME/DSView/modules/profilePlotting.py +408 -0
- PYME/DSView/modules/projections.py +48 -0
- PYME/DSView/modules/psfExtraction.py +570 -0
- PYME/DSView/modules/psfGeneration.py +138 -0
- PYME/DSView/modules/psfTools.py +661 -0
- PYME/DSView/modules/pupilTools.py +204 -0
- PYME/DSView/modules/pupilView.py +139 -0
- PYME/DSView/modules/recipes.py +266 -0
- PYME/DSView/modules/redimension.py +75 -0
- PYME/DSView/modules/segmentation.py +192 -0
- PYME/DSView/modules/sheetView.py +24 -0
- PYME/DSView/modules/shell.py +39 -0
- PYME/DSView/modules/shiftfield_estimation.py +433 -0
- PYME/DSView/modules/sparkprepare.py +94 -0
- PYME/DSView/modules/splitter.py +148 -0
- PYME/DSView/modules/synchronise.py +64 -0
- PYME/DSView/modules/templates/astigCal.html +42 -0
- PYME/DSView/modules/templates/measureView.html +69 -0
- PYME/DSView/modules/templates/measureView2.html +48 -0
- PYME/DSView/modules/templates/measureView3.html +98 -0
- PYME/DSView/modules/templates/trackView.html +139 -0
- PYME/DSView/modules/templates/tracksOverview.html +21 -0
- PYME/DSView/modules/tiling.py +147 -0
- PYME/DSView/modules/unmixing.py +148 -0
- PYME/DSView/modules/vis3D.py +320 -0
- PYME/DSView/modules/visgui.py +163 -0
- PYME/DSView/modules/webview.py +14 -0
- PYME/DSView/overlays.py +295 -0
- PYME/DSView/scrolledImagePanel.py +188 -0
- PYME/DSView/setup.py +53 -0
- PYME/DSView/splashScreen.py +158 -0
- PYME/DSView/voxSizeDialog.py +84 -0
- PYME/Deconv/__init__.py +35 -0
- PYME/Deconv/beadGen.py +55 -0
- PYME/Deconv/dec.py +659 -0
- PYME/Deconv/decTask.py +65 -0
- PYME/Deconv/decThread.py +113 -0
- PYME/Deconv/dec_test.py +47 -0
- PYME/Deconv/deconvDialogs.py +417 -0
- PYME/Deconv/fftwWisdom.py +62 -0
- PYME/Deconv/richardsonLucy.py +141 -0
- PYME/Deconv/richardsonLucyMV.py +151 -0
- PYME/Deconv/richardsonLucyMVM.py +218 -0
- PYME/Deconv/test_block_dec.py +46 -0
- PYME/Deconv/tq_block_dec.py +331 -0
- PYME/Deconv/wiener.py +163 -0
- PYME/IO/DataSources/AlignDataSource.py +91 -0
- PYME/IO/DataSources/ArrayDataSource.py +260 -0
- PYME/IO/DataSources/BGSDataSource.py +353 -0
- PYME/IO/DataSources/BaseDataSource.py +457 -0
- PYME/IO/DataSources/BioformatsDataSource.py +178 -0
- PYME/IO/DataSources/BufferedDataSource.py +99 -0
- PYME/IO/DataSources/ClusterPZFDataSource.py +124 -0
- PYME/IO/DataSources/ConcatenatedDataSource.py +56 -0
- PYME/IO/DataSources/CropDataSource.py +243 -0
- PYME/IO/DataSources/DcimgDataSource.py +54 -0
- PYME/IO/DataSources/ElectronsPerSecondDataSource.py +61 -0
- PYME/IO/DataSources/FlatFieldDataSource.py +77 -0
- PYME/IO/DataSources/HDFDataSource.py +160 -0
- PYME/IO/DataSources/HTTPDataSource.py +80 -0
- PYME/IO/DataSources/ImageSeriesDataSource.py +123 -0
- PYME/IO/DataSources/MultiviewDataSource.py +99 -0
- PYME/IO/DataSources/OBFDataSource.py +67 -0
- PYME/IO/DataSources/RandomDataSource.py +23 -0
- PYME/IO/DataSources/SupertileDatasource.py +148 -0
- PYME/IO/DataSources/TQDataSource.py +41 -0
- PYME/IO/DataSources/TiffDataSource.py +193 -0
- PYME/IO/DataSources/TileDataSource.py +91 -0
- PYME/IO/DataSources/UnsplitDataSource.py +92 -0
- PYME/IO/DataSources/__init__.py +59 -0
- PYME/IO/FileUtils/IJLut.py +43 -0
- PYME/IO/FileUtils/RawToHdf5.py +105 -0
- PYME/IO/FileUtils/SPAD.py +54 -0
- PYME/IO/FileUtils/TiffSeqToHdf5.py +87 -0
- PYME/IO/FileUtils/__init__.py +24 -0
- PYME/IO/FileUtils/compHdf.py +39 -0
- PYME/IO/FileUtils/fileID.py +246 -0
- PYME/IO/FileUtils/fnlGen.py +40 -0
- PYME/IO/FileUtils/freeSpace.py +59 -0
- PYME/IO/FileUtils/h5-thumbnailer.py +85 -0
- PYME/IO/FileUtils/h5ExFrames.py +98 -0
- PYME/IO/FileUtils/h5ToTiffSeries.py +50 -0
- PYME/IO/FileUtils/h5r-thumbnailer.py +118 -0
- PYME/IO/FileUtils/h5rFormatDef.py +99 -0
- PYME/IO/FileUtils/h5rToTxt.py +77 -0
- PYME/IO/FileUtils/nameUtils.py +300 -0
- PYME/IO/FileUtils/obf_support.py +538 -0
- PYME/IO/FileUtils/ply.py +147 -0
- PYME/IO/FileUtils/readSpeckle.py +78 -0
- PYME/IO/FileUtils/readTiff.py +64 -0
- PYME/IO/FileUtils/saveTiffStack.py +137 -0
- PYME/IO/FileUtils/setup.py +36 -0
- PYME/IO/FileUtils/sf-thumbnailer.py +76 -0
- PYME/IO/FileUtils/stl.py +44 -0
- PYME/IO/FileUtils/thumbnailDatabase.py +104 -0
- PYME/IO/HTTPSpooler_v2.py +141 -0
- PYME/IO/MetaDataHandler.py +1072 -0
- PYME/IO/PZFFormat.py +375 -0
- PYME/IO/Spooler.py +279 -0
- PYME/IO/__init__.py +12 -0
- PYME/IO/acquisition_backends.py +353 -0
- PYME/IO/buffer_helpers.cp39-win_amd64.dll.a +0 -0
- PYME/IO/buffer_helpers.cp39-win_amd64.pyd +0 -0
- PYME/IO/buffer_helpers.pyx +190 -0
- PYME/IO/buffers.py +291 -0
- PYME/IO/clusterDuplication.py +204 -0
- PYME/IO/clusterExport.py +152 -0
- PYME/IO/clusterGlob.py +108 -0
- PYME/IO/clusterIO.py +1076 -0
- PYME/IO/clusterListing.py +232 -0
- PYME/IO/clusterResults.py +206 -0
- PYME/IO/clusterUpload.py +49 -0
- PYME/IO/cluster_directory.py +419 -0
- PYME/IO/cluster_streaming.py +216 -0
- PYME/IO/compatibility.py +12 -0
- PYME/IO/countdir/__init__.py +5 -0
- PYME/IO/countdir/setup.py +58 -0
- PYME/IO/csv_flavours.py +251 -0
- PYME/IO/dataExporter.py +470 -0
- PYME/IO/dataWrap.py +108 -0
- PYME/IO/dcimg.py +167 -0
- PYME/IO/events.py +161 -0
- PYME/IO/h5File.py +148 -0
- PYME/IO/h5rFile.py +323 -0
- PYME/IO/image.py +1447 -0
- PYME/IO/load_psf.py +26 -0
- PYME/IO/pyme_h5ls.py +58 -0
- PYME/IO/ragged.py +138 -0
- PYME/IO/rgb_image.py +94 -0
- PYME/IO/tabular.py +1338 -0
- PYME/IO/testClusterSpooling.py +199 -0
- PYME/IO/unifiedIO.py +301 -0
- PYME/LMVis/Extras/QPobjectSegment.py +220 -0
- PYME/LMVis/Extras/__init__.py +55 -0
- PYME/LMVis/Extras/animation.py +359 -0
- PYME/LMVis/Extras/annotation.py +78 -0
- PYME/LMVis/Extras/clusterAnalysis.py +460 -0
- PYME/LMVis/Extras/dockedPanel.py +69 -0
- PYME/LMVis/Extras/extra_layers.py +373 -0
- PYME/LMVis/Extras/fiducial.py +230 -0
- PYME/LMVis/Extras/flagZMotionArtifacts.py +60 -0
- PYME/LMVis/Extras/fusionUtils.py +9 -0
- PYME/LMVis/Extras/multiColourAnalysis.py +103 -0
- PYME/LMVis/Extras/multiviewMapping.py +489 -0
- PYME/LMVis/Extras/objectMeasurements.py +246 -0
- PYME/LMVis/Extras/particleTracking.py +272 -0
- PYME/LMVis/Extras/perFrameVariable.py +77 -0
- PYME/LMVis/Extras/photophysics.py +72 -0
- PYME/LMVis/Extras/pointSetGeneration.py +232 -0
- PYME/LMVis/Extras/pointwiseColoc.py +54 -0
- PYME/LMVis/Extras/saved_views.py +125 -0
- PYME/LMVis/Extras/scaleBox.py +115 -0
- PYME/LMVis/Extras/sequentialSpecies.py +125 -0
- PYME/LMVis/Extras/setBGImage.py +74 -0
- PYME/LMVis/Extras/shiftmapGenerator.py +138 -0
- PYME/LMVis/Extras/showShortcuts.py +69 -0
- PYME/LMVis/Extras/snapshot.py +135 -0
- PYME/LMVis/Extras/spherical_harmonics.py +98 -0
- PYME/LMVis/Extras/subsets.py +15 -0
- PYME/LMVis/Extras/surface_fitting.py +52 -0
- PYME/LMVis/Extras/temperaturePlot.py +53 -0
- PYME/LMVis/Extras/vibration.py +112 -0
- PYME/LMVis/VisGUI.py +506 -0
- PYME/LMVis/__init__.py +39 -0
- PYME/LMVis/colourFilterGUI.py +77 -0
- PYME/LMVis/colourPanel.py +491 -0
- PYME/LMVis/displayPane.py +462 -0
- PYME/LMVis/dyeRatios.py +116 -0
- PYME/LMVis/genImageDialog.py +298 -0
- PYME/LMVis/gl_offScreenHandler.py +134 -0
- PYME/LMVis/gl_render.py +1302 -0
- PYME/LMVis/gl_render3D.py +1453 -0
- PYME/LMVis/gl_render3D_shaders.py +1213 -0
- PYME/LMVis/glcanvas_core.py +1157 -0
- PYME/LMVis/imageView.py +752 -0
- PYME/LMVis/imageView2.py +372 -0
- PYME/LMVis/importTextDialog.py +342 -0
- PYME/LMVis/layer_panel.py +231 -0
- PYME/LMVis/layers/AxesOverlayLayer.py +126 -0
- PYME/LMVis/layers/LUTOverlayLayer.py +346 -0
- PYME/LMVis/layers/OverlayLayer.py +46 -0
- PYME/LMVis/layers/ScaleBarOverlayLayer.py +97 -0
- PYME/LMVis/layers/ScaleBoxOverlayLayer.py +181 -0
- PYME/LMVis/layers/SelectionOverlayLayer.py +124 -0
- PYME/LMVis/layers/__init__.py +53 -0
- PYME/LMVis/layers/base.py +319 -0
- PYME/LMVis/layers/image_layer.py +363 -0
- PYME/LMVis/layers/labels.py +186 -0
- PYME/LMVis/layers/layer_defaults.py +97 -0
- PYME/LMVis/layers/mesh.py +378 -0
- PYME/LMVis/layers/octree.py +194 -0
- PYME/LMVis/layers/pointcloud.py +372 -0
- PYME/LMVis/layers/quiver.py +271 -0
- PYME/LMVis/layers/text.py +250 -0
- PYME/LMVis/layers/tracks.py +309 -0
- PYME/LMVis/mv_math.py +78 -0
- PYME/LMVis/objectDarkMeasure.py +120 -0
- PYME/LMVis/pipeline.py +1227 -0
- PYME/LMVis/pipelineView.py +115 -0
- PYME/LMVis/pointSettingsPanel.py +135 -0
- PYME/LMVis/progGraph.py +59 -0
- PYME/LMVis/quadTreeSettings.py +90 -0
- PYME/LMVis/rendGauss.py +158 -0
- PYME/LMVis/renderers.py +576 -0
- PYME/LMVis/sessionpaths.py +136 -0
- PYME/LMVis/setup.py +39 -0
- PYME/LMVis/setup_exe.py +71 -0
- PYME/LMVis/shader_programs/DefaultShaderProgram.py +149 -0
- PYME/LMVis/shader_programs/GLProgram.py +119 -0
- PYME/LMVis/shader_programs/GouraudShaderProgram.py +157 -0
- PYME/LMVis/shader_programs/PointSpriteShaderProgram.py +163 -0
- PYME/LMVis/shader_programs/ShaderProgramFactory.py +54 -0
- PYME/LMVis/shader_programs/TesselShaderProgram.py +47 -0
- PYME/LMVis/shader_programs/WireFrameShaderProgram.py +50 -0
- PYME/LMVis/shader_programs/__init__.py +20 -0
- PYME/LMVis/shader_programs/oit_compositor.py +23 -0
- PYME/LMVis/shader_programs/shader_loader.py +84 -0
- PYME/LMVis/shader_programs/shader_program.py +168 -0
- PYME/LMVis/shader_programs/shaders/bigflatpoints_fs.glsl +16 -0
- PYME/LMVis/shader_programs/shaders/bigpoints_gs.glsl +40 -0
- PYME/LMVis/shader_programs/shaders/bigpointsprites_fs.glsl +20 -0
- PYME/LMVis/shader_programs/shaders/bigspheres_fs.glsl +53 -0
- PYME/LMVis/shader_programs/shaders/compose_fs.glsl +41 -0
- PYME/LMVis/shader_programs/shaders/compose_vs.glsl +25 -0
- PYME/LMVis/shader_programs/shaders/default_fs.glsl +27 -0
- PYME/LMVis/shader_programs/shaders/default_vs.glsl +88 -0
- PYME/LMVis/shader_programs/shaders/flatpoints_fs.glsl +27 -0
- PYME/LMVis/shader_programs/shaders/gouraud_flatpoints_fs.glsl +30 -0
- PYME/LMVis/shader_programs/shaders/gouraud_fs.glsl +26 -0
- PYME/LMVis/shader_programs/shaders/gouraud_oit_fs.glsl +68 -0
- PYME/LMVis/shader_programs/shaders/gouraud_vs.glsl +135 -0
- PYME/LMVis/shader_programs/shaders/image_fs.glsl +60 -0
- PYME/LMVis/shader_programs/shaders/image_vs.glsl +79 -0
- PYME/LMVis/shader_programs/shaders/phong_fs.glsl +43 -0
- PYME/LMVis/shader_programs/shaders/phong_vs.glsl +45 -0
- PYME/LMVis/shader_programs/shaders/pointsprites_fs.glsl +33 -0
- PYME/LMVis/shader_programs/shaders/pointsprites_vs.glsl +77 -0
- PYME/LMVis/shader_programs/shaders/spheres_fs.glsl +102 -0
- PYME/LMVis/shader_programs/shaders/tessel_fs.glsl +23 -0
- PYME/LMVis/shader_programs/shaders/tessel_vs.glsl +37 -0
- PYME/LMVis/shader_programs/shaders/text_fs.glsl +42 -0
- PYME/LMVis/shader_programs/shaders/text_vs.glsl +84 -0
- PYME/LMVis/shader_programs/shaders/widelines_fs.glsl +19 -0
- PYME/LMVis/shader_programs/shaders/widelines_gs.glsl +56 -0
- PYME/LMVis/shader_programs/shaders/widelines_vs.glsl +51 -0
- PYME/LMVis/statusLog.py +57 -0
- PYME/LMVis/triBlobs.py +142 -0
- PYME/LMVis/view_clipping_pane.py +429 -0
- PYME/LMVis/views.py +275 -0
- PYME/LMVis/visCore.py +1005 -0
- PYME/LMVis/visHelpers.py +880 -0
- PYME/LMVis/visHelpersMin.py +230 -0
- PYME/LMVis/workspaceTree.py +238 -0
- PYME/__init__.py +22 -0
- PYME/cluster/HTTPDataServer.py +1063 -0
- PYME/cluster/HTTPRulePusher.py +382 -0
- PYME/cluster/HTTPTaskPusher.py +377 -0
- PYME/cluster/PYMERuleNodeServer.py +192 -0
- PYME/cluster/PYMERuleServer.py +109 -0
- PYME/cluster/__init__.py +0 -0
- PYME/cluster/clusterUI/accounts/__init__.py +0 -0
- PYME/cluster/clusterUI/accounts/admin.py +85 -0
- PYME/cluster/clusterUI/accounts/forms.py +8 -0
- PYME/cluster/clusterUI/accounts/migrations/0001_initial.py +31 -0
- PYME/cluster/clusterUI/accounts/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/accounts/models.py +44 -0
- PYME/cluster/clusterUI/accounts/templates/accounts/user_form.html +13 -0
- PYME/cluster/clusterUI/accounts/templates/registration/initial_complete.html +6 -0
- PYME/cluster/clusterUI/accounts/templates/registration/initial_confirm.html +13 -0
- PYME/cluster/clusterUI/accounts/templates/registration/initial_done.html +7 -0
- PYME/cluster/clusterUI/accounts/templates/registration/verification.html +2 -0
- PYME/cluster/clusterUI/accounts/templates/registration/verification_subject.txt +1 -0
- PYME/cluster/clusterUI/accounts/urls.py +19 -0
- PYME/cluster/clusterUI/accounts/views.py +36 -0
- PYME/cluster/clusterUI/clusterUI/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterUI/settings.py +147 -0
- PYME/cluster/clusterUI/clusterUI/urls.py +31 -0
- PYME/cluster/clusterUI/clusterUI/wsgi.py +16 -0
- PYME/cluster/clusterUI/clusterbrowser/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterbrowser/admin.py +3 -0
- PYME/cluster/clusterUI/clusterbrowser/apps.py +7 -0
- PYME/cluster/clusterUI/clusterbrowser/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterbrowser/models.py +5 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/base.html +129 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/dirlisting.html +231 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/form_new_folder.html +18 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/form_upload_file.html +17 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/lightlisting.html +25 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/registration/login.html +38 -0
- PYME/cluster/clusterUI/clusterbrowser/urls.py +10 -0
- PYME/cluster/clusterUI/clusterbrowser/views.py +148 -0
- PYME/cluster/clusterUI/clusterstatus/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterstatus/admin.py +3 -0
- PYME/cluster/clusterUI/clusterstatus/apps.py +7 -0
- PYME/cluster/clusterUI/clusterstatus/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterstatus/models.py +5 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/load_content.html +29 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/queue_info.html +28 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/queue_info_content.html +50 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/status_dash.html +29 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/status_dash_content.html +90 -0
- PYME/cluster/clusterUI/clusterstatus/urls.py +9 -0
- PYME/cluster/clusterUI/clusterstatus/views.py +69 -0
- PYME/cluster/clusterUI/clusterui_tornado.py +117 -0
- PYME/cluster/clusterUI/deploy.py +62 -0
- PYME/cluster/clusterUI/localization/__init__.py +0 -0
- PYME/cluster/clusterUI/localization/admin.py +3 -0
- PYME/cluster/clusterUI/localization/apps.py +7 -0
- PYME/cluster/clusterUI/localization/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/localization/models.py +5 -0
- PYME/cluster/clusterUI/localization/templates/localization/settings_form.html +67 -0
- PYME/cluster/clusterUI/localization/urls.py +10 -0
- PYME/cluster/clusterUI/localization/views.py +170 -0
- PYME/cluster/clusterUI/manage.py +17 -0
- PYME/cluster/clusterUI/recipes/__init__.py +0 -0
- PYME/cluster/clusterUI/recipes/admin.py +3 -0
- PYME/cluster/clusterUI/recipes/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/recipes/models.py +3 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/extra_inputs.html +35 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/form_recipe.html +82 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/input_list.html +7 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editor.html +28 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editor_common.html +46 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editrun.html +93 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_standalone.html +100 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_template.html +109 -0
- PYME/cluster/clusterUI/recipes/urls.py +17 -0
- PYME/cluster/clusterUI/recipes/views.py +109 -0
- PYME/cluster/cluster_of_one.py +200 -0
- PYME/cluster/dataserver_wsgi.py +615 -0
- PYME/cluster/distribution.py +71 -0
- PYME/cluster/rulenodeserver.py +487 -0
- PYME/cluster/rules.py +979 -0
- PYME/cluster/ruleserver.py +1106 -0
- PYME/cluster/status.py +101 -0
- PYME/cluster/taskWorkerHTTP.py +522 -0
- PYME/cluster/webdav.py +1102 -0
- PYME/config.py +659 -0
- PYME/contrib/TextCtrlAutoComplete.py +582 -0
- PYME/contrib/__init__.py +7 -0
- PYME/contrib/aniso/__init__.py +2 -0
- PYME/contrib/aniso/aniso.py +268 -0
- PYME/contrib/auiFloatBook.py +94 -0
- PYME/contrib/congrid.py +127 -0
- PYME/contrib/dispatch/__init__.py +19 -0
- PYME/contrib/dispatch/dispatcher.py +289 -0
- PYME/contrib/gohlke/__init__.py +1 -0
- PYME/contrib/gohlke/_tifffile.cp39-win_amd64.dll.a +0 -0
- PYME/contrib/gohlke/_tifffile.cp39-win_amd64.pyd +0 -0
- PYME/contrib/gohlke/czifile.py +1289 -0
- PYME/contrib/gohlke/fcsfiles.py +514 -0
- PYME/contrib/gohlke/setup.py +54 -0
- PYME/contrib/gohlke/tifffile.py +3095 -0
- PYME/contrib/listctrlMixins.py +896 -0
- PYME/contrib/lzw.py +838 -0
- PYME/contrib/pad/__init__.py +13 -0
- PYME/contrib/pad/info_pad.py +18 -0
- PYME/contrib/pad/pad.py +670 -0
- PYME/contrib/setup.py +38 -0
- PYME/contrib/wxPlotPanel.py +137 -0
- PYME/experimental/SimReconstruction.py +49 -0
- PYME/experimental/__init__.pxd +0 -0
- PYME/experimental/__init__.py +4 -0
- PYME/experimental/_octree.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/_octree.cp39-win_amd64.pyd +0 -0
- PYME/experimental/_octree.pyx +477 -0
- PYME/experimental/_treap.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/_treap.cp39-win_amd64.pyd +0 -0
- PYME/experimental/_treap.pyx +267 -0
- PYME/experimental/_triangle_mesh.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/_triangle_mesh.cp39-win_amd64.pyd +0 -0
- PYME/experimental/_triangle_mesh.pxd +149 -0
- PYME/experimental/_triangle_mesh.pyx +2787 -0
- PYME/experimental/aqavg.py +40 -0
- PYME/experimental/dcimgFileChucker.py +375 -0
- PYME/experimental/dcimgSpoolShim.py +174 -0
- PYME/experimental/dcimg_chuck_test.py +78 -0
- PYME/experimental/dual_marching_cubes.py +801 -0
- PYME/experimental/dual_marching_cubes_v2.py +645 -0
- PYME/experimental/expectationMaximisation.py +298 -0
- PYME/experimental/func_octree.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/func_octree.cp39-win_amd64.pyd +0 -0
- PYME/experimental/func_octree.pyx +381 -0
- PYME/experimental/fusionRadial.py +520 -0
- PYME/experimental/fusionUtils.py +522 -0
- PYME/experimental/isosurface.py +147 -0
- PYME/experimental/labview_spooling_hacks.py +48 -0
- PYME/experimental/marching_cubes.py +811 -0
- PYME/experimental/marching_tetrahedra.py +343 -0
- PYME/experimental/modified_marching_cubes.py +1245 -0
- PYME/experimental/music.py +25 -0
- PYME/experimental/octree.py +188 -0
- PYME/experimental/pSpaceMap.py +34 -0
- PYME/experimental/pointFitConfoc.py +112 -0
- PYME/experimental/scanner_control.py +107 -0
- PYME/experimental/setup.py +109 -0
- PYME/experimental/spark.py +31 -0
- PYME/experimental/tcHist.py +71 -0
- PYME/experimental/treap.py +262 -0
- PYME/experimental/triangle_mesh.py +2287 -0
- PYME/experimental/triangle_mesh_utils.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/triangle_mesh_utils.cp39-win_amd64.pyd +0 -0
- PYME/experimental/triangle_utils.py +87 -0
- PYME/experimental/triangular_mesh.py +2255 -0
- PYME/experimental/zMotionArtifactUtils.py +55 -0
- PYME/localization/FitFactories/AstigGaussFitFR.py +175 -0
- PYME/localization/FitFactories/AstigGaussGPUFitFR.py +326 -0
- PYME/localization/FitFactories/BeadConvolvedAstigGaussFit.py +206 -0
- PYME/localization/FitFactories/ChecksumFR.py +82 -0
- PYME/localization/FitFactories/ChecksumGPUFR.py +213 -0
- PYME/localization/FitFactories/ChecksumMultifitSR.py +86 -0
- PYME/localization/FitFactories/ConfocCOIR.py +93 -0
- PYME/localization/FitFactories/Dumbell3DFitR.py +193 -0
- PYME/localization/FitFactories/DumbellFitR.py +163 -0
- PYME/localization/FitFactories/FFBase.py +403 -0
- PYME/localization/FitFactories/Gauss3DFitR.py +213 -0
- PYME/localization/FitFactories/GaussFitConstrR.py +177 -0
- PYME/localization/FitFactories/GaussMultifitLinesR.py +351 -0
- PYME/localization/FitFactories/GaussMultifitR.py +326 -0
- PYME/localization/FitFactories/GaussMultifitSR.py +373 -0
- PYME/localization/FitFactories/InterpFitR.py +236 -0
- PYME/localization/FitFactories/InterpFitWFR.py +111 -0
- PYME/localization/FitFactories/Interpolators/CSInterpolator.py +148 -0
- PYME/localization/FitFactories/Interpolators/CubeSInterpolatorP.py +121 -0
- PYME/localization/FitFactories/Interpolators/CubicSplineInterpolator.py +69 -0
- PYME/localization/FitFactories/Interpolators/LinearInterpolator.py +135 -0
- PYME/localization/FitFactories/Interpolators/LinearPInterpolatorP.py +95 -0
- PYME/localization/FitFactories/Interpolators/__init__.py +33 -0
- PYME/localization/FitFactories/Interpolators/baseInterpolator.py +202 -0
- PYME/localization/FitFactories/LatFitCOIR.py +82 -0
- PYME/localization/FitFactories/LatGaussFitFR.py +220 -0
- PYME/localization/FitFactories/LatObjFindFR.py +85 -0
- PYME/localization/FitFactories/LatPSFFitR.py +142 -0
- PYME/localization/FitFactories/MultiviewFitInterpNR.py +400 -0
- PYME/localization/FitFactories/PRInterpFitQR.py +192 -0
- PYME/localization/FitFactories/PRInterpFitR.py +223 -0
- PYME/localization/FitFactories/ROIExtractNR.py +93 -0
- PYME/localization/FitFactories/SpecGaussFitFR.py +174 -0
- PYME/localization/FitFactories/SplitterFitCOIR.py +142 -0
- PYME/localization/FitFactories/SplitterFitFNR.py +312 -0
- PYME/localization/FitFactories/SplitterFitFusionR.py +318 -0
- PYME/localization/FitFactories/SplitterFitInterpBNR.py +357 -0
- PYME/localization/FitFactories/SplitterFitInterpNR.py +343 -0
- PYME/localization/FitFactories/SplitterFitScavNR.py +352 -0
- PYME/localization/FitFactories/SplitterMultifitSR.py +410 -0
- PYME/localization/FitFactories/SplitterObjFindR.py +194 -0
- PYME/localization/FitFactories/SplitterROIExtractNR.py +91 -0
- PYME/localization/FitFactories/SplitterShiftEstFR.py +230 -0
- PYME/localization/FitFactories/__init__.py +103 -0
- PYME/localization/FitFactories/fitCommon.py +195 -0
- PYME/localization/FitFactories/zEstimators/__init__.py +29 -0
- PYME/localization/FitFactories/zEstimators/astigEstimator.py +173 -0
- PYME/localization/FitFactories/zEstimators/biplaneEstimator.py +209 -0
- PYME/localization/FitFactories/zEstimators/genericDualEstimator.py +232 -0
- PYME/localization/FitFactories/zEstimators/genericEstimator.py +224 -0
- PYME/localization/FitFactories/zEstimators/priEstimator.py +255 -0
- PYME/localization/MetaDataEdit.py +543 -0
- PYME/localization/Test/30_9_series_A_1.sf +0 -0
- PYME/localization/Test/PRI.md +45 -0
- PYME/localization/Test/PRI_qr.md +52 -0
- PYME/localization/Test/PRI_r.md +52 -0
- PYME/localization/Test/__init__.py +22 -0
- PYME/localization/Test/astig.md +50 -0
- PYME/localization/Test/astigCOI.md +50 -0
- PYME/localization/Test/astig_gauss.md +52 -0
- PYME/localization/Test/astig_pe.md +50 -0
- PYME/localization/Test/astig_splitter.md +66 -0
- PYME/localization/Test/astig_splitterCOI.md +67 -0
- PYME/localization/Test/astig_splitterQ.md +66 -0
- PYME/localization/Test/astig_theory.md +50 -0
- PYME/localization/Test/astig_theory.psf +0 -0
- PYME/localization/Test/astig_theory.tif +0 -0
- PYME/localization/Test/beads1.psf +0 -0
- PYME/localization/Test/beads1.tif +0 -0
- PYME/localization/Test/biplane_splitter.md +75 -0
- PYME/localization/Test/biplane_splitter2.md +103 -0
- PYME/localization/Test/biplane_splitter3.md +115 -0
- PYME/localization/Test/defoc.md +48 -0
- PYME/localization/Test/dumbell_3d.md +52 -0
- PYME/localization/Test/fitTestJig.py +172 -0
- PYME/localization/Test/fitTestJigSCMOS.py +487 -0
- PYME/localization/Test/fitTestJigWC.py +225 -0
- PYME/localization/Test/gauss.md +50 -0
- PYME/localization/Test/gaussCOI.md +50 -0
- PYME/localization/Test/pri_pe.md +50 -0
- PYME/localization/Test/pri_theory.md +51 -0
- PYME/localization/Test/pri_theory.psf +0 -0
- PYME/localization/Test/pri_theory.tif +0 -0
- PYME/localization/Test/psf_astig.psf +0 -0
- PYME/localization/Test/psf_astig.tif +0 -0
- PYME/localization/Test/psf_astig_bg_d.psf +0 -0
- PYME/localization/Test/psf_astig_bg_d.tif +0 -0
- PYME/localization/Test/psf_astig_pe.psf +0 -0
- PYME/localization/Test/psf_astig_pe.tif +0 -0
- PYME/localization/Test/psf_decon.psf +0 -0
- PYME/localization/Test/psf_decon.tif +0 -0
- PYME/localization/Test/psf_decon_pe.psf +0 -0
- PYME/localization/Test/psf_decon_pe.tif +0 -0
- PYME/localization/Test/psf_guess.psf +0 -0
- PYME/localization/Test/splitter.md +63 -0
- PYME/localization/Test/splitter_scav.md +63 -0
- PYME/localization/Test/test.psf +0 -0
- PYME/localization/Test/test.tif +0 -0
- PYME/localization/Test/test_decon.psf +0 -0
- PYME/localization/Test/test_decon.tif +0 -0
- PYME/localization/Test/test_pe.psf +0 -0
- PYME/localization/Test/test_pe.tif +0 -0
- PYME/localization/Test/wf_theory.psf +0 -0
- PYME/localization/Test/wf_theory2.psf +0 -0
- PYME/localization/__init__.py +17 -0
- PYME/localization/autopsf/__init__.py +1 -0
- PYME/localization/autopsf/autopsf.py +486 -0
- PYME/localization/autopsf/roifit.py +310 -0
- PYME/localization/cInterp/__init__.py +24 -0
- PYME/localization/cInterp/cInterp.cp39-win_amd64.dll.a +0 -0
- PYME/localization/cInterp/cInterp.cp39-win_amd64.pyd +0 -0
- PYME/localization/cInterp/setup.py +54 -0
- PYME/localization/cModels/__init__.py +24 -0
- PYME/localization/cModels/gauss_app.cp39-win_amd64.dll.a +0 -0
- PYME/localization/cModels/gauss_app.cp39-win_amd64.pyd +0 -0
- PYME/localization/ofind.py +444 -0
- PYME/localization/ofind3d.py +306 -0
- PYME/localization/ofind_nofilt.py +128 -0
- PYME/localization/ofind_pri.py +478 -0
- PYME/localization/ofind_split.py +399 -0
- PYME/localization/ofind_xcorr.py +351 -0
- PYME/localization/ofind_xcorr_fw.py +441 -0
- PYME/localization/remFitBuf.py +657 -0
- PYME/localization/setup.py +56 -0
- PYME/localization/splitting.py +240 -0
- PYME/localization/twist.py +60 -0
- PYME/misc/TiSettings.py +36 -0
- PYME/misc/TiffImagePlugin.py +838 -0
- PYME/misc/VolProj.py +144 -0
- PYME/misc/__init__.py +25 -0
- PYME/misc/aligned_array.py +10 -0
- PYME/misc/aniso.py +29 -0
- PYME/misc/big_sur_fix.py +20 -0
- PYME/misc/check_for_updates.py +139 -0
- PYME/misc/colormaps.py +199 -0
- PYME/misc/colorsys.py +201 -0
- PYME/misc/computerName.py +33 -0
- PYME/misc/coverslipGeometries.py +60 -0
- PYME/misc/cython_numpy_monkey.py +40 -0
- PYME/misc/depGraph.py +406 -0
- PYME/misc/dirSize.py +31 -0
- PYME/misc/diskCleanup.py +64 -0
- PYME/misc/djangoRecarray.py +57 -0
- PYME/misc/django_widgets.py +27 -0
- PYME/misc/editgrid.py +101 -0
- PYME/misc/eventSpy.py +122 -0
- PYME/misc/exceptions.py +30 -0
- PYME/misc/facsPlot.py +89 -0
- PYME/misc/fbpIcons.py +90 -0
- PYME/misc/fftw_compat.py +28 -0
- PYME/misc/findCycles.py +91 -0
- PYME/misc/fortran_interrupt_defeat.py +43 -0
- PYME/misc/glassModel.py +64 -0
- PYME/misc/hash32.py +41 -0
- PYME/misc/hillcurve.py +88 -0
- PYME/misc/hybrid_ns.py +84 -0
- PYME/misc/kdFit.py +72 -0
- PYME/misc/locate.py +10 -0
- PYME/misc/memUsage.py +65 -0
- PYME/misc/memmap.py +52 -0
- PYME/misc/mock_ctypes.py +28 -0
- PYME/misc/mock_traits.py +59 -0
- PYME/misc/mock_traitsui.py +29 -0
- PYME/misc/pyme_zeroconf.py +287 -0
- PYME/misc/pyro_tracebacks.py +32 -0
- PYME/misc/read_agf.py +605 -0
- PYME/misc/sffake.py +16 -0
- PYME/misc/snells.py +71 -0
- PYME/misc/sqlite_ns.py +132 -0
- PYME/misc/sqlitendarray.py +56 -0
- PYME/misc/taskDef.py +44 -0
- PYME/misc/tempDB.py +56 -0
- PYME/misc/wxThread.py +33 -0
- PYME/misc/zemax.py +259 -0
- PYME/misc/zernike.py +151 -0
- PYME/pyme_warnings.py +70 -0
- PYME/recipes/Recipes/STEDDeconvolution.yaml +14 -0
- PYME/recipes/Recipes/STEDMinistacks.yaml +15 -0
- PYME/recipes/Recipes/STED_COP3.yaml +25 -0
- PYME/recipes/Recipes/blobMeas.yaml +19 -0
- PYME/recipes/Recipes/blobMeas2.yaml +37 -0
- PYME/recipes/Recipes/blobMeasSR.yaml +66 -0
- PYME/recipes/Recipes/coloc.yaml +43 -0
- PYME/recipes/Recipes/coloc_roi_masked.yaml +46 -0
- PYME/recipes/Recipes/multiblob.yaml +38 -0
- PYME/recipes/Recipes/pre_particleTracking.yaml +30 -0
- PYME/recipes/Recipes/segmentAndMeasureLoci.yaml +41 -0
- PYME/recipes/__init__.py +6 -0
- PYME/recipes/acquisition.py +158 -0
- PYME/recipes/bakeshop.py +32 -0
- PYME/recipes/base.py +1393 -0
- PYME/recipes/batchProcess.py +147 -0
- PYME/recipes/filters.py +394 -0
- PYME/recipes/fudges.py +41 -0
- PYME/recipes/graphing.py +108 -0
- PYME/recipes/html_recipe_editor.py +90 -0
- PYME/recipes/localisations.py +1386 -0
- PYME/recipes/machine_learning.py +286 -0
- PYME/recipes/measurement.py +1062 -0
- PYME/recipes/modules.py +50 -0
- PYME/recipes/multiview.py +435 -0
- PYME/recipes/output.py +667 -0
- PYME/recipes/pointcloud.py +510 -0
- PYME/recipes/processing.py +2954 -0
- PYME/recipes/pyramid.py +206 -0
- PYME/recipes/recipe.py +965 -0
- PYME/recipes/recipeGui.py +1029 -0
- PYME/recipes/recipeLayout.py +499 -0
- PYME/recipes/runRecipe.py +140 -0
- PYME/recipes/setup.py +37 -0
- PYME/recipes/simulation.py +91 -0
- PYME/recipes/skfilters.py +143 -0
- PYME/recipes/surface_fitting.py +776 -0
- PYME/recipes/tablefilters.py +275 -0
- PYME/recipes/tracking.py +343 -0
- PYME/recipes/traits.py +157 -0
- PYME/recipes/vertical_recipe_display.py +373 -0
- PYME/resources/__init__.py +23 -0
- PYME/resources/config_template/distributor.yaml +14 -0
- PYME/resources/config_template/nodeserver.yaml +15 -0
- PYME/resources/icons/LUT.png +0 -0
- PYME/resources/icons/YSM_Shield.png +0 -0
- PYME/resources/icons/YSM_logo.png +0 -0
- PYME/resources/icons/arrow.png +0 -0
- PYME/resources/icons/crosshairs.png +0 -0
- PYME/resources/icons/line_select.png +0 -0
- PYME/resources/icons/logo_fmhs.png +0 -0
- PYME/resources/icons/media-playback-pause.png +0 -0
- PYME/resources/icons/media-playback-start.png +0 -0
- PYME/resources/icons/media-skip-backward.png +0 -0
- PYME/resources/icons/media-skip-forward.png +0 -0
- PYME/resources/icons/mesh.png +0 -0
- PYME/resources/icons/mesh.svg +28 -0
- PYME/resources/icons/pmacquire.icns +0 -0
- PYME/resources/icons/pmacquire.ico +0 -0
- PYME/resources/icons/pmanal.icns +0 -0
- PYME/resources/icons/pmanal.ico +0 -0
- PYME/resources/icons/pmvis.icns +0 -0
- PYME/resources/icons/pmvis.ico +0 -0
- PYME/resources/icons/points.png +0 -0
- PYME/resources/icons/points.svg +16 -0
- PYME/resources/icons/pymeLogo.png +0 -0
- PYME/resources/icons/rect_select.png +0 -0
- PYME/resources/icons/squiggle_select.png +0 -0
- PYME/resources/icons/text3800.icns +0 -0
- PYME/resources/icons/text3800.ico +0 -0
- PYME/resources/icons/text3800.png +0 -0
- PYME/resources/icons/text3800.tif +0 -0
- PYME/resources/icons/text5377.icns +0 -0
- PYME/resources/icons/text5377.ico +0 -0
- PYME/resources/icons/text5377.png +0 -0
- PYME/resources/icons/tracks.png +0 -0
- PYME/resources/icons/tracks.svg +19 -0
- PYME/resources/icons/view-front.png +0 -0
- PYME/resources/icons/view-home.png +0 -0
- PYME/resources/icons/view-right.png +0 -0
- PYME/resources/icons/view-top.png +0 -0
- PYME/resources/test_datasets/README.md +8 -0
- PYME/resources/test_datasets/t_im.tif +0 -0
- PYME/resources/test_datasets/test_csv.csv +4282 -0
- PYME/resources/test_datasets/test_hdf.hdf +0 -0
- PYME/resources/web/rule_inline.html +21 -0
- PYME/resources/web/ruleserver.html +75 -0
- PYME/resources/web/static/bootstrap.min.js +7 -0
- PYME/resources/web/static/cluster.css +137 -0
- PYME/resources/web/static/css/bootstrap-theme.css +587 -0
- PYME/resources/web/static/css/bootstrap-theme.min.css +6 -0
- PYME/resources/web/static/css/bootstrap.css +6757 -0
- PYME/resources/web/static/css/bootstrap.min.css +6 -0
- PYME/resources/web/static/css/flat_design_colors_full.css +306 -0
- PYME/resources/web/static/css/recipe_editor.css +106 -0
- PYME/resources/web/static/dashboard.css +106 -0
- PYME/resources/web/static/fileselector.js +77 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.eot +0 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.svg +288 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.ttf +0 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.woff +0 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.woff2 +0 -0
- PYME/resources/web/static/images/osd_flat/LICENSE.txt +116 -0
- PYME/resources/web/static/images/osd_flat/README.md +9 -0
- PYME/resources/web/static/images/osd_flat/fullpage_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/fullpage_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/fullpage_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/fullpage_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_rest.png +0 -0
- PYME/resources/web/static/jigna-vue-bare.js +1395 -0
- PYME/resources/web/static/jquery.min.js +2 -0
- PYME/resources/web/static/jstree.min.js +6 -0
- PYME/resources/web/static/openSeadragonGL.js +102 -0
- PYME/resources/web/static/openseadragon-svg-overlay.js +103 -0
- PYME/resources/web/static/openseadragon-viewerinputhook.min.js +6 -0
- PYME/resources/web/static/openseadragon.min.js +9 -0
- PYME/resources/web/static/recipe_editor.js +119 -0
- PYME/resources/web/static/shaders/fragment/lut.glsl +20 -0
- PYME/resources/web/static/shaders/fragment/none.glsl +17 -0
- PYME/resources/web/static/shaders/fragment/outline.glsl +43 -0
- PYME/resources/web/static/shaders/fragment/rect.glsl +7 -0
- PYME/resources/web/static/shaders/fragment/sobel3.glsl +71 -0
- PYME/resources/web/static/shaders/fragment/white.glsl +4 -0
- PYME/resources/web/static/shaders/vertex/rect.glsl +22 -0
- PYME/resources/web/static/shaders/vertex/square.glsl +9 -0
- PYME/resources/web/static/utils.js +3 -0
- PYME/resources/web/static/viaWebGL.js +217 -0
- PYME/setup.py +109 -0
- PYME/setup_exe.py +57 -0
- PYME/simulation/__init__.py +0 -0
- PYME/simulation/locify.py +319 -0
- PYME/simulation/pointsets.py +279 -0
- PYME/simulation/wormlike.py +99 -0
- PYME/simulation/wormlike2.py +198 -0
- PYME/simulation/wormlike3.py +197 -0
- PYME/simulation/wormlike_curled.py +104 -0
- PYME/tileviewer/__init__.py +0 -0
- PYME/tileviewer/templates/roi_list.html +12 -0
- PYME/tileviewer/templates/tileviewer.html +247 -0
- PYME/tileviewer/tileviewer.py +207 -0
- PYME/ui/AUIFrame.py +279 -0
- PYME/ui/MetadataTree.py +469 -0
- PYME/ui/__init__.py +4 -0
- PYME/ui/about_dlg.py +29 -0
- PYME/ui/autoFoldPanel.py +643 -0
- PYME/ui/cascading_layout.py +45 -0
- PYME/ui/crop_dialog.py +145 -0
- PYME/ui/custom_traits_editors.py +508 -0
- PYME/ui/editFilterDialog.py +80 -0
- PYME/ui/editList.py +40 -0
- PYME/ui/fastGraph.py +240 -0
- PYME/ui/filterPane.py +348 -0
- PYME/ui/histLimits.py +543 -0
- PYME/ui/layerFoldPanel.py +232 -0
- PYME/ui/manualFoldPanel.py +870 -0
- PYME/ui/mytimer.py +116 -0
- PYME/ui/patch_traitsui.py +151 -0
- PYME/ui/progress.py +160 -0
- PYME/ui/recArrayView.py +145 -0
- PYME/ui/selection.py +71 -0
- PYME/ui/shell.py +37 -0
- PYME/ui/traitsui_constants.py +91 -0
- PYME/ui/wx_compat.py +43 -0
- PYME/update_version.py +159 -0
- PYME/util/__init__.py +3 -0
- PYME/util/authenticate.py +164 -0
- PYME/util/execfile.py +21 -0
- PYME/util/fProfile/__init__.py +1 -0
- PYME/util/fProfile/convertProfile.py +117 -0
- PYME/util/fProfile/fProfile.py +162 -0
- PYME/util/fProfile/html/404.html +60 -0
- PYME/util/fProfile/html/css/main.css +258 -0
- PYME/util/fProfile/html/css/normalize.css +427 -0
- PYME/util/fProfile/html/css/normalize.min.css +1 -0
- PYME/util/fProfile/html/index.html +64 -0
- PYME/util/fProfile/html/js/main.js +492 -0
- PYME/util/fProfile/html/js/plugins.js +24 -0
- PYME/util/fProfile/html/js/vendor/crossfilter.min.js +1 -0
- PYME/util/fProfile/html/js/vendor/jquery-1.11.2.min.js +4 -0
- PYME/util/fProfile/html/js/vendor/modernizr-2.8.3.min.js +4 -0
- PYME/util/fProfile/html/js/vendor/tinycolor-min.js +4 -0
- PYME/util/fProfile/viewProfile.py +30 -0
- PYME/util/install_dependencies.py +95 -0
- PYME/util/log_verbosity.py +11 -0
- PYME/util/mProfile/__init__.py +1 -0
- PYME/util/mProfile/colorize_db_t.py +297 -0
- PYME/util/mProfile/mProfile.py +164 -0
- PYME/util/mProfile/p.py +101 -0
- PYME/util/mProfile/tProfile.py +165 -0
- PYME/util/pymelauncher.py +47 -0
- PYME/util/shmarray/__init__.py +0 -0
- PYME/util/shmarray/shmTest.py +74 -0
- PYME/util/shmarray/shmarray.py +165 -0
- PYME/util/webframework.py +365 -0
- PYME/version.py +65 -0
- python_microscopy-25.6.5.dist-info/METADATA +68 -0
- python_microscopy-25.6.5.dist-info/RECORD +1277 -0
- python_microscopy-25.6.5.dist-info/WHEEL +4 -0
|
@@ -0,0 +1,1199 @@
|
|
|
1
|
+
#!/usr/bin/python
|
|
2
|
+
|
|
3
|
+
###############
|
|
4
|
+
# Camera.py
|
|
5
|
+
#
|
|
6
|
+
# Created: 12 September 2017
|
|
7
|
+
# Author : Z Marin
|
|
8
|
+
#
|
|
9
|
+
# Based on: AndorZyla.py, AndorIXon.py
|
|
10
|
+
#
|
|
11
|
+
# Copyright David Baddeley, 2012
|
|
12
|
+
# d.baddeley@auckland.ac.nz
|
|
13
|
+
#
|
|
14
|
+
# This program is free software: you can redistribute it and/or modify
|
|
15
|
+
# it under the terms of the GNU General Public License as published by
|
|
16
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
17
|
+
# (at your option) any later version.
|
|
18
|
+
#
|
|
19
|
+
# This program is distributed in the hope that it will be useful,
|
|
20
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
21
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
22
|
+
# GNU General Public License for more details.
|
|
23
|
+
#
|
|
24
|
+
# You should have received a copy of the GNU General Public License
|
|
25
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
26
|
+
#
|
|
27
|
+
################
|
|
28
|
+
|
|
29
|
+
from threading import Lock
|
|
30
|
+
|
|
31
|
+
from PYME.IO import MetaDataHandler
|
|
32
|
+
from PYME.Acquire import eventLog
|
|
33
|
+
|
|
34
|
+
from PYME import config
|
|
35
|
+
from . import camera_noise
|
|
36
|
+
import warnings
|
|
37
|
+
|
|
38
|
+
import numpy as np
|
|
39
|
+
import logging
|
|
40
|
+
logger = logging.getLogger(__name__)
|
|
41
|
+
|
|
42
|
+
def check_mapexists(mdh, type='dark', fill=True):
|
|
43
|
+
import os
|
|
44
|
+
from PYME.IO import clusterIO
|
|
45
|
+
from PYME.IO.FileUtils import nameUtils
|
|
46
|
+
from PYME.Analysis.gen_sCMOS_maps import map_filename
|
|
47
|
+
|
|
48
|
+
if type == 'dark':
|
|
49
|
+
id = 'Camera.DarkMapID'
|
|
50
|
+
elif type == 'variance':
|
|
51
|
+
id = 'Camera.VarianceMapID'
|
|
52
|
+
elif type == 'flatfield':
|
|
53
|
+
id = 'Camera.FlatfieldMapID'
|
|
54
|
+
else:
|
|
55
|
+
raise RuntimeError('unknown map type %s' % type)
|
|
56
|
+
|
|
57
|
+
mapfn = map_filename(mdh, type)
|
|
58
|
+
|
|
59
|
+
# find and record calibration paths
|
|
60
|
+
local_path = os.path.join(nameUtils.getCalibrationDir(mdh['Camera.SerialNumber']), mapfn)
|
|
61
|
+
cluster_path = 'CALIBRATION/%s/%s' % (mdh['Camera.SerialNumber'], mapfn)
|
|
62
|
+
|
|
63
|
+
try:
|
|
64
|
+
cluster_map_exists = clusterIO.exists(cluster_path)
|
|
65
|
+
except OSError:
|
|
66
|
+
# The cluster might not be running, if the cluster is not running, we clusterIO.exists throws an error.
|
|
67
|
+
# catch this to allow offline spooling (see issue #1141)
|
|
68
|
+
cluster_map_exists = False
|
|
69
|
+
|
|
70
|
+
if cluster_map_exists:
|
|
71
|
+
c_path = 'PYME-CLUSTER://%s/%s' % (clusterIO.local_serverfilter, cluster_path)
|
|
72
|
+
if fill:
|
|
73
|
+
mdh[id] = c_path
|
|
74
|
+
return c_path
|
|
75
|
+
elif os.path.exists(local_path):
|
|
76
|
+
if fill:
|
|
77
|
+
mdh[id] = local_path
|
|
78
|
+
return local_path
|
|
79
|
+
else:
|
|
80
|
+
return None
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class CameraMapMixin(object):
|
|
84
|
+
def _map_cache_key(self, mdh, map_type):
|
|
85
|
+
if map_type == 'flatfield':
|
|
86
|
+
return (map_type, mdh['Camera.SerialNumber'])
|
|
87
|
+
else:
|
|
88
|
+
return (map_type, mdh['Camera.SerialNumber'], mdh['Camera.IntegrationTime'])
|
|
89
|
+
|
|
90
|
+
def _fill_camera_map_id(self, mdh, mdh_key, map_type):
|
|
91
|
+
#create cache if not already present
|
|
92
|
+
if not hasattr(self, '_camera_map_cache'):
|
|
93
|
+
self._camera_map_cache = {}
|
|
94
|
+
|
|
95
|
+
cache_key = self._map_cache_key(mdh, map_type)
|
|
96
|
+
try:
|
|
97
|
+
map_fn = self._camera_map_cache[cache_key]
|
|
98
|
+
except KeyError:
|
|
99
|
+
map_fn = check_mapexists(mdh, map_type, fill=False)
|
|
100
|
+
self._camera_map_cache[cache_key] = map_fn
|
|
101
|
+
|
|
102
|
+
if not map_fn is None:
|
|
103
|
+
mdh[mdh_key] = map_fn
|
|
104
|
+
|
|
105
|
+
def fill_camera_map_metadata(self, mdh):
|
|
106
|
+
self._fill_camera_map_id(mdh, 'Camera.DarkMapID', map_type='dark')
|
|
107
|
+
self._fill_camera_map_id(mdh, 'Camera.VarianceMapID', map_type='variance')
|
|
108
|
+
self._fill_camera_map_id(mdh, 'Camera.FlatfieldMapID', map_type='flatfield')
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
class Camera(object):
|
|
112
|
+
# Frame format - PYME previously supported frames in a custom format, but numpy_frames should always be true for current code
|
|
113
|
+
numpy_frames = 1 #Frames are delivered as numpy arrays.
|
|
114
|
+
|
|
115
|
+
# Acquisition modes
|
|
116
|
+
MODE_SINGLE_SHOT = 0
|
|
117
|
+
MODE_CONTINUOUS = 1
|
|
118
|
+
MODE_SOFTWARE_TRIGGER = 2
|
|
119
|
+
MODE_HARDWARE_TRIGGER = 3
|
|
120
|
+
MODE_HARDWARE_START_TRIGGER = 4
|
|
121
|
+
|
|
122
|
+
# Does this camera support a software trigger?
|
|
123
|
+
# Should be overridden in derived classes if the camera supports software triggering,
|
|
124
|
+
# and the derived class should also implement the FireSoftwareTrigger method
|
|
125
|
+
supports_software_trigger = False
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def __init__(self, *args, **kwargs):
|
|
129
|
+
"""
|
|
130
|
+
Create a camera object. This gets called from the PYMEAcquire init
|
|
131
|
+
script, which is custom for any given microscope and can take
|
|
132
|
+
whatever arguments are needed for a given camera.
|
|
133
|
+
|
|
134
|
+
.. note:: The one stipulation is that the Camera should register itself
|
|
135
|
+
as providing metadata.
|
|
136
|
+
|
|
137
|
+
Parameters
|
|
138
|
+
----------
|
|
139
|
+
args :
|
|
140
|
+
Optional arguments, usually instantiated in inherited camera.
|
|
141
|
+
kwargs :
|
|
142
|
+
Optional dictionary of arguments, usually instantiated in
|
|
143
|
+
inherited camera.
|
|
144
|
+
|
|
145
|
+
"""
|
|
146
|
+
|
|
147
|
+
self.active = True # Should the camera write its metadata?
|
|
148
|
+
|
|
149
|
+
self._saturation_threshold = (2**16) - 1 # default saturation threshold, if not provided in noise_properties
|
|
150
|
+
|
|
151
|
+
# Register as a provider of metadata (record camera settings)
|
|
152
|
+
# this is important so that the camera settings get recorded
|
|
153
|
+
MetaDataHandler.provideStartMetadata.append(self.GenStartMetadata)
|
|
154
|
+
|
|
155
|
+
def Init(self):
|
|
156
|
+
"""
|
|
157
|
+
Optional intialization function. Also called from the init script.
|
|
158
|
+
Not really part of 'specification'
|
|
159
|
+
"""
|
|
160
|
+
pass
|
|
161
|
+
|
|
162
|
+
@property
|
|
163
|
+
def contMode(self):
|
|
164
|
+
""" return whether the camera is runnint in continuous mode or not. This property (was previously a class member
|
|
165
|
+
variable) is required to allow the calling code to determine whether it needs to restart exposures after processing
|
|
166
|
+
the previous one."""
|
|
167
|
+
return self.GetAcquisitionMode() != self.MODE_SINGLE_SHOT
|
|
168
|
+
|
|
169
|
+
def ExpReady(self):
|
|
170
|
+
"""
|
|
171
|
+
Checks whether there are any frames waiting in the camera buffers
|
|
172
|
+
|
|
173
|
+
Returns
|
|
174
|
+
-------
|
|
175
|
+
exposureReady : bool
|
|
176
|
+
True if there are frames waiting
|
|
177
|
+
|
|
178
|
+
"""
|
|
179
|
+
|
|
180
|
+
raise NotImplementedError('Implemented in derived class.')
|
|
181
|
+
|
|
182
|
+
def GetName(self):
|
|
183
|
+
""" Camera name.
|
|
184
|
+
|
|
185
|
+
FIXME - Do we need this???
|
|
186
|
+
|
|
187
|
+
"""
|
|
188
|
+
raise NotImplementedError('Implemented in derived class.')
|
|
189
|
+
|
|
190
|
+
def CamReady(self):
|
|
191
|
+
"""
|
|
192
|
+
Returns true if the camera is ready (initialized) not really used for
|
|
193
|
+
anything, but might still be checked.
|
|
194
|
+
|
|
195
|
+
Returns
|
|
196
|
+
-------
|
|
197
|
+
bool
|
|
198
|
+
Is the camera ready?
|
|
199
|
+
"""
|
|
200
|
+
|
|
201
|
+
return True
|
|
202
|
+
|
|
203
|
+
def ExtractColor(self, chSlice, mode):
|
|
204
|
+
"""
|
|
205
|
+
Pulls the oldest frame from the camera buffer and copies it into memory we provide. Note that the function
|
|
206
|
+
signature and parameters are a legacy of very old code written for a colour camera with a bayer mask.
|
|
207
|
+
|
|
208
|
+
Parameters
|
|
209
|
+
----------
|
|
210
|
+
chSlice : `~numpy.ndarray`
|
|
211
|
+
The array we want to put the data into
|
|
212
|
+
mode : int, ignored
|
|
213
|
+
Previously specified how to deal with the Bayer mask.
|
|
214
|
+
|
|
215
|
+
Returns
|
|
216
|
+
-------
|
|
217
|
+
None
|
|
218
|
+
"""
|
|
219
|
+
raise NotImplementedError('Implemented in derived class.')
|
|
220
|
+
|
|
221
|
+
def GetHeadModel(self):
|
|
222
|
+
"""
|
|
223
|
+
Get the the camera head model name.
|
|
224
|
+
|
|
225
|
+
Returns
|
|
226
|
+
-------
|
|
227
|
+
str
|
|
228
|
+
camera model namet
|
|
229
|
+
"""
|
|
230
|
+
raise NotImplementedError('Should be implemented in derived class.')
|
|
231
|
+
|
|
232
|
+
def GetSerialNumber(self):
|
|
233
|
+
"""
|
|
234
|
+
Get the camera serial number
|
|
235
|
+
|
|
236
|
+
Returns
|
|
237
|
+
-------
|
|
238
|
+
serialNum : str
|
|
239
|
+
The camera serial number
|
|
240
|
+
|
|
241
|
+
"""
|
|
242
|
+
raise NotImplementedError('Should be implemented in derived class.')
|
|
243
|
+
|
|
244
|
+
def SetIntegTime(self, iTime):
|
|
245
|
+
"""
|
|
246
|
+
Sets the exposure time in s. Currently assumes that we will want to go as fast as possible at this exposure time
|
|
247
|
+
and also sets the frame rate to match.
|
|
248
|
+
|
|
249
|
+
Parameters
|
|
250
|
+
----------
|
|
251
|
+
iTime : float
|
|
252
|
+
Exposure time in s
|
|
253
|
+
|
|
254
|
+
Returns
|
|
255
|
+
-------
|
|
256
|
+
None
|
|
257
|
+
|
|
258
|
+
See Also
|
|
259
|
+
--------
|
|
260
|
+
GetIntegTime
|
|
261
|
+
"""
|
|
262
|
+
raise NotImplementedError('Implemented in derived class.')
|
|
263
|
+
|
|
264
|
+
def GetIntegTime(self):
|
|
265
|
+
"""
|
|
266
|
+
Get Camera object integration time.
|
|
267
|
+
|
|
268
|
+
Returns
|
|
269
|
+
-------
|
|
270
|
+
float
|
|
271
|
+
The exposure time in s
|
|
272
|
+
|
|
273
|
+
See Also
|
|
274
|
+
--------
|
|
275
|
+
SetIntegTime
|
|
276
|
+
"""
|
|
277
|
+
|
|
278
|
+
raise NotImplementedError('Implemented in derived class.')
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
def GetCycleTime(self):
|
|
282
|
+
"""
|
|
283
|
+
Get camera cycle time (1/fps) in seconds (float)
|
|
284
|
+
|
|
285
|
+
Returns
|
|
286
|
+
-------
|
|
287
|
+
float
|
|
288
|
+
Camera cycle time (seconds)
|
|
289
|
+
"""
|
|
290
|
+
raise NotImplementedError('Implemented in derived class.')
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
def GetCCDWidth(self):
|
|
294
|
+
"""
|
|
295
|
+
Returns
|
|
296
|
+
-------
|
|
297
|
+
int
|
|
298
|
+
The sensor width in pixels
|
|
299
|
+
|
|
300
|
+
"""
|
|
301
|
+
raise NotImplementedError('Implemented in derived class.')
|
|
302
|
+
|
|
303
|
+
def GetCCDHeight(self):
|
|
304
|
+
"""
|
|
305
|
+
Returns
|
|
306
|
+
-------
|
|
307
|
+
int
|
|
308
|
+
The sensor height in pixels
|
|
309
|
+
|
|
310
|
+
"""
|
|
311
|
+
raise NotImplementedError('Implemented in derived class.')
|
|
312
|
+
|
|
313
|
+
def GetPicWidth(self):
|
|
314
|
+
"""
|
|
315
|
+
Returns the width (in pixels) of the currently selected ROI.
|
|
316
|
+
|
|
317
|
+
Returns
|
|
318
|
+
-------
|
|
319
|
+
int
|
|
320
|
+
Width of ROI (pixels)
|
|
321
|
+
"""
|
|
322
|
+
raise NotImplementedError('Implemented in derived class.')
|
|
323
|
+
|
|
324
|
+
def GetPicHeight(self):
|
|
325
|
+
"""
|
|
326
|
+
Returns the height (in pixels) of the currently selected ROI
|
|
327
|
+
|
|
328
|
+
Returns
|
|
329
|
+
-------
|
|
330
|
+
int
|
|
331
|
+
Height of ROI (pixels)
|
|
332
|
+
"""
|
|
333
|
+
raise NotImplementedError('Implemented in derived class.')
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
#Binning is not really supported in current software, making these commands mostly superfluous
|
|
338
|
+
#Being able to read out the binning (GetHorizBin, GetVertBin) is however necessary
|
|
339
|
+
#these should definitely be revisited
|
|
340
|
+
def SetHorizontalBin(self, value):
|
|
341
|
+
raise NotImplementedError("Implemented in derived class.")
|
|
342
|
+
|
|
343
|
+
def GetHorizontalBin(self):
|
|
344
|
+
return 1
|
|
345
|
+
|
|
346
|
+
def SetVerticalBin(self, value):
|
|
347
|
+
raise NotImplementedError("Implemented in derived class.")
|
|
348
|
+
|
|
349
|
+
def GetVerticalBin(self):
|
|
350
|
+
return 1
|
|
351
|
+
|
|
352
|
+
def GetSupportedBinnings(self):
|
|
353
|
+
"""
|
|
354
|
+
returns a list of tuples [(binx, biny), ...] of supported binning configurations
|
|
355
|
+
|
|
356
|
+
"""
|
|
357
|
+
|
|
358
|
+
return [(1,1)]
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
# ROI Functions
|
|
362
|
+
def SetROIIndex(self, index):
|
|
363
|
+
"""
|
|
364
|
+
Used for early Andor Neo cameras with fixed ROIs. Should not be needed for most cameras
|
|
365
|
+
|
|
366
|
+
"""
|
|
367
|
+
raise NotImplementedError("Implement if needed.")
|
|
368
|
+
|
|
369
|
+
def SetROI(self, x1, y1, x2, y2):
|
|
370
|
+
"""
|
|
371
|
+
Set the ROI via coordinates (as opposed to via an index).
|
|
372
|
+
|
|
373
|
+
NOTE/FIXME: ROI handling is currently somewhat inconsistent between cameras, as a result of underlying differences
|
|
374
|
+
in the Camera APIs (some of which use zero based pixel indices and some of which use 1-based indices).
|
|
375
|
+
|
|
376
|
+
With the possible exception of the Hamamatsu Orca Flash support, the numpy convention is used, whereby:
|
|
377
|
+
|
|
378
|
+
x1, y1 are the zero based indices of the top-left pixel in the ROI and x2, y2 are the coordinates of the
|
|
379
|
+
bottom right corner of the ROI. It is important to note that, as with the python/numpy slice notation the row
|
|
380
|
+
and column with (zero based) coordinates y2 and x2 respectively are **excluded** from the ROI. IE an ROI [x1, y1, x2, y2]
|
|
381
|
+
goes from pixel index x1 up to, but not including pixel index x2 (this lets us define the ROI width as (x2-x1)).
|
|
382
|
+
|
|
383
|
+
Due to the fact that they map directly to API functions related to the Andor cameras, GetROIX1 and GetROIY1,
|
|
384
|
+
return indices which are 1-based and GetROIX2 and GetROIY2 match x2 and y2 as provided to SetROI. This is not
|
|
385
|
+
strictly followed in all cameras with the orca flash breaking convention. Rather than maintaining an inconsistent
|
|
386
|
+
indexing convention between the GetROIX...() functions and SetROI, these have been etc have been deprecated for
|
|
387
|
+
a single GetROI() function which uses the same conventions as SetROI
|
|
388
|
+
|
|
389
|
+
FIXME: How does the Orca handle x2, y2 ???
|
|
390
|
+
|
|
391
|
+
Parameters
|
|
392
|
+
----------
|
|
393
|
+
x1 : int
|
|
394
|
+
Left x-coordinate, zero-indexed
|
|
395
|
+
y1 : int
|
|
396
|
+
Top y-coordinate, zero-indexed
|
|
397
|
+
x2 : int
|
|
398
|
+
Right x-coordinate, (excluded from ROI)
|
|
399
|
+
y2 : int
|
|
400
|
+
Bottom y-coordinate, (excluded from ROI)
|
|
401
|
+
|
|
402
|
+
Returns
|
|
403
|
+
-------
|
|
404
|
+
None
|
|
405
|
+
|
|
406
|
+
|
|
407
|
+
"""
|
|
408
|
+
raise NotImplementedError('Implemented in derived class.')
|
|
409
|
+
|
|
410
|
+
def GetROI(self):
|
|
411
|
+
"""
|
|
412
|
+
|
|
413
|
+
Returns
|
|
414
|
+
-------
|
|
415
|
+
|
|
416
|
+
The ROI, [x1, y1, x2, y2] in the numpy convention used by SetROI
|
|
417
|
+
|
|
418
|
+
"""
|
|
419
|
+
raise NotImplementedError('Implemented in derived class.')
|
|
420
|
+
|
|
421
|
+
def GetROIX1(self):
|
|
422
|
+
"""
|
|
423
|
+
Gets the position of the leftmost pixel of the ROI. [Deprecated]
|
|
424
|
+
|
|
425
|
+
Returns
|
|
426
|
+
-------
|
|
427
|
+
int
|
|
428
|
+
Left x-coordinate of ROI. One based indexing
|
|
429
|
+
|
|
430
|
+
Notes
|
|
431
|
+
-----
|
|
432
|
+
This is broken for the Orca
|
|
433
|
+
"""
|
|
434
|
+
logger.warning("Deprecated - use GetROI() instead")
|
|
435
|
+
return self.GetROI()[0] + 1
|
|
436
|
+
|
|
437
|
+
|
|
438
|
+
def GetROIX2(self):
|
|
439
|
+
"""
|
|
440
|
+
Gets the position of the rightmost pixel of the ROI. [Deprecated]
|
|
441
|
+
|
|
442
|
+
Returns
|
|
443
|
+
-------
|
|
444
|
+
int
|
|
445
|
+
Right x-coordinate of ROI. One base indexing
|
|
446
|
+
|
|
447
|
+
|
|
448
|
+
"""
|
|
449
|
+
logger.warning("Deprecated - use GetROI() instead")
|
|
450
|
+
return self.GetROI()[2] + 1
|
|
451
|
+
|
|
452
|
+
def GetROIY1(self):
|
|
453
|
+
"""
|
|
454
|
+
Gets the position of the top row of the ROI. [Deprecated]
|
|
455
|
+
|
|
456
|
+
Returns
|
|
457
|
+
-------
|
|
458
|
+
int
|
|
459
|
+
Top y-coordinate of ROI. One based indexing
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
"""
|
|
463
|
+
logger.warning("Deprecated - use GetROI() instead")
|
|
464
|
+
return self.GetROI()[1]
|
|
465
|
+
|
|
466
|
+
def GetROIY2(self):
|
|
467
|
+
"""
|
|
468
|
+
Gets the position of the bottom row of the ROI. [Deprecated]
|
|
469
|
+
|
|
470
|
+
Returns
|
|
471
|
+
-------
|
|
472
|
+
int
|
|
473
|
+
Bottom y-coordinate of ROI. One based indexing
|
|
474
|
+
|
|
475
|
+
|
|
476
|
+
"""
|
|
477
|
+
logger.warning("Deprecated - use GetROI() instead")
|
|
478
|
+
return self.GetROI()[3]
|
|
479
|
+
|
|
480
|
+
def SetEMGain(self, gain):
|
|
481
|
+
"""
|
|
482
|
+
Set the electron-multiplying gain. For EMCCDs this is typically the
|
|
483
|
+
uncalibrated, gain register setting. The calibrated gain is computed
|
|
484
|
+
separately and saved in the metadata as TrueEMGain.
|
|
485
|
+
|
|
486
|
+
Parameters
|
|
487
|
+
----------
|
|
488
|
+
gain : float
|
|
489
|
+
EM gain of Camera object.
|
|
490
|
+
|
|
491
|
+
Returns
|
|
492
|
+
-------
|
|
493
|
+
None
|
|
494
|
+
|
|
495
|
+
See Also
|
|
496
|
+
--------
|
|
497
|
+
GetEMGain
|
|
498
|
+
"""
|
|
499
|
+
pass
|
|
500
|
+
|
|
501
|
+
def GetEMGain(self):
|
|
502
|
+
"""
|
|
503
|
+
Return electron-multiplying gain register setting. The actual gain will likely be a non-linear function of this
|
|
504
|
+
gain, so EMCCD cameras classes are encouraged to keep calibration data and to write this into the metadata as
|
|
505
|
+
'TrueEMGain'
|
|
506
|
+
|
|
507
|
+
For non-EMCCD cameras, this should return 1.
|
|
508
|
+
|
|
509
|
+
Returns
|
|
510
|
+
-------
|
|
511
|
+
float
|
|
512
|
+
Electron multiplying gain register setting
|
|
513
|
+
|
|
514
|
+
See Also
|
|
515
|
+
----------
|
|
516
|
+
GetTrueEMGain, SetEMGain
|
|
517
|
+
"""
|
|
518
|
+
return 1
|
|
519
|
+
|
|
520
|
+
def GetTrueEMGain(self):
|
|
521
|
+
"""
|
|
522
|
+
# FIXME - what is this doing here???????
|
|
523
|
+
|
|
524
|
+
Return true electron-multiplying gain of Camera object.
|
|
525
|
+
|
|
526
|
+
Returns
|
|
527
|
+
-------
|
|
528
|
+
float
|
|
529
|
+
Camera object adjusted true gain.
|
|
530
|
+
|
|
531
|
+
See Also
|
|
532
|
+
----------
|
|
533
|
+
GetEMGain
|
|
534
|
+
"""
|
|
535
|
+
return 1
|
|
536
|
+
|
|
537
|
+
|
|
538
|
+
|
|
539
|
+
|
|
540
|
+
|
|
541
|
+
|
|
542
|
+
def GetElectrTemp(*args):
|
|
543
|
+
"""
|
|
544
|
+
Returns the temperature of the internal electronics. Legacy of PCO Sensicam support, which had separate sensors
|
|
545
|
+
for CCD and electronics. Not actually used anywhere critical (might be recorded in metadata), can remove.
|
|
546
|
+
|
|
547
|
+
"""
|
|
548
|
+
return 25
|
|
549
|
+
|
|
550
|
+
def GetCCDTemp(self):
|
|
551
|
+
"""
|
|
552
|
+
Gets the sensor temperature.
|
|
553
|
+
|
|
554
|
+
Returns
|
|
555
|
+
-------
|
|
556
|
+
float
|
|
557
|
+
The sensor's temperature in degrees Celsius
|
|
558
|
+
"""
|
|
559
|
+
raise NotImplementedError('Implement in derived class.')
|
|
560
|
+
|
|
561
|
+
def GetCCDTempSetPoint(self):
|
|
562
|
+
"""
|
|
563
|
+
Get the target camera temperature. Only currently called in Ixon
|
|
564
|
+
related code, but potentially generally useful.
|
|
565
|
+
|
|
566
|
+
Returns
|
|
567
|
+
-------
|
|
568
|
+
float
|
|
569
|
+
Target camera temperature (Celsius)
|
|
570
|
+
"""
|
|
571
|
+
raise NotImplementedError('Implemented in derived class.')
|
|
572
|
+
|
|
573
|
+
def SetCCDTemp(self, temp):
|
|
574
|
+
"""
|
|
575
|
+
Set the target camera temperature.
|
|
576
|
+
|
|
577
|
+
Parameters
|
|
578
|
+
----------
|
|
579
|
+
temp : float
|
|
580
|
+
The target camera temperature (Celsius)
|
|
581
|
+
|
|
582
|
+
Returns
|
|
583
|
+
-------
|
|
584
|
+
None
|
|
585
|
+
"""
|
|
586
|
+
raise NotImplementedError('Implemented in derived class.')
|
|
587
|
+
|
|
588
|
+
def SetShutter(self, mode):
|
|
589
|
+
"""
|
|
590
|
+
Set the camera shutter (if available).
|
|
591
|
+
|
|
592
|
+
Parameters
|
|
593
|
+
----------
|
|
594
|
+
mode : bool
|
|
595
|
+
True (1) if open
|
|
596
|
+
"""
|
|
597
|
+
pass
|
|
598
|
+
|
|
599
|
+
def SetBaselineClamp(self, mode):
|
|
600
|
+
""" Set the camera baseline clamp (EMCCD). Only called from the Ixon settings panel, so not relevant for other
|
|
601
|
+
cameras."""
|
|
602
|
+
pass
|
|
603
|
+
|
|
604
|
+
|
|
605
|
+
def GetAcquisitionMode(self):
|
|
606
|
+
"""
|
|
607
|
+
Get the Camera object readout mode.
|
|
608
|
+
|
|
609
|
+
Returns
|
|
610
|
+
-------
|
|
611
|
+
int
|
|
612
|
+
One of:
|
|
613
|
+
MODE_CONTINUOUS
|
|
614
|
+
camera is free-running using internal timing
|
|
615
|
+
MODE_SINGLE_SHOT
|
|
616
|
+
captures single frame on acquisition start
|
|
617
|
+
MODE_SOFTWARE_TRIGGER
|
|
618
|
+
captures a single frame every time a software trigger is
|
|
619
|
+
sent. See `FireSoftwareTrigger`
|
|
620
|
+
MODE_HARDWARE_TRIGGER
|
|
621
|
+
captures a single frame every time an external hardware
|
|
622
|
+
trigger is received by the camera
|
|
623
|
+
MODE_HARDWARE_START_TRIGGER
|
|
624
|
+
camera waits for an external hardware trigger and enters
|
|
625
|
+
free-running internal timing mode once received
|
|
626
|
+
|
|
627
|
+
See Also
|
|
628
|
+
--------
|
|
629
|
+
SetAcquisitionMode
|
|
630
|
+
|
|
631
|
+
Notes
|
|
632
|
+
-----
|
|
633
|
+
Calling code should compare against the constants defined on the Camera class, rather than their integer values
|
|
634
|
+
|
|
635
|
+
"""
|
|
636
|
+
raise NotImplementedError('Should be implemented in derived class.')
|
|
637
|
+
|
|
638
|
+
def SetAcquisitionMode(self, mode):
|
|
639
|
+
"""
|
|
640
|
+
Set the readout mode of the Camera object. PYME currently supports
|
|
641
|
+
several modes; different options can be useful for timing. The primary
|
|
642
|
+
modes are single shot, where the camera takes one image, and then a new
|
|
643
|
+
exposure has to be manually triggered, or continuous / free running,
|
|
644
|
+
where the camera runs as fast as it can until we tell it to stop. Not all cameras support all modes. All cameras should support `MODE_CONTINUOUS` and `MODE_SINGLE_SHOT`, but care should be taken when using the other modes (i.e. usage probably need to be restricted to code which knows what type of camera it's dealing with). TODO - add a mechanism for cameras to report which modes they support.
|
|
645
|
+
|
|
646
|
+
|
|
647
|
+
Parameters
|
|
648
|
+
----------
|
|
649
|
+
mode : int
|
|
650
|
+
One of:
|
|
651
|
+
MODE_CONTINUOUS
|
|
652
|
+
camera is free-running using internal timing
|
|
653
|
+
MODE_SINGLE_SHOT
|
|
654
|
+
captures single frame on acquisition start
|
|
655
|
+
MODE_SOFTWARE_TRIGGER
|
|
656
|
+
captures a single frame every time a software trigger is
|
|
657
|
+
sent. See `FireSoftwareTrigger`
|
|
658
|
+
MODE_HARDWARE_TRIGGER
|
|
659
|
+
captures a single frame every time an external hardware
|
|
660
|
+
trigger is received by the camera
|
|
661
|
+
MODE_HARDWARE_START_TRIGGER
|
|
662
|
+
camera waits for an external hardware trigger and enters
|
|
663
|
+
free-running internal timing mode once received
|
|
664
|
+
|
|
665
|
+
Returns
|
|
666
|
+
-------
|
|
667
|
+
None
|
|
668
|
+
|
|
669
|
+
See Also
|
|
670
|
+
--------
|
|
671
|
+
GetAcquisitionMode
|
|
672
|
+
|
|
673
|
+
Notes
|
|
674
|
+
-----
|
|
675
|
+
Calling code should use the constants defined on the Camera class, rather than their integer values
|
|
676
|
+
"""
|
|
677
|
+
|
|
678
|
+
raise NotImplementedError('Should be implemented in derived class.')
|
|
679
|
+
|
|
680
|
+
def SetBurst(self, burstSize):
|
|
681
|
+
"""
|
|
682
|
+
Used with Andor Zyla/Neo for burst mode acquisition, can generally ignore for most cameras. Somewhat experimental
|
|
683
|
+
and does not currently have any UI bindings.
|
|
684
|
+
"""
|
|
685
|
+
raise NotImplementedError("Implement if needed")
|
|
686
|
+
|
|
687
|
+
def SetActive(self, active=True):
|
|
688
|
+
"""
|
|
689
|
+
Flag the Camera object as active (or inactive) to dictate whether or
|
|
690
|
+
not it writes its metadata.
|
|
691
|
+
|
|
692
|
+
Parameters
|
|
693
|
+
----------
|
|
694
|
+
active : bool
|
|
695
|
+
"""
|
|
696
|
+
|
|
697
|
+
self.active = bool(active)
|
|
698
|
+
|
|
699
|
+
def _log_exposure_start(self):
|
|
700
|
+
"""
|
|
701
|
+
Log a StartAq event to the event log to facilitate timestamping of acquisition frames.
|
|
702
|
+
This should be called in the StartExposure and FireSoftwareTrigger methods of derived camera classes.
|
|
703
|
+
"""
|
|
704
|
+
eventLog.logEvent('StartAq', '')
|
|
705
|
+
|
|
706
|
+
def StartExposure(self):
|
|
707
|
+
"""
|
|
708
|
+
Starts an acquisition.
|
|
709
|
+
|
|
710
|
+
Must call _log_exposure_start to log the start of the acquisition.
|
|
711
|
+
|
|
712
|
+
Returns
|
|
713
|
+
-------
|
|
714
|
+
int
|
|
715
|
+
Success (0) or failure (-1) of initialization.
|
|
716
|
+
"""
|
|
717
|
+
raise NotImplementedError('Implemented in derived class.')
|
|
718
|
+
|
|
719
|
+
|
|
720
|
+
def StopAq(self):
|
|
721
|
+
"""
|
|
722
|
+
Stops acquiring.
|
|
723
|
+
|
|
724
|
+
Returns
|
|
725
|
+
-------
|
|
726
|
+
None
|
|
727
|
+
"""
|
|
728
|
+
raise NotImplementedError('Implemented in derived class.')
|
|
729
|
+
|
|
730
|
+
|
|
731
|
+
def GetNumImsBuffered(self):
|
|
732
|
+
"""
|
|
733
|
+
Return the number of images in the buffer.
|
|
734
|
+
|
|
735
|
+
Returns
|
|
736
|
+
-------
|
|
737
|
+
int
|
|
738
|
+
Number of images in buffer
|
|
739
|
+
"""
|
|
740
|
+
raise NotImplementedError("Implemented in derived class.")
|
|
741
|
+
|
|
742
|
+
def GetBufferSize(self):
|
|
743
|
+
"""
|
|
744
|
+
Return the total size of the buffer (in images).
|
|
745
|
+
|
|
746
|
+
Returns
|
|
747
|
+
-------
|
|
748
|
+
int
|
|
749
|
+
Number of images that can be stored in the buffer.
|
|
750
|
+
"""
|
|
751
|
+
raise NotImplementedError("Implemented in derived class.")
|
|
752
|
+
|
|
753
|
+
|
|
754
|
+
@property
|
|
755
|
+
def _gain_mode(self):
|
|
756
|
+
"""
|
|
757
|
+
Should return a representation of the camera gain and/or preamp mode that can be used as a dictionary key.
|
|
758
|
+
Should be overriden in derived classes if they have any setable preamp gain modes to speak of.
|
|
759
|
+
This is used to look up noise properties by preamp setting, see noise_properties below.
|
|
760
|
+
"""
|
|
761
|
+
return 'fixed'
|
|
762
|
+
|
|
763
|
+
|
|
764
|
+
@property
|
|
765
|
+
def noise_properties(self):
|
|
766
|
+
"""
|
|
767
|
+
Return the noise properties for the given camera. This is a dictionary with the following entries
|
|
768
|
+
|
|
769
|
+
'ReadNoise' : camera read noise as a standard deviation in units of photoelectrons (e-)
|
|
770
|
+
'ElectronsPerCount' : AD conversion factor - how many electrons per ADU
|
|
771
|
+
'NoiseFactor' : excess (multiplicative) noise factor 1.44 for EMCCD, 1 for standard CCD/sCMOS. See
|
|
772
|
+
doi: 10.1109/TED.2003.813462
|
|
773
|
+
'SaturationThreshold' : the full well capacity (in ADU)
|
|
774
|
+
|
|
775
|
+
and optionally
|
|
776
|
+
|
|
777
|
+
'ADOffset' : the dark level (in ADU)
|
|
778
|
+
'DefaultEMGain' : a sensible EM gain setting to use for localization recording
|
|
779
|
+
|
|
780
|
+
|
|
781
|
+
These are sourced from config files, referenced by camera serial number and gain mode.
|
|
782
|
+
See :py:mod:`PYME.Acquire.Hardware.camera_noise` for details. There can be camera to camera to camera variations in
|
|
783
|
+
the valid values and meanings of `self._gain_mode`.
|
|
784
|
+
"""
|
|
785
|
+
try:
|
|
786
|
+
return camera_noise.noise_properties[self.GetSerialNumber()]['noise_properties'][self._gain_mode]
|
|
787
|
+
except KeyError: # last resort is a runtime error - we can debate what the best solution is
|
|
788
|
+
# we could also look for a 'default' entry in the properties
|
|
789
|
+
raise RuntimeError('Camera specific noise props not found for serial no "%s" and preamp mode "%s". See PYME.Acquire.Hardware.camera_noise for info on how to setup your camera'
|
|
790
|
+
% (self.GetSerialNumber(),self._gain_mode))
|
|
791
|
+
|
|
792
|
+
def GetStatus(self):
|
|
793
|
+
"""
|
|
794
|
+
Used to poll the camera for status information. Useful for some cameras where it makes sense
|
|
795
|
+
to make one API call to get the temperature, frame rate, num frames buffered etc ... and cache
|
|
796
|
+
the results. For most cameras can be safely ignored.
|
|
797
|
+
|
|
798
|
+
Parameters
|
|
799
|
+
----------
|
|
800
|
+
args
|
|
801
|
+
|
|
802
|
+
Returns
|
|
803
|
+
-------
|
|
804
|
+
|
|
805
|
+
"""
|
|
806
|
+
pass
|
|
807
|
+
|
|
808
|
+
def GetFPS(self):
|
|
809
|
+
"""
|
|
810
|
+
Get the camera frame rate in frames per second (float).
|
|
811
|
+
|
|
812
|
+
Returns
|
|
813
|
+
-------
|
|
814
|
+
float
|
|
815
|
+
Camera frame rate (frames per second)
|
|
816
|
+
"""
|
|
817
|
+
|
|
818
|
+
raise NotImplementedError('Implement in derived class')
|
|
819
|
+
|
|
820
|
+
def GenStartMetadata(self, mdh):
|
|
821
|
+
"""
|
|
822
|
+
FIXME - should this be in the base class ???
|
|
823
|
+
|
|
824
|
+
Create Camera metadata. This ensures the Camera's settings get
|
|
825
|
+
recorded.
|
|
826
|
+
|
|
827
|
+
Parameters
|
|
828
|
+
----------
|
|
829
|
+
mdh : MetaDataHandler
|
|
830
|
+
MetaDataHandler object for Camera.
|
|
831
|
+
|
|
832
|
+
Returns
|
|
833
|
+
-------
|
|
834
|
+
None
|
|
835
|
+
"""
|
|
836
|
+
|
|
837
|
+
if self.active:
|
|
838
|
+
# Set Camera object metadata here with calls to mdh.setEntry
|
|
839
|
+
self.GetStatus()
|
|
840
|
+
|
|
841
|
+
# Personal identification
|
|
842
|
+
try:
|
|
843
|
+
mdh.setEntry('Camera.Name', self.GetName())
|
|
844
|
+
mdh.setEntry('Camera.Model', self.GetHeadModel())
|
|
845
|
+
except NotImplementedError:
|
|
846
|
+
# cameras are not required to provide GetName(), GetHeadModel()
|
|
847
|
+
# and these metadata entries should not be depended on (might change).
|
|
848
|
+
pass
|
|
849
|
+
|
|
850
|
+
mdh.setEntry('Camera.SerialNumber', self.GetSerialNumber())
|
|
851
|
+
|
|
852
|
+
# Time
|
|
853
|
+
mdh.setEntry('Camera.IntegrationTime', self.GetIntegTime())
|
|
854
|
+
mdh.setEntry('Camera.CycleTime', self.GetCycleTime())
|
|
855
|
+
|
|
856
|
+
# Gain
|
|
857
|
+
mdh.setEntry('Camera.EMGain', self.GetEMGain())
|
|
858
|
+
mdh.setEntry('Camera.TrueEMGain', self.GetTrueEMGain())
|
|
859
|
+
|
|
860
|
+
# Noise
|
|
861
|
+
noiseProps = self.noise_properties
|
|
862
|
+
mdh.setEntry('Camera.ReadNoise', noiseProps['ReadNoise'])
|
|
863
|
+
mdh.setEntry('Camera.NoiseFactor', noiseProps.get('NoiseFactor', 1))
|
|
864
|
+
mdh.setEntry('Camera.ElectronsPerCount', noiseProps['ElectronsPerCount'])
|
|
865
|
+
|
|
866
|
+
# Temp
|
|
867
|
+
mdh.setEntry('Camera.StartCCDTemp', self.GetCCDTemp())
|
|
868
|
+
|
|
869
|
+
# Chip size
|
|
870
|
+
mdh.setEntry('Camera.SensorWidth', self.GetCCDWidth())
|
|
871
|
+
mdh.setEntry('Camera.SensorHeight', self.GetCCDHeight())
|
|
872
|
+
|
|
873
|
+
x1, y1, x2, y2 = self.GetROI()
|
|
874
|
+
mdh.setEntry('Camera.ROIOriginX', x1)
|
|
875
|
+
mdh.setEntry('Camera.ROIOriginY', y1)
|
|
876
|
+
mdh.setEntry('Camera.ROIWidth', x2 - x1)
|
|
877
|
+
mdh.setEntry('Camera.ROIHeight', y2 - y1)
|
|
878
|
+
|
|
879
|
+
@property
|
|
880
|
+
def SaturationThreshold(self):
|
|
881
|
+
"""
|
|
882
|
+
Returns
|
|
883
|
+
-------
|
|
884
|
+
int
|
|
885
|
+
the full well capacity (in ADU), typically 2^bitdepth - 1
|
|
886
|
+
"""
|
|
887
|
+
try:
|
|
888
|
+
return self.noise_properties['SaturationThreshold']
|
|
889
|
+
except (KeyError, RuntimeError):
|
|
890
|
+
return self._saturation_threshold
|
|
891
|
+
|
|
892
|
+
|
|
893
|
+
def Shutdown(self):
|
|
894
|
+
"""Shutdown and clean up the camera"""
|
|
895
|
+
pass
|
|
896
|
+
|
|
897
|
+
def __del__(self):
|
|
898
|
+
self.Shutdown()
|
|
899
|
+
|
|
900
|
+
|
|
901
|
+
#legacy methods, unused
|
|
902
|
+
|
|
903
|
+
def CheckCoordinates(*args):
|
|
904
|
+
# this could possibly get a reprieve, maybe ofter re-naming. Purpose was to decide if a given
|
|
905
|
+
# ROI was going to be valid
|
|
906
|
+
raise DeprecationWarning("Deprecated.")
|
|
907
|
+
|
|
908
|
+
def DisplayError(*args):
|
|
909
|
+
"""Completely deprecated and never called. Artifact of very old code which had GUI mixed up with camera. Should remove"""
|
|
910
|
+
raise DeprecationWarning("Deprecated.")
|
|
911
|
+
|
|
912
|
+
def GetBWPicture(*args):
|
|
913
|
+
"""Legacy of old code. Not called anywhere, should remove"""
|
|
914
|
+
raise DeprecationWarning("Deprecated.")
|
|
915
|
+
|
|
916
|
+
def GetNumberChannels(*args):
|
|
917
|
+
"""
|
|
918
|
+
Returns the number of colour channels in the Bayer mask. Legacy, deprecated, and not used
|
|
919
|
+
|
|
920
|
+
Returns
|
|
921
|
+
-------
|
|
922
|
+
the number of colour channels
|
|
923
|
+
|
|
924
|
+
"""
|
|
925
|
+
raise DeprecationWarning("Deprecated.")
|
|
926
|
+
|
|
927
|
+
def SetCOC(*args):
|
|
928
|
+
"""Legacy of sensicam support. Hopefully no longer called anywhere"""
|
|
929
|
+
raise DeprecationWarning("Deprecated.")
|
|
930
|
+
|
|
931
|
+
def StartLifePreview(*args):
|
|
932
|
+
"""Legacy of old code. Not called anywhere, should remove"""
|
|
933
|
+
raise DeprecationWarning("Deprecated.")
|
|
934
|
+
|
|
935
|
+
def StopLifePreview(*args):
|
|
936
|
+
"""Legacy of old code. Not called anywhere, should remove"""
|
|
937
|
+
raise DeprecationWarning("Deprecated.")
|
|
938
|
+
|
|
939
|
+
|
|
940
|
+
# DEPRECATED, TODO - schedule for removal
|
|
941
|
+
class MultiviewCameraMixin(object):
|
|
942
|
+
def __init__(self, multiview_info, default_roi, camera_class):
|
|
943
|
+
"""
|
|
944
|
+
Used principally for cutting horizontally spaced ROIs out of a vertical band of the sCMOS chip, where there
|
|
945
|
+
is dark space between the images and we want to avoid saving and transmitting this dark data.
|
|
946
|
+
|
|
947
|
+
This class supports the standard full chip and cropped ROI modes, as well as a new multiview mode. The
|
|
948
|
+
multiview mode makes the frames appear to the outside world as though they are just active multiview views
|
|
949
|
+
concatenated horizontally.
|
|
950
|
+
|
|
951
|
+
To implement a multiview camera, simply inherit both from the specific camera class you want as well as this
|
|
952
|
+
class, e.g.
|
|
953
|
+
class MultiviewCoolCamera(MultiviewCamera, CoolCamera)
|
|
954
|
+
def __init__(self, whatever_cool_cam_needs, multiview_info)
|
|
955
|
+
CoolCamera.__init__(self, whatever_cool_cam_needs)
|
|
956
|
+
default_roi = dict(xi=0, xf=2048, yi=0, yf=2048)
|
|
957
|
+
MultiviewCamera.__init__(self, multiview_info, default_roi, CoolCamera)
|
|
958
|
+
|
|
959
|
+
and that's it. Then in your init script, simply define your multiview_info dict and initialize your
|
|
960
|
+
MultiviewCoolCamera class.
|
|
961
|
+
|
|
962
|
+
Parameters
|
|
963
|
+
----------
|
|
964
|
+
multiview_info : dict
|
|
965
|
+
Information about how to crop the image. Can either be a dictionary, or something which behaves like a
|
|
966
|
+
dictionary (e.g. a MetaDataHandler).
|
|
967
|
+
default_roi: dict
|
|
968
|
+
contains the default ROI of the camera. This should just be the full chip, and should be defined in the
|
|
969
|
+
camera_class: class
|
|
970
|
+
This should be the class of the camera you want to inherit from. The MultiviewCamera class needs to know
|
|
971
|
+
this so we can clobber the inherited ExtractColor method and still be able to pull raw frames from the
|
|
972
|
+
camera using camera_class.ExtractColor
|
|
973
|
+
|
|
974
|
+
Notes
|
|
975
|
+
-----
|
|
976
|
+
For now, the 0th multiview ROI should be the upper-left most multiview ROI, in order to properly spoof the
|
|
977
|
+
position to match up with the stage. See PYME.IO.MetaDataHandler.get_camera_roi_origin.
|
|
978
|
+
"""
|
|
979
|
+
warnings.warn(DeprecationWarning('Use PYME.Acquire.Hardware.multiview.MultiviewWrapper instead'))
|
|
980
|
+
logger.warn('MultiviewMixin is deprecated - use PYME.Acquire.Hardware.multiview.MultiviewWrapper instead')
|
|
981
|
+
self.camera_class = camera_class
|
|
982
|
+
self.multiview_info = multiview_info
|
|
983
|
+
self._channel_color = multiview_info['Multiview.ChannelColor']
|
|
984
|
+
|
|
985
|
+
self.n_views = multiview_info['Multiview.NumROIs']
|
|
986
|
+
self.view_origins = [multiview_info['Multiview.ROI%dOrigin' % i] for i in range(self.n_views)]
|
|
987
|
+
self.size_x, self.size_y = multiview_info['Multiview.DefaultROISize']
|
|
988
|
+
self.multiview_roi_size_options = multiview_info['Multiview.ROISizeOptions']
|
|
989
|
+
|
|
990
|
+
self.view_centers = [(ox + int(0.5*self.size_x), oy + int(0.5*self.size_y)) for ox, oy in self.view_origins]
|
|
991
|
+
|
|
992
|
+
self.multiview_enabled = False
|
|
993
|
+
self.active_views = []
|
|
994
|
+
|
|
995
|
+
# set default width and height to return to when multiview is disabled
|
|
996
|
+
self._default_chip_width = default_roi['xf'] - default_roi['xi']
|
|
997
|
+
self._default_chip_height = default_roi['yf'] - default_roi['yi']
|
|
998
|
+
self.default_chip_roi = default_roi
|
|
999
|
+
self._current_pic_width = self._default_chip_width
|
|
1000
|
+
self._current_pic_height = self._default_chip_height
|
|
1001
|
+
|
|
1002
|
+
def ChangeMultiviewROISize(self, x_size, y_size):
|
|
1003
|
+
"""
|
|
1004
|
+
Changes the ROI size of the views. Currently they are all the same size
|
|
1005
|
+
Parameters
|
|
1006
|
+
----------
|
|
1007
|
+
x_size: int
|
|
1008
|
+
first dimension size
|
|
1009
|
+
y_size: int
|
|
1010
|
+
second dimension size
|
|
1011
|
+
|
|
1012
|
+
Returns
|
|
1013
|
+
-------
|
|
1014
|
+
None
|
|
1015
|
+
"""
|
|
1016
|
+
# shift the origins
|
|
1017
|
+
self.view_origins = [(xc - int(0.5*x_size), yc - int(0.5*y_size)) for xc, yc in self.view_centers]
|
|
1018
|
+
# store the new sizes
|
|
1019
|
+
self.size_x, self.size_y = x_size, y_size
|
|
1020
|
+
|
|
1021
|
+
if self.multiview_enabled:
|
|
1022
|
+
# re-set the slices for frame cropping
|
|
1023
|
+
self.enable_multiview(self.active_views)
|
|
1024
|
+
|
|
1025
|
+
|
|
1026
|
+
def GetPicWidth(self):
|
|
1027
|
+
"""
|
|
1028
|
+
This clobbers the inherited self.camera_class GetPicWidth method so that the outside world (FrameWrangler)
|
|
1029
|
+
only allocates memory/thinks our camera frames are the final concatenated multiview width.
|
|
1030
|
+
Returns
|
|
1031
|
+
-------
|
|
1032
|
+
pic_width: int
|
|
1033
|
+
width of the concatenated multiview frame
|
|
1034
|
+
"""
|
|
1035
|
+
if self.multiview_enabled:
|
|
1036
|
+
return self._current_pic_width
|
|
1037
|
+
else:
|
|
1038
|
+
return self.camera_class.GetPicWidth(self)
|
|
1039
|
+
|
|
1040
|
+
def GetPicHeight(self):
|
|
1041
|
+
"""
|
|
1042
|
+
This clobbers the inherited self.camera_class GetPicHeight method so that the outside world (FrameWrangler)
|
|
1043
|
+
only allocates memory/thinks our camera frames are the final multiview frame height.
|
|
1044
|
+
Returns
|
|
1045
|
+
-------
|
|
1046
|
+
pic_height: int
|
|
1047
|
+
height of the multiview frame
|
|
1048
|
+
"""
|
|
1049
|
+
if self.multiview_enabled:
|
|
1050
|
+
return self._current_pic_height
|
|
1051
|
+
else:
|
|
1052
|
+
return self.camera_class.GetPicHeight(self)
|
|
1053
|
+
|
|
1054
|
+
def set_active_views(self, views):
|
|
1055
|
+
if len(views) == 0:
|
|
1056
|
+
self.disable_multiview()
|
|
1057
|
+
elif sorted(views) == self.active_views:
|
|
1058
|
+
pass
|
|
1059
|
+
else:
|
|
1060
|
+
self.enable_multiview(views)
|
|
1061
|
+
|
|
1062
|
+
|
|
1063
|
+
def enable_multiview(self, views):
|
|
1064
|
+
"""
|
|
1065
|
+
|
|
1066
|
+
Parameters
|
|
1067
|
+
----------
|
|
1068
|
+
views: list
|
|
1069
|
+
views to activate. Should be integers which can be used to index self.multiview_info
|
|
1070
|
+
|
|
1071
|
+
Returns
|
|
1072
|
+
-------
|
|
1073
|
+
|
|
1074
|
+
Notes
|
|
1075
|
+
-----
|
|
1076
|
+
FrameWrangler must be stopped before this function is called, and "prepared" afterwards before being started
|
|
1077
|
+
again. This is not special to this function, but rather anytime SetROI gets called.
|
|
1078
|
+
|
|
1079
|
+
"""
|
|
1080
|
+
views = sorted(list(views)) # tuple(int) isn't iterable, make sure we avoid it
|
|
1081
|
+
# set the camera FOV to be just large enough so we do most of the cropping where it is already optimized
|
|
1082
|
+
self.x_origins, self.y_origins = zip(*[self.view_origins[view] for view in views])
|
|
1083
|
+
chip_x_min, chip_x_max = min(self.x_origins), max(self.x_origins)
|
|
1084
|
+
chip_y_min, chip_y_max = min(self.y_origins), max(self.y_origins)
|
|
1085
|
+
|
|
1086
|
+
chip_width = chip_x_max + self.size_x - chip_x_min
|
|
1087
|
+
chip_height = chip_y_max + self.size_y - chip_y_min
|
|
1088
|
+
|
|
1089
|
+
self.chip_roi = [chip_x_min, chip_y_min, chip_x_min + chip_width, chip_y_min + chip_height]
|
|
1090
|
+
logger.debug('setting chip ROI')
|
|
1091
|
+
self.SetROI(*self.chip_roi)
|
|
1092
|
+
actual = self.GetROI()
|
|
1093
|
+
try:
|
|
1094
|
+
assert actual == tuple(self.chip_roi)
|
|
1095
|
+
except AssertionError:
|
|
1096
|
+
raise(AssertionError('Error setting camera ROI. Check that ROI is feasible for camera, target: %s, actual: %s'
|
|
1097
|
+
% (tuple(self.chip_roi), actual)))
|
|
1098
|
+
|
|
1099
|
+
# hold an array for temporarily writing the roughly cropped chip
|
|
1100
|
+
self.chip_data = np.empty((chip_width, chip_height), dtype='uint16', order='F')
|
|
1101
|
+
|
|
1102
|
+
# precalculate slices for each view
|
|
1103
|
+
self.view_slices, self.output_slices = [], []
|
|
1104
|
+
for x_ind, view in enumerate(views):
|
|
1105
|
+
ox, oy = self.view_origins[view]
|
|
1106
|
+
# calculate the offset from the chip origin
|
|
1107
|
+
oxp, oyp = ox - chip_x_min, oy - chip_y_min
|
|
1108
|
+
# calculate the slices to pull out of roi on chip
|
|
1109
|
+
self.view_slices.append(np.s_[oxp:oxp + self.size_x, oyp: oyp + self.size_y])
|
|
1110
|
+
# calculate slices to write into out array
|
|
1111
|
+
self.output_slices.append(np.s_[self.size_x * x_ind:self.size_x * (x_ind + 1), 0:self.size_y])
|
|
1112
|
+
|
|
1113
|
+
# update our apparent height and widths, concatenating along 'x' or the 0th dim
|
|
1114
|
+
self._current_pic_width = len(views) * self.size_x
|
|
1115
|
+
self._current_pic_height = self.size_y
|
|
1116
|
+
# tell the world what we've accomplished here today
|
|
1117
|
+
self.multiview_enabled = True
|
|
1118
|
+
self.active_views = views
|
|
1119
|
+
|
|
1120
|
+
def disable_multiview(self):
|
|
1121
|
+
"""
|
|
1122
|
+
Disables multiview mode and returns camera to the default ROI (e.g. full chip)
|
|
1123
|
+
Returns
|
|
1124
|
+
-------
|
|
1125
|
+
|
|
1126
|
+
"""
|
|
1127
|
+
self.multiview_enabled = False
|
|
1128
|
+
self.active_views = []
|
|
1129
|
+
self.SetROI(self.default_chip_roi['xi'], self.default_chip_roi['yi'],
|
|
1130
|
+
self.default_chip_roi['xf'], self.default_chip_roi['yf'],)
|
|
1131
|
+
|
|
1132
|
+
|
|
1133
|
+
def ExtractColor(self, output_frame, mode):
|
|
1134
|
+
"""
|
|
1135
|
+
Override camera get-frame function, but with multiview cropping.
|
|
1136
|
+
|
|
1137
|
+
Parameters
|
|
1138
|
+
----------
|
|
1139
|
+
output_frame: np.array
|
|
1140
|
+
array sized for the final multiview frame
|
|
1141
|
+
mode: int
|
|
1142
|
+
camera acquisition mode.
|
|
1143
|
+
|
|
1144
|
+
Returns
|
|
1145
|
+
-------
|
|
1146
|
+
|
|
1147
|
+
"""
|
|
1148
|
+
if self.multiview_enabled:
|
|
1149
|
+
# logger.debug('pulling frame')
|
|
1150
|
+
# pull data off the roughly cropped frame
|
|
1151
|
+
self.camera_class.ExtractColor(self, self.chip_data, mode)
|
|
1152
|
+
# extract the multiview frames from the cropped chip into our output
|
|
1153
|
+
for out_slice, view_slice in zip(self.output_slices, self.view_slices):
|
|
1154
|
+
output_frame[out_slice] = self.chip_data[view_slice]
|
|
1155
|
+
|
|
1156
|
+
else:
|
|
1157
|
+
# skip extra cropping, extract the full chip directly into the output frame
|
|
1158
|
+
self.camera_class.ExtractColor(self, output_frame, mode)
|
|
1159
|
+
|
|
1160
|
+
def GenStartMetadata(self, mdh):
|
|
1161
|
+
"""
|
|
1162
|
+
Light shim to record multiview metadata, when appropriate
|
|
1163
|
+
|
|
1164
|
+
Parameters
|
|
1165
|
+
----------
|
|
1166
|
+
mdh : MetaDataHandler
|
|
1167
|
+
MetaDataHandler object for Camera.
|
|
1168
|
+
|
|
1169
|
+
Returns
|
|
1170
|
+
-------
|
|
1171
|
+
None
|
|
1172
|
+
"""
|
|
1173
|
+
self.camera_class.GenStartMetadata(self, mdh)
|
|
1174
|
+
# add in multiview info
|
|
1175
|
+
if self.multiview_enabled:
|
|
1176
|
+
mdh.setEntry('Multiview.NumROIs', self.n_views)
|
|
1177
|
+
mdh.setEntry('Multiview.ROISize', [self.size_x, self.size_y])
|
|
1178
|
+
mdh.setEntry('Multiview.ChannelColor', self._channel_color)
|
|
1179
|
+
mdh.setEntry('Multiview.ActiveViews', self.active_views)
|
|
1180
|
+
for ind in range(self.n_views):
|
|
1181
|
+
mdh.setEntry('Multiview.ROI%dOrigin' % ind, self.view_origins[ind])
|
|
1182
|
+
|
|
1183
|
+
def register_state_handlers(self, state_manager):
|
|
1184
|
+
""" Allow key multiview settings to be updated easily through
|
|
1185
|
+
the microscope state handler
|
|
1186
|
+
|
|
1187
|
+
Parameters
|
|
1188
|
+
----------
|
|
1189
|
+
state_manager : PYME.Acquire.microscope.State
|
|
1190
|
+
"""
|
|
1191
|
+
logger.debug('registering multiview camera state handlers')
|
|
1192
|
+
|
|
1193
|
+
state_manager.registerHandler('Multiview.ActiveViews',
|
|
1194
|
+
lambda : self.active_views,
|
|
1195
|
+
self.set_active_views, True)
|
|
1196
|
+
state_manager.registerHandler('Multiview.ROISize',
|
|
1197
|
+
lambda : [self.size_x, self.size_y],
|
|
1198
|
+
lambda p : self.ChangeMultiviewROISize(p[0], p[1]),
|
|
1199
|
+
True)
|