SynthGen builds a synthetic overnight corpus with known ground truth. One virtual subject, five nights, every device recording the same nights on the same floating wall-clock — a single master event timeline rendered into each node’s native file format, so every app loads it unchanged and the Integrator can fuse across them.
You cannot validate a detector against data whose truth you don’t know. SynthGen plants the events — apneas, desaturations, arousals, ectopic beats — then renders them into real file formats, so a node’s output can be scored against exactly what was planted.
tMs, two synthetic devices that “recorded” the same minute land on the same timestamp — so cross-node fusion in the Integrator is exercised on data engineered to align.SynthGen is pure, deterministic JS plus a thin UI. The single source of truth (SYNTH) is reused unchanged by the cohort sampler that generalizes one subject into thousands.
Every output of a night descends from one event timeline, so the files are internally consistent by construction — a desaturation in the oximeter CSV is the same event as the autonomic surge in the RR text.
A seeded config fixes the subject and the night’s severity, event mix, artifact and missingness. The same seed always produces the same night.
One timeline of physiological events — apneas, desats, arousals, beat-to-beat RR — is generated on floating tMs. This is the single source of truth for every device.
The timeline is rendered into each node’s native format: OxyDex 1 Hz CSV, PulseDex RR text, GlucoDex CGM CSV, HRVDex Welltory rows — and in the FULL lane, PPG + ECG waveforms.
Alongside the device files, a ground_truth_nightN.json records what was actually planted — the answer key the test, cohort and regression gates score against.
The same planted night, eight ways — each in the exact format the corresponding node ingests in production.
The O2Ring-format overnight trace. Drives the real oxydex-dsp ODI-4 / T90 / hypoxic-burden detectors.
Beat-to-beat RR intervals from the master timeline — the genuine HRV input, identical beats the other nodes share.
A continuous glucose stream spanning all the subject’s nights, co-generated so glycemia and autonomic state are coherent.
Pre-computed daily HRV summary rows, the format HRVDex ingests.
An optical waveform on one representative window, so the real PPG beat detection + morphology run, not just intervals.
A raw µV ECG rendered from the same RR beats, so Pan–Tompkins and morphology execute on real samples.
The planted-event answer key — what every gate diffs the detectors against.
SynthGen is engineered to be useful, not to be reality. Its own perspective paper names exactly where the synthetic frontier lies.
The corpus is coherent and deterministic, not drawn from real patients. Real-data validation needs user-supplied PSG (NSRR/PhysioNet under DUA) — the synthetic lane is the scalable pre-check.
The default 10k lane emits CSV + RR + CGM + HRV rows only. The 176 Hz PPG and int16 ECG live in the ≤500 FULL lane because the waveform pipelines are the runtime cost.
The shipped ECGDSP couples its RR→PQRST renderer inside genSynthetic; rather than edit shipped DSP (which would trip the gates), cohort-full renders the µV waveform from the same master RR beats.
seed = patient index → byte-reproducible. The same corpus regenerates identically on any machine, which is what makes it a stable answer key for the gates.