# Loading libraries and data
library(tidyverse)
library(patchwork)
library(here)
ftir_data <- read_csv(here("05-results/ftir-data_long.csv"))
grind_data <- read_csv(here("05-results/grind-data_cleaned.csv"))
ftir_metadata <- read_tsv(here("01-documentation/ftir-metadata.tsv"))
To determine the mineral composition and crystallisation of the artificial dental calculus samples, we used Fourier Transform Infrared (FTIR) spectroscopy. We compared the spectra of artificial dental calculus with spectra of archaeological dental calculus, as well as splitting factors.
n_samples <- ftir_metadata %>%
filter(source == "Artificial") %>%
group_by(day) %>%
summarise(
n = n(),
weight = mean(weight_mg, na.rm = T)
)
knitr::kable(n_samples, digits = 2, caption = "Summary of FTIR samples used in analysis, including weight in mg.")
day | n | weight |
---|---|---|
7 | 3 | 0.79 |
12 | 4 | 1.01 |
16 | 7 | 2.00 |
20 | 6 | 3.50 |
24 | 8 | 3.87 |
28 model biofilm samples from days 7, 16, 20, and 24, were analysed. Reference samples for comparison included two modern calculus samples and an archaeological calculus sample. The archaeological sample was an isolated tooth from Middenbeemster, a rural Dutch site from the 19th century. Samples F12.1A5, F12.B1, F12.1D1, F12.1D2, F16.1D6, F20.2C5, F20.2D5, F24.2D3 had to be combined to provide enough material for analysis. Only samples collected on the same day were combined with each other (F12.1A5+F12.B1_B, F12.1D1+F12.1D2, F16.1C6+F16.1D6_grind_a, F20.2C5+F20.2D5_grind_a, F24.2C3+F24.2D3_grind_a). Samples from days 7 and 12 did not produce enough material for a grind curve. They were largely composed of organics and proteins, i.e. would not be able to produce a splitting factor, anyway.
grind_data %>%
filter(Sample == "Artificial calculus") %>%
group_by(day) %>%
summarise(
n = n()
) %>%
knitr::kable()
day | n |
---|---|
16 | 16 |
20 | 15 |
24 | 16 |
Samples were ground with KBr and pressed under up to two tons of pressure. Repeated measurements were taken and after different grinding durations, and a grind curve was produced following -@asscherAtomicDisorder2011. Samples were ground and analysed up to six times (a-f) for the grind curve. The analysis was conducted at Haifa University with a Thermo Nicolet is5 spectrometer in transmission, at 4 cm\(^{-1}\) resolution, with an average of 32 scans between wavenumbers 4000 and 400 cm\(^{-1}\). The splitting factor was calculated following -@asscherAtomicDisorder2011, using the full width at half maximum (FWHM) of the main peak at 1035. Grinds a-f represent different levels of grinding. Samples denoted with an ‘a’ were ground for the least amount of time and ‘f’ the most.
grind_sample_order <- c(
"Archaeological calculus",
"Artificial calculus day 16",
"Artificial calculus day 20",
"Artificial calculus day 24",
"Archaeological bone",
"Bone-Dentine",
"Bone-Dentine_2",
"Enamel",
"Enamel_2",
"Enamel_3")
# day 7
ftir_data %>%
filter(
day == 7,
sample != "F7",
sample != "F7.1A6_b"
) %>%
ggplot(aes(x = wavenumber, y = abs, col = sample)) +
geom_line() +
theme_classic() +
scale_x_reverse()
Spectra from all experiment sampling days.
# day 12
ftir_data %>%
filter(
day == 12
#sample != "F7",
#sample != "F7.1A6_b"
) %>%
ggplot(aes(x = wavenumber, y = abs, col = sample)) +
geom_line() +
theme_classic() +
scale_x_reverse()
Spectra from all experiment sampling days.
# day 16
ftir_data %>%
filter(
day == 16,
is.na(grind),
sample != "F16.2D2",
sample != "F16.1D6",
sample != "F16.1B2"
) %>%
ggplot(aes(x = wavenumber, y = abs, col = sample)) +
geom_line() +
theme_classic() +
scale_x_reverse()
Spectra from all experiment sampling days.
# day 24 (final product)
ftir_data %>%
filter(
day == 24,
is.na(grind),
str_detect(sample, "[_]", negate = T),
sample != "F24.1B3",
sample != "F24.2C3",
sample != "F24.2D3",
sample != "F24.2A4",
) %>%
ggplot(aes(x = wavenumber, y = abs, col = sample)) +
geom_line() +
theme_classic() +
scale_x_reverse()
Spectra from all experiment sampling days.
int_plot_7 <- ftir_data %>%
filter(
sample == "F7.1A6"
) %>%
ggplot(aes(x = wavenumber, y = abs, col = sample)) +
geom_line() +
theme_classic() +
scale_x_reverse()
plotly::ggplotly(int_plot_7)
Day 7 spectra have large O–H and amide A absorbance bands in stretching mode around 3400 cm\(^{-1}\), as well as three marked CH3 and CH\(_2\) stretching vibrations at 2960, 2920, and 2850 cm\(^{-1}\). There is a clear amide I peak at 1650 and a less pronounced amide II peak at 1545 cm\(^{-1}\). In the ‘fingerprint’ region, C–O\(_3^{2-}\) at 1400 absorbance band corresponding to the v3 stretching vibrations, P–O4 absorbance band corresponding to the v3 antisymmetric stretching vibrations at 1080 cm\(^{-1}\), and minor phosphate absorption bands around 500 cm\(^{-1}\) in sample F7.1A6, but absent in sample F7.2D1. The absorption bands at 1080 cm\(^{-1}\) could also be a C–N stretching mode from aliphatic amines. The relative absorbance of O–H and Amide I and II bands are higher than the phosphate bands, representing a relatively higher content of lipids and proteins than inorganic content. Large variation between spectra.
ftir_data %>%
filter(
sample == "F12.1D1+F12.1D2"
) %>%
ggplot(aes(x = wavenumber, y = abs, col = sample)) +
geom_line() +
theme_classic() +
scale_x_reverse()
ggplotly()
Day 12, amide I and II continue to be the dominant peaks, and a higher ratio of both amide and O–H to PO4 v3 absorbance bands. Three marked CH3 and CH\(_2\) stretching vibrations at 2960, 2920, and 2850 cm\(^{-1}\). Reduced variation between two of the three spectra.
What is the absorbance band at 1080?? Is it actually Phosphate??
ftir_data %>%
filter(
sample == "F16.2B2"
) %>%
ggplot(aes(x = wavenumber, y = abs, col = sample)) +
geom_line() +
theme_classic() +
scale_x_reverse()
ggplotly()
Day 16, the ratio of O–H and amides to PO4 has shifted, with the main peak shifting to the PO4 v3 absorbance band at 1040 (except in sample F16.1A2). A well-defined PO4 doublet at 600 and 560 is present. Small CO\(_3^{2-}\) stretching vibrations at 870 cm$^{-1}. Decreased variability between the spectra, with most spectra exhibiting a higher phosphate-to-protein/lipid ratio.
ftir_data %>%
filter(
sample == "F24.1D3"
) %>%
ggplot(aes(x = wavenumber, y = abs, col = sample)) +
geom_line() +
theme_classic() +
scale_x_reverse()
ggplotly()
Day 24, large O–H and amide A absorbance bands in stretching mode around 3400 cm\(^{-1}\), as well as three minor CH3 and CH\(_2\) stretching vibrations at 2960, 2920, and 2850 cm\(^{-1}\). Main peak of spectra is PO4 v3 at 1040 cm\(^{-1}\), well-defined PO4 doublet at 600-550 cm\(^{-1}\). Amide I band, with small amide II and III bands. Carbonate peaks also present. Very little variation between all of the spectra.
# day 6: F7.1A6
# day 12: F12.1D1+F12.1D2
# day 16: F16.2B2
# day 24: F24.1D3
ftir_data %>%
filter(
sample == "F7.1A6" |
sample == "F12.1D1+F12.1D2" |
sample == "F16.2B2" |
sample == "F24.1D3"
) %>%
mutate(abs = case_when(sample == "F7.1A6" ~ abs + 1.35,
sample == "F12.1D1+F12.1D2" ~ abs + 0.9,
sample == "F16.2B2" ~ abs + 0.45,
TRUE ~ abs)) %>%
ggplot(aes(x = wavenumber, y = abs, col = sample)) +
geom_line() +
theme_classic() +
scale_x_reverse() +
theme(axis.text.y = element_blank(),
axis.ticks.y = element_blank())
Select samples from all sampling days.
The main difference in the samples across the experiment, with increasing age, is an increase in the main peak at around 1040 cm-1, appearance of the phosphate doublet around 600 and 560 cm-1 between day 12 and 16, an increase in the ratio of the Amide I/II to peaks at around 1650 and 1540 cm-1, and a reduction of the C–H2 and C–H3 stretching vibrations.
High lipid and protein content consistent with the presence of extracellular polysaccharides and bacteria within a matrix. Microbial DNA and RNA may be visible from peaks around 1200–800 cm\(^{-1}\) on days 7 and 12, which are later obscured by the increasing phosphate peak at 1040 cm\(^{-1}\) [@jainIsolationCharacterization2013]. The presence of water indicated by the O–H stretch is also consistent with a biofilm, which is around 90% water [@bergerOralBiofilms2018]. As the samples mature, the ratio of proteins and lipids to phosphates shift from predominance of organic content to inorganic content.
Early spectra, days 7 and 12, are also similar to collagen spectra, with the OH absorbance band at around 3400 cm\(^{-1}\), amide I, II, and III peaks at 1659, 1552, and 1240 cm\(^{-1}\), respectively [@rohanizadehUltrastructuralStudy2005; @martinezcortizasLinkingStructural2020].
ftir_data %>%
filter(
sample == "ArchDC_MB11_grind_c" | str_detect(sample, "modern_ref1")
) %>%
ggplot(aes(x = wavenumber, y = abs, col = sample)) +
geom_line() +
theme_classic() +
scale_x_reverse()
Two spectra from a single sample of archaeological calculus with different grinding levels (c and d).
The archaeological and modern reference spectra are largely indistinguishable and consist of an O–H absorbance band (3400 cm\(^{-1}\)), CH3 bands (3000–2900 cm\(^{-1}\)), carbonate (1420, 1460, 870 cm\(^{-1}\)), amide I band (1650 cm\(^{-1}\)), and phosphates (1040, 604, 566 cm\(^{-1}\)).
ftir_data %>%
filter(
str_detect(sample, "MB11_grind_c") | sample == "F24.1A3" |
sample == "modern_ref1"
) %>%
mutate(abs = case_when(sample == "F24.1A3" ~ abs + 0.45,
TRUE ~ abs)) %>%
ggplot(aes(x = wavenumber, y = abs, col = sample)) +
geom_line() +
theme_classic() +
# scale_x_continuous(
# n.breaks = length(as.character(seq(500, 4000, by = 500)))
# ) +
scale_x_reverse() +
theme(axis.text.y = element_blank(),
axis.ticks.y = element_blank())
Spectra from archaeological calculus, modern reference calculus, and artificial calculus are compared. Absorbance was shifted to allow comparison of the three spectra, so the absorbance should be interpreted as relative, not absolute.
ftir_data %>%
filter(
str_detect(sample, "MB11_grind_c") | sample == "F24.1A3" |
sample == "modern_ref1",
wavenumber < 1800,
) %>%
mutate(abs = case_when(sample == "F24.1A3" ~ abs + 0.45,
TRUE ~ abs)) %>%
ggplot(aes(x = wavenumber, y = abs, col = sample)) +
geom_line() +
theme_classic() +
# scale_x_continuous(
# n.breaks = length(as.character(seq(500, 4000, by = 500)))
# ) +
scale_x_reverse() +
theme(axis.text.y = element_blank(),
axis.ticks.y = element_blank())
Plot of archaeological calculus, modern reference calculus, and artificial calculus, zoomed in on region 1800-400 cm-1.
The biofilm samples from the end of the experiment are similar to both reference samples. The main difference is a lower organic component in reference samples seen as a reduced amide I peak at around 1637 compared to the carbonate peak at around 1420, and an absence of amide II and III. Also a reduction in CH3 bands at 3000-2900 cm\(^{-1}\).
Splitting factors were calculated from the grinding measurements, and a grinding curve was created to explore crystallinity (crystal size) order and disorder. Disorder is a steep slope and large FWHM.
Samples are similar to fresh bone and dentin. No appreciable differences between days 16, 20, and 24.
grind_all_plot <- grind_data %>%
mutate(
Sample_day = factor(Sample_day, levels = grind_sample_order)) %>%
group_by(day, Sample) %>%
ggplot(aes(x = FWHM, y = IRSF, col = Sample_day, shape = Sample_day)) +
geom_point(size = 2, alpha = 0.6) +
geom_smooth(method = "lm", se = F) +
theme_minimal() +
labs(col = "Sample", shape = "Sample",
x = "FWHM of the 1035 peak",
y = "Splitting factor")
# isolate calculus samples to see diffs between days and the 'real deal'
grind_calc_plot <- grind_data %>%
filter(Sample == "Artificial calculus" | Sample == "Archaeological calculus") %>%
ggplot(aes(x = FWHM, y = IRSF, col = Sample_day, shape = Sample_day)) +
geom_point(size = 2, alpha = 0.6) +
geom_smooth(method = "lm", se = F) +
labs(col = "Sample", shape = "Sample",
x = "FWHM of the 1035 peak",
y = "Splitting factor") +
theme_minimal() +
theme(
axis.text = element_blank(),
axis.title = element_blank(),
axis.ticks = element_blank(),
legend.position = "none",
panel.border = element_rect(
colour = "grey",
fill = "transparent", size = 1),
panel.background = element_rect(fill = "white")
) +
scale_colour_viridis_d(end = 0.4)
grind_all_plot + inset_element(grind_calc_plot, left = 0.5, bottom = 0.5, right = 1, top = 1) +
plot_layout(guides = "collect") + plot_annotation(tag_levels = "A")
Experimental samples are indicative of biofilm growth and maturation, including mineralisation, represented by a reduction in proteins and lipids and the increasing intensity of peaks related to hydroxyapatite (1040 and 600-550 cm\(^{-1}\)) and carbonate (1420, 1460, 870 cm\(^{-1}\)) over the course of the experiment.
The presence of collagen in dental calculus (and saliva) is still not clear. It may be a result of external contamination [@mackiePreservationMetaproteome2017] or end-products of collagen degradation (e.g. carboxyterminal telopeptide of type I collagen, ICTP) which may or may not be related to periodontitis [@gursoySalivaryCollagen2013]. It is more likely that the proline-rich proteins (secondary amine) present in the samples are attributed to the biofilm matrix.
The artificial samples from day 24 resemble both the modern reference samples and the archaeological sample in mineral composition and crystallinity. Overall, the spectra of the artificial calculus show an increase in the inorganic component and a decrease in the organic component over time. The grinding curves for days 16, 20, and 24 were very similar, suggesting that the CPMU solution (introduced on day 16) may not have much of an effect.