Photosynthesis Models
PhyTorch implements the Farquhar-von Caemmerer-Berry (FvCB) model for C3 photosynthesis, one of the most widely used biochemical models of leaf photosynthesis.
FvCB Model
The FvCB model calculates net CO2 assimilation rate () as the minimum of three potentially limiting rates:
where:
- Rubisco-limited rate (): Limited by the maximum carboxylation rate ()
- RuBP regeneration-limited rate (): Limited by electron transport capacity ()
- Triose phosphate utilization-limited rate (): Limited by the capacity to use photosynthetic products
- : CO2 compensation point in the absence of day respiration
- : Intercellular CO2 concentration
- : Day respiration
Rubisco-Limited Rate
RuBP Regeneration-Limited Rate
where is the electron transport rate, calculated from light response
Triose Phosphate Utilization-Limited Rate
where:
- is the triose phosphate utilization rate
- is the fraction of glycolate carbon not returned to the chloroplast (typically 0-0.5)
Basic Usage
PhyTorch's unified API makes fitting photosynthesis models simple and consistent:
from phytorch import fit
from phytorch.models.photosynthesis import FvCB
import pandas as pd
# Load LI-COR A-Ci curve data
df = pd.read_csv('your_aci_data.csv')
# Prepare data dictionary
data = {
'Ci': df['Ci'].values, # Intercellular CO2 (μmol/mol)
'Q': df['PARi'].values, # Light intensity (μmol/m²/s)
'Tleaf': df['Tleaf'].values, # Leaf temperature (°C)
'A': df['Photo'].values # Net photosynthesis (μmol/m²/s)
}
# Fit the FvCB model (that's it!)
result = fit(FvCB(), data)
# View fitted parameters
print(f"Vcmax25: {result.parameters['Vcmax25']:.2f} μmol/m²/s")
print(f"Jmax25: {result.parameters['Jmax25']:.2f} μmol/m²/s")
print(f"Rd25: {result.parameters['Rd25']:.2f} μmol/m²/s")
print(f"R² = {result.r_squared:.4f}")
# Generate comprehensive plots
# Includes: 1:1, A vs Ci, A vs Q, A vs T, and 3D surfaces
result.plot()
# Save the plot
result.plot(save='fvcb_fit.png')
Key Parameters
PhyTorch fits the following parameters at 25°C:
| Parameter | Description | Typical Range | Units |
|---|---|---|---|
Vcmax25 | Maximum carboxylation rate at 25°C | 50-150 | μmol/m²/s |
Jmax25 | Maximum electron transport rate at 25°C | 100-250 | μmol/m²/s |
Rd25 | Day respiration at 25°C | 0.5-2.0 | μmol/m²/s |
Tp25 | Triose phosphate utilization at 25°C | 5-15 | μmol/m²/s |
Biochemical Constants
| Parameter | Description | Value at 25°C | Units |
|---|---|---|---|
Kc | Michaelis constant for CO2 | 260 | μmol/mol |
Ko | Michaelis constant for O2 | 179 | mmol/mol |
Γ* | CO2 compensation point | ~40 | μmol/mol |
Temperature Response
PhyTorch supports two temperature response types:
Type 1: Arrhenius Function
from phytorch import fit
from phytorch.models.photosynthesis import FvCB
# Simple Arrhenius temperature response
model = FvCB(light_response=2, temp_response=1)
result = fit(model, data)
The Arrhenius function:
| Parameter | Description | Value/Range | Units |
|---|---|---|---|
| Parameter value (Vcmax, Jmax, or TPU) | Variable | μmol/m²/s | |
| Parameter value at 25°C | Variable | μmol/m²/s | |
| Activation energy | 50,000-100,000 | J/mol | |
| Universal gas constant | 8.314 | J/mol/K | |
| Leaf temperature | 273-323 (0-50°C) | K |
Type 2: Peaked Arrhenius Function
from phytorch import fit
from phytorch.models.photosynthesis import FvCB
# Peaked Arrhenius (includes high-temperature deactivation)
model = FvCB(light_response=2, temp_response=2)
result = fit(model, data)
The peaked Arrhenius function:
where:
| Parameter | Description | Value/Range | Units |
|---|---|---|---|
| Parameter value (Vcmax, Jmax, or TPU) | Variable | μmol/m²/s | |
| Parameter value at 25°C | Variable | μmol/m²/s | |
| Activation energy | 50,000-100,000 | J/mol | |
| Deactivation energy | 150,000-250,000 | J/mol | |
| Optimal temperature | 298-313 (25-40°C) | K | |
| Universal gas constant | 8.314 | J/mol/K | |
| Leaf temperature | 273-323 (0-50°C) | K |
Light Response
PhyTorch supports three light response types for electron transport rate ():
Type 0: No Light Dependence
from phytorch import fit
from phytorch.models.photosynthesis import FvCB
model = FvCB(light_response=0, temp_response=2)
result = fit(model, data)
No additional parameters are fitted. Electron transport is simply equal to .
Type 1: Rectangular Hyperbola
from phytorch import fit
from phytorch.models.photosynthesis import FvCB
model = FvCB(light_response=1, temp_response=2)
result = fit(model, data)
| Parameter | Description | Typical Range | Units |
|---|---|---|---|
| Maximum electron transport rate | 100-250 | μmol/m²/s | |
| Light use efficiency | 0.2-0.4 | mol e⁻/mol photons | |
| Photosynthetic photon flux density (PPFD) | 0-2500 | μmol/m²/s |
Type 2: Non-Rectangular Hyperbola
from phytorch import fit
from phytorch.models.photosynthesis import FvCB
model = FvCB(light_response=2, temp_response=2)
result = fit(model, data)
| Parameter | Description | Typical Range | Units |
|---|---|---|---|
| Maximum electron transport rate | 100-250 | μmol/m²/s | |
| Light use efficiency | 0.2-0.4 | mol e⁻/mol photons | |
| Curvature parameter | 0.7-0.9 | dimensionless | |
| Photosynthetic photon flux density (PPFD) | 0-2500 | μmol/m²/s |
A-Ci Curves
Fitting A-Ci (assimilation vs. intercellular CO2) curves:
from phytorch import fit
from phytorch.models.photosynthesis import FvCB
import numpy as np
# Your A-Ci curve data
data = {
'Ci': np.array([50, 100, 200, 400, 600, 800, 1000]),
'Q': np.full(7, 1500), # Constant light at 1500 μmol/m²/s
'Tleaf': np.full(7, 25), # Constant temperature at 25°C
'A': np.array([5.2, 10.5, 18.3, 24.1, 26.8, 28.2, 29.1])
}
# Fit the model
result = fit(FvCB(), data)
# View results
print(f"Vcmax25: {result.parameters['Vcmax25']:.2f} μmol/m²/s")
print(f"Jmax25: {result.parameters['Jmax25']:.2f} μmol/m²/s")
print(f"Rd25: {result.parameters['Rd25']:.2f} μmol/m²/s")
# Plot comprehensive results
result.plot()
Advanced Features
Custom Parameter Constraints
from phytorch import fit
from phytorch.models.photosynthesis import FvCB
# Define custom parameter bounds
options = {
'bounds': {
'Vcmax25': (20, 200),
'Jmax25': (40, 400),
'Rd25': (0, 5)
}
}
result = fit(FvCB(), data, options)
Custom Initial Guesses
from phytorch import fit
from phytorch.models.photosynthesis import FvCB
# Provide initial parameter estimates
options = {
'initial_guess': {
'Vcmax25': 100,
'Jmax25': 180,
'Rd25': 1.5
}
}
result = fit(FvCB(), data, options)
Model Configuration Options
The FvCB model constructor accepts several configuration parameters:
from phytorch import fit
from phytorch.models.photosynthesis import FvCB
model = FvCB(
light_response=2, # Light response type: 0, 1, or 2
temp_response=2, # Temperature response type: 1 or 2
fit_gm=True, # Fit mesophyll conductance (default: False)
fit_gamma=False, # Fit CO2 compensation point (default: False)
fit_Kc=False, # Fit Michaelis constant for CO2 (default: False)
fit_Ko=False, # Fit Michaelis constant for O2 (default: False)
fit_Rd=True, # Fit day respiration (default: True)
preprocess=True, # Preprocess data (default: True)
verbose=True # Print fitting progress (default: True)
)
result = fit(model, data)
Key configuration options:
fit_gm=True: Enables fitting of mesophyll conductance, accounting for CO2 diffusion from intercellular spaces to chloroplastlight_response: Controls the light response model (0=none, 1=rectangular hyperbola, 2=non-rectangular hyperbola)temp_response: Controls temperature response (1=Arrhenius, 2=peaked Arrhenius with deactivation)
Making Predictions
# Fit the model
result = fit(FvCB(), training_data)
# Make predictions on new data
new_data = {
'Ci': np.linspace(50, 1000, 100),
'Q': np.full(100, 1500),
'Tleaf': np.full(100, 25)
}
predictions = result.predict(new_data)
References
- Farquhar, G. D., von Caemmerer, S., & Berry, J. A. (1980). A biochemical model of photosynthetic CO2 assimilation in leaves of C3 species. Planta, 149(1), 78-90.
- Sharkey, T. D., et al. (2007). Fitting photosynthetic carbon dioxide response curves for C3 leaves. Plant, Cell & Environment, 30(9), 1035-1040.