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,1289 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# czifile.py
|
|
3
|
+
|
|
4
|
+
# Copyright (c) 2013-2014, Christoph Gohlke
|
|
5
|
+
# Copyright (c) 2013-2014, The Regents of the University of California
|
|
6
|
+
# Produced at the Laboratory for Fluorescence Dynamics.
|
|
7
|
+
# All rights reserved.
|
|
8
|
+
#
|
|
9
|
+
# Redistribution and use in source and binary forms, with or without
|
|
10
|
+
# modification, are permitted provided that the following conditions are met:
|
|
11
|
+
#
|
|
12
|
+
# * Redistributions of source code must retain the above copyright
|
|
13
|
+
# notice, this list of conditions and the following disclaimer.
|
|
14
|
+
# * Redistributions in binary form must reproduce the above copyright
|
|
15
|
+
# notice, this list of conditions and the following disclaimer in the
|
|
16
|
+
# documentation and/or other materials provided with the distribution.
|
|
17
|
+
# * Neither the name of the copyright holders nor the names of any
|
|
18
|
+
# contributors may be used to endorse or promote products derived
|
|
19
|
+
# from this software without specific prior written permission.
|
|
20
|
+
#
|
|
21
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
22
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
23
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
24
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
25
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
26
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
27
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
28
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
29
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
30
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
31
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
|
32
|
+
|
|
33
|
+
"""Read image and metadata from Carl Zeiss(r) ZISRAW (CZI) files.
|
|
34
|
+
|
|
35
|
+
CZI is the native image file format of the ZEN(r) software by the Carl Zeiss
|
|
36
|
+
Microscopy GmbH. It stores multidimensional images and metadata from
|
|
37
|
+
microscopy experiments.
|
|
38
|
+
|
|
39
|
+
:Author:
|
|
40
|
+
`Christoph Gohlke <http://www.lfd.uci.edu/~gohlke/>`_
|
|
41
|
+
|
|
42
|
+
:Organization:
|
|
43
|
+
Laboratory for Fluorescence Dynamics, University of California, Irvine
|
|
44
|
+
|
|
45
|
+
:Version: 2013.12.04
|
|
46
|
+
|
|
47
|
+
Requirements
|
|
48
|
+
------------
|
|
49
|
+
* `CPython 2.7 or 3.3 <http://www.python.org>`_
|
|
50
|
+
* `Numpy 1.7 <http://www.numpy.org>`_
|
|
51
|
+
* `Scipy 0.13 <http://www.scipy.org>`_
|
|
52
|
+
* `Tifffile.py 2013.11.03 <http://www.lfd.uci.edu/~gohlke/>`_
|
|
53
|
+
* `Czifle.pyx 2013.12.04 <http://www.lfd.uci.edu/~gohlke/>`_
|
|
54
|
+
(for decoding JpegXrFile and JpgFile images)
|
|
55
|
+
|
|
56
|
+
Revisions
|
|
57
|
+
---------
|
|
58
|
+
2013.12.04
|
|
59
|
+
Decode JpegXrFile and JpgFile via _czifle extension module.
|
|
60
|
+
Attempt to reconstruct tiled mosaic images.
|
|
61
|
+
2013.11.20
|
|
62
|
+
Initial release.
|
|
63
|
+
|
|
64
|
+
Notes
|
|
65
|
+
-----
|
|
66
|
+
The API is not stable yet and might change between revisions.
|
|
67
|
+
|
|
68
|
+
The file format design specification [1] is confidential and the licence
|
|
69
|
+
agreement does not permit to write data into CZI files.
|
|
70
|
+
|
|
71
|
+
Only a subset of the 2012 specification is implemented in the initial release.
|
|
72
|
+
Specifically, multifile images are not yet supported.
|
|
73
|
+
|
|
74
|
+
Tested on Windows with a few example files only.
|
|
75
|
+
|
|
76
|
+
References
|
|
77
|
+
----------
|
|
78
|
+
(1) ZISRAW (CZI) File Format Design specification Release Version 1.1 for
|
|
79
|
+
ZEN 2012. DS_ZISRAW-FileFormat_Rel_ZEN2012.doc (Confidential)
|
|
80
|
+
Documentation can be requested at
|
|
81
|
+
<http://microscopy.zeiss.com/microscopy/en_us/downloads/zen.html>
|
|
82
|
+
(2) CZI The File Format for the Microscope | ZEISS International
|
|
83
|
+
<http://microscopy.zeiss.com/microscopy/en_us/products/microscope-software/
|
|
84
|
+
zen-2012/czi.html>
|
|
85
|
+
|
|
86
|
+
Examples
|
|
87
|
+
--------
|
|
88
|
+
>>> with CziFile('test.czi') as czi:
|
|
89
|
+
... image = czi.asarray()
|
|
90
|
+
>>> image.shape
|
|
91
|
+
(3, 3, 3, 250, 200, 3)
|
|
92
|
+
>>> image[0, 0, 0, 0, 0]
|
|
93
|
+
array([10, 10, 10], dtype=uint8)
|
|
94
|
+
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
from __future__ import division, print_function
|
|
98
|
+
|
|
99
|
+
import sys
|
|
100
|
+
import os
|
|
101
|
+
import re
|
|
102
|
+
import uuid
|
|
103
|
+
import struct
|
|
104
|
+
import warnings
|
|
105
|
+
import tempfile
|
|
106
|
+
|
|
107
|
+
try:
|
|
108
|
+
from lxml import etree
|
|
109
|
+
except ImportError:
|
|
110
|
+
from xml.etree import cElementTree as etree
|
|
111
|
+
|
|
112
|
+
import numpy
|
|
113
|
+
from scipy.ndimage.interpolation import zoom
|
|
114
|
+
|
|
115
|
+
from .tifffile import decodelzw, lazyattr, stripnull
|
|
116
|
+
|
|
117
|
+
try:
|
|
118
|
+
import _czifile
|
|
119
|
+
_have_czifile = True
|
|
120
|
+
except ImportError:
|
|
121
|
+
_have_czifile = False
|
|
122
|
+
warnings.warn(
|
|
123
|
+
"failed to import the optional _czifile C extension module.\n"
|
|
124
|
+
"Decoding of JXR and JPG encoded images will be unavailable.\n"
|
|
125
|
+
"Czifile.pyx can be obtained at http://www.lfd.uci.edu/~gohlke/")
|
|
126
|
+
|
|
127
|
+
__version__ = '2013.12.04'
|
|
128
|
+
__docformat__ = 'restructuredtext en'
|
|
129
|
+
__all__ = 'imread', 'CziFile'
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def imread(filename, *args, **kwargs):
|
|
133
|
+
"""Return image data from CZI file as numpy array.
|
|
134
|
+
|
|
135
|
+
'args' and 'kwargs' are arguments to CziFile.asarray().
|
|
136
|
+
|
|
137
|
+
Examples
|
|
138
|
+
--------
|
|
139
|
+
>>> image = imread('test.czi')
|
|
140
|
+
>>> image.shape
|
|
141
|
+
(3, 3, 3, 250, 200, 3)
|
|
142
|
+
>>> image.dtype
|
|
143
|
+
dtype('uint8')
|
|
144
|
+
|
|
145
|
+
"""
|
|
146
|
+
with CziFile(filename) as czi:
|
|
147
|
+
result = czi.asarray(*args, **kwargs)
|
|
148
|
+
return result
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
class CziFile(object):
|
|
152
|
+
"""Carl Zeiss Image (CZI) file.
|
|
153
|
+
|
|
154
|
+
Attributes
|
|
155
|
+
----------
|
|
156
|
+
header : FileHeaderSegment
|
|
157
|
+
Global file metadata such as file version and GUID.
|
|
158
|
+
metadata : etree.ElementTree.Element
|
|
159
|
+
Global image metadata in UTF-8 encoded XML format.
|
|
160
|
+
|
|
161
|
+
All attributes are read-only.
|
|
162
|
+
|
|
163
|
+
"""
|
|
164
|
+
|
|
165
|
+
def __init__(self, arg, multifile=True, filesize=None, detectmosaic=True):
|
|
166
|
+
"""Open CZI file and read header.
|
|
167
|
+
|
|
168
|
+
Raise ValueError if file is not a ZISRAW file.
|
|
169
|
+
|
|
170
|
+
Parameters
|
|
171
|
+
----------
|
|
172
|
+
multifile : bool
|
|
173
|
+
If True (default), the master file of a multifile CZI file
|
|
174
|
+
will be opened if applicable.
|
|
175
|
+
filesize : int
|
|
176
|
+
Size of file if arg is a file handle pointing to an
|
|
177
|
+
embedded CZI file.
|
|
178
|
+
detectmosaic : bool
|
|
179
|
+
If True (default), mosaic images will be reconstructed from
|
|
180
|
+
SubBlocks with a tile index.
|
|
181
|
+
|
|
182
|
+
Notes
|
|
183
|
+
-----
|
|
184
|
+
CziFile instances created from file name must be closed using the
|
|
185
|
+
'close' method, which is automatically called when using the
|
|
186
|
+
'with' statement.
|
|
187
|
+
|
|
188
|
+
"""
|
|
189
|
+
self._fh = FileHandle(arg, size=filesize)
|
|
190
|
+
try:
|
|
191
|
+
if self._fh.read(10) != b'ZISRAWFILE':
|
|
192
|
+
raise ValueError("not a CZI file")
|
|
193
|
+
self.header = Segment(self._fh, 0).data()
|
|
194
|
+
except Exception:
|
|
195
|
+
self._fh.close()
|
|
196
|
+
raise
|
|
197
|
+
|
|
198
|
+
if multifile and self.header.file_part and isinstance(arg, basestring):
|
|
199
|
+
# open master file instead
|
|
200
|
+
self._fh.close()
|
|
201
|
+
name, _ = match_filename(arg)
|
|
202
|
+
self._fh = FileHandle(name)
|
|
203
|
+
self.header = Segment(self._fh, 0).data()
|
|
204
|
+
assert(self.header.primary_file_guid == self.header.file_guid)
|
|
205
|
+
assert(self.header.file_part == 0)
|
|
206
|
+
|
|
207
|
+
if self.header.update_pending:
|
|
208
|
+
warnings.warn("file is pending update")
|
|
209
|
+
self._filter_mosaic = detectmosaic
|
|
210
|
+
|
|
211
|
+
def segments(self, kind=None):
|
|
212
|
+
"""Return iterator over Segment data of specified kind.
|
|
213
|
+
|
|
214
|
+
Parameters
|
|
215
|
+
----------
|
|
216
|
+
kind : bytestring or sequence thereof
|
|
217
|
+
Segment id(s) as listed in SEGMENT_ID.
|
|
218
|
+
If None (default), all segments are returned.
|
|
219
|
+
|
|
220
|
+
"""
|
|
221
|
+
fpos = 0
|
|
222
|
+
while True:
|
|
223
|
+
self._fh.seek(fpos)
|
|
224
|
+
try:
|
|
225
|
+
segment = Segment(self._fh)
|
|
226
|
+
except SegmentNotFoundError:
|
|
227
|
+
break
|
|
228
|
+
if (kind is None) or (segment.sid in kind):
|
|
229
|
+
yield segment.data()
|
|
230
|
+
fpos = segment.data_offset + segment.allocated_size
|
|
231
|
+
|
|
232
|
+
@lazyattr
|
|
233
|
+
def metadata(self):
|
|
234
|
+
"""Return data from MetadataSegment as xml.ElementTree root Element.
|
|
235
|
+
|
|
236
|
+
Return None if no Metadata segment is found.
|
|
237
|
+
|
|
238
|
+
"""
|
|
239
|
+
if self.header.metadata_position:
|
|
240
|
+
segment = Segment(self._fh, self.header.metadata_position)
|
|
241
|
+
if segment.sid == MetadataSegment.SID:
|
|
242
|
+
return etree.fromstring(segment.data().data())
|
|
243
|
+
warnings.warn("Metadata segment not found")
|
|
244
|
+
try:
|
|
245
|
+
metadata = next(self.segments(MetadataSegment.SID))
|
|
246
|
+
return etree.fromstring(metadata.data())
|
|
247
|
+
except StopIteration:
|
|
248
|
+
pass
|
|
249
|
+
|
|
250
|
+
@lazyattr
|
|
251
|
+
def subblock_directory(self):
|
|
252
|
+
"""Return list of all DirectoryEntryDV in file.
|
|
253
|
+
|
|
254
|
+
Use SubBlockDirectorySegment if exists, else find SubBlockSegments.
|
|
255
|
+
|
|
256
|
+
"""
|
|
257
|
+
if self.header.directory_position:
|
|
258
|
+
segment = Segment(self._fh, self.header.directory_position)
|
|
259
|
+
if segment.sid == SubBlockDirectorySegment.SID:
|
|
260
|
+
return segment.data().entries
|
|
261
|
+
warnings.warn("SubBlockDirectory segment not found")
|
|
262
|
+
return list(segment.directory_entry for segment in
|
|
263
|
+
self.segments(SubBlockSegment.SID))
|
|
264
|
+
|
|
265
|
+
@lazyattr
|
|
266
|
+
def attachment_directory(self):
|
|
267
|
+
"""Return list of all AttachmentEntryA1 in file.
|
|
268
|
+
|
|
269
|
+
Use AttachmentDirectorySegment if exists, else find AttachmentSegments.
|
|
270
|
+
|
|
271
|
+
"""
|
|
272
|
+
if self.header.attachment_directory_position:
|
|
273
|
+
segment = Segment(self._fh,
|
|
274
|
+
self.header.attachment_directory_position)
|
|
275
|
+
if segment.sid == AttachmentDirectorySegment.SID:
|
|
276
|
+
return segment.data().entries
|
|
277
|
+
warnings.warn("AttachmentDirectory segment not found")
|
|
278
|
+
return list(segment.attachment_entry for segment in
|
|
279
|
+
self.segments(AttachmentSegment.SID))
|
|
280
|
+
|
|
281
|
+
def subblocks(self):
|
|
282
|
+
"""Return iterator over all SubBlock segments in file."""
|
|
283
|
+
for entry in self.subblock_directory:
|
|
284
|
+
yield entry.data_segment()
|
|
285
|
+
|
|
286
|
+
def attachments(self):
|
|
287
|
+
"""Return iterator over all Attachment segments in file."""
|
|
288
|
+
for entry in self.attachment_directory:
|
|
289
|
+
yield entry.data_segment()
|
|
290
|
+
|
|
291
|
+
def save_attachments(self, directory=None):
|
|
292
|
+
"""Save all attachments to files."""
|
|
293
|
+
if directory is None:
|
|
294
|
+
directory = self._fh.filename + '.attachments'
|
|
295
|
+
if not os.path.exists(directory):
|
|
296
|
+
os.makedirs(directory)
|
|
297
|
+
for attachment in self.attachments():
|
|
298
|
+
attachment.save(directory=directory)
|
|
299
|
+
|
|
300
|
+
@lazyattr
|
|
301
|
+
def filtered_subblock_directory(self):
|
|
302
|
+
"""Return sorted list of DirectoryEntryDV if mosaic, else all."""
|
|
303
|
+
if not self._filter_mosaic:
|
|
304
|
+
return self.subblock_directory
|
|
305
|
+
filtered = [directory_entry
|
|
306
|
+
for directory_entry in self.subblock_directory
|
|
307
|
+
if directory_entry.mosaic_index is not None]
|
|
308
|
+
if not filtered:
|
|
309
|
+
return self.subblock_directory
|
|
310
|
+
return list(sorted(filtered, key=lambda x: x.mosaic_index))
|
|
311
|
+
|
|
312
|
+
@lazyattr
|
|
313
|
+
def shape(self):
|
|
314
|
+
"""Return shape of image data in file."""
|
|
315
|
+
shape = [[dim.start + dim.size
|
|
316
|
+
for dim in directory_entry.dimension_entries
|
|
317
|
+
if dim.dimension != b'M']
|
|
318
|
+
for directory_entry in self.filtered_subblock_directory]
|
|
319
|
+
shape = numpy.max(shape, axis=0)
|
|
320
|
+
shape = tuple(i-j for i, j in zip(shape, self.start[:-1]))
|
|
321
|
+
dtype = self.filtered_subblock_directory[0].dtype
|
|
322
|
+
sampleshape = numpy.dtype(dtype).shape
|
|
323
|
+
shape = shape + (sampleshape if sampleshape else (1,))
|
|
324
|
+
return shape
|
|
325
|
+
|
|
326
|
+
@lazyattr
|
|
327
|
+
def start(self):
|
|
328
|
+
"""Return minimum start indices per dimension of sub images in file."""
|
|
329
|
+
start = [[dim.start
|
|
330
|
+
for dim in directory_entry.dimension_entries
|
|
331
|
+
if dim.dimension != b'M']
|
|
332
|
+
for directory_entry in self.filtered_subblock_directory]
|
|
333
|
+
start = tuple(numpy.min(start, axis=0)) + (0,)
|
|
334
|
+
return start
|
|
335
|
+
|
|
336
|
+
@lazyattr
|
|
337
|
+
def axes(self):
|
|
338
|
+
"""Return axes of image data in file."""
|
|
339
|
+
return self.filtered_subblock_directory[0].axes
|
|
340
|
+
|
|
341
|
+
@lazyattr
|
|
342
|
+
def dtype(self):
|
|
343
|
+
"""Return dtype of image data in file."""
|
|
344
|
+
# subblock data can be of different pixel type
|
|
345
|
+
dtype = self.filtered_subblock_directory[0].dtype[-2:]
|
|
346
|
+
for directory_entry in self.filtered_subblock_directory:
|
|
347
|
+
dtype = numpy.promote_types(dtype, directory_entry.dtype[-2:])
|
|
348
|
+
return dtype
|
|
349
|
+
|
|
350
|
+
def asarray(self, bgr2rgb=False, resize=True, order=1):
|
|
351
|
+
"""Return image data from file(s) as numpy array.
|
|
352
|
+
|
|
353
|
+
Parameters
|
|
354
|
+
----------
|
|
355
|
+
bgr2rgb : bool
|
|
356
|
+
If True, exchange red and blue samples if applicable.
|
|
357
|
+
resize : bool
|
|
358
|
+
If True (default), resize sub/supersampled subblock data.
|
|
359
|
+
order : int
|
|
360
|
+
The order of spline interpolation used to resize sub/supersampled
|
|
361
|
+
subblock data. Default is 1 (bilinear).
|
|
362
|
+
|
|
363
|
+
"""
|
|
364
|
+
image = numpy.zeros(self.shape, self.dtype)
|
|
365
|
+
for directory_entry in self.filtered_subblock_directory:
|
|
366
|
+
subblock = directory_entry.data_segment()
|
|
367
|
+
tile = subblock.data(bgr2rgb=bgr2rgb, resize=resize, order=order)
|
|
368
|
+
index = [slice(i-j, i-j+k) for i, j, k in
|
|
369
|
+
zip(directory_entry.start, self.start, tile.shape)]
|
|
370
|
+
try:
|
|
371
|
+
image[index] = tile
|
|
372
|
+
except ValueError as e:
|
|
373
|
+
warnings.warn(str(e))
|
|
374
|
+
return image
|
|
375
|
+
|
|
376
|
+
def close(self):
|
|
377
|
+
self._fh.close()
|
|
378
|
+
|
|
379
|
+
def __enter__(self):
|
|
380
|
+
return self
|
|
381
|
+
|
|
382
|
+
def __exit__(self, exc_type, exc_value, traceback):
|
|
383
|
+
self.close()
|
|
384
|
+
|
|
385
|
+
def __str__(self):
|
|
386
|
+
return '\n '.join((
|
|
387
|
+
self._fh.name.capitalize(),
|
|
388
|
+
"(Carl Zeiss Image File)",
|
|
389
|
+
str(self.header),
|
|
390
|
+
"MetadataSegment",
|
|
391
|
+
str(self.axes),
|
|
392
|
+
str(self.shape),
|
|
393
|
+
str(self.dtype),
|
|
394
|
+
str(etree.tostring(self.metadata))))
|
|
395
|
+
|
|
396
|
+
|
|
397
|
+
class FileHandle(object):
|
|
398
|
+
"""Binary file handle that can handle a file within a file.
|
|
399
|
+
|
|
400
|
+
Only binary read, seek, tell and close are supported on embedded files.
|
|
401
|
+
|
|
402
|
+
Attributes
|
|
403
|
+
----------
|
|
404
|
+
name : str
|
|
405
|
+
file name
|
|
406
|
+
path : str
|
|
407
|
+
Absolute path to file.
|
|
408
|
+
|
|
409
|
+
All attributes are read-only.
|
|
410
|
+
|
|
411
|
+
"""
|
|
412
|
+
|
|
413
|
+
def __init__(self, arg, mode='rb', name=None, offset=None, size=None):
|
|
414
|
+
"""Initialize file handle from file name or another file handle.
|
|
415
|
+
|
|
416
|
+
Parameters
|
|
417
|
+
----------
|
|
418
|
+
arg : str, File, or FileHandle
|
|
419
|
+
File name or open file handle.
|
|
420
|
+
mode : str
|
|
421
|
+
File open mode in case 'arg' is filename.
|
|
422
|
+
name : str
|
|
423
|
+
Optional name of file in case 'arg' is file handle.
|
|
424
|
+
offset : int
|
|
425
|
+
Optional start position of file in the file. By default the
|
|
426
|
+
current file position is used as offset.
|
|
427
|
+
size : int
|
|
428
|
+
Optional size of file in the file. By default the number of
|
|
429
|
+
bytes from the current file position to the end of the file
|
|
430
|
+
is used.
|
|
431
|
+
|
|
432
|
+
"""
|
|
433
|
+
if isinstance(arg, basestring): # file name
|
|
434
|
+
filename = os.path.abspath(arg)
|
|
435
|
+
self.path, self.name = os.path.split(filename)
|
|
436
|
+
self._fh = open(filename, mode)
|
|
437
|
+
self._close = True
|
|
438
|
+
if offset is None:
|
|
439
|
+
offset = 0
|
|
440
|
+
elif isinstance(arg, FileHandle):
|
|
441
|
+
if offset is None:
|
|
442
|
+
offset = arg.tell()
|
|
443
|
+
else:
|
|
444
|
+
offset = arg._offset + offset
|
|
445
|
+
self._fh = arg._fh
|
|
446
|
+
self._close = False
|
|
447
|
+
if name:
|
|
448
|
+
self.name = name
|
|
449
|
+
else:
|
|
450
|
+
name, ext = os.path.splitext(arg.name)
|
|
451
|
+
self.name = "%s@%i%s" % (name, offset, ext)
|
|
452
|
+
self.path = arg.path
|
|
453
|
+
else: # file handle
|
|
454
|
+
if offset is None:
|
|
455
|
+
offset = arg.tell()
|
|
456
|
+
self._fh = arg
|
|
457
|
+
self._close = False
|
|
458
|
+
self.name = name if name else self._fh.name
|
|
459
|
+
self.path = ''
|
|
460
|
+
|
|
461
|
+
self._offset = offset
|
|
462
|
+
if size is not None:
|
|
463
|
+
self.size = size
|
|
464
|
+
|
|
465
|
+
@property
|
|
466
|
+
def filename(self):
|
|
467
|
+
return os.path.join(self.path, self.name)
|
|
468
|
+
|
|
469
|
+
def read(self, size=-1):
|
|
470
|
+
if size < 0 and self._offset:
|
|
471
|
+
size = self.size
|
|
472
|
+
return self._fh.read(size)
|
|
473
|
+
|
|
474
|
+
def fromfile(self, dtype, count=-1, sep=""):
|
|
475
|
+
return numpy.fromfile(self._fh, dtype, count, sep)
|
|
476
|
+
|
|
477
|
+
def tell(self):
|
|
478
|
+
return self._fh.tell() - self._offset
|
|
479
|
+
|
|
480
|
+
def seek(self, offset, whence=0):
|
|
481
|
+
if self._offset:
|
|
482
|
+
if whence == 0:
|
|
483
|
+
self._fh.seek(self._offset + offset, whence)
|
|
484
|
+
return
|
|
485
|
+
elif whence == 2:
|
|
486
|
+
self._fh.seek(self._offset + self.size - offset, 0)
|
|
487
|
+
return
|
|
488
|
+
self._fh.seek(offset, whence)
|
|
489
|
+
|
|
490
|
+
def close(self):
|
|
491
|
+
if self._close:
|
|
492
|
+
self._fh.close()
|
|
493
|
+
|
|
494
|
+
def __getattr__(self, name):
|
|
495
|
+
if name == 'size':
|
|
496
|
+
self._fh.seek(self._offset, 2)
|
|
497
|
+
self.size = self._fh.tell()
|
|
498
|
+
return self.size
|
|
499
|
+
return getattr(self._fh, name)
|
|
500
|
+
|
|
501
|
+
def __enter__(self):
|
|
502
|
+
return self
|
|
503
|
+
|
|
504
|
+
def __exit__(self, exc_type, exc_value, traceback):
|
|
505
|
+
self.close()
|
|
506
|
+
|
|
507
|
+
|
|
508
|
+
class Segment(object):
|
|
509
|
+
"""ZISRAW Segment."""
|
|
510
|
+
|
|
511
|
+
__slots__ = 'sid', 'allocated_size', 'used_size', 'data_offset', '_fh'
|
|
512
|
+
|
|
513
|
+
def __init__(self, fh, fpos=None):
|
|
514
|
+
"""Read segment header from file."""
|
|
515
|
+
if fpos is not None:
|
|
516
|
+
fh.seek(fpos)
|
|
517
|
+
try:
|
|
518
|
+
(self.sid,
|
|
519
|
+
self.allocated_size,
|
|
520
|
+
self.used_size
|
|
521
|
+
) = struct.unpack('<16sqq', fh.read(32))
|
|
522
|
+
except struct.error:
|
|
523
|
+
raise SegmentNotFoundError("can not read ZISRAW segment")
|
|
524
|
+
self.sid = stripnull(self.sid)
|
|
525
|
+
if self.sid not in SEGMENT_ID:
|
|
526
|
+
if not self.sid.startswith(b'ZISRAW'):
|
|
527
|
+
raise SegmentNotFoundError("not a ZISRAW segment")
|
|
528
|
+
warnings.warn("unknown segment type %s" % self.sid)
|
|
529
|
+
self.data_offset = fh.tell()
|
|
530
|
+
self._fh = fh
|
|
531
|
+
|
|
532
|
+
def data(self):
|
|
533
|
+
"""Read segment data from file and return as \*Segment instance."""
|
|
534
|
+
self._fh.seek(self.data_offset)
|
|
535
|
+
return SEGMENT_ID.get(self.sid, UnknownSegment)(self._fh)
|
|
536
|
+
|
|
537
|
+
def __str__(self):
|
|
538
|
+
return "Segment %s %i of %i" % (
|
|
539
|
+
self.sid, self.used_size, self.allocated_size)
|
|
540
|
+
|
|
541
|
+
|
|
542
|
+
class SegmentNotFoundError(Exception):
|
|
543
|
+
"""Exception to indicate that file position doesn't contain Segment."""
|
|
544
|
+
pass
|
|
545
|
+
|
|
546
|
+
|
|
547
|
+
class FileHeaderSegment(object):
|
|
548
|
+
"""ZISRAWFILE file header segment data.
|
|
549
|
+
|
|
550
|
+
Contains global file metadata such as file version and GUID.
|
|
551
|
+
|
|
552
|
+
"""
|
|
553
|
+
__slots__ = ('version', 'primary_file_guid', 'file_guid',
|
|
554
|
+
'file_part', 'directory_position', 'metadata_position',
|
|
555
|
+
'update_pending', 'attachment_directory_position')
|
|
556
|
+
|
|
557
|
+
SID = b'ZISRAWFILE'
|
|
558
|
+
|
|
559
|
+
def __init__(self, fh):
|
|
560
|
+
(major,
|
|
561
|
+
minor,
|
|
562
|
+
reserved1,
|
|
563
|
+
reserved2,
|
|
564
|
+
primary_file_guid,
|
|
565
|
+
file_guid,
|
|
566
|
+
self.file_part,
|
|
567
|
+
self.directory_position,
|
|
568
|
+
self.metadata_position,
|
|
569
|
+
self.update_pending,
|
|
570
|
+
self.attachment_directory_position,
|
|
571
|
+
) = struct.unpack('<iiii16s16siqqiq', fh.read(80))
|
|
572
|
+
self.version = (major, minor)
|
|
573
|
+
self.update_pending = bool(self.update_pending)
|
|
574
|
+
self.primary_file_guid = uuid.UUID(bytes=primary_file_guid)
|
|
575
|
+
self.file_guid = uuid.UUID(bytes=file_guid)
|
|
576
|
+
|
|
577
|
+
def __str__(self):
|
|
578
|
+
return "FileHeaderSegment\n " + "\n ".join(
|
|
579
|
+
"%s %s" % (name, str(getattr(self, name)))
|
|
580
|
+
for name in FileHeaderSegment.__slots__)
|
|
581
|
+
|
|
582
|
+
|
|
583
|
+
class MetadataSegment(object):
|
|
584
|
+
"""ZISRAWMETADATA segment data.
|
|
585
|
+
|
|
586
|
+
Contains global image metadata in UTF-8 encoded XML format.
|
|
587
|
+
|
|
588
|
+
"""
|
|
589
|
+
__slots__ = 'xml_size', 'attachment_size', 'xml_offset', '_fh'
|
|
590
|
+
|
|
591
|
+
SID = b'ZISRAWMETADATA'
|
|
592
|
+
|
|
593
|
+
def __init__(self, fh):
|
|
594
|
+
self.xml_size, self.attachment_size = struct.unpack('<ii', fh.read(8))
|
|
595
|
+
fh.seek(248, 1) # spare
|
|
596
|
+
self.xml_offset = fh.tell()
|
|
597
|
+
self._fh = fh
|
|
598
|
+
|
|
599
|
+
def data(self, raw=False):
|
|
600
|
+
"""Read XML from file and return as unicode string."""
|
|
601
|
+
self._fh.seek(self.xml_offset)
|
|
602
|
+
data = self._fh.read(self.xml_size)
|
|
603
|
+
if raw:
|
|
604
|
+
return data
|
|
605
|
+
data = data.replace(b'\r\n', b'\n').replace(b'\r', b'\n')
|
|
606
|
+
return unicode(data, 'utf-8')
|
|
607
|
+
|
|
608
|
+
def __str__(self):
|
|
609
|
+
return "MetadataSegment\n %s" % self.data()
|
|
610
|
+
|
|
611
|
+
|
|
612
|
+
class SubBlockSegment(object):
|
|
613
|
+
"""ZISRAWSUBBLOCK segment data.
|
|
614
|
+
|
|
615
|
+
Contains XML metadata, optional attachments, and homogenous,
|
|
616
|
+
contiguous pixel data.
|
|
617
|
+
|
|
618
|
+
"""
|
|
619
|
+
__slots__ = ('metadata_size', 'attachment_size', 'data_size',
|
|
620
|
+
'directory_entry', 'data_offset', '_fh')
|
|
621
|
+
|
|
622
|
+
SID = b'ZISRAWSUBBLOCK'
|
|
623
|
+
|
|
624
|
+
def __init__(self, fh):
|
|
625
|
+
(self.metadata_size,
|
|
626
|
+
self.attachment_size,
|
|
627
|
+
self.data_size,
|
|
628
|
+
) = struct.unpack('<iiq', fh.read(16))
|
|
629
|
+
self.directory_entry = DirectoryEntryDV(fh)
|
|
630
|
+
#fh.seek(max(240 - self.directory_entry.storage_size, 0), 1) # fill
|
|
631
|
+
#self.metadata = unicode(fh.read(self.metadata_size), 'utf-8')
|
|
632
|
+
self.data_offset = fh.tell()
|
|
633
|
+
self.data_offset += max(240 - self.directory_entry.storage_size, 0)
|
|
634
|
+
self.data_offset += self.metadata_size
|
|
635
|
+
self._fh = fh
|
|
636
|
+
|
|
637
|
+
def metadata(self):
|
|
638
|
+
"""Read metadata from file and return as XML string."""
|
|
639
|
+
self._fh.seek(self.data_offset - self.metadata_size)
|
|
640
|
+
return unicode(self._fh.read(self.metadata_size), 'utf-8')
|
|
641
|
+
|
|
642
|
+
def data(self, raw=False, bgr2rgb=True, resize=True, order=1):
|
|
643
|
+
"""Read image data from file and return as numpy array."""
|
|
644
|
+
self._fh.seek(self.data_offset)
|
|
645
|
+
if raw:
|
|
646
|
+
return self._fh.read(self.data_size)
|
|
647
|
+
elif self.compression:
|
|
648
|
+
if self.compression not in DECOMPRESS:
|
|
649
|
+
raise ValueError("compression unknown or not supported")
|
|
650
|
+
# TODO: test this
|
|
651
|
+
data = self._fh.read(self.data_size)
|
|
652
|
+
data = DECOMPRESS[self.compression](data)
|
|
653
|
+
if self.compression == 2:
|
|
654
|
+
# LZW
|
|
655
|
+
data = numpy.fromstring(data, self.dtype)
|
|
656
|
+
else:
|
|
657
|
+
dtype = numpy.dtype(self.dtype)
|
|
658
|
+
data = self._fh.fromfile(dtype, self.data_size // dtype.itemsize)
|
|
659
|
+
|
|
660
|
+
data = data.reshape(self.stored_shape)
|
|
661
|
+
if self.stored_shape == self.shape or not resize:
|
|
662
|
+
if bgr2rgb and self.stored_shape[-1] in (3, 4):
|
|
663
|
+
tmp = data[..., 0].copy()
|
|
664
|
+
data[..., 0] = data[..., 2]
|
|
665
|
+
data[..., 2] = tmp
|
|
666
|
+
return data
|
|
667
|
+
|
|
668
|
+
# sub / supersampling
|
|
669
|
+
factors = [j / i for i, j in zip(self.stored_shape, self.shape)]
|
|
670
|
+
factors = [(1.0 if abs(1.0-f) < 0.0001 else f) for f in factors]
|
|
671
|
+
shape = list(self.stored_shape)
|
|
672
|
+
# remove leading dimensions with factor 1.0 for speed
|
|
673
|
+
for factor in factors:
|
|
674
|
+
if factor != 1.0:
|
|
675
|
+
break
|
|
676
|
+
shape = shape[1:]
|
|
677
|
+
factors = factors[1:]
|
|
678
|
+
data.shape = shape
|
|
679
|
+
# resize RGB components separately for speed
|
|
680
|
+
if shape[-1] in (3, 4) and factors[-1] == 1.0:
|
|
681
|
+
factors = factors[:-1]
|
|
682
|
+
old = data
|
|
683
|
+
data = numpy.empty(self.shape, self.dtype[-2:])
|
|
684
|
+
for i in range(shape[-1]):
|
|
685
|
+
j = {0: 2, 1: 1, 2: 0, 3: 3}[i] if bgr2rgb else i
|
|
686
|
+
data[..., i] = zoom(old[..., j], zoom=factors, order=order)
|
|
687
|
+
else:
|
|
688
|
+
data = zoom(data, zoom=factors, order=order)
|
|
689
|
+
|
|
690
|
+
data.shape = self.shape
|
|
691
|
+
return data
|
|
692
|
+
|
|
693
|
+
def attachments(self):
|
|
694
|
+
"""Read optional attachments from file and return as bytes."""
|
|
695
|
+
if self.attachment_size < 1:
|
|
696
|
+
return b''
|
|
697
|
+
self._fh.seek(self.data_offset + self.data_size)
|
|
698
|
+
return self._fh.read(self.attachment_size)
|
|
699
|
+
|
|
700
|
+
def __getattr__(self, name):
|
|
701
|
+
"""Directly access DirectoryEntryDV attributes."""
|
|
702
|
+
return getattr(self.directory_entry, name)
|
|
703
|
+
|
|
704
|
+
def __str__(self):
|
|
705
|
+
return "SubBlockSegment\n %s\n %s" % (
|
|
706
|
+
self.metadata(), str(self.directory_entry))
|
|
707
|
+
|
|
708
|
+
|
|
709
|
+
class DirectoryEntryDV(object):
|
|
710
|
+
"""Directory Entry - Schema DV."""
|
|
711
|
+
|
|
712
|
+
#__slots__ = ('file_position', 'file_part', 'compression', 'pyramid_type',
|
|
713
|
+
# 'dimension_entries', 'dtype', '_fh')
|
|
714
|
+
|
|
715
|
+
@staticmethod
|
|
716
|
+
def read_file_position(fh):
|
|
717
|
+
"""Return file position of associated SubBlock segment."""
|
|
718
|
+
(schema_type,
|
|
719
|
+
file_position,
|
|
720
|
+
dimensions_count,
|
|
721
|
+
) = struct.unpack('<2s4xq14xi', fh.read(32))
|
|
722
|
+
fh.seek(dimensions_count * 20, 1)
|
|
723
|
+
assert(schema_type == b'DV')
|
|
724
|
+
return file_position
|
|
725
|
+
|
|
726
|
+
def __init__(self, fh):
|
|
727
|
+
(schema_type,
|
|
728
|
+
pixel_type,
|
|
729
|
+
self.file_position,
|
|
730
|
+
self.file_part, # reserved
|
|
731
|
+
self.compression,
|
|
732
|
+
self.pyramid_type, # internal
|
|
733
|
+
reserved1,
|
|
734
|
+
reserved2,
|
|
735
|
+
dimensions_count,
|
|
736
|
+
) = struct.unpack('<2siqiiBB4si', fh.read(32))
|
|
737
|
+
|
|
738
|
+
if schema_type != b'DV':
|
|
739
|
+
raise ValueError("not a DirectoryEntryDV")
|
|
740
|
+
self.dtype = PIXEL_TYPE[pixel_type]
|
|
741
|
+
|
|
742
|
+
# reverse dimension_entries to match C contiguous data
|
|
743
|
+
self.dimension_entries = list(reversed(
|
|
744
|
+
[DimensionEntryDV1(fh) for _ in range(dimensions_count)]))
|
|
745
|
+
self._fh = fh
|
|
746
|
+
|
|
747
|
+
@lazyattr
|
|
748
|
+
def storage_size(self):
|
|
749
|
+
return 32 + len(self.dimension_entries) * 20
|
|
750
|
+
|
|
751
|
+
@lazyattr
|
|
752
|
+
def pixel_type(self):
|
|
753
|
+
return PIXEL_TYPE[self.dtype]
|
|
754
|
+
|
|
755
|
+
@lazyattr
|
|
756
|
+
def axes(self):
|
|
757
|
+
axes = b''.join(dim.dimension for dim in self.dimension_entries
|
|
758
|
+
if dim.dimension != b'M')
|
|
759
|
+
return axes + b'0'
|
|
760
|
+
|
|
761
|
+
@lazyattr
|
|
762
|
+
def shape(self):
|
|
763
|
+
shape = tuple(dim.size for dim in self.dimension_entries
|
|
764
|
+
if dim.dimension != b'M')
|
|
765
|
+
sampleshape = numpy.dtype(self.dtype).shape
|
|
766
|
+
return shape + (sampleshape if sampleshape else (1,))
|
|
767
|
+
|
|
768
|
+
@lazyattr
|
|
769
|
+
def start(self):
|
|
770
|
+
start = tuple(dim.start for dim in self.dimension_entries
|
|
771
|
+
if dim.dimension != b'M')
|
|
772
|
+
return start + (0,)
|
|
773
|
+
|
|
774
|
+
@lazyattr
|
|
775
|
+
def stored_shape(self):
|
|
776
|
+
shape = tuple(dim.stored_size for dim in self.dimension_entries
|
|
777
|
+
if dim.dimension != b'M')
|
|
778
|
+
sampleshape = numpy.dtype(self.dtype).shape
|
|
779
|
+
return shape + (sampleshape if sampleshape else (1,))
|
|
780
|
+
|
|
781
|
+
@lazyattr
|
|
782
|
+
def mosaic_index(self):
|
|
783
|
+
for dim in self.dimension_entries:
|
|
784
|
+
if dim.dimension == b'M':
|
|
785
|
+
return dim.start
|
|
786
|
+
|
|
787
|
+
def data_segment(self):
|
|
788
|
+
"""Read and return SubBlockSegment at file_position."""
|
|
789
|
+
return Segment(self._fh, self.file_position).data()
|
|
790
|
+
|
|
791
|
+
def __str__(self):
|
|
792
|
+
return "DirectoryEntryDV\n %s %s %s %s\n %s" % (
|
|
793
|
+
COMPRESSION.get(self.compression, self.compression),
|
|
794
|
+
self.pixel_type, self.axes, str(self.shape),
|
|
795
|
+
"\n ".join(str(d) for d in self.dimension_entries))
|
|
796
|
+
|
|
797
|
+
|
|
798
|
+
class DimensionEntryDV1(object):
|
|
799
|
+
"""Dimension Entry - Schema DV."""
|
|
800
|
+
|
|
801
|
+
__slots__ = 'dimension', 'start', 'size', 'start_coordinate', 'stored_size'
|
|
802
|
+
|
|
803
|
+
def __init__(self, fh):
|
|
804
|
+
(self.dimension,
|
|
805
|
+
self.start,
|
|
806
|
+
self.size,
|
|
807
|
+
self.start_coordinate,
|
|
808
|
+
stored_size
|
|
809
|
+
) = struct.unpack('<4siifi', fh.read(20))
|
|
810
|
+
self.dimension = stripnull(self.dimension)
|
|
811
|
+
self.stored_size = stored_size if stored_size else self.size
|
|
812
|
+
|
|
813
|
+
def __str__(self):
|
|
814
|
+
return "DimensionEntryDV1 %s %i %i %f %i" % (
|
|
815
|
+
self.dimension, self.start, self.size,
|
|
816
|
+
self.start_coordinate, self.stored_size)
|
|
817
|
+
|
|
818
|
+
|
|
819
|
+
class SubBlockDirectorySegment(object):
|
|
820
|
+
"""ZISRAWDIRECTORY segment data.
|
|
821
|
+
|
|
822
|
+
Contains entries of any kind, currently only DirectoryEntryDV.
|
|
823
|
+
|
|
824
|
+
"""
|
|
825
|
+
__slots__ = 'entries',
|
|
826
|
+
|
|
827
|
+
SID = b'ZISRAWDIRECTORY'
|
|
828
|
+
|
|
829
|
+
@staticmethod
|
|
830
|
+
def file_positions(fh):
|
|
831
|
+
"""Return list of file positions of associated SubBlock segments."""
|
|
832
|
+
entry_count = struct.unpack('<i', fh.read(4))[0]
|
|
833
|
+
fh.seek(124, 1) # reserved
|
|
834
|
+
return tuple(DirectoryEntryDV.read_file_position(fh)
|
|
835
|
+
for _ in range(entry_count))
|
|
836
|
+
|
|
837
|
+
def __init__(self, fh):
|
|
838
|
+
entry_count = struct.unpack('<i', fh.read(4))[0]
|
|
839
|
+
fh.seek(124, 1) # reserved
|
|
840
|
+
self.entries = tuple(DirectoryEntryDV(fh) for _ in range(entry_count))
|
|
841
|
+
|
|
842
|
+
def __len__(self):
|
|
843
|
+
return len(self.entries)
|
|
844
|
+
|
|
845
|
+
def __getitem__(self, key):
|
|
846
|
+
return self.entries[key]
|
|
847
|
+
|
|
848
|
+
def __iter__(self):
|
|
849
|
+
return iter(self.entries)
|
|
850
|
+
|
|
851
|
+
def __str__(self):
|
|
852
|
+
return "SubBlockDirectorySegment\n %s" % (
|
|
853
|
+
"\n ".join(str(e) for e in self.entries))
|
|
854
|
+
|
|
855
|
+
|
|
856
|
+
class AttachmentSegment(object):
|
|
857
|
+
"""ZISRAWATTACH segment data.
|
|
858
|
+
|
|
859
|
+
Contains binary or text data as specified in attachment_entry.
|
|
860
|
+
|
|
861
|
+
"""
|
|
862
|
+
__slots__ = 'data_size', 'attachment_entry', 'data_offset', '_fh'
|
|
863
|
+
|
|
864
|
+
SID = b'ZISRAWATTACH'
|
|
865
|
+
|
|
866
|
+
def __init__(self, fh):
|
|
867
|
+
self.data_size = struct.unpack('<i', fh.read(4))[0]
|
|
868
|
+
fh.seek(12, 1) # reserved
|
|
869
|
+
self.attachment_entry = AttachmentEntryA1(fh)
|
|
870
|
+
fh.seek(112, 1) # reserved
|
|
871
|
+
self.data_offset = fh.tell()
|
|
872
|
+
self._fh = fh
|
|
873
|
+
|
|
874
|
+
def save(self, filename=None, directory='.'):
|
|
875
|
+
"""Save attachment to file in directory."""
|
|
876
|
+
self._fh.seek(self.data_offset)
|
|
877
|
+
if not filename:
|
|
878
|
+
filename = self.attachment_entry.filename
|
|
879
|
+
filename = os.path.join(directory, filename)
|
|
880
|
+
with open(filename, 'wb') as fh:
|
|
881
|
+
fh.write(self._fh.read(self.data_size))
|
|
882
|
+
|
|
883
|
+
def data(self, raw=False):
|
|
884
|
+
"""Read embedded file and return content.
|
|
885
|
+
|
|
886
|
+
If 'raw' is False (default), try return content according to
|
|
887
|
+
CONTENT_FILE_TYPE, else return raw bytes.
|
|
888
|
+
|
|
889
|
+
"""
|
|
890
|
+
self._fh.seek(self.data_offset)
|
|
891
|
+
cotype = self.attachment_entry.content_file_type
|
|
892
|
+
if not raw and cotype in CONTENT_FILE_TYPE:
|
|
893
|
+
return CONTENT_FILE_TYPE[cotype](self._fh, filesize=self.data_size)
|
|
894
|
+
else:
|
|
895
|
+
return self._fh.read(self.data_size)
|
|
896
|
+
|
|
897
|
+
def __str__(self):
|
|
898
|
+
return "AttachmentSegment\n %s" % self.attachment_entry
|
|
899
|
+
|
|
900
|
+
|
|
901
|
+
class AttachmentEntryA1(object):
|
|
902
|
+
"""AttachmentEntry - Schema A1."""
|
|
903
|
+
|
|
904
|
+
__slots__ = ('content_guid', 'content_file_type', 'name',
|
|
905
|
+
'file_position', '_fh')
|
|
906
|
+
|
|
907
|
+
@staticmethod
|
|
908
|
+
def read_file_position(fh):
|
|
909
|
+
"""Return file position of associated Attachment segment."""
|
|
910
|
+
schema_type, file_position = struct.unpack('<2s10xq', fh.read(20))
|
|
911
|
+
fh.seek(108, 1)
|
|
912
|
+
assert(schema_type == b'A1')
|
|
913
|
+
return file_position
|
|
914
|
+
|
|
915
|
+
def __init__(self, fh):
|
|
916
|
+
(shema_type,
|
|
917
|
+
reserved,
|
|
918
|
+
self.file_position,
|
|
919
|
+
file_part, # reserved
|
|
920
|
+
content_guid,
|
|
921
|
+
content_file_type,
|
|
922
|
+
name
|
|
923
|
+
) = struct.unpack('<2s10sqi16s8s80s', fh.read(128))
|
|
924
|
+
|
|
925
|
+
if shema_type != b'A1':
|
|
926
|
+
raise ValueError("not a AttachmentEntryA1")
|
|
927
|
+
self.content_guid = uuid.UUID(bytes=content_guid)
|
|
928
|
+
self.content_file_type = stripnull(content_file_type)
|
|
929
|
+
self.name = unicode(stripnull(name), 'utf-8')
|
|
930
|
+
self._fh = fh
|
|
931
|
+
|
|
932
|
+
@property
|
|
933
|
+
def filename(self):
|
|
934
|
+
"""Return unique file name for attachment."""
|
|
935
|
+
return "%s@%i.%s" % (self.name, self.file_position,
|
|
936
|
+
unicode(self.content_file_type, 'utf-8').lower())
|
|
937
|
+
|
|
938
|
+
def data_segment(self):
|
|
939
|
+
"""Read and return AttachmentSegment at file_position."""
|
|
940
|
+
return Segment(self._fh, self.file_position).data()
|
|
941
|
+
|
|
942
|
+
def __str__(self):
|
|
943
|
+
return " ".join(str(i) for i in (
|
|
944
|
+
"AttachmentEntryA1", self.name, self.content_file_type,
|
|
945
|
+
self.content_guid))
|
|
946
|
+
|
|
947
|
+
|
|
948
|
+
class AttachmentDirectorySegment(object):
|
|
949
|
+
"""ZISRAWATTDIR segment data. Sequence of AttachmentEntryA1."""
|
|
950
|
+
|
|
951
|
+
__slots__ = 'entries',
|
|
952
|
+
|
|
953
|
+
SID = b'ZISRAWATTDIR'
|
|
954
|
+
|
|
955
|
+
@staticmethod
|
|
956
|
+
def file_positions(fh):
|
|
957
|
+
"""Return list of file positions of associated Attachment segments."""
|
|
958
|
+
entry_count = struct.unpack('<i', fh.read(4))[0]
|
|
959
|
+
fh.seek(252, 1)
|
|
960
|
+
return tuple(AttachmentEntryA1.read_file_position(fh)
|
|
961
|
+
for _ in range(entry_count))
|
|
962
|
+
|
|
963
|
+
def __init__(self, fh):
|
|
964
|
+
entry_count = struct.unpack('<i', fh.read(4))[0]
|
|
965
|
+
fh.seek(252, 1)
|
|
966
|
+
self.entries = tuple(AttachmentEntryA1(fh) for _ in range(entry_count))
|
|
967
|
+
|
|
968
|
+
def __len__(self):
|
|
969
|
+
return len(self.entries)
|
|
970
|
+
|
|
971
|
+
def __getitem__(self, key):
|
|
972
|
+
return self.entries[key]
|
|
973
|
+
|
|
974
|
+
def __iter__(self):
|
|
975
|
+
return iter(self.entries)
|
|
976
|
+
|
|
977
|
+
def __str__(self):
|
|
978
|
+
return "AttachmentDirectorySegment\n %s" % (
|
|
979
|
+
"\n ".join(str(i) for i in self.entries))
|
|
980
|
+
|
|
981
|
+
|
|
982
|
+
class DeletedSegment(object):
|
|
983
|
+
"""DELETED segment data. Ignore."""
|
|
984
|
+
|
|
985
|
+
__slots__ = ()
|
|
986
|
+
|
|
987
|
+
SID = b'DELETED'
|
|
988
|
+
|
|
989
|
+
def __init__(self, fh):
|
|
990
|
+
pass
|
|
991
|
+
|
|
992
|
+
def __str__(self):
|
|
993
|
+
return "DeletedSegment"
|
|
994
|
+
|
|
995
|
+
|
|
996
|
+
class UnknownSegment(object):
|
|
997
|
+
"""Unknown segment data. Ignore."""
|
|
998
|
+
|
|
999
|
+
__slots__ = ()
|
|
1000
|
+
|
|
1001
|
+
def __init__(self, fh):
|
|
1002
|
+
pass
|
|
1003
|
+
|
|
1004
|
+
def __str__(self):
|
|
1005
|
+
return "UnknownSegment"
|
|
1006
|
+
|
|
1007
|
+
|
|
1008
|
+
class TimeStamps(object):
|
|
1009
|
+
"""CZTIMS TimeStamps content schema.
|
|
1010
|
+
|
|
1011
|
+
Contains sequence of floting point numbers, i.e. seconds relative
|
|
1012
|
+
to start time of acquisition.
|
|
1013
|
+
|
|
1014
|
+
"""
|
|
1015
|
+
__slots__ = 'time_stamps',
|
|
1016
|
+
|
|
1017
|
+
def __init__(self, fh, filesize=None):
|
|
1018
|
+
size, number = struct.unpack('<ii', fh.read(8))
|
|
1019
|
+
self.time_stamps = struct.unpack('<%id' % number, fh.read(8 * number))
|
|
1020
|
+
|
|
1021
|
+
def __len__(self):
|
|
1022
|
+
return len(self.time_stamps)
|
|
1023
|
+
|
|
1024
|
+
def __getitem__(self, key):
|
|
1025
|
+
return self.time_stamps[key]
|
|
1026
|
+
|
|
1027
|
+
def __iter__(self):
|
|
1028
|
+
return iter(self.time_stamps)
|
|
1029
|
+
|
|
1030
|
+
def __str__(self):
|
|
1031
|
+
return str(self.time_stamps)
|
|
1032
|
+
|
|
1033
|
+
|
|
1034
|
+
class FocusPositions(object):
|
|
1035
|
+
"""CZFOC FocusPositions content schema.
|
|
1036
|
+
|
|
1037
|
+
Contains sequence of floting point numbers, i.e. micrometers relative
|
|
1038
|
+
to Z start position of acquisition.
|
|
1039
|
+
|
|
1040
|
+
"""
|
|
1041
|
+
__slots__ = 'positions',
|
|
1042
|
+
|
|
1043
|
+
def __init__(self, fh, filesize=None):
|
|
1044
|
+
size, number = struct.unpack('<ii', fh.read(8))
|
|
1045
|
+
self.positions = struct.unpack('<%id' % number, fh.read(8 * number))
|
|
1046
|
+
|
|
1047
|
+
def __len__(self):
|
|
1048
|
+
return len(self.positions)
|
|
1049
|
+
|
|
1050
|
+
def __getitem__(self, key):
|
|
1051
|
+
return self.positions[key]
|
|
1052
|
+
|
|
1053
|
+
def __iter__(self):
|
|
1054
|
+
return iter(self.positions)
|
|
1055
|
+
|
|
1056
|
+
def __str__(self):
|
|
1057
|
+
return str(self.positions)
|
|
1058
|
+
|
|
1059
|
+
|
|
1060
|
+
class EventList(object):
|
|
1061
|
+
"""CZEVL EventList content schema. Sequence of EventListEntry."""
|
|
1062
|
+
|
|
1063
|
+
__slots__ = 'events',
|
|
1064
|
+
|
|
1065
|
+
def __init__(self, fh, filesize=None):
|
|
1066
|
+
size, number = struct.unpack('<ii', fh.read(8))
|
|
1067
|
+
self.events = [EventListEntry(fh) for _ in range(number)]
|
|
1068
|
+
|
|
1069
|
+
def __len__(self):
|
|
1070
|
+
return len(self.events)
|
|
1071
|
+
|
|
1072
|
+
def __getitem__(self, key):
|
|
1073
|
+
return self.events[key]
|
|
1074
|
+
|
|
1075
|
+
def __iter__(self):
|
|
1076
|
+
return iter(self.events)
|
|
1077
|
+
|
|
1078
|
+
def __str__(self):
|
|
1079
|
+
return "\n ".join(str(event) for event in self.events)
|
|
1080
|
+
|
|
1081
|
+
|
|
1082
|
+
class EventListEntry(object):
|
|
1083
|
+
"""EventListEntry content schema."""
|
|
1084
|
+
|
|
1085
|
+
__slots__ = 'time', 'event_type', 'description'
|
|
1086
|
+
|
|
1087
|
+
EV_TYPE = {0: 'MARKER', 1: 'TIME_CHANGE', 2: 'BLEACH_START',
|
|
1088
|
+
3: 'BLEACH_STOP', 4: 'TRIGGER'}
|
|
1089
|
+
|
|
1090
|
+
def __init__(self, fh):
|
|
1091
|
+
(size,
|
|
1092
|
+
self.time,
|
|
1093
|
+
self.event_type,
|
|
1094
|
+
description_size,
|
|
1095
|
+
) = struct.unpack('<idii', fh.read(20))
|
|
1096
|
+
description = stripnull(fh.read(description_size))
|
|
1097
|
+
self.description = unicode(description, 'utf-8')
|
|
1098
|
+
|
|
1099
|
+
def __str__(self):
|
|
1100
|
+
return "%s @ %s (%s)" % (EventListEntry.EV_TYPE[self.event_type],
|
|
1101
|
+
self.time, self.description)
|
|
1102
|
+
|
|
1103
|
+
|
|
1104
|
+
class LookupTables(object):
|
|
1105
|
+
"""CZLUT LookupTables content schema. Sequence of LookupTableEntry."""
|
|
1106
|
+
|
|
1107
|
+
__slots__ = 'lookup_tables',
|
|
1108
|
+
|
|
1109
|
+
def __init__(self, fh, filesize=None):
|
|
1110
|
+
size, number = struct.unpack('<ii', fh.read(8))
|
|
1111
|
+
self.lookup_tables = [LookupTableEntry(fh) for _ in range(number)]
|
|
1112
|
+
|
|
1113
|
+
def __len__(self):
|
|
1114
|
+
return len(self.lookup_tables)
|
|
1115
|
+
|
|
1116
|
+
def __getitem__(self, key):
|
|
1117
|
+
return self.lookup_tables[key]
|
|
1118
|
+
|
|
1119
|
+
def __iter__(self):
|
|
1120
|
+
return iter(self.lookup_tables)
|
|
1121
|
+
|
|
1122
|
+
def __str__(self):
|
|
1123
|
+
return "LookupTables\n %s" % str(self.lookup_tables)
|
|
1124
|
+
|
|
1125
|
+
|
|
1126
|
+
class LookupTableEntry(object):
|
|
1127
|
+
"""LookupTableEntry content schema. Sequence of ComponentEntry."""
|
|
1128
|
+
|
|
1129
|
+
__slots__ = 'identifier', 'components'
|
|
1130
|
+
|
|
1131
|
+
def __init__(self, fh):
|
|
1132
|
+
size, identifier, number = struct.unpack('<i80si', fh.read(88))
|
|
1133
|
+
self.identifier = unicode(stripnull(identifier), 'utf-8')
|
|
1134
|
+
self.components = [ComponentEntry(fh) for _ in range(number)]
|
|
1135
|
+
|
|
1136
|
+
def __len__(self):
|
|
1137
|
+
return len(self.components)
|
|
1138
|
+
|
|
1139
|
+
def __getitem__(self, key):
|
|
1140
|
+
return self.components[key]
|
|
1141
|
+
|
|
1142
|
+
def __iter__(self):
|
|
1143
|
+
return iter(self.components)
|
|
1144
|
+
|
|
1145
|
+
def __str__(self):
|
|
1146
|
+
return "LookupTableEntry\n %s\n %s" % (
|
|
1147
|
+
self.identifier, "\n ".join(str(i) for i in self.components))
|
|
1148
|
+
|
|
1149
|
+
|
|
1150
|
+
class ComponentEntry(object):
|
|
1151
|
+
"""ComponentEntry content schema."""
|
|
1152
|
+
|
|
1153
|
+
__slots__ = 'component_type', 'intensity'
|
|
1154
|
+
|
|
1155
|
+
CO_TYPE = {-1: 'RGB', 1: 'RED', 2: 'GREEN', 3: 'BLUE'}
|
|
1156
|
+
|
|
1157
|
+
def __init__(self, fh):
|
|
1158
|
+
size, self.component_type, number = struct.unpack('<iii', fh.read(12))
|
|
1159
|
+
self.intensity = fh.fromfile(dtype='<i2', count=number//2)
|
|
1160
|
+
if self.component_type == -1:
|
|
1161
|
+
self.intensity = self.intensity.reshape(-1, 3)
|
|
1162
|
+
|
|
1163
|
+
def __str__(self):
|
|
1164
|
+
return "ComponentEntry %s %s" % (
|
|
1165
|
+
ComponentEntry.CO_TYPE[self.component_type],
|
|
1166
|
+
str(self.intensity.shape))
|
|
1167
|
+
|
|
1168
|
+
|
|
1169
|
+
def xml_reader(fh, filesize):
|
|
1170
|
+
"""Read XML from file and return as xml.ElementTree root Element."""
|
|
1171
|
+
xml = unicode(stripnull(fh.read(filesize)), 'utf-8')
|
|
1172
|
+
return etree.fromstring(xml)
|
|
1173
|
+
|
|
1174
|
+
|
|
1175
|
+
def match_filename(filename):
|
|
1176
|
+
"""Return master file name and file part number from CZI file name."""
|
|
1177
|
+
match = re.search(r'(.*?)(?:\((\d+)\))?\.czi$',
|
|
1178
|
+
filename, re.IGNORECASE).groups()
|
|
1179
|
+
name = match[0] + '.czi'
|
|
1180
|
+
part = int(match[1]) if len(match) > 1 else 0
|
|
1181
|
+
return name, part
|
|
1182
|
+
|
|
1183
|
+
|
|
1184
|
+
def decodejxr(data):
|
|
1185
|
+
"""Decode JXR data stream into ndarray via temporary file."""
|
|
1186
|
+
fd, filename = tempfile.mkstemp(suffix='.jxr')
|
|
1187
|
+
with os.fdopen(fd, 'wb') as fh:
|
|
1188
|
+
fh.write(data)
|
|
1189
|
+
if isinstance(filename, unicode):
|
|
1190
|
+
filename = filename.encode('ascii')
|
|
1191
|
+
try:
|
|
1192
|
+
out = _czifile.decodejxr(filename)
|
|
1193
|
+
finally:
|
|
1194
|
+
os.remove(filename)
|
|
1195
|
+
return out
|
|
1196
|
+
|
|
1197
|
+
|
|
1198
|
+
def decodejpg(data):
|
|
1199
|
+
"""Decode JPG data stream into ndarray."""
|
|
1200
|
+
return _czifile.decodejpg(data, len(data))
|
|
1201
|
+
|
|
1202
|
+
|
|
1203
|
+
# map Segment.sid to data reader
|
|
1204
|
+
SEGMENT_ID = {
|
|
1205
|
+
FileHeaderSegment.SID: FileHeaderSegment,
|
|
1206
|
+
SubBlockDirectorySegment.SID: SubBlockDirectorySegment,
|
|
1207
|
+
SubBlockSegment.SID: SubBlockSegment,
|
|
1208
|
+
MetadataSegment.SID: MetadataSegment,
|
|
1209
|
+
AttachmentSegment.SID: AttachmentSegment,
|
|
1210
|
+
AttachmentDirectorySegment.SID: AttachmentDirectorySegment,
|
|
1211
|
+
DeletedSegment.SID: DeletedSegment,
|
|
1212
|
+
}
|
|
1213
|
+
|
|
1214
|
+
# map AttachmentEntryA1.content_file_type to attachment reader.
|
|
1215
|
+
CONTENT_FILE_TYPE = {
|
|
1216
|
+
b'CZI': CziFile,
|
|
1217
|
+
b'ZISRAW': CziFile,
|
|
1218
|
+
b'CZTIMS': TimeStamps,
|
|
1219
|
+
b'CZEVL': EventList,
|
|
1220
|
+
b'CZLUT': LookupTables,
|
|
1221
|
+
b'CZFOC': FocusPositions,
|
|
1222
|
+
b'CZEXP': xml_reader, # Experiment
|
|
1223
|
+
b'CZHWS': xml_reader, # HardwareSetting
|
|
1224
|
+
b'CZMVM': xml_reader, # MultiviewMicroscopy
|
|
1225
|
+
# b'CZPML': PalMoleculeList, # undocumented
|
|
1226
|
+
# b'ZIP'
|
|
1227
|
+
# b'JPG'
|
|
1228
|
+
}
|
|
1229
|
+
|
|
1230
|
+
# map DirectoryEntryDV.pixeltype to numpy dtypes
|
|
1231
|
+
PIXEL_TYPE = {
|
|
1232
|
+
0: '<u1', 'Gray8': '<u1', '<u1': 'Gray8',
|
|
1233
|
+
1: '<u2', 'Gray16': '<u2', '<u2': 'Gray16',
|
|
1234
|
+
2: '<f4', 'Gray32Float': '<f4', '<f4': 'Gray32Float',
|
|
1235
|
+
3: '<3u1', 'Bgr24': '<3u1', '<3u1': 'Bgr24',
|
|
1236
|
+
4: '<3u2', 'Bgr48': '<3u2', '<3u2': 'Bgr48',
|
|
1237
|
+
8: '<3f4', 'Bgr96Float': '<3f4', '<3f4': 'Bgr96Float',
|
|
1238
|
+
9: '<4u1', 'Bgra32': '<4u1', '<4u1': 'Bgra32',
|
|
1239
|
+
10: '<F8', 'Gray64ComplexFloat': '<F8', '<F8': 'Gray64ComplexFloat',
|
|
1240
|
+
11: '<3F8', 'Bgr192ComplexFloat': '<3F8', '<3F8': 'Bgr192ComplexFloat',
|
|
1241
|
+
12: '<i4', 'Gray32': '<i4', '<i4': 'Gray32',
|
|
1242
|
+
13: '<i8', 'Gray64': '<i8', '<i8': 'Gray64',
|
|
1243
|
+
}
|
|
1244
|
+
|
|
1245
|
+
|
|
1246
|
+
# map dimension character to description
|
|
1247
|
+
DIMENSIONS = {
|
|
1248
|
+
b'0': 'Sample', # e.g. RGBA
|
|
1249
|
+
b'X': 'Width',
|
|
1250
|
+
b'Y': 'Height',
|
|
1251
|
+
b'C': 'Channel',
|
|
1252
|
+
b'Z': 'Slice', # depth
|
|
1253
|
+
b'T': 'Time',
|
|
1254
|
+
b'R': 'Rotation',
|
|
1255
|
+
b'S': 'Scene',
|
|
1256
|
+
b'I': 'Illumination', # direction
|
|
1257
|
+
b'B': 'Block', # acquisition
|
|
1258
|
+
b'M': 'Mosaic', # tile
|
|
1259
|
+
b'H': 'Phase',
|
|
1260
|
+
b'V': 'View',
|
|
1261
|
+
}
|
|
1262
|
+
|
|
1263
|
+
# map DirectoryEntryDV.compression to description
|
|
1264
|
+
COMPRESSION = {
|
|
1265
|
+
0: "Uncompressed",
|
|
1266
|
+
1: "JpgFile",
|
|
1267
|
+
2: "LZW",
|
|
1268
|
+
4: "JpegXrFile",
|
|
1269
|
+
# 100 and up: camera/system specific specific RAW data
|
|
1270
|
+
}
|
|
1271
|
+
|
|
1272
|
+
# map DirectoryEntryDV.compression to decompression function
|
|
1273
|
+
DECOMPRESS = {
|
|
1274
|
+
0: lambda x: x, # uncompressed
|
|
1275
|
+
2: decodelzw, # LZW
|
|
1276
|
+
}
|
|
1277
|
+
|
|
1278
|
+
if _have_czifile:
|
|
1279
|
+
DECOMPRESS[1] = decodejpg
|
|
1280
|
+
DECOMPRESS[4] = decodejxr
|
|
1281
|
+
|
|
1282
|
+
if sys.version_info[0] > 2:
|
|
1283
|
+
unicode = str
|
|
1284
|
+
basestring = str, bytes
|
|
1285
|
+
|
|
1286
|
+
if __name__ == "__main__":
|
|
1287
|
+
import doctest
|
|
1288
|
+
numpy.set_printoptions(suppress=True, precision=5)
|
|
1289
|
+
doctest.testmod()
|