Nothing
#' @title Transform a CW-OSL curve into a pPM-OSL curve via interpolation under
#' parabolic modulation conditions
#'
#' @description
#' Transforms a conventionally measured continuous-wave (CW) OSL-curve into a
#' pseudo parabolic modulated (pPM) curve under parabolic modulation conditions
#' using the interpolation procedure described by Bos & Wallinga (2012).
#'
#' @details
#' The complete procedure of the transformation is given in Bos & Wallinga
#' (2012). The input `data.frame` consists of two columns: time (t) and
#' count values (CW(t))
#'
#' **Nomenclature**
#'
#' - P = stimulation time (s)
#' - 1/P = stimulation rate (1/s)
#'
#' **Internal transformation steps**
#'
#' (1)
#' log(CW-OSL) values
#'
#' (2)
#' Calculate t' which is the transformed time:
#' \deqn{t' = (1/3)*(1/P^2)t^3}
#'
#' (3)
#' Interpolate CW(t'), i.e. use the log(CW(t)) to obtain the count values for
#' the transformed time (t'). Values beyond `min(t)` and `max(t)`
#' produce `NA` values.
#'
#' (4)
#' Select all values for t' < `min(t)`, i.e. values beyond the time resolution
#' of t. Select the first two values of the transformed data set which contain
#' no `NA` values and use these values for a linear fit using [lm].
#'
#' (5)
#' Extrapolate values for t' < `min(t)` based on the previously obtained
#' fit parameters. The extrapolation is limited to two values. Other values at
#' the beginning of the transformed curve are set to 0.
#'
#' (6)
#' Transform values using
#' \deqn{pLM(t) = t^2/P^2*CW(t')}
#'
#' (7)
#' Combine all values and truncate all values for t' > `max(t)`
#'
#' **Note:**
#' The number of values for t' < `min(t)` depends on the stimulation
#' period `P`. To avoid the production of too many artificial data at the
#' raising tail of the determined pPM curve, it is recommended to use the
#' automatic estimation routine for `P`, i.e. provide no value for
#' `P`.
#'
#' @inheritParams convert_CW2pLMi
#'
#' @return
#' The function returns the same data type as the input data type with
#' the transformed curve values.
#'
#' `RLum.Data.Curve`
#'
#' \tabular{rl}{
#' `$CW2pPMi.x.t` \tab: transformed time values \cr
#' `$CW2pPMi.method` \tab: used method for the production of the new data points
#' }
#'
#' `data.frame`
#'
#' \tabular{rl}{
#' `$x` \tab: time\cr
#' `$y.t` \tab: transformed count values\cr
#' `$x.t` \tab: transformed time values \cr
#' `$method` \tab: used method for the production of the new data points
#' }
#'
#' @note
#' According to Bos & Wallinga (2012), the number of extrapolated points
#' should be limited to avoid artificial intensity data. If `P` is
#' provided manually, not more than two points are extrapolated.
#'
#' @section Function version: 0.2.5
#'
#' @author
#' Sebastian Kreutzer, F2.1 Geophysical Parametrisation/Regionalisation, LIAG - Institute for Applied Geophysics (Germany)\cr
#' Marco Colombo, Institute of Geography, Heidelberg University (Germany)\cr
#' Based on comments and suggestions from:
#' Adrie J.J. Bos, Delft University of Technology, The Netherlands
#'
#' @seealso [Luminescence::convert_CW2pLM], [Luminescence::convert_CW2pLMi], [Luminescence::convert_CW2pHMi],
#' [Luminescence::fit_LMCurve], [Luminescence::RLum.Data.Curve-class]
#'
#' @references
#' Bos, A.J.J. & Wallinga, J., 2012. How to visualize quartz OSL
#' signal components. Radiation Measurements 47, 752-758.
#'
#' **Further Reading**
#'
#' Bulur, E., 1996. An Alternative Technique For
#' Optically Stimulated Luminescence (OSL) Experiment. Radiation Measurements
#' 26, 701-709.
#'
#' Bulur, E., 2000. A simple transformation for converting CW-OSL curves to
#' LM-OSL curves. Radiation Measurements 32, 141-145.
#'
#' @keywords manip
#'
#' @examples
#'
#' ##(1)
#' ##load CW-OSL curve data
#' data(ExampleData.CW_OSL_Curve, envir = environment())
#'
#' ##transform values
#' values.transformed <- convert_CW2pPMi(ExampleData.CW_OSL_Curve)
#'
#' ##plot
#' plot(values.transformed$x,values.transformed$y.t, log = "x")
#'
#' ##(2) - produce Fig. 4 from Bos & Wallinga (2012)
#'
#' ##load data
#' data(ExampleData.CW_OSL_Curve, envir = environment())
#' values <- CW_Curve.BosWallinga2012
#'
#' ##open plot area
#' plot(NA, NA,
#' xlim = c(0.001,10),
#' ylim = c(0,8000),
#' ylab = "pseudo OSL (cts/0.01 s)",
#' xlab = "t [s]",
#' log = "x",
#' main = "Fig. 4 - Bos & Wallinga (2012)")
#'
#' values.t <- convert_CW2pLMi(values, P = 1/20)
#' lines(values[1:length(values.t[, 1]), 1], values.t[, 2],
#' col = "red",lwd = 1.3)
#' text(0.03,4500,"LM", col = "red", cex = .8)
#'
#' values.t <- convert_CW2pHMi(values, delta = 40)
#' lines(values[1:length(values.t[, 1]), 1], values.t[, 2],
#' col = "black", lwd = 1.3)
#' text(0.005,3000,"HM", cex = .8)
#'
#' values.t <- convert_CW2pPMi(values, P = 1/10)
#' lines(values[1:length(values.t[, 1]), 1], values.t[, 2],
#' col = "blue", lwd = 1.3)
#' text(0.5,6500,"PM", col = "blue", cex = .8)
#'
#' @export
convert_CW2pPMi<- function(
object,
P = NULL,
...
) {
.set_function_name("convert_CW2pPMi")
on.exit(.unset_function_name(), add = TRUE)
## deprecated argument
if ("values" %in% ...names()) {
object <- list(...)$values
.deprecated(old = "values", new = "object", since = "1.2.0")
}
## Integrity checks -------------------------------------------------------
temp.values <- .prepare_CW2pX(object)
.validate_positive_scalar(P, null.ok = TRUE)
# (3) Transform values ------------------------------------------------------
##log transformation of the CW-OSL count values
CW_OSL.log<-log(temp.values[,2])
##time transformation t >> t'
t<-temp.values[,1]
##set P
##if no values for P is set selected a P value for a maximum of
##two extrapolation points
if (is.null(P)) {
i<-1
P<-1/i
t.transformed<-(1/3)*(1/P^2)*t^3
while(length(t.transformed[t.transformed<min(t)])>2){
P<-1/i
t.transformed<-(1/3)*(1/P^2)*t^3
i<-i+1
}
}else{
t.transformed<-(1/3)*(1/P^2)*t^3
}
# (4) Interpolation ---------------------------------------------------------
temp <- .interpolate_values(t, CW_OSL.log, t.transformed)
# (5) Extrapolate first values of the curve ---------------------------------
res <- .extrapolate_first(temp, t = t[1:2], y = CW_OSL.log[1:2])
temp <- res$df
temp.method <- res$method
# (6) Convert, transform and combine values ---------------------------------
##unlog CW-OSL count values, i.e. log(CW) >> CW
CW_OSL<-exp(temp$y)
##transform CW-OSL values to pPM-OSL values
pPM<-(t^2/P^2)*CW_OSL
##combine all values and exclude NA values
temp.values <- data.frame(x=t, y.t=pPM, x.t=t.transformed, method=temp.method)
temp.values <- na.exclude(temp.values)
# (7) Return values ---------------------------------------------------------
##returns the same data type as the input
if (is.data.frame(object)) {
return(temp.values)
}
##add old info elements to new info elements
temp.info <- c(object@info,
CW2pPMi.x.t = list(temp.values$x.t),
CW2pPMi.method = list(temp.values$method))
set_RLum(
class = "RLum.Data.Curve",
recordType = object@recordType,
data = as.matrix(temp.values[,1:2]),
info = temp.info)
}
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.