python-microscopy 25.6.5__cp39-cp39-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- PYME/Acquire/ActionManager.py +450 -0
- PYME/Acquire/ExecTools.py +235 -0
- PYME/Acquire/Hardware/AAOptoelectronics/MDS.py +175 -0
- PYME/Acquire/Hardware/AAOptoelectronics/__init__.py +0 -0
- PYME/Acquire/Hardware/ARCoptix/__init__.py +0 -0
- PYME/Acquire/Hardware/ARCoptix/lcdriver.py +149 -0
- PYME/Acquire/Hardware/ARCoptix/lcserver32.py +123 -0
- PYME/Acquire/Hardware/AndorIXon/AndorCam.py +1095 -0
- PYME/Acquire/Hardware/AndorIXon/AndorControlFrame.py +312 -0
- PYME/Acquire/Hardware/AndorIXon/AndorIXon.py +737 -0
- PYME/Acquire/Hardware/AndorIXon/__init__.py +27 -0
- PYME/Acquire/Hardware/AndorNeo/AndorNeo.py +644 -0
- PYME/Acquire/Hardware/AndorNeo/AndorNeoControlFrame.py +161 -0
- PYME/Acquire/Hardware/AndorNeo/AndorZyla.py +761 -0
- PYME/Acquire/Hardware/AndorNeo/SDK3.py +307 -0
- PYME/Acquire/Hardware/AndorNeo/SDK3Cam.py +171 -0
- PYME/Acquire/Hardware/AndorNeo/ZylaControlPanel.py +105 -0
- PYME/Acquire/Hardware/AndorNeo/__init__.py +22 -0
- PYME/Acquire/Hardware/AndorNeo/parseAtdebug.py +46 -0
- PYME/Acquire/Hardware/AndorNeo/plotTimings.py +73 -0
- PYME/Acquire/Hardware/AndorNeo/testNeo.py +62 -0
- PYME/Acquire/Hardware/Camera.py +1199 -0
- PYME/Acquire/Hardware/CameraSkeleton.py +642 -0
- PYME/Acquire/Hardware/Coherent/OBIS.py +147 -0
- PYME/Acquire/Hardware/Coherent/Sapphire.py +162 -0
- PYME/Acquire/Hardware/Coherent/__init__.py +0 -0
- PYME/Acquire/Hardware/DMDGui.py +198 -0
- PYME/Acquire/Hardware/DigiData/DigiData.py +95 -0
- PYME/Acquire/Hardware/DigiData/DigiDataClient.py +30 -0
- PYME/Acquire/Hardware/DigiData/RemoteDigiData.py +51 -0
- PYME/Acquire/Hardware/DigiData/__init__.py +24 -0
- PYME/Acquire/Hardware/DigiData/axDD132x.py +348 -0
- PYME/Acquire/Hardware/EMCCDTheory.py +41 -0
- PYME/Acquire/Hardware/ExciterWheel.py +167 -0
- PYME/Acquire/Hardware/FilterWheel.py +184 -0
- PYME/Acquire/Hardware/FocCorr.py +106 -0
- PYME/Acquire/Hardware/FocCorrR.py +196 -0
- PYME/Acquire/Hardware/FrFilter.py +51 -0
- PYME/Acquire/Hardware/GCS/GCS_DLL.py +370 -0
- PYME/Acquire/Hardware/GCS/__init__.py +0 -0
- PYME/Acquire/Hardware/GCS/gcs.py +210 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/HamamatsuDCAM.py +662 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/HamamatsuORCA.py +602 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/Hamamatsu_control_panel.py +54 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/__init__.py +23 -0
- PYME/Acquire/Hardware/LaserControlFrame.py +160 -0
- PYME/Acquire/Hardware/MPBCommunications/MPBCW.py +132 -0
- PYME/Acquire/Hardware/MPBCommunications/__init__.py +0 -0
- PYME/Acquire/Hardware/Mercury/Mercury.py +269 -0
- PYME/Acquire/Hardware/Mercury/PI_Mercury_GCS_DLL.py +857 -0
- PYME/Acquire/Hardware/Mercury/__init__.py +22 -0
- PYME/Acquire/Hardware/Mercury/mercuryStepper.py +203 -0
- PYME/Acquire/Hardware/Mercury/mercuryStepperGCS.py +281 -0
- PYME/Acquire/Hardware/NikonTE2000.py +68 -0
- PYME/Acquire/Hardware/NikonTi.py +214 -0
- PYME/Acquire/Hardware/NikonTiGUI.py +81 -0
- PYME/Acquire/Hardware/OrielCornerstone.py +125 -0
- PYME/Acquire/Hardware/PM100USB.py +51 -0
- PYME/Acquire/Hardware/Piezos/__init__.py +22 -0
- PYME/Acquire/Hardware/Piezos/base_piezo.py +108 -0
- PYME/Acquire/Hardware/Piezos/offsetPiezo.py +162 -0
- PYME/Acquire/Hardware/Piezos/offsetPiezoREST.py +308 -0
- PYME/Acquire/Hardware/Piezos/piezo_c867.py +486 -0
- PYME/Acquire/Hardware/Piezos/piezo_e255.py +68 -0
- PYME/Acquire/Hardware/Piezos/piezo_e662.py +61 -0
- PYME/Acquire/Hardware/Piezos/piezo_e709.py +434 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816.py +452 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816_corr.py +70 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816_dll.py +518 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816b.py +70 -0
- PYME/Acquire/Hardware/Piezos/piezo_pipython_gcs.py +560 -0
- PYME/Acquire/Hardware/Piezos/piezo_test.py +55 -0
- PYME/Acquire/Hardware/Simulator/EmpiricalHist.py +273 -0
- PYME/Acquire/Hardware/Simulator/__init__.py +22 -0
- PYME/Acquire/Hardware/Simulator/dSimControl.py +961 -0
- PYME/Acquire/Hardware/Simulator/fakeCam.py +651 -0
- PYME/Acquire/Hardware/Simulator/fakePiezo.py +95 -0
- PYME/Acquire/Hardware/Simulator/fluor.py +336 -0
- PYME/Acquire/Hardware/Simulator/illuminate.cp39-win_amd64.dll.a +0 -0
- PYME/Acquire/Hardware/Simulator/illuminate.cp39-win_amd64.pyd +0 -0
- PYME/Acquire/Hardware/Simulator/illuminate.pyx +93 -0
- PYME/Acquire/Hardware/Simulator/lasersliders.py +90 -0
- PYME/Acquire/Hardware/Simulator/rend_im.py +446 -0
- PYME/Acquire/Hardware/Simulator/setup.py +69 -0
- PYME/Acquire/Hardware/Simulator/simcontrol.py +348 -0
- PYME/Acquire/Hardware/Simulator/simui_wx.py +794 -0
- PYME/Acquire/Hardware/Tango/__init__.py +0 -0
- PYME/Acquire/Hardware/Tango/marzhauser_tango.py +583 -0
- PYME/Acquire/Hardware/TiLightCrafter.py +388 -0
- PYME/Acquire/Hardware/__init__.py +22 -0
- PYME/Acquire/Hardware/aotf.py +271 -0
- PYME/Acquire/Hardware/arclampshutterpanel.py +71 -0
- PYME/Acquire/Hardware/cameraSoftwareBuffer.py +215 -0
- PYME/Acquire/Hardware/camera_noise.py +270 -0
- PYME/Acquire/Hardware/ccdAdjPanel.py +188 -0
- PYME/Acquire/Hardware/ccdCalibrator.py +161 -0
- PYME/Acquire/Hardware/cobaltLaser.py +108 -0
- PYME/Acquire/Hardware/cobaltLaser561.py +94 -0
- PYME/Acquire/Hardware/comports.py +26 -0
- PYME/Acquire/Hardware/driftTrackGUI.py +488 -0
- PYME/Acquire/Hardware/driftTracking.py +595 -0
- PYME/Acquire/Hardware/fakeShutters.py +52 -0
- PYME/Acquire/Hardware/focusKeys.py +204 -0
- PYME/Acquire/Hardware/focus_locks/__init__.py +0 -0
- PYME/Acquire/Hardware/focus_locks/reflection_focus_lock.py +684 -0
- PYME/Acquire/Hardware/frZStage.py +117 -0
- PYME/Acquire/Hardware/fw102.py +38 -0
- PYME/Acquire/Hardware/ids_peak_cam.py +561 -0
- PYME/Acquire/Hardware/ioslave.py +305 -0
- PYME/Acquire/Hardware/lasers.py +292 -0
- PYME/Acquire/Hardware/matchboxLaser.py +58 -0
- PYME/Acquire/Hardware/microscope_adapter.py +104 -0
- PYME/Acquire/Hardware/mpd_picosecond_delayer.py +395 -0
- PYME/Acquire/Hardware/multiview.py +287 -0
- PYME/Acquire/Hardware/olympusix81.py +59 -0
- PYME/Acquire/Hardware/pco/__init__.py +0 -0
- PYME/Acquire/Hardware/pco/pco_cam.py +348 -0
- PYME/Acquire/Hardware/pco/pco_edge_42_lt.py +34 -0
- PYME/Acquire/Hardware/pco/pco_sdk.py +1645 -0
- PYME/Acquire/Hardware/pco/pco_sdk_cam.py +518 -0
- PYME/Acquire/Hardware/pco/pco_sdk_cam_control_panel.py +54 -0
- PYME/Acquire/Hardware/phoxxLaser.py +199 -0
- PYME/Acquire/Hardware/phoxxLaserOLD.py +242 -0
- PYME/Acquire/Hardware/priorLumen.py +102 -0
- PYME/Acquire/Hardware/priorarclampshutter.py +52 -0
- PYME/Acquire/Hardware/setup.py +50 -0
- PYME/Acquire/Hardware/spacenav.py +148 -0
- PYME/Acquire/Hardware/splitter.py +394 -0
- PYME/Acquire/Hardware/thorlabsPiezo.py +98 -0
- PYME/Acquire/Hardware/thorlabs_cam.py +136 -0
- PYME/Acquire/Hardware/thorlabs_mff_flipper.py +400 -0
- PYME/Acquire/Hardware/toptica_ibeam.py +51 -0
- PYME/Acquire/Hardware/uc480/AndorControlFrame.py +308 -0
- PYME/Acquire/Hardware/uc480/__init__.py +27 -0
- PYME/Acquire/Hardware/uc480/uCam480.py +695 -0
- PYME/Acquire/Hardware/uc480/uc480.py +189 -0
- PYME/Acquire/Hardware/uc480/uc480Deprecated.py +87 -0
- PYME/Acquire/Hardware/uc480/uc480_h.py +767 -0
- PYME/Acquire/Hardware/uc480/uc480_h_gen.py +62 -0
- PYME/Acquire/Hardware/uc480/ucCamControlFrame.py +83 -0
- PYME/Acquire/Hardware/ueye.py +702 -0
- PYME/Acquire/PYMEAcquire.py +186 -0
- PYME/Acquire/Protocols/DMDMFM.py +74 -0
- PYME/Acquire/Protocols/__init__.py +22 -0
- PYME/Acquire/Protocols/darkCalibrate.py +56 -0
- PYME/Acquire/Protocols/dual671_470.py +45 -0
- PYME/Acquire/Protocols/dual671_488.py +46 -0
- PYME/Acquire/Protocols/gainCal.py +53 -0
- PYME/Acquire/Protocols/htsms-cal-psf.py +32 -0
- PYME/Acquire/Protocols/htsms-cal-registration.py +52 -0
- PYME/Acquire/Protocols/htsms-flow.py +29 -0
- PYME/Acquire/Protocols/htsms-staggered.py +31 -0
- PYME/Acquire/Protocols/htsms-tile.py +68 -0
- PYME/Acquire/Protocols/htsms-two-color.py +29 -0
- PYME/Acquire/Protocols/htsms-widefield.py +32 -0
- PYME/Acquire/Protocols/paint671.py +61 -0
- PYME/Acquire/Protocols/photoconversion.py +52 -0
- PYME/Acquire/Protocols/photoconversion2.py +55 -0
- PYME/Acquire/Protocols/prebleach488.py +70 -0
- PYME/Acquire/Protocols/prebleach490.py +69 -0
- PYME/Acquire/Protocols/prebleach561.py +72 -0
- PYME/Acquire/Protocols/prebleach561NeomEos2.py +70 -0
- PYME/Acquire/Protocols/prebleach561NeomEos2ND1.py +70 -0
- PYME/Acquire/Protocols/prebleach642.py +70 -0
- PYME/Acquire/Protocols/prebleach671.py +69 -0
- PYME/Acquire/Protocols/prebleach671ND1.py +58 -0
- PYME/Acquire/Protocols/prebleach671ND2.py +57 -0
- PYME/Acquire/Protocols/prebleach671Neo.py +69 -0
- PYME/Acquire/Protocols/recover671.py +62 -0
- PYME/Acquire/Protocols/sequence642_488.py +85 -0
- PYME/Acquire/Protocols/sequence642_561.py +87 -0
- PYME/Acquire/Protocols/shiftfield.py +198 -0
- PYME/Acquire/Protocols/simul488.py +59 -0
- PYME/Acquire/Protocols/simul642.py +63 -0
- PYME/Acquire/Protocols/simul642HTSMS.py +63 -0
- PYME/Acquire/Protocols/simulPA.py +37 -0
- PYME/Acquire/Protocols/simulSIM.py +76 -0
- PYME/Acquire/Protocols/simulStep.py +62 -0
- PYME/Acquire/Protocols/spdscan.py +178 -0
- PYME/Acquire/Protocols/standard470.py +45 -0
- PYME/Acquire/Protocols/standard488.py +47 -0
- PYME/Acquire/Protocols/standard671.py +48 -0
- PYME/Acquire/Protocols/standard671_no532.py +47 -0
- PYME/Acquire/Protocols/standardArclamp.py +46 -0
- PYME/Acquire/Protocols/strip_tile.py +204 -0
- PYME/Acquire/Protocols/tile.py +204 -0
- PYME/Acquire/Protocols/tile3D.py +192 -0
- PYME/Acquire/Protocols/tile671.py +190 -0
- PYME/Acquire/Protocols/tile_triggered.py +189 -0
- PYME/Acquire/Scripts/init.py +232 -0
- PYME/Acquire/Scripts/init_N1_Ti_Exeter_ZIx.py +374 -0
- PYME/Acquire/Scripts/init_N2_Ti_Zyla_lasers.py +290 -0
- PYME/Acquire/Scripts/init_Neo.py +266 -0
- PYME/Acquire/Scripts/init_NeoSim.py +159 -0
- PYME/Acquire/Scripts/init_TIRF.py +232 -0
- PYME/Acquire/Scripts/init_TIRF_Neo.py +242 -0
- PYME/Acquire/Scripts/init_TIRF_NeoO.py +241 -0
- PYME/Acquire/Scripts/init_TIRF_onecam.py +233 -0
- PYME/Acquire/Scripts/init_Ti.py +257 -0
- PYME/Acquire/Scripts/init_UOA_n.py +256 -0
- PYME/Acquire/Scripts/init_UOA_n2.py +246 -0
- PYME/Acquire/Scripts/init_Y1.py +249 -0
- PYME/Acquire/Scripts/init_Zyla.py +260 -0
- PYME/Acquire/Scripts/init_drift_tracking.py +80 -0
- PYME/Acquire/Scripts/init_emccd_basic.py +277 -0
- PYME/Acquire/Scripts/init_htsms.py +277 -0
- PYME/Acquire/Scripts/init_htsms_focus_lock.py +132 -0
- PYME/Acquire/Scripts/init_micrpi.py +45 -0
- PYME/Acquire/Scripts/init_orca.py +70 -0
- PYME/Acquire/Scripts/init_pco.py +49 -0
- PYME/Acquire/Scripts/init_rev.py +74 -0
- PYME/Acquire/Scripts/init_sim100.py +169 -0
- PYME/Acquire/Scripts/init_sim103.py +169 -0
- PYME/Acquire/Scripts/init_sim2.py +211 -0
- PYME/Acquire/Scripts/init_sim50.py +169 -0
- PYME/Acquire/Scripts/init_sim75.py +169 -0
- PYME/Acquire/Scripts/init_sim_drift_tracking.py +166 -0
- PYME/Acquire/Scripts/init_sim_htsms.py +224 -0
- PYME/Acquire/Scripts/init_sim_htsms_n.py +233 -0
- PYME/Acquire/Scripts/init_sim_main.py +229 -0
- PYME/Acquire/Scripts/init_sim_min.py +197 -0
- PYME/Acquire/Scripts/init_sim_rem.py +176 -0
- PYME/Acquire/Scripts/init_smi1.py +110 -0
- PYME/Acquire/Scripts/init_spectro.py +78 -0
- PYME/Acquire/Scripts/init_spim.py +116 -0
- PYME/Acquire/Scripts/init_thorcam.py +62 -0
- PYME/Acquire/Scripts/init_twophoton.py +112 -0
- PYME/Acquire/Scripts/init_uc480.py +262 -0
- PYME/Acquire/Scripts/init_ueye.py +261 -0
- PYME/Acquire/SpoolController.py +958 -0
- PYME/Acquire/Utils/MultiPointScanner.py +80 -0
- PYME/Acquire/Utils/__init__.py +13 -0
- PYME/Acquire/Utils/failsafe.py +157 -0
- PYME/Acquire/Utils/fastTiler.py +153 -0
- PYME/Acquire/Utils/pointScanner.py +496 -0
- PYME/Acquire/Utils/sarcSpacing.py +86 -0
- PYME/Acquire/Utils/strip_tiler.py +93 -0
- PYME/Acquire/Utils/tiler.py +464 -0
- PYME/Acquire/Utils/vibrationAnalysis.py +65 -0
- PYME/Acquire/__init__.py +44 -0
- PYME/Acquire/acquire_client.py +90 -0
- PYME/Acquire/acquire_server.py +316 -0
- PYME/Acquire/acquirebase.py +139 -0
- PYME/Acquire/acquiremainframe.py +716 -0
- PYME/Acquire/acquirewx.py +61 -0
- PYME/Acquire/acquisition_base.py +148 -0
- PYME/Acquire/actions.py +209 -0
- PYME/Acquire/autofocus.py +54 -0
- PYME/Acquire/eventLog.py +95 -0
- PYME/Acquire/event_loop.py +119 -0
- PYME/Acquire/frameWrangler.py +530 -0
- PYME/Acquire/htsms/__init__.py +8 -0
- PYME/Acquire/htsms/rule_ui.py +970 -0
- PYME/Acquire/htsms/rule_ui_v2.py +573 -0
- PYME/Acquire/htsms/tweeter.py +222 -0
- PYME/Acquire/microscope.py +1050 -0
- PYME/Acquire/positionTracker.py +181 -0
- PYME/Acquire/protocol.py +299 -0
- PYME/Acquire/protocol_acquisition.py +404 -0
- PYME/Acquire/sampleInformation.py +591 -0
- PYME/Acquire/sampleInformationDjangoDirect.py +446 -0
- PYME/Acquire/setup.py +52 -0
- PYME/Acquire/stackSettings.py +295 -0
- PYME/Acquire/stage_leveling.py +285 -0
- PYME/Acquire/ui/AnalysisSettingsUI.py +184 -0
- PYME/Acquire/ui/HDFSpoolFrame.py +584 -0
- PYME/Acquire/ui/__init__.py +0 -0
- PYME/Acquire/ui/actionUI.py +892 -0
- PYME/Acquire/ui/focus_lock_gui.py +149 -0
- PYME/Acquire/ui/intensity_trace.py +143 -0
- PYME/Acquire/ui/intsliders.py +222 -0
- PYME/Acquire/ui/lasersliders.py +329 -0
- PYME/Acquire/ui/mpd_picosecond_delay_panel.py +69 -0
- PYME/Acquire/ui/multiview_select.py +77 -0
- PYME/Acquire/ui/positionUI.py +519 -0
- PYME/Acquire/ui/preflight.py +58 -0
- PYME/Acquire/ui/scanner_panel.py +41 -0
- PYME/Acquire/ui/selectCameraPanel.py +46 -0
- PYME/Acquire/ui/seqdialog.py +501 -0
- PYME/Acquire/ui/splashScreen.py +175 -0
- PYME/Acquire/ui/spool_panel.py +830 -0
- PYME/Acquire/ui/tile_panel.py +556 -0
- PYME/Acquire/ui/tilesettingsui.py +91 -0
- PYME/Acquire/ui/voxelSizeDialog.py +149 -0
- PYME/Acquire/webui/__init__.py +36 -0
- PYME/Acquire/webui/ipy.py +361 -0
- PYME/Acquire/webui/static/css/pyme-bootstrap.css +9908 -0
- PYME/Acquire/webui/static/css/pymeacquire.css +85 -0
- PYME/Acquire/webui/static/js/pymeacquire.js +375 -0
- PYME/Acquire/webui/static/js/pzf.js +95 -0
- PYME/Acquire/webui/templates/PYMEAcquire.html +232 -0
- PYME/Acquire/webui/templates/login.html +84 -0
- PYME/Acquire/webui/templates/xtermpage.html +106 -0
- PYME/Acquire/xyztc.py +418 -0
- PYME/Acquire/zScanner.py +287 -0
- PYME/Analysis/BleachProfile/__init__.py +26 -0
- PYME/Analysis/BleachProfile/deMod.py +91 -0
- PYME/Analysis/BleachProfile/fitRecover.py +90 -0
- PYME/Analysis/BleachProfile/intensProf.py +519 -0
- PYME/Analysis/BleachProfile/kinModels.py +507 -0
- PYME/Analysis/BleachProfile/rawIntensity.py +227 -0
- PYME/Analysis/BleachProfile/rollins.py +555 -0
- PYME/Analysis/Colocalisation/__init__.py +27 -0
- PYME/Analysis/Colocalisation/colocScaleDep.py +126 -0
- PYME/Analysis/Colocalisation/correlationCoeffs.py +198 -0
- PYME/Analysis/Colocalisation/distColoc.py +110 -0
- PYME/Analysis/Colocalisation/edtColoc.py +191 -0
- PYME/Analysis/MetaData.py +278 -0
- PYME/Analysis/PSFEst/__init__.py +27 -0
- PYME/Analysis/PSFEst/dec.py +283 -0
- PYME/Analysis/PSFEst/extractImages.py +316 -0
- PYME/Analysis/PSFEst/fit_psf_zernikes.py +194 -0
- PYME/Analysis/PSFEst/psfQuality.py +225 -0
- PYME/Analysis/PSFGen/__init__.py +40 -0
- PYME/Analysis/PSFGen/fourier.py +138 -0
- PYME/Analysis/PSFGen/fourierHNA.py +1108 -0
- PYME/Analysis/PSFGen/fourierHNA2.py +979 -0
- PYME/Analysis/PSFGen/genCRBcurves.py +185 -0
- PYME/Analysis/PSFGen/nijboer_zernike.py +79 -0
- PYME/Analysis/PSFGen/ps_app.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/PSFGen/ps_app.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/PSFGen/test_ps_app.py +24 -0
- PYME/Analysis/Tracking/__init__.py +3 -0
- PYME/Analysis/Tracking/msd.py +57 -0
- PYME/Analysis/Tracking/trackUtils.py +528 -0
- PYME/Analysis/Tracking/tracking.py +152 -0
- PYME/Analysis/__init__.py +30 -0
- PYME/Analysis/_fithelpers.py +161 -0
- PYME/Analysis/angleFilter.py +287 -0
- PYME/Analysis/annealThresh.py +157 -0
- PYME/Analysis/autoencoder_classifier.py +45 -0
- PYME/Analysis/binAvg.py +144 -0
- PYME/Analysis/composite.py +183 -0
- PYME/Analysis/cramerRao.py +259 -0
- PYME/Analysis/deTile.py +441 -0
- PYME/Analysis/density_filter.py +45 -0
- PYME/Analysis/distributed_pyramid.py +426 -0
- PYME/Analysis/fiducial_matching.py +220 -0
- PYME/Analysis/gen_sCMOS_maps.py +355 -0
- PYME/Analysis/graphing_filters.py +311 -0
- PYME/Analysis/implicitFilter.py +359 -0
- PYME/Analysis/keep_pairs.py +69 -0
- PYME/Analysis/optic_flow.py +108 -0
- PYME/Analysis/piecewise.py +36 -0
- PYME/Analysis/piecewiseMapping.py +304 -0
- PYME/Analysis/piezo_movement_correction.py +153 -0
- PYME/Analysis/points/DeClump/__init__.py +78 -0
- PYME/Analysis/points/DeClump/deClump.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/DeClump/deClump.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/DeClump/deClumpGUI.py +87 -0
- PYME/Analysis/points/DeClump/pyDeClump.py +284 -0
- PYME/Analysis/points/DeClump/testClump.py +40 -0
- PYME/Analysis/points/DistHist/__init__.py +25 -0
- PYME/Analysis/points/DistHist/distHist.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/DistHist/distHist.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/DistHist/distHistThreaded.py +71 -0
- PYME/Analysis/points/DistHist/setup.py +54 -0
- PYME/Analysis/points/EdgeDB/__init__.py +24 -0
- PYME/Analysis/points/EdgeDB/edgeDB.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/EdgeDB/edgeDB.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/EdgeDB/edgeTest.py +66 -0
- PYME/Analysis/points/EdgeDB/edges.py +102 -0
- PYME/Analysis/points/EdgeDB/segment.py +75 -0
- PYME/Analysis/points/EdgeDB/setup.py +54 -0
- PYME/Analysis/points/QuadTree/QTrend.py +232 -0
- PYME/Analysis/points/QuadTree/__init__.py +25 -0
- PYME/Analysis/points/QuadTree/pointQT.py +227 -0
- PYME/Analysis/points/QuadTree/pointQTF.py +254 -0
- PYME/Analysis/points/QuadTree/qtUtils.py +36 -0
- PYME/Analysis/points/QuadTree/rendQT.py +118 -0
- PYME/Analysis/points/SoftRend/__init__.py +24 -0
- PYME/Analysis/points/SoftRend/setup.py +61 -0
- PYME/Analysis/points/SoftRend/testTetrahedra.py +41 -0
- PYME/Analysis/points/SoftRend/triRend.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/SoftRend/triRend.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/__init__.py +3 -0
- PYME/Analysis/points/arcfit/__init__.py +1 -0
- PYME/Analysis/points/arcfit/arcmf.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/arcfit/arcmf.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/arcfit/setup.py +51 -0
- PYME/Analysis/points/astigmatism/__init__.py +0 -0
- PYME/Analysis/points/astigmatism/astigTools.py +338 -0
- PYME/Analysis/points/astigmatism/astiglookup.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/astigmatism/astiglookup.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/astigmatism/setup.py +54 -0
- PYME/Analysis/points/cluster_morphology.py +199 -0
- PYME/Analysis/points/coordinate_tools.py +278 -0
- PYME/Analysis/points/features/__init__.py +0 -0
- PYME/Analysis/points/features/metal.py +46 -0
- PYME/Analysis/points/features/shaders/vect_feat_3d.metal +49 -0
- PYME/Analysis/points/fiducials.py +142 -0
- PYME/Analysis/points/gen3DTriangs.py +796 -0
- PYME/Analysis/points/moments.py +143 -0
- PYME/Analysis/points/multiview.py +458 -0
- PYME/Analysis/points/objectMeasure.py +206 -0
- PYME/Analysis/points/qpaint.py +97 -0
- PYME/Analysis/points/rings.py +372 -0
- PYME/Analysis/points/ripleys.py +427 -0
- PYME/Analysis/points/segmentLL.py +134 -0
- PYME/Analysis/points/setup.py +56 -0
- PYME/Analysis/points/spherical_harmonics.py +909 -0
- PYME/Analysis/points/surfit.py +829 -0
- PYME/Analysis/points/tCluster.py +75 -0
- PYME/Analysis/points/traveling_salesperson/__init__.py +0 -0
- PYME/Analysis/points/traveling_salesperson/queue_opt.py +117 -0
- PYME/Analysis/points/traveling_salesperson/sectioned_two_opt.py +327 -0
- PYME/Analysis/points/traveling_salesperson/setup.py +40 -0
- PYME/Analysis/points/traveling_salesperson/sort.py +78 -0
- PYME/Analysis/points/traveling_salesperson/two_opt.py +189 -0
- PYME/Analysis/points/traveling_salesperson/two_opt_utils.cp39-win_amd64.dll.a +0 -0
- PYME/Analysis/points/traveling_salesperson/two_opt_utils.cp39-win_amd64.pyd +0 -0
- PYME/Analysis/points/traveling_salesperson/two_opt_utils.pyx +41 -0
- PYME/Analysis/points/twoColour.py +572 -0
- PYME/Analysis/points/twoColourPlot.py +107 -0
- PYME/Analysis/processLogger.py +129 -0
- PYME/Analysis/profile_extraction.py +72 -0
- PYME/Analysis/setup.py +60 -0
- PYME/Analysis/splitting.py +372 -0
- PYME/Analysis/svmSegment.py +214 -0
- PYME/Analysis/thresholding.py +192 -0
- PYME/Analysis/tile_pyramid.py +938 -0
- PYME/Analysis/widefieldify.py +54 -0
- PYME/DSView/DisplayOptionsPanel.py +503 -0
- PYME/DSView/LUT/__init__.py +33 -0
- PYME/DSView/LUT/lut.cp39-win_amd64.dll.a +0 -0
- PYME/DSView/LUT/lut.cp39-win_amd64.pyd +0 -0
- PYME/DSView/LUT/setup.py +54 -0
- PYME/DSView/OpenSequenceDialog.py +83 -0
- PYME/DSView/OverlaysPanel.py +111 -0
- PYME/DSView/__init__.py +32 -0
- PYME/DSView/arrayViewPanel.py +1035 -0
- PYME/DSView/displayOptions.py +453 -0
- PYME/DSView/displaySettingsPanel.py +271 -0
- PYME/DSView/dsviewer.py +542 -0
- PYME/DSView/eventLogViewer.py +805 -0
- PYME/DSView/fitInfo.py +486 -0
- PYME/DSView/htmlServe.py +72 -0
- PYME/DSView/logparser.py +100 -0
- PYME/DSView/modules/LMAnalysis.py +1053 -0
- PYME/DSView/modules/LMDisplay.py +194 -0
- PYME/DSView/modules/__init__.py +162 -0
- PYME/DSView/modules/_base.py +39 -0
- PYME/DSView/modules/annotation.py +725 -0
- PYME/DSView/modules/arrayView.py +71 -0
- PYME/DSView/modules/blobFinding.py +455 -0
- PYME/DSView/modules/blobMeasure.py +1093 -0
- PYME/DSView/modules/camera_maps.py +38 -0
- PYME/DSView/modules/coloc.py +414 -0
- PYME/DSView/modules/composite.py +715 -0
- PYME/DSView/modules/convnet.py +24 -0
- PYME/DSView/modules/cropping.py +133 -0
- PYME/DSView/modules/dark_and_flatfield.py +31 -0
- PYME/DSView/modules/deconvolution.py +499 -0
- PYME/DSView/modules/eventView.py +80 -0
- PYME/DSView/modules/extractBlobs.py +46 -0
- PYME/DSView/modules/fastGraphPanel.py +85 -0
- PYME/DSView/modules/filtering.py +335 -0
- PYME/DSView/modules/flowView.py +268 -0
- PYME/DSView/modules/fourierRingCorrelation.py +172 -0
- PYME/DSView/modules/gl_image_view.py +12 -0
- PYME/DSView/modules/graphViewPanel.py +272 -0
- PYME/DSView/modules/measure/__init__.py +1 -0
- PYME/DSView/modules/measure/filterPan.py +239 -0
- PYME/DSView/modules/metadataView.py +28 -0
- PYME/DSView/modules/multithreshold.py +98 -0
- PYME/DSView/modules/neuroglancer.py +129 -0
- PYME/DSView/modules/object_tagging.py +157 -0
- PYME/DSView/modules/particleTracking.py +463 -0
- PYME/DSView/modules/playback.py +256 -0
- PYME/DSView/modules/prebleachExtraction.py +75 -0
- PYME/DSView/modules/profileFitting.py +137 -0
- PYME/DSView/modules/profilePlotting.py +408 -0
- PYME/DSView/modules/projections.py +48 -0
- PYME/DSView/modules/psfExtraction.py +570 -0
- PYME/DSView/modules/psfGeneration.py +138 -0
- PYME/DSView/modules/psfTools.py +661 -0
- PYME/DSView/modules/pupilTools.py +204 -0
- PYME/DSView/modules/pupilView.py +139 -0
- PYME/DSView/modules/recipes.py +266 -0
- PYME/DSView/modules/redimension.py +75 -0
- PYME/DSView/modules/segmentation.py +192 -0
- PYME/DSView/modules/sheetView.py +24 -0
- PYME/DSView/modules/shell.py +39 -0
- PYME/DSView/modules/shiftfield_estimation.py +433 -0
- PYME/DSView/modules/sparkprepare.py +94 -0
- PYME/DSView/modules/splitter.py +148 -0
- PYME/DSView/modules/synchronise.py +64 -0
- PYME/DSView/modules/templates/astigCal.html +42 -0
- PYME/DSView/modules/templates/measureView.html +69 -0
- PYME/DSView/modules/templates/measureView2.html +48 -0
- PYME/DSView/modules/templates/measureView3.html +98 -0
- PYME/DSView/modules/templates/trackView.html +139 -0
- PYME/DSView/modules/templates/tracksOverview.html +21 -0
- PYME/DSView/modules/tiling.py +147 -0
- PYME/DSView/modules/unmixing.py +148 -0
- PYME/DSView/modules/vis3D.py +320 -0
- PYME/DSView/modules/visgui.py +163 -0
- PYME/DSView/modules/webview.py +14 -0
- PYME/DSView/overlays.py +295 -0
- PYME/DSView/scrolledImagePanel.py +188 -0
- PYME/DSView/setup.py +53 -0
- PYME/DSView/splashScreen.py +158 -0
- PYME/DSView/voxSizeDialog.py +84 -0
- PYME/Deconv/__init__.py +35 -0
- PYME/Deconv/beadGen.py +55 -0
- PYME/Deconv/dec.py +659 -0
- PYME/Deconv/decTask.py +65 -0
- PYME/Deconv/decThread.py +113 -0
- PYME/Deconv/dec_test.py +47 -0
- PYME/Deconv/deconvDialogs.py +417 -0
- PYME/Deconv/fftwWisdom.py +62 -0
- PYME/Deconv/richardsonLucy.py +141 -0
- PYME/Deconv/richardsonLucyMV.py +151 -0
- PYME/Deconv/richardsonLucyMVM.py +218 -0
- PYME/Deconv/test_block_dec.py +46 -0
- PYME/Deconv/tq_block_dec.py +331 -0
- PYME/Deconv/wiener.py +163 -0
- PYME/IO/DataSources/AlignDataSource.py +91 -0
- PYME/IO/DataSources/ArrayDataSource.py +260 -0
- PYME/IO/DataSources/BGSDataSource.py +353 -0
- PYME/IO/DataSources/BaseDataSource.py +457 -0
- PYME/IO/DataSources/BioformatsDataSource.py +178 -0
- PYME/IO/DataSources/BufferedDataSource.py +99 -0
- PYME/IO/DataSources/ClusterPZFDataSource.py +124 -0
- PYME/IO/DataSources/ConcatenatedDataSource.py +56 -0
- PYME/IO/DataSources/CropDataSource.py +243 -0
- PYME/IO/DataSources/DcimgDataSource.py +54 -0
- PYME/IO/DataSources/ElectronsPerSecondDataSource.py +61 -0
- PYME/IO/DataSources/FlatFieldDataSource.py +77 -0
- PYME/IO/DataSources/HDFDataSource.py +160 -0
- PYME/IO/DataSources/HTTPDataSource.py +80 -0
- PYME/IO/DataSources/ImageSeriesDataSource.py +123 -0
- PYME/IO/DataSources/MultiviewDataSource.py +99 -0
- PYME/IO/DataSources/OBFDataSource.py +67 -0
- PYME/IO/DataSources/RandomDataSource.py +23 -0
- PYME/IO/DataSources/SupertileDatasource.py +148 -0
- PYME/IO/DataSources/TQDataSource.py +41 -0
- PYME/IO/DataSources/TiffDataSource.py +193 -0
- PYME/IO/DataSources/TileDataSource.py +91 -0
- PYME/IO/DataSources/UnsplitDataSource.py +92 -0
- PYME/IO/DataSources/__init__.py +59 -0
- PYME/IO/FileUtils/IJLut.py +43 -0
- PYME/IO/FileUtils/RawToHdf5.py +105 -0
- PYME/IO/FileUtils/SPAD.py +54 -0
- PYME/IO/FileUtils/TiffSeqToHdf5.py +87 -0
- PYME/IO/FileUtils/__init__.py +24 -0
- PYME/IO/FileUtils/compHdf.py +39 -0
- PYME/IO/FileUtils/fileID.py +246 -0
- PYME/IO/FileUtils/fnlGen.py +40 -0
- PYME/IO/FileUtils/freeSpace.py +59 -0
- PYME/IO/FileUtils/h5-thumbnailer.py +85 -0
- PYME/IO/FileUtils/h5ExFrames.py +98 -0
- PYME/IO/FileUtils/h5ToTiffSeries.py +50 -0
- PYME/IO/FileUtils/h5r-thumbnailer.py +118 -0
- PYME/IO/FileUtils/h5rFormatDef.py +99 -0
- PYME/IO/FileUtils/h5rToTxt.py +77 -0
- PYME/IO/FileUtils/nameUtils.py +300 -0
- PYME/IO/FileUtils/obf_support.py +538 -0
- PYME/IO/FileUtils/ply.py +147 -0
- PYME/IO/FileUtils/readSpeckle.py +78 -0
- PYME/IO/FileUtils/readTiff.py +64 -0
- PYME/IO/FileUtils/saveTiffStack.py +137 -0
- PYME/IO/FileUtils/setup.py +36 -0
- PYME/IO/FileUtils/sf-thumbnailer.py +76 -0
- PYME/IO/FileUtils/stl.py +44 -0
- PYME/IO/FileUtils/thumbnailDatabase.py +104 -0
- PYME/IO/HTTPSpooler_v2.py +141 -0
- PYME/IO/MetaDataHandler.py +1072 -0
- PYME/IO/PZFFormat.py +375 -0
- PYME/IO/Spooler.py +279 -0
- PYME/IO/__init__.py +12 -0
- PYME/IO/acquisition_backends.py +353 -0
- PYME/IO/buffer_helpers.cp39-win_amd64.dll.a +0 -0
- PYME/IO/buffer_helpers.cp39-win_amd64.pyd +0 -0
- PYME/IO/buffer_helpers.pyx +190 -0
- PYME/IO/buffers.py +291 -0
- PYME/IO/clusterDuplication.py +204 -0
- PYME/IO/clusterExport.py +152 -0
- PYME/IO/clusterGlob.py +108 -0
- PYME/IO/clusterIO.py +1076 -0
- PYME/IO/clusterListing.py +232 -0
- PYME/IO/clusterResults.py +206 -0
- PYME/IO/clusterUpload.py +49 -0
- PYME/IO/cluster_directory.py +419 -0
- PYME/IO/cluster_streaming.py +216 -0
- PYME/IO/compatibility.py +12 -0
- PYME/IO/countdir/__init__.py +5 -0
- PYME/IO/countdir/setup.py +58 -0
- PYME/IO/csv_flavours.py +251 -0
- PYME/IO/dataExporter.py +470 -0
- PYME/IO/dataWrap.py +108 -0
- PYME/IO/dcimg.py +167 -0
- PYME/IO/events.py +161 -0
- PYME/IO/h5File.py +148 -0
- PYME/IO/h5rFile.py +323 -0
- PYME/IO/image.py +1447 -0
- PYME/IO/load_psf.py +26 -0
- PYME/IO/pyme_h5ls.py +58 -0
- PYME/IO/ragged.py +138 -0
- PYME/IO/rgb_image.py +94 -0
- PYME/IO/tabular.py +1338 -0
- PYME/IO/testClusterSpooling.py +199 -0
- PYME/IO/unifiedIO.py +301 -0
- PYME/LMVis/Extras/QPobjectSegment.py +220 -0
- PYME/LMVis/Extras/__init__.py +55 -0
- PYME/LMVis/Extras/animation.py +359 -0
- PYME/LMVis/Extras/annotation.py +78 -0
- PYME/LMVis/Extras/clusterAnalysis.py +460 -0
- PYME/LMVis/Extras/dockedPanel.py +69 -0
- PYME/LMVis/Extras/extra_layers.py +373 -0
- PYME/LMVis/Extras/fiducial.py +230 -0
- PYME/LMVis/Extras/flagZMotionArtifacts.py +60 -0
- PYME/LMVis/Extras/fusionUtils.py +9 -0
- PYME/LMVis/Extras/multiColourAnalysis.py +103 -0
- PYME/LMVis/Extras/multiviewMapping.py +489 -0
- PYME/LMVis/Extras/objectMeasurements.py +246 -0
- PYME/LMVis/Extras/particleTracking.py +272 -0
- PYME/LMVis/Extras/perFrameVariable.py +77 -0
- PYME/LMVis/Extras/photophysics.py +72 -0
- PYME/LMVis/Extras/pointSetGeneration.py +232 -0
- PYME/LMVis/Extras/pointwiseColoc.py +54 -0
- PYME/LMVis/Extras/saved_views.py +125 -0
- PYME/LMVis/Extras/scaleBox.py +115 -0
- PYME/LMVis/Extras/sequentialSpecies.py +125 -0
- PYME/LMVis/Extras/setBGImage.py +74 -0
- PYME/LMVis/Extras/shiftmapGenerator.py +138 -0
- PYME/LMVis/Extras/showShortcuts.py +69 -0
- PYME/LMVis/Extras/snapshot.py +135 -0
- PYME/LMVis/Extras/spherical_harmonics.py +98 -0
- PYME/LMVis/Extras/subsets.py +15 -0
- PYME/LMVis/Extras/surface_fitting.py +52 -0
- PYME/LMVis/Extras/temperaturePlot.py +53 -0
- PYME/LMVis/Extras/vibration.py +112 -0
- PYME/LMVis/VisGUI.py +506 -0
- PYME/LMVis/__init__.py +39 -0
- PYME/LMVis/colourFilterGUI.py +77 -0
- PYME/LMVis/colourPanel.py +491 -0
- PYME/LMVis/displayPane.py +462 -0
- PYME/LMVis/dyeRatios.py +116 -0
- PYME/LMVis/genImageDialog.py +298 -0
- PYME/LMVis/gl_offScreenHandler.py +134 -0
- PYME/LMVis/gl_render.py +1302 -0
- PYME/LMVis/gl_render3D.py +1453 -0
- PYME/LMVis/gl_render3D_shaders.py +1213 -0
- PYME/LMVis/glcanvas_core.py +1157 -0
- PYME/LMVis/imageView.py +752 -0
- PYME/LMVis/imageView2.py +372 -0
- PYME/LMVis/importTextDialog.py +342 -0
- PYME/LMVis/layer_panel.py +231 -0
- PYME/LMVis/layers/AxesOverlayLayer.py +126 -0
- PYME/LMVis/layers/LUTOverlayLayer.py +346 -0
- PYME/LMVis/layers/OverlayLayer.py +46 -0
- PYME/LMVis/layers/ScaleBarOverlayLayer.py +97 -0
- PYME/LMVis/layers/ScaleBoxOverlayLayer.py +181 -0
- PYME/LMVis/layers/SelectionOverlayLayer.py +124 -0
- PYME/LMVis/layers/__init__.py +53 -0
- PYME/LMVis/layers/base.py +319 -0
- PYME/LMVis/layers/image_layer.py +363 -0
- PYME/LMVis/layers/labels.py +186 -0
- PYME/LMVis/layers/layer_defaults.py +97 -0
- PYME/LMVis/layers/mesh.py +378 -0
- PYME/LMVis/layers/octree.py +194 -0
- PYME/LMVis/layers/pointcloud.py +372 -0
- PYME/LMVis/layers/quiver.py +271 -0
- PYME/LMVis/layers/text.py +250 -0
- PYME/LMVis/layers/tracks.py +309 -0
- PYME/LMVis/mv_math.py +78 -0
- PYME/LMVis/objectDarkMeasure.py +120 -0
- PYME/LMVis/pipeline.py +1227 -0
- PYME/LMVis/pipelineView.py +115 -0
- PYME/LMVis/pointSettingsPanel.py +135 -0
- PYME/LMVis/progGraph.py +59 -0
- PYME/LMVis/quadTreeSettings.py +90 -0
- PYME/LMVis/rendGauss.py +158 -0
- PYME/LMVis/renderers.py +576 -0
- PYME/LMVis/sessionpaths.py +136 -0
- PYME/LMVis/setup.py +39 -0
- PYME/LMVis/setup_exe.py +71 -0
- PYME/LMVis/shader_programs/DefaultShaderProgram.py +149 -0
- PYME/LMVis/shader_programs/GLProgram.py +119 -0
- PYME/LMVis/shader_programs/GouraudShaderProgram.py +157 -0
- PYME/LMVis/shader_programs/PointSpriteShaderProgram.py +163 -0
- PYME/LMVis/shader_programs/ShaderProgramFactory.py +54 -0
- PYME/LMVis/shader_programs/TesselShaderProgram.py +47 -0
- PYME/LMVis/shader_programs/WireFrameShaderProgram.py +50 -0
- PYME/LMVis/shader_programs/__init__.py +20 -0
- PYME/LMVis/shader_programs/oit_compositor.py +23 -0
- PYME/LMVis/shader_programs/shader_loader.py +84 -0
- PYME/LMVis/shader_programs/shader_program.py +168 -0
- PYME/LMVis/shader_programs/shaders/bigflatpoints_fs.glsl +16 -0
- PYME/LMVis/shader_programs/shaders/bigpoints_gs.glsl +40 -0
- PYME/LMVis/shader_programs/shaders/bigpointsprites_fs.glsl +20 -0
- PYME/LMVis/shader_programs/shaders/bigspheres_fs.glsl +53 -0
- PYME/LMVis/shader_programs/shaders/compose_fs.glsl +41 -0
- PYME/LMVis/shader_programs/shaders/compose_vs.glsl +25 -0
- PYME/LMVis/shader_programs/shaders/default_fs.glsl +27 -0
- PYME/LMVis/shader_programs/shaders/default_vs.glsl +88 -0
- PYME/LMVis/shader_programs/shaders/flatpoints_fs.glsl +27 -0
- PYME/LMVis/shader_programs/shaders/gouraud_flatpoints_fs.glsl +30 -0
- PYME/LMVis/shader_programs/shaders/gouraud_fs.glsl +26 -0
- PYME/LMVis/shader_programs/shaders/gouraud_oit_fs.glsl +68 -0
- PYME/LMVis/shader_programs/shaders/gouraud_vs.glsl +135 -0
- PYME/LMVis/shader_programs/shaders/image_fs.glsl +60 -0
- PYME/LMVis/shader_programs/shaders/image_vs.glsl +79 -0
- PYME/LMVis/shader_programs/shaders/phong_fs.glsl +43 -0
- PYME/LMVis/shader_programs/shaders/phong_vs.glsl +45 -0
- PYME/LMVis/shader_programs/shaders/pointsprites_fs.glsl +33 -0
- PYME/LMVis/shader_programs/shaders/pointsprites_vs.glsl +77 -0
- PYME/LMVis/shader_programs/shaders/spheres_fs.glsl +102 -0
- PYME/LMVis/shader_programs/shaders/tessel_fs.glsl +23 -0
- PYME/LMVis/shader_programs/shaders/tessel_vs.glsl +37 -0
- PYME/LMVis/shader_programs/shaders/text_fs.glsl +42 -0
- PYME/LMVis/shader_programs/shaders/text_vs.glsl +84 -0
- PYME/LMVis/shader_programs/shaders/widelines_fs.glsl +19 -0
- PYME/LMVis/shader_programs/shaders/widelines_gs.glsl +56 -0
- PYME/LMVis/shader_programs/shaders/widelines_vs.glsl +51 -0
- PYME/LMVis/statusLog.py +57 -0
- PYME/LMVis/triBlobs.py +142 -0
- PYME/LMVis/view_clipping_pane.py +429 -0
- PYME/LMVis/views.py +275 -0
- PYME/LMVis/visCore.py +1005 -0
- PYME/LMVis/visHelpers.py +880 -0
- PYME/LMVis/visHelpersMin.py +230 -0
- PYME/LMVis/workspaceTree.py +238 -0
- PYME/__init__.py +22 -0
- PYME/cluster/HTTPDataServer.py +1063 -0
- PYME/cluster/HTTPRulePusher.py +382 -0
- PYME/cluster/HTTPTaskPusher.py +377 -0
- PYME/cluster/PYMERuleNodeServer.py +192 -0
- PYME/cluster/PYMERuleServer.py +109 -0
- PYME/cluster/__init__.py +0 -0
- PYME/cluster/clusterUI/accounts/__init__.py +0 -0
- PYME/cluster/clusterUI/accounts/admin.py +85 -0
- PYME/cluster/clusterUI/accounts/forms.py +8 -0
- PYME/cluster/clusterUI/accounts/migrations/0001_initial.py +31 -0
- PYME/cluster/clusterUI/accounts/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/accounts/models.py +44 -0
- PYME/cluster/clusterUI/accounts/templates/accounts/user_form.html +13 -0
- PYME/cluster/clusterUI/accounts/templates/registration/initial_complete.html +6 -0
- PYME/cluster/clusterUI/accounts/templates/registration/initial_confirm.html +13 -0
- PYME/cluster/clusterUI/accounts/templates/registration/initial_done.html +7 -0
- PYME/cluster/clusterUI/accounts/templates/registration/verification.html +2 -0
- PYME/cluster/clusterUI/accounts/templates/registration/verification_subject.txt +1 -0
- PYME/cluster/clusterUI/accounts/urls.py +19 -0
- PYME/cluster/clusterUI/accounts/views.py +36 -0
- PYME/cluster/clusterUI/clusterUI/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterUI/settings.py +147 -0
- PYME/cluster/clusterUI/clusterUI/urls.py +31 -0
- PYME/cluster/clusterUI/clusterUI/wsgi.py +16 -0
- PYME/cluster/clusterUI/clusterbrowser/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterbrowser/admin.py +3 -0
- PYME/cluster/clusterUI/clusterbrowser/apps.py +7 -0
- PYME/cluster/clusterUI/clusterbrowser/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterbrowser/models.py +5 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/base.html +129 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/dirlisting.html +231 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/form_new_folder.html +18 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/form_upload_file.html +17 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/lightlisting.html +25 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/registration/login.html +38 -0
- PYME/cluster/clusterUI/clusterbrowser/urls.py +10 -0
- PYME/cluster/clusterUI/clusterbrowser/views.py +148 -0
- PYME/cluster/clusterUI/clusterstatus/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterstatus/admin.py +3 -0
- PYME/cluster/clusterUI/clusterstatus/apps.py +7 -0
- PYME/cluster/clusterUI/clusterstatus/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterstatus/models.py +5 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/load_content.html +29 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/queue_info.html +28 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/queue_info_content.html +50 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/status_dash.html +29 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/status_dash_content.html +90 -0
- PYME/cluster/clusterUI/clusterstatus/urls.py +9 -0
- PYME/cluster/clusterUI/clusterstatus/views.py +69 -0
- PYME/cluster/clusterUI/clusterui_tornado.py +117 -0
- PYME/cluster/clusterUI/deploy.py +62 -0
- PYME/cluster/clusterUI/localization/__init__.py +0 -0
- PYME/cluster/clusterUI/localization/admin.py +3 -0
- PYME/cluster/clusterUI/localization/apps.py +7 -0
- PYME/cluster/clusterUI/localization/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/localization/models.py +5 -0
- PYME/cluster/clusterUI/localization/templates/localization/settings_form.html +67 -0
- PYME/cluster/clusterUI/localization/urls.py +10 -0
- PYME/cluster/clusterUI/localization/views.py +170 -0
- PYME/cluster/clusterUI/manage.py +17 -0
- PYME/cluster/clusterUI/recipes/__init__.py +0 -0
- PYME/cluster/clusterUI/recipes/admin.py +3 -0
- PYME/cluster/clusterUI/recipes/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/recipes/models.py +3 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/extra_inputs.html +35 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/form_recipe.html +82 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/input_list.html +7 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editor.html +28 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editor_common.html +46 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editrun.html +93 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_standalone.html +100 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_template.html +109 -0
- PYME/cluster/clusterUI/recipes/urls.py +17 -0
- PYME/cluster/clusterUI/recipes/views.py +109 -0
- PYME/cluster/cluster_of_one.py +200 -0
- PYME/cluster/dataserver_wsgi.py +615 -0
- PYME/cluster/distribution.py +71 -0
- PYME/cluster/rulenodeserver.py +487 -0
- PYME/cluster/rules.py +979 -0
- PYME/cluster/ruleserver.py +1106 -0
- PYME/cluster/status.py +101 -0
- PYME/cluster/taskWorkerHTTP.py +522 -0
- PYME/cluster/webdav.py +1102 -0
- PYME/config.py +659 -0
- PYME/contrib/TextCtrlAutoComplete.py +582 -0
- PYME/contrib/__init__.py +7 -0
- PYME/contrib/aniso/__init__.py +2 -0
- PYME/contrib/aniso/aniso.py +268 -0
- PYME/contrib/auiFloatBook.py +94 -0
- PYME/contrib/congrid.py +127 -0
- PYME/contrib/dispatch/__init__.py +19 -0
- PYME/contrib/dispatch/dispatcher.py +289 -0
- PYME/contrib/gohlke/__init__.py +1 -0
- PYME/contrib/gohlke/_tifffile.cp39-win_amd64.dll.a +0 -0
- PYME/contrib/gohlke/_tifffile.cp39-win_amd64.pyd +0 -0
- PYME/contrib/gohlke/czifile.py +1289 -0
- PYME/contrib/gohlke/fcsfiles.py +514 -0
- PYME/contrib/gohlke/setup.py +54 -0
- PYME/contrib/gohlke/tifffile.py +3095 -0
- PYME/contrib/listctrlMixins.py +896 -0
- PYME/contrib/lzw.py +838 -0
- PYME/contrib/pad/__init__.py +13 -0
- PYME/contrib/pad/info_pad.py +18 -0
- PYME/contrib/pad/pad.py +670 -0
- PYME/contrib/setup.py +38 -0
- PYME/contrib/wxPlotPanel.py +137 -0
- PYME/experimental/SimReconstruction.py +49 -0
- PYME/experimental/__init__.pxd +0 -0
- PYME/experimental/__init__.py +4 -0
- PYME/experimental/_octree.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/_octree.cp39-win_amd64.pyd +0 -0
- PYME/experimental/_octree.pyx +477 -0
- PYME/experimental/_treap.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/_treap.cp39-win_amd64.pyd +0 -0
- PYME/experimental/_treap.pyx +267 -0
- PYME/experimental/_triangle_mesh.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/_triangle_mesh.cp39-win_amd64.pyd +0 -0
- PYME/experimental/_triangle_mesh.pxd +149 -0
- PYME/experimental/_triangle_mesh.pyx +2787 -0
- PYME/experimental/aqavg.py +40 -0
- PYME/experimental/dcimgFileChucker.py +375 -0
- PYME/experimental/dcimgSpoolShim.py +174 -0
- PYME/experimental/dcimg_chuck_test.py +78 -0
- PYME/experimental/dual_marching_cubes.py +801 -0
- PYME/experimental/dual_marching_cubes_v2.py +645 -0
- PYME/experimental/expectationMaximisation.py +298 -0
- PYME/experimental/func_octree.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/func_octree.cp39-win_amd64.pyd +0 -0
- PYME/experimental/func_octree.pyx +381 -0
- PYME/experimental/fusionRadial.py +520 -0
- PYME/experimental/fusionUtils.py +522 -0
- PYME/experimental/isosurface.py +147 -0
- PYME/experimental/labview_spooling_hacks.py +48 -0
- PYME/experimental/marching_cubes.py +811 -0
- PYME/experimental/marching_tetrahedra.py +343 -0
- PYME/experimental/modified_marching_cubes.py +1245 -0
- PYME/experimental/music.py +25 -0
- PYME/experimental/octree.py +188 -0
- PYME/experimental/pSpaceMap.py +34 -0
- PYME/experimental/pointFitConfoc.py +112 -0
- PYME/experimental/scanner_control.py +107 -0
- PYME/experimental/setup.py +109 -0
- PYME/experimental/spark.py +31 -0
- PYME/experimental/tcHist.py +71 -0
- PYME/experimental/treap.py +262 -0
- PYME/experimental/triangle_mesh.py +2287 -0
- PYME/experimental/triangle_mesh_utils.cp39-win_amd64.dll.a +0 -0
- PYME/experimental/triangle_mesh_utils.cp39-win_amd64.pyd +0 -0
- PYME/experimental/triangle_utils.py +87 -0
- PYME/experimental/triangular_mesh.py +2255 -0
- PYME/experimental/zMotionArtifactUtils.py +55 -0
- PYME/localization/FitFactories/AstigGaussFitFR.py +175 -0
- PYME/localization/FitFactories/AstigGaussGPUFitFR.py +326 -0
- PYME/localization/FitFactories/BeadConvolvedAstigGaussFit.py +206 -0
- PYME/localization/FitFactories/ChecksumFR.py +82 -0
- PYME/localization/FitFactories/ChecksumGPUFR.py +213 -0
- PYME/localization/FitFactories/ChecksumMultifitSR.py +86 -0
- PYME/localization/FitFactories/ConfocCOIR.py +93 -0
- PYME/localization/FitFactories/Dumbell3DFitR.py +193 -0
- PYME/localization/FitFactories/DumbellFitR.py +163 -0
- PYME/localization/FitFactories/FFBase.py +403 -0
- PYME/localization/FitFactories/Gauss3DFitR.py +213 -0
- PYME/localization/FitFactories/GaussFitConstrR.py +177 -0
- PYME/localization/FitFactories/GaussMultifitLinesR.py +351 -0
- PYME/localization/FitFactories/GaussMultifitR.py +326 -0
- PYME/localization/FitFactories/GaussMultifitSR.py +373 -0
- PYME/localization/FitFactories/InterpFitR.py +236 -0
- PYME/localization/FitFactories/InterpFitWFR.py +111 -0
- PYME/localization/FitFactories/Interpolators/CSInterpolator.py +148 -0
- PYME/localization/FitFactories/Interpolators/CubeSInterpolatorP.py +121 -0
- PYME/localization/FitFactories/Interpolators/CubicSplineInterpolator.py +69 -0
- PYME/localization/FitFactories/Interpolators/LinearInterpolator.py +135 -0
- PYME/localization/FitFactories/Interpolators/LinearPInterpolatorP.py +95 -0
- PYME/localization/FitFactories/Interpolators/__init__.py +33 -0
- PYME/localization/FitFactories/Interpolators/baseInterpolator.py +202 -0
- PYME/localization/FitFactories/LatFitCOIR.py +82 -0
- PYME/localization/FitFactories/LatGaussFitFR.py +220 -0
- PYME/localization/FitFactories/LatObjFindFR.py +85 -0
- PYME/localization/FitFactories/LatPSFFitR.py +142 -0
- PYME/localization/FitFactories/MultiviewFitInterpNR.py +400 -0
- PYME/localization/FitFactories/PRInterpFitQR.py +192 -0
- PYME/localization/FitFactories/PRInterpFitR.py +223 -0
- PYME/localization/FitFactories/ROIExtractNR.py +93 -0
- PYME/localization/FitFactories/SpecGaussFitFR.py +174 -0
- PYME/localization/FitFactories/SplitterFitCOIR.py +142 -0
- PYME/localization/FitFactories/SplitterFitFNR.py +312 -0
- PYME/localization/FitFactories/SplitterFitFusionR.py +318 -0
- PYME/localization/FitFactories/SplitterFitInterpBNR.py +357 -0
- PYME/localization/FitFactories/SplitterFitInterpNR.py +343 -0
- PYME/localization/FitFactories/SplitterFitScavNR.py +352 -0
- PYME/localization/FitFactories/SplitterMultifitSR.py +410 -0
- PYME/localization/FitFactories/SplitterObjFindR.py +194 -0
- PYME/localization/FitFactories/SplitterROIExtractNR.py +91 -0
- PYME/localization/FitFactories/SplitterShiftEstFR.py +230 -0
- PYME/localization/FitFactories/__init__.py +103 -0
- PYME/localization/FitFactories/fitCommon.py +195 -0
- PYME/localization/FitFactories/zEstimators/__init__.py +29 -0
- PYME/localization/FitFactories/zEstimators/astigEstimator.py +173 -0
- PYME/localization/FitFactories/zEstimators/biplaneEstimator.py +209 -0
- PYME/localization/FitFactories/zEstimators/genericDualEstimator.py +232 -0
- PYME/localization/FitFactories/zEstimators/genericEstimator.py +224 -0
- PYME/localization/FitFactories/zEstimators/priEstimator.py +255 -0
- PYME/localization/MetaDataEdit.py +543 -0
- PYME/localization/Test/30_9_series_A_1.sf +0 -0
- PYME/localization/Test/PRI.md +45 -0
- PYME/localization/Test/PRI_qr.md +52 -0
- PYME/localization/Test/PRI_r.md +52 -0
- PYME/localization/Test/__init__.py +22 -0
- PYME/localization/Test/astig.md +50 -0
- PYME/localization/Test/astigCOI.md +50 -0
- PYME/localization/Test/astig_gauss.md +52 -0
- PYME/localization/Test/astig_pe.md +50 -0
- PYME/localization/Test/astig_splitter.md +66 -0
- PYME/localization/Test/astig_splitterCOI.md +67 -0
- PYME/localization/Test/astig_splitterQ.md +66 -0
- PYME/localization/Test/astig_theory.md +50 -0
- PYME/localization/Test/astig_theory.psf +0 -0
- PYME/localization/Test/astig_theory.tif +0 -0
- PYME/localization/Test/beads1.psf +0 -0
- PYME/localization/Test/beads1.tif +0 -0
- PYME/localization/Test/biplane_splitter.md +75 -0
- PYME/localization/Test/biplane_splitter2.md +103 -0
- PYME/localization/Test/biplane_splitter3.md +115 -0
- PYME/localization/Test/defoc.md +48 -0
- PYME/localization/Test/dumbell_3d.md +52 -0
- PYME/localization/Test/fitTestJig.py +172 -0
- PYME/localization/Test/fitTestJigSCMOS.py +487 -0
- PYME/localization/Test/fitTestJigWC.py +225 -0
- PYME/localization/Test/gauss.md +50 -0
- PYME/localization/Test/gaussCOI.md +50 -0
- PYME/localization/Test/pri_pe.md +50 -0
- PYME/localization/Test/pri_theory.md +51 -0
- PYME/localization/Test/pri_theory.psf +0 -0
- PYME/localization/Test/pri_theory.tif +0 -0
- PYME/localization/Test/psf_astig.psf +0 -0
- PYME/localization/Test/psf_astig.tif +0 -0
- PYME/localization/Test/psf_astig_bg_d.psf +0 -0
- PYME/localization/Test/psf_astig_bg_d.tif +0 -0
- PYME/localization/Test/psf_astig_pe.psf +0 -0
- PYME/localization/Test/psf_astig_pe.tif +0 -0
- PYME/localization/Test/psf_decon.psf +0 -0
- PYME/localization/Test/psf_decon.tif +0 -0
- PYME/localization/Test/psf_decon_pe.psf +0 -0
- PYME/localization/Test/psf_decon_pe.tif +0 -0
- PYME/localization/Test/psf_guess.psf +0 -0
- PYME/localization/Test/splitter.md +63 -0
- PYME/localization/Test/splitter_scav.md +63 -0
- PYME/localization/Test/test.psf +0 -0
- PYME/localization/Test/test.tif +0 -0
- PYME/localization/Test/test_decon.psf +0 -0
- PYME/localization/Test/test_decon.tif +0 -0
- PYME/localization/Test/test_pe.psf +0 -0
- PYME/localization/Test/test_pe.tif +0 -0
- PYME/localization/Test/wf_theory.psf +0 -0
- PYME/localization/Test/wf_theory2.psf +0 -0
- PYME/localization/__init__.py +17 -0
- PYME/localization/autopsf/__init__.py +1 -0
- PYME/localization/autopsf/autopsf.py +486 -0
- PYME/localization/autopsf/roifit.py +310 -0
- PYME/localization/cInterp/__init__.py +24 -0
- PYME/localization/cInterp/cInterp.cp39-win_amd64.dll.a +0 -0
- PYME/localization/cInterp/cInterp.cp39-win_amd64.pyd +0 -0
- PYME/localization/cInterp/setup.py +54 -0
- PYME/localization/cModels/__init__.py +24 -0
- PYME/localization/cModels/gauss_app.cp39-win_amd64.dll.a +0 -0
- PYME/localization/cModels/gauss_app.cp39-win_amd64.pyd +0 -0
- PYME/localization/ofind.py +444 -0
- PYME/localization/ofind3d.py +306 -0
- PYME/localization/ofind_nofilt.py +128 -0
- PYME/localization/ofind_pri.py +478 -0
- PYME/localization/ofind_split.py +399 -0
- PYME/localization/ofind_xcorr.py +351 -0
- PYME/localization/ofind_xcorr_fw.py +441 -0
- PYME/localization/remFitBuf.py +657 -0
- PYME/localization/setup.py +56 -0
- PYME/localization/splitting.py +240 -0
- PYME/localization/twist.py +60 -0
- PYME/misc/TiSettings.py +36 -0
- PYME/misc/TiffImagePlugin.py +838 -0
- PYME/misc/VolProj.py +144 -0
- PYME/misc/__init__.py +25 -0
- PYME/misc/aligned_array.py +10 -0
- PYME/misc/aniso.py +29 -0
- PYME/misc/big_sur_fix.py +20 -0
- PYME/misc/check_for_updates.py +139 -0
- PYME/misc/colormaps.py +199 -0
- PYME/misc/colorsys.py +201 -0
- PYME/misc/computerName.py +33 -0
- PYME/misc/coverslipGeometries.py +60 -0
- PYME/misc/cython_numpy_monkey.py +40 -0
- PYME/misc/depGraph.py +406 -0
- PYME/misc/dirSize.py +31 -0
- PYME/misc/diskCleanup.py +64 -0
- PYME/misc/djangoRecarray.py +57 -0
- PYME/misc/django_widgets.py +27 -0
- PYME/misc/editgrid.py +101 -0
- PYME/misc/eventSpy.py +122 -0
- PYME/misc/exceptions.py +30 -0
- PYME/misc/facsPlot.py +89 -0
- PYME/misc/fbpIcons.py +90 -0
- PYME/misc/fftw_compat.py +28 -0
- PYME/misc/findCycles.py +91 -0
- PYME/misc/fortran_interrupt_defeat.py +43 -0
- PYME/misc/glassModel.py +64 -0
- PYME/misc/hash32.py +41 -0
- PYME/misc/hillcurve.py +88 -0
- PYME/misc/hybrid_ns.py +84 -0
- PYME/misc/kdFit.py +72 -0
- PYME/misc/locate.py +10 -0
- PYME/misc/memUsage.py +65 -0
- PYME/misc/memmap.py +52 -0
- PYME/misc/mock_ctypes.py +28 -0
- PYME/misc/mock_traits.py +59 -0
- PYME/misc/mock_traitsui.py +29 -0
- PYME/misc/pyme_zeroconf.py +287 -0
- PYME/misc/pyro_tracebacks.py +32 -0
- PYME/misc/read_agf.py +605 -0
- PYME/misc/sffake.py +16 -0
- PYME/misc/snells.py +71 -0
- PYME/misc/sqlite_ns.py +132 -0
- PYME/misc/sqlitendarray.py +56 -0
- PYME/misc/taskDef.py +44 -0
- PYME/misc/tempDB.py +56 -0
- PYME/misc/wxThread.py +33 -0
- PYME/misc/zemax.py +259 -0
- PYME/misc/zernike.py +151 -0
- PYME/pyme_warnings.py +70 -0
- PYME/recipes/Recipes/STEDDeconvolution.yaml +14 -0
- PYME/recipes/Recipes/STEDMinistacks.yaml +15 -0
- PYME/recipes/Recipes/STED_COP3.yaml +25 -0
- PYME/recipes/Recipes/blobMeas.yaml +19 -0
- PYME/recipes/Recipes/blobMeas2.yaml +37 -0
- PYME/recipes/Recipes/blobMeasSR.yaml +66 -0
- PYME/recipes/Recipes/coloc.yaml +43 -0
- PYME/recipes/Recipes/coloc_roi_masked.yaml +46 -0
- PYME/recipes/Recipes/multiblob.yaml +38 -0
- PYME/recipes/Recipes/pre_particleTracking.yaml +30 -0
- PYME/recipes/Recipes/segmentAndMeasureLoci.yaml +41 -0
- PYME/recipes/__init__.py +6 -0
- PYME/recipes/acquisition.py +158 -0
- PYME/recipes/bakeshop.py +32 -0
- PYME/recipes/base.py +1393 -0
- PYME/recipes/batchProcess.py +147 -0
- PYME/recipes/filters.py +394 -0
- PYME/recipes/fudges.py +41 -0
- PYME/recipes/graphing.py +108 -0
- PYME/recipes/html_recipe_editor.py +90 -0
- PYME/recipes/localisations.py +1386 -0
- PYME/recipes/machine_learning.py +286 -0
- PYME/recipes/measurement.py +1062 -0
- PYME/recipes/modules.py +50 -0
- PYME/recipes/multiview.py +435 -0
- PYME/recipes/output.py +667 -0
- PYME/recipes/pointcloud.py +510 -0
- PYME/recipes/processing.py +2954 -0
- PYME/recipes/pyramid.py +206 -0
- PYME/recipes/recipe.py +965 -0
- PYME/recipes/recipeGui.py +1029 -0
- PYME/recipes/recipeLayout.py +499 -0
- PYME/recipes/runRecipe.py +140 -0
- PYME/recipes/setup.py +37 -0
- PYME/recipes/simulation.py +91 -0
- PYME/recipes/skfilters.py +143 -0
- PYME/recipes/surface_fitting.py +776 -0
- PYME/recipes/tablefilters.py +275 -0
- PYME/recipes/tracking.py +343 -0
- PYME/recipes/traits.py +157 -0
- PYME/recipes/vertical_recipe_display.py +373 -0
- PYME/resources/__init__.py +23 -0
- PYME/resources/config_template/distributor.yaml +14 -0
- PYME/resources/config_template/nodeserver.yaml +15 -0
- PYME/resources/icons/LUT.png +0 -0
- PYME/resources/icons/YSM_Shield.png +0 -0
- PYME/resources/icons/YSM_logo.png +0 -0
- PYME/resources/icons/arrow.png +0 -0
- PYME/resources/icons/crosshairs.png +0 -0
- PYME/resources/icons/line_select.png +0 -0
- PYME/resources/icons/logo_fmhs.png +0 -0
- PYME/resources/icons/media-playback-pause.png +0 -0
- PYME/resources/icons/media-playback-start.png +0 -0
- PYME/resources/icons/media-skip-backward.png +0 -0
- PYME/resources/icons/media-skip-forward.png +0 -0
- PYME/resources/icons/mesh.png +0 -0
- PYME/resources/icons/mesh.svg +28 -0
- PYME/resources/icons/pmacquire.icns +0 -0
- PYME/resources/icons/pmacquire.ico +0 -0
- PYME/resources/icons/pmanal.icns +0 -0
- PYME/resources/icons/pmanal.ico +0 -0
- PYME/resources/icons/pmvis.icns +0 -0
- PYME/resources/icons/pmvis.ico +0 -0
- PYME/resources/icons/points.png +0 -0
- PYME/resources/icons/points.svg +16 -0
- PYME/resources/icons/pymeLogo.png +0 -0
- PYME/resources/icons/rect_select.png +0 -0
- PYME/resources/icons/squiggle_select.png +0 -0
- PYME/resources/icons/text3800.icns +0 -0
- PYME/resources/icons/text3800.ico +0 -0
- PYME/resources/icons/text3800.png +0 -0
- PYME/resources/icons/text3800.tif +0 -0
- PYME/resources/icons/text5377.icns +0 -0
- PYME/resources/icons/text5377.ico +0 -0
- PYME/resources/icons/text5377.png +0 -0
- PYME/resources/icons/tracks.png +0 -0
- PYME/resources/icons/tracks.svg +19 -0
- PYME/resources/icons/view-front.png +0 -0
- PYME/resources/icons/view-home.png +0 -0
- PYME/resources/icons/view-right.png +0 -0
- PYME/resources/icons/view-top.png +0 -0
- PYME/resources/test_datasets/README.md +8 -0
- PYME/resources/test_datasets/t_im.tif +0 -0
- PYME/resources/test_datasets/test_csv.csv +4282 -0
- PYME/resources/test_datasets/test_hdf.hdf +0 -0
- PYME/resources/web/rule_inline.html +21 -0
- PYME/resources/web/ruleserver.html +75 -0
- PYME/resources/web/static/bootstrap.min.js +7 -0
- PYME/resources/web/static/cluster.css +137 -0
- PYME/resources/web/static/css/bootstrap-theme.css +587 -0
- PYME/resources/web/static/css/bootstrap-theme.min.css +6 -0
- PYME/resources/web/static/css/bootstrap.css +6757 -0
- PYME/resources/web/static/css/bootstrap.min.css +6 -0
- PYME/resources/web/static/css/flat_design_colors_full.css +306 -0
- PYME/resources/web/static/css/recipe_editor.css +106 -0
- PYME/resources/web/static/dashboard.css +106 -0
- PYME/resources/web/static/fileselector.js +77 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.eot +0 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.svg +288 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.ttf +0 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.woff +0 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.woff2 +0 -0
- PYME/resources/web/static/images/osd_flat/LICENSE.txt +116 -0
- PYME/resources/web/static/images/osd_flat/README.md +9 -0
- PYME/resources/web/static/images/osd_flat/fullpage_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/fullpage_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/fullpage_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/fullpage_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_rest.png +0 -0
- PYME/resources/web/static/jigna-vue-bare.js +1395 -0
- PYME/resources/web/static/jquery.min.js +2 -0
- PYME/resources/web/static/jstree.min.js +6 -0
- PYME/resources/web/static/openSeadragonGL.js +102 -0
- PYME/resources/web/static/openseadragon-svg-overlay.js +103 -0
- PYME/resources/web/static/openseadragon-viewerinputhook.min.js +6 -0
- PYME/resources/web/static/openseadragon.min.js +9 -0
- PYME/resources/web/static/recipe_editor.js +119 -0
- PYME/resources/web/static/shaders/fragment/lut.glsl +20 -0
- PYME/resources/web/static/shaders/fragment/none.glsl +17 -0
- PYME/resources/web/static/shaders/fragment/outline.glsl +43 -0
- PYME/resources/web/static/shaders/fragment/rect.glsl +7 -0
- PYME/resources/web/static/shaders/fragment/sobel3.glsl +71 -0
- PYME/resources/web/static/shaders/fragment/white.glsl +4 -0
- PYME/resources/web/static/shaders/vertex/rect.glsl +22 -0
- PYME/resources/web/static/shaders/vertex/square.glsl +9 -0
- PYME/resources/web/static/utils.js +3 -0
- PYME/resources/web/static/viaWebGL.js +217 -0
- PYME/setup.py +109 -0
- PYME/setup_exe.py +57 -0
- PYME/simulation/__init__.py +0 -0
- PYME/simulation/locify.py +319 -0
- PYME/simulation/pointsets.py +279 -0
- PYME/simulation/wormlike.py +99 -0
- PYME/simulation/wormlike2.py +198 -0
- PYME/simulation/wormlike3.py +197 -0
- PYME/simulation/wormlike_curled.py +104 -0
- PYME/tileviewer/__init__.py +0 -0
- PYME/tileviewer/templates/roi_list.html +12 -0
- PYME/tileviewer/templates/tileviewer.html +247 -0
- PYME/tileviewer/tileviewer.py +207 -0
- PYME/ui/AUIFrame.py +279 -0
- PYME/ui/MetadataTree.py +469 -0
- PYME/ui/__init__.py +4 -0
- PYME/ui/about_dlg.py +29 -0
- PYME/ui/autoFoldPanel.py +643 -0
- PYME/ui/cascading_layout.py +45 -0
- PYME/ui/crop_dialog.py +145 -0
- PYME/ui/custom_traits_editors.py +508 -0
- PYME/ui/editFilterDialog.py +80 -0
- PYME/ui/editList.py +40 -0
- PYME/ui/fastGraph.py +240 -0
- PYME/ui/filterPane.py +348 -0
- PYME/ui/histLimits.py +543 -0
- PYME/ui/layerFoldPanel.py +232 -0
- PYME/ui/manualFoldPanel.py +870 -0
- PYME/ui/mytimer.py +116 -0
- PYME/ui/patch_traitsui.py +151 -0
- PYME/ui/progress.py +160 -0
- PYME/ui/recArrayView.py +145 -0
- PYME/ui/selection.py +71 -0
- PYME/ui/shell.py +37 -0
- PYME/ui/traitsui_constants.py +91 -0
- PYME/ui/wx_compat.py +43 -0
- PYME/update_version.py +159 -0
- PYME/util/__init__.py +3 -0
- PYME/util/authenticate.py +164 -0
- PYME/util/execfile.py +21 -0
- PYME/util/fProfile/__init__.py +1 -0
- PYME/util/fProfile/convertProfile.py +117 -0
- PYME/util/fProfile/fProfile.py +162 -0
- PYME/util/fProfile/html/404.html +60 -0
- PYME/util/fProfile/html/css/main.css +258 -0
- PYME/util/fProfile/html/css/normalize.css +427 -0
- PYME/util/fProfile/html/css/normalize.min.css +1 -0
- PYME/util/fProfile/html/index.html +64 -0
- PYME/util/fProfile/html/js/main.js +492 -0
- PYME/util/fProfile/html/js/plugins.js +24 -0
- PYME/util/fProfile/html/js/vendor/crossfilter.min.js +1 -0
- PYME/util/fProfile/html/js/vendor/jquery-1.11.2.min.js +4 -0
- PYME/util/fProfile/html/js/vendor/modernizr-2.8.3.min.js +4 -0
- PYME/util/fProfile/html/js/vendor/tinycolor-min.js +4 -0
- PYME/util/fProfile/viewProfile.py +30 -0
- PYME/util/install_dependencies.py +95 -0
- PYME/util/log_verbosity.py +11 -0
- PYME/util/mProfile/__init__.py +1 -0
- PYME/util/mProfile/colorize_db_t.py +297 -0
- PYME/util/mProfile/mProfile.py +164 -0
- PYME/util/mProfile/p.py +101 -0
- PYME/util/mProfile/tProfile.py +165 -0
- PYME/util/pymelauncher.py +47 -0
- PYME/util/shmarray/__init__.py +0 -0
- PYME/util/shmarray/shmTest.py +74 -0
- PYME/util/shmarray/shmarray.py +165 -0
- PYME/util/webframework.py +365 -0
- PYME/version.py +65 -0
- python_microscopy-25.6.5.dist-info/METADATA +68 -0
- python_microscopy-25.6.5.dist-info/RECORD +1277 -0
- python_microscopy-25.6.5.dist-info/WHEEL +4 -0
PYME/contrib/lzw.py
ADDED
|
@@ -0,0 +1,838 @@
|
|
|
1
|
+
|
|
2
|
+
"""
|
|
3
|
+
A stream friendly, simple compression library, built around
|
|
4
|
+
iterators. See L{compress} and L{decompress} for the easiest way to
|
|
5
|
+
get started.
|
|
6
|
+
|
|
7
|
+
After the TIFF implementation of LZW, as described at
|
|
8
|
+
U{http://www.fileformat.info/format/tiff/corion-lzw.htm}
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
In an even-nuttier-shell, lzw compresses input bytes with integer
|
|
12
|
+
codes. Starting with codes 0-255 that code to themselves, and two
|
|
13
|
+
control codes, we work our way through a stream of bytes. When we
|
|
14
|
+
encounter a pair of codes c1,c2 we add another entry to our code table
|
|
15
|
+
with the lowest available code and the value value(c1) + value(c2)[0]
|
|
16
|
+
|
|
17
|
+
Of course, there are details :)
|
|
18
|
+
|
|
19
|
+
The Details
|
|
20
|
+
===========
|
|
21
|
+
|
|
22
|
+
Our control codes are
|
|
23
|
+
|
|
24
|
+
- CLEAR_CODE (codepoint 256). When this code is encountered, we flush
|
|
25
|
+
the codebook and start over.
|
|
26
|
+
- END_OF_INFO_CODE (codepoint 257). This code is reserved for
|
|
27
|
+
encoder/decoders over the integer codepoint stream (like the
|
|
28
|
+
mechanical bit that unpacks bits into codepoints)
|
|
29
|
+
|
|
30
|
+
When dealing with bytes, codes are emitted as variable
|
|
31
|
+
length bit strings packed into the stream of bytes.
|
|
32
|
+
|
|
33
|
+
codepoints are written with varying length
|
|
34
|
+
- initially 9 bits
|
|
35
|
+
- at 512 entries 10 bits
|
|
36
|
+
- at 1025 entries at 11 bits
|
|
37
|
+
- at 2048 entries 12 bits
|
|
38
|
+
- with max of 4095 entries in a table (including Clear and EOI)
|
|
39
|
+
|
|
40
|
+
code points are stored with their MSB in the most significant bit
|
|
41
|
+
available in the output character.
|
|
42
|
+
|
|
43
|
+
>>> import lzw
|
|
44
|
+
>>>
|
|
45
|
+
>>> mybytes = lzw.readbytes("README.txt")
|
|
46
|
+
>>> lessbytes = lzw.compress(mybytes)
|
|
47
|
+
>>> newbytes = b"".join(lzw.decompress(lessbytes))
|
|
48
|
+
>>> oldbytes = b"".join(lzw.readbytes("README.txt"))
|
|
49
|
+
>>> oldbytes == newbytes
|
|
50
|
+
True
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
__author__ = "Joe Bowers"
|
|
56
|
+
__license__ = "MIT License"
|
|
57
|
+
__version__ = "0.01.11"
|
|
58
|
+
__status__ = "Development"
|
|
59
|
+
__email__ = "joerbowers@gmail.com"
|
|
60
|
+
__url__ = "http://www.joe-bowers.com/static/lzw"
|
|
61
|
+
|
|
62
|
+
import struct
|
|
63
|
+
import itertools
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
CLEAR_CODE = None#256
|
|
67
|
+
END_OF_INFO_CODE = None#257
|
|
68
|
+
|
|
69
|
+
DEFAULT_MIN_BITS = 9
|
|
70
|
+
DEFAULT_MAX_BITS = 12
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def compress(plaintext_bytes):
|
|
76
|
+
"""
|
|
77
|
+
Given an iterable of bytes, returns a (hopefully shorter) iterable
|
|
78
|
+
of bytes that you can store in a file or pass over the network or
|
|
79
|
+
what-have-you, and later use to get back your original bytes with
|
|
80
|
+
L{decompress}. This is the best place to start using this module.
|
|
81
|
+
"""
|
|
82
|
+
encoder = ByteEncoder()
|
|
83
|
+
return encoder.encodetobytes(plaintext_bytes)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def decompress(compressed_bytes):
|
|
87
|
+
"""
|
|
88
|
+
Given an iterable of bytes that were the result of a call to
|
|
89
|
+
L{compress}, returns an iterator over the uncompressed bytes.
|
|
90
|
+
"""
|
|
91
|
+
decoder = ByteDecoder()
|
|
92
|
+
return decoder.decodefrombytes(compressed_bytes)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
class ByteEncoder(object):
|
|
99
|
+
"""
|
|
100
|
+
Takes a stream of uncompressed bytes and produces a stream of
|
|
101
|
+
compressed bytes, usable by L{ByteDecoder}. Combines an L{Encoder}
|
|
102
|
+
with a L{BitPacker}.
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
>>> import lzw
|
|
106
|
+
>>>
|
|
107
|
+
>>> enc = lzw.ByteEncoder(12)
|
|
108
|
+
>>> bigstr = b"gabba gabba yo gabba gabba gabba yo gabba gabba gabba yo gabba gabba gabba yo"
|
|
109
|
+
>>> encoding = enc.encodetobytes(bigstr)
|
|
110
|
+
>>> encoded = b"".join( b for b in encoding )
|
|
111
|
+
>>> encoded
|
|
112
|
+
'3\\x98LF#\\x08\\x82\\x05\\x04\\x83\\x1eM\\xf0x\\x1c\\x16\\x1b\\t\\x88C\\xe1q(4"\\x1f\\x17\\x85C#1X\\xec.\\x00'
|
|
113
|
+
>>>
|
|
114
|
+
>>> dec = lzw.ByteDecoder()
|
|
115
|
+
>>> decoding = dec.decodefrombytes(encoded)
|
|
116
|
+
>>> decoded = b"".join(decoding)
|
|
117
|
+
>>> decoded == bigstr
|
|
118
|
+
True
|
|
119
|
+
|
|
120
|
+
"""
|
|
121
|
+
|
|
122
|
+
def __init__(self, max_width=DEFAULT_MAX_BITS):
|
|
123
|
+
"""
|
|
124
|
+
max_width is the maximum width in bits we want to see in the
|
|
125
|
+
output stream of codepoints.
|
|
126
|
+
"""
|
|
127
|
+
self._encoder = Encoder(max_code_size=2**max_width)
|
|
128
|
+
self._packer = BitPacker(initial_code_size=self._encoder.code_size())
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def encodetobytes(self, bytesource):
|
|
132
|
+
"""
|
|
133
|
+
Returns an iterator of bytes, adjusting our packed width
|
|
134
|
+
between minwidth and maxwidth when it detects an overflow is
|
|
135
|
+
about to occur. Dual of L{ByteDecoder.decodefrombytes}.
|
|
136
|
+
"""
|
|
137
|
+
codepoints = self._encoder.encode(bytesource)
|
|
138
|
+
codebytes = self._packer.pack(codepoints)
|
|
139
|
+
|
|
140
|
+
return codebytes
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
class ByteDecoder(object):
|
|
144
|
+
"""
|
|
145
|
+
Decodes, combines bit-unpacking and interpreting a codepoint
|
|
146
|
+
stream, suitable for use with bytes generated by
|
|
147
|
+
L{ByteEncoder}.
|
|
148
|
+
|
|
149
|
+
See L{ByteDecoder} for a usage example.
|
|
150
|
+
"""
|
|
151
|
+
def __init__(self):
|
|
152
|
+
"""
|
|
153
|
+
"""
|
|
154
|
+
|
|
155
|
+
self._decoder = Decoder()
|
|
156
|
+
self._unpacker = BitUnpacker(initial_code_size=self._decoder.code_size())
|
|
157
|
+
self.remaining = []
|
|
158
|
+
|
|
159
|
+
def decodefrombytes(self, bytesource):
|
|
160
|
+
"""
|
|
161
|
+
Given an iterator over BitPacked, Encoded bytes, Returns an
|
|
162
|
+
iterator over the uncompressed bytes. Dual of
|
|
163
|
+
L{ByteEncoder.encodetobytes}. See L{ByteEncoder} for an
|
|
164
|
+
example of use.
|
|
165
|
+
"""
|
|
166
|
+
codepoints = self._unpacker.unpack(bytesource)
|
|
167
|
+
clearbytes = self._decoder.decode(codepoints)
|
|
168
|
+
|
|
169
|
+
return clearbytes
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
class BitPacker(object):
|
|
173
|
+
"""
|
|
174
|
+
Translates a stream of lzw codepoints into a variable width packed
|
|
175
|
+
stream of bytes, for use by L{BitUnpacker}. One of a (potential)
|
|
176
|
+
set of encoders for a stream of LZW codepoints, intended to behave
|
|
177
|
+
as closely to the TIFF variable-width encoding scheme as closely
|
|
178
|
+
as possible.
|
|
179
|
+
|
|
180
|
+
The inbound stream of integer lzw codepoints are packed into
|
|
181
|
+
variable width bit fields, starting at the smallest number of bits
|
|
182
|
+
it can and then increasing the bit width as it anticipates the LZW
|
|
183
|
+
code size growing to overflow.
|
|
184
|
+
|
|
185
|
+
This class knows all kinds of intimate things about how it's
|
|
186
|
+
upstream codepoint processors work; it knows the control codes
|
|
187
|
+
CLEAR_CODE and END_OF_INFO_CODE, and (more intimately still), it
|
|
188
|
+
makes assumptions about the rate of growth of it's consumer's
|
|
189
|
+
codebook. This is ok, as long as the underlying encoder/decoders
|
|
190
|
+
don't know any intimate details about their BitPackers/Unpackers
|
|
191
|
+
"""
|
|
192
|
+
|
|
193
|
+
def __init__(self, initial_code_size):
|
|
194
|
+
"""
|
|
195
|
+
Takes an initial code book size (that is, the count of known
|
|
196
|
+
codes at the beginning of encoding, or after a clear)
|
|
197
|
+
"""
|
|
198
|
+
self._initial_code_size = initial_code_size
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def pack(self, codepoints):
|
|
202
|
+
"""
|
|
203
|
+
Given an iterator of integer codepoints, returns an iterator
|
|
204
|
+
over bytes containing the codepoints packed into varying
|
|
205
|
+
lengths, with bit width growing to accomodate an input code
|
|
206
|
+
that it assumes will grow by one entry per codepoint seen.
|
|
207
|
+
|
|
208
|
+
Widths will be reset to the given initial_code_size when the
|
|
209
|
+
LZW CLEAR_CODE or END_OF_INFO_CODE code appears in the input,
|
|
210
|
+
and bytes following END_OF_INFO_CODE will be aligned to the
|
|
211
|
+
next byte boundary.
|
|
212
|
+
|
|
213
|
+
>>> import lzw
|
|
214
|
+
>>> pkr = lzw.BitPacker(258)
|
|
215
|
+
>>> [ b for b in pkr.pack([ 1, 257]) ] == [ chr(0), chr(0xC0), chr(0x40) ]
|
|
216
|
+
True
|
|
217
|
+
"""
|
|
218
|
+
tailbits = []
|
|
219
|
+
codesize = self._initial_code_size
|
|
220
|
+
|
|
221
|
+
#minwidth = 8
|
|
222
|
+
minwidth = DEFAULT_MIN_BITS
|
|
223
|
+
while (1 << minwidth) < codesize:
|
|
224
|
+
minwidth = minwidth + 1
|
|
225
|
+
|
|
226
|
+
nextwidth = minwidth
|
|
227
|
+
|
|
228
|
+
for pt in codepoints:
|
|
229
|
+
|
|
230
|
+
newbits = inttobits(pt, nextwidth)
|
|
231
|
+
tailbits = tailbits + newbits
|
|
232
|
+
|
|
233
|
+
# PAY ATTENTION. This calculation should be driven by the
|
|
234
|
+
# size of the upstream codebook, right now we're just trusting
|
|
235
|
+
# that everybody intends to follow the TIFF spec.
|
|
236
|
+
codesize = codesize + 1
|
|
237
|
+
|
|
238
|
+
if pt == END_OF_INFO_CODE:
|
|
239
|
+
while len(tailbits) % 8:
|
|
240
|
+
tailbits.append(0)
|
|
241
|
+
|
|
242
|
+
if pt in [ CLEAR_CODE, END_OF_INFO_CODE ]:
|
|
243
|
+
nextwidth = minwidth
|
|
244
|
+
codesize = self._initial_code_size
|
|
245
|
+
elif codesize >= (2 ** nextwidth):
|
|
246
|
+
nextwidth = nextwidth + 1
|
|
247
|
+
|
|
248
|
+
while len(tailbits) > 8:
|
|
249
|
+
nextbits = tailbits[:8]
|
|
250
|
+
nextbytes = bitstobytes(nextbits)
|
|
251
|
+
for bt in nextbytes:
|
|
252
|
+
yield struct.pack("B", bt)
|
|
253
|
+
|
|
254
|
+
tailbits = tailbits[8:]
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
if tailbits:
|
|
258
|
+
tail = bitstobytes(tailbits)
|
|
259
|
+
for bt in tail:
|
|
260
|
+
yield struct.pack("B", bt)
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
class BitUnpacker(object):
|
|
266
|
+
"""
|
|
267
|
+
An adaptive-width bit unpacker, intended to decode streams written
|
|
268
|
+
by L{BitPacker} into integer codepoints. Like L{BitPacker}, knows
|
|
269
|
+
about code size changes and control codes.
|
|
270
|
+
"""
|
|
271
|
+
|
|
272
|
+
def __init__(self, initial_code_size):
|
|
273
|
+
"""
|
|
274
|
+
initial_code_size is the starting size of the codebook
|
|
275
|
+
associated with the to-be-unpacked stream.
|
|
276
|
+
"""
|
|
277
|
+
self._initial_code_size = initial_code_size
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
def unpack(self, bytesource):
|
|
281
|
+
"""
|
|
282
|
+
Given an iterator of bytes, returns an iterator of integer
|
|
283
|
+
code points. Auto-magically adjusts point width when it sees
|
|
284
|
+
an almost-overflow in the input stream, or an LZW CLEAR_CODE
|
|
285
|
+
or END_OF_INFO_CODE
|
|
286
|
+
|
|
287
|
+
Trailing bits at the end of the given iterator, after the last
|
|
288
|
+
codepoint, will be dropped on the floor.
|
|
289
|
+
|
|
290
|
+
At the end of the iteration, or when an END_OF_INFO_CODE seen
|
|
291
|
+
the unpacker will ignore the bits after the code until it
|
|
292
|
+
reaches the next aligned byte. END_OF_INFO_CODE will *not*
|
|
293
|
+
stop the generator, just reset the alignment and the width
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
>>> import lzw
|
|
297
|
+
>>> unpk = lzw.BitUnpacker(initial_code_size=258)
|
|
298
|
+
>>> [ i for i in unpk.unpack([ chr(0), chr(0xC0), chr(0x40) ]) ]
|
|
299
|
+
[1, 257]
|
|
300
|
+
"""
|
|
301
|
+
bits = []
|
|
302
|
+
offset = 0
|
|
303
|
+
ignore = 0
|
|
304
|
+
|
|
305
|
+
codesize = self._initial_code_size
|
|
306
|
+
#minwidth = 8
|
|
307
|
+
minwidth = DEFAULT_MIN_BITS
|
|
308
|
+
while (1 << minwidth) < codesize:
|
|
309
|
+
minwidth = minwidth + 1
|
|
310
|
+
|
|
311
|
+
pointwidth = minwidth
|
|
312
|
+
|
|
313
|
+
for nextbit in bytestobits(bytesource):
|
|
314
|
+
|
|
315
|
+
offset = (offset + 1) % 8
|
|
316
|
+
if ignore > 0:
|
|
317
|
+
ignore = ignore - 1
|
|
318
|
+
continue
|
|
319
|
+
|
|
320
|
+
bits.append(nextbit)
|
|
321
|
+
|
|
322
|
+
if len(bits) == pointwidth:
|
|
323
|
+
codepoint = intfrombits(bits)
|
|
324
|
+
bits = []
|
|
325
|
+
|
|
326
|
+
yield codepoint
|
|
327
|
+
|
|
328
|
+
codesize = codesize + 1
|
|
329
|
+
|
|
330
|
+
if codepoint in [ CLEAR_CODE, END_OF_INFO_CODE ]:
|
|
331
|
+
codesize = self._initial_code_size
|
|
332
|
+
pointwidth = minwidth
|
|
333
|
+
else:
|
|
334
|
+
# is this too late?
|
|
335
|
+
while codesize >= (2 ** pointwidth + 1):
|
|
336
|
+
pointwidth = pointwidth + 1
|
|
337
|
+
#ignore = (8 - offset) % 8
|
|
338
|
+
|
|
339
|
+
if codepoint == END_OF_INFO_CODE:
|
|
340
|
+
ignore = (8 - offset) % 8
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
class Decoder(object):
|
|
345
|
+
"""
|
|
346
|
+
Uncompresses a stream of lzw code points, as created by
|
|
347
|
+
L{Encoder}. Given a list of integer code points, with all
|
|
348
|
+
unpacking foolishness complete, turns that list of codepoints into
|
|
349
|
+
a list of uncompressed bytes. See L{BitUnpacker} for what this
|
|
350
|
+
doesn't do.
|
|
351
|
+
"""
|
|
352
|
+
def __init__(self):
|
|
353
|
+
"""
|
|
354
|
+
Creates a new Decoder. Decoders should not be reused for
|
|
355
|
+
different streams.
|
|
356
|
+
"""
|
|
357
|
+
self._clear_codes()
|
|
358
|
+
self.remainder = []
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
def code_size(self):
|
|
362
|
+
"""
|
|
363
|
+
Returns the current size of the Decoder's code book, that is,
|
|
364
|
+
it's mapping of codepoints to byte strings. The return value of
|
|
365
|
+
this method will change as the decode encounters more encoded
|
|
366
|
+
input, or control codes.
|
|
367
|
+
"""
|
|
368
|
+
return len(self._codepoints)
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
def decode(self, codepoints):
|
|
372
|
+
"""
|
|
373
|
+
Given an iterable of integer codepoints, yields the
|
|
374
|
+
corresponding bytes, one at a time, as byte strings of length
|
|
375
|
+
E{1}. Retains the state of the codebook from call to call, so
|
|
376
|
+
if you have another stream, you'll likely need another
|
|
377
|
+
decoder!
|
|
378
|
+
|
|
379
|
+
Decoders will NOT handle END_OF_INFO_CODE (rather, they will
|
|
380
|
+
handle the code by throwing an exception); END_OF_INFO should
|
|
381
|
+
be handled by the upstream codepoint generator (see
|
|
382
|
+
L{BitUnpacker}, for example)
|
|
383
|
+
|
|
384
|
+
>>> import lzw
|
|
385
|
+
>>> dec = lzw.Decoder()
|
|
386
|
+
>>> ''.join(dec.decode([103, 97, 98, 98, 97, 32, 258, 260, 262, 121, 111, 263, 259, 261, 256]))
|
|
387
|
+
'gabba gabba yo gabba'
|
|
388
|
+
|
|
389
|
+
"""
|
|
390
|
+
codepoints = [ cp for cp in codepoints ]
|
|
391
|
+
|
|
392
|
+
for cp in codepoints:
|
|
393
|
+
decoded = self._decode_codepoint(cp)
|
|
394
|
+
for character in decoded:
|
|
395
|
+
yield character
|
|
396
|
+
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
def _decode_codepoint(self, codepoint):
|
|
400
|
+
"""
|
|
401
|
+
Will raise a ValueError if given an END_OF_INFORMATION
|
|
402
|
+
code. EOI codes should be handled by callers if they're
|
|
403
|
+
present in our source stream.
|
|
404
|
+
|
|
405
|
+
>>> import lzw
|
|
406
|
+
>>> dec = lzw.Decoder()
|
|
407
|
+
>>> beforesize = dec.code_size()
|
|
408
|
+
>>> dec._decode_codepoint(0x80)
|
|
409
|
+
'\\x80'
|
|
410
|
+
>>> dec._decode_codepoint(0x81)
|
|
411
|
+
'\\x81'
|
|
412
|
+
>>> beforesize + 1 == dec.code_size()
|
|
413
|
+
True
|
|
414
|
+
>>> dec._decode_codepoint(256)
|
|
415
|
+
''
|
|
416
|
+
>>> beforesize == dec.code_size()
|
|
417
|
+
True
|
|
418
|
+
"""
|
|
419
|
+
|
|
420
|
+
ret = b""
|
|
421
|
+
|
|
422
|
+
if codepoint == CLEAR_CODE:
|
|
423
|
+
self._clear_codes()
|
|
424
|
+
elif codepoint == END_OF_INFO_CODE:
|
|
425
|
+
raise ValueError("End of information code not supported directly by this Decoder")
|
|
426
|
+
else:
|
|
427
|
+
if codepoint in self._codepoints:
|
|
428
|
+
ret = self._codepoints[ codepoint ]
|
|
429
|
+
if None != self._prefix:
|
|
430
|
+
self._codepoints[ len(self._codepoints) ] = self._prefix + ret[0]
|
|
431
|
+
|
|
432
|
+
else:
|
|
433
|
+
ret = self._prefix + self._prefix[0]
|
|
434
|
+
self._codepoints[ len(self._codepoints) ] = ret
|
|
435
|
+
|
|
436
|
+
self._prefix = ret
|
|
437
|
+
|
|
438
|
+
return ret
|
|
439
|
+
|
|
440
|
+
|
|
441
|
+
def _clear_codes(self):
|
|
442
|
+
self._codepoints = dict( (pt, struct.pack("B", pt)) for pt in range(256) )
|
|
443
|
+
if not CLEAR_CODE is None:
|
|
444
|
+
self._codepoints[CLEAR_CODE] = CLEAR_CODE
|
|
445
|
+
if not END_OF_INFO_CODE is None:
|
|
446
|
+
self._codepoints[END_OF_INFO_CODE] = END_OF_INFO_CODE
|
|
447
|
+
self._prefix = None
|
|
448
|
+
|
|
449
|
+
|
|
450
|
+
class Encoder(object):
|
|
451
|
+
"""
|
|
452
|
+
Given an iterator of bytes, returns an iterator of integer
|
|
453
|
+
codepoints, suitable for use by L{Decoder}. The core of the
|
|
454
|
+
"compression" side of lzw compression/decompression.
|
|
455
|
+
"""
|
|
456
|
+
def __init__(self, max_code_size=(2**DEFAULT_MAX_BITS)):
|
|
457
|
+
"""
|
|
458
|
+
When the encoding codebook grows larger than max_code_size,
|
|
459
|
+
the Encoder will clear its codebook and emit a CLEAR_CODE
|
|
460
|
+
"""
|
|
461
|
+
|
|
462
|
+
self.closed = False
|
|
463
|
+
|
|
464
|
+
self._max_code_size = max_code_size
|
|
465
|
+
self._buffer = ''
|
|
466
|
+
self._clear_codes()
|
|
467
|
+
|
|
468
|
+
if max_code_size < self.code_size():
|
|
469
|
+
raise ValueError("Max code size too small, (must be at least {0})".format(self.code_size()))
|
|
470
|
+
|
|
471
|
+
|
|
472
|
+
def code_size(self):
|
|
473
|
+
"""
|
|
474
|
+
Returns a count of the known codes, including codes that are
|
|
475
|
+
implicit in the data but have not yet been produced by the
|
|
476
|
+
iterator.
|
|
477
|
+
"""
|
|
478
|
+
return len(self._prefixes)
|
|
479
|
+
|
|
480
|
+
|
|
481
|
+
def flush(self):
|
|
482
|
+
"""
|
|
483
|
+
Yields any buffered codepoints, followed by a CLEAR_CODE, and
|
|
484
|
+
clears the codebook as a side effect.
|
|
485
|
+
"""
|
|
486
|
+
|
|
487
|
+
flushed = []
|
|
488
|
+
|
|
489
|
+
if self._buffer:
|
|
490
|
+
yield self._prefixes[ self._buffer ]
|
|
491
|
+
self._buffer = ''
|
|
492
|
+
|
|
493
|
+
yield CLEAR_CODE
|
|
494
|
+
self._clear_codes()
|
|
495
|
+
|
|
496
|
+
|
|
497
|
+
|
|
498
|
+
|
|
499
|
+
def encode(self, bytesource):
|
|
500
|
+
"""
|
|
501
|
+
Given an iterator over bytes, yields the
|
|
502
|
+
corresponding stream of codepoints.
|
|
503
|
+
Will clear the codes at the end of the stream.
|
|
504
|
+
|
|
505
|
+
>>> import lzw
|
|
506
|
+
>>> enc = lzw.Encoder()
|
|
507
|
+
>>> [ cp for cp in enc.encode("gabba gabba yo gabba") ]
|
|
508
|
+
[103, 97, 98, 98, 97, 32, 258, 260, 262, 121, 111, 263, 259, 261, 256]
|
|
509
|
+
|
|
510
|
+
"""
|
|
511
|
+
for b in bytesource:
|
|
512
|
+
for point in self._encode_byte(b):
|
|
513
|
+
yield point
|
|
514
|
+
|
|
515
|
+
if self.code_size() >= self._max_code_size:
|
|
516
|
+
for pt in self.flush():
|
|
517
|
+
yield pt
|
|
518
|
+
|
|
519
|
+
for point in self.flush():
|
|
520
|
+
yield point
|
|
521
|
+
|
|
522
|
+
|
|
523
|
+
def _encode_byte(self, byte):
|
|
524
|
+
# Yields one or zero bytes, AND changes the internal state of
|
|
525
|
+
# the codebook and prefix buffer.
|
|
526
|
+
#
|
|
527
|
+
# Unless you're in self.encode(), you almost certainly don't
|
|
528
|
+
# want to call this.
|
|
529
|
+
|
|
530
|
+
new_prefix = self._buffer
|
|
531
|
+
|
|
532
|
+
if new_prefix + byte in self._prefixes:
|
|
533
|
+
new_prefix = new_prefix + byte
|
|
534
|
+
elif new_prefix:
|
|
535
|
+
encoded = self._prefixes[ new_prefix ]
|
|
536
|
+
self._add_code(new_prefix + byte)
|
|
537
|
+
new_prefix = byte
|
|
538
|
+
|
|
539
|
+
yield encoded
|
|
540
|
+
|
|
541
|
+
self._buffer = new_prefix
|
|
542
|
+
|
|
543
|
+
|
|
544
|
+
|
|
545
|
+
|
|
546
|
+
def _clear_codes(self):
|
|
547
|
+
|
|
548
|
+
# Teensy hack, CLEAR_CODE and END_OF_INFO_CODE aren't
|
|
549
|
+
# equal to any possible string.
|
|
550
|
+
|
|
551
|
+
self._prefixes = dict( (struct.pack("B", codept), codept) for codept in range(256) )
|
|
552
|
+
self._prefixes[ CLEAR_CODE ] = CLEAR_CODE
|
|
553
|
+
self._prefixes[ END_OF_INFO_CODE ] = END_OF_INFO_CODE
|
|
554
|
+
|
|
555
|
+
|
|
556
|
+
def _add_code(self, newstring):
|
|
557
|
+
self._prefixes[ newstring ] = len(self._prefixes)
|
|
558
|
+
|
|
559
|
+
|
|
560
|
+
|
|
561
|
+
class PagingEncoder(object):
|
|
562
|
+
"""
|
|
563
|
+
UNTESTED. Handles encoding of multiple chunks or streams of encodable data,
|
|
564
|
+
separated with control codes. Dual of PagingDecoder.
|
|
565
|
+
"""
|
|
566
|
+
def __init__(self, initial_code_size, max_code_size):
|
|
567
|
+
self._initial_code_size = initial_code_size
|
|
568
|
+
self._max_code_size = max_code_size
|
|
569
|
+
|
|
570
|
+
|
|
571
|
+
def encodepages(self, pages):
|
|
572
|
+
"""
|
|
573
|
+
Given an iterator of iterators of bytes, produces a single
|
|
574
|
+
iterator containing a delimited sequence of independantly
|
|
575
|
+
compressed LZW sequences, all beginning on a byte-aligned
|
|
576
|
+
spot, all beginning with a CLEAR code and all terminated with
|
|
577
|
+
an END_OF_INFORMATION code (and zero to seven trailing junk
|
|
578
|
+
bits.)
|
|
579
|
+
|
|
580
|
+
The dual of PagingDecoder.decodepages
|
|
581
|
+
|
|
582
|
+
>>> import lzw
|
|
583
|
+
>>> enc = lzw.PagingEncoder(257, 2**12)
|
|
584
|
+
>>> coded = enc.encodepages([ "say hammer yo hammer mc hammer go hammer",
|
|
585
|
+
... "and the rest can go and play",
|
|
586
|
+
... "can't touch this" ])
|
|
587
|
+
...
|
|
588
|
+
>>> b"".join(coded)
|
|
589
|
+
'\\x80\\x1c\\xcc\\'\\x91\\x01\\xa0\\xc2m6\\x99NB\\x03\\xc9\\xbe\\x0b\\x07\\x84\\xc2\\xcd\\xa68|"\\x14 3\\xc3\\xa0\\xd1c\\x94\\x02\\x02\\x80\\x18M\\xc6A\\x01\\xd0\\xd0e\\x10\\x1c\\x8c\\xa73\\xa0\\x80\\xc7\\x02\\x10\\x19\\xcd\\xe2\\x08\\x14\\x10\\xe0l0\\x9e`\\x10\\x10\\x80\\x18\\xcc&\\xe19\\xd0@t7\\x9dLf\\x889\\xa0\\xd2s\\x80@@'
|
|
590
|
+
|
|
591
|
+
"""
|
|
592
|
+
|
|
593
|
+
for page in pages:
|
|
594
|
+
|
|
595
|
+
encoder = Encoder(max_code_size=self._max_code_size)
|
|
596
|
+
codepoints = encoder.encode(page)
|
|
597
|
+
codes_and_eoi = itertools.chain([ CLEAR_CODE ], codepoints, [ END_OF_INFO_CODE ])
|
|
598
|
+
|
|
599
|
+
packer = BitPacker(initial_code_size=encoder.code_size())
|
|
600
|
+
packed = packer.pack(codes_and_eoi)
|
|
601
|
+
|
|
602
|
+
for byte in packed:
|
|
603
|
+
yield byte
|
|
604
|
+
|
|
605
|
+
|
|
606
|
+
|
|
607
|
+
|
|
608
|
+
class PagingDecoder(object):
|
|
609
|
+
"""
|
|
610
|
+
UNTESTED. Dual of PagingEncoder, knows how to handle independantly encoded,
|
|
611
|
+
END_OF_INFO_CODE delimited chunks of an inbound byte stream
|
|
612
|
+
"""
|
|
613
|
+
|
|
614
|
+
def __init__(self, initial_code_size):
|
|
615
|
+
self._initial_code_size = initial_code_size
|
|
616
|
+
self._remains = []
|
|
617
|
+
|
|
618
|
+
def next_page(self, codepoints):
|
|
619
|
+
"""
|
|
620
|
+
Iterator over the next page of codepoints.
|
|
621
|
+
"""
|
|
622
|
+
self._remains = []
|
|
623
|
+
|
|
624
|
+
try:
|
|
625
|
+
while 1:
|
|
626
|
+
cp = next(codepoints)
|
|
627
|
+
if cp != END_OF_INFO_CODE:
|
|
628
|
+
yield cp
|
|
629
|
+
else:
|
|
630
|
+
self._remains = codepoints
|
|
631
|
+
break
|
|
632
|
+
|
|
633
|
+
except StopIteration:
|
|
634
|
+
pass
|
|
635
|
+
|
|
636
|
+
|
|
637
|
+
def decodepages(self, bytesource):
|
|
638
|
+
"""
|
|
639
|
+
Takes an iterator of bytes, returns an iterator of iterators
|
|
640
|
+
of uncompressed data. Expects input to conform to the output
|
|
641
|
+
conventions of PagingEncoder(), in particular that "pages" are
|
|
642
|
+
separated with an END_OF_INFO_CODE and padding up to the next
|
|
643
|
+
byte boundary.
|
|
644
|
+
|
|
645
|
+
BUG: Dangling trailing page on decompression.
|
|
646
|
+
|
|
647
|
+
>>> import lzw
|
|
648
|
+
>>> pgdec = lzw.PagingDecoder(initial_code_size=257)
|
|
649
|
+
>>> pgdecoded = pgdec.decodepages(
|
|
650
|
+
... ''.join([ '\\x80\\x1c\\xcc\\'\\x91\\x01\\xa0\\xc2m6',
|
|
651
|
+
... '\\x99NB\\x03\\xc9\\xbe\\x0b\\x07\\x84\\xc2',
|
|
652
|
+
... '\\xcd\\xa68|"\\x14 3\\xc3\\xa0\\xd1c\\x94',
|
|
653
|
+
... '\\x02\\x02\\x80\\x18M\\xc6A\\x01\\xd0\\xd0e',
|
|
654
|
+
... '\\x10\\x1c\\x8c\\xa73\\xa0\\x80\\xc7\\x02\\x10',
|
|
655
|
+
... '\\x19\\xcd\\xe2\\x08\\x14\\x10\\xe0l0\\x9e`\\x10',
|
|
656
|
+
... '\\x10\\x80\\x18\\xcc&\\xe19\\xd0@t7\\x9dLf\\x889',
|
|
657
|
+
... '\\xa0\\xd2s\\x80@@' ])
|
|
658
|
+
... )
|
|
659
|
+
>>> [ b"".join(pg) for pg in pgdecoded ]
|
|
660
|
+
['say hammer yo hammer mc hammer go hammer', 'and the rest can go and play', "can't touch this", '']
|
|
661
|
+
|
|
662
|
+
"""
|
|
663
|
+
|
|
664
|
+
# TODO: WE NEED A CODE SIZE POLICY OBJECT THAT ISN'T THIS.
|
|
665
|
+
# honestly, we should have a "codebook" object we need to pass
|
|
666
|
+
# to bit packing/unpacking tools, etc, such that we don't have
|
|
667
|
+
# to roll all of these code size assumptions everyplace.
|
|
668
|
+
|
|
669
|
+
unpacker = BitUnpacker(initial_code_size=self._initial_code_size)
|
|
670
|
+
codepoints = unpacker.unpack(bytesource)
|
|
671
|
+
|
|
672
|
+
self._remains = codepoints
|
|
673
|
+
while self._remains:
|
|
674
|
+
nextpoints = self.next_page(self._remains)
|
|
675
|
+
nextpoints = [ nx for nx in nextpoints ]
|
|
676
|
+
|
|
677
|
+
decoder = Decoder()
|
|
678
|
+
decoded = decoder.decode(nextpoints)
|
|
679
|
+
decoded = [ dec for dec in decoded ]
|
|
680
|
+
|
|
681
|
+
yield decoded
|
|
682
|
+
|
|
683
|
+
|
|
684
|
+
|
|
685
|
+
#########################################
|
|
686
|
+
# Conveniences.
|
|
687
|
+
|
|
688
|
+
|
|
689
|
+
# PYTHON V2
|
|
690
|
+
def unpackbyte(b):
|
|
691
|
+
"""
|
|
692
|
+
Given a one-byte long byte string, returns an integer. Equivalent
|
|
693
|
+
to struct.unpack("B", b)
|
|
694
|
+
"""
|
|
695
|
+
(ret,) = struct.unpack("B", b)
|
|
696
|
+
return ret
|
|
697
|
+
|
|
698
|
+
|
|
699
|
+
# PYTHON V3
|
|
700
|
+
# def unpackbyte(b): return b
|
|
701
|
+
|
|
702
|
+
|
|
703
|
+
def filebytes(fileobj, buffersize=1024):
|
|
704
|
+
"""
|
|
705
|
+
Convenience for iterating over the bytes in a file. Given a
|
|
706
|
+
file-like object (with a read(int) method), returns an iterator
|
|
707
|
+
over the bytes of that file.
|
|
708
|
+
"""
|
|
709
|
+
buff = fileobj.read(buffersize)
|
|
710
|
+
while buff:
|
|
711
|
+
for byte in buff: yield byte
|
|
712
|
+
buff = fileobj.read(buffersize)
|
|
713
|
+
|
|
714
|
+
|
|
715
|
+
def readbytes(filename, buffersize=1024):
|
|
716
|
+
"""
|
|
717
|
+
Opens a file named by filename and iterates over the L{filebytes}
|
|
718
|
+
found therein. Will close the file when the bytes run out.
|
|
719
|
+
"""
|
|
720
|
+
with open(filename, "rb") as infile:
|
|
721
|
+
for byte in filebytes(infile, buffersize):
|
|
722
|
+
yield byte
|
|
723
|
+
|
|
724
|
+
|
|
725
|
+
|
|
726
|
+
def writebytes(filename, bytesource):
|
|
727
|
+
"""
|
|
728
|
+
Convenience for emitting the bytes we generate to a file. Given a
|
|
729
|
+
filename, opens and truncates the file, dumps the bytes
|
|
730
|
+
from bytesource into it, and closes it
|
|
731
|
+
"""
|
|
732
|
+
|
|
733
|
+
with open(filename, "wb") as outfile:
|
|
734
|
+
for bt in bytesource:
|
|
735
|
+
outfile.write(bt)
|
|
736
|
+
|
|
737
|
+
|
|
738
|
+
def inttobits(anint, width=None):
|
|
739
|
+
"""
|
|
740
|
+
Produces an array of booleans representing the given argument as
|
|
741
|
+
an unsigned integer, MSB first. If width is given, will pad the
|
|
742
|
+
MSBs to the given width (but will NOT truncate overflowing
|
|
743
|
+
results)
|
|
744
|
+
|
|
745
|
+
>>> import lzw
|
|
746
|
+
>>> lzw.inttobits(304, width=16)
|
|
747
|
+
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0]
|
|
748
|
+
|
|
749
|
+
"""
|
|
750
|
+
remains = anint
|
|
751
|
+
retreverse = []
|
|
752
|
+
while remains:
|
|
753
|
+
retreverse.append(remains & 1)
|
|
754
|
+
remains = remains >> 1
|
|
755
|
+
|
|
756
|
+
retreverse.reverse()
|
|
757
|
+
|
|
758
|
+
ret = retreverse
|
|
759
|
+
if None != width:
|
|
760
|
+
ret_head = [ 0 ] * (width - len(ret))
|
|
761
|
+
ret = ret_head + ret
|
|
762
|
+
|
|
763
|
+
return ret
|
|
764
|
+
|
|
765
|
+
|
|
766
|
+
def intfrombits(bits):
|
|
767
|
+
"""
|
|
768
|
+
Given a list of boolean values, interprets them as a binary
|
|
769
|
+
encoded, MSB-first unsigned integer (with True == 1 and False
|
|
770
|
+
== 0) and returns the result.
|
|
771
|
+
|
|
772
|
+
>>> import lzw
|
|
773
|
+
>>> lzw.intfrombits([ 1, 0, 0, 1, 1, 0, 0, 0, 0 ])
|
|
774
|
+
304
|
|
775
|
+
"""
|
|
776
|
+
ret = 0
|
|
777
|
+
lsb_first = [ b for b in bits ]
|
|
778
|
+
lsb_first.reverse()
|
|
779
|
+
|
|
780
|
+
for bit_index in range(len(lsb_first)):
|
|
781
|
+
if lsb_first[ bit_index ]:
|
|
782
|
+
ret = ret | (1 << bit_index)
|
|
783
|
+
|
|
784
|
+
return ret
|
|
785
|
+
|
|
786
|
+
|
|
787
|
+
def bytestobits(bytesource):
|
|
788
|
+
"""
|
|
789
|
+
Breaks a given iterable of bytes into an iterable of boolean
|
|
790
|
+
values representing those bytes as unsigned integers.
|
|
791
|
+
|
|
792
|
+
>>> import lzw
|
|
793
|
+
>>> [ x for x in lzw.bytestobits(b"\\x01\\x30") ]
|
|
794
|
+
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0]
|
|
795
|
+
"""
|
|
796
|
+
for b in bytesource:
|
|
797
|
+
|
|
798
|
+
value = unpackbyte(b)
|
|
799
|
+
|
|
800
|
+
for bitplusone in range(8, 0, -1):
|
|
801
|
+
bitindex = bitplusone - 1
|
|
802
|
+
nextbit = 1 & (value >> bitindex)
|
|
803
|
+
yield nextbit
|
|
804
|
+
|
|
805
|
+
|
|
806
|
+
def bitstobytes(bits):
|
|
807
|
+
"""
|
|
808
|
+
Interprets an indexable list of booleans as bits, MSB first, to be
|
|
809
|
+
packed into a list of integers from 0 to 256, MSB first, with LSBs
|
|
810
|
+
zero-padded. Note this padding behavior means that round-trips of
|
|
811
|
+
bytestobits(bitstobytes(x, width=W)) may not yield what you expect
|
|
812
|
+
them to if W % 8 != 0
|
|
813
|
+
|
|
814
|
+
Does *NOT* pack the returned values into a bytearray or the like.
|
|
815
|
+
|
|
816
|
+
>>> import lzw
|
|
817
|
+
>>> bitstobytes([0, 0, 0, 0, 0, 0, 0, 0, "Yes, I'm True"]) == [ 0x00, 0x80 ]
|
|
818
|
+
True
|
|
819
|
+
>>> bitstobytes([0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0]) == [ 0x01, 0x30 ]
|
|
820
|
+
True
|
|
821
|
+
"""
|
|
822
|
+
ret = []
|
|
823
|
+
nextbyte = 0
|
|
824
|
+
nextbit = 7
|
|
825
|
+
for bit in bits:
|
|
826
|
+
if bit:
|
|
827
|
+
nextbyte = nextbyte | (1 << nextbit)
|
|
828
|
+
|
|
829
|
+
if nextbit:
|
|
830
|
+
nextbit = nextbit - 1
|
|
831
|
+
else:
|
|
832
|
+
ret.append(nextbyte)
|
|
833
|
+
nextbit = 7
|
|
834
|
+
nextbyte = 0
|
|
835
|
+
|
|
836
|
+
if nextbit < 7: ret.append(nextbyte)
|
|
837
|
+
return ret
|
|
838
|
+
|