xleaf
Leaf and canopy radiative transfer modeling tools built on PROSPECT-D and SAIL.
Introduction
🌳 xleaf is a python package for running leaf and canopy simulation models using PROSAIL. It provides python bindings to the PROSPECT-D & 4SAIL Fortran code.
🌿 It includes sensible defaults that make it easy to get up and running quickly, and clear code documentation in the form of docstrings and type hints.
📚 All credit for the fundamental modeling code and for the underlying science belongs to the original researchers. xleaf is mostly a wrapper. Please cite their most recent research:
@article{feret2017prospect,
title={PROSPECT-D: Towards modeling leaf optical properties through a complete lifecycle},
author={Feret, J-B and Gitelson, AA and Noble, SD and Jacquemoud, S},
journal={Remote Sensing of Environment},
volume={193},
pages={204--215},
year={2017},
publisher={Elsevier}
}
🧙 Shout out to my man JB.
Install
Install from PyPI:
pip install xleaf
Development
This project uses pixi to manage dependencies and builds. To set up a development environment:
pixi install
This installs all dependencies including the Fortran compiler (gfortran), meson, and numpy. To run tests:
pixi run test
Leaf and canopy simulations
import xleaf
import matplotlib.pyplot as plt
# run with off-the-shelf defaults
leaf = xleaf.simulate_leaf()
# or specify detailed parameters
canopy = xleaf.simulate_canopy(
chl = 40, # ug/cm2
car = 8, # ug/cm2
antho = 0.5, # ug/cm2
ewt = 0.01, # cm
lma = 0.009, # g/cm2
N = 1.5, # unitless
lai = 3.0, # m2/m2
lidf = 30, # degrees
soil_dryness = 0.75, # %
solar_zenith = 35, # degrees
solar_azimuth = 120, # degrees
view_zenith = 0, # degrees
view_azimuth = 60, # degrees
hot_spot = 0.01, # unitless
)
# and plot them together
plt.plot(xleaf.wavelengths, leaf, label='leaf')
plt.plot(xleaf.wavelengths, canopy, label='canopy')
plt.legend()
📄 The definitions and expected range of values for each parameter are described in the xleaf docstrings.
Chaining leaf and canopy models
🔗 simulate_canopy runs PROSPECT and 4SAIL together. If you'd rather run the canopy model on a leaf spectrum you already have — a measured spectrum, or one from a different leaf model — use simulate_sail. It takes leaf reflectance and transmittance directly, so you can pair it with simulate_leaf(transmittance=True):
import xleaf
import matplotlib.pyplot as plt
# simulate a leaf, returning both reflectance and transmittance
reflectance, transmittance = xleaf.simulate_leaf(
chl = 40, # ug/cm2
car = 8, # ug/cm2
antho = 0.5, # ug/cm2
ewt = 0.01, # cm
lma = 0.009, # g/cm2
N = 1.5, # unitless
transmittance = True,
)
# then run the canopy model on that leaf spectrum
canopy = xleaf.simulate_sail(
reflectance,
transmittance,
lai = 3.0, # m2/m2
lidf = 30, # degrees
soil_dryness = 0.75, # %
solar_zenith = 35, # degrees
solar_azimuth = 120, # degrees
view_zenith = 0, # degrees
view_azimuth = 60, # degrees
hot_spot = 0.01, # unitless
)
plt.plot(xleaf.wavelengths, reflectance, label='leaf')
plt.plot(xleaf.wavelengths, canopy, label='canopy')
plt.legend()
Random forests
📊 xleaf provides classes for generating random parameters within the global range of expected values. These classes have a .sample() method for generating an appropriate random value based on a literature review.
import xleaf
import matplotlib.pyplot as plt
# generate 5 random leaf spectra from global defaults
for idx in range(5):
chl = xleaf.ChlorophyllSampler.sample()
car = xleaf.CarotenoidSampler.sample()
antho = xleaf.AnthocyaninSampler.sample()
ewt = xleaf.EWTSampler.sample()
lma = xleaf.LMASampler.sample()
N = xleaf.NSampler.sample()
leaf = xleaf.simulate_leaf(chl, car, antho, ewt, lma, N)
plt.plot(xleaf.wavelengths, leaf, label=f"leaf {idx+1}")
plt.legend()
🧪 Or experiment by setting the range of values yourself:
import xleaf
import matplotlib.pyplot as plt
MyLAISampler = xleaf.UniformSampler(min=2, max=6)
MyVZASampler = xleaf.NormalSampler(mean=0, stdv=3, min=-10, max=10)
# generate 5 random canopy spectra just varying LAI/VZA
for idx in range(5):
lai = MyLAISampler.sample()
vza = MyVZASampler.sample()
canopy = xleaf.simulate_canopy(lai=lai, view_zenith=vza)
plt.plot(xleaf.wavelengths, canopy, label=f"lai: {lai:0.2f}, vza: {vza:0.2f}")
plt.legend()
⚡ These parameters don't always vary independently. Try to exercise caution when constructing parameter estimates to ensure biological realism.
Developed by
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file xleaf-1.2.0.tar.gz.
File metadata
- Download URL: xleaf-1.2.0.tar.gz
- Upload date:
- Size: 280.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d699d34654721a4c38e34dfaa9c44f76d370eafe0c6aafeef0808fcae2aa6b6d
|
|
| MD5 |
81e158bc48c7e5d23ef4db1d5634b690
|
|
| BLAKE2b-256 |
1ad64bfd407fb807c98fb83c9b3a9c1bdb4fc10ca73af105f69883487b9a3f29
|
File details
Details for the file xleaf-1.2.0-cp311-cp311-manylinux_2_24_x86_64.whl.
File metadata
- Download URL: xleaf-1.2.0-cp311-cp311-manylinux_2_24_x86_64.whl
- Upload date:
- Size: 4.0 MB
- Tags: CPython 3.11, manylinux: glibc 2.24+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eaeaf2142cf480e9a9bc62a9ae0ea90f3315f381cb36fb955c1e23e43e82d44f
|
|
| MD5 |
9884c7317f8a3539deb011b6ece36d9c
|
|
| BLAKE2b-256 |
19278f10702a631df6b71c2701bfd68143f864f89a90272c936e739fc6aa4998
|
File details
Details for the file xleaf-1.2.0-cp311-cp311-macosx_26_0_arm64.whl.
File metadata
- Download URL: xleaf-1.2.0-cp311-cp311-macosx_26_0_arm64.whl
- Upload date:
- Size: 128.0 kB
- Tags: CPython 3.11, macOS 26.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f571e0777234d14c5d5e8b4c07387d173cac585c210fb90ba767029791dea7dc
|
|
| MD5 |
af24abfa51944f0d617cfdcff50fe231
|
|
| BLAKE2b-256 |
874d7fded0559bb7a12cb95620509de5ed2e58bb780414f5339b18a7f77f8b0f
|