Chlorophyll Fluorescence
A Python module for calculating chlorophyll fluorescence inelastic emission and its contribution to remote sensing reflectance (Rrs) in seawater.
Overview
Chlorophyll a (Chl-a) fluorescence occurs when light absorbed by photosynthetic pigments in phytoplankton is re-emitted at longer wavelengths. The primary emission peak is centered at 685 nm, with a secondary peak around 730-740 nm.
The fluorescence emission adds to the elastic backscattering signal and can contribute significantly to remote sensing reflectance in the red wavelengths, particularly in waters with high chlorophyll concentration or under conditions of photoinhibition.
This module implements formulations from:
Gordon (1979) — Original diffuse reflectance augmentation by chlorophyll fluorescence at 685 nm
Maritorena et al. (2000) — Fluorescence quantum yield determinations
Behrenfeld et al. (2009) — Satellite-detected fluorescence and global phytoplankton physiology
Bricaud et al. (1995) — Phytoplankton absorption parameterization
Sathyendranath & Platt (1998) — Inelastic scattering radiative transfer
Key characteristics:
Excitation range: 370-690 nm (absorbed by photosynthetic pigments)
Primary emission: 685 nm (PS II), FWHM ~25 nm
Secondary emission: ~730 nm (PS I), FWHM ~50 nm
Quantum yield: 0.005-0.07 (varies with irradiance and physiology)
Quick Start
import numpy as np
from bing.rt import (
calc_Rrs_fluorescence,
calc_Rrs_fluorescence_simple,
calc_fluorescence_spectrum,
calc_fluorescence_line_height,
)
# Calculate fluorescence Rrs spectrum for Chl = 1 mg m^-3
wavelengths = np.linspace(650, 750, 100)
Rrs_fl = calc_Rrs_fluorescence_simple(wavelengths, Chl=1.0)
print(f"Peak fluorescence Rrs: {Rrs_fl.max():.2e} sr^-1")
# Get full fluorescence spectrum with components
wavelength, Rrs_fl, components = calc_fluorescence_spectrum(
Chl=1.0, return_components=True
)
# Calculate Fluorescence Line Height (FLH) from satellite data
FLH = calc_fluorescence_line_height(
Rrs_665=0.001, # sr^-1
Rrs_680=0.0015,
Rrs_709=0.0005
)
Module Architecture
The chlorophyll fluorescence implementation is organized into two modules:
- Low-level functions (
bing.rt.chl_fl): Core physical calculations including emission line shapes, quantum yields, fluorescence coefficients, phase functions, and wavelength redistribution.
- High-level Rrs functions (
bing.rt.rrs): Convenient functions for calculating fluorescence contribution to remote sensing reflectance, integrated over excitation wavelengths, using the Bricaud parameterization for phytoplankton absorption.
Module Contents
Physical Constants
Constant |
Value |
Description |
|---|---|---|
|
685 nm |
Primary emission wavelength (PS II) |
|
730 nm |
Secondary emission wavelength (PS I) |
|
10.6 nm |
Primary peak standard deviation |
|
21.2 nm |
Secondary peak standard deviation |
|
25 nm |
Primary peak full width at half max |
|
50 nm |
Secondary peak full width at half max |
|
0.75 |
Weight of primary peak in double-Gaussian |
|
0.02 |
Default quantum yield (HydroLight value) |
|
0.01 |
Quantum yield at high irradiance |
|
0.07 |
Quantum yield at low irradiance |
|
370 nm |
Minimum excitation wavelength |
|
690 nm |
Maximum excitation wavelength |
Fluorescence Rrs Functions (bing.rt.rrs)
calc_Rrs_fluorescence
- calc_Rrs_fluorescence(wavelength, Chl, phi_C=0.02, wavelength_ex=None, mu_d=0.9, mu_f=0.5, double_gaussian=False)
Calculate Rrs contribution from chlorophyll fluorescence integrating over excitation wavelengths.
- Parameters:
wavelength (float or ndarray) – Emission wavelength(s) in nm (typically 650-750 nm)
Chl (float) – Chlorophyll-a concentration in mg m-3
phi_C (float) – Fluorescence quantum yield (0-1)
wavelength_ex (ndarray or None) – Excitation wavelengths for integration. If None, uses 400-680 nm
mu_d (float) – Mean cosine for downwelling irradiance
mu_f (float) – Mean cosine for fluorescence emission (isotropic = 0.5)
double_gaussian (bool) – If True, use double Gaussian emission (685 + 730 nm peaks)
- Returns:
Fluorescence contribution to Rrs in sr-1
- Return type:
float or ndarray
Example:
wavelengths = np.linspace(650, 750, 100) Rrs_fl = calc_Rrs_fluorescence(wavelengths, Chl=1.0) print(f"Peak fluorescence Rrs: {Rrs_fl.max():.2e} sr^-1")
calc_Rrs_fluorescence_simple
- calc_Rrs_fluorescence_simple(wavelength, Chl, phi_C=0.02, lambda_ex=440.0, mu_d=0.9, mu_f=0.5, double_gaussian=False)
Fast single-excitation model for fluorescence Rrs calculation.
This is a faster version that assumes all excitation occurs at a single wavelength (typically 440 nm, the blue absorption peak).
- Parameters:
wavelength (float or ndarray) – Emission wavelength(s) in nm
Chl (float) – Chlorophyll-a concentration in mg m-3
phi_C (float) – Fluorescence quantum yield
lambda_ex (float) – Excitation wavelength in nm
mu_d (float) – Mean cosine for downwelling irradiance
mu_f (float) – Mean cosine for fluorescence emission
double_gaussian (bool) – If True, use double Gaussian emission
- Returns:
Fluorescence contribution to Rrs in sr-1
- Return type:
float or ndarray
Example:
wavelengths = np.linspace(650, 750, 100) Rrs_fl = calc_Rrs_fluorescence_simple(wavelengths, Chl=1.0) peak_idx = np.argmax(Rrs_fl) print(f"Peak at {wavelengths[peak_idx]:.0f} nm: {Rrs_fl[peak_idx]:.2e} sr^-1")
calc_Rrs_with_fluorescence
- calc_Rrs_with_fluorescence(wavelength, a, bb, Chl, phi_C=0.02, in_G1=None, in_G2=None, mu_d=0.9, mu_f=0.5, double_gaussian=False)
Calculate total Rrs including both elastic scattering and fluorescence.
- Parameters:
wavelength (float or ndarray) – Wavelength(s) in nm
a (float or ndarray) – Total absorption coefficient in m-1
bb (float or ndarray) – Total backscattering coefficient in m-1
Chl (float) – Chlorophyll-a concentration in mg m-3
phi_C (float) – Fluorescence quantum yield
in_G2 (in_G1,) – Gordon coefficients. If None, use defaults
mu_d (float) – Mean cosine for downwelling irradiance
mu_f (float) – Mean cosine for fluorescence emission
double_gaussian (bool) – If True, use double Gaussian emission
- Returns:
Total Rrs (elastic + fluorescence) in sr-1
- Return type:
float or ndarray
Example:
wavelength = np.linspace(400, 750, 100) a = 0.1 * np.ones_like(wavelength) # Simplified bb = 0.002 * np.ones_like(wavelength) Rrs_total = calc_Rrs_with_fluorescence(wavelength, a, bb, Chl=1.0)
calc_fluorescence_spectrum
- calc_fluorescence_spectrum(Chl, wavelength=None, phi_C=0.02, double_gaussian=False, return_components=False)
Calculate the full fluorescence Rrs spectrum for given Chl concentrations.
Convenience function that returns the fluorescence spectrum across the emission range (typically 650-750 nm).
- Parameters:
Chl (float or ndarray) – Chlorophyll-a concentration(s) in mg m-3
wavelength (ndarray or None) – Emission wavelengths in nm. If None, uses 650-750 nm at 1 nm resolution
phi_C (float) – Fluorescence quantum yield
double_gaussian (bool) – If True, use double Gaussian emission
return_components (bool) – If True, also return component spectra
- Returns:
Fluorescence Rrs spectrum. If return_components=True, also returns (wavelength, Rrs_fl, components_dict)
- Return type:
ndarray or tuple
Example:
# Multiple Chl concentrations Chl_values = [0.1, 1.0, 10.0] # mg m^-3 Rrs_fl = calc_fluorescence_spectrum(Chl_values) print(f"Shape: {Rrs_fl.shape}") # (3, 101) # With components wavelength, Rrs_fl, components = calc_fluorescence_spectrum( 1.0, return_components=True )
calc_fluorescence_correction_factor
- calc_fluorescence_correction_factor(wavelength, a, bb, Chl, phi_C=0.02, in_G1=None, in_G2=None)
Calculate the multiplicative correction factor for fluorescence.
Returns the ratio of total Rrs (elastic + fluorescence) to elastic Rrs, useful for understanding the fluorescence contribution.
- Parameters:
wavelength (float or ndarray) – Wavelength(s) in nm
a (float or ndarray) – Total absorption coefficient in m-1
bb (float or ndarray) – Total backscattering coefficient in m-1
Chl (float) – Chlorophyll-a concentration in mg m-3
phi_C (float) – Fluorescence quantum yield
in_G2 (in_G1,) – Gordon coefficients
- Returns:
Correction factor: (Rrs_elastic + Rrs_fluorescence) / Rrs_elastic
- Return type:
float or ndarray
Note
Values > 1 indicate wavelengths where fluorescence adds signal. The correction is typically largest near 685 nm (the fluorescence peak).
IOP Functions (bing.rt.rrs)
calc_a_ph_bricaud
- calc_a_ph_bricaud(wavelength, Chl)
Calculate phytoplankton absorption using Bricaud et al. (1995) parameterization.
- Parameters:
- Returns:
Phytoplankton absorption coefficient aph in m-1
- Return type:
float or ndarray
The Bricaud model parameterizes phytoplankton absorption as:
\[a_{ph}(\lambda, Chl) = A(\lambda) \times Chl^{E(\lambda)}\]where A(λ) and E(λ) are wavelength-dependent coefficients derived from measurements of diverse phytoplankton populations.
Example:
from bing.rt.rrs import calc_a_ph_bricaud # Single wavelength and Chl a_ph_440 = calc_a_ph_bricaud(440, 1.0) # Blue peak # Spectrum wavelengths = np.arange(400, 700, 5) a_ph_spectrum = calc_a_ph_bricaud(wavelengths, 1.0)
calc_a_water
calc_bb_water
- calc_bb_water(wavelength)
Calculate pure water backscattering coefficient.
Uses Morel (1974) wavelength dependence:
\[b_{bw}(\lambda) = b_{bw}(500) \times (500/\lambda)^{4.32}\]
Low-Level Functions (bing.rt.chl_fl)
emission_line_single_gaussian
- emission_line_single_gaussian(wavelength, lambda_center=685.0, sigma=10.6)
Calculate single Gaussian emission line shape hC(λ).
- Parameters:
- Returns:
Normalized emission line shape hC(λ) in nm-1
- Return type:
float or ndarray
The emission line shape is normalized such that ∫ hC(λ) dλ = 1.
Example:
from bing.rt.chl_fl import emission_line_single_gaussian wavelength = np.linspace(650, 750, 100) h_C = emission_line_single_gaussian(wavelength) plt.plot(wavelength, h_C) plt.xlabel('Wavelength [nm]') plt.ylabel('Emission line shape [nm$^{-1}$]')
emission_line_double_gaussian
- emission_line_double_gaussian(wavelength, lambda_primary=685.0, sigma_primary=10.6, lambda_secondary=730.0, sigma_secondary=21.2, weight_primary=0.75)
Calculate double Gaussian emission line shape hC(λ).
This model includes both the primary PS II peak at 685 nm and the secondary PS I peak at 730 nm.
- Parameters:
wavelength (float or ndarray) – Emission wavelength(s) in nm
lambda_primary (float) – Center of primary peak in nm
sigma_primary (float) – Standard deviation of primary Gaussian in nm
lambda_secondary (float) – Center of secondary peak in nm
sigma_secondary (float) – Standard deviation of secondary Gaussian in nm
weight_primary (float) – Weight of primary peak (0-1)
- Returns:
Normalized emission line shape hC(λ) in nm-1
- Return type:
float or ndarray
The emission is modeled as:
\[h_C(\lambda) = W \times G(\lambda; \lambda_1, \sigma_1) + (1-W) \times G(\lambda; \lambda_2, \sigma_2)\]
Quantum Yield Functions
quantum_yield_constant
quantum_yield_irradiance_dependent
- quantum_yield_irradiance_dependent(PAR, phi_max=0.07, phi_min=0.01, E_k=100.0)
Calculate irradiance-dependent quantum yield ΦC(E).
Quantum yield decreases with increasing irradiance due to nonphotochemical quenching (NPQ).
- Parameters:
- Returns:
Irradiance-dependent quantum yield
- Return type:
float or ndarray
Based on Morrison (2003) model:
\[\Phi_C(E) = \Phi_{min} + (\Phi_{max} - \Phi_{min}) \times \frac{E_k}{E + E_k}\]Example:
PAR = np.linspace(0, 1000, 100) phi_C = quantum_yield_irradiance_dependent(PAR) plt.plot(PAR, phi_C) plt.xlabel('PAR [μmol photons m$^{-2}$ s$^{-1}$]') plt.ylabel('Quantum yield')
quantum_yield_depth_profile
- quantum_yield_depth_profile(depth, K_PAR=0.05, PAR_surface=500.0, phi_max=0.07, phi_min=0.01, E_k=100.0)
Calculate depth-dependent quantum yield ΦC(z).
Combines Beer-Lambert light attenuation with irradiance-dependent quantum yield.
- Parameters:
depth (float or ndarray) – Depth(s) in meters (positive downward)
K_PAR (float) – Diffuse attenuation coefficient for PAR [m-1]
PAR_surface (float) – Surface PAR [μmol photons m-2 s-1]
phi_max (float) – Maximum quantum yield at low light
phi_min (float) – Minimum quantum yield at high light
E_k (float) – Half-saturation irradiance
- Returns:
Depth-dependent quantum yield
- Return type:
float or ndarray
Fluorescence Coefficients
fluorescence_scattering_coeff
- fluorescence_scattering_coeff(a_ph, phi_C=0.02)
Calculate the fluorescence scattering coefficient bC(λ’).
- Parameters:
- Returns:
Fluorescence scattering coefficient bC in m-1
- Return type:
float or ndarray
The coefficient describes how much light at excitation wavelength λ’ is converted to fluorescence per unit path length:
\[b_C(\lambda') = \Phi_C \times a_{ph}(\lambda')\]
fluorescence_backscattering_coeff
- fluorescence_backscattering_coeff(a_ph, phi_C=0.02)
Calculate the fluorescence backscattering coefficient bbC(λ’).
- Parameters:
- Returns:
Fluorescence backscattering coefficient bbC in m-1
- Return type:
float or ndarray
For isotropic fluorescence emission:
\[b_{bC} = 0.5 \times b_C = 0.5 \times \Phi_C \times a_{ph}\]
Phase Function
fluorescence_phase_function
- fluorescence_phase_function(psi)
Calculate the fluorescence phase function β̃C(ψ).
Fluorescence emission is isotropic (equal in all directions).
- Parameters:
psi (float or ndarray) – Scattering angle(s) in radians (0 = forward, π = backward)
- Returns:
Phase function β̃C(ψ) in sr-1
- Return type:
float or ndarray
For isotropic emission:
\[\tilde{\beta}_C(\psi) = \frac{1}{4\pi} \text{ sr}^{-1}\]
fluorescence_backscatter_fraction
- fluorescence_backscatter_fraction()
Return the backscatter fraction for isotropic fluorescence emission.
- Returns:
Backscatter fraction (0.5 for isotropic emission)
- Return type:
Reflectance Contribution
calc_R_fluorescence
- calc_R_fluorescence(a_em, bb_em, a_ex, bb_ex, a_ph_ex, Ed_ratio=1.0, phi_C=0.02, mu_d=0.9, mu_f=0.5)
Calculate fluorescence contribution to reflectance at the sea surface.
Based on Gordon (1979) and Sathyendranath & Platt (1998) formulation.
- Parameters:
a_em (float or ndarray) – Total absorption at emission wavelength [m-1]
bb_em (float or ndarray) – Total backscattering at emission wavelength [m-1]
a_ex (float or ndarray) – Total absorption at excitation wavelength [m-1]
bb_ex (float or ndarray) – Total backscattering at excitation wavelength [m-1]
a_ph_ex (float or ndarray) – Phytoplankton absorption at excitation wavelength [m-1]
Ed_ratio (float or ndarray) – Ratio of downwelling irradiance Ed(λ’)/Ed(λ)
phi_C (float) – Quantum yield
mu_d (float) – Mean cosine for downwelling irradiance
mu_f (float) – Mean cosine for fluorescence emission (isotropic = 0.5)
- Returns:
Fluorescence reflectance contribution RF(λ, 0)
- Return type:
float or ndarray
Following the Sathyendranath & Platt (1998) formulation:
\[R^F(\lambda, 0) = \frac{E_d(\lambda')}{E_d(\lambda)} \times \frac{b_{bF}(\lambda')/\mu_d}{K(\lambda') + \kappa^F(\lambda)}\]
Fluorescence Line Height
calc_fluorescence_line_height
- calc_fluorescence_line_height(Rrs_665, Rrs_680, Rrs_709, lambda_665=665.0, lambda_680=680.0, lambda_709=709.0)
Calculate Fluorescence Line Height (FLH) from Rrs measurements.
FLH is a standard product derived from satellite ocean color measurements that isolates the chlorophyll fluorescence signal from the background.
- Parameters:
Rrs_665 (float or ndarray) – Remote sensing reflectance at ~665 nm [sr-1]
Rrs_680 (float or ndarray) – Remote sensing reflectance at ~680 nm [sr-1]
Rrs_709 (float or ndarray) – Remote sensing reflectance at ~709 nm [sr-1]
lambda_665 (float) – Wavelength of first baseline band
lambda_680 (float) – Wavelength of fluorescence band
lambda_709 (float) – Wavelength of second baseline band
- Returns:
Fluorescence Line Height [sr-1]
- Return type:
float or ndarray
The FLH is calculated as:
\[FLH = R_{rs}(680) - R_{rs,baseline}(680)\]where the baseline is linearly interpolated between 665 nm and 709 nm.
Reference wavelengths vary by sensor:
MODIS: 667, 678, 748 nm
MERIS/OLCI: 665, 681, 709 nm
Example:
# From satellite Rrs data FLH = calc_fluorescence_line_height( Rrs_665=0.001, Rrs_680=0.0015, Rrs_709=0.0005 ) print(f"FLH = {FLH:.4e} sr^-1")
calc_normalized_fluorescence_line_height
- calc_normalized_fluorescence_line_height(Rrs_665, Rrs_680, Rrs_709, lambda_665=665.0, lambda_680=680.0, lambda_709=709.0)
Calculate normalized Fluorescence Line Height (nFLH).
Normalized FLH accounts for variations in surface irradiance by dividing by the baseline reflectance.
- Parameters:
- Returns:
Normalized Fluorescence Line Height [dimensionless]
- Return type:
float or ndarray
Convenience Functions
get_emission_spectrum
- get_emission_spectrum(wavelength_ex, wavelength_em_range=None, n_points=100, double_gaussian=False)
Get the chlorophyll fluorescence emission spectrum for a given excitation.
- Parameters:
- Returns:
(wavelength_em, intensity) arrays
- Return type:
tuple of ndarray
Example:
from bing.rt.chl_fl import get_emission_spectrum lambda_em, intensity = get_emission_spectrum(440) plt.plot(lambda_em, intensity) plt.xlabel('Emission wavelength [nm]') plt.ylabel('Relative intensity')
summary_at_wavelength
- summary_at_wavelength(wavelength_ex, a_ph, phi_C=0.02)
Get a summary of fluorescence parameters at a given excitation wavelength.
- Parameters:
- Returns:
Dictionary of fluorescence parameters
- Return type:
Example:
>>> from bing.rt.chl_fl import summary_at_wavelength >>> summary_at_wavelength(440, a_ph=0.05) { 'excitation_wavelength_nm': 440, 'emission_peak_primary_nm': 685.0, 'emission_peak_secondary_nm': 730.0, 'emission_fwhm_primary_nm': 25.0, 'emission_fwhm_secondary_nm': 50.0, 'in_excitation_range': True, 'quantum_yield': 0.02, 'phytoplankton_absorption_m-1': 0.05, 'fluorescence_scattering_coeff_m-1': 0.001, 'fluorescence_backscatter_coeff_m-1': 0.0005, 'backscatter_fraction': 0.5 }
Physical Background
Fluorescence Process
Chlorophyll fluorescence occurs through the following mechanism:
Absorption: Light at wavelengths 370-690 nm is absorbed by photosynthetic pigments (primarily chlorophyll a and b)
Excitation: Absorbed photons excite chlorophyll molecules to higher energy states
Energy dissipation: Excited energy can be:
Used for photosynthesis
Dissipated as heat (nonphotochemical quenching)
Re-emitted as fluorescence
Emission: Fluorescence is emitted at 685 nm (PS II) and 730 nm (PS I)
Quantum Yield Variability
The fluorescence quantum yield (ΦC) varies significantly:
Condition |
ΦC |
Notes |
|---|---|---|
High light (surface) |
0.005-0.01 |
NPQ reduces yield |
Low light (depth) |
0.05-0.07 |
Maximum yield |
Typical/average |
0.02 |
HydroLight default |
Nutrient stress |
Variable |
Can increase yield |
Emission Spectrum Shape
The emission spectrum is modeled using Gaussian functions:
Single Gaussian (PS II only):
with σ = 10.6 nm (FWHM = 25 nm).
Double Gaussian (PS II + PS I):
The double Gaussian model includes the secondary PS I peak at 730 nm, which can be important for accurate modeling in certain conditions.
Reflectance Formulation
The fluorescence contribution to reflectance follows the Gordon (1979) and Sathyendranath & Platt (1998) formulation for inelastic scattering:
where:
bbF = 0.5 × ΦC × aph is the fluorescence backscattering
K(λ’) = (a(λ’) + bb(λ’))/μd is downwelling attenuation
κF(λ) = (a(λ) + bb(λ))/μf is upwelling attenuation
Bricaud Parameterization
Phytoplankton absorption is calculated using the Bricaud et al. (1995) parameterization:
where A(λ) and E(λ) are wavelength-dependent coefficients. Key values:
Wavelength (nm) |
A |
E |
Notes |
|---|---|---|---|
440 |
0.0654 |
0.668 |
Blue absorption peak |
550 |
0.0110 |
0.715 |
Green minimum |
675 |
0.0260 |
0.775 |
Red absorption peak |
685 |
0.0210 |
0.776 |
Near fluorescence emission |
Example: Full Fluorescence Analysis
import numpy as np
import matplotlib.pyplot as plt
from bing.rt import (
calc_Rrs,
calc_Rrs_fluorescence_simple,
calc_Rrs_with_fluorescence,
calc_fluorescence_correction_factor,
calc_a_ph_bricaud,
calc_a_water,
calc_bb_water,
)
from bing.rt.chl_fl import (
emission_line_single_gaussian,
emission_line_double_gaussian,
quantum_yield_irradiance_dependent,
quantum_yield_depth_profile,
)
# 1. Compare emission line shapes
wavelength_em = np.linspace(640, 800, 200)
h_single = emission_line_single_gaussian(wavelength_em)
h_double = emission_line_double_gaussian(wavelength_em)
plt.figure(figsize=(10, 4))
plt.subplot(121)
plt.plot(wavelength_em, h_single, label='Single Gaussian')
plt.plot(wavelength_em, h_double, label='Double Gaussian')
plt.xlabel('Emission wavelength [nm]')
plt.ylabel('h$_C$(λ) [nm$^{-1}$]')
plt.legend()
plt.title('Emission Line Shape')
# 2. Quantum yield depth profile
depth = np.linspace(0, 100, 50)
phi_C = quantum_yield_depth_profile(depth)
plt.subplot(122)
plt.plot(phi_C, depth)
plt.xlabel('Quantum yield Φ$_C$')
plt.ylabel('Depth [m]')
plt.gca().invert_yaxis()
plt.title('Quantum Yield Profile')
plt.tight_layout()
plt.show()
# 3. Fluorescence Rrs for different Chl concentrations
wavelength = np.linspace(650, 750, 100)
Chl_values = [0.1, 0.5, 1.0, 5.0, 10.0]
plt.figure(figsize=(8, 5))
for Chl in Chl_values:
Rrs_fl = calc_Rrs_fluorescence_simple(wavelength, Chl)
plt.plot(wavelength, Rrs_fl * 1e4, label=f'Chl = {Chl} mg m$^{{-3}}$')
plt.xlabel('Wavelength [nm]')
plt.ylabel('Rrs$_{fl}$ [×10$^{-4}$ sr$^{-1}$]')
plt.legend()
plt.title('Fluorescence Rrs vs Chlorophyll')
plt.show()
# 4. Fluorescence correction factor
wavelength_full = np.linspace(400, 750, 200)
Chl = 1.0
# Calculate IOPs
a_ph = calc_a_ph_bricaud(wavelength_full, Chl)
a_w = calc_a_water(wavelength_full)
bb_w = calc_bb_water(wavelength_full)
a_total = a_w + a_ph
bb_total = bb_w
correction = calc_fluorescence_correction_factor(
wavelength_full, a_total, bb_total, Chl
)
plt.figure(figsize=(8, 4))
plt.plot(wavelength_full, correction)
plt.axhline(1.0, color='k', linestyle='--', alpha=0.5)
plt.xlabel('Wavelength [nm]')
plt.ylabel('Correction factor')
plt.title(f'Fluorescence Correction Factor (Chl = {Chl} mg m$^{{-3}}$)')
plt.show()
Comparison with Raman Scattering
Both chlorophyll fluorescence and Raman scattering are inelastic processes that redistribute light to longer wavelengths. However, they differ in several important ways:
Property |
Fluorescence |
Raman |
|---|---|---|
Source |
Phytoplankton pigments |
Water molecules |
Excitation range |
370-690 nm |
All visible wavelengths |
Emission |
685, 730 nm (fixed) |
Shifted by ~3400 cm-1 |
Angular distribution |
Isotropic (bb/b = 0.5) |
Nearly isotropic (bb/b = 0.5) |
Magnitude |
Depends on Chl, varies widely |
Fixed for given water type |
Variability |
High (physiology-dependent) |
Low (temperature/salinity) |
Limitations and Notes
Quantum yield uncertainty: The quantum yield varies significantly with phytoplankton physiology, light history, and nutrient status. The default value of 0.02 is approximate.
PS I contribution: The secondary peak at 730 nm is typically smaller than the primary PS II peak, but can be significant in certain conditions.
Absorption model: The Bricaud parameterization represents average phytoplankton. Specific phytoplankton groups may differ.
Clear water assumption: The simplified model assumes particle backscattering is small compared to water backscattering.
Depth integration: For satellite applications, the signal represents depth-integrated fluorescence weighted by the light field.
References
Gordon, H.R. (1979). “Diffuse reflectance of the ocean: the theory of its augmentation by chlorophyll a fluorescence at 685 nm,” Appl. Opt. 18, 1161-1166.
Bricaud, A., Babin, M., Morel, A., and Claustre, H. (1995). “Variability in the chlorophyll-specific absorption coefficients of natural phytoplankton: Analysis and parameterization,” J. Geophys. Res. 100, 13321-13332.
Maritorena, S., Morel, A., and Gentili, B. (2000). “Determination of the fluorescence quantum yield by oceanic phytoplankton in their natural habitat,” Appl. Opt. 39, 6725-6737.
Sathyendranath, S. and Platt, T. (1998). “Ocean-colour model incorporating transspectral processes,” Appl. Opt. 37, 2216-2227.
Behrenfeld, M.J. et al. (2009). “Satellite-detected fluorescence reveals global physiology of ocean phytoplankton,” Biogeosciences 6, 779-794.
Pope, R.M. and Fry, E.S. (1997). “Absorption spectrum (380-700 nm) of pure water. II. Integrating cavity measurements,” Appl. Opt. 36, 8710-8723.
Morel, A. (1974). “Optical properties of pure water and pure sea water,” Optical Aspects of Oceanography, Academic Press, 1-24.
Ocean Optics Web Book: https://www.oceanopticsbook.info/view/scattering/level-2/chlorophyll-fluorescence