Skip to main content

xleaf

Canopy reflectance simulated in rainbows.

Leaf and canopy radiative transfer modeling tools built on PROSPECT-D and SAIL.

GitHub PyPI version GitHub last commit


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.


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

Christopher Anderson1 2

Twitter Follow GitHub Stars

  1. Planet Labs PBC, San Francisco

  2. Center for Conservation Biology, Stanford University

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

xleaf-1.1.0.tar.gz (271.2 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

xleaf-1.1.0-cp311-cp311-manylinux_2_24_x86_64.whl (3.9 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.24+ x86-64

xleaf-1.1.0-cp311-cp311-macosx_26_0_arm64.whl (114.6 kB view details)

Uploaded CPython 3.11macOS 26.0+ ARM64

File details

Details for the file xleaf-1.1.0.tar.gz.

File metadata

  • Download URL: xleaf-1.1.0.tar.gz
  • Upload date:
  • Size: 271.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for xleaf-1.1.0.tar.gz
Algorithm Hash digest
SHA256 766328798b9b5adc7f9f2b8f55d2a985013cfa8c75c27d1a1aed2917642c2bbf
MD5 1ba0687b3aad0b03217591fe4304fdda
BLAKE2b-256 e1a7e5756dbcd95abd7bf8f57a4ab8c386d60c7adadf48b3510fba87546d4926

See more details on using hashes here.

File details

Details for the file xleaf-1.1.0-cp311-cp311-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for xleaf-1.1.0-cp311-cp311-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 dbe5edfbc06464cc4862f9939bafebbd36545b757636ee390e4348acd4289885
MD5 3a173cd946ba914240e259bd47df1f9a
BLAKE2b-256 8e778f10eb4b925c813e6b4a61ac919a16b86c1f5dfbd74366253485d27a23d1

See more details on using hashes here.

File details

Details for the file xleaf-1.1.0-cp311-cp311-macosx_26_0_arm64.whl.

File metadata

File hashes

Hashes for xleaf-1.1.0-cp311-cp311-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 2b4d4902a3f0b6899238183ce56fc91828d089aebcb8329376529243fd24f202
MD5 169b2f2798de4197221f87f4500ae7cb
BLAKE2b-256 6664ca779771030824c50630385791726d9ac390e07fa4c3ae8241d3228a9571

See more details on using hashes here.

Release history Release notifications | RSS feed

1.2.2

4 files

1.2.1

4 files

1.2.0

3 files

This release

1.1.0 This release

3 files

1.0.0

2 files

0.1.1

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page