eradiate 0.31.0.dev0__tar.gz → 0.31.0.dev1__tar.gz
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.
- {eradiate-0.31.0.dev0/src/eradiate.egg-info → eradiate-0.31.0.dev1}/PKG-INFO +1 -1
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/pyproject.toml +3 -2
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/config/_settings.py +1 -1
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/data/_asset_manager.py +1 -1
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/data/_file_resolver.py +42 -2
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/data/io.py +21 -4
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/notebook/__init__.py +1 -1
- eradiate-0.31.0.dev1/src/eradiate/notebook/tutorials.py +14 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/pipelines/__init__.py +1 -1
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/radprops/_absorption.py +0 -8
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/radprops/_atmosphere.py +1 -1
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/rng.py +1 -1
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/atmosphere/_molecular.py +1 -1
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/atmosphere/_particle_layer.py +23 -5
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/biosphere/__init__.pyi +1 -1
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/biosphere/_rami_scenarios.py +26 -31
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/core.py +1 -1
- eradiate-0.31.0.dev1/src/eradiate/tutorials.py +257 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/util/misc.py +3 -3
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1/src/eradiate.egg-info}/PKG-INFO +1 -1
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate.egg-info/SOURCES.txt +1 -0
- eradiate-0.31.0.dev0/src/eradiate/notebook/tutorials.py +0 -129
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/LICENSE +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/MANIFEST.in +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/README.md +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/resources/README_PyPI.md +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/setup.cfg +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/__init__.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/__init__.pyi +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/_factory.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/_mode.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/_version.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/attrs.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/cfconventions.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/cli/__init__.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/cli/_console.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/cli/data.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/cli/show.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/cli/srf.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/config/__init__.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/config/__init__.pyi +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/config/_defaults.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/config/eradiate.toml +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/constants.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/contexts.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/converters.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/data/__init__.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/data/__init__.pyi +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/data/_validation.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/data/resources.yml +0 -0
- {eradiate-0.31.0.dev0/src/eradiate/util → eradiate-0.31.0.dev1/src/eradiate/data/schemas}/__init__.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/data/schemas/particle_dataset_v1.yml +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/data/schemas/srf_v1.yml +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/exceptions.py +0 -0
- {eradiate-0.31.0.dev0/src/eradiate/scenes/surface → eradiate-0.31.0.dev1/src/eradiate/experiments}/__init__.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/experiments/__init__.pyi +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/experiments/_atmosphere.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/experiments/_canopy.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/experiments/_canopy_atmosphere.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/experiments/_core.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/experiments/_dem.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/experiments/_helpers.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/frame.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/kernel/__init__.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/kernel/__init__.pyi +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/kernel/_bitmap.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/kernel/_bsdf.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/kernel/_kernel_dict.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/kernel/_render.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/kernel/_versions.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/kernel/gridvolume.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/kernel/logging.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/kernel/transform.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/notebook/__init__.pyi +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/pipelines/__init__.pyi +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/pipelines/core.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/pipelines/definitions.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/pipelines/logic.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/plot.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/py.typed +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/quad.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/radprops/__init__.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/radprops/__init__.pyi +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/radprops/_array.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/radprops/_core.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/radprops/rayleigh.py +0 -0
- {eradiate-0.31.0.dev0/src/eradiate/scenes/spectra → eradiate-0.31.0.dev1/src/eradiate/scenes}/__init__.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/__init__.pyi +0 -0
- {eradiate-0.31.0.dev0/src/eradiate/scenes/shapes → eradiate-0.31.0.dev1/src/eradiate/scenes/atmosphere}/__init__.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/atmosphere/__init__.pyi +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/atmosphere/_core.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/atmosphere/_heterogeneous.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/atmosphere/_homogeneous.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/atmosphere/_particle_dist.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/atmosphere/_util.py +0 -0
- {eradiate-0.31.0.dev0/src/eradiate/scenes/phase → eradiate-0.31.0.dev1/src/eradiate/scenes/biosphere}/__init__.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/biosphere/_canopy_loader.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/biosphere/_core.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/biosphere/_discrete.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/biosphere/_leaf_cloud.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/biosphere/_tree.py +0 -0
- {eradiate-0.31.0.dev0/src/eradiate/scenes/measure → eradiate-0.31.0.dev1/src/eradiate/scenes/bsdfs}/__init__.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/bsdfs/__init__.pyi +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/bsdfs/_black.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/bsdfs/_checkerboard.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/bsdfs/_core.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/bsdfs/_hapke.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/bsdfs/_lambertian.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/bsdfs/_mqdiffuse.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/bsdfs/_ocean_grasp.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/bsdfs/_ocean_legacy.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/bsdfs/_ocean_mishchenko.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/bsdfs/_opacity_mask.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/bsdfs/_rpv.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/bsdfs/_rtls.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/geometry.py +0 -0
- {eradiate-0.31.0.dev0/src/eradiate/scenes/integrators → eradiate-0.31.0.dev1/src/eradiate/scenes/illumination}/__init__.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/illumination/__init__.pyi +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/illumination/_astro_object.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/illumination/_constant.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/illumination/_core.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/illumination/_directional.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/illumination/_spot.py +0 -0
- {eradiate-0.31.0.dev0/src/eradiate/scenes/illumination → eradiate-0.31.0.dev1/src/eradiate/scenes/integrators}/__init__.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/integrators/__init__.pyi +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/integrators/_core.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/integrators/_path_tracers.py +0 -0
- {eradiate-0.31.0.dev0/src/eradiate/scenes/bsdfs → eradiate-0.31.0.dev1/src/eradiate/scenes/measure}/__init__.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/measure/__init__.pyi +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/measure/_core.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/measure/_distant.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/measure/_distant_flux.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/measure/_hemispherical_distant.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/measure/_multi_distant.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/measure/_multi_radiancemeter.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/measure/_perspective.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/measure/_radiancemeter.py +0 -0
- {eradiate-0.31.0.dev0/src/eradiate/scenes/biosphere → eradiate-0.31.0.dev1/src/eradiate/scenes/phase}/__init__.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/phase/__init__.pyi +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/phase/_blend.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/phase/_core.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/phase/_hg.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/phase/_isotropic.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/phase/_rayleigh.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/phase/_tabulated.py +0 -0
- {eradiate-0.31.0.dev0/src/eradiate/scenes/atmosphere → eradiate-0.31.0.dev1/src/eradiate/scenes/shapes}/__init__.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/shapes/__init__.pyi +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/shapes/_buffermesh.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/shapes/_core.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/shapes/_cuboid.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/shapes/_filemesh.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/shapes/_rectangle.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/shapes/_sphere.py +0 -0
- {eradiate-0.31.0.dev0/src/eradiate/scenes → eradiate-0.31.0.dev1/src/eradiate/scenes/spectra}/__init__.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/spectra/__init__.pyi +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/spectra/_air_scattering_coefficient.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/spectra/_core.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/spectra/_interpolated.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/spectra/_solar_irradiance.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/spectra/_uniform.py +0 -0
- {eradiate-0.31.0.dev0/src/eradiate/experiments → eradiate-0.31.0.dev1/src/eradiate/scenes/surface}/__init__.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/surface/__init__.pyi +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/surface/_basic.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/surface/_central_patch.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/surface/_core.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/surface/_dem.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/spectral/__init__.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/spectral/__init__.pyi +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/spectral/ckd_quad.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/spectral/grid.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/spectral/index.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/spectral/response.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/srf_tools.py +0 -0
- {eradiate-0.31.0.dev0/src/eradiate/test_tools/test_cases → eradiate-0.31.0.dev1/src/eradiate/test_tools}/__init__.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/test_tools/benchmark/__init__.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/test_tools/benchmark/asvdb.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/test_tools/benchmark/cli.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/test_tools/benchmark/utils.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/test_tools/data.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/test_tools/fixtures.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/test_tools/plugin.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/test_tools/regression.py +0 -0
- {eradiate-0.31.0.dev0/src/eradiate/test_tools → eradiate-0.31.0.dev1/src/eradiate/test_tools/test_cases}/__init__.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/test_tools/test_cases/atmospheres.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/test_tools/test_cases/ocean.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/test_tools/test_cases/rami4atm.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/test_tools/test_cases/romc.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/test_tools/types.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/test_tools/util.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/typing.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/units.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/units.txt +0 -0
- {eradiate-0.31.0.dev0/src/eradiate/data/schemas → eradiate-0.31.0.dev1/src/eradiate/util}/__init__.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/util/deprecation.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/util/numpydoc.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/util/sys_info.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/validators.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/warp.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/xarray/__init__.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/xarray/__init__.pyi +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/xarray/_accessors.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/xarray/_helpers.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/xarray/interp.py +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate.egg-info/dependency_links.txt +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate.egg-info/entry_points.txt +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate.egg-info/requires.txt +0 -0
- {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate.egg-info/top_level.txt +0 -0
|
@@ -10,7 +10,7 @@ maintainers = [{ name = "The Eradiate Team" }]
|
|
|
10
10
|
name = "eradiate"
|
|
11
11
|
readme = "resources/README_PyPI.md"
|
|
12
12
|
requires-python = ">=3.9,<3.13"
|
|
13
|
-
version = "0.31.0-
|
|
13
|
+
version = "0.31.0-dev1"
|
|
14
14
|
dependencies = [
|
|
15
15
|
"aenum",
|
|
16
16
|
"attrs>=22.2",
|
|
@@ -78,8 +78,9 @@ test = [
|
|
|
78
78
|
"pytest-robotframework",
|
|
79
79
|
]
|
|
80
80
|
dev = [
|
|
81
|
-
"bump-my-version>=
|
|
81
|
+
"bump-my-version>=1.2.0,<1.3.0",
|
|
82
82
|
"uv==0.6.*", # Used to lock docs dependencies
|
|
83
|
+
"pandas-stubs",
|
|
83
84
|
]
|
|
84
85
|
|
|
85
86
|
[project.scripts]
|
|
@@ -104,7 +104,7 @@ def _validate_source_dir(value: Path | None) -> bool:
|
|
|
104
104
|
return True
|
|
105
105
|
|
|
106
106
|
|
|
107
|
-
#: Main settings data structure. See the `Dynaconf documentation <https://www.dynaconf.com/>`
|
|
107
|
+
#: Main settings data structure. See the `Dynaconf documentation <https://www.dynaconf.com/>`__
|
|
108
108
|
#: for details.
|
|
109
109
|
settings = Dynaconf(
|
|
110
110
|
settings_files=["eradiate.yml", "eradiate.yaml", "eradiate.toml"],
|
|
@@ -648,7 +648,7 @@ class AssetManager:
|
|
|
648
648
|
shutil.rmtree(fname, ignore_errors=True)
|
|
649
649
|
|
|
650
650
|
|
|
651
|
-
#: Unique asset manager instance
|
|
651
|
+
#: Unique asset manager instance (exposed as :data:`eradiate.asset_manager`).
|
|
652
652
|
asset_manager = AssetManager(
|
|
653
653
|
cache_dir=Path(settings["data_path"]) / "cached",
|
|
654
654
|
unpack_dir=Path(settings["data_path"]) / "unpacked",
|
|
@@ -49,7 +49,19 @@ class FileResolver:
|
|
|
49
49
|
:data:`eradiate.fresolver <.fresolver>`:
|
|
50
50
|
|
|
51
51
|
>>> from eradiate import fresolver
|
|
52
|
+
|
|
53
|
+
To add a path to the file resolver, use the :meth:`~.FileResolver.append`
|
|
54
|
+
or :meth:`~.FileResolver.prepend` methods, *e.g.*:
|
|
55
|
+
|
|
56
|
+
>>> fresolver.append("some/path/on/the/drive")
|
|
57
|
+
|
|
58
|
+
To resolve a relative path, use the :meth:`~.FileResolver.resolve` method:
|
|
59
|
+
|
|
52
60
|
>>> fresolver.resolve("srf/sentinel_2a-msi-3.nc")
|
|
61
|
+
|
|
62
|
+
If the path is expected to point to an existing dataset file, the
|
|
63
|
+
:meth:`~.FileResolver.load_dataset` method can be used to load it immediately:
|
|
64
|
+
|
|
53
65
|
>>> fresolver.load_dataset("srf/sentinel_2a-msi-3.nc")
|
|
54
66
|
"""
|
|
55
67
|
|
|
@@ -70,6 +82,10 @@ class FileResolver:
|
|
|
70
82
|
|
|
71
83
|
avoid_duplicates : bool, optional
|
|
72
84
|
If ``True``, do not append again a path that is already registered.
|
|
85
|
+
|
|
86
|
+
See Also
|
|
87
|
+
--------
|
|
88
|
+
:meth:`.prepend`
|
|
73
89
|
"""
|
|
74
90
|
path = Path(path).resolve()
|
|
75
91
|
if not path.is_dir():
|
|
@@ -98,6 +114,9 @@ class FileResolver:
|
|
|
98
114
|
avoid_duplicates : bool, optional
|
|
99
115
|
If ``True``, do not prepend again a path that is already registered.
|
|
100
116
|
|
|
117
|
+
See Also
|
|
118
|
+
--------
|
|
119
|
+
:meth:`.append`
|
|
101
120
|
"""
|
|
102
121
|
path = Path(path).resolve()
|
|
103
122
|
if not path.is_dir():
|
|
@@ -127,7 +146,8 @@ class FileResolver:
|
|
|
127
146
|
|
|
128
147
|
Returns
|
|
129
148
|
-------
|
|
130
|
-
|
|
149
|
+
Path
|
|
150
|
+
Resolved path
|
|
131
151
|
|
|
132
152
|
Raises
|
|
133
153
|
------
|
|
@@ -153,6 +173,22 @@ class FileResolver:
|
|
|
153
173
|
) -> xr.Dataset:
|
|
154
174
|
"""
|
|
155
175
|
Chain :meth:`resolve` and :func:`xarray.load_dataset`.
|
|
176
|
+
|
|
177
|
+
Parameters
|
|
178
|
+
----------
|
|
179
|
+
path : path-like
|
|
180
|
+
Path to be resolved.
|
|
181
|
+
|
|
182
|
+
strict : bool, default: False
|
|
183
|
+
If ``True``, resolution failure will raise.
|
|
184
|
+
|
|
185
|
+
cwd : bool, default: False
|
|
186
|
+
If ``True``, check first if a file relative to the current working
|
|
187
|
+
directory exists.
|
|
188
|
+
|
|
189
|
+
Returns
|
|
190
|
+
-------
|
|
191
|
+
Dataset
|
|
156
192
|
"""
|
|
157
193
|
fname = self.resolve(path, strict=strict, cwd=cwd)
|
|
158
194
|
return xr.load_dataset(fname)
|
|
@@ -166,6 +202,10 @@ class FileResolver:
|
|
|
166
202
|
show : bool
|
|
167
203
|
If ``True``, display information to the terminal. Otherwise, return
|
|
168
204
|
it as a dictionary.
|
|
205
|
+
|
|
206
|
+
Returns
|
|
207
|
+
-------
|
|
208
|
+
dict or None
|
|
169
209
|
"""
|
|
170
210
|
if show:
|
|
171
211
|
title = "File resolver"
|
|
@@ -181,7 +221,7 @@ class FileResolver:
|
|
|
181
221
|
return {"paths": self.paths}
|
|
182
222
|
|
|
183
223
|
|
|
184
|
-
#: Unique file resolver instance
|
|
224
|
+
#: Unique file resolver instance (exposed as :data:`eradiate.fresolver`)
|
|
185
225
|
fresolver = FileResolver(settings["path"])
|
|
186
226
|
fresolver.append(asset_manager.install_dir)
|
|
187
227
|
if SOURCE_DIR:
|
|
@@ -24,11 +24,25 @@ def _convert_units(value: str):
|
|
|
24
24
|
return value
|
|
25
25
|
|
|
26
26
|
|
|
27
|
+
def _get_units(ds, var, fallback_units=None):
|
|
28
|
+
if "units" in ds[var].attrs:
|
|
29
|
+
return ureg.Unit(_convert_units(ds[var].attrs["units"]))
|
|
30
|
+
elif fallback_units is not None and var in fallback_units:
|
|
31
|
+
return ureg.Unit(_convert_units(fallback_units[var]))
|
|
32
|
+
else:
|
|
33
|
+
raise ValueError(
|
|
34
|
+
"load_aerosol_libradtran(): The input dataset specifies no units "
|
|
35
|
+
f"for variable '{var}'; this can be addressed by passing them through "
|
|
36
|
+
"the 'fallback_units' parameter."
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
|
|
27
40
|
def load_aerosol_libradtran(
|
|
28
41
|
data: PathLike | xr.Dataset,
|
|
29
42
|
particle_shape: Literal["spherical", "spheroidal"] | None = None,
|
|
30
43
|
tolerance: dict[str, pint.Quantity | float] | None = None,
|
|
31
44
|
wbounds: tuple = (None, None),
|
|
45
|
+
fallback_units: dict[str, str] | None = None,
|
|
32
46
|
**kwargs,
|
|
33
47
|
) -> xr.Dataset:
|
|
34
48
|
"""
|
|
@@ -66,6 +80,9 @@ def load_aerosol_libradtran(
|
|
|
66
80
|
lookup for relevant parameters. Units are applied with the same rules as
|
|
67
81
|
for the ``reff`` and ``hum`` parameters.
|
|
68
82
|
|
|
83
|
+
fallback_units : dict, optional
|
|
84
|
+
A mapping that specifies units to apply to variables that are missing them.
|
|
85
|
+
|
|
69
86
|
Returns
|
|
70
87
|
-------
|
|
71
88
|
Dataset
|
|
@@ -124,8 +141,8 @@ def load_aerosol_libradtran(
|
|
|
124
141
|
if var not in data:
|
|
125
142
|
continue
|
|
126
143
|
|
|
144
|
+
units = _get_units(data, var, fallback_units)
|
|
127
145
|
da = data[var]
|
|
128
|
-
units = ureg.Unit(_convert_units(data[var].units))
|
|
129
146
|
default_units = KWARG_TO_DEFAULT_UNITS[kwarg]
|
|
130
147
|
|
|
131
148
|
if len(da) > 1:
|
|
@@ -162,7 +179,8 @@ def load_aerosol_libradtran(
|
|
|
162
179
|
|
|
163
180
|
# Filter wavelengths if requested
|
|
164
181
|
wmin, wmax = wbounds
|
|
165
|
-
|
|
182
|
+
|
|
183
|
+
units = _get_units(data, "wavelen", fallback_units)
|
|
166
184
|
default_units = KWARG_TO_DEFAULT_UNITS["w"]
|
|
167
185
|
|
|
168
186
|
if wmin is not None:
|
|
@@ -176,7 +194,7 @@ def load_aerosol_libradtran(
|
|
|
176
194
|
)
|
|
177
195
|
data = data.where(data["wavelen"] <= wmax).dropna("nlam", how="all")
|
|
178
196
|
|
|
179
|
-
wavelength = data["wavelen"].values *
|
|
197
|
+
wavelength = data["wavelen"].values * units
|
|
180
198
|
|
|
181
199
|
# Phase function
|
|
182
200
|
if particle_shape is None:
|
|
@@ -229,7 +247,6 @@ def load_aerosol_libradtran(
|
|
|
229
247
|
"nthetamax"
|
|
230
248
|
)
|
|
231
249
|
x = mus
|
|
232
|
-
xp = data_selected["theta"].values
|
|
233
250
|
xp = np.cos(np.deg2rad(data_selected["theta"].values)).ravel()
|
|
234
251
|
fp = data_selected["phase"].values
|
|
235
252
|
p = np.interp(x, xp, fp)
|
|
@@ -14,7 +14,7 @@ def install(*extensions):
|
|
|
14
14
|
parameter is unset):
|
|
15
15
|
|
|
16
16
|
* :monobold:`kernel_logging`: Route kernel logs through standard logging
|
|
17
|
-
facilities. Progress display uses `tqdm <https://tqdm.github.io/>`
|
|
17
|
+
facilities. Progress display uses `tqdm <https://tqdm.github.io/>`__.
|
|
18
18
|
* :monobold:`rich_pretty`: Install :func:`rich.pretty <rich.pretty.install>`
|
|
19
19
|
with default configuration to the current Python REPL.
|
|
20
20
|
* :monobold:`rich_traceback`:
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Extensions and helpers for tutorials (legacy).
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import warnings
|
|
6
|
+
|
|
7
|
+
from eradiate.tutorials import * # noqa: F403
|
|
8
|
+
|
|
9
|
+
warnings.warn(
|
|
10
|
+
DeprecationWarning(
|
|
11
|
+
"The 'eradiate.notebook.tutorials' module is deprecated: its features "
|
|
12
|
+
"have been moved to 'eradiate.tutorials'."
|
|
13
|
+
)
|
|
14
|
+
)
|
|
@@ -28,7 +28,7 @@ See Also
|
|
|
28
28
|
|
|
29
29
|
* :class:`hamilton.driver.Driver`
|
|
30
30
|
* `Hamilton's documentation on tags \
|
|
31
|
-
<https://hamilton.dagworks.io/en/latest/reference/decorators/tag/#tag>`
|
|
31
|
+
<https://hamilton.dagworks.io/en/latest/reference/decorators/tag/#tag>`__
|
|
32
32
|
"""
|
|
33
33
|
|
|
34
34
|
import lazy_loader
|
|
@@ -1061,14 +1061,6 @@ KNOWN_DATABASES = {
|
|
|
1061
1061
|
"path": "absorption_ckd/monotropa",
|
|
1062
1062
|
},
|
|
1063
1063
|
"mycena": {
|
|
1064
|
-
"cls": CKDAbsorptionDatabase,
|
|
1065
|
-
"path": "absorption_ckd/mycena_v2",
|
|
1066
|
-
},
|
|
1067
|
-
"mycena_v2": {
|
|
1068
|
-
"cls": CKDAbsorptionDatabase,
|
|
1069
|
-
"path": "absorption_ckd/mycena_v2",
|
|
1070
|
-
},
|
|
1071
|
-
"mycena_v1": { # Deprecated
|
|
1072
1064
|
"cls": CKDAbsorptionDatabase,
|
|
1073
1065
|
"path": "absorption_ckd/mycena",
|
|
1074
1066
|
},
|
|
@@ -64,7 +64,7 @@ class AtmosphereRadProfile(RadProfile):
|
|
|
64
64
|
"look it up and load it. If a dictionary is passed, it will be passed "
|
|
65
65
|
"as keyword argument to ``joseki.make()``. The default is "
|
|
66
66
|
'``{"identifier": "afgl_1986-us_standard", "z": np.linspace(0, 120, 121) * ureg.km), "additional_molecules": False}``. '
|
|
67
|
-
"See
|
|
67
|
+
"See the `Joseki documentation <https://joseki.readthedocs.io/en/latest/reference/joseki/index.html#joseki.make>`__ "
|
|
68
68
|
"for details.",
|
|
69
69
|
type="Dataset",
|
|
70
70
|
init_type="Dataset or path-like or dict",
|
|
@@ -109,7 +109,7 @@ class MolecularAtmosphere(AbstractHeterogeneousAtmosphere):
|
|
|
109
109
|
"look it up and load it. If a dictionary is passed, it will be passed "
|
|
110
110
|
"as keyword argument to ``joseki.make()``. The default is "
|
|
111
111
|
'``joseki.make(identifier="afgl_1986-us_standard", z=np.linspace(0.0, 120.0, 121) * ureg.km)``. '
|
|
112
|
-
"See
|
|
112
|
+
"See the `Joseki documentation <https://joseki.readthedocs.io/en/latest/reference/joseki/index.html#joseki.make>`__ "
|
|
113
113
|
"for details.",
|
|
114
114
|
type="Dataset or None",
|
|
115
115
|
init_type="Dataset or path-like or dict or None",
|
{eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/atmosphere/_particle_layer.py
RENAMED
|
@@ -65,6 +65,11 @@ class ParticleLayer(AbstractHeterogeneousAtmosphere):
|
|
|
65
65
|
specified value (``tau_ref``).
|
|
66
66
|
The particles radiative properties are specified by a data set
|
|
67
67
|
(``dataset``).
|
|
68
|
+
|
|
69
|
+
Notes
|
|
70
|
+
-----
|
|
71
|
+
If the optical property dataset contains only one spectral data point, the
|
|
72
|
+
data is considered uniform throughout the entire spectrum.
|
|
68
73
|
"""
|
|
69
74
|
|
|
70
75
|
bottom: pint.Quantity = documented(
|
|
@@ -164,9 +169,9 @@ class ParticleLayer(AbstractHeterogeneousAtmosphere):
|
|
|
164
169
|
validator=attrs.validators.instance_of(xr.Dataset),
|
|
165
170
|
repr=summary_repr,
|
|
166
171
|
),
|
|
167
|
-
doc="Particle radiative property data set."
|
|
172
|
+
doc="Particle radiative property data set. "
|
|
168
173
|
"If an xarray dataset is passed, the dataset is used as is "
|
|
169
|
-
"(refer to the data guide for the format requirements of this dataset)."
|
|
174
|
+
"(refer to the data guide for the format requirements of this dataset). "
|
|
170
175
|
"If a path is passed, the converter looks it up on the hard drive, using "
|
|
171
176
|
"the file resolver. "
|
|
172
177
|
"If a string is passed, it is interpreted as a particle radiative "
|
|
@@ -264,7 +269,11 @@ class ParticleLayer(AbstractHeterogeneousAtmosphere):
|
|
|
264
269
|
# (n_wavelengths, n_layers)
|
|
265
270
|
ds = self.dataset
|
|
266
271
|
wavelengths = w.m_as(ds.w.attrs["units"])
|
|
267
|
-
|
|
272
|
+
|
|
273
|
+
if len(ds["w"]) == 1:
|
|
274
|
+
interpolated = to_quantity(ds.albedo.sel(w=wavelengths, method="nearest"))
|
|
275
|
+
else:
|
|
276
|
+
interpolated = to_quantity(ds.albedo.interp(w=wavelengths))
|
|
268
277
|
where_present = np.reshape(self.eval_fractions(zgrid) > 0, (1, -1))
|
|
269
278
|
return interpolated * where_present
|
|
270
279
|
|
|
@@ -278,8 +287,17 @@ class ParticleLayer(AbstractHeterogeneousAtmosphere):
|
|
|
278
287
|
ds = self.dataset
|
|
279
288
|
ds_w_units = ureg(ds.w.attrs["units"])
|
|
280
289
|
wavelengths = np.atleast_1d(w.m_as(ds_w_units))
|
|
281
|
-
|
|
282
|
-
|
|
290
|
+
|
|
291
|
+
if len(ds["w"]) == 1:
|
|
292
|
+
sigma_t_star = to_quantity(ds.sigma_t.sel(w=wavelengths, method="nearest"))
|
|
293
|
+
sigma_t_star_ref = to_quantity(
|
|
294
|
+
ds.sigma_t.sel(w=self.w_ref.m_as(ds_w_units), method="nearest")
|
|
295
|
+
)
|
|
296
|
+
else:
|
|
297
|
+
sigma_t_star = to_quantity(ds.sigma_t.interp(w=wavelengths))
|
|
298
|
+
sigma_t_star_ref = to_quantity(
|
|
299
|
+
ds.sigma_t.interp(w=self.w_ref.m_as(ds_w_units))
|
|
300
|
+
)
|
|
283
301
|
|
|
284
302
|
# Compute target optical thickness value
|
|
285
303
|
tau = self.tau_ref * sigma_t_star / sigma_t_star_ref
|
|
@@ -12,7 +12,7 @@ from ._rami_scenarios import (
|
|
|
12
12
|
from ._rami_scenarios import (
|
|
13
13
|
RAMIHomogeneousAbstractCanopies as RAMIHomogeneousAbstractCanopies,
|
|
14
14
|
)
|
|
15
|
-
from ._rami_scenarios import
|
|
15
|
+
from ._rami_scenarios import RAMIScenarioVariant as RAMIScenarioVariant
|
|
16
16
|
from ._rami_scenarios import load_rami_scenario as load_rami_scenario
|
|
17
17
|
from ._tree import AbstractTree as AbstractTree
|
|
18
18
|
from ._tree import MeshTree as MeshTree
|
{eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/biosphere/_rami_scenarios.py
RENAMED
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import itertools
|
|
4
4
|
from enum import Enum
|
|
5
5
|
from pathlib import Path
|
|
6
|
-
from typing import Optional
|
|
6
|
+
from typing import Optional, Union
|
|
7
7
|
from urllib.parse import urljoin
|
|
8
8
|
|
|
9
9
|
import pooch
|
|
@@ -14,6 +14,8 @@ _DATA_URL_ROOT = "https://eradiate.eu/data/store/unstable/scenarios/rami5/"
|
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
class RAMIActualCanopies(Enum):
|
|
17
|
+
"""Enumeration of RAMI actual canopies."""
|
|
18
|
+
|
|
17
19
|
JARVSELJA_PINE_STAND = "HET07_JPS_SUM" # Summer
|
|
18
20
|
OFENPASS_PINE_STAND = "HET08_OPS_WIN" # Winter
|
|
19
21
|
JARVSELJA_BIRCH_STAND_SUMMER = "HET09_JBS_SUM" # Summer
|
|
@@ -25,6 +27,8 @@ class RAMIActualCanopies(Enum):
|
|
|
25
27
|
|
|
26
28
|
|
|
27
29
|
class RAMIHeterogeneousAbstractCanopies(Enum):
|
|
30
|
+
"""Enumeration of RAMI heterogeneous abstract canopies."""
|
|
31
|
+
|
|
28
32
|
ANISOTROPIC_BACKGROUND_OVERSTOREY_SPARSE_BRF_MODEL_A = "HET10_DIS_S1A"
|
|
29
33
|
ANISOTROPIC_BACKGROUND_OVERSTOREY_SPARSE_BRF_MODEL_B = "HET11_DIS_S1B"
|
|
30
34
|
ANISOTROPIC_BACKGROUND_OVERSTOREY_SPARSE_BRF_MODEL_C = "HET12_DIS_S1C"
|
|
@@ -44,6 +48,8 @@ class RAMIHeterogeneousAbstractCanopies(Enum):
|
|
|
44
48
|
|
|
45
49
|
|
|
46
50
|
class RAMIHomogeneousAbstractCanopies(Enum):
|
|
51
|
+
"""Enumeration of RAMI homogeneous abstract canopies."""
|
|
52
|
+
|
|
47
53
|
ANISOTROPIC_BACKGROUND_PLANOPHILE_A = "HOM23_DIS_P1A"
|
|
48
54
|
ANISOTROPIC_BACKGROUND_PLANOPHILE_B = "HOM24_DIS_P1B"
|
|
49
55
|
ANISOTROPIC_BACKGROUND_PLANOPHILE_C = "HOM25_DIS_P1C"
|
|
@@ -60,25 +66,30 @@ class RAMIHomogeneousAbstractCanopies(Enum):
|
|
|
60
66
|
ADJACENT_CANOPIES_MEDIUM_ERECTOPHILE_SPARSE_PLANOPHILE = "HOM30_DIS_ED0"
|
|
61
67
|
|
|
62
68
|
|
|
63
|
-
|
|
69
|
+
RAMICanopies = Union[
|
|
70
|
+
RAMIActualCanopies,
|
|
71
|
+
RAMIHomogeneousAbstractCanopies,
|
|
72
|
+
RAMIHeterogeneousAbstractCanopies,
|
|
73
|
+
] #: Type alias to a union of all RAMI canopy enumerations.
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class RAMIScenarioVariant(Enum):
|
|
77
|
+
"""Enumeration of RAMI scenario variants (original or simplified)."""
|
|
78
|
+
|
|
64
79
|
ORIGINAL = "original"
|
|
65
80
|
SIMPLIFIED = "simplified"
|
|
66
81
|
|
|
67
82
|
|
|
68
83
|
def generate_name(
|
|
69
|
-
scenario_name:
|
|
70
|
-
|
|
71
|
-
| RAMIHeterogeneousAbstractCanopies
|
|
72
|
-
| RAMIHomogeneousAbstractCanopies
|
|
73
|
-
),
|
|
74
|
-
version: RAMIScenarioVersion = RAMIScenarioVersion.ORIGINAL,
|
|
84
|
+
scenario_name: RAMICanopies,
|
|
85
|
+
version: RAMIScenarioVariant = RAMIScenarioVariant.ORIGINAL,
|
|
75
86
|
) -> str:
|
|
76
87
|
"""
|
|
77
88
|
Generate a name for a scenario based on its name and version.
|
|
78
89
|
|
|
79
90
|
Parameters
|
|
80
91
|
----------
|
|
81
|
-
scenario_name :
|
|
92
|
+
scenario_name : RAMICanopies
|
|
82
93
|
The name of the scenario.
|
|
83
94
|
version : ScenarioVersion
|
|
84
95
|
The version of the scenario.
|
|
@@ -90,29 +101,18 @@ def generate_name(
|
|
|
90
101
|
"""
|
|
91
102
|
return (
|
|
92
103
|
f"{scenario_name.value}-{version.value}"
|
|
93
|
-
if version ==
|
|
104
|
+
if version == RAMIScenarioVariant.SIMPLIFIED
|
|
94
105
|
else scenario_name.value
|
|
95
106
|
)
|
|
96
107
|
|
|
97
108
|
|
|
98
|
-
def _convert_to_enum(
|
|
99
|
-
scenario_name: (
|
|
100
|
-
str
|
|
101
|
-
| RAMIActualCanopies
|
|
102
|
-
| RAMIHeterogeneousAbstractCanopies
|
|
103
|
-
| RAMIHomogeneousAbstractCanopies
|
|
104
|
-
),
|
|
105
|
-
) -> (
|
|
106
|
-
RAMIActualCanopies
|
|
107
|
-
| RAMIHeterogeneousAbstractCanopies
|
|
108
|
-
| RAMIHomogeneousAbstractCanopies
|
|
109
|
-
):
|
|
109
|
+
def _convert_to_enum(scenario_name: str | RAMICanopies) -> RAMICanopies:
|
|
110
110
|
"""
|
|
111
111
|
Convert a scenario name to an enum if it is a string.
|
|
112
112
|
|
|
113
113
|
Parameters
|
|
114
114
|
----------
|
|
115
|
-
scenario_name : str or
|
|
115
|
+
scenario_name : str or RAMICanopies
|
|
116
116
|
The name of the scenario.
|
|
117
117
|
|
|
118
118
|
Returns
|
|
@@ -138,13 +138,8 @@ def _convert_to_enum(
|
|
|
138
138
|
|
|
139
139
|
|
|
140
140
|
def load_rami_scenario(
|
|
141
|
-
scenario_name:
|
|
142
|
-
|
|
143
|
-
| RAMIActualCanopies
|
|
144
|
-
| RAMIHeterogeneousAbstractCanopies
|
|
145
|
-
| RAMIHomogeneousAbstractCanopies
|
|
146
|
-
),
|
|
147
|
-
version: RAMIScenarioVersion = RAMIScenarioVersion.ORIGINAL,
|
|
141
|
+
scenario_name: str | RAMICanopies,
|
|
142
|
+
version: RAMIScenarioVariant = RAMIScenarioVariant.ORIGINAL,
|
|
148
143
|
padding: int = 0,
|
|
149
144
|
unpack_folder: Optional[Path] = None,
|
|
150
145
|
spectral_data: Optional[dict] = None,
|
|
@@ -160,7 +155,7 @@ def load_rami_scenario(
|
|
|
160
155
|
scenario_name : str or RAMIActualCanopies or RAMIHeterogeneousAbstractCanopies or RAMIHomogeneousAbstractCanopies
|
|
161
156
|
The name of the RAMI-V scenario. If a string is provided, it will
|
|
162
157
|
automatically be converted to the appropriate enum.
|
|
163
|
-
version :
|
|
158
|
+
version : RAMIScenarioVariant
|
|
164
159
|
The version of the scenario.
|
|
165
160
|
padding : int, optional
|
|
166
161
|
The padding to apply to the scenario, defaults to 0.
|
|
@@ -32,7 +32,7 @@ class SceneElement(ABC):
|
|
|
32
32
|
Warnings
|
|
33
33
|
--------
|
|
34
34
|
All subclasses *must* have a hash, thus ``eq`` must be ``False`` (see
|
|
35
|
-
`attrs docs on hashing <https://www.attrs.org/en/stable/hashing.html>`
|
|
35
|
+
`attrs docs on hashing <https://www.attrs.org/en/stable/hashing.html>`__
|
|
36
36
|
for a complete explanation). This is required in order to make it possible
|
|
37
37
|
to use caching decorators on instance methods.
|
|
38
38
|
|