Raman Scattering
A Python module for calculating Raman scattering coefficients, backscattering coefficients, and related optical properties for pure water and seawater.
Overview
Raman scattering is an inelastic scattering process where incident light excites water molecules to a virtual energy state, which then decays to a vibrational level above the ground state. The emitted light has a longer wavelength (lower energy) than the incident light, with a characteristic wavenumber shift of ~3400 cm-1 corresponding to the O-H stretching mode of water.
This module implements the formulations from:
Bartlett et al. (1998) — Raman scattering coefficient measurements and wavelength dependence
Walrafen (1967) — Wavenumber distribution function (emission spectrum shape)
Ge et al. (1993) — Depolarization ratio and phase function
Mobley (1994) — Light and Water textbook formulations
Sathyendranath & Platt (1998) — Ocean-colour model incorporating transspectral processes (Raman contribution to Rrs)
The module is organized into two parts:
- Low-level functions (
bing.rt.raman): Core Raman scattering coefficients, phase functions, emission spectra, and wavelength redistribution.
- Rrs functions (
bing.rt.rrs): Higher-level functions for calculating Raman contribution to remote sensing reflectance, including first-order and second-order terms.
Quick Start
import numpy as np
from bing.rt.raman import (
raman_scattering_coeff,
raman_backscattering_coeff,
excitation_to_emission_wavelength,
summary_at_wavelength
)
# Raman scattering coefficient at 488 nm
b_R = raman_scattering_coeff(488)
print(f"b_R(488 nm) = {b_R:.2e} m⁻¹") # 2.60e-04 m⁻¹
# Backscattering coefficient
b_bR = raman_backscattering_coeff(488)
print(f"b_bR(488 nm) = {b_bR:.2e} m⁻¹") # 1.30e-04 m⁻¹
# Emission wavelength for 488 nm excitation
lambda_em = excitation_to_emission_wavelength(488)
print(f"Emission center: {lambda_em:.1f} nm") # ~585 nm
# Full summary
summary = summary_at_wavelength(488)
Module Contents
Constants
Constant |
Value |
Description |
|---|---|---|
|
2.7×10-4 m-1 |
Bartlett et al. (1998) measurement |
|
2.4×10-4 m-1 |
Desiderio (2000) measurement |
|
2.6×10-4 m-1 |
HydroLight default value |
|
0.17 |
For water at ~3400 cm-1 |
|
3400 cm-1 |
Center of O-H stretch band |
Functions
Scattering Coefficients
raman_scattering_coeff
- raman_scattering_coeff(wavelength_excitation, reference_value=2.6e-4, units='energy')
Calculate the total Raman scattering coefficient bR(λ’).
- Parameters:
- Returns:
bR in m-1
- Return type:
float or ndarray
Example:
# Single wavelength b_R = raman_scattering_coeff(400) # 7.76e-04 m⁻¹ # Array of wavelengths wavelengths = np.array([400, 450, 500, 550]) b_R = raman_scattering_coeff(wavelengths)
raman_backscattering_coeff
- raman_backscattering_coeff(wavelength_excitation, reference_value=2.6e-4, units='energy')
Calculate the Raman backscattering coefficient bbR(λ’).
The backscattering coefficient is the integral of the volume scattering function over the backward hemisphere (scattering angles from 90° to 180°).
- Parameters:
- Returns:
bbR in m-1
- Return type:
float or ndarray
Note
For the Raman phase function, the backscattering ratio bbR/bR = 0.5 exactly.
Wavelength Functions
excitation_to_emission_wavelength
- excitation_to_emission_wavelength(lambda_ex, delta_nu=3400)
Convert excitation wavelength to emission wavelength.
- Parameters:
- Returns:
Emission wavelength(s) in nm
- Return type:
float or ndarray
Example:
excitation_to_emission_wavelength(488) # → 585.1 nm excitation_to_emission_wavelength(400) # → 463.0 nm excitation_to_emission_wavelength(550) # → 676.5 nm
emission_to_excitation_wavelength
- emission_to_excitation_wavelength(lambda_em, delta_nu=3400)
Inverse conversion from emission to excitation wavelength.
wavelength_redistribution
- wavelength_redistribution(lambda_ex, lambda_em)
Calculate the wavelength redistribution function fR(λ’, λ) in nm-1.
This gives the probability density that light at excitation wavelength λ’, if Raman scattered, will be emitted at wavelength λ.
- Parameters:
- Returns:
fR in nm-1
- Return type:
float or ndarray
Example:
# Emission spectrum for 488 nm excitation lambda_em = np.linspace(550, 620, 100) f_R = wavelength_redistribution(488, lambda_em)
Phase Function
raman_phase_function
- raman_phase_function(psi, rho=0.17, normalize=True)
Calculate the Raman phase function βR(ψ) in sr-1.
- Parameters:
- Returns:
Phase function in sr-1
- Return type:
float or ndarray
The phase function has the form:
\[\beta_R(\psi) = \frac{1 + \delta \cos^2\psi}{4\pi \times \text{normalization}}\]where δ = (1 - ρ)/(1 + ρ) ≈ 0.71 for ρ = 0.17.
raman_phase_function_simple
Volume Scattering Function
raman_vsf
- raman_vsf(wavelength_excitation, wavelength_emission, psi, reference_value=2.6e-4, units='energy')
Calculate the full Raman volume scattering function βR(λ’, λ, ψ) in m-1 sr-1 nm-1.
This combines all three components:
\[\beta_R(\lambda', \lambda, \psi) = b_R(\lambda') \times f_R(\lambda', \lambda) \times \tilde{\beta}_R(\psi)\]- Parameters:
- Returns:
Volume scattering function in m-1 sr-1 nm-1
- Return type:
float or ndarray
Convenience Functions
get_emission_spectrum
- get_emission_spectrum(wavelength_excitation, wavelength_emission_range=None, n_points=100)
Get the Raman emission spectrum for a given excitation wavelength.
- Parameters:
- Returns:
(wavelength_emission, intensity) arrays
- Return type:
tuple of ndarray
Example:
lambda_em, intensity = get_emission_spectrum(488) plt.plot(lambda_em, intensity)
summary_at_wavelength
- summary_at_wavelength(wavelength, units='energy')
Get a dictionary of all Raman parameters at a given excitation wavelength.
- Parameters:
- Returns:
Dictionary of Raman parameters
- Return type:
Example:
>>> summary_at_wavelength(488) { 'excitation_wavelength_nm': 488, 'emission_center_nm': 585.08, 'wavelength_shift_nm': 97.08, 'wavenumber_shift_cm-1': 3400.0, 'scattering_coeff_m-1': 2.6e-04, 'backscattering_coeff_m-1': 1.3e-04, 'backscattering_ratio': 0.5, 'depolarization_ratio': 0.17, 'units': 'energy' }
Raman Rrs Functions (bing.rt.rrs)
These functions calculate the contribution of Raman scattering to remote sensing reflectance (Rrs), implementing the Sathyendranath & Platt (1998) formulation.
- calc_Rrs_with_raman(a_em, bb_em, a_ex, bb_ex, bb_R, Ed_ratio=1.0, in_G1=None, in_G2=None, mu_d=0.9, mu_u=0.4, mu_R=0.5, include_second_order=True)
Calculate remote sensing reflectance (Rrs) including Raman correction.
This function computes Rrs using the Gordon model for elastic scattering and adds the Raman contribution from Sathyendranath & Platt (1998).
- Parameters:
a_em (float or ndarray) – Total absorption coefficient at emission wavelength λ [m-1]
bb_em (float or ndarray) – Total backscattering coefficient at emission wavelength λ [m-1]
a_ex (float or ndarray) – Total absorption coefficient at excitation wavelength λ’ [m-1]
bb_ex (float or ndarray) – Total backscattering coefficient at excitation wavelength λ’ [m-1]
bb_R (float or ndarray) – Raman backscattering coefficient at λ’ [m-1]. Can be computed using
bing.rt.raman.raman_backscattering_coeff()Ed_ratio (float or ndarray) – Ratio Ed(λ’)/Ed(λ). Default is 1.0
in_G2 (in_G1,) – Gordon coefficients. If None, use defaults (0.0949, 0.0794)
mu_d (float) – Mean cosine for downwelling irradiance
mu_u (float) – Mean cosine for upwelling irradiance
mu_R (float) – Mean cosine for Raman-scattered light
include_second_order (bool) – If True, include second-order Raman terms. Default is True
- Returns:
Remote sensing reflectance Rrs [sr-1]
- Return type:
float or ndarray
Example:
from bing.rt import raman from bing.rt.rrs import calc_Rrs_with_raman # At 520 nm emission with 443 nm excitation a_520, bb_520 = 0.05, 0.002 a_443, bb_443 = 0.03, 0.003 bb_R = raman.raman_backscattering_coeff(443) Rrs = calc_Rrs_with_raman(a_520, bb_520, a_443, bb_443, bb_R)
- calc_R_raman_first_order(a_em, bb_em, a_ex, bb_ex, bb_R, Ed_ratio=1.0, mu_d=0.9, mu_R=0.5)
Calculate first-order Raman reflectance (Term 1).
This is Eq. (11) from Sathyendranath & Platt (1998).
- Parameters:
a_em (float or ndarray) – Absorption coefficient at emission wavelength λ [m-1]
bb_em (float or ndarray) – Elastic backscattering coefficient at emission wavelength λ [m-1]
a_ex (float or ndarray) – Absorption coefficient at excitation wavelength λ’ [m-1]
bb_ex (float or ndarray) – Elastic backscattering coefficient at excitation wavelength λ’ [m-1]
bb_R (float or ndarray) – Raman backscattering coefficient at excitation wavelength λ’ [m-1]
Ed_ratio (float or ndarray) – Ratio of downwelling irradiance Ed(λ’)/Ed(λ). Default is 1.0
mu_d (float) – Mean cosine for downwelling irradiance
mu_R (float) – Mean cosine for Raman-scattered light
- Returns:
First-order Raman reflectance RR(λ, 0)
- Return type:
float or ndarray
The first-order term represents direct Raman scattering:
\[R^R(\lambda, 0) = \frac{E_d(\lambda')}{E_d(\lambda)} \times \frac{b_b^R(\lambda')/\mu_d(\lambda')}{K(\lambda') + \kappa^R(\lambda)}\]
- calc_R_raman_RE(a_em, bb_em, a_ex, bb_ex, bb_R, Ed_ratio=1.0, s_E=1.0, mu_d=0.9, mu_R=0.5)
Calculate second-order Raman-then-Elastic reflectance (Term 2).
This is Eq. (18) from Sathyendranath & Platt (1998): a downward Raman-scattering event followed by an upward elastic-scattering event.
- Parameters:
a_em (float or ndarray) – Absorption coefficient at emission wavelength λ [m-1]
bb_em (float or ndarray) – Elastic backscattering coefficient at emission wavelength λ [m-1]
a_ex (float or ndarray) – Absorption coefficient at excitation wavelength λ’ [m-1]
bb_ex (float or ndarray) – Elastic backscattering coefficient at excitation wavelength λ’ [m-1]
bb_R (float or ndarray) – Raman backscattering coefficient at λ’ [m-1]
Ed_ratio (float or ndarray) – Ratio Ed(λ’)/Ed(λ). Default is 1.0
s_E (float) – Shape factor for elastic scattering
mu_d (float) – Mean cosine for downwelling irradiance
mu_R (float) – Mean cosine for Raman-scattered light
- Returns:
Second-order Raman-Elastic reflectance RRE(λ, 0)
- Return type:
float or ndarray
Note
This term is typically ~10% of the first-order Raman term.
- calc_R_raman_ER(a_em, bb_em, a_ex, bb_ex, bb_R, Ed_ratio=1.0, s_E=1.0, mu_d=0.9, mu_u=0.4, mu_R=0.5)
Calculate second-order Elastic-then-Raman reflectance (Term 3).
This is Eq. (23) from Sathyendranath & Platt (1998): an upward elastic-scattering event followed by an upward Raman-scattering event.
- Parameters:
a_em (float or ndarray) – Absorption coefficient at emission wavelength λ [m-1]
bb_em (float or ndarray) – Elastic backscattering coefficient at emission wavelength λ [m-1]
a_ex (float or ndarray) – Absorption coefficient at excitation wavelength λ’ [m-1]
bb_ex (float or ndarray) – Elastic backscattering coefficient at excitation wavelength λ’ [m-1]
bb_R (float or ndarray) – Raman backscattering coefficient at λ’ [m-1]
Ed_ratio (float or ndarray) – Ratio Ed(λ’)/Ed(λ). Default is 1.0
s_E (float) – Shape factor for elastic scattering
mu_d (float) – Mean cosine for downwelling irradiance
mu_u (float) – Mean cosine for upwelling irradiance
mu_R (float) – Mean cosine for Raman-scattered light
- Returns:
Second-order Elastic-Raman reflectance RER(λ, 0)
- Return type:
float or ndarray
Note
This term is typically ~10% of the first-order Raman term.
- calc_R_raman_total(a_em, bb_em, a_ex, bb_ex, bb_R, Ed_ratio=1.0, s_E=1.0, mu_d=0.9, mu_u=0.4, mu_R=0.5, include_second_order=True)
Calculate total Raman contribution to reflectance at the sea surface.
This combines the first-order Raman term (Term 1) and optionally the two second-order terms (Terms 2 and 3) from Sathyendranath & Platt (1998).
- Parameters:
a_em (float or ndarray) – Absorption coefficient at emission wavelength λ [m-1]
bb_em (float or ndarray) – Elastic backscattering coefficient at emission wavelength λ [m-1]
a_ex (float or ndarray) – Absorption coefficient at excitation wavelength λ’ [m-1]
bb_ex (float or ndarray) – Elastic backscattering coefficient at excitation wavelength λ’ [m-1]
bb_R (float or ndarray) – Raman backscattering coefficient at λ’ [m-1]
Ed_ratio (float or ndarray) – Ratio Ed(λ’)/Ed(λ). Default is 1.0
s_E (float) – Shape factor for elastic scattering
mu_d (float) – Mean cosine for downwelling irradiance
mu_u (float) – Mean cosine for upwelling irradiance
mu_R (float) – Mean cosine for Raman-scattered light
include_second_order (bool) – If True, include second-order terms (RE and ER). Default is True
- Returns:
Total Raman reflectance contribution
- Return type:
float or ndarray
Total Raman reflectance = RR + RRE + RER
Note
The second-order Raman-Raman terms (Terms 4 and 5) are neglected as they contribute only ~1% of the first-order term (see Section 4.A of the paper).
- calc_R_total_with_raman(a_em, bb_em, a_ex, bb_ex, bb_R, Ed_ratio=1.0, s_E=1.0, mu_d=0.9, mu_u=0.4, mu_R=0.5, include_second_order=True)
Calculate total reflectance including elastic and Raman contributions.
This implements Eq. (26) from Sathyendranath & Platt (1998), the simplified model for clear waters.
- Parameters:
a_em (float or ndarray) – Absorption coefficient at emission wavelength λ [m-1]
bb_em (float or ndarray) – Elastic backscattering coefficient at emission wavelength λ [m-1]
a_ex (float or ndarray) – Absorption coefficient at excitation wavelength λ’ [m-1]
bb_ex (float or ndarray) – Elastic backscattering coefficient at excitation wavelength λ’ [m-1]
bb_R (float or ndarray) – Raman backscattering coefficient at λ’ [m-1]
Ed_ratio (float or ndarray) – Ratio Ed(λ’)/Ed(λ). Default is 1.0
s_E (float) – Shape factor for elastic scattering
mu_d (float) – Mean cosine for downwelling irradiance
mu_u (float) – Mean cosine for upwelling irradiance
mu_R (float) – Mean cosine for Raman-scattered light
include_second_order (bool) – If True, include second-order Raman terms. Default is True
- Returns:
Total reflectance R(λ, 0) = RE(λ) + RR(λ) + RRE(λ) + RER(λ)
- Return type:
float or ndarray
- calc_raman_correction_factor(a_em, bb_em, a_ex, bb_ex, bb_R, Ed_ratio=1.0, s_E=1.0, mu_d=0.9, mu_u=0.4, mu_R=0.5, include_second_order=True)
Calculate the multiplicative correction factor for Raman scattering.
This returns the ratio of total reflectance (with Raman) to elastic reflectance, useful for correcting Rrs retrievals.
- Parameters:
a_em (float or ndarray) – Absorption coefficient at emission wavelength λ [m-1]
bb_em (float or ndarray) – Elastic backscattering coefficient at emission wavelength λ [m-1]
a_ex (float or ndarray) – Absorption coefficient at excitation wavelength λ’ [m-1]
bb_ex (float or ndarray) – Elastic backscattering coefficient at excitation wavelength λ’ [m-1]
bb_R (float or ndarray) – Raman backscattering coefficient at λ’ [m-1]
Ed_ratio (float or ndarray) – Ratio Ed(λ’)/Ed(λ). Default is 1.0
s_E (float) – Shape factor for elastic scattering
mu_d (float) – Mean cosine for downwelling irradiance
mu_u (float) – Mean cosine for upwelling irradiance
mu_R (float) – Mean cosine for Raman-scattered light
include_second_order (bool) – If True, include second-order Raman terms. Default is True
- Returns:
Correction factor: (RE + Rraman) / RE
- Return type:
float or ndarray
To remove Raman contribution from measured reflectance:
R_elastic = R_measured / correction_factor
Note
Typical correction factors range from 1.0 to ~1.25, with largest corrections in clear (oligotrophic) waters at longer wavelengths.
- calc_R_elastic(a, bb, s=1.0, mu_d=0.9, mu_u=0.4)
Calculate elastic-scattering reflectance at the sea surface.
This is Eq. (5) from Sathyendranath & Platt (1998), the standard elastic scattering term (Term 0 in Table 1).
- Parameters:
- Returns:
Elastic reflectance RE(λ, 0)
- Return type:
float or ndarray
\[R^E(\lambda, 0) = \frac{\mu_u \times s}{\mu_u + \mu_d} \times \frac{b_b}{a + b_b}\]This is equivalent to the Gordon model when appropriate G factors are used.
- calc_attenuation_coeffs(a, bb, mu_d=0.9, mu_u=0.4, mu_R=0.5)
Calculate diffuse attenuation coefficients for elastic and Raman scattering.
Following Sathyendranath & Platt (1998) Eqs. (3) and (4).
- Parameters:
- Returns:
Dictionary containing attenuation coefficients:
'K': Downwelling attenuation coefficient'kappa_E': Upwelling attenuation for elastic scatter'kappa_R': Upwelling attenuation for Raman scatter'K_R': Downwelling attenuation after Raman scatter
- Return type:
Physical Background
Wavelength Dependence
The Raman scattering coefficient follows a strong power-law wavelength dependence:
Units |
Excitation Form |
Emission Form |
|---|---|---|
Energy |
bR ∝ (λ’)-5.5 |
bR ∝ λ-4.8 |
Photon |
bR ∝ (λ’)-5.3 |
bR ∝ λ-4.6 |
This strong wavelength dependence means Raman scattering is much more significant at blue wavelengths than at red wavelengths.
Emission Spectrum
The emission spectrum is modeled using the Walrafen (1967) four-Gaussian parameterization:
Component |
Weight |
Center (cm-1) |
FWHM (cm-1) |
|---|---|---|---|
1 |
0.41 |
3250 |
210 |
2 |
0.39 |
3425 |
175 |
3 |
0.10 |
3530 |
140 |
4 |
0.10 |
3625 |
140 |
This produces the characteristic peak-and-shoulder shape of the water Raman emission band.
Wavelength Shifts
The wavelength shift increases with excitation wavelength due to the fixed wavenumber shift:
λ’ (nm) |
λ (nm) |
Shift (nm) |
|---|---|---|
350 |
397 |
47 |
400 |
463 |
63 |
450 |
531 |
81 |
488 |
585 |
97 |
500 |
602 |
102 |
550 |
677 |
127 |
Backscattering
The Raman phase function is nearly symmetric about 90°, resulting in a backscattering ratio of exactly 0.5. This is similar to Rayleigh (molecular) scattering and quite different from particle scattering (which is strongly forward-peaked).
Example: Radiative Transfer Source Term
In radiative transfer calculations, Raman scattering appears as a source term. For unpolarized light:
import numpy as np
from raman_seawater import raman_vsf
def raman_source_term(L_excitation, lambda_ex, lambda_em, psi):
"""
Calculate Raman scattering source term for RT equation.
Parameters
----------
L_excitation : ndarray
Radiance at excitation wavelength [W m⁻² sr⁻¹ nm⁻¹]
lambda_ex : float
Excitation wavelength [nm]
lambda_em : float
Emission wavelength [nm]
psi : ndarray
Scattering angles [radians]
Returns
-------
S_raman : ndarray
Source term contribution [W m⁻³ sr⁻¹ nm⁻¹]
"""
beta_R = raman_vsf(lambda_ex, lambda_em, psi)
# Integrate over solid angle (simplified)
S_raman = beta_R * L_excitation
return S_raman
Example: Effect on Remote Sensing Reflectance
Raman scattering can contribute significantly to remote sensing reflectance, especially in clear waters at red wavelengths:
import numpy as np
import matplotlib.pyplot as plt
from raman_seawater import raman_scattering_coeff, excitation_to_emission_wavelength
# Wavelengths where Raman contributes to Rrs
emission_wavelengths = np.array([550, 600, 650, 700])
# Find corresponding excitation wavelengths
for lam_em in emission_wavelengths:
# Light at ~450-500 nm scatters into these wavelengths
lam_ex = 1e7 / (1e7/lam_em + 3400) # Approximate
b_R = raman_scattering_coeff(lam_ex)
print(f"Light at {lam_ex:.0f} nm → {lam_em} nm, b_R = {b_R:.2e} m⁻¹")
Limitations and Notes
Temperature/Salinity Dependence: The current implementation uses Walrafen (1967) parameters for pure water at 25°C. The emission spectrum shape varies slightly with temperature and salinity (see Artlett & Pask 2017).
Pure Water vs Seawater: Bartlett et al. (1998) found no statistically significant difference between pure water and seawater Raman scattering coefficients.
Polarization: The phase function averages over all polarization states. For polarized radiative transfer, a full Mueller matrix treatment is required.
Energy vs Photon Units: Use
units='energy'for radiative transfer codes like HydroLight that work in energy units (W m-2 nm-1), andunits='photon'for Monte Carlo simulations that track photon numbers.
References
Sathyendranath, S. and Platt, T. (1998). “Ocean-colour model incorporating transspectral processes,” Appl. Opt. 37, 2216-2227.
Bartlett, J.S., Voss, K.J., Sathyendranath, S., and Vodacek, A. (1998). “Raman scattering by pure water and seawater,” Appl. Opt. 37, 3324-3332.
Desiderio, R.A. (2000). “Application of the Raman scattering coefficient of water to calculations in marine optics,” Appl. Opt. 39, 1893-1894.
Ge, Y., Gordon, H.R., and Voss, K.J. (1993). “Simulation of inelastic-scattering contributions to the irradiance field in the ocean: variation in Fraunhofer line depths,” Appl. Opt. 32, 4028-4036.
Mobley, C.D. (1994). Light and Water: Radiative Transfer in Natural Waters. Academic Press.
Walrafen, G.E. (1967). “Raman spectral studies of the effects of temperature on water structure,” J. Chem. Phys. 47, 114-126.
Artlett, C.P. and Pask, H.M. (2017). “Optical remote sensing of water temperature using Raman spectroscopy,” Opt. Express 25, 2840-2851.
Ocean Optics Web Book: https://www.oceanopticsbook.info/view/scattering/level-2/raman-scattering