Skip to main content

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 (AA) as the minimum of three potentially limiting rates:

A=min⁡(Wc,Wj,Wp)(1−Γ∗Ci)−RdA = \min(W_c, W_j, W_p) \left(1 - \frac{{\Gamma^*}}{{C_i}}\right) - R_d

where:

  • Rubisco-limited rate (WcW_c): Limited by the maximum carboxylation rate (VcmaxV_{{cmax}})
  • RuBP regeneration-limited rate (WjW_j): Limited by electron transport capacity (JmaxJ_{{max}})
  • Triose phosphate utilization-limited rate (WpW_p): Limited by the capacity to use photosynthetic products
  • Γ∗\Gamma^*: CO2 compensation point in the absence of day respiration
  • CiC_i: Intercellular CO2 concentration
  • RdR_d: Day respiration

Rubisco-Limited Rate​

Wc=Vcmax⋅CiCi+Kc(1+O/Ko)W_c = \frac{{V_{{cmax}} \cdot C_i}}{{C_i + K_c(1 + O/K_o)}}

RuBP Regeneration-Limited Rate​

Wj=J⋅Ci4Ci+8Γ∗W_j = \frac{{J \cdot C_i}}{{4C_i + 8\Gamma^*}}

where JJ is the electron transport rate, calculated from light response

Triose Phosphate Utilization-Limited Rate​

Wp=3⋅TPU⋅CiCi−Γ∗(1+3αG)W_p = \frac{{3 \cdot TPU \cdot C_i}}{{C_i - \Gamma^*(1 + 3\alpha_G)}}

where:

  • TPUTPU is the triose phosphate utilization rate
  • αG\alpha_G 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:

ParameterDescriptionTypical RangeUnits
Vcmax25Maximum carboxylation rate at 25°C50-150μmol/m²/s
Jmax25Maximum electron transport rate at 25°C100-250μmol/m²/s
Rd25Day respiration at 25°C0.5-2.0μmol/m²/s
Tp25Triose phosphate utilization at 25°C5-15μmol/m²/s

Biochemical Constants​

ParameterDescriptionValue at 25°CUnits
KcMichaelis constant for CO2260μmol/mol
KoMichaelis constant for O2179mmol/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:

k=k25exp⁡[ΔHaR(1298−1Tleaf)]k = k_{{25}} \exp\left[\frac{{\Delta H_a}}{{R}}\left(\frac{{1}}{{298}}-\frac{{1}}{{T_{{leaf}}}}\right)\right]
ParameterDescriptionValue/RangeUnits
kkParameter value (Vcmax, Jmax, or TPU)Variableμmol/m²/s
k25k_{{25}}Parameter value at 25°CVariableμmol/m²/s
ΔHa\Delta H_aActivation energy50,000-100,000J/mol
RRUniversal gas constant8.314J/mol/K
TleafT_{{leaf}}Leaf temperature273-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:

k=k25exp⁡[ΔHaR(1298−1Tleaf)]f(298)f(Tleaf)k = k_{{25}} \exp\left[\frac{{\Delta H_a}}{{R}} \left(\frac{{1}}{{298}}-\frac{{1}}{{T_{{leaf}}}}\right)\right] \frac{{f(298)}}{{f(T_{{leaf}})}}

where:

f(T)=1+exp⁡[ΔHdR(1Topt−1T)−ln⁡(ΔHdΔHa−1)]f(T) = 1+\exp \left[\frac{{\Delta H_d}}{{R}}\left(\frac{{1}}{{T_{{opt}}}}-\frac{{1}}{{T}} \right)-\ln \left(\frac{{\Delta H_d}}{{\Delta H_a}}-1 \right) \right]
ParameterDescriptionValue/RangeUnits
kkParameter value (Vcmax, Jmax, or TPU)Variableμmol/m²/s
k25k_{{25}}Parameter value at 25°CVariableμmol/m²/s
ΔHa\Delta H_aActivation energy50,000-100,000J/mol
ΔHd\Delta H_dDeactivation energy150,000-250,000J/mol
ToptT_{{opt}}Optimal temperature298-313 (25-40°C)K
RRUniversal gas constant8.314J/mol/K
TleafT_{{leaf}}Leaf temperature273-323 (0-50°C)K

Light Response​

PhyTorch supports three light response types for electron transport rate (JJ):

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)
J=JmaxJ = J_{{max}}

No additional parameters are fitted. Electron transport is simply equal to JmaxJ_{{max}}.

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)
J=αQJmaxαQ+JmaxJ = \frac{{\alpha Q J_{{max}}}}{{\alpha Q + J_{{max}}}}
ParameterDescriptionTypical RangeUnits
JmaxJ_{{max}}Maximum electron transport rate100-250μmol/m²/s
α\alphaLight use efficiency0.2-0.4mol e⁻/mol photons
QQPhotosynthetic 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)
J=αQ+Jmax−(αQ+Jmax)2−4θαQJmax2θJ = \frac{{\alpha Q + J_{{max}} - \sqrt{{(\alpha Q + J_{{max}})^2 - 4 \theta \alpha Q J_{{max}}}}}}{{2 \theta}}
ParameterDescriptionTypical RangeUnits
JmaxJ_{{max}}Maximum electron transport rate100-250μmol/m²/s
α\alphaLight use efficiency0.2-0.4mol e⁻/mol photons
θ\thetaCurvature parameter0.7-0.9dimensionless
QQPhotosynthetic 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 chloroplast
  • light_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.