Panoramic-radiograph sibling verification — code, de-identified tables, measurements and results
Abstract
# Panoramic-radiograph sibling verification — code, de-identified tables, measurements and results Deposit accompanying the manuscript *"Can Panoramic Radiographs Verify Sibling Relationships? A Confound-Matched Diagnostic-Accuracy Study with Dizygotic Twins"* (Etli & Kaya; prepared for submission to *Diagnostics*).Authors: Yasin Etli (corresponding author; Department of Forensic Medicine) and Sema Kaya (Department of Oral and Maxillofacial Radiology), Faculty of Medicine / Faculty of Dentistry, Van Yüzüncü Yıl University, Van, Türkiye. > **No radiographs are included.** Panoramic radiographs are personal data and the ethics approval does not cover sharing images. This deposit contains code, pseudonymised> tabular metadata, measurements derived from the radiographs, model outputs and results. See `docs/PRIVACY_AND_ETHICS.md`. ## 1. Study in one paragraph 1,117 panoramic radiographs (OPGs) of 560 sibling pairs (557 families; 174 dizygotic twin pairs, 386 non-twin sibling pairs; age 5–81 y) from the ten-year archive (radiographs taken 2016–2026) of the Faculty of Dentistry, Van Yüzüncü Yıl University.Eleven pair-verification branches (two Siamese CNNs, DINOv2-based, classical image statistics, and tooth-, mandible- and occlusion-based anatomical branches) and three logistic fusion models were evaluated withfive family- and group-disjoint folds against **confound-matched** negative pairs (age, sex composition, acquisition signature).The primary model (FUSION) reached AUC 0.516 (95% CI 0.482–0.551) with Cllr 1.009 — no evidential value — while a secondary exploratory analysis found weak but reproducible familial resemblance of OPG-derived tooth/mandiblephenotypes (held-out ICC 0.269; Gaussian kinship-LR AUC 0.563). Age alone, if not matched, inflates feature-based AUCs by 0.03–0.08. | Result (matched negatives, pooled over 5 test folds) | Value ||---|---|| FUSION (primary), AUC [95% CI] / Cllr / Cllr_min | 0.516 [0.482, 0.551] / 1.009 / 0.996 || FUSION_CNN / FUSION_INTERP, AUC | 0.529 [0.495, 0.562] / 0.509 [0.475, 0.543] || Best single branch (descriptive): CLS and MAND, AUC | 0.536 [0.504, 0.569] and 0.536 [0.503, 0.571] || Age-only baseline, AUC vs age-unmatched / age-matched negatives | 0.778 / 0.443 || Familial dimension, held-out ICC [95% CI] (family-clustered) | 0.269 [0.200, 0.334]; excess over matched unrelated pairs 0.240 [0.143, 0.329] || Gaussian kinship-LR (10 components), AUC [95% CI] / Cllr | 0.563 [0.536, 0.588] / 0.991 | ## 2. Contents ```README.md this fileCITATION.cff, LICENSE, LICENSE_DATA.md, requirements.txt, requirements-pipeline.txt, MANIFEST.csv, SHA256SUMS.txtdocs/ DATA_DICTIONARY.md every table / array / JSON key explained; abbreviations PIPELINE_OVERVIEW.md branches, cross-validation, negatives, calibration; map from results to manuscript tables/figures REPRODUCING.md what can be re-run without radiographs, expected outputs, environment MODEL_CARDS.md tooth detector / tooth segmenter / mandible U-Net (weights are in PART B) and a statement on the CNNs PRIVACY_AND_ETHICS.md approval, pseudonymisation, what was withheld and why, re-use conditions THIRD_PARTY_NOTICES.md datasets, pretrained weights and libraries with licencescode/ analysis code (Colab pipeline, familial analysis, measurement reliability (Suppl. Table S5), strata/triage, figure scripts)data/ dk_images.csv, dk_pairs.csv — pseudonymised metadata (random image/pair/family/group IDs)measurements/ tooth detections (boxes), mandible polygons, classical image features, occlusal-profile (ANAT) featuresresults/ primary/ pooled scores (scores.npz), per-fold score files, summary/per-fold metrics, fusion weights, pre-flight report strata/ stratified/age-reweighted/detectability analysis output; triage + strata JSON familial/ secondary-analysis tables (feature-level ICC, group tests, LR models, agenesis-concordance module, summary.json) manuscript_figures/ Figures 1–5 and Supplementary Tables S1, S6 as used in the manuscript logs/ console logs of the reported runsweights/ README only — the weight files are in PART B (see below)tools/ verification script, open-format converter, PART B builder (Colab)``` ### PART B (companion record)Large and differently-licensed files are packaged separately by `tools/package_part_B.py`: `tooth_det_best.pt`, `tooth_seg_best.pt`, `mandible_unet_best.pt/.json`(weights), `tooth_polygons.json.gz` (per-tooth masks of all radiographs), `mand_features.json.gz`, `person_level_features.csv` (the 70 phenotypes of the familial analysis), a reproduction check, the software environment, andthe output of `code/antimere_signature_reliability.py` (Supplementary Table S5), and optionally DINOv2 embedding caches. Weights trained on DENTEX / Abdi et al. data inherit those datasets' **non-commercial** licences. ### What is deliberately not included* radiographs, cleaned/cropped images, QA overlays (`qa/`), any image-derived pixel data or dense patch-token caches;* the identity key linking image IDs to patients, ledger names, dates of birth/radiography, national ID or registry numbers;* the Siamese-CNN (FULL, ROI) weights: the pipeline keeps the best-epoch weights in memory only and removes the per-seed resume checkpoint after scoring. The scores they produced for every calibration and test pair are in `results/primary/`. DINOv2 weights are public and not redistributed;* the data-cleaning code for the raw archive (it handles identifiable records). ## 3. Quick start ```bashpython3 -m pip install -r requirements.txt # numpy, pandas, scipy, scikit-learn, matplotlibpython3 tools/verify_archive.py # checksums + consistency checks + recomputes AUC/Cllr from the stored scores (exact match expected)python3 code/compute_strata_triage.py # writes results/strata/calc.json (~1 min)python3 code/twin_strata_followup.py # stratified / age-reweighted / detectability tables (prints; matches results/strata/twin_strata_followup_output.txt)python3 code/make_figures_1_to_3.py && python3 code/make_figures_4_to_5.py # regenerate Figures 1–5 into output/figures/```The familial analysis (`code/familial_resemblance_analysis.py`, ~1.5 min on CPU) needs `tooth_polygons.json.gz` and `mand_features.json.gz` from PART B; the complete pipeline (`code/sibling_verification_pipeline.ipynb`) needs the radiographs.Details and expected outputs: `docs/REPRODUCING.md`. ## 4. Naming conventionsSex codes: `M` = male, `F` = female. In `dk_pairs.csv`, `twin` marks a twin pair; **all 174 twin pairs are dizygotic** (168 sex-discordant pairs; six female–female pairs who reported dizygosity).Acquisition signature (`acquisition_signature`): matrix size, frame polarity and annotation-band flags of a radiograph, a proxy for imaging unit/protocol (see `docs/DATA_DICTIONARY.md`).Result files carry a 10-character signature where the code looks caches up by it: `96caed1c54` = hash of the family/fold assignment, `9df952cf18` = hash of the sorted image list; keep these names unchanged when re-using the files. ## 5. LicencesCode: MIT (`LICENSE`). Data tables, measurements, results and documentation: CC BY 4.0 (`LICENSE_DATA.md`). Third-party materials and weights: see `docs/THIRD_PARTY_NOTICES.md` and PART B. ## 6. How to citeSee `CITATION.cff`. Please cite the manuscript and this deposit (DOI shown on the Zenodo record page). ## 7. ContactYasin Etli — yasinetli@yyu.edu.tr.