knitr::opts_chunk$set(echo = TRUE)

Basics

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}$

Data import

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 factor of the ICP-session

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 calculation

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

Compatibility with IsoplotR

# library(IsoplotR)
data.iso <- as.fissiontracks(sample, spotsize = 40, zeta = session.zeta$zeta)
ages.iso <- as.fissiontracks(result$ages, ages = TRUE)

KDE

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()

Radial plot

IsoplotR::radialplot(ages.iso)

Central Age

IsoplotR::central(ages.iso)

Weighted mean

IsoplotR::weightedmean(ages.iso, ranked = TRUE)

Peak fitting

IsoplotR::peakfit(ages.iso)


tobiste/laftr documentation built on Feb. 10, 2025, 11:10 p.m.