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.
Files changed (207) hide show
  1. {eradiate-0.31.0.dev0/src/eradiate.egg-info → eradiate-0.31.0.dev1}/PKG-INFO +1 -1
  2. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/pyproject.toml +3 -2
  3. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/config/_settings.py +1 -1
  4. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/data/_asset_manager.py +1 -1
  5. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/data/_file_resolver.py +42 -2
  6. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/data/io.py +21 -4
  7. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/notebook/__init__.py +1 -1
  8. eradiate-0.31.0.dev1/src/eradiate/notebook/tutorials.py +14 -0
  9. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/pipelines/__init__.py +1 -1
  10. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/radprops/_absorption.py +0 -8
  11. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/radprops/_atmosphere.py +1 -1
  12. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/rng.py +1 -1
  13. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/atmosphere/_molecular.py +1 -1
  14. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/atmosphere/_particle_layer.py +23 -5
  15. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/biosphere/__init__.pyi +1 -1
  16. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/biosphere/_rami_scenarios.py +26 -31
  17. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/core.py +1 -1
  18. eradiate-0.31.0.dev1/src/eradiate/tutorials.py +257 -0
  19. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/util/misc.py +3 -3
  20. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1/src/eradiate.egg-info}/PKG-INFO +1 -1
  21. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate.egg-info/SOURCES.txt +1 -0
  22. eradiate-0.31.0.dev0/src/eradiate/notebook/tutorials.py +0 -129
  23. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/LICENSE +0 -0
  24. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/MANIFEST.in +0 -0
  25. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/README.md +0 -0
  26. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/resources/README_PyPI.md +0 -0
  27. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/setup.cfg +0 -0
  28. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/__init__.py +0 -0
  29. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/__init__.pyi +0 -0
  30. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/_factory.py +0 -0
  31. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/_mode.py +0 -0
  32. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/_version.py +0 -0
  33. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/attrs.py +0 -0
  34. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/cfconventions.py +0 -0
  35. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/cli/__init__.py +0 -0
  36. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/cli/_console.py +0 -0
  37. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/cli/data.py +0 -0
  38. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/cli/show.py +0 -0
  39. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/cli/srf.py +0 -0
  40. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/config/__init__.py +0 -0
  41. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/config/__init__.pyi +0 -0
  42. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/config/_defaults.py +0 -0
  43. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/config/eradiate.toml +0 -0
  44. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/constants.py +0 -0
  45. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/contexts.py +0 -0
  46. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/converters.py +0 -0
  47. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/data/__init__.py +0 -0
  48. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/data/__init__.pyi +0 -0
  49. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/data/_validation.py +0 -0
  50. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/data/resources.yml +0 -0
  51. {eradiate-0.31.0.dev0/src/eradiate/util → eradiate-0.31.0.dev1/src/eradiate/data/schemas}/__init__.py +0 -0
  52. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/data/schemas/particle_dataset_v1.yml +0 -0
  53. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/data/schemas/srf_v1.yml +0 -0
  54. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/exceptions.py +0 -0
  55. {eradiate-0.31.0.dev0/src/eradiate/scenes/surface → eradiate-0.31.0.dev1/src/eradiate/experiments}/__init__.py +0 -0
  56. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/experiments/__init__.pyi +0 -0
  57. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/experiments/_atmosphere.py +0 -0
  58. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/experiments/_canopy.py +0 -0
  59. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/experiments/_canopy_atmosphere.py +0 -0
  60. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/experiments/_core.py +0 -0
  61. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/experiments/_dem.py +0 -0
  62. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/experiments/_helpers.py +0 -0
  63. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/frame.py +0 -0
  64. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/kernel/__init__.py +0 -0
  65. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/kernel/__init__.pyi +0 -0
  66. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/kernel/_bitmap.py +0 -0
  67. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/kernel/_bsdf.py +0 -0
  68. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/kernel/_kernel_dict.py +0 -0
  69. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/kernel/_render.py +0 -0
  70. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/kernel/_versions.py +0 -0
  71. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/kernel/gridvolume.py +0 -0
  72. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/kernel/logging.py +0 -0
  73. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/kernel/transform.py +0 -0
  74. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/notebook/__init__.pyi +0 -0
  75. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/pipelines/__init__.pyi +0 -0
  76. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/pipelines/core.py +0 -0
  77. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/pipelines/definitions.py +0 -0
  78. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/pipelines/logic.py +0 -0
  79. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/plot.py +0 -0
  80. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/py.typed +0 -0
  81. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/quad.py +0 -0
  82. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/radprops/__init__.py +0 -0
  83. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/radprops/__init__.pyi +0 -0
  84. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/radprops/_array.py +0 -0
  85. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/radprops/_core.py +0 -0
  86. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/radprops/rayleigh.py +0 -0
  87. {eradiate-0.31.0.dev0/src/eradiate/scenes/spectra → eradiate-0.31.0.dev1/src/eradiate/scenes}/__init__.py +0 -0
  88. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/__init__.pyi +0 -0
  89. {eradiate-0.31.0.dev0/src/eradiate/scenes/shapes → eradiate-0.31.0.dev1/src/eradiate/scenes/atmosphere}/__init__.py +0 -0
  90. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/atmosphere/__init__.pyi +0 -0
  91. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/atmosphere/_core.py +0 -0
  92. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/atmosphere/_heterogeneous.py +0 -0
  93. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/atmosphere/_homogeneous.py +0 -0
  94. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/atmosphere/_particle_dist.py +0 -0
  95. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/atmosphere/_util.py +0 -0
  96. {eradiate-0.31.0.dev0/src/eradiate/scenes/phase → eradiate-0.31.0.dev1/src/eradiate/scenes/biosphere}/__init__.py +0 -0
  97. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/biosphere/_canopy_loader.py +0 -0
  98. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/biosphere/_core.py +0 -0
  99. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/biosphere/_discrete.py +0 -0
  100. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/biosphere/_leaf_cloud.py +0 -0
  101. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/biosphere/_tree.py +0 -0
  102. {eradiate-0.31.0.dev0/src/eradiate/scenes/measure → eradiate-0.31.0.dev1/src/eradiate/scenes/bsdfs}/__init__.py +0 -0
  103. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/bsdfs/__init__.pyi +0 -0
  104. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/bsdfs/_black.py +0 -0
  105. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/bsdfs/_checkerboard.py +0 -0
  106. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/bsdfs/_core.py +0 -0
  107. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/bsdfs/_hapke.py +0 -0
  108. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/bsdfs/_lambertian.py +0 -0
  109. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/bsdfs/_mqdiffuse.py +0 -0
  110. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/bsdfs/_ocean_grasp.py +0 -0
  111. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/bsdfs/_ocean_legacy.py +0 -0
  112. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/bsdfs/_ocean_mishchenko.py +0 -0
  113. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/bsdfs/_opacity_mask.py +0 -0
  114. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/bsdfs/_rpv.py +0 -0
  115. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/bsdfs/_rtls.py +0 -0
  116. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/geometry.py +0 -0
  117. {eradiate-0.31.0.dev0/src/eradiate/scenes/integrators → eradiate-0.31.0.dev1/src/eradiate/scenes/illumination}/__init__.py +0 -0
  118. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/illumination/__init__.pyi +0 -0
  119. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/illumination/_astro_object.py +0 -0
  120. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/illumination/_constant.py +0 -0
  121. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/illumination/_core.py +0 -0
  122. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/illumination/_directional.py +0 -0
  123. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/illumination/_spot.py +0 -0
  124. {eradiate-0.31.0.dev0/src/eradiate/scenes/illumination → eradiate-0.31.0.dev1/src/eradiate/scenes/integrators}/__init__.py +0 -0
  125. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/integrators/__init__.pyi +0 -0
  126. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/integrators/_core.py +0 -0
  127. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/integrators/_path_tracers.py +0 -0
  128. {eradiate-0.31.0.dev0/src/eradiate/scenes/bsdfs → eradiate-0.31.0.dev1/src/eradiate/scenes/measure}/__init__.py +0 -0
  129. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/measure/__init__.pyi +0 -0
  130. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/measure/_core.py +0 -0
  131. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/measure/_distant.py +0 -0
  132. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/measure/_distant_flux.py +0 -0
  133. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/measure/_hemispherical_distant.py +0 -0
  134. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/measure/_multi_distant.py +0 -0
  135. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/measure/_multi_radiancemeter.py +0 -0
  136. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/measure/_perspective.py +0 -0
  137. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/measure/_radiancemeter.py +0 -0
  138. {eradiate-0.31.0.dev0/src/eradiate/scenes/biosphere → eradiate-0.31.0.dev1/src/eradiate/scenes/phase}/__init__.py +0 -0
  139. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/phase/__init__.pyi +0 -0
  140. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/phase/_blend.py +0 -0
  141. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/phase/_core.py +0 -0
  142. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/phase/_hg.py +0 -0
  143. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/phase/_isotropic.py +0 -0
  144. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/phase/_rayleigh.py +0 -0
  145. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/phase/_tabulated.py +0 -0
  146. {eradiate-0.31.0.dev0/src/eradiate/scenes/atmosphere → eradiate-0.31.0.dev1/src/eradiate/scenes/shapes}/__init__.py +0 -0
  147. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/shapes/__init__.pyi +0 -0
  148. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/shapes/_buffermesh.py +0 -0
  149. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/shapes/_core.py +0 -0
  150. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/shapes/_cuboid.py +0 -0
  151. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/shapes/_filemesh.py +0 -0
  152. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/shapes/_rectangle.py +0 -0
  153. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/shapes/_sphere.py +0 -0
  154. {eradiate-0.31.0.dev0/src/eradiate/scenes → eradiate-0.31.0.dev1/src/eradiate/scenes/spectra}/__init__.py +0 -0
  155. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/spectra/__init__.pyi +0 -0
  156. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/spectra/_air_scattering_coefficient.py +0 -0
  157. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/spectra/_core.py +0 -0
  158. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/spectra/_interpolated.py +0 -0
  159. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/spectra/_solar_irradiance.py +0 -0
  160. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/spectra/_uniform.py +0 -0
  161. {eradiate-0.31.0.dev0/src/eradiate/experiments → eradiate-0.31.0.dev1/src/eradiate/scenes/surface}/__init__.py +0 -0
  162. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/surface/__init__.pyi +0 -0
  163. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/surface/_basic.py +0 -0
  164. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/surface/_central_patch.py +0 -0
  165. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/surface/_core.py +0 -0
  166. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/scenes/surface/_dem.py +0 -0
  167. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/spectral/__init__.py +0 -0
  168. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/spectral/__init__.pyi +0 -0
  169. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/spectral/ckd_quad.py +0 -0
  170. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/spectral/grid.py +0 -0
  171. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/spectral/index.py +0 -0
  172. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/spectral/response.py +0 -0
  173. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/srf_tools.py +0 -0
  174. {eradiate-0.31.0.dev0/src/eradiate/test_tools/test_cases → eradiate-0.31.0.dev1/src/eradiate/test_tools}/__init__.py +0 -0
  175. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/test_tools/benchmark/__init__.py +0 -0
  176. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/test_tools/benchmark/asvdb.py +0 -0
  177. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/test_tools/benchmark/cli.py +0 -0
  178. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/test_tools/benchmark/utils.py +0 -0
  179. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/test_tools/data.py +0 -0
  180. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/test_tools/fixtures.py +0 -0
  181. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/test_tools/plugin.py +0 -0
  182. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/test_tools/regression.py +0 -0
  183. {eradiate-0.31.0.dev0/src/eradiate/test_tools → eradiate-0.31.0.dev1/src/eradiate/test_tools/test_cases}/__init__.py +0 -0
  184. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/test_tools/test_cases/atmospheres.py +0 -0
  185. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/test_tools/test_cases/ocean.py +0 -0
  186. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/test_tools/test_cases/rami4atm.py +0 -0
  187. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/test_tools/test_cases/romc.py +0 -0
  188. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/test_tools/types.py +0 -0
  189. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/test_tools/util.py +0 -0
  190. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/typing.py +0 -0
  191. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/units.py +0 -0
  192. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/units.txt +0 -0
  193. {eradiate-0.31.0.dev0/src/eradiate/data/schemas → eradiate-0.31.0.dev1/src/eradiate/util}/__init__.py +0 -0
  194. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/util/deprecation.py +0 -0
  195. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/util/numpydoc.py +0 -0
  196. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/util/sys_info.py +0 -0
  197. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/validators.py +0 -0
  198. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/warp.py +0 -0
  199. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/xarray/__init__.py +0 -0
  200. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/xarray/__init__.pyi +0 -0
  201. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/xarray/_accessors.py +0 -0
  202. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/xarray/_helpers.py +0 -0
  203. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate/xarray/interp.py +0 -0
  204. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate.egg-info/dependency_links.txt +0 -0
  205. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate.egg-info/entry_points.txt +0 -0
  206. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate.egg-info/requires.txt +0 -0
  207. {eradiate-0.31.0.dev0 → eradiate-0.31.0.dev1}/src/eradiate.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: eradiate
3
- Version: 0.31.0.dev0
3
+ Version: 0.31.0.dev1
4
4
  Summary: A radiative transfer model for the Earth observation community
5
5
  Author: The Eradiate Team
6
6
  Maintainer: The Eradiate Team
@@ -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-dev0"
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>=0.28.0,<0.29.0",
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
- Resolved path
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
- units = ureg.Unit(_convert_units(data["wavelen"].units))
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 * ureg(data["wavelen"].units)
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 `the Joseki docs <https://rayference.github.io/joseki/latest/reference/#src.joseki.core.make>`_ "
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",
@@ -1,7 +1,7 @@
1
1
  """
2
2
  Components related with pseudo-random number generation.
3
3
 
4
- Inspired by `SeedBank <https://github.com/lenskit/seedbank>`_.
4
+ Inspired by `SeedBank <https://github.com/lenskit/seedbank>`__.
5
5
  """
6
6
 
7
7
  from __future__ import annotations
@@ -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 `the Joseki docs <https://rayference.github.io/joseki/latest/reference/#src.joseki.core.make>`_ "
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",
@@ -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
- interpolated = to_quantity(ds.albedo.interp(w=wavelengths))
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
- sigma_t_star = to_quantity(ds.sigma_t.interp(w=wavelengths))
282
- sigma_t_star_ref = to_quantity(ds.sigma_t.interp(w=self.w_ref.m_as(ds_w_units)))
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 RAMIScenarioVersion as RAMIScenarioVersion
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
@@ -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
- class RAMIScenarioVersion(Enum):
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
- RAMIActualCanopies
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 : RAMIActualCanopies or RAMIHeterogeneousAbstractCanopies or RAMIHomogeneousAbstractCanopies
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 == RAMIScenarioVersion.SIMPLIFIED
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 RAMIActualCanopies or RAMIHeterogeneousAbstractCanopies or RAMIHomogeneousAbstractCanopies
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
- str
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 : RAMIScenarioVersion
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