2.2 Signal analyses

2.2.1 Curve Deconvolution

Before calculating the equivalent doses for each aliquot it may be useful to estimate the photoionisation cross sections of some of the OSL curves. The example *.bin file includes standard continous-wave OSL curves as well as linearly modulated OSL curves. This allows us to use both the functions fit_CWCurve() and fit_LMCurve() and to compare their results.

First, we will begin with the LM-OSL curves, which are named “RBR” in the *.bin file. For the sake of briefness we focus on one aliquot and one curve.

# LM-OSL curve of the second aliquot
lm_curve <- get_RLum(subset(rlum[[3]], LTYPE == "RBR"))
lm_fit <- fit_LMCurve(values = lm_curve, 
                      n.components = 3, 
                      fit.method = "LM", 
                      LED.power = 30, 
                      LED.wavelength = 470)
## 
## [fit_LMCurve()]
## 
## Fitting was done using a 3-component function:
## 
##       xm.1       xm.2       xm.3       Im.1       Im.2       Im.3 
##  18.342407 146.914692 701.057433 162.076721   9.926817  60.606545 
## 
## (equation used for fitting according Kitis & Pagonis, 2008)
## ------------------------------------------------------------------------------
## (1) Corresponding values according the equation in Bulur, 1996 for b and n0:
## 
## b1 = 2.972264e+00 +/- NA
## n01 = 4.901446e+03 +/- NA
## 
## b2 = 4.633077e-02 +/- NA
## n02 = 2.404487e+03 +/- NA
## 
## b3 = 2.034664e-03 +/- NA
## n03 = 7.005197e+04 +/- NA
## 
## cs from component.1 = 4.187e-17 cm^2  >> relative: 1
## cs from component.2 = 6.527e-19 cm^2  >> relative: 0.0156
## cs from component.3 = 2.866e-20 cm^2  >> relative: 7e-04
## 
## (stimulation intensity value used for calculation: 7.098105e+16 1/s 1/cm^2)
## (errors quoted as 1-sigma uncertainties)
## ------------------------------------------------------------------------------
## 
## pseudo-R^2 = 0.8532

We can see the photoionisation cross-sections in the console output or get from the output object.

lm_df <- get_RLum(lm_fit)
cat(" cs1: ", lm_df$cs1, "\n", 
    "cs2: ", lm_df$cs2, "\n", 
    "cs3: ", lm_df$cs3)
##  cs1:  4.187405e-17 
##  cs2:  6.527203e-19 
##  cs3:  2.86649e-20

We now want to compare these values with the cross sections obtained from fitting CW-OSL curves. Again, we will only focus on one randomly chosen OSL curve here.

# Fifth CW-OSL curve of the third aliquot 
cw_curve <- get_RLum(subset(rlum[[3]], LTYPE == "OSL"))[[5]]
cw_fit <- fit_CWCurve(values = cw_curve, 
                      n.components.max = 3, 
                      fit.method = "LM", 
                      LED.power = 30, 
                      LED.wavelength = 470)
## 
## [fit_CWCurve()]
## 
## Fitting was finally done using a 3-component function (max=3):
## ------------------------------------------------------------------------------
## y ~ I0.1 * lambda.1 * exp(-lambda.1 * x) + I0.2 * lambda.2 * exp(-lambda.2 * x) + I0.3 * lambda.3 * exp(-lambda.3 * x)
## 
##           I0 I0.error     lambda lambda.error           cs cs.rel
## c1 3751.3428       NA 4.75949137           NA 6.705299e-17 1.0000
## c2  805.6833       NA 1.27070518           NA 1.790203e-17 0.2670
## c3 6856.1207       NA 0.01171049           NA 1.649805e-19 0.0025
## ------------------------------------------------------------------------------
## pseudo-R^2 = 0.9999

To compare the results side-by-side we do the following:

cw_df <- get_RLum(cw_fit)

fit_cmp <- data.frame(lm = c(lm_df$cs1, lm_df$cs2, lm_df$cs3),
                      cw = c(cw_df$cs1, cw_df$cs2, cw_df$cs3))

print(fit_cmp)
##             lm           cw
## 1 4.187405e-17 6.705299e-17
## 2 6.527203e-19 1.790203e-17
## 3 2.866490e-20 1.649805e-19

We can see that the estimated photoionisation cross-section differ significantly, but at least to a certain degree this is to be expected. We will conclude this section by calculating the cross-sections for all curves of the third aliquot to get an idea of the variation in cross-sections in relation to which OSL curve in the SAR sequence we choose.

cw_curves <- get_RLum(subset(rlum[[3]], LTYPE == "OSL"))

cw_fits <- lapply(cw_curves, function(x) {
  fit_CWCurve(values = x, 
              n.components.max = 3,
              LED.power = 30,
              LED.wavelength = 470, 
              plot = FALSE,
              output.terminal = FALSE)
})

cw_df <- do.call(rbind, lapply(cw_fits, get_RLum))

print(data.frame(cs1 = cw_df$cs1, cs2 = cw_df$cs2, cs3 = cw_df$cs3))
##             cs1          cs2          cs3
## 1  7.322933e-17 3.859775e-17 1.866048e-19
## 2  6.597191e-17 1.589718e-17 8.815001e-20
## 3  5.906354e-17 2.091400e-19           NA
## 4  6.820000e-17 2.434604e-17 1.128228e-19
## 5  6.188075e-17 3.535824e-19           NA
## 6  6.254661e-17 1.122788e-17 7.114983e-20
## 7  6.264612e-17 4.890416e-19           NA
## 8  5.723646e-17 1.483482e-19           NA
## 9  6.975882e-17 1.756716e-17 2.524862e-19
## 10 6.181046e-17 7.165776e-18 8.910884e-20
## 11 8.654528e-17 6.821781e-18 5.503551e-20
## 12 6.394950e-17 1.018651e-17 8.367138e-20
## 13 6.123000e-17 2.766032e-19           NA
## 14 6.860315e-17 1.751772e-17 9.999167e-20
plot(x = 1:nrow(cw_df), y = cw_df$cs1, col = "red", type = "l", 
     ylim = c(1e-22, 1e-16), log = "y")
points(x = 1:nrow(cw_df), y = cw_df$cs2, col = "green", type = "l")
points(x = 1:nrow(cw_df), y = cw_df$cs3, col = "blue", type = "l")

2.2.2 Fast ratio

Another way to characterise OSL curves is by calculating the fast ratio after Durcan & Duller (2011), which can easily be done using the function calc_FastRatio().

osl_curves <- subset(rlum[[3]], LTYPE == "OSL")
fr <- lapply(osl_curves, function(x) {
  calc_FastRatio(object = x,
                 stimulation.power = 37, 
                 wavelength = 470,
                 fitCW.sigma = TRUE,
                 plot = FALSE,
                 verbose = FALSE)
})

fr_df <- do.call(rbind, get_RLum(fr))

plot(x = 1:nrow(fr_df), y = fr_df$fast.ratio, type = "l")

2.2.3 NR(t) plots

A rarely used method to graphically visualise the relative rates of signal decay is to produce natural/regenerated signal vs time (NR(t)) plot after Steffen et al. 2009. Before using this function, however, we need to remove all the OSL curves of the test dose signals. Subsetting the RLum.Analysis is not a viable option this time, however, as a *.bin file does not contain the relevant information to properly identify the test dose curves (at least if not explicitly set in the Sequence Editor). The easier approach would be to just remove every second curve from the RLum.Analysis object.

natreg <- get_RLum(osl_curves)[seq(from = 1, to = length(osl_curves), by = 2)]
str(natreg, max.level = 1)
## List of 7
##  $ :Formal class 'RLum.Data.Curve' [package "Luminescence"] with 7 slots
##  $ :Formal class 'RLum.Data.Curve' [package "Luminescence"] with 7 slots
##  $ :Formal class 'RLum.Data.Curve' [package "Luminescence"] with 7 slots
##  $ :Formal class 'RLum.Data.Curve' [package "Luminescence"] with 7 slots
##  $ :Formal class 'RLum.Data.Curve' [package "Luminescence"] with 7 slots
##  $ :Formal class 'RLum.Data.Curve' [package "Luminescence"] with 7 slots
##  $ :Formal class 'RLum.Data.Curve' [package "Luminescence"] with 7 slots

With get_RLum() we first extract all of the OSL curves in the RLum.Analysis object. Inside of the [] operator we select only the odd numbered curves by creating a sequence (seq()) of odd numbers from 1 to the max number of stored OSL curves.

Note that the new variable natreg is no longer an object of class RLum.Analysis, but a list of RLum.Data.Curve3. This is because we extracted (get_RLum()) the curves rather than modifying the object in place. This is ok for us, as the details section in plot_NRt() states that it will also accept a list of RLum.Data.Curve objects.

plot_NRt(natreg, log = "x", smooth = "rmean", k = 3)

In a NR(t) plot the signal of each channel of the natural curve is divided by the corresponding signal in the same channel of a regenerative dose. To account for the obvious difference in brightness (dose dependency) each curve is normalised to its initial signal, so the deviation from unity when dividing the signals per channel is a direct reflection of the differences in the decay rate. In this example each curve is follow the area below unity, which means that the natural signal decays faster than the regenerated signals.


  1. An RLum.Analysis object is basically only a container for a number of RLum.Data.Curve objects.