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]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
)
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]")))