nirs4all.synthesis.scattering module

Scattering effects configuration for synthetic NIRS data generation.

This module provides configuration classes for light scattering effects in NIR spectra, including particle size effects and scattering coefficient generation.

Note

For applying scattering effects to spectra, use the operators in nirs4all.operators.augmentation.scattering: - ParticleSizeAugmenter: Particle size-dependent scattering - EMSCDistortionAugmenter: EMSC-style scatter distortions

Key Features:
  • EMSC-style (Extended Multiplicative Scatter Correction) transformations

  • Particle size-dependent scattering simulation

  • Scattering coefficient generation for Kubelka-Munk

  • Sample-to-sample scatter variation

  • Wavelength-dependent scattering (Rayleigh-like)

Physics Background:

Light scattering in particulate samples is complex and depends on: - Particle size relative to wavelength (Mie vs Rayleigh regimes) - Particle shape and surface roughness - Refractive index differences - Packing density

Rather than implementing full Mie theory (computationally expensive and may not match real data), this module uses empirical EMSC-style models that approximate the distortions that chemometric preprocessing corrects.

References

  • Martens, H., Nielsen, J. P., & Engelsen, S. B. (2003). Light scattering and light absorbance separated by extended multiplicative signal correction. Application to near-infrared transmission analysis of powder mixtures. Analytical Chemistry, 75(3), 394-404.

  • Kubelka, P. (1948). New contributions to the optics of intensely light-scattering materials. Part I. JOSA, 38(5), 448-457.

  • Dahm, D. J., & Dahm, K. D. (2007). Interpreting Diffuse Reflectance and Transmittance. NIR Publications.

  • Burger, J., & Geladi, P. (2005). Hyperspectral NIR image regression part I: calibration and correction. Journal of Chemometrics, 19(5‐7), 355-363.

class nirs4all.synthesis.scattering.ParticleSizeDistribution(mean_size_um: float = 50.0, std_size_um: float = 15.0, min_size_um: float = 5.0, max_size_um: float = 200.0, distribution: str = 'lognormal')[source]

Bases: object

Particle size distribution parameters.

Models particle size as a log-normal distribution, which is common for ground/milled samples in NIR analysis.

Variables:
  • mean_size_um (float) – Mean particle size in micrometers.

  • std_size_um (float) – Standard deviation of particle size in micrometers.

  • min_size_um (float) – Minimum particle size (lower truncation).

  • max_size_um (float) – Maximum particle size (upper truncation).

  • distribution (str) – Type of distribution (‘lognormal’, ‘normal’, ‘uniform’).

distribution: str = 'lognormal'
max_size_um: float = 200.0
mean_size_um: float = 50.0
min_size_um: float = 5.0
sample(n_samples: int, rng: Generator) → ndarray[source]

Sample particle sizes from the distribution.

std_size_um: float = 15.0
class nirs4all.synthesis.scattering.ScatteringCoefficientConfig(baseline_scattering: float = 1.0, wavelength_exponent: float = 1.0, particle_size_factor: float = 0.5, sample_variation: float = 0.15, wavelength_reference_nm: float = 1500.0)[source]

Bases: object

Configuration for scattering coefficient (S) generation.

For Kubelka-Munk reflectance, we need both absorption (K) and scattering (S) coefficients. This config controls S(λ) generation.

Variables:
  • baseline_scattering (float) – Base scattering coefficient value.

  • wavelength_exponent (float) – Exponent for wavelength dependence. S(λ) ∝ λ^(-exponent)

  • particle_size_factor (float) – How strongly particle size affects S.

  • sample_variation (float) – Sample-to-sample variation in S.

  • wavelength_reference_nm (float) – Reference wavelength for normalization.

baseline_scattering: float = 1.0
particle_size_factor: float = 0.5
sample_variation: float = 0.15
wavelength_exponent: float = 1.0
wavelength_reference_nm: float = 1500.0
class nirs4all.synthesis.scattering.ScatteringModel(value)[source]

Bases: StrEnum

Available scattering models.

EMSC = 'emsc'
KUBELKA_MUNK = 'kubelka_munk'
MIE_APPROX = 'mie_approx'
POLYNOMIAL = 'polynomial'
RAYLEIGH = 'rayleigh'