Epigenetic Clock Calculator
Processes raw IDAT pairs with SeSAMe and computes DNA-methylation aging clocks
from the resulting beta matrix or an existing beta-value file. 25 aging clocks/markers and
12 exposome/health predictors are registered; GrimAge is the headline clock.
35 entries currently support calculation. cvd and depression are temporarily
unavailable because their source scoring procedures are not correctly reconstructed.
Do not report historical outputs from those two entries as valid predictions.
Beta-to-clock data is bundled. Once pandas + numpy are installed, calculation
needs no biolearn, torch, seaborn, scipy, or network. Clock coefficients,
normalization references and the blood imputation panel are vendored under
data/ (~6 MB total). scripts/compute_clocks.py implements biolearn's
GrimageModel, LinearMethylationModel, and the DunedinPACE quantile-
normalization (with a numpy-only rankdata). Source-checked coefficient and
metadata corrections are recorded in references/model-audit.md;
read it when checking coefficients, units, or older results. Agreement with
biolearn alone is not source validation. Masked matrix values are handled per
sample; DunedinPACE uses each sample's observed background plus gold means.
The complete IDAT-to-clock workflow can run offline. IDAT preprocessing
requires R plus sesame and sesameData. Public IDAT references are bundled
(47.3 MiB compressed), matched to sesame 1.24.0 / sesameData 1.24.0 and tested
with R 4.4.3. R/Python environments are not packaged: install software separately
when needed. At installation and startup, check R, Python, their packages and
required system libraries; list every detected
missing or incompatible item, its purpose, version and size (unknown if not yet
known), then ask whether the user permits downloading and installing. Do not install packages,
initialize an online cache, or rebuild references without that consent. If the
machine has no internet, ask the user to transfer compatible standard
installers/packages or missing reference files from another machine.
Sample data stays local and must not enter Git. For IDAT input or offline setup,
read references/idat-sesame.md and use
scripts/preprocess_idat.R. Existing beta files bypass IDAT preprocessing.
The models (run --list-clocks for the live list)
Aging clocks and related markers (25):
| family |
clocks |
unit |
| GrimAge (2nd-gen, mortality) |
grimagev1, grimagev2 |
years (needs age+sex) |
| 1st-gen chronological |
horvath, horvath2, hannum, lin, vidalbralo, weidner |
years |
| 2nd-gen biological age |
phenoage, hrsinchphenoage |
years |
| Ying 2022 (causality) |
yingcausage, yingdamage, yingadaptage |
years |
| stochastic age |
stoch, stocp, stocz (Zhang age-clock CpGs) |
years |
| tissue-specific |
pedbe (pediatric buccal), cortical (brain) |
years |
| 3rd-gen pace of aging |
dunedinpace, dunedinpoam |
years/year |
| other markers |
dnamtl (telomere kb), zhang (mortality), epitoc1 (mitotic) |
varies |
| single-CpG markers |
garagnani (ELOVL2), bocklandt (EDARADD) |
beta [0,1]; not age |
Exposome / lifestyle & health predictors (12) — methylation scores, not aging
clocks (McCartney 2018 / Reed / disease EWAS):
| group |
models |
unit |
| exposome |
smoking, alcohol, bmi, bmi_reed, bodyfat, hdl, ldl, totalchol, education |
score |
| health |
alzheimers; cvd and depression currently unavailable |
score |
Group aliases for --clocks: all (everything), aging (25 clocks/markers), grimage,
core (default), firstgen, secondgen, thirdgen, exposome, health,
phenotypes (exposome+health).
The legacy firstgen alias still includes the two single-CpG markers for
compatibility; report their beta units and do not interpret them as ages.
dunedinpace needs ~20k background CpGs for its quantile normalization (not
just its 173 model CpGs). On a sparse input it self-imputes the missing background
from the gold-standard reference; if its reported coverage is well below ~90% the
result is dominated by the reference and unreliable — say so. A full EPIC/450K
export covers it fine.
Key facts about GrimAge (so you interpret it correctly)
GrimAge is second-generation, mortality-trained: it estimates DNAm surrogates
of 7 plasma proteins + smoking pack-years (V2 adds DNAm A1C & CRP), then combines
them with chronological age and sex in a survival model. Age and sex feed the
formula directly, so both are required for any grimage* clock. The other
clocks don't need them, but passing --age lets the tool report acceleration.
Workflow
1. Identify and inspect the input
For IDATs (a directory, a prefix, paired _Grn.idat / _Red.idat, optionally
gzip, or a sample sheet), follow the SeSAMe workflow.
After checking local dependencies, use --inspect to validate IDAT input and
identify the human methylation array from its address signature; do not infer a
platform from filenames or probe count, or force an unsupported array manifest.
Then check the matching local annotation and run SeSAMe QCDPB to produce beta
values and QC. Inspect qc.csv before imputation or clocks. Preserve masks as
NA; do not replace them with zero or remove a locus from every sample because
it failed in one sample. High sample missingness requires review. MSA has no
recommended design mask in the bundled 1.24.0 resources: retain and report
design_mask_available=FALSE; never claim design-mask QC was completed.
Preprocessing alone does not need age or sex.
For existing beta files, do not rerun IDAT preprocessing.
Auto-detected layouts: Long (two columns: CpG id + beta) or Matrix (first
column CpG id, remaining columns = samples); CSV/TSV and gzip are supported.
Betas are floats in [0,1] or explicit NA/blank. Duplicate CpG IDs are rejected:
resolve array probe replicates in SeSAMe before calculating clocks. Coverage is
the count of observed, unmasked features for each sample and clock.
For beta-only data, retain the platform as unknown unless provenance establishes
it; CpG count cannot prove a chip model.
2. Get age and sex when calculating GrimAge
These are required only for GrimAge. If only an age range is known, use the midpoint and run
--sensitivity so the user sees how much the answer depends on the exact age.
The CLI's age and sex apply to every column in a matrix. For multiple people
with different metadata, run separate sample matrices with each person's known
age/sex; the IDAT sample sheet does not supply these values to the clock script.
3. Check local clock dependencies and references
python3 -c "import pandas, numpy; print('Python dependencies available')"
python3 <skill-dir>/scripts/compute_clocks.py --check-resources --clocks all
--check-resources lists all missing files required by the selected clocks,
including blood_panel.npz for methyLImp, and exits without computing scores.
Report missing resources and ask about downloading or transferring them as
above. Restore missing files before calculation. A complete local setup needs
no network.
4. Impute and compute clocks
python3 <skill-dir>/scripts/compute_clocks.py \
--input "<betas.csv>" --age <years> --sex <m|f> \
--clocks all # or: core (default), grimage, firstgen, secondgen, or specific keys
# --sensitivity 40 42 47 49 # optional, when exact age is uncertain
python3 <skill-dir>/scripts/compute_clocks.py --list-clocks # see all keys
The script imputes absent and sample-specific masked clock CpGs with the bundled
whole-blood panel (with median fallback for CpGs the panel lacks), runs each model, and prints a
table of value, acceleration (for year-unit clocks), and coverage, plus a JSON
line for downstream use.
n_missing counts masked/absent required features, n_imputed counts successful
fills, and n_unresolved counts missing features without a usable reference.
An unresolved model gets status=unavailable and a null JSON value; other models
continue. Source-blocked models (cvd, depression) also return unavailable;
status_reason gives the cause. ok means computation succeeded, not that the
model has been independently or clinically validated. Do not interpret an
unavailable score or call an imputed value measured.
5. Report and interpret
Lead with GrimAge, then the comparison. Always convey these caveats:
- Open-source reimplementation, not the official calculator. Values track
Horvath's official server / Clock Foundation closely but aren't a certified
number. For a citable value, point to the Horvath DNAm Age calculator or a
commercial provider.
- "Acceleration" here = clock − chronological age, a simple difference. The
academic AgeAccel (residual vs. a same-age cohort) needs a population sample
and can't be computed for one person — so +8 means "epigenetic-predicted age
is 8 years above chronological age," not "8 years older than peers."
- Generations differ. 1st-gen (Horvath/Hannum/Lin/…) target chronological age
and tend to land near the true age. 2nd-gen (GrimAge/PhenoAge) target health
outcomes and predict mortality/aging better — they can diverge from true age by
design. Don't read GrimAge as "looks N years old"; it's a risk score in years.
- Non-year outputs (
dunedinpace/dunedinpoam pace, dnamtl telomere
surrogate in kb, zhang mortality score, epitoc1 mean methylation,
garagnani/bocklandt single-CpG beta) are not ages — no acceleration is shown.
StocZ is an age in years, distinct from the Zhang 10-CpG mortality score.
DNAmTL predicts a methylation-derived surrogate, not measured telomere length.
Earlier versions used a negative DNAmTL intercept; those results were
15.849560106 kb too low and must be recomputed with the corrected coefficient.
- Exposome / health predictors are methylation scores, not clinical values.
McCartney models return raw weighted scores, which can be negative and are
not bounded to [0,1]. The six earlier sigmoid transforms were unsupported
and have been removed. Do not convert scores to actual BMI, cholesterol,
education years, pack-years, or disease probabilities. Read
them as relative epigenetic signals, and only where coverage is high — several
(
education, ldl, alzheimers) have low coverage on sparse MSA data.
cvd and depression are unavailable pending model reconstruction, regardless
of coverage. Never present these scores as medical results.
- Coverage / imputation: a few missing clock CpGs filled from a population
median is normal; flag clocks whose coverage drops below ~90%. The output's
n_lowconf column counts imputed CpGs whose blood-reference SD > 0.08 (fills to
distrust) — a per-CpG signal sharper than coverage alone. A clock with many
n_lowconf fills is unreliable on this sample even if it "ran".
- Blood-only design. This skill assumes human WHOLE BLOOD. Clocks are applied
on blood; the imputation reference is blood. Do not use it on other tissues.
- Imputation of missing CpGs — methyLImp by default. Missing clock CpGs (e.g.
EPIC-trained CpGs absent on an MSA/WeGene export) are imputed with methyLImp:
reduced-rank (PCA) regression that predicts each missing CpG from the sample's
observed CpGs using the inter-CpG correlation structure of a whole-blood panel
— more accurate than a flat median (~30% lower RMSE when tissue matches). CpGs
the panel lacks fall back to the blood median;
n_lowconf (blood SD>0.08) flags
unreliable fills. The active mode is printed at run start.
- The panel lives in
data/blood_panel.npz and is bundled (~5 MB; prebuilt
from GSE40279 = 656 whole-blood 450K samples, reduced to the clock CpGs + 50
blood PCs + per-CpG median/SD). So methyLImp is active out of the box — it
cuts imputation RMSE ~10% vs a flat median on a held-out-CpG benchmark. To
rebuild/customize, run scripts/build_blood_panel.py only after permission
to download its public source dataset. If the panel is missing, report the
missing resource and ask about downloading/transferring it before proceeding.
The CLI requires the panel and does not silently switch to global median.
- Reality check: methyLImp mainly improves the heavily-imputed clocks. High-
coverage clocks (GrimAge/Horvath/PhenoAge) impute few CpGs, so their values
move <0.2 yr regardless — the confidence flag is the bigger practical win.
- Not medical advice — research/educational use only.
Notes
- Matrix input → one result row per sample per clock.
- Deliberately excluded (can't be reproduced faithfully without heavier
machinery, or aren't aging clocks):
- PC-clocks (
PCHorvath…), AltumAge, GPAge — need PCA rotation / neural nets.
- Gestational clocks (Knight, Lee, Mayne, Bohlin) — for cord blood / newborns.
If a user specifically needs one of these, tell them it requires the full
biolearn install.
- Provenance. Coefficients are biolearn's (MIT), which reimplements the
published clocks. GrimAge has commercial-use restrictions (UCLA TDG / Clock
Foundation) for cosmetics & life-insurance use.
1---2name: epigenetic-clocks3description: Process human whole-blood methylation array IDAT pairs with SeSAMe (sesame), including QC and beta export for 450K, EPIC, EPICv2 and MSA when supported by the installed package/data. Compute 25 aging clocks/related markers and 12 exposome or health model entries from IDAT-derived or existing CSV/TSV beta matrices. Use for IDAT preprocessing, biological age, GrimAge, Horvath, PhenoAge, DunedinPACE, age acceleration, methylation lifestyle scores, 甲基化芯片、甲基化年龄、 生物年龄、表观遗传时钟 or 暴露组. Missing clock CpGs use a whole-blood imputation panel; interpretation is restricted to human whole blood.4---56# Epigenetic Clock Calculator78Processes raw IDAT pairs with SeSAMe and computes DNA-methylation aging clocks9from the resulting beta matrix or an existing beta-value file. **25 aging clocks/markers** and10**12 exposome/health predictors** are registered; GrimAge is the headline clock.1135 entries currently support calculation. `cvd` and `depression` are temporarily12unavailable because their source scoring procedures are not correctly reconstructed.13Do not report historical outputs from those two entries as valid predictions.1415**Beta-to-clock data is bundled.** Once `pandas` + `numpy` are installed, calculation16needs no biolearn, torch, seaborn, scipy, or network. Clock coefficients,17normalization references and the blood imputation panel are vendored under18`data/` (~6 MB total). `scripts/compute_clocks.py` implements biolearn's19`GrimageModel`, `LinearMethylationModel`, and the DunedinPACE quantile-20normalization (with a numpy-only `rankdata`). Source-checked coefficient and21metadata corrections are recorded in [references/model-audit.md](references/model-audit.md);22read it when checking coefficients, units, or older results. Agreement with23biolearn alone is not source validation. Masked matrix values are handled per24sample; DunedinPACE uses each sample's observed background plus gold means.2526**The complete IDAT-to-clock workflow can run offline.** IDAT preprocessing27requires R plus `sesame` and `sesameData`. Public IDAT references are bundled28(47.3 MiB compressed), matched to `sesame` 1.24.0 / `sesameData` 1.24.0 and tested29with R 4.4.3. R/Python environments are not packaged: install software separately30when needed. At installation and startup, check R, Python, their packages and31required system libraries; list every detected32missing or incompatible item, its purpose, version and size (unknown if not yet33known), then ask whether the user permits downloading and installing. Do not install packages,34initialize an online cache, or rebuild references without that consent. If the35machine has no internet, ask the user to transfer compatible standard36installers/packages or missing reference files from another machine.37Sample data stays local and must not enter Git. For IDAT input or offline setup,38read [references/idat-sesame.md](references/idat-sesame.md) and use39`scripts/preprocess_idat.R`. Existing beta files bypass IDAT preprocessing.4041## The models (run `--list-clocks` for the live list)4243**Aging clocks and related markers (25):**4445| family | clocks | unit |46|---|---|---|47| **GrimAge** (2nd-gen, mortality) | `grimagev1`, `grimagev2` | years *(needs age+sex)* |48| **1st-gen chronological** | `horvath`, `horvath2`, `hannum`, `lin`, `vidalbralo`, `weidner` | years |49| **2nd-gen biological age** | `phenoage`, `hrsinchphenoage` | years |50| **Ying 2022 (causality)** | `yingcausage`, `yingdamage`, `yingadaptage` | years |51| **stochastic age** | `stoch`, `stocp`, `stocz` (Zhang age-clock CpGs) | years |52| **tissue-specific** | `pedbe` (pediatric buccal), `cortical` (brain) | years |53| **3rd-gen pace of aging** | `dunedinpace`, `dunedinpoam` | years/year |54| **other markers** | `dnamtl` (telomere kb), `zhang` (mortality), `epitoc1` (mitotic) | varies |55| **single-CpG markers** | `garagnani` (ELOVL2), `bocklandt` (EDARADD) | beta [0,1]; not age |5657**Exposome / lifestyle & health predictors (12)** — methylation *scores*, not aging58clocks (McCartney 2018 / Reed / disease EWAS):5960| group | models | unit |61|---|---|---|62| **exposome** | `smoking`, `alcohol`, `bmi`, `bmi_reed`, `bodyfat`, `hdl`, `ldl`, `totalchol`, `education` | score |63| **health** | `alzheimers`; `cvd` and `depression` currently unavailable | score |6465Group aliases for `--clocks`: `all` (everything), `aging` (25 clocks/markers), `grimage`,66`core` (default), `firstgen`, `secondgen`, `thirdgen`, `exposome`, `health`,67`phenotypes` (exposome+health).68The legacy `firstgen` alias still includes the two single-CpG markers for69compatibility; report their beta units and do not interpret them as ages.7071**`dunedinpace` needs ~20k background CpGs** for its quantile normalization (not72just its 173 model CpGs). On a sparse input it self-imputes the missing background73from the gold-standard reference; if its reported coverage is well below ~90% the74result is dominated by the reference and unreliable — say so. A full EPIC/450K75export covers it fine.7677## Key facts about GrimAge (so you interpret it correctly)7879GrimAge is **second-generation, mortality-trained**: it estimates DNAm surrogates80of 7 plasma proteins + smoking pack-years (V2 adds DNAm A1C & CRP), then combines81them **with chronological age and sex** in a survival model. Age and sex feed the82formula directly, so **both are required** for any `grimage*` clock. The other83clocks don't need them, but passing `--age` lets the tool report acceleration.8485## Workflow8687### 1. Identify and inspect the input88For IDATs (a directory, a prefix, paired `_Grn.idat` / `_Red.idat`, optionally89gzip, or a sample sheet), follow [the SeSAMe workflow](references/idat-sesame.md).90After checking local dependencies, use `--inspect` to validate IDAT input and91identify the human methylation array from its address signature; do not infer a92platform from filenames or probe count, or force an unsupported array manifest.93Then check the matching local annotation and run SeSAMe QCDPB to produce beta94values and QC. Inspect `qc.csv` before imputation or clocks. Preserve masks as95`NA`; do not replace them with zero or remove a locus from every sample because96it failed in one sample. High sample missingness requires review. MSA has no97recommended design mask in the bundled 1.24.0 resources: retain and report98`design_mask_available=FALSE`; never claim design-mask QC was completed.99Preprocessing alone does not need age or sex.100101For existing beta files, do not rerun IDAT preprocessing.102Auto-detected layouts: **Long** (two columns: CpG id + beta) or **Matrix** (first103column CpG id, remaining columns = samples); CSV/TSV and gzip are supported.104Betas are floats in [0,1] or explicit `NA`/blank. Duplicate CpG IDs are rejected:105resolve array probe replicates in SeSAMe before calculating clocks. Coverage is106the count of observed, unmasked features for each sample and clock.107For beta-only data, retain the platform as unknown unless provenance establishes108it; CpG count cannot prove a chip model.109110### 2. Get age and sex when calculating GrimAge111These are required only for GrimAge. If only an age range is known, use the midpoint and run112`--sensitivity` so the user sees how much the answer depends on the exact age.113The CLI's age and sex apply to every column in a matrix. For multiple people114with different metadata, run separate sample matrices with each person's known115age/sex; the IDAT sample sheet does not supply these values to the clock script.116117### 3. Check local clock dependencies and references118```bash119python3 -c "import pandas, numpy; print('Python dependencies available')"120python3 <skill-dir>/scripts/compute_clocks.py --check-resources --clocks all121```122`--check-resources` lists all missing files required by the selected clocks,123including `blood_panel.npz` for methyLImp, and exits without computing scores.124Report missing resources and ask about downloading or transferring them as125above. Restore missing files before calculation. A complete local setup needs126no network.127128### 4. Impute and compute clocks129```bash130python3 <skill-dir>/scripts/compute_clocks.py \131 --input "<betas.csv>" --age <years> --sex <m|f> \132 --clocks all # or: core (default), grimage, firstgen, secondgen, or specific keys133 # --sensitivity 40 42 47 49 # optional, when exact age is uncertain134python3 <skill-dir>/scripts/compute_clocks.py --list-clocks # see all keys135```136The script imputes absent and sample-specific masked clock CpGs with the bundled137whole-blood panel (with median fallback for CpGs the panel lacks), runs each model, and prints a138table of value, acceleration (for year-unit clocks), and coverage, plus a JSON139line for downstream use.140`n_missing` counts masked/absent required features, `n_imputed` counts successful141fills, and `n_unresolved` counts missing features without a usable reference.142An unresolved model gets `status=unavailable` and a null JSON value; other models143continue. Source-blocked models (`cvd`, `depression`) also return unavailable;144`status_reason` gives the cause. `ok` means computation succeeded, not that the145model has been independently or clinically validated. Do not interpret an146unavailable score or call an imputed value measured.147148### 5. Report and interpret149Lead with GrimAge, then the comparison. Always convey these caveats:150151- **Open-source reimplementation, not the official calculator.** Values track152 Horvath's official server / Clock Foundation closely but aren't a certified153 number. For a citable value, point to the Horvath DNAm Age calculator or a154 commercial provider.155- **"Acceleration" here = clock − chronological age**, a simple difference. The156 academic *AgeAccel* (residual vs. a same-age cohort) needs a population sample157 and **can't be computed for one person** — so +8 means "epigenetic-predicted age158 is 8 years above chronological age," not "8 years older than peers."159- **Generations differ.** 1st-gen (Horvath/Hannum/Lin/…) target chronological age160 and tend to land near the true age. 2nd-gen (GrimAge/PhenoAge) target health161 outcomes and predict mortality/aging better — they can diverge from true age by162 design. Don't read GrimAge as "looks N years old"; it's a risk score in years.163- **Non-year outputs** (`dunedinpace`/`dunedinpoam` pace, `dnamtl` telomere164 surrogate in kb, `zhang` mortality score, `epitoc1` mean methylation,165 `garagnani`/`bocklandt` single-CpG beta) are not ages — no acceleration is shown.166 **StocZ is an age in years**, distinct from the Zhang 10-CpG mortality score.167 DNAmTL predicts a methylation-derived surrogate, not measured telomere length.168 Earlier versions used a negative DNAmTL intercept; those results were169 15.849560106 kb too low and must be recomputed with the corrected coefficient.170- **Exposome / health predictors are methylation *scores*, not clinical values.**171 McCartney models return raw weighted scores, which can be negative and are172 not bounded to [0,1]. The six earlier sigmoid transforms were unsupported173 and have been removed. Do not convert scores to actual BMI, cholesterol,174 education years, pack-years, or disease probabilities. Read175 them as relative epigenetic signals, and only where coverage is high — several176 (`education`, `ldl`, `alzheimers`) have low coverage on sparse MSA data.177 `cvd` and `depression` are unavailable pending model reconstruction, regardless178 of coverage. Never present these scores as medical results.179- **Coverage / imputation**: a few missing clock CpGs filled from a population180 median is normal; flag clocks whose coverage drops below ~90%. The output's181 `n_lowconf` column counts imputed CpGs whose blood-reference SD > 0.08 (fills to182 distrust) — a per-CpG signal sharper than coverage alone. A clock with many183 `n_lowconf` fills is unreliable on this sample even if it "ran".184- **Blood-only design.** This skill assumes human WHOLE BLOOD. Clocks are applied185 on blood; the imputation reference is blood. Do not use it on other tissues.186- **Imputation of missing CpGs — methyLImp by default.** Missing clock CpGs (e.g.187 EPIC-trained CpGs absent on an MSA/WeGene export) are imputed with **methyLImp**:188 reduced-rank (PCA) regression that predicts each missing CpG from the sample's189 *observed* CpGs using the inter-CpG correlation structure of a whole-blood panel190 — more accurate than a flat median (~30% lower RMSE when tissue matches). CpGs191 the panel lacks fall back to the blood median; `n_lowconf` (blood SD>0.08) flags192 unreliable fills. The active mode is printed at run start.193 - The panel lives in `data/blood_panel.npz` and **is bundled** (~5 MB; prebuilt194 from GSE40279 = 656 whole-blood 450K samples, reduced to the clock CpGs + 50195 blood PCs + per-CpG median/SD). So methyLImp is active out of the box — it196 cuts imputation RMSE ~10% vs a flat median on a held-out-CpG benchmark. To197 rebuild/customize, run `scripts/build_blood_panel.py` only after permission198 to download its public source dataset. If the panel is missing, report the199 missing resource and ask about downloading/transferring it before proceeding.200 The CLI requires the panel and does not silently switch to global median.201 - Reality check: methyLImp mainly improves the *heavily-imputed* clocks. High-202 coverage clocks (GrimAge/Horvath/PhenoAge) impute few CpGs, so their values203 move <0.2 yr regardless — the confidence flag is the bigger practical win.204- **Not medical advice** — research/educational use only.205206## Notes207- Matrix input → one result row per sample per clock.208- **Deliberately excluded** (can't be reproduced faithfully without heavier209 machinery, or aren't aging clocks):210 - PC-clocks (`PCHorvath`…), `AltumAge`, `GPAge` — need PCA rotation / neural nets.211 - Gestational clocks (Knight, Lee, Mayne, Bohlin) — for cord blood / newborns.212 If a user specifically needs one of these, tell them it requires the full213 biolearn install.214- **Provenance.** Coefficients are biolearn's (MIT), which reimplements the215 published clocks. GrimAge has commercial-use restrictions (UCLA TDG / Clock216 Foundation) for cosmetics & life-insurance use.