// ========================================================================= // §9, Data composition + signal-to-noise // ========================================================================= (function initDemo9() { const barsEl = document.getElementById("d9-bars"); const snrEl = document.getElementById("d9-snr"); const tplEl = document.getElementById("d9-templates"); const COMPOSITION = [ { label: "GENERator-v2", pct: 70, color: "#15803d", desc: "annotation-aware functional genomic backbone (eukaryotic, gene-centric)" }, { label: "mRNA", pct: 16, color: "#0369a1", desc: "OpenGenome2 mature transcripts · RNA-level functional context" }, { label: "GTDB", pct: 10, color: "#a16207", desc: "OpenGenome2 prokaryotic genomes · compact bacterial structure" }, { label: "mRNA-splice", pct: 4, color: "#7c3aed", desc: "OpenGenome2 transcript-derived · splice-related signal" }, ]; const TEMPLATES = [ { pct: "50.0%", body: "SEQUENCE", note: "no metadata · default pre-training format" }, { pct: "16.7%", body: "SEQUENCE", note: "both metadata fields" }, { pct: "16.7%", body: "SEQUENCE", note: "species-conditioned only" }, { pct: "16.7%", body: "SEQUENCE", note: "gene-type-conditioned only" }, ]; function renderBars() { // Horizontal bar rows, one per composition entry. Each bar's width // encodes the percentage (1% per CSS pct). Label + percentage sit // inside the bar where there's room; the description sits beneath. barsEl.innerHTML = COMPOSITION.map(s => { const insideLabel = s.pct >= 16; // enough room to put text inside the fill return ` ${insideLabel ? `${s.label}${s.pct}%` : ""} ${insideLabel ? "" : `${s.label}${s.pct}%`} ${s.desc} `; }).join(""); } function renderSNR() { const W = 1000, H = 90; const rowY = [22, 60]; const segH = 18; let svg = ""; // Two rows: raw genome (sparse signal) vs curated (dense signal) // Each row has a sequence of background + functional segments. function paintRow(y, segs, label) { svg += `${label}`; // gutter for the label const padL = 110; let cursor = padL; const rowW = W - padL - 12; for (const seg of segs) { const w = (seg.frac * rowW); svg += ``; cursor += w; } } // Raw: ~5% functional, scattered const rawSegs = [ { frac: 0.18 }, { frac: 0.015, func: true }, { frac: 0.10 }, { frac: 0.02, func: true }, { frac: 0.30 }, { frac: 0.005, func: true }, { frac: 0.05 }, { frac: 0.01, func: true }, { frac: 0.18 }, { frac: 0.005, func: true }, { frac: 0.115 }, ]; paintRow(rowY[0], rawSegs, "RAW (5%)"); // Curated: ~46% functional, denser const curSegs = [ { frac: 0.06 }, { frac: 0.10, func: true }, { frac: 0.04 }, { frac: 0.12, func: true }, { frac: 0.06 }, { frac: 0.08, func: true }, { frac: 0.05 }, { frac: 0.10, func: true }, { frac: 0.04 }, { frac: 0.06, func: true }, { frac: 0.05 }, { frac: 0.10, func: true }, { frac: 0.04 }, ]; paintRow(rowY[1], curSegs, "CURATED (46%)"); snrEl.innerHTML = svg; } function renderTemplates() { let html = ""; for (const t of TEMPLATES) { html += `${t.pct}`; html += `${t.body.replace(//g,">")} ${t.note}`; } tplEl.innerHTML = html; } renderBars(); renderSNR(); renderTemplates(); })();