python-microscopy 25.11.20__cp313-cp313-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- PYME/Acquire/ActionManager.py +450 -0
- PYME/Acquire/ExecTools.py +235 -0
- PYME/Acquire/Hardware/AAOptoelectronics/MDS.py +175 -0
- PYME/Acquire/Hardware/AAOptoelectronics/__init__.py +0 -0
- PYME/Acquire/Hardware/ARCoptix/__init__.py +0 -0
- PYME/Acquire/Hardware/ARCoptix/lcdriver.py +149 -0
- PYME/Acquire/Hardware/ARCoptix/lcserver32.py +123 -0
- PYME/Acquire/Hardware/AndorIXon/AndorCam.py +1095 -0
- PYME/Acquire/Hardware/AndorIXon/AndorControlFrame.py +312 -0
- PYME/Acquire/Hardware/AndorIXon/AndorIXon.py +737 -0
- PYME/Acquire/Hardware/AndorIXon/__init__.py +27 -0
- PYME/Acquire/Hardware/AndorNeo/AndorNeo.py +644 -0
- PYME/Acquire/Hardware/AndorNeo/AndorNeoControlFrame.py +161 -0
- PYME/Acquire/Hardware/AndorNeo/AndorZyla.py +761 -0
- PYME/Acquire/Hardware/AndorNeo/SDK3.py +307 -0
- PYME/Acquire/Hardware/AndorNeo/SDK3Cam.py +171 -0
- PYME/Acquire/Hardware/AndorNeo/ZylaControlPanel.py +105 -0
- PYME/Acquire/Hardware/AndorNeo/__init__.py +22 -0
- PYME/Acquire/Hardware/AndorNeo/parseAtdebug.py +46 -0
- PYME/Acquire/Hardware/AndorNeo/plotTimings.py +73 -0
- PYME/Acquire/Hardware/AndorNeo/testNeo.py +62 -0
- PYME/Acquire/Hardware/Camera.py +1199 -0
- PYME/Acquire/Hardware/CameraSkeleton.py +642 -0
- PYME/Acquire/Hardware/Coherent/OBIS.py +147 -0
- PYME/Acquire/Hardware/Coherent/Sapphire.py +162 -0
- PYME/Acquire/Hardware/Coherent/__init__.py +0 -0
- PYME/Acquire/Hardware/DMDGui.py +198 -0
- PYME/Acquire/Hardware/DigiData/DigiData.py +95 -0
- PYME/Acquire/Hardware/DigiData/DigiDataClient.py +30 -0
- PYME/Acquire/Hardware/DigiData/RemoteDigiData.py +51 -0
- PYME/Acquire/Hardware/DigiData/__init__.py +24 -0
- PYME/Acquire/Hardware/DigiData/axDD132x.py +348 -0
- PYME/Acquire/Hardware/EMCCDTheory.py +41 -0
- PYME/Acquire/Hardware/ExciterWheel.py +167 -0
- PYME/Acquire/Hardware/FilterWheel.py +184 -0
- PYME/Acquire/Hardware/FocCorr.py +106 -0
- PYME/Acquire/Hardware/FocCorrR.py +196 -0
- PYME/Acquire/Hardware/FrFilter.py +51 -0
- PYME/Acquire/Hardware/GCS/GCS_DLL.py +370 -0
- PYME/Acquire/Hardware/GCS/__init__.py +0 -0
- PYME/Acquire/Hardware/GCS/gcs.py +210 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/HamamatsuDCAM.py +662 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/HamamatsuORCA.py +602 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/Hamamatsu_control_panel.py +54 -0
- PYME/Acquire/Hardware/HamamatsuDCAM/__init__.py +23 -0
- PYME/Acquire/Hardware/LaserControlFrame.py +160 -0
- PYME/Acquire/Hardware/MPBCommunications/MPBCW.py +132 -0
- PYME/Acquire/Hardware/MPBCommunications/__init__.py +0 -0
- PYME/Acquire/Hardware/Mercury/Mercury.py +269 -0
- PYME/Acquire/Hardware/Mercury/PI_Mercury_GCS_DLL.py +857 -0
- PYME/Acquire/Hardware/Mercury/__init__.py +22 -0
- PYME/Acquire/Hardware/Mercury/mercuryStepper.py +203 -0
- PYME/Acquire/Hardware/Mercury/mercuryStepperGCS.py +281 -0
- PYME/Acquire/Hardware/NikonTE2000.py +68 -0
- PYME/Acquire/Hardware/NikonTi.py +214 -0
- PYME/Acquire/Hardware/NikonTiGUI.py +81 -0
- PYME/Acquire/Hardware/OrielCornerstone.py +125 -0
- PYME/Acquire/Hardware/PM100USB.py +51 -0
- PYME/Acquire/Hardware/Piezos/__init__.py +22 -0
- PYME/Acquire/Hardware/Piezos/base_piezo.py +108 -0
- PYME/Acquire/Hardware/Piezos/offsetPiezo.py +162 -0
- PYME/Acquire/Hardware/Piezos/offsetPiezoREST.py +308 -0
- PYME/Acquire/Hardware/Piezos/piezo_c867.py +486 -0
- PYME/Acquire/Hardware/Piezos/piezo_e255.py +68 -0
- PYME/Acquire/Hardware/Piezos/piezo_e662.py +61 -0
- PYME/Acquire/Hardware/Piezos/piezo_e709.py +434 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816.py +452 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816_corr.py +70 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816_dll.py +518 -0
- PYME/Acquire/Hardware/Piezos/piezo_e816b.py +70 -0
- PYME/Acquire/Hardware/Piezos/piezo_pipython_gcs.py +560 -0
- PYME/Acquire/Hardware/Piezos/piezo_test.py +55 -0
- PYME/Acquire/Hardware/Simulator/EmpiricalHist.py +273 -0
- PYME/Acquire/Hardware/Simulator/__init__.py +22 -0
- PYME/Acquire/Hardware/Simulator/dSimControl.py +961 -0
- PYME/Acquire/Hardware/Simulator/fakeCam.py +651 -0
- PYME/Acquire/Hardware/Simulator/fakePiezo.py +95 -0
- PYME/Acquire/Hardware/Simulator/fluor.py +336 -0
- PYME/Acquire/Hardware/Simulator/illuminate.cp313-win_amd64.dll.a +0 -0
- PYME/Acquire/Hardware/Simulator/illuminate.cp313-win_amd64.pyd +0 -0
- PYME/Acquire/Hardware/Simulator/illuminate.pyx +93 -0
- PYME/Acquire/Hardware/Simulator/lasersliders.py +90 -0
- PYME/Acquire/Hardware/Simulator/rend_im.py +446 -0
- PYME/Acquire/Hardware/Simulator/setup.py +69 -0
- PYME/Acquire/Hardware/Simulator/simcontrol.py +348 -0
- PYME/Acquire/Hardware/Simulator/simui_wx.py +794 -0
- PYME/Acquire/Hardware/Tango/__init__.py +0 -0
- PYME/Acquire/Hardware/Tango/marzhauser_tango.py +583 -0
- PYME/Acquire/Hardware/TiLightCrafter.py +388 -0
- PYME/Acquire/Hardware/__init__.py +22 -0
- PYME/Acquire/Hardware/aotf.py +271 -0
- PYME/Acquire/Hardware/arclampshutterpanel.py +71 -0
- PYME/Acquire/Hardware/cameraSoftwareBuffer.py +215 -0
- PYME/Acquire/Hardware/camera_noise.py +270 -0
- PYME/Acquire/Hardware/ccdAdjPanel.py +188 -0
- PYME/Acquire/Hardware/ccdCalibrator.py +161 -0
- PYME/Acquire/Hardware/cobaltLaser.py +108 -0
- PYME/Acquire/Hardware/cobaltLaser561.py +94 -0
- PYME/Acquire/Hardware/comports.py +26 -0
- PYME/Acquire/Hardware/driftTrackGUI.py +488 -0
- PYME/Acquire/Hardware/driftTracking.py +595 -0
- PYME/Acquire/Hardware/fakeShutters.py +52 -0
- PYME/Acquire/Hardware/focusKeys.py +204 -0
- PYME/Acquire/Hardware/focus_locks/__init__.py +0 -0
- PYME/Acquire/Hardware/focus_locks/reflection_focus_lock.py +684 -0
- PYME/Acquire/Hardware/frZStage.py +117 -0
- PYME/Acquire/Hardware/fw102.py +38 -0
- PYME/Acquire/Hardware/ids_peak_cam.py +561 -0
- PYME/Acquire/Hardware/ioslave.py +305 -0
- PYME/Acquire/Hardware/lasers.py +292 -0
- PYME/Acquire/Hardware/matchboxLaser.py +58 -0
- PYME/Acquire/Hardware/microscope_adapter.py +104 -0
- PYME/Acquire/Hardware/mpd_picosecond_delayer.py +395 -0
- PYME/Acquire/Hardware/multiview.py +287 -0
- PYME/Acquire/Hardware/olympusix81.py +59 -0
- PYME/Acquire/Hardware/pco/__init__.py +0 -0
- PYME/Acquire/Hardware/pco/pco_cam.py +348 -0
- PYME/Acquire/Hardware/pco/pco_edge_42_lt.py +34 -0
- PYME/Acquire/Hardware/pco/pco_sdk.py +1645 -0
- PYME/Acquire/Hardware/pco/pco_sdk_cam.py +518 -0
- PYME/Acquire/Hardware/pco/pco_sdk_cam_control_panel.py +54 -0
- PYME/Acquire/Hardware/phoxxLaser.py +199 -0
- PYME/Acquire/Hardware/phoxxLaserOLD.py +242 -0
- PYME/Acquire/Hardware/priorLumen.py +102 -0
- PYME/Acquire/Hardware/priorarclampshutter.py +52 -0
- PYME/Acquire/Hardware/setup.py +50 -0
- PYME/Acquire/Hardware/spacenav.py +148 -0
- PYME/Acquire/Hardware/splitter.py +394 -0
- PYME/Acquire/Hardware/thorlabsPiezo.py +98 -0
- PYME/Acquire/Hardware/thorlabs_cam.py +136 -0
- PYME/Acquire/Hardware/thorlabs_mff_flipper.py +400 -0
- PYME/Acquire/Hardware/toptica_ibeam.py +51 -0
- PYME/Acquire/Hardware/uc480/AndorControlFrame.py +308 -0
- PYME/Acquire/Hardware/uc480/__init__.py +27 -0
- PYME/Acquire/Hardware/uc480/uCam480.py +695 -0
- PYME/Acquire/Hardware/uc480/uc480.py +189 -0
- PYME/Acquire/Hardware/uc480/uc480Deprecated.py +87 -0
- PYME/Acquire/Hardware/uc480/uc480_h.py +767 -0
- PYME/Acquire/Hardware/uc480/uc480_h_gen.py +62 -0
- PYME/Acquire/Hardware/uc480/ucCamControlFrame.py +83 -0
- PYME/Acquire/Hardware/ueye.py +702 -0
- PYME/Acquire/PYMEAcquire.py +186 -0
- PYME/Acquire/Protocols/DMDMFM.py +74 -0
- PYME/Acquire/Protocols/__init__.py +22 -0
- PYME/Acquire/Protocols/darkCalibrate.py +56 -0
- PYME/Acquire/Protocols/dual671_470.py +45 -0
- PYME/Acquire/Protocols/dual671_488.py +46 -0
- PYME/Acquire/Protocols/gainCal.py +53 -0
- PYME/Acquire/Protocols/htsms-cal-psf.py +32 -0
- PYME/Acquire/Protocols/htsms-cal-registration.py +52 -0
- PYME/Acquire/Protocols/htsms-flow.py +29 -0
- PYME/Acquire/Protocols/htsms-staggered.py +31 -0
- PYME/Acquire/Protocols/htsms-tile.py +68 -0
- PYME/Acquire/Protocols/htsms-two-color.py +29 -0
- PYME/Acquire/Protocols/htsms-widefield.py +32 -0
- PYME/Acquire/Protocols/paint671.py +61 -0
- PYME/Acquire/Protocols/photoconversion.py +52 -0
- PYME/Acquire/Protocols/photoconversion2.py +55 -0
- PYME/Acquire/Protocols/prebleach488.py +70 -0
- PYME/Acquire/Protocols/prebleach490.py +69 -0
- PYME/Acquire/Protocols/prebleach561.py +72 -0
- PYME/Acquire/Protocols/prebleach561NeomEos2.py +70 -0
- PYME/Acquire/Protocols/prebleach561NeomEos2ND1.py +70 -0
- PYME/Acquire/Protocols/prebleach642.py +70 -0
- PYME/Acquire/Protocols/prebleach671.py +69 -0
- PYME/Acquire/Protocols/prebleach671ND1.py +58 -0
- PYME/Acquire/Protocols/prebleach671ND2.py +57 -0
- PYME/Acquire/Protocols/prebleach671Neo.py +69 -0
- PYME/Acquire/Protocols/recover671.py +62 -0
- PYME/Acquire/Protocols/sequence642_488.py +85 -0
- PYME/Acquire/Protocols/sequence642_561.py +87 -0
- PYME/Acquire/Protocols/shiftfield.py +198 -0
- PYME/Acquire/Protocols/simul488.py +59 -0
- PYME/Acquire/Protocols/simul642.py +63 -0
- PYME/Acquire/Protocols/simul642HTSMS.py +63 -0
- PYME/Acquire/Protocols/simulPA.py +37 -0
- PYME/Acquire/Protocols/simulSIM.py +76 -0
- PYME/Acquire/Protocols/simulStep.py +62 -0
- PYME/Acquire/Protocols/spdscan.py +178 -0
- PYME/Acquire/Protocols/standard470.py +45 -0
- PYME/Acquire/Protocols/standard488.py +47 -0
- PYME/Acquire/Protocols/standard671.py +48 -0
- PYME/Acquire/Protocols/standard671_no532.py +47 -0
- PYME/Acquire/Protocols/standardArclamp.py +46 -0
- PYME/Acquire/Protocols/strip_tile.py +204 -0
- PYME/Acquire/Protocols/tile.py +204 -0
- PYME/Acquire/Protocols/tile3D.py +192 -0
- PYME/Acquire/Protocols/tile671.py +190 -0
- PYME/Acquire/Protocols/tile_triggered.py +189 -0
- PYME/Acquire/Scripts/init.py +232 -0
- PYME/Acquire/Scripts/init_N1_Ti_Exeter_ZIx.py +374 -0
- PYME/Acquire/Scripts/init_N2_Ti_Zyla_lasers.py +290 -0
- PYME/Acquire/Scripts/init_Neo.py +266 -0
- PYME/Acquire/Scripts/init_NeoSim.py +159 -0
- PYME/Acquire/Scripts/init_TIRF.py +232 -0
- PYME/Acquire/Scripts/init_TIRF_Neo.py +242 -0
- PYME/Acquire/Scripts/init_TIRF_NeoO.py +241 -0
- PYME/Acquire/Scripts/init_TIRF_onecam.py +233 -0
- PYME/Acquire/Scripts/init_Ti.py +257 -0
- PYME/Acquire/Scripts/init_UOA_n.py +256 -0
- PYME/Acquire/Scripts/init_UOA_n2.py +246 -0
- PYME/Acquire/Scripts/init_Y1.py +249 -0
- PYME/Acquire/Scripts/init_Zyla.py +260 -0
- PYME/Acquire/Scripts/init_drift_tracking.py +80 -0
- PYME/Acquire/Scripts/init_emccd_basic.py +277 -0
- PYME/Acquire/Scripts/init_htsms.py +277 -0
- PYME/Acquire/Scripts/init_htsms_focus_lock.py +132 -0
- PYME/Acquire/Scripts/init_micrpi.py +45 -0
- PYME/Acquire/Scripts/init_orca.py +70 -0
- PYME/Acquire/Scripts/init_pco.py +49 -0
- PYME/Acquire/Scripts/init_rev.py +74 -0
- PYME/Acquire/Scripts/init_sim100.py +169 -0
- PYME/Acquire/Scripts/init_sim103.py +169 -0
- PYME/Acquire/Scripts/init_sim2.py +211 -0
- PYME/Acquire/Scripts/init_sim50.py +169 -0
- PYME/Acquire/Scripts/init_sim75.py +169 -0
- PYME/Acquire/Scripts/init_sim_drift_tracking.py +166 -0
- PYME/Acquire/Scripts/init_sim_htsms.py +224 -0
- PYME/Acquire/Scripts/init_sim_htsms_n.py +233 -0
- PYME/Acquire/Scripts/init_sim_main.py +229 -0
- PYME/Acquire/Scripts/init_sim_min.py +197 -0
- PYME/Acquire/Scripts/init_sim_rem.py +176 -0
- PYME/Acquire/Scripts/init_smi1.py +110 -0
- PYME/Acquire/Scripts/init_spectro.py +78 -0
- PYME/Acquire/Scripts/init_spim.py +116 -0
- PYME/Acquire/Scripts/init_thorcam.py +62 -0
- PYME/Acquire/Scripts/init_twophoton.py +112 -0
- PYME/Acquire/Scripts/init_uc480.py +262 -0
- PYME/Acquire/Scripts/init_ueye.py +261 -0
- PYME/Acquire/SpoolController.py +958 -0
- PYME/Acquire/Utils/MultiPointScanner.py +80 -0
- PYME/Acquire/Utils/__init__.py +13 -0
- PYME/Acquire/Utils/failsafe.py +157 -0
- PYME/Acquire/Utils/fastTiler.py +153 -0
- PYME/Acquire/Utils/pointScanner.py +496 -0
- PYME/Acquire/Utils/sarcSpacing.py +86 -0
- PYME/Acquire/Utils/strip_tiler.py +93 -0
- PYME/Acquire/Utils/tiler.py +464 -0
- PYME/Acquire/Utils/vibrationAnalysis.py +65 -0
- PYME/Acquire/__init__.py +44 -0
- PYME/Acquire/acquire_client.py +90 -0
- PYME/Acquire/acquire_server.py +316 -0
- PYME/Acquire/acquirebase.py +139 -0
- PYME/Acquire/acquiremainframe.py +716 -0
- PYME/Acquire/acquirewx.py +61 -0
- PYME/Acquire/acquisition_base.py +148 -0
- PYME/Acquire/actions.py +209 -0
- PYME/Acquire/autofocus.py +54 -0
- PYME/Acquire/eventLog.py +95 -0
- PYME/Acquire/event_loop.py +119 -0
- PYME/Acquire/frameWrangler.py +530 -0
- PYME/Acquire/htsms/__init__.py +8 -0
- PYME/Acquire/htsms/rule_ui.py +970 -0
- PYME/Acquire/htsms/rule_ui_v2.py +573 -0
- PYME/Acquire/htsms/tweeter.py +222 -0
- PYME/Acquire/microscope.py +1050 -0
- PYME/Acquire/positionTracker.py +181 -0
- PYME/Acquire/protocol.py +299 -0
- PYME/Acquire/protocol_acquisition.py +404 -0
- PYME/Acquire/sampleInformation.py +591 -0
- PYME/Acquire/sampleInformationDjangoDirect.py +446 -0
- PYME/Acquire/setup.py +52 -0
- PYME/Acquire/stackSettings.py +295 -0
- PYME/Acquire/stage_leveling.py +285 -0
- PYME/Acquire/ui/AnalysisSettingsUI.py +184 -0
- PYME/Acquire/ui/HDFSpoolFrame.py +584 -0
- PYME/Acquire/ui/__init__.py +0 -0
- PYME/Acquire/ui/actionUI.py +892 -0
- PYME/Acquire/ui/focus_lock_gui.py +149 -0
- PYME/Acquire/ui/intensity_trace.py +143 -0
- PYME/Acquire/ui/intsliders.py +222 -0
- PYME/Acquire/ui/lasersliders.py +329 -0
- PYME/Acquire/ui/mpd_picosecond_delay_panel.py +69 -0
- PYME/Acquire/ui/multiview_select.py +77 -0
- PYME/Acquire/ui/positionUI.py +519 -0
- PYME/Acquire/ui/preflight.py +58 -0
- PYME/Acquire/ui/scanner_panel.py +41 -0
- PYME/Acquire/ui/selectCameraPanel.py +46 -0
- PYME/Acquire/ui/seqdialog.py +501 -0
- PYME/Acquire/ui/splashScreen.py +175 -0
- PYME/Acquire/ui/spool_panel.py +830 -0
- PYME/Acquire/ui/tile_panel.py +556 -0
- PYME/Acquire/ui/tilesettingsui.py +91 -0
- PYME/Acquire/ui/voxelSizeDialog.py +149 -0
- PYME/Acquire/webui/__init__.py +36 -0
- PYME/Acquire/webui/ipy.py +361 -0
- PYME/Acquire/webui/static/css/pyme-bootstrap.css +9908 -0
- PYME/Acquire/webui/static/css/pymeacquire.css +85 -0
- PYME/Acquire/webui/static/js/pymeacquire.js +375 -0
- PYME/Acquire/webui/static/js/pzf.js +95 -0
- PYME/Acquire/webui/templates/PYMEAcquire.html +232 -0
- PYME/Acquire/webui/templates/login.html +84 -0
- PYME/Acquire/webui/templates/xtermpage.html +106 -0
- PYME/Acquire/xyztc.py +418 -0
- PYME/Acquire/zScanner.py +287 -0
- PYME/Analysis/BleachProfile/__init__.py +26 -0
- PYME/Analysis/BleachProfile/deMod.py +91 -0
- PYME/Analysis/BleachProfile/fitRecover.py +90 -0
- PYME/Analysis/BleachProfile/intensProf.py +519 -0
- PYME/Analysis/BleachProfile/kinModels.py +507 -0
- PYME/Analysis/BleachProfile/rawIntensity.py +227 -0
- PYME/Analysis/BleachProfile/rollins.py +555 -0
- PYME/Analysis/Colocalisation/__init__.py +27 -0
- PYME/Analysis/Colocalisation/colocScaleDep.py +126 -0
- PYME/Analysis/Colocalisation/correlationCoeffs.py +198 -0
- PYME/Analysis/Colocalisation/distColoc.py +110 -0
- PYME/Analysis/Colocalisation/edtColoc.py +191 -0
- PYME/Analysis/MetaData.py +278 -0
- PYME/Analysis/PSFEst/__init__.py +27 -0
- PYME/Analysis/PSFEst/dec.py +283 -0
- PYME/Analysis/PSFEst/extractImages.py +316 -0
- PYME/Analysis/PSFEst/fit_psf_zernikes.py +194 -0
- PYME/Analysis/PSFEst/psfQuality.py +225 -0
- PYME/Analysis/PSFGen/__init__.py +40 -0
- PYME/Analysis/PSFGen/fourier.py +138 -0
- PYME/Analysis/PSFGen/fourierHNA.py +1108 -0
- PYME/Analysis/PSFGen/fourierHNA2.py +979 -0
- PYME/Analysis/PSFGen/genCRBcurves.py +185 -0
- PYME/Analysis/PSFGen/nijboer_zernike.py +79 -0
- PYME/Analysis/PSFGen/ps_app.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/PSFGen/ps_app.cp313-win_amd64.pyd +0 -0
- PYME/Analysis/PSFGen/test_ps_app.py +24 -0
- PYME/Analysis/Tracking/__init__.py +3 -0
- PYME/Analysis/Tracking/msd.py +57 -0
- PYME/Analysis/Tracking/trackUtils.py +528 -0
- PYME/Analysis/Tracking/tracking.py +152 -0
- PYME/Analysis/__init__.py +30 -0
- PYME/Analysis/_fithelpers.py +161 -0
- PYME/Analysis/angleFilter.py +287 -0
- PYME/Analysis/annealThresh.py +157 -0
- PYME/Analysis/autoencoder_classifier.py +45 -0
- PYME/Analysis/binAvg.py +144 -0
- PYME/Analysis/composite.py +183 -0
- PYME/Analysis/cramerRao.py +259 -0
- PYME/Analysis/deTile.py +441 -0
- PYME/Analysis/density_filter.py +45 -0
- PYME/Analysis/distributed_pyramid.py +426 -0
- PYME/Analysis/fiducial_matching.py +220 -0
- PYME/Analysis/gen_sCMOS_maps.py +355 -0
- PYME/Analysis/graphing_filters.py +311 -0
- PYME/Analysis/implicitFilter.py +359 -0
- PYME/Analysis/keep_pairs.py +69 -0
- PYME/Analysis/optic_flow.py +108 -0
- PYME/Analysis/piecewise.py +36 -0
- PYME/Analysis/piecewiseMapping.py +304 -0
- PYME/Analysis/piezo_movement_correction.py +153 -0
- PYME/Analysis/points/DeClump/__init__.py +78 -0
- PYME/Analysis/points/DeClump/deClump.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/points/DeClump/deClump.cp313-win_amd64.pyd +0 -0
- PYME/Analysis/points/DeClump/deClumpGUI.py +87 -0
- PYME/Analysis/points/DeClump/pyDeClump.py +284 -0
- PYME/Analysis/points/DeClump/testClump.py +40 -0
- PYME/Analysis/points/DistHist/__init__.py +25 -0
- PYME/Analysis/points/DistHist/distHist.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/points/DistHist/distHist.cp313-win_amd64.pyd +0 -0
- PYME/Analysis/points/DistHist/distHistThreaded.py +71 -0
- PYME/Analysis/points/DistHist/setup.py +54 -0
- PYME/Analysis/points/EdgeDB/__init__.py +24 -0
- PYME/Analysis/points/EdgeDB/edgeDB.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/points/EdgeDB/edgeDB.cp313-win_amd64.pyd +0 -0
- PYME/Analysis/points/EdgeDB/edgeTest.py +66 -0
- PYME/Analysis/points/EdgeDB/edges.py +102 -0
- PYME/Analysis/points/EdgeDB/segment.py +75 -0
- PYME/Analysis/points/EdgeDB/setup.py +54 -0
- PYME/Analysis/points/QuadTree/QTrend.py +232 -0
- PYME/Analysis/points/QuadTree/__init__.py +25 -0
- PYME/Analysis/points/QuadTree/pointQT.py +227 -0
- PYME/Analysis/points/QuadTree/pointQTF.py +254 -0
- PYME/Analysis/points/QuadTree/qtUtils.py +36 -0
- PYME/Analysis/points/QuadTree/rendQT.py +118 -0
- PYME/Analysis/points/SoftRend/__init__.py +24 -0
- PYME/Analysis/points/SoftRend/setup.py +61 -0
- PYME/Analysis/points/SoftRend/testTetrahedra.py +41 -0
- PYME/Analysis/points/SoftRend/triRend.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/points/SoftRend/triRend.cp313-win_amd64.pyd +0 -0
- PYME/Analysis/points/__init__.py +3 -0
- PYME/Analysis/points/arcfit/__init__.py +1 -0
- PYME/Analysis/points/arcfit/arcmf.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/points/arcfit/arcmf.cp313-win_amd64.pyd +0 -0
- PYME/Analysis/points/arcfit/setup.py +51 -0
- PYME/Analysis/points/astigmatism/__init__.py +0 -0
- PYME/Analysis/points/astigmatism/astigTools.py +338 -0
- PYME/Analysis/points/astigmatism/astiglookup.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/points/astigmatism/astiglookup.cp313-win_amd64.pyd +0 -0
- PYME/Analysis/points/astigmatism/setup.py +54 -0
- PYME/Analysis/points/cluster_morphology.py +199 -0
- PYME/Analysis/points/coordinate_tools.py +278 -0
- PYME/Analysis/points/features/__init__.py +0 -0
- PYME/Analysis/points/features/metal.py +46 -0
- PYME/Analysis/points/features/shaders/vect_feat_3d.metal +49 -0
- PYME/Analysis/points/fiducials.py +142 -0
- PYME/Analysis/points/gen3DTriangs.py +796 -0
- PYME/Analysis/points/moments.py +143 -0
- PYME/Analysis/points/multiview.py +458 -0
- PYME/Analysis/points/objectMeasure.py +206 -0
- PYME/Analysis/points/qpaint.py +97 -0
- PYME/Analysis/points/rings.py +372 -0
- PYME/Analysis/points/ripleys.py +427 -0
- PYME/Analysis/points/segmentLL.py +134 -0
- PYME/Analysis/points/setup.py +56 -0
- PYME/Analysis/points/spherical_harmonics.py +909 -0
- PYME/Analysis/points/surfit.py +829 -0
- PYME/Analysis/points/tCluster.py +75 -0
- PYME/Analysis/points/traveling_salesperson/__init__.py +0 -0
- PYME/Analysis/points/traveling_salesperson/queue_opt.py +117 -0
- PYME/Analysis/points/traveling_salesperson/sectioned_two_opt.py +327 -0
- PYME/Analysis/points/traveling_salesperson/setup.py +40 -0
- PYME/Analysis/points/traveling_salesperson/sort.py +78 -0
- PYME/Analysis/points/traveling_salesperson/two_opt.py +189 -0
- PYME/Analysis/points/traveling_salesperson/two_opt_utils.cp313-win_amd64.dll.a +0 -0
- PYME/Analysis/points/traveling_salesperson/two_opt_utils.cp313-win_amd64.pyd +0 -0
- PYME/Analysis/points/traveling_salesperson/two_opt_utils.pyx +41 -0
- PYME/Analysis/points/twoColour.py +572 -0
- PYME/Analysis/points/twoColourPlot.py +107 -0
- PYME/Analysis/processLogger.py +129 -0
- PYME/Analysis/profile_extraction.py +72 -0
- PYME/Analysis/setup.py +60 -0
- PYME/Analysis/splitting.py +372 -0
- PYME/Analysis/svmSegment.py +214 -0
- PYME/Analysis/thresholding.py +192 -0
- PYME/Analysis/tile_pyramid.py +938 -0
- PYME/Analysis/widefieldify.py +54 -0
- PYME/DSView/DisplayOptionsPanel.py +503 -0
- PYME/DSView/LUT/__init__.py +33 -0
- PYME/DSView/LUT/lut.cp313-win_amd64.dll.a +0 -0
- PYME/DSView/LUT/lut.cp313-win_amd64.pyd +0 -0
- PYME/DSView/LUT/setup.py +54 -0
- PYME/DSView/OpenSequenceDialog.py +83 -0
- PYME/DSView/OverlaysPanel.py +111 -0
- PYME/DSView/__init__.py +32 -0
- PYME/DSView/arrayViewPanel.py +1035 -0
- PYME/DSView/displayOptions.py +453 -0
- PYME/DSView/displaySettingsPanel.py +271 -0
- PYME/DSView/dsviewer.py +542 -0
- PYME/DSView/eventLogViewer.py +805 -0
- PYME/DSView/fitInfo.py +486 -0
- PYME/DSView/htmlServe.py +72 -0
- PYME/DSView/logparser.py +100 -0
- PYME/DSView/modules/LMAnalysis.py +1053 -0
- PYME/DSView/modules/LMDisplay.py +194 -0
- PYME/DSView/modules/__init__.py +162 -0
- PYME/DSView/modules/_base.py +39 -0
- PYME/DSView/modules/annotation.py +725 -0
- PYME/DSView/modules/arrayView.py +71 -0
- PYME/DSView/modules/blobFinding.py +455 -0
- PYME/DSView/modules/blobMeasure.py +1093 -0
- PYME/DSView/modules/camera_maps.py +38 -0
- PYME/DSView/modules/coloc.py +414 -0
- PYME/DSView/modules/composite.py +715 -0
- PYME/DSView/modules/convnet.py +24 -0
- PYME/DSView/modules/cropping.py +133 -0
- PYME/DSView/modules/dark_and_flatfield.py +31 -0
- PYME/DSView/modules/deconvolution.py +499 -0
- PYME/DSView/modules/eventView.py +80 -0
- PYME/DSView/modules/extractBlobs.py +46 -0
- PYME/DSView/modules/fastGraphPanel.py +85 -0
- PYME/DSView/modules/filtering.py +335 -0
- PYME/DSView/modules/flowView.py +268 -0
- PYME/DSView/modules/fourierRingCorrelation.py +172 -0
- PYME/DSView/modules/gl_image_view.py +12 -0
- PYME/DSView/modules/graphViewPanel.py +272 -0
- PYME/DSView/modules/measure/__init__.py +1 -0
- PYME/DSView/modules/measure/filterPan.py +239 -0
- PYME/DSView/modules/metadataView.py +28 -0
- PYME/DSView/modules/multithreshold.py +98 -0
- PYME/DSView/modules/neuroglancer.py +129 -0
- PYME/DSView/modules/object_tagging.py +157 -0
- PYME/DSView/modules/particleTracking.py +463 -0
- PYME/DSView/modules/playback.py +256 -0
- PYME/DSView/modules/prebleachExtraction.py +75 -0
- PYME/DSView/modules/profileFitting.py +137 -0
- PYME/DSView/modules/profilePlotting.py +408 -0
- PYME/DSView/modules/projections.py +48 -0
- PYME/DSView/modules/psfExtraction.py +570 -0
- PYME/DSView/modules/psfGeneration.py +138 -0
- PYME/DSView/modules/psfTools.py +661 -0
- PYME/DSView/modules/pupilTools.py +204 -0
- PYME/DSView/modules/pupilView.py +139 -0
- PYME/DSView/modules/recipes.py +266 -0
- PYME/DSView/modules/redimension.py +75 -0
- PYME/DSView/modules/segmentation.py +192 -0
- PYME/DSView/modules/sheetView.py +24 -0
- PYME/DSView/modules/shell.py +39 -0
- PYME/DSView/modules/shiftfield_estimation.py +433 -0
- PYME/DSView/modules/sparkprepare.py +94 -0
- PYME/DSView/modules/splitter.py +148 -0
- PYME/DSView/modules/synchronise.py +64 -0
- PYME/DSView/modules/templates/astigCal.html +42 -0
- PYME/DSView/modules/templates/measureView.html +69 -0
- PYME/DSView/modules/templates/measureView2.html +48 -0
- PYME/DSView/modules/templates/measureView3.html +98 -0
- PYME/DSView/modules/templates/trackView.html +139 -0
- PYME/DSView/modules/templates/tracksOverview.html +21 -0
- PYME/DSView/modules/tiling.py +147 -0
- PYME/DSView/modules/unmixing.py +148 -0
- PYME/DSView/modules/vis3D.py +320 -0
- PYME/DSView/modules/visgui.py +163 -0
- PYME/DSView/modules/webview.py +14 -0
- PYME/DSView/overlays.py +295 -0
- PYME/DSView/scrolledImagePanel.py +188 -0
- PYME/DSView/setup.py +53 -0
- PYME/DSView/splashScreen.py +158 -0
- PYME/DSView/voxSizeDialog.py +84 -0
- PYME/Deconv/__init__.py +35 -0
- PYME/Deconv/beadGen.py +55 -0
- PYME/Deconv/dec.py +659 -0
- PYME/Deconv/decTask.py +65 -0
- PYME/Deconv/decThread.py +113 -0
- PYME/Deconv/dec_test.py +47 -0
- PYME/Deconv/deconvDialogs.py +417 -0
- PYME/Deconv/fftwWisdom.py +62 -0
- PYME/Deconv/richardsonLucy.py +141 -0
- PYME/Deconv/richardsonLucyMV.py +151 -0
- PYME/Deconv/richardsonLucyMVM.py +218 -0
- PYME/Deconv/test_block_dec.py +46 -0
- PYME/Deconv/tq_block_dec.py +331 -0
- PYME/Deconv/wiener.py +163 -0
- PYME/IO/DataSources/AlignDataSource.py +91 -0
- PYME/IO/DataSources/ArrayDataSource.py +260 -0
- PYME/IO/DataSources/BGSDataSource.py +353 -0
- PYME/IO/DataSources/BaseDataSource.py +457 -0
- PYME/IO/DataSources/BioformatsDataSource.py +178 -0
- PYME/IO/DataSources/BufferedDataSource.py +99 -0
- PYME/IO/DataSources/ClusterPZFDataSource.py +124 -0
- PYME/IO/DataSources/ConcatenatedDataSource.py +56 -0
- PYME/IO/DataSources/CropDataSource.py +243 -0
- PYME/IO/DataSources/DcimgDataSource.py +54 -0
- PYME/IO/DataSources/ElectronsPerSecondDataSource.py +61 -0
- PYME/IO/DataSources/FlatFieldDataSource.py +77 -0
- PYME/IO/DataSources/HDFDataSource.py +160 -0
- PYME/IO/DataSources/HTTPDataSource.py +80 -0
- PYME/IO/DataSources/ImageSeriesDataSource.py +123 -0
- PYME/IO/DataSources/MultiviewDataSource.py +99 -0
- PYME/IO/DataSources/OBFDataSource.py +67 -0
- PYME/IO/DataSources/RandomDataSource.py +23 -0
- PYME/IO/DataSources/SupertileDatasource.py +148 -0
- PYME/IO/DataSources/TQDataSource.py +41 -0
- PYME/IO/DataSources/TiffDataSource.py +193 -0
- PYME/IO/DataSources/TileDataSource.py +91 -0
- PYME/IO/DataSources/UnsplitDataSource.py +92 -0
- PYME/IO/DataSources/__init__.py +59 -0
- PYME/IO/FileUtils/IJLut.py +43 -0
- PYME/IO/FileUtils/RawToHdf5.py +105 -0
- PYME/IO/FileUtils/SPAD.py +54 -0
- PYME/IO/FileUtils/TiffSeqToHdf5.py +87 -0
- PYME/IO/FileUtils/__init__.py +24 -0
- PYME/IO/FileUtils/compHdf.py +39 -0
- PYME/IO/FileUtils/fileID.py +246 -0
- PYME/IO/FileUtils/fnlGen.py +40 -0
- PYME/IO/FileUtils/freeSpace.py +59 -0
- PYME/IO/FileUtils/h5-thumbnailer.py +85 -0
- PYME/IO/FileUtils/h5ExFrames.py +98 -0
- PYME/IO/FileUtils/h5ToTiffSeries.py +50 -0
- PYME/IO/FileUtils/h5r-thumbnailer.py +118 -0
- PYME/IO/FileUtils/h5rFormatDef.py +99 -0
- PYME/IO/FileUtils/h5rToTxt.py +77 -0
- PYME/IO/FileUtils/nameUtils.py +300 -0
- PYME/IO/FileUtils/obf_support.py +538 -0
- PYME/IO/FileUtils/ply.py +147 -0
- PYME/IO/FileUtils/readSpeckle.py +78 -0
- PYME/IO/FileUtils/readTiff.py +64 -0
- PYME/IO/FileUtils/saveTiffStack.py +137 -0
- PYME/IO/FileUtils/setup.py +36 -0
- PYME/IO/FileUtils/sf-thumbnailer.py +76 -0
- PYME/IO/FileUtils/stl.py +44 -0
- PYME/IO/FileUtils/thumbnailDatabase.py +104 -0
- PYME/IO/HTTPSpooler_v2.py +141 -0
- PYME/IO/MetaDataHandler.py +1072 -0
- PYME/IO/PZFFormat.py +375 -0
- PYME/IO/Spooler.py +279 -0
- PYME/IO/__init__.py +12 -0
- PYME/IO/acquisition_backends.py +353 -0
- PYME/IO/buffer_helpers.cp313-win_amd64.dll.a +0 -0
- PYME/IO/buffer_helpers.cp313-win_amd64.pyd +0 -0
- PYME/IO/buffer_helpers.pyx +190 -0
- PYME/IO/buffers.py +291 -0
- PYME/IO/clusterDuplication.py +204 -0
- PYME/IO/clusterExport.py +152 -0
- PYME/IO/clusterGlob.py +108 -0
- PYME/IO/clusterIO.py +1076 -0
- PYME/IO/clusterListing.py +232 -0
- PYME/IO/clusterResults.py +206 -0
- PYME/IO/clusterUpload.py +49 -0
- PYME/IO/cluster_directory.py +419 -0
- PYME/IO/cluster_streaming.py +216 -0
- PYME/IO/compatibility.py +12 -0
- PYME/IO/countdir/__init__.py +5 -0
- PYME/IO/countdir/setup.py +58 -0
- PYME/IO/csv_flavours.py +251 -0
- PYME/IO/dataExporter.py +470 -0
- PYME/IO/dataWrap.py +108 -0
- PYME/IO/dcimg.py +167 -0
- PYME/IO/events.py +161 -0
- PYME/IO/h5File.py +148 -0
- PYME/IO/h5rFile.py +323 -0
- PYME/IO/image.py +1447 -0
- PYME/IO/load_psf.py +26 -0
- PYME/IO/pyme_h5ls.py +58 -0
- PYME/IO/ragged.py +138 -0
- PYME/IO/rgb_image.py +94 -0
- PYME/IO/tabular.py +1338 -0
- PYME/IO/testClusterSpooling.py +199 -0
- PYME/IO/unifiedIO.py +301 -0
- PYME/LMVis/Extras/QPobjectSegment.py +220 -0
- PYME/LMVis/Extras/__init__.py +55 -0
- PYME/LMVis/Extras/animation.py +359 -0
- PYME/LMVis/Extras/annotation.py +78 -0
- PYME/LMVis/Extras/clusterAnalysis.py +460 -0
- PYME/LMVis/Extras/dockedPanel.py +69 -0
- PYME/LMVis/Extras/extra_layers.py +373 -0
- PYME/LMVis/Extras/fiducial.py +230 -0
- PYME/LMVis/Extras/flagZMotionArtifacts.py +60 -0
- PYME/LMVis/Extras/fusionUtils.py +9 -0
- PYME/LMVis/Extras/multiColourAnalysis.py +103 -0
- PYME/LMVis/Extras/multiviewMapping.py +489 -0
- PYME/LMVis/Extras/objectMeasurements.py +246 -0
- PYME/LMVis/Extras/particleTracking.py +272 -0
- PYME/LMVis/Extras/perFrameVariable.py +77 -0
- PYME/LMVis/Extras/photophysics.py +72 -0
- PYME/LMVis/Extras/pointSetGeneration.py +232 -0
- PYME/LMVis/Extras/pointwiseColoc.py +54 -0
- PYME/LMVis/Extras/saved_views.py +125 -0
- PYME/LMVis/Extras/scaleBox.py +115 -0
- PYME/LMVis/Extras/sequentialSpecies.py +125 -0
- PYME/LMVis/Extras/setBGImage.py +74 -0
- PYME/LMVis/Extras/shiftmapGenerator.py +138 -0
- PYME/LMVis/Extras/showShortcuts.py +69 -0
- PYME/LMVis/Extras/snapshot.py +135 -0
- PYME/LMVis/Extras/spherical_harmonics.py +98 -0
- PYME/LMVis/Extras/subsets.py +15 -0
- PYME/LMVis/Extras/surface_fitting.py +52 -0
- PYME/LMVis/Extras/temperaturePlot.py +53 -0
- PYME/LMVis/Extras/vibration.py +112 -0
- PYME/LMVis/VisGUI.py +506 -0
- PYME/LMVis/__init__.py +39 -0
- PYME/LMVis/colourFilterGUI.py +77 -0
- PYME/LMVis/colourPanel.py +491 -0
- PYME/LMVis/displayPane.py +462 -0
- PYME/LMVis/dyeRatios.py +116 -0
- PYME/LMVis/genImageDialog.py +298 -0
- PYME/LMVis/gl_offScreenHandler.py +134 -0
- PYME/LMVis/gl_render.py +1302 -0
- PYME/LMVis/gl_render3D.py +1453 -0
- PYME/LMVis/gl_render3D_shaders.py +1213 -0
- PYME/LMVis/glcanvas_core.py +1157 -0
- PYME/LMVis/imageView.py +752 -0
- PYME/LMVis/imageView2.py +372 -0
- PYME/LMVis/importTextDialog.py +342 -0
- PYME/LMVis/layer_panel.py +231 -0
- PYME/LMVis/layers/AxesOverlayLayer.py +126 -0
- PYME/LMVis/layers/LUTOverlayLayer.py +346 -0
- PYME/LMVis/layers/OverlayLayer.py +46 -0
- PYME/LMVis/layers/ScaleBarOverlayLayer.py +97 -0
- PYME/LMVis/layers/ScaleBoxOverlayLayer.py +181 -0
- PYME/LMVis/layers/SelectionOverlayLayer.py +124 -0
- PYME/LMVis/layers/__init__.py +53 -0
- PYME/LMVis/layers/base.py +319 -0
- PYME/LMVis/layers/image_layer.py +363 -0
- PYME/LMVis/layers/labels.py +186 -0
- PYME/LMVis/layers/layer_defaults.py +97 -0
- PYME/LMVis/layers/mesh.py +378 -0
- PYME/LMVis/layers/octree.py +194 -0
- PYME/LMVis/layers/pointcloud.py +372 -0
- PYME/LMVis/layers/quiver.py +271 -0
- PYME/LMVis/layers/text.py +250 -0
- PYME/LMVis/layers/tracks.py +309 -0
- PYME/LMVis/mv_math.py +78 -0
- PYME/LMVis/objectDarkMeasure.py +120 -0
- PYME/LMVis/pipeline.py +1227 -0
- PYME/LMVis/pipelineView.py +115 -0
- PYME/LMVis/pointSettingsPanel.py +135 -0
- PYME/LMVis/progGraph.py +59 -0
- PYME/LMVis/quadTreeSettings.py +90 -0
- PYME/LMVis/rendGauss.py +158 -0
- PYME/LMVis/renderers.py +576 -0
- PYME/LMVis/sessionpaths.py +136 -0
- PYME/LMVis/setup.py +39 -0
- PYME/LMVis/setup_exe.py +71 -0
- PYME/LMVis/shader_programs/DefaultShaderProgram.py +149 -0
- PYME/LMVis/shader_programs/GLProgram.py +119 -0
- PYME/LMVis/shader_programs/GouraudShaderProgram.py +157 -0
- PYME/LMVis/shader_programs/PointSpriteShaderProgram.py +163 -0
- PYME/LMVis/shader_programs/ShaderProgramFactory.py +54 -0
- PYME/LMVis/shader_programs/TesselShaderProgram.py +47 -0
- PYME/LMVis/shader_programs/WireFrameShaderProgram.py +50 -0
- PYME/LMVis/shader_programs/__init__.py +20 -0
- PYME/LMVis/shader_programs/oit_compositor.py +23 -0
- PYME/LMVis/shader_programs/shader_loader.py +84 -0
- PYME/LMVis/shader_programs/shader_program.py +168 -0
- PYME/LMVis/shader_programs/shaders/bigflatpoints_fs.glsl +16 -0
- PYME/LMVis/shader_programs/shaders/bigpoints_gs.glsl +40 -0
- PYME/LMVis/shader_programs/shaders/bigpointsprites_fs.glsl +20 -0
- PYME/LMVis/shader_programs/shaders/bigspheres_fs.glsl +53 -0
- PYME/LMVis/shader_programs/shaders/compose_fs.glsl +41 -0
- PYME/LMVis/shader_programs/shaders/compose_vs.glsl +25 -0
- PYME/LMVis/shader_programs/shaders/default_fs.glsl +27 -0
- PYME/LMVis/shader_programs/shaders/default_vs.glsl +88 -0
- PYME/LMVis/shader_programs/shaders/flatpoints_fs.glsl +27 -0
- PYME/LMVis/shader_programs/shaders/gouraud_flatpoints_fs.glsl +30 -0
- PYME/LMVis/shader_programs/shaders/gouraud_fs.glsl +26 -0
- PYME/LMVis/shader_programs/shaders/gouraud_oit_fs.glsl +68 -0
- PYME/LMVis/shader_programs/shaders/gouraud_vs.glsl +135 -0
- PYME/LMVis/shader_programs/shaders/image_fs.glsl +60 -0
- PYME/LMVis/shader_programs/shaders/image_vs.glsl +79 -0
- PYME/LMVis/shader_programs/shaders/phong_fs.glsl +43 -0
- PYME/LMVis/shader_programs/shaders/phong_vs.glsl +45 -0
- PYME/LMVis/shader_programs/shaders/pointsprites_fs.glsl +33 -0
- PYME/LMVis/shader_programs/shaders/pointsprites_vs.glsl +77 -0
- PYME/LMVis/shader_programs/shaders/spheres_fs.glsl +102 -0
- PYME/LMVis/shader_programs/shaders/tessel_fs.glsl +23 -0
- PYME/LMVis/shader_programs/shaders/tessel_vs.glsl +37 -0
- PYME/LMVis/shader_programs/shaders/text_fs.glsl +42 -0
- PYME/LMVis/shader_programs/shaders/text_vs.glsl +84 -0
- PYME/LMVis/shader_programs/shaders/widelines_fs.glsl +19 -0
- PYME/LMVis/shader_programs/shaders/widelines_gs.glsl +56 -0
- PYME/LMVis/shader_programs/shaders/widelines_vs.glsl +51 -0
- PYME/LMVis/statusLog.py +57 -0
- PYME/LMVis/triBlobs.py +142 -0
- PYME/LMVis/view_clipping_pane.py +429 -0
- PYME/LMVis/views.py +275 -0
- PYME/LMVis/visCore.py +1005 -0
- PYME/LMVis/visHelpers.py +880 -0
- PYME/LMVis/visHelpersMin.py +230 -0
- PYME/LMVis/workspaceTree.py +238 -0
- PYME/__init__.py +22 -0
- PYME/cluster/HTTPDataServer.py +1063 -0
- PYME/cluster/HTTPRulePusher.py +382 -0
- PYME/cluster/HTTPTaskPusher.py +377 -0
- PYME/cluster/PYMERuleNodeServer.py +192 -0
- PYME/cluster/PYMERuleServer.py +109 -0
- PYME/cluster/__init__.py +0 -0
- PYME/cluster/clusterUI/accounts/__init__.py +0 -0
- PYME/cluster/clusterUI/accounts/admin.py +85 -0
- PYME/cluster/clusterUI/accounts/forms.py +8 -0
- PYME/cluster/clusterUI/accounts/migrations/0001_initial.py +31 -0
- PYME/cluster/clusterUI/accounts/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/accounts/models.py +44 -0
- PYME/cluster/clusterUI/accounts/templates/accounts/user_form.html +13 -0
- PYME/cluster/clusterUI/accounts/templates/registration/initial_complete.html +6 -0
- PYME/cluster/clusterUI/accounts/templates/registration/initial_confirm.html +13 -0
- PYME/cluster/clusterUI/accounts/templates/registration/initial_done.html +7 -0
- PYME/cluster/clusterUI/accounts/templates/registration/verification.html +2 -0
- PYME/cluster/clusterUI/accounts/templates/registration/verification_subject.txt +1 -0
- PYME/cluster/clusterUI/accounts/urls.py +19 -0
- PYME/cluster/clusterUI/accounts/views.py +36 -0
- PYME/cluster/clusterUI/clusterUI/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterUI/settings.py +147 -0
- PYME/cluster/clusterUI/clusterUI/urls.py +31 -0
- PYME/cluster/clusterUI/clusterUI/wsgi.py +16 -0
- PYME/cluster/clusterUI/clusterbrowser/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterbrowser/admin.py +3 -0
- PYME/cluster/clusterUI/clusterbrowser/apps.py +7 -0
- PYME/cluster/clusterUI/clusterbrowser/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterbrowser/models.py +5 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/base.html +129 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/dirlisting.html +231 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/form_new_folder.html +18 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/form_upload_file.html +17 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/clusterbrowser/lightlisting.html +25 -0
- PYME/cluster/clusterUI/clusterbrowser/templates/registration/login.html +38 -0
- PYME/cluster/clusterUI/clusterbrowser/urls.py +10 -0
- PYME/cluster/clusterUI/clusterbrowser/views.py +148 -0
- PYME/cluster/clusterUI/clusterstatus/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterstatus/admin.py +3 -0
- PYME/cluster/clusterUI/clusterstatus/apps.py +7 -0
- PYME/cluster/clusterUI/clusterstatus/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/clusterstatus/models.py +5 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/load_content.html +29 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/queue_info.html +28 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/queue_info_content.html +50 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/status_dash.html +29 -0
- PYME/cluster/clusterUI/clusterstatus/templates/clusterstatus/status_dash_content.html +90 -0
- PYME/cluster/clusterUI/clusterstatus/urls.py +9 -0
- PYME/cluster/clusterUI/clusterstatus/views.py +69 -0
- PYME/cluster/clusterUI/clusterui_tornado.py +117 -0
- PYME/cluster/clusterUI/deploy.py +62 -0
- PYME/cluster/clusterUI/localization/__init__.py +0 -0
- PYME/cluster/clusterUI/localization/admin.py +3 -0
- PYME/cluster/clusterUI/localization/apps.py +7 -0
- PYME/cluster/clusterUI/localization/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/localization/models.py +5 -0
- PYME/cluster/clusterUI/localization/templates/localization/settings_form.html +67 -0
- PYME/cluster/clusterUI/localization/urls.py +10 -0
- PYME/cluster/clusterUI/localization/views.py +170 -0
- PYME/cluster/clusterUI/manage.py +17 -0
- PYME/cluster/clusterUI/recipes/__init__.py +0 -0
- PYME/cluster/clusterUI/recipes/admin.py +3 -0
- PYME/cluster/clusterUI/recipes/migrations/__init__.py +0 -0
- PYME/cluster/clusterUI/recipes/models.py +3 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/extra_inputs.html +35 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/form_recipe.html +82 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/input_list.html +7 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editor.html +28 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editor_common.html +46 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_editrun.html +93 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_standalone.html +100 -0
- PYME/cluster/clusterUI/recipes/templates/recipes/recipe_template.html +109 -0
- PYME/cluster/clusterUI/recipes/urls.py +17 -0
- PYME/cluster/clusterUI/recipes/views.py +109 -0
- PYME/cluster/cluster_of_one.py +204 -0
- PYME/cluster/dataserver_wsgi.py +615 -0
- PYME/cluster/distribution.py +71 -0
- PYME/cluster/rulenodeserver.py +487 -0
- PYME/cluster/rules.py +979 -0
- PYME/cluster/ruleserver.py +1106 -0
- PYME/cluster/status.py +101 -0
- PYME/cluster/taskWorkerHTTP.py +522 -0
- PYME/cluster/webdav.py +1102 -0
- PYME/config.py +659 -0
- PYME/contrib/TextCtrlAutoComplete.py +582 -0
- PYME/contrib/__init__.py +7 -0
- PYME/contrib/aniso/__init__.py +2 -0
- PYME/contrib/aniso/aniso.py +268 -0
- PYME/contrib/auiFloatBook.py +94 -0
- PYME/contrib/congrid.py +127 -0
- PYME/contrib/dispatch/__init__.py +19 -0
- PYME/contrib/dispatch/dispatcher.py +289 -0
- PYME/contrib/gohlke/__init__.py +1 -0
- PYME/contrib/gohlke/_tifffile.cp313-win_amd64.dll.a +0 -0
- PYME/contrib/gohlke/_tifffile.cp313-win_amd64.pyd +0 -0
- PYME/contrib/gohlke/czifile.py +1289 -0
- PYME/contrib/gohlke/fcsfiles.py +514 -0
- PYME/contrib/gohlke/setup.py +54 -0
- PYME/contrib/gohlke/tifffile.py +3095 -0
- PYME/contrib/listctrlMixins.py +896 -0
- PYME/contrib/lzw.py +838 -0
- PYME/contrib/pad/__init__.py +13 -0
- PYME/contrib/pad/info_pad.py +18 -0
- PYME/contrib/pad/pad.py +670 -0
- PYME/contrib/setup.py +38 -0
- PYME/contrib/wxPlotPanel.py +137 -0
- PYME/experimental/SimReconstruction.py +49 -0
- PYME/experimental/__init__.pxd +0 -0
- PYME/experimental/__init__.py +4 -0
- PYME/experimental/_octree.cp313-win_amd64.dll.a +0 -0
- PYME/experimental/_octree.cp313-win_amd64.pyd +0 -0
- PYME/experimental/_octree.pyx +477 -0
- PYME/experimental/_treap.cp313-win_amd64.dll.a +0 -0
- PYME/experimental/_treap.cp313-win_amd64.pyd +0 -0
- PYME/experimental/_treap.pyx +267 -0
- PYME/experimental/_triangle_mesh.cp313-win_amd64.dll.a +0 -0
- PYME/experimental/_triangle_mesh.cp313-win_amd64.pyd +0 -0
- PYME/experimental/_triangle_mesh.pxd +149 -0
- PYME/experimental/_triangle_mesh.pyx +2787 -0
- PYME/experimental/aqavg.py +40 -0
- PYME/experimental/dcimgFileChucker.py +375 -0
- PYME/experimental/dcimgSpoolShim.py +174 -0
- PYME/experimental/dcimg_chuck_test.py +78 -0
- PYME/experimental/dual_marching_cubes.py +801 -0
- PYME/experimental/dual_marching_cubes_v2.py +645 -0
- PYME/experimental/expectationMaximisation.py +298 -0
- PYME/experimental/func_octree.cp313-win_amd64.dll.a +0 -0
- PYME/experimental/func_octree.cp313-win_amd64.pyd +0 -0
- PYME/experimental/func_octree.pyx +381 -0
- PYME/experimental/fusionRadial.py +520 -0
- PYME/experimental/fusionUtils.py +522 -0
- PYME/experimental/isosurface.py +147 -0
- PYME/experimental/labview_spooling_hacks.py +48 -0
- PYME/experimental/marching_cubes.py +811 -0
- PYME/experimental/marching_tetrahedra.py +343 -0
- PYME/experimental/modified_marching_cubes.py +1245 -0
- PYME/experimental/music.py +25 -0
- PYME/experimental/octree.py +188 -0
- PYME/experimental/pSpaceMap.py +34 -0
- PYME/experimental/pointFitConfoc.py +112 -0
- PYME/experimental/scanner_control.py +107 -0
- PYME/experimental/setup.py +109 -0
- PYME/experimental/spark.py +31 -0
- PYME/experimental/tcHist.py +71 -0
- PYME/experimental/treap.py +262 -0
- PYME/experimental/triangle_mesh.py +2287 -0
- PYME/experimental/triangle_mesh_utils.cp313-win_amd64.dll.a +0 -0
- PYME/experimental/triangle_mesh_utils.cp313-win_amd64.pyd +0 -0
- PYME/experimental/triangle_utils.py +87 -0
- PYME/experimental/triangular_mesh.py +2255 -0
- PYME/experimental/zMotionArtifactUtils.py +55 -0
- PYME/localization/FitFactories/AstigGaussFitFR.py +175 -0
- PYME/localization/FitFactories/AstigGaussGPUFitFR.py +326 -0
- PYME/localization/FitFactories/BeadConvolvedAstigGaussFit.py +206 -0
- PYME/localization/FitFactories/ChecksumFR.py +82 -0
- PYME/localization/FitFactories/ChecksumGPUFR.py +213 -0
- PYME/localization/FitFactories/ChecksumMultifitSR.py +86 -0
- PYME/localization/FitFactories/ConfocCOIR.py +93 -0
- PYME/localization/FitFactories/Dumbell3DFitR.py +193 -0
- PYME/localization/FitFactories/DumbellFitR.py +163 -0
- PYME/localization/FitFactories/FFBase.py +403 -0
- PYME/localization/FitFactories/Gauss3DFitR.py +213 -0
- PYME/localization/FitFactories/GaussFitConstrR.py +177 -0
- PYME/localization/FitFactories/GaussMultifitLinesR.py +351 -0
- PYME/localization/FitFactories/GaussMultifitR.py +326 -0
- PYME/localization/FitFactories/GaussMultifitSR.py +373 -0
- PYME/localization/FitFactories/InterpFitR.py +236 -0
- PYME/localization/FitFactories/InterpFitWFR.py +111 -0
- PYME/localization/FitFactories/Interpolators/CSInterpolator.py +148 -0
- PYME/localization/FitFactories/Interpolators/CubeSInterpolatorP.py +121 -0
- PYME/localization/FitFactories/Interpolators/CubicSplineInterpolator.py +69 -0
- PYME/localization/FitFactories/Interpolators/LinearInterpolator.py +135 -0
- PYME/localization/FitFactories/Interpolators/LinearPInterpolatorP.py +95 -0
- PYME/localization/FitFactories/Interpolators/__init__.py +33 -0
- PYME/localization/FitFactories/Interpolators/baseInterpolator.py +202 -0
- PYME/localization/FitFactories/LatFitCOIR.py +82 -0
- PYME/localization/FitFactories/LatGaussFitFR.py +220 -0
- PYME/localization/FitFactories/LatObjFindFR.py +85 -0
- PYME/localization/FitFactories/LatPSFFitR.py +142 -0
- PYME/localization/FitFactories/MultiviewFitInterpNR.py +400 -0
- PYME/localization/FitFactories/PRInterpFitQR.py +192 -0
- PYME/localization/FitFactories/PRInterpFitR.py +223 -0
- PYME/localization/FitFactories/ROIExtractNR.py +93 -0
- PYME/localization/FitFactories/SpecGaussFitFR.py +174 -0
- PYME/localization/FitFactories/SplitterFitCOIR.py +142 -0
- PYME/localization/FitFactories/SplitterFitFNR.py +312 -0
- PYME/localization/FitFactories/SplitterFitFusionR.py +318 -0
- PYME/localization/FitFactories/SplitterFitInterpBNR.py +357 -0
- PYME/localization/FitFactories/SplitterFitInterpNR.py +343 -0
- PYME/localization/FitFactories/SplitterFitScavNR.py +352 -0
- PYME/localization/FitFactories/SplitterMultifitSR.py +410 -0
- PYME/localization/FitFactories/SplitterObjFindR.py +194 -0
- PYME/localization/FitFactories/SplitterROIExtractNR.py +91 -0
- PYME/localization/FitFactories/SplitterShiftEstFR.py +230 -0
- PYME/localization/FitFactories/__init__.py +103 -0
- PYME/localization/FitFactories/fitCommon.py +195 -0
- PYME/localization/FitFactories/zEstimators/__init__.py +29 -0
- PYME/localization/FitFactories/zEstimators/astigEstimator.py +173 -0
- PYME/localization/FitFactories/zEstimators/biplaneEstimator.py +209 -0
- PYME/localization/FitFactories/zEstimators/genericDualEstimator.py +232 -0
- PYME/localization/FitFactories/zEstimators/genericEstimator.py +224 -0
- PYME/localization/FitFactories/zEstimators/priEstimator.py +255 -0
- PYME/localization/MetaDataEdit.py +543 -0
- PYME/localization/Test/30_9_series_A_1.sf +0 -0
- PYME/localization/Test/PRI.md +45 -0
- PYME/localization/Test/PRI_qr.md +52 -0
- PYME/localization/Test/PRI_r.md +52 -0
- PYME/localization/Test/__init__.py +22 -0
- PYME/localization/Test/astig.md +50 -0
- PYME/localization/Test/astigCOI.md +50 -0
- PYME/localization/Test/astig_gauss.md +52 -0
- PYME/localization/Test/astig_pe.md +50 -0
- PYME/localization/Test/astig_splitter.md +66 -0
- PYME/localization/Test/astig_splitterCOI.md +67 -0
- PYME/localization/Test/astig_splitterQ.md +66 -0
- PYME/localization/Test/astig_theory.md +50 -0
- PYME/localization/Test/astig_theory.psf +0 -0
- PYME/localization/Test/astig_theory.tif +0 -0
- PYME/localization/Test/beads1.psf +0 -0
- PYME/localization/Test/beads1.tif +0 -0
- PYME/localization/Test/biplane_splitter.md +75 -0
- PYME/localization/Test/biplane_splitter2.md +103 -0
- PYME/localization/Test/biplane_splitter3.md +115 -0
- PYME/localization/Test/defoc.md +48 -0
- PYME/localization/Test/dumbell_3d.md +52 -0
- PYME/localization/Test/fitTestJig.py +172 -0
- PYME/localization/Test/fitTestJigSCMOS.py +487 -0
- PYME/localization/Test/fitTestJigWC.py +225 -0
- PYME/localization/Test/gauss.md +50 -0
- PYME/localization/Test/gaussCOI.md +50 -0
- PYME/localization/Test/pri_pe.md +50 -0
- PYME/localization/Test/pri_theory.md +51 -0
- PYME/localization/Test/pri_theory.psf +0 -0
- PYME/localization/Test/pri_theory.tif +0 -0
- PYME/localization/Test/psf_astig.psf +0 -0
- PYME/localization/Test/psf_astig.tif +0 -0
- PYME/localization/Test/psf_astig_bg_d.psf +0 -0
- PYME/localization/Test/psf_astig_bg_d.tif +0 -0
- PYME/localization/Test/psf_astig_pe.psf +0 -0
- PYME/localization/Test/psf_astig_pe.tif +0 -0
- PYME/localization/Test/psf_decon.psf +0 -0
- PYME/localization/Test/psf_decon.tif +0 -0
- PYME/localization/Test/psf_decon_pe.psf +0 -0
- PYME/localization/Test/psf_decon_pe.tif +0 -0
- PYME/localization/Test/psf_guess.psf +0 -0
- PYME/localization/Test/splitter.md +63 -0
- PYME/localization/Test/splitter_scav.md +63 -0
- PYME/localization/Test/test.psf +0 -0
- PYME/localization/Test/test.tif +0 -0
- PYME/localization/Test/test_decon.psf +0 -0
- PYME/localization/Test/test_decon.tif +0 -0
- PYME/localization/Test/test_pe.psf +0 -0
- PYME/localization/Test/test_pe.tif +0 -0
- PYME/localization/Test/wf_theory.psf +0 -0
- PYME/localization/Test/wf_theory2.psf +0 -0
- PYME/localization/__init__.py +17 -0
- PYME/localization/autopsf/__init__.py +1 -0
- PYME/localization/autopsf/autopsf.py +486 -0
- PYME/localization/autopsf/roifit.py +310 -0
- PYME/localization/cInterp/__init__.py +24 -0
- PYME/localization/cInterp/cInterp.cp313-win_amd64.dll.a +0 -0
- PYME/localization/cInterp/cInterp.cp313-win_amd64.pyd +0 -0
- PYME/localization/cInterp/setup.py +54 -0
- PYME/localization/cModels/__init__.py +24 -0
- PYME/localization/cModels/gauss_app.cp313-win_amd64.dll.a +0 -0
- PYME/localization/cModels/gauss_app.cp313-win_amd64.pyd +0 -0
- PYME/localization/ofind.py +444 -0
- PYME/localization/ofind3d.py +306 -0
- PYME/localization/ofind_nofilt.py +128 -0
- PYME/localization/ofind_pri.py +478 -0
- PYME/localization/ofind_split.py +399 -0
- PYME/localization/ofind_xcorr.py +351 -0
- PYME/localization/ofind_xcorr_fw.py +441 -0
- PYME/localization/remFitBuf.py +657 -0
- PYME/localization/setup.py +56 -0
- PYME/localization/splitting.py +240 -0
- PYME/localization/twist.py +60 -0
- PYME/misc/TiSettings.py +36 -0
- PYME/misc/TiffImagePlugin.py +838 -0
- PYME/misc/VolProj.py +144 -0
- PYME/misc/__init__.py +25 -0
- PYME/misc/aligned_array.py +10 -0
- PYME/misc/aniso.py +29 -0
- PYME/misc/big_sur_fix.py +20 -0
- PYME/misc/check_for_updates.py +139 -0
- PYME/misc/colormaps.py +199 -0
- PYME/misc/colorsys.py +201 -0
- PYME/misc/computerName.py +33 -0
- PYME/misc/coverslipGeometries.py +60 -0
- PYME/misc/cython_numpy_monkey.py +40 -0
- PYME/misc/depGraph.py +406 -0
- PYME/misc/dirSize.py +31 -0
- PYME/misc/diskCleanup.py +64 -0
- PYME/misc/djangoRecarray.py +57 -0
- PYME/misc/django_widgets.py +27 -0
- PYME/misc/editgrid.py +101 -0
- PYME/misc/eventSpy.py +122 -0
- PYME/misc/exceptions.py +30 -0
- PYME/misc/facsPlot.py +89 -0
- PYME/misc/fbpIcons.py +90 -0
- PYME/misc/fftw_compat.py +28 -0
- PYME/misc/findCycles.py +91 -0
- PYME/misc/fortran_interrupt_defeat.py +43 -0
- PYME/misc/glassModel.py +64 -0
- PYME/misc/hash32.py +41 -0
- PYME/misc/hillcurve.py +88 -0
- PYME/misc/hybrid_ns.py +84 -0
- PYME/misc/kdFit.py +72 -0
- PYME/misc/locate.py +10 -0
- PYME/misc/memUsage.py +65 -0
- PYME/misc/memmap.py +52 -0
- PYME/misc/mock_ctypes.py +28 -0
- PYME/misc/mock_traits.py +59 -0
- PYME/misc/mock_traitsui.py +29 -0
- PYME/misc/pyme_zeroconf.py +287 -0
- PYME/misc/pyro_tracebacks.py +32 -0
- PYME/misc/read_agf.py +605 -0
- PYME/misc/sffake.py +16 -0
- PYME/misc/snells.py +71 -0
- PYME/misc/sqlite_ns.py +132 -0
- PYME/misc/sqlitendarray.py +56 -0
- PYME/misc/taskDef.py +44 -0
- PYME/misc/tempDB.py +56 -0
- PYME/misc/wxThread.py +33 -0
- PYME/misc/zemax.py +259 -0
- PYME/misc/zernike.py +151 -0
- PYME/pyme_warnings.py +70 -0
- PYME/recipes/Recipes/STEDDeconvolution.yaml +14 -0
- PYME/recipes/Recipes/STEDMinistacks.yaml +15 -0
- PYME/recipes/Recipes/STED_COP3.yaml +25 -0
- PYME/recipes/Recipes/blobMeas.yaml +19 -0
- PYME/recipes/Recipes/blobMeas2.yaml +37 -0
- PYME/recipes/Recipes/blobMeasSR.yaml +66 -0
- PYME/recipes/Recipes/coloc.yaml +43 -0
- PYME/recipes/Recipes/coloc_roi_masked.yaml +46 -0
- PYME/recipes/Recipes/multiblob.yaml +38 -0
- PYME/recipes/Recipes/pre_particleTracking.yaml +30 -0
- PYME/recipes/Recipes/segmentAndMeasureLoci.yaml +41 -0
- PYME/recipes/__init__.py +6 -0
- PYME/recipes/acquisition.py +158 -0
- PYME/recipes/bakeshop.py +32 -0
- PYME/recipes/base.py +1393 -0
- PYME/recipes/batchProcess.py +147 -0
- PYME/recipes/filters.py +394 -0
- PYME/recipes/fudges.py +41 -0
- PYME/recipes/graphing.py +108 -0
- PYME/recipes/html_recipe_editor.py +90 -0
- PYME/recipes/localisations.py +1386 -0
- PYME/recipes/machine_learning.py +286 -0
- PYME/recipes/measurement.py +1062 -0
- PYME/recipes/modules.py +50 -0
- PYME/recipes/multiview.py +435 -0
- PYME/recipes/output.py +667 -0
- PYME/recipes/pointcloud.py +510 -0
- PYME/recipes/processing.py +2954 -0
- PYME/recipes/pyramid.py +206 -0
- PYME/recipes/recipe.py +965 -0
- PYME/recipes/recipeGui.py +1029 -0
- PYME/recipes/recipeLayout.py +499 -0
- PYME/recipes/runRecipe.py +140 -0
- PYME/recipes/setup.py +37 -0
- PYME/recipes/simulation.py +91 -0
- PYME/recipes/skfilters.py +143 -0
- PYME/recipes/surface_fitting.py +776 -0
- PYME/recipes/tablefilters.py +275 -0
- PYME/recipes/tracking.py +343 -0
- PYME/recipes/traits.py +157 -0
- PYME/recipes/vertical_recipe_display.py +373 -0
- PYME/resources/__init__.py +23 -0
- PYME/resources/config_template/distributor.yaml +14 -0
- PYME/resources/config_template/nodeserver.yaml +15 -0
- PYME/resources/icons/LUT.png +0 -0
- PYME/resources/icons/YSM_Shield.png +0 -0
- PYME/resources/icons/YSM_logo.png +0 -0
- PYME/resources/icons/arrow.png +0 -0
- PYME/resources/icons/crosshairs.png +0 -0
- PYME/resources/icons/line_select.png +0 -0
- PYME/resources/icons/logo_fmhs.png +0 -0
- PYME/resources/icons/media-playback-pause.png +0 -0
- PYME/resources/icons/media-playback-start.png +0 -0
- PYME/resources/icons/media-skip-backward.png +0 -0
- PYME/resources/icons/media-skip-forward.png +0 -0
- PYME/resources/icons/mesh.png +0 -0
- PYME/resources/icons/mesh.svg +28 -0
- PYME/resources/icons/pmacquire.icns +0 -0
- PYME/resources/icons/pmacquire.ico +0 -0
- PYME/resources/icons/pmanal.icns +0 -0
- PYME/resources/icons/pmanal.ico +0 -0
- PYME/resources/icons/pmvis.icns +0 -0
- PYME/resources/icons/pmvis.ico +0 -0
- PYME/resources/icons/points.png +0 -0
- PYME/resources/icons/points.svg +16 -0
- PYME/resources/icons/pymeLogo.png +0 -0
- PYME/resources/icons/rect_select.png +0 -0
- PYME/resources/icons/squiggle_select.png +0 -0
- PYME/resources/icons/text3800.icns +0 -0
- PYME/resources/icons/text3800.ico +0 -0
- PYME/resources/icons/text3800.png +0 -0
- PYME/resources/icons/text3800.tif +0 -0
- PYME/resources/icons/text5377.icns +0 -0
- PYME/resources/icons/text5377.ico +0 -0
- PYME/resources/icons/text5377.png +0 -0
- PYME/resources/icons/tracks.png +0 -0
- PYME/resources/icons/tracks.svg +19 -0
- PYME/resources/icons/view-front.png +0 -0
- PYME/resources/icons/view-home.png +0 -0
- PYME/resources/icons/view-right.png +0 -0
- PYME/resources/icons/view-top.png +0 -0
- PYME/resources/test_datasets/README.md +8 -0
- PYME/resources/test_datasets/t_im.tif +0 -0
- PYME/resources/test_datasets/test_csv.csv +4282 -0
- PYME/resources/test_datasets/test_hdf.hdf +0 -0
- PYME/resources/web/rule_inline.html +21 -0
- PYME/resources/web/ruleserver.html +75 -0
- PYME/resources/web/static/bootstrap.min.js +7 -0
- PYME/resources/web/static/cluster.css +137 -0
- PYME/resources/web/static/css/bootstrap-theme.css +587 -0
- PYME/resources/web/static/css/bootstrap-theme.min.css +6 -0
- PYME/resources/web/static/css/bootstrap.css +6757 -0
- PYME/resources/web/static/css/bootstrap.min.css +6 -0
- PYME/resources/web/static/css/flat_design_colors_full.css +306 -0
- PYME/resources/web/static/css/recipe_editor.css +106 -0
- PYME/resources/web/static/dashboard.css +106 -0
- PYME/resources/web/static/fileselector.js +77 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.eot +0 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.svg +288 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.ttf +0 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.woff +0 -0
- PYME/resources/web/static/fonts/glyphicons-halflings-regular.woff2 +0 -0
- PYME/resources/web/static/images/osd_flat/LICENSE.txt +116 -0
- PYME/resources/web/static/images/osd_flat/README.md +9 -0
- PYME/resources/web/static/images/osd_flat/fullpage_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/fullpage_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/fullpage_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/fullpage_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/home_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/next_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/previous_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateleft_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/rotateright_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomin_rest.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_grouphover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_hover.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_pressed.png +0 -0
- PYME/resources/web/static/images/osd_flat/zoomout_rest.png +0 -0
- PYME/resources/web/static/jigna-vue-bare.js +1395 -0
- PYME/resources/web/static/jquery.min.js +2 -0
- PYME/resources/web/static/jstree.min.js +6 -0
- PYME/resources/web/static/openSeadragonGL.js +102 -0
- PYME/resources/web/static/openseadragon-svg-overlay.js +103 -0
- PYME/resources/web/static/openseadragon-viewerinputhook.min.js +6 -0
- PYME/resources/web/static/openseadragon.min.js +9 -0
- PYME/resources/web/static/recipe_editor.js +119 -0
- PYME/resources/web/static/shaders/fragment/lut.glsl +20 -0
- PYME/resources/web/static/shaders/fragment/none.glsl +17 -0
- PYME/resources/web/static/shaders/fragment/outline.glsl +43 -0
- PYME/resources/web/static/shaders/fragment/rect.glsl +7 -0
- PYME/resources/web/static/shaders/fragment/sobel3.glsl +71 -0
- PYME/resources/web/static/shaders/fragment/white.glsl +4 -0
- PYME/resources/web/static/shaders/vertex/rect.glsl +22 -0
- PYME/resources/web/static/shaders/vertex/square.glsl +9 -0
- PYME/resources/web/static/utils.js +3 -0
- PYME/resources/web/static/viaWebGL.js +217 -0
- PYME/setup.py +109 -0
- PYME/setup_exe.py +57 -0
- PYME/simulation/__init__.py +0 -0
- PYME/simulation/locify.py +319 -0
- PYME/simulation/pointsets.py +279 -0
- PYME/simulation/wormlike.py +99 -0
- PYME/simulation/wormlike2.py +198 -0
- PYME/simulation/wormlike3.py +197 -0
- PYME/simulation/wormlike_curled.py +104 -0
- PYME/tileviewer/__init__.py +0 -0
- PYME/tileviewer/templates/roi_list.html +12 -0
- PYME/tileviewer/templates/tileviewer.html +247 -0
- PYME/tileviewer/tileviewer.py +207 -0
- PYME/ui/AUIFrame.py +279 -0
- PYME/ui/MetadataTree.py +469 -0
- PYME/ui/__init__.py +4 -0
- PYME/ui/about_dlg.py +29 -0
- PYME/ui/autoFoldPanel.py +643 -0
- PYME/ui/cascading_layout.py +45 -0
- PYME/ui/crop_dialog.py +145 -0
- PYME/ui/custom_traits_editors.py +508 -0
- PYME/ui/editFilterDialog.py +80 -0
- PYME/ui/editList.py +40 -0
- PYME/ui/fastGraph.py +240 -0
- PYME/ui/filterPane.py +348 -0
- PYME/ui/histLimits.py +543 -0
- PYME/ui/layerFoldPanel.py +232 -0
- PYME/ui/manualFoldPanel.py +870 -0
- PYME/ui/mytimer.py +116 -0
- PYME/ui/patch_traitsui.py +151 -0
- PYME/ui/progress.py +160 -0
- PYME/ui/recArrayView.py +145 -0
- PYME/ui/selection.py +71 -0
- PYME/ui/shell.py +37 -0
- PYME/ui/traitsui_constants.py +91 -0
- PYME/ui/wx_compat.py +43 -0
- PYME/update_version.py +159 -0
- PYME/util/__init__.py +3 -0
- PYME/util/authenticate.py +164 -0
- PYME/util/execfile.py +21 -0
- PYME/util/fProfile/__init__.py +1 -0
- PYME/util/fProfile/convertProfile.py +117 -0
- PYME/util/fProfile/fProfile.py +162 -0
- PYME/util/fProfile/html/404.html +60 -0
- PYME/util/fProfile/html/css/main.css +258 -0
- PYME/util/fProfile/html/css/normalize.css +427 -0
- PYME/util/fProfile/html/css/normalize.min.css +1 -0
- PYME/util/fProfile/html/index.html +64 -0
- PYME/util/fProfile/html/js/main.js +492 -0
- PYME/util/fProfile/html/js/plugins.js +24 -0
- PYME/util/fProfile/html/js/vendor/crossfilter.min.js +1 -0
- PYME/util/fProfile/html/js/vendor/jquery-1.11.2.min.js +4 -0
- PYME/util/fProfile/html/js/vendor/modernizr-2.8.3.min.js +4 -0
- PYME/util/fProfile/html/js/vendor/tinycolor-min.js +4 -0
- PYME/util/fProfile/viewProfile.py +30 -0
- PYME/util/install_dependencies.py +95 -0
- PYME/util/log_verbosity.py +11 -0
- PYME/util/mProfile/__init__.py +1 -0
- PYME/util/mProfile/colorize_db_t.py +297 -0
- PYME/util/mProfile/mProfile.py +164 -0
- PYME/util/mProfile/p.py +101 -0
- PYME/util/mProfile/tProfile.py +165 -0
- PYME/util/pymelauncher.py +47 -0
- PYME/util/shmarray/__init__.py +0 -0
- PYME/util/shmarray/shmTest.py +74 -0
- PYME/util/shmarray/shmarray.py +165 -0
- PYME/util/webframework.py +365 -0
- PYME/version.py +62 -0
- python_microscopy-25.11.20.dist-info/METADATA +68 -0
- python_microscopy-25.11.20.dist-info/RECORD +1278 -0
- python_microscopy-25.11.20.dist-info/WHEEL +4 -0
- python_microscopy-25.11.20.dist-info/entry_points.txt +18 -0
|
@@ -0,0 +1,909 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Estimate spherical harmonics from a point data set
|
|
3
|
+
Initial fitting/conversions ripped 100% from David Baddeley / scipy
|
|
4
|
+
"""
|
|
5
|
+
from PYME.IO.image import ImageBounds
|
|
6
|
+
import numpy as np
|
|
7
|
+
from scipy.special import sph_harm
|
|
8
|
+
from scipy import linalg
|
|
9
|
+
from PYME.Analysis.points import coordinate_tools
|
|
10
|
+
from scipy import optimize
|
|
11
|
+
import logging
|
|
12
|
+
|
|
13
|
+
logger = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def r_sph_harm(m, n, azimuth, zenith):
|
|
17
|
+
"""
|
|
18
|
+
return real valued spherical harmonics. Uses the convention that m > 0 corresponds to the cosine terms, m < zero the
|
|
19
|
+
sine terms
|
|
20
|
+
|
|
21
|
+
Parameters
|
|
22
|
+
----------
|
|
23
|
+
m : int
|
|
24
|
+
order of the spherical harmonic, |m| <= n
|
|
25
|
+
n : int
|
|
26
|
+
degree of the spherical harmonic, n >= 0
|
|
27
|
+
|
|
28
|
+
azimuth : ndarray
|
|
29
|
+
the azimuth angle in [0, 2pi]
|
|
30
|
+
zenith : ndarray
|
|
31
|
+
the elevation in [0, pi]
|
|
32
|
+
|
|
33
|
+
Returns
|
|
34
|
+
-------
|
|
35
|
+
|
|
36
|
+
"""
|
|
37
|
+
if m > 0:
|
|
38
|
+
return (1. / np.sqrt(2) * (-1) ** m) * sph_harm(m, n, azimuth, zenith).real
|
|
39
|
+
elif m == 0:
|
|
40
|
+
return sph_harm(m, n, azimuth, zenith).real
|
|
41
|
+
else:
|
|
42
|
+
return (1. / np.sqrt(2) * (-1.0) ** m) * sph_harm(m, n, azimuth, zenith).imag
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def sphere_expansion(x, y, z, n_max=3):
|
|
46
|
+
"""
|
|
47
|
+
Project coordinates onto spherical harmonics
|
|
48
|
+
|
|
49
|
+
Parameters
|
|
50
|
+
----------
|
|
51
|
+
x : ndarray
|
|
52
|
+
x coordinates
|
|
53
|
+
y : ndarray
|
|
54
|
+
y coordinates
|
|
55
|
+
z : ndarray
|
|
56
|
+
z coordinates
|
|
57
|
+
n_max : int
|
|
58
|
+
Maximum order to calculate to
|
|
59
|
+
|
|
60
|
+
Returns
|
|
61
|
+
-------
|
|
62
|
+
|
|
63
|
+
modes : list of tuples
|
|
64
|
+
a list of the (m, n) modes projected onto
|
|
65
|
+
c : ndarray
|
|
66
|
+
the mode coefficients
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
azimuth, zenith, r = coordinate_tools.cartesian_to_spherical(x, y, z)
|
|
72
|
+
|
|
73
|
+
A = []
|
|
74
|
+
modes = []
|
|
75
|
+
for n in range(n_max + 1):
|
|
76
|
+
for m in range(-n, n + 1):
|
|
77
|
+
sp_mode = r_sph_harm(m, n, azimuth, zenith)
|
|
78
|
+
A.append(sp_mode)
|
|
79
|
+
|
|
80
|
+
modes.append((m, n))
|
|
81
|
+
|
|
82
|
+
A = np.vstack(A)
|
|
83
|
+
|
|
84
|
+
c = linalg.lstsq(A.T, r)[0]
|
|
85
|
+
|
|
86
|
+
return modes, c
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def sphere_expansion_clean(x, y, z, n_max=3, max_iters=2, tol_init=0.3):
|
|
90
|
+
"""
|
|
91
|
+
Project coordinates onto spherical harmonics
|
|
92
|
+
|
|
93
|
+
Parameters
|
|
94
|
+
----------
|
|
95
|
+
x : ndarray
|
|
96
|
+
x coordinates
|
|
97
|
+
y : ndarray
|
|
98
|
+
y coordinates
|
|
99
|
+
z : ndarray
|
|
100
|
+
z coordinates
|
|
101
|
+
n_max : int
|
|
102
|
+
Maximum order to calculate to
|
|
103
|
+
max_iters: int
|
|
104
|
+
number of fit iterations
|
|
105
|
+
tol_init: float
|
|
106
|
+
relative outlier tolerance. Used to ignore outliers in subsequent iterations
|
|
107
|
+
|
|
108
|
+
Returns
|
|
109
|
+
-------
|
|
110
|
+
|
|
111
|
+
modes : list of tuples
|
|
112
|
+
a list of the (m, n) modes projected onto
|
|
113
|
+
c : ndarray
|
|
114
|
+
the mode coefficients
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
"""
|
|
118
|
+
|
|
119
|
+
azimuth, zenith, r = coordinate_tools.cartesian_to_spherical(x, y, z)
|
|
120
|
+
|
|
121
|
+
A = []
|
|
122
|
+
modes = []
|
|
123
|
+
for n in range(n_max + 1):
|
|
124
|
+
for m in range(-n, n + 1):
|
|
125
|
+
sp_mode = r_sph_harm(m, n, azimuth, zenith)
|
|
126
|
+
A.append(sp_mode)
|
|
127
|
+
|
|
128
|
+
modes.append((m, n))
|
|
129
|
+
|
|
130
|
+
A = np.vstack(A).T
|
|
131
|
+
|
|
132
|
+
tol = tol_init
|
|
133
|
+
|
|
134
|
+
c = linalg.lstsq(A, r)[0]
|
|
135
|
+
|
|
136
|
+
# recompute, discarding outliers
|
|
137
|
+
for i in range(max_iters):
|
|
138
|
+
pred = np.dot(A, c)
|
|
139
|
+
error = abs(r - pred) / r
|
|
140
|
+
mask = error < tol
|
|
141
|
+
# print mask.sum(), len(mask)
|
|
142
|
+
|
|
143
|
+
c, summed_residuals, rank, singular_values = linalg.lstsq(A[mask, :], r[mask])
|
|
144
|
+
tol /= 2
|
|
145
|
+
|
|
146
|
+
return modes, c, summed_residuals
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
AXES = np.stack([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]], axis=1)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def reconstruct_shell(modes, coeffs, azimuth, zenith):
|
|
153
|
+
r = 0
|
|
154
|
+
# TODO save some compute by using a single call for + and - m modes
|
|
155
|
+
cache = {}
|
|
156
|
+
for (m, n), c in zip(modes, coeffs):
|
|
157
|
+
if m == 0:
|
|
158
|
+
r += c*sph_harm(m, n, azimuth, zenith).real
|
|
159
|
+
else:
|
|
160
|
+
k = (abs(m), n) # sph_harm returns both +m and -m as real and imag parts, make sure we don't evaluate twice
|
|
161
|
+
try:
|
|
162
|
+
s = cache[k]
|
|
163
|
+
except KeyError:
|
|
164
|
+
s = sph_harm(m,n,azimuth, zenith)
|
|
165
|
+
cache[k] = s
|
|
166
|
+
|
|
167
|
+
if m > 0:
|
|
168
|
+
r += (c * ((1. / np.sqrt(2) * (-1) ** m) *s.real)).astype(azimuth.dtype)
|
|
169
|
+
else:
|
|
170
|
+
r += (c * ((1. / np.sqrt(2) * (-1) ** m) *s.imag)).astype(azimuth.dtype)
|
|
171
|
+
|
|
172
|
+
return r
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def scaled_shell_from_hdf(hdf_file, table_name='harmonic_shell'):
|
|
176
|
+
"""
|
|
177
|
+
|
|
178
|
+
Parameters
|
|
179
|
+
----------
|
|
180
|
+
hdf_file : str or tables.file.File
|
|
181
|
+
path to hdf file or opened hdf file
|
|
182
|
+
table_name : str
|
|
183
|
+
name of the table containing the spherical harmonic expansion information
|
|
184
|
+
|
|
185
|
+
Returns
|
|
186
|
+
-------
|
|
187
|
+
shell : ScaledShell
|
|
188
|
+
see nucleus.spherical_harmonics.shell_tools.ScaledShell
|
|
189
|
+
|
|
190
|
+
"""
|
|
191
|
+
from PYME.IO.MetaDataHandler import HDFMDHandler
|
|
192
|
+
from PYME.IO import tabular
|
|
193
|
+
import tables
|
|
194
|
+
try:
|
|
195
|
+
opened_hdf_file = tables.open_file(hdf_file, 'r')
|
|
196
|
+
except TypeError:
|
|
197
|
+
opened_hdf_file = hdf_file
|
|
198
|
+
|
|
199
|
+
shell_table = tabular.HDFSource(opened_hdf_file, table_name)
|
|
200
|
+
shell_table.mdh = HDFMDHandler(opened_hdf_file)
|
|
201
|
+
|
|
202
|
+
return ScaledShell.from_tabular(shell_table)
|
|
203
|
+
|
|
204
|
+
def generate_icosahedron():
|
|
205
|
+
"""
|
|
206
|
+
Generate an icosahedron in spherical coordinates.
|
|
207
|
+
|
|
208
|
+
Returns
|
|
209
|
+
-------
|
|
210
|
+
azimuth : np.array
|
|
211
|
+
Length 12, azimuth of icosahedron vertices [0, 2*pi].
|
|
212
|
+
zenith : np.array
|
|
213
|
+
Length 12, zenith of icosahedron vertices [0, pi].
|
|
214
|
+
faces : np.array
|
|
215
|
+
20 x 3, counterclockwise triangles denoting icosahedron faces.
|
|
216
|
+
"""
|
|
217
|
+
t = np.arctan(0.5)+np.pi/2
|
|
218
|
+
zenith = np.hstack([0, np.array(5*[np.pi-t,t]).ravel(), np.pi]) # [0, pi]
|
|
219
|
+
azimuth = np.hstack([0, np.arange(0, 2*np.pi, np.pi/5), 0]) # [0, 2*pi]
|
|
220
|
+
idxs = np.arange(len(zenith))[1:-1]
|
|
221
|
+
upper_middle_strip = np.vstack([[v0,v2,v1] for v0,v1,v2 in
|
|
222
|
+
zip(idxs[::2],idxs[1::2],np.roll(idxs[::2],-1))])
|
|
223
|
+
lower_middle_strip = np.vstack([[v0,v2,v1] for v0,v1,v2 in
|
|
224
|
+
zip(np.roll(idxs[::2],-1),idxs[1::2],np.roll(idxs[1::2],-1))])
|
|
225
|
+
upper_cap = np.vstack([[v0,v2,v1] for v0,v1,v2 in
|
|
226
|
+
zip(np.zeros(5),idxs[::2],np.roll(idxs[::2],-1))])
|
|
227
|
+
lower_cap = np.vstack([[v0,v2,v1] for v0,v1,v2 in
|
|
228
|
+
zip(11*np.ones(5),np.roll(idxs[1::2],-1),idxs[1::2])])
|
|
229
|
+
faces = np.vstack([upper_cap, upper_middle_strip, lower_middle_strip, lower_cap]).astype(int)
|
|
230
|
+
|
|
231
|
+
return azimuth, zenith, faces
|
|
232
|
+
|
|
233
|
+
def icosahedron_mesh(n_subdivision=1):
|
|
234
|
+
"""
|
|
235
|
+
Return an icosahedron subdivided n_subdivision times. This provides a
|
|
236
|
+
quasi-regular sampling of the unit sphere. ::
|
|
237
|
+
|
|
238
|
+
v0 v0
|
|
239
|
+
/ \ / \
|
|
240
|
+
/ \ ==> v3----v5
|
|
241
|
+
/ \ / \ / \
|
|
242
|
+
v1------v2 v1--v4--v2
|
|
243
|
+
|
|
244
|
+
Returns
|
|
245
|
+
-------
|
|
246
|
+
azimuth : np.array
|
|
247
|
+
Azimuth of mesh vertices [0, 2*pi].
|
|
248
|
+
zenith : np.array
|
|
249
|
+
Zenith of mesh vertices [0, pi].
|
|
250
|
+
faces : np.array
|
|
251
|
+
20 x 3, counterclockwise triangles denoting mesh faces.
|
|
252
|
+
"""
|
|
253
|
+
|
|
254
|
+
# First, generate the icosahedron
|
|
255
|
+
azimuth, zenith, faces = generate_icosahedron()
|
|
256
|
+
|
|
257
|
+
if n_subdivision < 1:
|
|
258
|
+
# We don't need to do anything
|
|
259
|
+
return azimuth, zenith, faces
|
|
260
|
+
|
|
261
|
+
# Convert pole azimuth to np.nan so we can ignore pole azimuth (irrelevant, detrimental)
|
|
262
|
+
azimuth[0], azimuth[-1] = np.nan, np.nan
|
|
263
|
+
|
|
264
|
+
# Make azimuth and zenith complex numbers (to deal with phase wrapping)
|
|
265
|
+
azimuth, zenith = np.exp(1j*azimuth), np.exp(1j*zenith)
|
|
266
|
+
|
|
267
|
+
for k in range(n_subdivision):
|
|
268
|
+
# Average each edge to get new vertex at the center of each face v0,v1,v2
|
|
269
|
+
az_v3 = np.nanmean(azimuth[faces[:,[0,1]]],axis=1)
|
|
270
|
+
az_v4 = np.nanmean(azimuth[faces[:,[1,2]]],axis=1)
|
|
271
|
+
az_v5 = np.nanmean(azimuth[faces[:,[2,0]]],axis=1)
|
|
272
|
+
new_az = np.hstack([az_v3, az_v4, az_v5])
|
|
273
|
+
ze_v3 = np.nanmean(zenith[faces[:,[0,1]]],axis=1)
|
|
274
|
+
ze_v4 = np.nanmean(zenith[faces[:,[1,2]]],axis=1)
|
|
275
|
+
ze_v5 = np.nanmean(zenith[faces[:,[2,0]]],axis=1)
|
|
276
|
+
new_ze = np.hstack([ze_v3, ze_v4, ze_v5])
|
|
277
|
+
|
|
278
|
+
# Create new vertices, eliminating duplicates (there should be two of each
|
|
279
|
+
# new vertex, one from each face sharing an edge)
|
|
280
|
+
new_v, new_idxs = np.unique(np.vstack([new_az,new_ze]).T, axis=0, return_inverse=True)
|
|
281
|
+
new_idxs += len(azimuth)
|
|
282
|
+
new_idxs = new_idxs.reshape(3,-1).T # v3 = new_idxs[:,0], v4 = new_idxs[:,1], v5 = new_idxs[:,2]
|
|
283
|
+
|
|
284
|
+
# Create new faces (4 faces per old face)
|
|
285
|
+
f0 = np.vstack([faces[:,0], new_idxs[:,0], new_idxs[:,2]]).T
|
|
286
|
+
f1 = np.vstack([faces[:,1], new_idxs[:,1], new_idxs[:,0]]).T
|
|
287
|
+
f2 = np.vstack([faces[:,2], new_idxs[:,2], new_idxs[:,1]]).T
|
|
288
|
+
faces = np.vstack([f0,f1,f2,new_idxs]).astype(int)
|
|
289
|
+
|
|
290
|
+
# Append the new vertices to azimuth
|
|
291
|
+
azimuth = np.hstack([azimuth, new_v[:,0]])
|
|
292
|
+
zenith = np.hstack([zenith, new_v[:,1]])
|
|
293
|
+
|
|
294
|
+
# Restore poles to azimuth 0 for future conversion to real coordinates
|
|
295
|
+
azimuth[np.isnan(azimuth)] = 0
|
|
296
|
+
|
|
297
|
+
# Back to angles with you
|
|
298
|
+
azimuth, zenith = np.angle(azimuth), np.angle(zenith)
|
|
299
|
+
azimuth[azimuth<0] = azimuth[azimuth<0]+2*np.pi # wrap to [0, 2*pi]
|
|
300
|
+
zenith = np.abs(zenith) # wrap to [0, pi]
|
|
301
|
+
|
|
302
|
+
return azimuth, zenith, faces
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
class ScaledShell(object):
|
|
306
|
+
data_type = [
|
|
307
|
+
('modes', '<2i4'),
|
|
308
|
+
('coefficients', '<f4'),
|
|
309
|
+
]
|
|
310
|
+
|
|
311
|
+
def __init__(self, sampling_fraction=1.):
|
|
312
|
+
self.sampling_fraction = sampling_fraction
|
|
313
|
+
self.modes = None
|
|
314
|
+
self.coefficients = None
|
|
315
|
+
|
|
316
|
+
self.x, self.y, self.z, = None, None, None
|
|
317
|
+
self.x0, self.y0, self.z0 = None, None, None
|
|
318
|
+
self.x_c, self.y_c, self.z_c, = None, None, None
|
|
319
|
+
# note that all scalings will be centered
|
|
320
|
+
self.x_cs, self.y_cs, self.z_cs, = None, None, None
|
|
321
|
+
|
|
322
|
+
self.standard_deviations, self.principal_axes = None, None
|
|
323
|
+
self.scaling_factors = None
|
|
324
|
+
self._table_repr = None
|
|
325
|
+
|
|
326
|
+
@property
|
|
327
|
+
def table_representation(self):
|
|
328
|
+
if self._table_repr is None:
|
|
329
|
+
self._update_table_repr()
|
|
330
|
+
|
|
331
|
+
return self._table_repr
|
|
332
|
+
|
|
333
|
+
def _update_table_repr(self):
|
|
334
|
+
from PYME.IO import tabular
|
|
335
|
+
self._table_repr = tabular.scalar_column_source(
|
|
336
|
+
standard_deviations=self.standard_deviations,
|
|
337
|
+
scaling_factors = self.scaling_factors,
|
|
338
|
+
principal_axes = self.principal_axes,
|
|
339
|
+
summed_residuals = self._summed_residuals,
|
|
340
|
+
n_points_fitted = len(self.x),
|
|
341
|
+
x0 = self.x0,
|
|
342
|
+
y0 = self.y0,
|
|
343
|
+
z0 = self.z0,
|
|
344
|
+
sampling_fraction = self.sampling_fraction,
|
|
345
|
+
modes = np.asarray(self.modes, dtype='i4'),
|
|
346
|
+
coefficients=np.asarray(self.coefficients, dtype='f4'),
|
|
347
|
+
)
|
|
348
|
+
|
|
349
|
+
def to_recarray(self, keys=None):
|
|
350
|
+
"""
|
|
351
|
+
|
|
352
|
+
Pretend we are a PYME.IO.tabular type
|
|
353
|
+
|
|
354
|
+
Parameters
|
|
355
|
+
----------
|
|
356
|
+
keys : None
|
|
357
|
+
Ignored for this contrived function
|
|
358
|
+
|
|
359
|
+
Returns
|
|
360
|
+
-------
|
|
361
|
+
numpy recarray version of self
|
|
362
|
+
|
|
363
|
+
"""
|
|
364
|
+
|
|
365
|
+
return self.table_representation.to_recarray(self, keys=keys)
|
|
366
|
+
|
|
367
|
+
def to_hdf(self, *args, **kwargs):
|
|
368
|
+
return self.table_representation.to_hdf(*args, **kwargs)
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
@staticmethod
|
|
372
|
+
def from_tabular(shell_table, index=0):
|
|
373
|
+
shell = ScaledShell()
|
|
374
|
+
|
|
375
|
+
if len(shell_table.keys() == 2):
|
|
376
|
+
# old legacy format which stores data in metadata
|
|
377
|
+
|
|
378
|
+
shell.standard_deviations = np.asarray(shell_table.mdh['spherical_harmonic_shell.standard_deviations'])
|
|
379
|
+
shell.scaling_factors = np.asarray(shell_table.mdh['spherical_harmonic_shell.scaling_factors'])
|
|
380
|
+
shell.principal_axes = np.asarray(shell_table.mdh['spherical_harmonic_shell.principal_axes'])
|
|
381
|
+
|
|
382
|
+
shell.x0 = shell_table.mdh['spherical_harmonic_shell.x0']
|
|
383
|
+
shell.y0 = shell_table.mdh['spherical_harmonic_shell.y0']
|
|
384
|
+
shell.z0 = shell_table.mdh['spherical_harmonic_shell.z0']
|
|
385
|
+
|
|
386
|
+
shell._summed_residuals = shell_table.mdh['spherical_harmonic_shell.summed_residuals']
|
|
387
|
+
shell.sampling_fraction = shell_table.mdh['spherical_harmonic_shell.sampling_fraction']
|
|
388
|
+
|
|
389
|
+
shell._set_coefficients(shell_table['modes'], shell_table['coefficients'])
|
|
390
|
+
|
|
391
|
+
else:
|
|
392
|
+
#new format which stores everything in one table
|
|
393
|
+
shell.standard_deviations = shell_table['standard_deviations'][index]
|
|
394
|
+
shell.scaling_factors = shell_table['scaling_factors'][index]
|
|
395
|
+
shell.principal_axes = shell_table['principal_axes'][index]
|
|
396
|
+
|
|
397
|
+
shell.x0 = shell_table['x0'][index]
|
|
398
|
+
shell.y0 = shell_table['y0'][index]
|
|
399
|
+
shell.z0 = shell_table['z0'][index]
|
|
400
|
+
|
|
401
|
+
shell._summed_residuals = shell_table['summed_residuals'][index]
|
|
402
|
+
shell.sampling_fraction = shell_table['sampling_fraction'][index]
|
|
403
|
+
|
|
404
|
+
shell._set_coefficients(shell_table['modes'][index], shell_table['coefficients'][index])
|
|
405
|
+
|
|
406
|
+
return shell
|
|
407
|
+
|
|
408
|
+
|
|
409
|
+
def _set_coefficients(self, modes, coefficients):
|
|
410
|
+
assert len(modes) == len(coefficients)
|
|
411
|
+
self.modes = modes
|
|
412
|
+
self.coefficients = coefficients
|
|
413
|
+
|
|
414
|
+
def set_fitting_points(self, x, y, z):
|
|
415
|
+
from PYME.IO.image import ImageBounds
|
|
416
|
+
|
|
417
|
+
assert (x.shape == y.shape) and (y.shape == z.shape)
|
|
418
|
+
self.x, self.y, self.z = x.astype(np.float32, copy=True), y.astype(np.float32, copy=True), z.astype(np.float32, copy=True)
|
|
419
|
+
|
|
420
|
+
#does it really make sense to use ImageBounds here??
|
|
421
|
+
self._fitting_point_bounds = ImageBounds(self.x.min(), self.y.min(),
|
|
422
|
+
self.x.max(), self.y.max(),
|
|
423
|
+
self.z.min(), self.z.max())
|
|
424
|
+
self.x0, self.y0, self.z0 = self.x.mean(), self.y.mean(), self.z.mean()
|
|
425
|
+
|
|
426
|
+
self.x_c, self.y_c, self.z_c = self.x - self.x0, self.y - self.y0, self.z - self.z0
|
|
427
|
+
|
|
428
|
+
self._scale_fitting_points()
|
|
429
|
+
|
|
430
|
+
def _scale_fitting_points(self):
|
|
431
|
+
self.standard_deviations, self.principal_axes = coordinate_tools.find_principle_axes(self.x_c, self.y_c, self.z_c,
|
|
432
|
+
sample_fraction=self.sampling_fraction)
|
|
433
|
+
self.scaling_factors = np.max(self.standard_deviations) /(self.standard_deviations)
|
|
434
|
+
self.x_cs, self.y_cs, self.z_cs, = coordinate_tools.scaled_projection(self.x_c, self.y_c, self.z_c,
|
|
435
|
+
self.scaling_factors, self.principal_axes)
|
|
436
|
+
|
|
437
|
+
def shell_coordinates(self, points):
|
|
438
|
+
"""Scale query points, projecting them onto the basis used in shell-
|
|
439
|
+
fitting. Return in scaled spherical coordinates
|
|
440
|
+
|
|
441
|
+
Parameters
|
|
442
|
+
----------
|
|
443
|
+
points : 3-tuple
|
|
444
|
+
x, y, z positions
|
|
445
|
+
|
|
446
|
+
Returns
|
|
447
|
+
-------
|
|
448
|
+
azimuth, zenith, r
|
|
449
|
+
scaled spherical coordinates of input points
|
|
450
|
+
"""
|
|
451
|
+
x, y, z = points
|
|
452
|
+
|
|
453
|
+
# scale the query points and convert them to spherical
|
|
454
|
+
x_qs, y_qs, z_qs = coordinate_tools.scaled_projection(np.atleast_1d(x - self.x0), np.atleast_1d(y - self.y0),
|
|
455
|
+
np.atleast_1d(z - self.z0), self.scaling_factors,
|
|
456
|
+
self.principal_axes)
|
|
457
|
+
|
|
458
|
+
azimuth_qs, zenith_qs, r_qs = coordinate_tools.cartesian_to_spherical(x_qs, y_qs, z_qs)
|
|
459
|
+
return azimuth_qs, zenith_qs, r_qs
|
|
460
|
+
|
|
461
|
+
def get_fitted_shell(self, azimuth, zenith):
|
|
462
|
+
r_scaled = reconstruct_shell(self.modes, self.coefficients, azimuth, zenith)
|
|
463
|
+
|
|
464
|
+
return self._to_cartesian(azimuth, zenith, r_scaled)
|
|
465
|
+
|
|
466
|
+
def _to_cartesian(self, azimuth, zenith, r_scaled):
|
|
467
|
+
x_scaled, y_scaled, z_scaled = coordinate_tools.spherical_to_cartesian(azimuth, zenith, r_scaled)
|
|
468
|
+
# need to scale things "down" since they were scaled "up" in the fit
|
|
469
|
+
# scaling_factors = 1. / self.scaling_factors
|
|
470
|
+
|
|
471
|
+
scaled_axes = (self.principal_axes / self.scaling_factors[:, None]).astype(azimuth.dtype, copy=False)
|
|
472
|
+
|
|
473
|
+
coords = x_scaled.ravel()[:, None] * scaled_axes[0, :] + y_scaled.ravel()[:, None] * scaled_axes[1,
|
|
474
|
+
:] + z_scaled.ravel()[:,
|
|
475
|
+
None] * scaled_axes[2,
|
|
476
|
+
:]
|
|
477
|
+
x, y, z = coords.T
|
|
478
|
+
|
|
479
|
+
return x.reshape(x_scaled.shape) + self.x0, y.reshape(y_scaled.shape) + self.y0, z.reshape(
|
|
480
|
+
z_scaled.shape) + self.z0
|
|
481
|
+
|
|
482
|
+
|
|
483
|
+
def fit_shell(self, max_n_mode=3, max_iterations=2, tol_init=0.3):
|
|
484
|
+
modes, coefficients, summed_residuals = sphere_expansion_clean(self.x_cs, self.y_cs, self.z_cs, max_n_mode,
|
|
485
|
+
max_iterations, tol_init)
|
|
486
|
+
self._set_coefficients(modes, coefficients)
|
|
487
|
+
self._summed_residuals = summed_residuals
|
|
488
|
+
|
|
489
|
+
def check_inside(self, x=None, y=None, z=None):
|
|
490
|
+
if x is None:
|
|
491
|
+
xcs, ycs, zcs = self.x_cs, self.y_cs, self.z_cs
|
|
492
|
+
else:
|
|
493
|
+
xcs, ycs, zcs = coordinate_tools.scaled_projection(x - self.x0, y - self.y0, z - self.z0, self.scaling_factors,
|
|
494
|
+
self.principal_axes)
|
|
495
|
+
|
|
496
|
+
azimuth, zenith, rcs = coordinate_tools.cartesian_to_spherical(xcs, ycs, zcs)
|
|
497
|
+
r_cs_shell = reconstruct_shell(self.modes, self.coefficients, azimuth, zenith)
|
|
498
|
+
return rcs < r_cs_shell
|
|
499
|
+
|
|
500
|
+
def _visualize_shell(self, d_zenith=0.1, points=None):
|
|
501
|
+
try:
|
|
502
|
+
from mayavi import mlab
|
|
503
|
+
except(ImportError):
|
|
504
|
+
raise ImportError('Could not import mayavi.mlab.\
|
|
505
|
+
Please make sure mayavi is installed to display fitted shell')
|
|
506
|
+
|
|
507
|
+
if not points:
|
|
508
|
+
x, y, z = self.x, self.y, self.z
|
|
509
|
+
else:
|
|
510
|
+
x, y, z = points
|
|
511
|
+
zenith, azimuth = np.mgrid[0:(np.pi + d_zenith):d_zenith, 0:(2 * np.pi + d_zenith):d_zenith]
|
|
512
|
+
|
|
513
|
+
xs, ys, zs = self.get_fitted_shell(azimuth, zenith)
|
|
514
|
+
|
|
515
|
+
mlab.figure()
|
|
516
|
+
mlab.mesh(xs, ys, zs)
|
|
517
|
+
mlab.points3d(x, y, z, mode='point')
|
|
518
|
+
|
|
519
|
+
def get_mesh_vertices_faces(self, d_zenith=0.1):
|
|
520
|
+
"""Compute vertices and faces to pass to
|
|
521
|
+
PYME.experimental._triangle_mesh.TriangleMesh.
|
|
522
|
+
|
|
523
|
+
Note this will be non-manifold because of cuts at zenith=0, azimuth=0.
|
|
524
|
+
|
|
525
|
+
Parameters
|
|
526
|
+
----------
|
|
527
|
+
d_zenith : float, optional
|
|
528
|
+
zenith step size for generating vector in plane of the shell [radians], by default 0.1
|
|
529
|
+
"""
|
|
530
|
+
|
|
531
|
+
# Convert d_zenith to closest subdivision >= d_zenith (limited control due to icosahedon subdivision)
|
|
532
|
+
# Mean initial d_zenith is 2*pi/5, so solve for (2*pi/10)^n_subdivision = d_zenith
|
|
533
|
+
n_subdivision = int(np.ceil(np.log(d_zenith)/(np.log(np.pi)-np.log(5))))
|
|
534
|
+
|
|
535
|
+
# Quasi-regular sample points on a unit sphere with icosahedron subdivision
|
|
536
|
+
azimuth, zenith, faces = icosahedron_mesh(n_subdivision)
|
|
537
|
+
# Map points onto shell radius
|
|
538
|
+
xs, ys, zs = self.get_fitted_shell(azimuth, zenith)
|
|
539
|
+
|
|
540
|
+
# Create vertices
|
|
541
|
+
vertices = np.vstack([xs.ravel(), ys.ravel(), zs.ravel()]).T # Row-major ravel
|
|
542
|
+
|
|
543
|
+
return vertices.astype(np.float32), faces.astype(np.int32)
|
|
544
|
+
|
|
545
|
+
# def _visualize_scaled(self):
|
|
546
|
+
# from mayavi import mlab
|
|
547
|
+
# visualize_shell(self.modes, self.coefficients)#, scaling_factors=self.standard_deviations,
|
|
548
|
+
# # scaling_axes=self.principal_axes)
|
|
549
|
+
# mlab.points3d(self.x_cs, self.y_cs, self.z_cs, mode='point')
|
|
550
|
+
|
|
551
|
+
# def _visualize(self):
|
|
552
|
+
# from mayavi import mlab
|
|
553
|
+
# visualize_shell(self.modes, self.coefficients, scaling_factors=1./self.scaling_factors,
|
|
554
|
+
# scaling_axes=self.principal_axes)
|
|
555
|
+
# mlab.points3d(self.x_c, self.y_c, self.z_c, mode='point')
|
|
556
|
+
|
|
557
|
+
def distance_to_shell(self, query_points, d_angles=0.1):
|
|
558
|
+
"""
|
|
559
|
+
|
|
560
|
+
Parameters
|
|
561
|
+
----------
|
|
562
|
+
query_points : list-like of ndarrays
|
|
563
|
+
Arrays of positions to query (in cartesian coordinates), i.e. [np.array(x), np.array(y), np.array(z)]
|
|
564
|
+
d_angles : float
|
|
565
|
+
Sets the step size in radians of zenith and azimuth arrays used in reconstructing the spherical harmonic shell
|
|
566
|
+
|
|
567
|
+
Returns
|
|
568
|
+
-------
|
|
569
|
+
min_distance : float
|
|
570
|
+
minimum distance from query points (i.e. input coordinate) to the spherical harmonic surface
|
|
571
|
+
closest_points_on_surface : tuple of floats
|
|
572
|
+
returns the position in cartesian coordinates of the point on the surface closest to the input 'position'
|
|
573
|
+
|
|
574
|
+
"""
|
|
575
|
+
x, y, z = query_points
|
|
576
|
+
x, y, z = np.atleast_1d(x), np.atleast_1d(y), np.atleast_1d(z)
|
|
577
|
+
n_points = len(x)
|
|
578
|
+
zenith, azimuth = np.mgrid[0:(np.pi + d_angles):d_angles, 0:(2 * np.pi + d_angles):d_angles]
|
|
579
|
+
|
|
580
|
+
x_shell, y_shell, z_shell = self.get_fitted_shell(azimuth.astype(np.float32, copy=False),
|
|
581
|
+
zenith.astype(np.float32, copy=False))
|
|
582
|
+
# calculate the distance between all our points and the shell
|
|
583
|
+
dist = np.sqrt(
|
|
584
|
+
(x - x_shell[:, :, None]) ** 2 + (y - y_shell[:, :, None]) ** 2 + ((z - z_shell[:, :, None]) ** 2))
|
|
585
|
+
|
|
586
|
+
# unfortunately cannot currently specify two axes for numpy.argmin, so we'll have to flatten the first two dims
|
|
587
|
+
n_shell_coords = dist.shape[0] * dist.shape[1]
|
|
588
|
+
dist_flat = dist.reshape((n_shell_coords, n_points))
|
|
589
|
+
min_ind = np.argmin(dist_flat, axis=0)
|
|
590
|
+
|
|
591
|
+
p_ind = range(n_points)
|
|
592
|
+
return dist_flat[min_ind[p_ind], p_ind], (x_shell.reshape(n_shell_coords)[min_ind],
|
|
593
|
+
y_shell.reshape(n_shell_coords)[min_ind],
|
|
594
|
+
z_shell.reshape(n_shell_coords)[min_ind])
|
|
595
|
+
|
|
596
|
+
def radial_distance_to_shell(self, points):
|
|
597
|
+
""" finds distance to shell along a vector from the centre of the shell to a point.
|
|
598
|
+
|
|
599
|
+
Notes
|
|
600
|
+
-----
|
|
601
|
+
|
|
602
|
+
This is not a geometric/euclidean distance, but should be a good approximation close to the shell (or far away).
|
|
603
|
+
Over mid-range distances, it will give potentially very distorted distances. It is, however, very much faster and
|
|
604
|
+
can safely be used in applications where strict scaling is not important - e.g. for a SDF representation of the
|
|
605
|
+
surface.
|
|
606
|
+
|
|
607
|
+
"""
|
|
608
|
+
# project points into scaled-space spherical coordinates
|
|
609
|
+
azimuth_qs, zenith_qs, r_qs = self.shell_coordinates(points)
|
|
610
|
+
|
|
611
|
+
# get scaled shell radius at those angles
|
|
612
|
+
r_shell = reconstruct_shell(self.modes, self.coefficients, azimuth_qs, zenith_qs)
|
|
613
|
+
pts = self._to_cartesian(azimuth_qs, zenith_qs, r_shell)
|
|
614
|
+
|
|
615
|
+
#print(r_qs - r_shell)
|
|
616
|
+
|
|
617
|
+
# return the (scaled space) difference
|
|
618
|
+
#d = r_qs - r_shell
|
|
619
|
+
d_ = pts - points
|
|
620
|
+
|
|
621
|
+
s = 2.0*(r_qs> r_shell) - 1.0
|
|
622
|
+
#print(s)
|
|
623
|
+
|
|
624
|
+
d = s*np.sqrt((d_*d_).sum(0))
|
|
625
|
+
|
|
626
|
+
#scale distance TODO - actually scale to make slightly closer to being euclidean
|
|
627
|
+
return d
|
|
628
|
+
|
|
629
|
+
|
|
630
|
+
def approximate_normal(self, x, y, z, d_azimuth=1e-6, d_zenith=1e-6, return_orthogonal_vectors=False):
|
|
631
|
+
"""
|
|
632
|
+
|
|
633
|
+
Numerically approximate a vector(s) normal to the spherical harmonic shell at the query point(s).
|
|
634
|
+
|
|
635
|
+
For input point(s), scale and convert to spherical coordinates, shift by +/- d_azimuth and d_zenith to get
|
|
636
|
+
'phantom' points in the plane tangent to the spherical harmonic expansion on either side of the query point(s).
|
|
637
|
+
Scale back, convert to cartesian, make vectors from the phantom points (which are by definition not parallel)
|
|
638
|
+
and cross them to get a vector perpindicular to the plane.
|
|
639
|
+
|
|
640
|
+
Parameters
|
|
641
|
+
----------
|
|
642
|
+
x : ndarray, float
|
|
643
|
+
cartesian x location of point(s) on the surface to calculate the normal at
|
|
644
|
+
y : ndarray, float
|
|
645
|
+
cartesian y location of point(s) on the surface to calculate the normal at
|
|
646
|
+
z : ndarray, float
|
|
647
|
+
cartesian z location of point(s) on the surface to calculate the normal at
|
|
648
|
+
d_azimuth : float
|
|
649
|
+
azimuth step size for generating vector in plane of the shell [radians]
|
|
650
|
+
d_zenith : float
|
|
651
|
+
zenith step size for generating vector in plane of the shell [radians]
|
|
652
|
+
|
|
653
|
+
Returns
|
|
654
|
+
-------
|
|
655
|
+
normal_vector : ndarray
|
|
656
|
+
cartesian unit vector(s) normal to query point(s). size (len(x), 3)
|
|
657
|
+
orth0 : ndarray
|
|
658
|
+
cartesian unit vector(s) in the plane of the spherical harmonic shell at the query point(s), and
|
|
659
|
+
perpendicular to normal_vector
|
|
660
|
+
orth1 : ndarray
|
|
661
|
+
cartesian unit vector(s) orthogonal to normal_vector and orth0
|
|
662
|
+
|
|
663
|
+
"""
|
|
664
|
+
# scale the query points and convert them to spherical
|
|
665
|
+
x_qs, y_qs, z_qs = coordinate_tools.scaled_projection(np.atleast_1d(x - self.x0), np.atleast_1d(y - self.y0),
|
|
666
|
+
np.atleast_1d(z - self.z0), self.scaling_factors,
|
|
667
|
+
self.principal_axes)
|
|
668
|
+
azimuth, zenith, r = coordinate_tools.cartesian_to_spherical(x_qs, y_qs, z_qs)
|
|
669
|
+
|
|
670
|
+
# get scaled shell radius at +/- points for azimuthal and zenith shifts
|
|
671
|
+
azimuths = np.array([azimuth - d_azimuth, azimuth + d_azimuth, azimuth, azimuth])
|
|
672
|
+
zeniths = np.array([zenith, zenith, zenith - d_zenith, zenith + d_zenith])
|
|
673
|
+
r_scaled = reconstruct_shell(self.modes, self.coefficients, azimuths, zeniths)
|
|
674
|
+
|
|
675
|
+
# convert shifted points to cartesian and scale back. shape = (4, #points)
|
|
676
|
+
x_scaled, y_scaled, z_scaled = coordinate_tools.spherical_to_cartesian(azimuths, zeniths, r_scaled)
|
|
677
|
+
# scale things "down" since they were scaled "up" in the fit
|
|
678
|
+
scaled_axes = self.principal_axes / self.scaling_factors[:, None]
|
|
679
|
+
coords = x_scaled.ravel()[:, None] * scaled_axes[0, :] + \
|
|
680
|
+
y_scaled.ravel()[:, None] * scaled_axes[1, :] + \
|
|
681
|
+
z_scaled.ravel()[:, None] * scaled_axes[2, :]
|
|
682
|
+
x_p, y_p, z_p = coords.T
|
|
683
|
+
# skip adding x0, y0, z0 back on, since we'll subtract it off in a second
|
|
684
|
+
x_p, y_p, z_p = x_p.reshape(x_scaled.shape), y_p.reshape(y_scaled.shape), z_p.reshape(z_scaled.shape)
|
|
685
|
+
|
|
686
|
+
# make two vectors in the plane centered at the query point
|
|
687
|
+
v0 = np.array([x_p[1] - x_p[0], y_p[1] - y_p[0], z_p[1] - z_p[0]])
|
|
688
|
+
v1 = np.array([x_p[3] - x_p[2], y_p[3] - y_p[2], z_p[3] - z_p[2]])
|
|
689
|
+
if not np.any(v0) or not np.any(v1):
|
|
690
|
+
raise RuntimeWarning('failed to generate two vectors in the plane - likely precision error in sph -> cart')
|
|
691
|
+
# cross them to get a normal vector NOTE - direction could be negative of true normal
|
|
692
|
+
normal = np.cross(v0, v1, axis=0)
|
|
693
|
+
# return as unit vector(s) along each row
|
|
694
|
+
normal = np.atleast_2d(normal / np.linalg.norm(normal, axis=0)).T
|
|
695
|
+
# make sure normals point outwards, by dotting it with the vector to the point on the shell from the center
|
|
696
|
+
points = np.stack([np.atleast_1d(x - self.x0), np.atleast_1d(y - self.y0), np.atleast_1d(z - self.z0)]).T
|
|
697
|
+
outwards = np.array([np.dot(normal[ind], points[ind]) > 0 for ind in range(normal.shape[0])])
|
|
698
|
+
normal[~outwards, :] *= -1
|
|
699
|
+
if np.isnan(normal).any():
|
|
700
|
+
raise RuntimeError('Failed to calculate normal vector')
|
|
701
|
+
if return_orthogonal_vectors:
|
|
702
|
+
orth0 = np.atleast_2d(v0 / np.linalg.norm(v0, axis=0)).T
|
|
703
|
+
# v0 and v1 are both in a plane perpendicular to normal, but not strictly orthogonal to each other
|
|
704
|
+
orth1 = np.cross(normal, orth0, axis=1) # replace v1 with a unit vector orth. to both normal and v0
|
|
705
|
+
return normal.squeeze(), orth0.squeeze(), orth1.squeeze()
|
|
706
|
+
return normal.squeeze()
|
|
707
|
+
|
|
708
|
+
def _distance_error(self, parameterized_distance, vector, starting_point):
|
|
709
|
+
"""
|
|
710
|
+
|
|
711
|
+
Calculate the error in scaled space between the shell and the point reached traveling a specified distance(s)
|
|
712
|
+
along the input vector from the input starting position.
|
|
713
|
+
|
|
714
|
+
This function is to be minimized by a solver. Note that we don't actually have to calculate the distance in
|
|
715
|
+
normal space, since minimizing in the scale space is equivalent.
|
|
716
|
+
|
|
717
|
+
Parameters
|
|
718
|
+
----------
|
|
719
|
+
parameterized_distance : float
|
|
720
|
+
distance along vector to travel, units of nm, unscaled
|
|
721
|
+
vector : ndarray
|
|
722
|
+
Length three, vector in (unscaled) cartesian coordinates along which to travel
|
|
723
|
+
starting_point : ndarray or list
|
|
724
|
+
Length three, point in (unscaled) cartesian space from which to start traveling along 'vector'
|
|
725
|
+
|
|
726
|
+
Returns
|
|
727
|
+
-------
|
|
728
|
+
|
|
729
|
+
"""
|
|
730
|
+
x, y, z = [parameterized_distance * np.atleast_2d(vector)[:, ind] + np.atleast_2d(starting_point)[:, ind] for
|
|
731
|
+
ind in range(3)]
|
|
732
|
+
# scale the query points and convert them to spherical
|
|
733
|
+
x_qs, y_qs, z_qs = coordinate_tools.scaled_projection(np.atleast_1d(x - self.x0), np.atleast_1d(y - self.y0),
|
|
734
|
+
np.atleast_1d(z - self.z0), self.scaling_factors,
|
|
735
|
+
self.principal_axes)
|
|
736
|
+
azimuth_qs, zenith_qs, r_qs = coordinate_tools.cartesian_to_spherical(x_qs, y_qs, z_qs)
|
|
737
|
+
|
|
738
|
+
# get scaled shell radius at those angles
|
|
739
|
+
r_shell = reconstruct_shell(self.modes, self.coefficients, azimuth_qs, zenith_qs)
|
|
740
|
+
|
|
741
|
+
# return the (scaled space) difference
|
|
742
|
+
return r_qs - r_shell
|
|
743
|
+
|
|
744
|
+
def distance_to_shell_along_vector_from_point(self, vector, starting_point, guess=None):
|
|
745
|
+
"""
|
|
746
|
+
|
|
747
|
+
Calculate the distance to the shell along a given direction, from a given point.
|
|
748
|
+
|
|
749
|
+
Parameters
|
|
750
|
+
----------
|
|
751
|
+
vector : list-like
|
|
752
|
+
cartesian vector indicating direction to query for proximity to shell
|
|
753
|
+
starting_point : list-like
|
|
754
|
+
cartesian position from which to start traveling along input vector when calculating shell proximity
|
|
755
|
+
guess_distances : array, float
|
|
756
|
+
initial guess for distance solver. See self._distance_error()
|
|
757
|
+
|
|
758
|
+
Returns
|
|
759
|
+
-------
|
|
760
|
+
|
|
761
|
+
"""
|
|
762
|
+
|
|
763
|
+
if guess is None:
|
|
764
|
+
guess = self._find_guess_for_distance_to_shell_along_vector_from_point(vector, starting_point)
|
|
765
|
+
|
|
766
|
+
(res, cov_x, info_dict, mesg, res_code) = optimize.leastsq(self._distance_error, guess,
|
|
767
|
+
args=(vector, starting_point),
|
|
768
|
+
full_output=1)
|
|
769
|
+
return res
|
|
770
|
+
|
|
771
|
+
def _find_guess_for_distance_to_shell_along_vector_from_point(self, vector, starting_point, guess_distances=None):
|
|
772
|
+
"""
|
|
773
|
+
|
|
774
|
+
Calculate the distance to the shell along a given direction, from a given point.
|
|
775
|
+
|
|
776
|
+
Parameters
|
|
777
|
+
----------
|
|
778
|
+
vector : list-like
|
|
779
|
+
cartesian vector indicating direction to query for proximity to shell
|
|
780
|
+
starting_point : list-like
|
|
781
|
+
cartesian position from which to start traveling along input vector when calculating shell proximity
|
|
782
|
+
guess_distances : array, float
|
|
783
|
+
initial guess for distance solver. See self._distance_error()
|
|
784
|
+
|
|
785
|
+
Returns
|
|
786
|
+
-------
|
|
787
|
+
|
|
788
|
+
"""
|
|
789
|
+
guess_distances = np.arange(0., 1000., 100.) if guess_distances is None else guess_distances
|
|
790
|
+
errors = np.zeros_like(guess_distances)
|
|
791
|
+
# guess = guess_distances[np.argmin(np.abs(self._distance_error(guess_distances, starting_point, vector)))]
|
|
792
|
+
for ind, query in enumerate(guess_distances):
|
|
793
|
+
errors[ind] = self._distance_error(query, vector, starting_point)
|
|
794
|
+
|
|
795
|
+
return guess_distances[np.argmin(np.abs(errors))]
|
|
796
|
+
|
|
797
|
+
def approximate_image_bounds(self, d_zenith=0.1, d_azimuth=0.1):
|
|
798
|
+
from PYME.IO.image import ImageBounds
|
|
799
|
+
#does it really make sense to use ImageBounds here??
|
|
800
|
+
|
|
801
|
+
zenith, azimuth = np.mgrid[0:(np.pi + d_zenith):d_zenith,
|
|
802
|
+
0:(2 * np.pi + d_azimuth):d_azimuth]
|
|
803
|
+
|
|
804
|
+
x_shell, y_shell, z_shell = self.get_fitted_shell(azimuth, zenith)
|
|
805
|
+
|
|
806
|
+
return ImageBounds(x_shell.min(), y_shell.min(),
|
|
807
|
+
x_shell.max(), y_shell.max(),
|
|
808
|
+
z_shell.min(), z_shell.max())
|
|
809
|
+
|
|
810
|
+
def uniform_random_radial_density(self, n_radial_bins=20, batch_size=100000, target_sampling_nm=75.):
|
|
811
|
+
"""
|
|
812
|
+
Estimate a radial density histogram for uniform spatial sampling within the shell. Performs calculation in batches to give bounded memory usage.
|
|
813
|
+
|
|
814
|
+
Parameters
|
|
815
|
+
----------
|
|
816
|
+
|
|
817
|
+
n_radial_bins : int
|
|
818
|
+
Number of radial bins to divide the radius into
|
|
819
|
+
batch_size : int
|
|
820
|
+
number of test points to generate in one batch. Note that the default (100000) might be a bit conservative
|
|
821
|
+
target_sampling_nm: float
|
|
822
|
+
desired sampling density of combined batches. Used in conjuction with batch_size to determine the number of batches required.
|
|
823
|
+
"""
|
|
824
|
+
|
|
825
|
+
bounds = self.approximate_image_bounds()
|
|
826
|
+
|
|
827
|
+
w = bounds.x1 - bounds.x0 #+ 2*target_sampling_nm
|
|
828
|
+
h = bounds.y1 - bounds.y0 #+ 2*target_sampling_nm
|
|
829
|
+
d = bounds.z1 - bounds.z0 #+ 2*target_sampling_nm
|
|
830
|
+
|
|
831
|
+
# to ensure spatial uniformity, simulate in a cube with an edge length equal to the longest bound.
|
|
832
|
+
# this means we chuck away quite a few points at the rejection step, but is logically simple
|
|
833
|
+
cube_size =max([w, h, d])
|
|
834
|
+
|
|
835
|
+
# calculate number of batches to give uniform random sampling with a desired spacing,
|
|
836
|
+
# whilst not exceeding the memory requirements dictated by a single batch
|
|
837
|
+
n_batches = int(((cube_size/target_sampling_nm)**3)/batch_size)
|
|
838
|
+
logger.debug('Using %d batches for density estimation' % n_batches)
|
|
839
|
+
|
|
840
|
+
# calculate where to put our edges
|
|
841
|
+
bin_edges = np.linspace(0, 1, n_radial_bins)
|
|
842
|
+
|
|
843
|
+
#pre-allocate and output array
|
|
844
|
+
counts = np.zeros(len(bin_edges)-1, 'i4')
|
|
845
|
+
|
|
846
|
+
for i in range(n_batches):
|
|
847
|
+
# simulate batch_size uniformly distributed points within a bounding cube
|
|
848
|
+
x = np.random.uniform(bounds.x0, bounds.x0 + cube_size, batch_size)
|
|
849
|
+
y = np.random.uniform(bounds.y0, bounds.y0 + cube_size, batch_size)
|
|
850
|
+
z = np.random.uniform(bounds.z0, bounds.z0 + cube_size, batch_size)
|
|
851
|
+
|
|
852
|
+
# if shell_coordinates and/or reconstruct_shell prove expensive, we could clip to the rectangular (non-cube) bounding box here
|
|
853
|
+
# before calculating shell coordinates. Omitting for now as this is likely to be premature optimisation (and the additionaly indexing
|
|
854
|
+
# might well prove more expensive than just calculating the shell co-ordinates)
|
|
855
|
+
|
|
856
|
+
# convert these to polar, shell referenced coordinates
|
|
857
|
+
azi, zen, r = self.shell_coordinates((x, y, z))
|
|
858
|
+
r_shell = reconstruct_shell(self.modes,self.coefficients,azi, zen)
|
|
859
|
+
|
|
860
|
+
# find which points are inside the shell
|
|
861
|
+
inside = r < r_shell
|
|
862
|
+
# reject all points outside the shell
|
|
863
|
+
r_norm = r[inside]/r_shell[inside]
|
|
864
|
+
|
|
865
|
+
counts += np.histogram(r_norm, bin_edges)[0]
|
|
866
|
+
|
|
867
|
+
return bin_edges, counts
|
|
868
|
+
|
|
869
|
+
|
|
870
|
+
|
|
871
|
+
class SHShell(ScaledShell):
|
|
872
|
+
'''
|
|
873
|
+
Initial work on a replacement interface for ScaledShell
|
|
874
|
+
|
|
875
|
+
Goals:
|
|
876
|
+
|
|
877
|
+
- can be constructed directly as well as / instead of being fit
|
|
878
|
+
- fitting is a single function call (rather than 3)
|
|
879
|
+
- easily serialised (TODO)
|
|
880
|
+
- does not own/keep a copy of data points (to facilitate serialisation)
|
|
881
|
+
- when directly constructed, can used to represent synthetic nuclei etc ... whilst retaining distance
|
|
882
|
+
evaluation functions
|
|
883
|
+
|
|
884
|
+
'''
|
|
885
|
+
def __init__(self, centre=(0,0,0), principle_axes=((1,0,0), (0,1,0), (0,0,1)), axis_scaling=(1.,1.,1.), modes=((0,0),), coefficients=(1,)):
|
|
886
|
+
self.x0, self.y0, self.z0 = centre
|
|
887
|
+
self.principal_axes = np.array(principle_axes)
|
|
888
|
+
self.axis_scaling = np.array(axis_scaling)
|
|
889
|
+
self.modes = modes
|
|
890
|
+
self.coefficients = np.array(coefficients)
|
|
891
|
+
|
|
892
|
+
def fit(self, points, n_max=3, n_iters=2, tol=0.3, principle_axis_sampling=1.0):
|
|
893
|
+
x, y, z = points
|
|
894
|
+
self.x0, self.y0, self.z0 = x.mean(), y.mean(), z.mean()
|
|
895
|
+
x_c, y_c, z_c = x - self.x0, y - self.y0, z - self.z0
|
|
896
|
+
|
|
897
|
+
sig, self.principal_axes = coordinate_tools.find_principle_axes(x_c, y_c, z_c, sample_fraction=principle_axis_sampling)
|
|
898
|
+
self.axis_scaling = sig/np.max(sig)
|
|
899
|
+
|
|
900
|
+
x_cs, y_cs, z_cs, = coordinate_tools.scaled_projection(x_c, y_c, z_c,self.axis_scaling, self.principal_axes)
|
|
901
|
+
|
|
902
|
+
self.modes, self.coefficients, _ = sphere_expansion_clean(x_cs, y_cs, z_cs, n_max, n_iters, tol)
|
|
903
|
+
|
|
904
|
+
@property
|
|
905
|
+
def scaling_factors(self):
|
|
906
|
+
import warnings
|
|
907
|
+
warnings.warn(DeprecationWarning('use .axis_scaling instead'))
|
|
908
|
+
return self.axis_scaling
|
|
909
|
+
|