knitr::opts_chunk$set(echo = TRUE)
LA-ICP-MS FT single-grain age calculation using the 'zeta' approach:
$t = \frac{1}{\lambda}~\ln \left(1+\frac{1}{2} \lambda \zeta_{icp} \frac{N_s}{A_s [ ^{238}U/^xX]} \right)$
single grain uncertainties:
$\frac{s[t]}{t} \approx \sqrt{ \left( \frac{s[\zeta_{icp}]}{\zeta_{icp}} \right) ^2 + \left( \frac{s[^{238}U/^xX]}{[^{238}U/^xX]} \right) ^2 + \frac{1}{N_s} }$
The pooled age is
$\overline{t} = \frac{1}{\lambda}~\ln \left( 1 + \frac{1}{2} \lambda \zeta_{icp} \frac{\sum N_s}{\sum A_s [^{238}U/^{x}X]} \right)$
Session 'zeta' is given by
$\zeta_{icp} = \frac{\left( e^{\lambda t} -1 \right) U }{ \frac{1}{2} \lambda \rho_s}$
and its uncertainties are
$\frac{s[\zeta_{icp}]}{\zeta_{icp}} = \sqrt{ \frac{1}{N_s} + \left( \frac{s[t]}{t}\right)^2 + \left(\frac{s[^{238}U/^{x}X]}{[^{238}U/^{x}X]}\right)^2}$
U
[U content] is given as the ratio between 238U/43Ca based on cps (for apatite) or U/Si (zircon). Therefor, we have to rename the columns.
library(readxl) library(dplyr) library(laftr) # load the U concentrations sample <- read_xlsx("../inst/extdata/example.xlsx", sheet = "sample") |> rename(U = UCa, sU = sUCa) # load the calibration measurements for zeta factor zeta.measurements <- read_xlsx("../inst/extdata/example.xlsx", sheet = "standard") |> rename(U = UCa, sU = sUCa)
zeta_ICP()
by giving the calibration measurements and the used standard:
session.zeta <- zeta_ICP(zeta.measurements, spotsize = 40, mineral = "apatite", standard = "Dur")
It returns a list with the original data:
head(session.zeta$data) |> as_tibble()
... the area, track densities, and the individual zetas:
head(session.zeta$results) |> as_tibble()
... and the final zeta factor (with uncertainty)
session.zeta$zeta |> as_tibble()
age_ICP()
using the just calculated zeta factor for calibration
result <- age_ICP(sample, spotsize = 40, zeta = session.zeta$zeta)
returns a list containing the original dataset:
head(result$data) |> as_tibble()
.. the individual ages:
head(result$ages) |> as_tibble()
... the pooled age of the sample:
result$age.pooled
... and the chi-squared statistics:
result$stats
# library(IsoplotR) data.iso <- as.fissiontracks(sample, spotsize = 40, zeta = session.zeta$zeta) ages.iso <- as.fissiontracks(result$ages, ages = TRUE)
using the functions from the IsoplotR
package (P. Vermeesch):
IsoplotR::kde(ages.iso[, 1])
or the laftr
function geom_aKDE()
using adaptive KDE with ggplot2
:
library(ggplot2) data.frame(t = ages.iso[, 1], st = ages.iso[, 2]) |> ggplot(aes(x = t, weight = t / st)) + geom_aKDE(aes(y = after_stat(scaled)), fill = "#B63679FF") + geom_histogram(aes(y = after_stat(ncount)), color = "white", fill = "grey", alpha = .5) + # weighted histogram geom_rug(color = "grey") + geom_label(x = 60, y = 1, label = paste0("n=", length(na.omit(ages.iso[, 1])), "/", length(ages.iso[, 1])), hjust = 1) + labs(x = "age [Ma]", y = NULL) + theme_classic()
IsoplotR::radialplot(ages.iso)
IsoplotR::central(ages.iso)
IsoplotR::weightedmean(ages.iso, ranked = TRUE)
IsoplotR::peakfit(ages.iso)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.