It takes only 4 steps to analyse your SAR luminescence data

by Sebastian Kreutzer & R Luminescence Team (February 21, 2020)
[last updated: 2022-11-30]

Luminescence >= 0.6.0

Creative Commons License

Creative Commons
Attribution-NonCommercial-NoDerivatives 4.0
International License


Usually R does not cause a lot of frustration, but only if you know how to use it. However, first steps are difficult. To ease the beginning for analysing luminescence data, in 2015 we published a guide (Fuchs et al. 2015) to analyse SAR (Murray and Wintle 2000) data. Since then, 'Luminescence' evolved, today making the luminescence data analysis easier than ever before. By using the example data (SAR, quartz) published along with the article by Fuchs et al. (2015), here again we demonstrate how to analyse the luminescence data with R. In only 4 steps, promised, it was never easier.

Step 1: Load the package ‘Luminescence’

Simple, but indispensable, our first step is loading the R package ’Luminescence':

library(Luminescence)

Step 2: Load and select your data

Without data, no data analysis. We now import the measurement data into R by calling the function read_BIN2R() (if you have XSYG-files, use read_XSYG2R() instead). The function file.choose() opens an external window to allow a very convenient file selection. The argument fastForward makes sure that the data are directly available in the format we want to have them.

file <- file.choose()
temp <- read_BIN2R(file, fastForward = TRUE)

Not every data set is instantly ready to be analysed, e.g., the data set may contain additional information, which are not needed for the analysis. This is the case for our test data set. As written in Fuchs et al. (2015), only the first 20 aliquots follow the common SAR procedure, i.e. a consecutive sequence of irradiation, heating, OSL (\(L_x\)), irradiation, heating and OSL (\(T_x\)). Therefore, we have to limit our data set to the first 20 aliquots:

temp.sel <- temp[1:20]

Note: Further limitations can be applied by using the function get_RLum(). Type ?get_RLum in your R console to get further information. Please do not forget to set the parameter get_RLum(...,drop = FALSE) otherwise your object will look different from what the function expects as input.

Step 3: Run the SAR analysis

Now the data are ready and can be analysed calling the function analyse_SAR.CWOSL:

results <- analyse_SAR.CWOSL(
  object = temp.sel,
  signal.integral.min = 1,
  signal.integral.max = 5,
  background.integral.min = 200,
  background.integral.max = 250,
  fit.method = "EXP",
  rejection.criteria = list(
    recycling.ratio = 10,
    recuperation.rate = 10,
    testdose.error = 10,
    palaeodose.error = 20,
    exceed.max.regpoint = TRUE),
  plot_onePage = TRUE
)
Example output for one aliquot.

Figure 1: Example output for one aliquot.

The graphical output consists of three different plot sets: (A) the preheat curves (here as TL) and the OSL curves used to calculate \(L_{x}/T_{x}\), (B) the dose response curve and (C) a plot showing visualising the rejection criteria and, if measured, the IRSL curve checking for a potential feldspar contamination of the quartz sample.

To modify arguments or to understand the meaning of the given arguments, please type ?analyse_SAR.CWOSL in your R console.

The results of the analysis is a complex R object (here named results), which can be used for further analysis.

results
## 
##  [RLum.Results-class]
##   originator: analyse_SAR.CWOSL()
##   data: 4
##       .. $data : data.frame
##   .. $LnLxTnTx.table : data.frame
##   .. $rejection.criteria : data.frame
##   .. $Formula : list
##   additional info elements:  20

To show only the obtained equivalent dose \(D_{e}\) values, the following line needs to be typed on the R console:

head(results$data)
De De.Error D01 D01.ERROR D02 D02.ERROR Dc De.MC Fit HPDI68_L HPDI68_U HPDI95_L HPDI95_U RC.Status signal.range background.range signal.range.Tx background.range.Tx UID
1195.3066 86.01178 2651.342 716.9431 NA NA NA 1192.4226 EXP 1107.2406 1284.2021 1026.1896 1363.9023 OK 1 : 5 200 : 250 NA : NA NA : NA 2022-11-30-10:35.0.536449233070016
517.3256 42.84821 1759.007 306.3545 NA NA NA 518.0534 EXP 474.7024 562.4866 428.1501 599.7284 OK 1 : 5 200 : 250 NA : NA NA : NA 2022-11-30-10:35.0.919467546278611
1586.1348 241.71008 1193.753 452.2685 NA NA NA 1575.4056 EXP 1277.0816 1768.3679 1126.6878 2115.9446 OK 1 : 5 200 : 250 NA : NA NA : NA 2022-11-30-10:35.0.134313349612057
2594.8597 434.11039 2053.184 689.1965 NA NA NA 2654.0921 EXP 2200.3144 2895.4798 1916.5734 3413.3071 OK 1 : 5 200 : 250 NA : NA NA : NA 2022-11-30-10:35.0.915220024762675
1098.9140 81.06395 2361.560 956.0927 NA NA NA 1096.6479 EXP 1004.6458 1164.9832 946.4412 1283.5889 OK 1 : 5 200 : 250 NA : NA NA : NA 2022-11-30-10:35.0.741841394919902
1445.5594 120.59179 1888.343 774.7261 NA NA NA 1459.3731 EXP 1334.4822 1583.7193 1214.0455 1705.8287 OK 1 : 5 200 : 250 NA : NA NA : NA 2022-11-30-10:35.0.333230577874929

Investigate rejection criteria

A very common question asked is: How can I see whether an aliquot passed the rejection criteria? We have implemented two ways, the first method to see this information is to look into the column RC.Status, where "OK" or "FAILED" mark the outcome:

head(results$data[,c("De", "RC.Status")])
##          De RC.Status
## 1 1195.3066        OK
## 2  517.3256        OK
## 3 1586.1348        OK
## 4 2594.8597        OK
## 5 1098.9140        OK
## 6 1445.5594        OK

By summarising the overall outcome, this information remains, on purpose, rather generic. More detailed insight is provided with the element rejection.criteria that is a data frame with rows for the calculated rejection criteria:

head(results$rejection.criteria)
Criteria Value Threshold Status UID
Recycling ratio (R5/R2) 0.916300 1e-01 OK 2022-11-30-10:35.0.536449233070016
Recuperation rate 1 0.090200 1e-01 OK 2022-11-30-10:35.0.536449233070016
Testdose error 0.037405 1e-01 OK 2022-11-30-10:35.0.536449233070016
Palaeodose error 0.071960 2e-01 OK 2022-11-30-10:35.0.536449233070016
De > max. dose point 1195.306592 3e+03 OK 2022-11-30-10:35.0.536449233070016
Recycling ratio (R5/R2) 0.961800 1e-01 OK 2022-11-30-10:35.0.919467546278611

While this information is complete, the logical next step is to combine the information from the element data with the information from the element rejection.criteria to perform additional analyses. This can be done with the base R function merge() using the column UID from both data frames:

df <- merge(results$data, results$rejection.criteria, by = "UID")
UID De De.Error D01 D01.ERROR D02 D02.ERROR Dc De.MC Fit HPDI68_L HPDI68_U HPDI95_L HPDI95_U RC.Status signal.range background.range signal.range.Tx background.range.Tx Criteria Value Threshold Status
2022-11-30-10:35.0.134313349612057 1586.135 241.7101 1193.753 452.2685 NA NA NA 1575.406 EXP 1277.082 1768.368 1126.688 2115.945 OK 1 : 5 200 : 250 NA : NA NA : NA Recycling ratio (R5/R2) 1.0710000 1e-01 OK
2022-11-30-10:35.0.134313349612057 1586.135 241.7101 1193.753 452.2685 NA NA NA 1575.406 EXP 1277.082 1768.368 1126.688 2115.945 OK 1 : 5 200 : 250 NA : NA NA : NA Recuperation rate 1 0.0315000 1e-01 OK
2022-11-30-10:35.0.134313349612057 1586.135 241.7101 1193.753 452.2685 NA NA NA 1575.406 EXP 1277.082 1768.368 1126.688 2115.945 OK 1 : 5 200 : 250 NA : NA NA : NA Testdose error 0.0595317 1e-01 OK
2022-11-30-10:35.0.134313349612057 1586.135 241.7101 1193.753 452.2685 NA NA NA 1575.406 EXP 1277.082 1768.368 1126.688 2115.945 OK 1 : 5 200 : 250 NA : NA NA : NA Palaeodose error 0.1523900 2e-01 OK
2022-11-30-10:35.0.134313349612057 1586.135 241.7101 1193.753 452.2685 NA NA NA 1575.406 EXP 1277.082 1768.368 1126.688 2115.945 OK 1 : 5 200 : 250 NA : NA NA : NA De > max. dose point 1586.1348028 3e+03 OK
2022-11-30-10:35.0.16098961327225 1857.376 152.5073 3449.560 4668.9314 NA NA NA 1874.832 EXP 1645.088 1715.757 1570.699 2186.269 OK 1 : 5 200 : 250 NA : NA NA : NA Recycling ratio (R5/R2) 1.0066000 1e-01 OK

Step 4: Plot your data

The last step. No luminescence data analysis without a graphical representation of the results. Below we have chosen the abanico plot (Dietze et al. 2016) to visualise the final \(D_e\) distribution. The prior used function subset ensures that only values are shown, which have successfully been passed the rejection criteria.

df <- subset(results$data, RC.Status == "OK")
plot_AbanicoPlot(df[,1:2], zlab = expression(paste(D[e], " [s]")))

The compact call

Now let’s do all of this in a single, neat call using the |> pipe operator supported in R >= 4.0.0 onwards.

Note: Minor differences in the plot are due to the Monte Carlo runs used for the estimation of the uncertainty.

results <- read_BIN2R(file, verbose = FALSE, fastForward = TRUE)[1:20] |>
  analyse_SAR.CWOSL(
    signal.integral.min = 1,
    signal.integral.max = 5,
    background.integral.min = 200,
    background.integral.max = 250,
    fit.method = "EXP",
    rejection.criteria = list(
      recycling.ratio = 10,
      recuperation.rate = 10,
      testdose.error = 10,
      palaeodose.error = 20,
      exceed.max.regpoint = TRUE),
    plot = FALSE,
    verbose = FALSE) |>
  get_RLum(data.object = "data") |>
  subset(RC.Status == "OK") |>
  plot_AbanicoPlot(zlab = expression(paste(D[e], " [s]")))

References

Dietze, Michael, Sebastian Kreutzer, Christoph Burow, Margret C Fuchs, Manfred Fischer, and Christoph Schmidt. 2016. The abanico plot: visualising chronometric data with individual standard errors.” Quaternary Geochronology 31 (February): 12–18.
Fuchs, Margret C, Sebastian Kreutzer, Christoph Burow, Michael Dietze, Manfred Fischer, Christoph Schmidt, and Markus Fuchs. 2015. Data processing in luminescence dating analysis: An exemplary workflow using the R package Luminescence.” Quaternary International 362 (March): 8–13.
Murray, Andrew S, and Ann G Wintle. 2000. Luminescence dating of quartz using an improved single-aliquot regenerative-dose protocol.” Radiation Measurements 32 (1): 57–73.