Files
ThothII/presentation/prototype/slide05-outputs.html
T

206 lines
14 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<!-- PROTOTYPE (throwaway) — Option C "Maturity rail", revised per user feedback:
connector starts from the Marts stage · no live/next badges · uniform stroke
intensity · texts inside boxes capitalized · EN translation same size as Italian.
This is the only variant carried forward; A and B were discarded. -->
<html lang="en">
<head>
<meta charset="utf-8">
<title>PROTOTYPE · Slide “The problem” — outputs rail from the datamarts (option C, revised)</title>
<link rel="stylesheet" href="/deck/fonts.css">
<style>
:root {
--bordeaux: #cb333b; --bordeaux-deep: #8f1204; --bordeaux-tint: #f4dfe1;
--surface: #fdfcfc; --surface-alt: #f6f5f5; --surface-sunken: #ecebeb;
--ink: #2a2426; --ink-muted: #6b6568;
--line: #e3e0e1; --line-strong: #c9c5c6;
--sans: 'Source Sans 3', system-ui, sans-serif;
--display: 'Source Serif 4', Georgia, serif;
--mono: ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
}
* { box-sizing: border-box; }
body { margin: 0; background: #e9e7e7; font-family: var(--sans); padding: 26px 0 90px; }
.proto-head { text-align: center; margin: 0 0 14px; }
.proto-head b { font: 700 12px/1 var(--mono); letter-spacing: .14em; text-transform: uppercase; color: var(--bordeaux); }
.proto-head span { display: block; margin-top: 6px; font: 400 13px/1.4 var(--sans); color: var(--ink-muted); }
/* ---- slide frame (deck-like, 1200×690) ---- */
.frame { width: 1200px; height: 690px; margin: 0 auto; background: var(--surface);
display: flex; flex-direction: column; box-shadow: 0 8px 30px rgba(42,36,38,.18); overflow: hidden; }
.head { flex: 0 0 74px; display: flex; align-items: center; justify-content: space-between;
padding: 0 40px; border-bottom: 1px solid var(--line); }
.head img { height: 54px; display: block; }
.head-org { font: 700 11px/1 var(--sans); letter-spacing: .14em; text-transform: uppercase; color: var(--ink-muted); }
.band { flex: 0 0 42px; display: flex; align-items: center; justify-content: space-between;
padding: 0 40px; background: var(--bordeaux); color: var(--surface); }
.band b { font: 700 12.5px/1 var(--sans); letter-spacing: .14em; text-transform: uppercase; }
.sbody { flex: 1; min-height: 0; display: flex; flex-direction: column;
padding: 20px 48px 14px; text-align: left; }
.foot { flex: 0 0 30px; display: flex; align-items: center; justify-content: space-between; gap: 24px;
padding: 0 40px; border-top: 1px solid var(--line);
font: 600 9.5px/1.4 var(--sans); letter-spacing: .03em; color: var(--ink-muted); }
.kicker { font: 700 11.5px/1 var(--sans); letter-spacing: .16em; text-transform: uppercase; color: var(--bordeaux); margin-bottom: 10px; }
h2 { font: 700 27px/1.15 var(--sans); letter-spacing: -.01em; color: var(--ink); margin: 0 0 10px; }
.quote { position: relative; margin: 0 0 14px; padding: 14px 22px 11px 64px; border: 1px solid var(--line);
background: var(--surface-alt); border-radius: 8px;
font: italic 400 16.5px/1.5 var(--display); color: var(--ink); }
.quote::before { content: '\201C'; position: absolute; left: 18px; top: 6px;
font: 700 44px/1 var(--display); color: var(--bordeaux); }
.tr-grid { display: grid; grid-template-columns: 1.12fr 1fr; gap: 22px; align-items: center; }
.tr-grid .it, .tr-grid .en { margin: 0; }
.tr-grid .en { padding-left: 18px; border-left: 1px solid var(--line-strong);
font: 400 16.5px/1.5 var(--sans); color: var(--bordeaux-deep); }
.en-tag { display: inline-block; margin-right: 7px; padding: 2px 7px; border-radius: 4px;
background: var(--bordeaux); color: #fdfcfc; font: 700 9px/1 var(--sans); letter-spacing: .12em; vertical-align: 3px; }
.pipeline { display: flex; align-items: stretch; gap: 10px; }
.stage { flex: 1; padding: 10px 8px; text-align: center; border: 1px solid var(--line); border-radius: 8px; background: var(--surface-alt); }
.stage b { display: block; font: 700 12.5px/1.2 var(--sans); margin-bottom: 3px; text-transform: uppercase; }
.stage span { display: block; font: 400 10.5px/1.35 var(--sans); color: var(--ink-muted); text-transform: uppercase; letter-spacing: .02em; }
.stage .tag { display: inline-block; margin-top: 4px; padding: 2px 9px; border-radius: 9999px;
background: var(--bordeaux); color: #fdfcfc; font: 700 8.5px/1 var(--sans); letter-spacing: .1em; text-transform: uppercase; }
.stage.ai { background: var(--bordeaux-tint); border-color: var(--bordeaux); }
.arrow { align-self: center; color: var(--line-strong); font: 700 17px/1 var(--sans); }
.stage.hot { background: #fdf1f2; border-color: var(--bordeaux); }
.thoth-wrap { display: flex; justify-content: flex-start; margin-top: 12px; }
.thoth-col { width: 500px; text-align: center; }
.thoth-arrow { color: var(--line-strong); font: 700 15px/1 var(--sans); margin: 1px 0; }
.thoth-box { border: 1px solid var(--bordeaux); border-radius: 8px; padding: 9px 14px;
background: var(--surface-alt); font: 600 11.5px/1.4 var(--sans); text-transform: uppercase; letter-spacing: .02em; }
.thoth-box .tag { display: inline-block; margin-right: 7px; padding: 2px 9px; border-radius: 9999px;
background: var(--bordeaux); color: #fdfcfc; font: 700 8.5px/1 var(--sans); letter-spacing: .1em; text-transform: uppercase; }
/* ---- deep-dive concepts (center-left) ---- */
.midrow { display: flex; gap: 28px; margin-top: 18px; align-items: flex-start; }
.concepts { flex: 1; min-width: 0; }
.concepts .lbl { font: 700 10px/1 var(--mono); letter-spacing: .14em; text-transform: uppercase;
color: var(--bordeaux); margin: 0 0 4px; }
.citem { display: flex; gap: 12px; align-items: baseline; padding: 7px 0; border-bottom: 1px solid var(--line); }
.citem:last-child { border-bottom: none; }
.citem .n { font: 700 11px/1 var(--mono); color: var(--bordeaux); }
.citem b { font: 700 12.5px/1.3 var(--sans); color: var(--ink); text-transform: uppercase; letter-spacing: .03em; }
.citem span.d { font: 400 11px/1.4 var(--sans); color: var(--ink-muted); margin-left: 8px; }
/* ---- outputs rail (option C, revised) ---- */
.railwrap { position: relative; display: flex; justify-content: flex-end; }
.conn-drop { position: absolute; top: -14px; width: 2px; background: var(--bordeaux); }
.conn-elbow { position: absolute; height: 2px; background: var(--bordeaux); }
.rail { width: 540px; border-left: 2px solid var(--bordeaux); padding-top: 14px; }
.rail .lbl { font: 700 10px/1 var(--mono); letter-spacing: .14em; text-transform: uppercase;
color: var(--bordeaux); margin: 0 0 6px 16px; }
.rail .row { display: flex; align-items: center; gap: 12px; padding: 8px 14px 8px 16px; position: relative; }
.rail .row::before { content: ''; position: absolute; left: -2px; top: 50%; width: 14px; height: 2px; background: var(--bordeaux); }
.rail .row .oicon { flex: 0 0 26px; width: 26px; height: 26px; color: var(--bordeaux); display: block; }
.rail .row b { font: 700 13.5px/1.2 var(--sans); color: var(--ink); text-transform: uppercase; letter-spacing: .03em; }
.rail .row span.d { font: 400 11px/1.3 var(--sans); color: var(--ink-muted); }
.caption { max-width: 1200px; margin: 12px auto 0; text-align: center;
font: 400 12.5px/1.5 var(--sans); color: var(--ink-muted); }
.caption b { color: var(--ink); }
</style>
</head>
<body>
<div class="proto-head">
<b>Prototype (revised) — slide “The problem” · outputs rail from the datamarts</b>
<span>Option C only: connector from Marts · no status badges · uniform intensity · capitalized box texts.</span>
</div>
<div class="frame">
<div class="head">
<img src="/deck/logo.png" alt="">
<span class="head-org">AritmoLab · Policlinico San Donato</span>
</div>
<div class="band"><b>The problem</b><span style="font:700 11px/1 var(--sans)">04 · The problem</span></div>
<div class="sbody">
<div class="kicker">From free text to a research platform</div>
<h2>The clinical truth lives in unstructured columns</h2>
<div class="quote">
<div class="tr-grid">
<p class="it">“Il paziente riferisce sincope ricorrente; ECG basale con sopraslivellamento ST in V1–V3; test provocativo con flecainide positivo per pattern Brugada.”</p>
<p class="en"><span class="en-tag">EN</span>“The patient reports recurrent syncope; baseline ECG with ST-segment elevation in V1–V3; flecainide provocation test positive for a Brugada pattern.”</p>
</div>
</div>
<div class="pipeline">
<div class="stage"><b>Sources</b><span>Cardioref · Genetic data<br>Omics Portal · ECG</span></div>
<div class="arrow">→</div>
<div class="stage"><b>Staging</b><span>raw replica</span></div>
<div class="arrow">→</div>
<div class="stage ai"><b>Integration</b><span>3NF · text mining</span><span class="tag">AI</span></div>
<div class="arrow">→</div>
<div class="stage"><b>Data Warehouse</b><span>star schema</span></div>
<div class="arrow">→</div>
<div class="stage hot" id="marts"><b>Marts</b><span>dbt · Superset</span></div>
</div>
<div class="midrow">
<div class="concepts">
<div class="lbl">coming up — how we read the text</div>
<div class="citem"><span class="n">01</span><div><b>Audited numbers</b><span class="d">58,438 letters · 73,389 pathologies · 2,307 Brugada patients</span></div></div>
<div class="citem"><span class="n">02</span><div><b>Hard clinical NLP</b><span class="d">negation · family attribution · two languages</span></div></div>
<div class="citem"><span class="n">03</span><div><b>Clinical ontology</b><span class="d">two tiers, ordered by clinical precedence</span></div></div>
<div class="citem"><span class="n">04</span><div><b>Trust by design</b><span class="d">quality gates on 100 manual reviews</span></div></div>
</div>
<div class="railwrap" id="railwrap">
<div class="conn-drop" id="conn-drop"></div>
<div class="conn-elbow" id="conn-elbow"></div>
<div class="rail" id="rail">
<div class="lbl">outputs of the datamarts</div>
<div class="row">
<svg class="oicon" viewBox="0 0 34 34" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"><path d="M4 29 h26"/><rect x="7" y="17" width="5" height="12" rx="1"/><rect x="15" y="9" width="5" height="20" rx="1"/><rect x="23" y="13" width="5" height="16" rx="1"/></svg>
<b>Dashboards</b><span class="d">clinical review on Superset</span>
</div>
<div class="row">
<svg class="oicon" viewBox="0 0 34 34" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><circle cx="7" cy="7" r="2.6"/><circle cx="7" cy="27" r="2.6"/><circle cx="17" cy="17" r="3.4"/><circle cx="27" cy="7" r="2.6"/><circle cx="27" cy="27" r="2.6"/><path d="M9.3 8.8 L14.6 14.6"/><path d="M9.3 25.2 L14.6 19.4"/><path d="M19.4 14.6 L24.7 8.8"/><path d="M19.4 19.4 L24.7 25.2"/></svg>
<b>Machine Learning</b><span class="d">cohort tables for model training</span>
</div>
<div class="row">
<svg class="oicon" viewBox="0 0 34 34" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"><path d="M3 27 L11 19 L17 22 L23 13"/><path d="M23 13 L30 6" stroke-dasharray="3 3.4"/><circle cx="30" cy="6" r="2.2" fill="currentColor" stroke="none"/><path d="M3 31 h28" opacity=".35"/></svg>
<b>Predictive Statistics</b><span class="d">outcomes &amp; risk analysis</span>
</div>
</div>
</div>
</div>
<div class="thoth-wrap">
<div class="thoth-col">
<div class="thoth-arrow">↑</div>
<div class="thoth-box"><span class="tag">AI</span>ThothII — natural-language → SQL over the DWH, builds the final datamarts</div>
</div>
</div>
</div>
<div class="foot"><span>Role of AI in the Analysis of Unstructured Clinical Databases</span><span>Dr. Marco Pancotti - MultiPhysixLab</span><span>Dr. Sara Paratico - Gruppo San Donato</span><span>San Donato Milanese, Milan, Italy · 2–3 October 2026</span><span>04 / 14</span></div>
</div>
<p class="caption"><b>Option C, revised.</b> The rail drops straight from the Marts stage; the three outputs have equal
visual weight and no status labels; texts inside the diagram boxes are capitalized; the EN translation is now the same size as the Italian.</p>
<script>
// Draw the connector: vertical drop from the center of the Marts stage,
// elbow leftward, into the top of the rail.
function alignConnector() {
const marts = document.getElementById('marts');
const rail = document.getElementById('rail');
const wrap = document.getElementById('railwrap');
const drop = document.getElementById('conn-drop');
const elbow = document.getElementById('conn-elbow');
const mr = marts.getBoundingClientRect();
const rr = rail.getBoundingClientRect();
const wr = wrap.getBoundingClientRect();
const cx = mr.left + mr.width / 2 - wr.left; // Marts center, wrap coords
const railLeft = rr.left - wr.left; // rail border x, wrap coords
const railTop = rr.top - wr.top; // rail top, wrap coords
drop.style.left = (cx - 1) + 'px';
drop.style.top = '-' + (rr.top - mr.bottom + 2) + 'px';
drop.style.height = (rr.top - mr.bottom + 2 + railTop) + 'px';
elbow.style.left = railLeft + 'px';
elbow.style.width = Math.max(0, cx - railLeft) + 'px';
elbow.style.top = (railTop - 1) + 'px';
}
addEventListener('load', alignConnector);
addEventListener('resize', alignConnector);
if (document.fonts && document.fonts.ready) document.fonts.ready.then(alignConnector);
alignConnector();
</script>
</body>
</html>