
tooth is an R package for dental public health research. It computes standardised caries indices and produces publication-ready odontogram heatmaps from clinical examination data.
An odontogram is a whole-mouth dental chart that arranges every tooth in its anatomical position across the four quadrants. tooth renders each tooth as a five-surface crown diagram with optional root-surface bars, then maps your surface values onto a colour gradient — so caries patterns, treatment outcomes, or any per-tooth-surface metric are visible at a glance across the whole arch.
| Abbreviation | Surface | Description |
|---|---|---|
| B | Buccal | Cheek-facing surface |
| L | Lingual | Tongue-facing surface |
| M | Mesial | Forward-facing interproximal surface |
| D | Distal | Backward-facing interproximal surface |
| O | Occlusal | Biting/chewing surface |
| Abbreviation | Surface | Description |
|---|---|---|
| RB | Root-Buccal | Root surface on the cheek side |
| RL | Root-Lingual | Root surface on the tongue side |
| RM | Root-Mesial | Root surface on the mesial side |
| RD | Root-Distal | Root surface on the distal side |
Dental epidemiological studies routinely compute DMFT/DMFS indices and visualise caries distributions, yet there is no dedicated R package for these tasks. Researchers write ad-hoc scripts with hardcoded ICDAS thresholds and manual ggplot layouts for every new project. tooth replaces those one-off scripts with tested, documented, flexible functions that work across study designs — primary or permanent dentition, 5 to 8 teeth per quadrant, coronal and root caries, long or wide data formats.
RDT, RDS) independently from coronal
indicesmin_val/max_val for consistent colour scales
across multiple plotsshow_labels = FALSE for clean exportstooth_label_size for readabilitystrata_labels
to rename panel headingsfootnote# From GitHub
devtools::install_github("ddmsel/tooth")
# From local tarball
install.packages("tooth_0.5.0.tar.gz", repos = NULL, type = "source")Each tooth is a five-wedge crown (B, L, M, D, O) with optional root bars (RB, RL), labelled by surface and coloured by value.

build_odontogram(
data = decay_data,
teeth_per_quadrant = 7,
surfaces = c("buc", "lin", "mes", "dis", "occ")
)
build_odontogram(
data = decay_data,
surfaces = c("buc", "lin", "mes", "dis", "occ", "rootb", "rootl")
)
stats_df <- data.frame(
treatment = c("SDF", "ART"),
n = c(120, 115),
mean_DT = c(2.3, 2.8),
mean_DMFT = c(5.1, 5.6)
)
build_odontogram(
data = decay_by_trt,
strata = "treatment",
stats = stats_df,
footnote = "B=Buccal, L=Lingual, M=Mesial, D=Distal, O=Occlusal.\n* p<0.05, ** p<0.01, *** p<0.001."
)
build_odontogram(data = decay_data, numbering = "fdi")
build_odontogram(data = decay_data, show_labels = FALSE)
library(tooth)
data(sim_exam)
# Basic DMFT
dmft <- calc_dmft(sim_exam)
# With stratification
dmft <- calc_dmft(sim_exam, strata = "treatment")
# Separate root caries
dmft <- calc_dmft(sim_exam, root_lesion_col = "lesion_code")
# Returns DT (coronal) + RDT (root) separatelybuild_odontogram(
data = decay_data,
value_col = "prop",
teeth_per_quadrant = 7,
title = "Caries Distribution",
surfaces = c("buc", "lin", "mes", "dis", "occ"),
show_labels = TRUE,
tooth_label_size = 3,
numbering = "fdi",
min_val = 0, max_val = 0.5,
strata = "treatment",
strata_labels = c("1" = "SDF", "2" = "ART + FV"),
stats = stats_df,
stats_test = "wilcox",
stats_var = "mean_DMFT",
stats_raw = raw_patient_data,
footnote = paste0(
"B=Buccal, L=Lingual, M=Mesial, D=Distal, O=Occlusal.\n",
"* p<0.05, ** p<0.01, *** p<0.001 (Wilcoxon rank-sum test)."
)
)tooth_convert("11", from = "fdi", to = "quadrant")
#> "ur1"
tooth_convert("ur1", from = "quadrant", to = "fdi")
#> "11"| Function | Description |
|---|---|
build_odontogram() |
Full-arch heatmap with stratification, stats, numbering |
draw_tooth() |
Single tooth polygon geometry (up to 9 surfaces) |
calc_dmft() |
DMFT/dmft with root/coronal separation |
calc_dmfs() |
DMFS/dmfs with root/coronal separation |
pivot_to_long() |
Wide → long format converter |
tooth_config() |
Arch layout configuration |
tooth_convert() |
FDI ↔︎ Universal ↔︎ quadrant numbering |
David Selvaraj, MBA, PhD — author, maintainer Department of Community Dentistry, Case Western Reserve University School of Dental Medicine, Cleveland, OH. dms256@case.edu · ORCID: 0000-0003-4055-9493
Suchitra Nelson, PhD — author Department of Community Dentistry, Case Western Reserve University School of Dental Medicine, Cleveland, OH; and Department of Population and Quantitative Health Sciences, Case Western Reserve University School of Medicine, Cleveland, OH.
If you use tooth in published research, please cite:
Selvaraj D, Nelson S (2026). tooth: Dental Public Health Indices and
Odontogram Visualizations. R package version 0.5.0.
https://github.com/ddmsel/tooth
MIT