Skip to contents

Corrects the intensities of emission lines for self-absorption by the internal reference method of Sun and Yu (2009): for each species, the self-absorption coefficient of every line is measured against a line of the same species that is little self-absorbed.

Usage

correct_self_absorption(
  lines,
  temperature = NULL,
  electron_density = NULL,
  ionization_energy = NULL,
  reference = NULL,
  units = "energy",
  tol = 1e-08,
  timeout = 120
)

Arguments

lines

A data frame with one row per line and columns species, intensity, wavelength (nm), Aki (s\(^{-1}\)), gk, Ek (upper-level energy, eV) and, for the default reference, Ei (lower-level energy, eV).

temperature

The plasma temperature, in K. Without it, it is estimated from the corrected lines, which needs electron_density.

electron_density

The electron density, in cm\(^{-3}\), to estimate the temperature (see details).

ionization_energy

The ionization energies of the neutral atoms, in eV, named by element, to estimate the temperature. By default, they are taken from the NIST database (see nist_ionization_energy()).

reference

The reference lines: row numbers of lines, one per species, or NULL (default) to choose them by optical depth.

units

The units of intensity: "energy" (default) or "photons", as in boltzmann().

tol

The relative tolerance on the estimated temperature. Default is 1e-8.

timeout

The timeout of the NIST downloads, in seconds.

Value

lines, as a tibble, with the corrected intensity, the measured_intensity, the self-absorption coefficient SA and a logical reference, ready for boltzmann() or cf_libs(). The temperature used is in the attribute temperature.

Details

In an optically thin plasma in LTE, the intensity ratio of two lines of the same species depends only on their atomic data and on the temperature. With a reference line \(r\) assumed optically thin, the self-absorption coefficient of a line \(j\) is $$SA_j = \frac{I_j}{I_r} \frac{g_r A_r \lambda_j}{g_j A_j \lambda_r} \exp\left(\frac{E_j - E_r}{k_B T}\right)$$ (for intensities in energy units; without the wavelengths for photon counts), where \(g\), \(A\) and \(E\) are the statistical weight, transition probability and energy of the upper level. The corrected intensity is \(I_j / SA_j\).

Self-absorption grows with the optical depth of the line, roughly proportional to \(g_k A_{ki} \lambda^4 \exp(-E_i / k_B T)\), where \(E_i\) is the energy of the lower level: resonance lines (\(E_i = 0\)) and strong lines are the most absorbed. By default, the reference of each species is the line of smallest optical depth, which needs the lower-level energies (column Ei, as returned by nist_lines()); otherwise, give the reference lines with reference. The reference line must be well measured: its noise propagates to every coefficient.

The corrected lines of a species lie, by construction, on the Boltzmann plot of its reference line at the temperature used, so they cannot give the temperature by themselves. Give temperature, measured on optically thin lines (for example with saha_boltzmann() or cf_libs()), or give electron_density: the temperature is then the one at which the corrected lines of the neutral atom and of the ion of each element lie on a common Saha-Boltzmann plot (as in cf_libs()), which needs lines of both stages for at least one element. This is the iterative scheme of Sun and Yu (2009), solved directly for the temperature.

Coefficients above 1 mean that the line is stronger than expected from the reference, because of noise, errors of the atomic data, or a self-absorbed reference; they are kept, with a warning.

References

  • Sun, L., Yu, H. (2009). Correction of self-absorption effect in calibration-free laser-induced breakdown spectroscopy by an internal reference method. Talanta, 79(2):388-395.

See also

self_absorption() for the coefficient from line widths, cf_libs(), line_intensities()

Author

Christian L. Goueguel

Examples

data(forageLIBS)
mean_spectrum <- colMeans(forageLIBS[-(1:14)])
# potassium lines: the resonance doublet at 766.49 and 769.90 nm ends on
# the ground state (Ei = 0) and is strongly reabsorbed
k_lines <- data.frame(
  species = "K I", wavelength = c(404.414, 404.721, 691.108, 693.877, 766.490, 769.896),
  Aki = c(1.150e6, 1.070e6, 2.500e6, 4.956e6, 3.779e7, 3.734e7),
  gk = c(4, 2, 2, 2, 4, 2),
  Ek = c(3.065, 3.063, 3.403, 3.403, 1.617, 1.610),
  Ei = c(0, 0, 1.610, 1.617, 0, 0)
)
corrected <- correct_self_absorption(line_intensities(mean_spectrum, k_lines), temperature = 8000)
#> Warning: 1 line(s) have SA > 1: check the reference lines, the atomic data or the intensities.
corrected[c("wavelength", "measured_intensity", "SA", "reference")]
#> # A tibble: 6 × 4
#>   wavelength measured_intensity     SA reference
#>        <dbl>              <dbl>  <dbl> <lgl>    
#> 1       404.               449. 0.531  FALSE    
#> 2       405.               394. 1      TRUE     
#> 3       691.               407. 1.24   FALSE    
#> 4       694.               424. 0.651  FALSE    
#> 5       766.              5418. 0.0452 FALSE    
#> 6       770.              7178. 0.121  FALSE