# Audyt anatomii i EKG — 17 października 2026

**Wynik: brak pozytywnej walidacji klinicznej.** ECG Studio jest działającym narzędziem dydaktycznym. Kontrole geometrii i kodu oraz porównanie z niezależnymi zapisami nie uzasadniają deklaracji idealnej anatomii ani EKG „co do piksela”. Nie wykonano oceny przez niezależnego kardiologa. Domyślnego solvera ani wzmocnień poszczególnych odprowadzeń nie dopasowywano do wyników tego audytu.

## Co sprawdzono

Rozdzielono trzy pytania: zgodność implementacji z jej równaniami, zachowanie geometrii przy edycji i eksportowaniu oraz podobieństwo sygnału do danych pomiarowych. Testy pierwszych dwóch nie są dowodem trzeciego. Weryfikacja sygnału korzysta z zapisów spoza symulatora i detekcji z samych waveformów; nie korzysta z jego wewnętrznych znaczników aktywacji do wyrównania QRS.

## Anatomia i Blender

Domyślny model wywodzi się ze średniego serca Rodero i wsp. Autorzy źródłowego atlasu opisują m.in. narzuconą grubość ścian poza LV i brak uszka LA. Te ograniczenia oraz uproszczona orientacja w tułowiu wykluczają określenie „anatomicznie idealny”. [Artykuł źródłowy, §4.7](https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1008851).

Wagi solvera pochodzą z objętości czworościanów, nie z liczby trójkątów podglądu. Domyślny atlas zawiera 15 943 węzły, 67 596 krawędzi i masy mięśnia LV/RV/LA/RA odpowiednio 135,342 / 52,434 / 22,513 / 21,880 ml. Zdecymowana powierzchnia 48 000 trójkątów zawiera kontakty niemanifoldowe. Nie należy eksportować jej jako sprawdzonej granicy objętości.

Wrześniowa rekonstrukcja przez znak odległości od najbliższej ściany dawała finalnie 136,083 / 76,059 / 25,718 / 26,274 ml. Szczególnie RV było zawyżone o około 45%. Tę ścieżkę odrzucono. Nowy starter Blendera odtwarza granice źródłowych czworościanów bez decymacji. Rozdziela stykające się wachlarze materiału na podstawie sąsiedztwa czworościanów, bez przesuwania wierzchołków. Każda powierzchnia jest zamknięta i spójnie zorientowana, a jej objętość zgadza się ze źródłem w granicach precyzji obliczeń.

Eksporter klasyfikuje wnętrze trzema promieniami. Osiem próbek w komórce daje objętość częściową; centroid poza tkanką zastępuje się najbliższą próbką leżącą w tkance. Nie usunięto automatycznie żadnych odłączonych fragmentów. Starter 2 mm przeszedł eksport, odczyt schematu i symulację ze wszystkimi 38 826 węzłami aktywnymi. Różnice objętości to 0,110 / 0,034 / 0,166 / 0,193%. Przy 2,5 mm również wszystkie 21 086 węzłów są aktywne; największa różnica objętości wynosi 0,745% w RA.

To **nie jest zachowanie identycznej fizjologii po eksporcie**. QRS z aktywacji wynosi 62,15 ms przy 2 mm i 65,91 ms przy 2,5 mm, wobec 104,50 ms w domyślnym grafie atlasu. Nowe krawędzie i przybliżone powierzchniowe włókna/warstwy zmieniają przewodzenie. Dwa rozmiary komórki nie stanowią pełnego badania zbieżności. Własne modele wymagają ponownej oceny. Wyniki: [Blender](audit/blender-checks.json), [silnik po imporcie](audit/blender-engine-checks.json).

## Porównanie z niezależnymi EKG

Źródłem jest [PTB-XL v1.0.3](https://physionet.org/content/ptb-xl/1.0.3/), publiczny zbiór 12-odprowadzeniowych zapisów i oznaczeń, udostępniony na CC BY 4.0. Wybrano pierwszych według numeru 20 różnych dorosłych pacjentów z NORM=100, w wieku 18–65, bez oznaczonego static noise, burst noise i baseline drift. Numery: 3, 7, 10, 14, 19, 21, 24, 29, 31, 33, 35, 42, 43, 44, 46, 53, 55, 57, 61, 62. Wybór był deterministyczny, bez dobierania zapisów do symulatora. To mała próba wygodna, nie populacyjne zakresy normy; oznaczenie NORM nie wyklucza wszystkich innych oznaczeń.

Odczytano WFDB 16, gain i baseline z nagłówków. Próbkowanie: 500 Hz, po 10 s. Detekcja opiera się na wieloodprowadzeniowej energii nachylenia, następnie szczycie wektora napięć. Dla każdego zapisu utworzono medianę beatów; wyrównano czas do wykrytego szczytu. Nie stosowano dopasowania amplitudy, niezależnych wzmocnień odprowadzeń ani rozciągania czasu. Okno amplitudy QRS to ±80 ms. Wspólny punkt wyrównania może przesuwać załamki w pojedynczych odprowadzeniach; nie jest to kliniczny delineator.

| Odprowadzenie | Symulator, peak-to-peak mV | P5–P95 próby, mV | Poza przedziałem próby |
| --- | ---: | ---: | --- |
| I | 1,578 | 0,455–1,176 | tak |
| II | 0,578 | 0,723–1,662 | tak |
| III | 1,223 | 0,265–1,533 | nie |
| aVR | 1,040 | 0,621–1,241 | nie |
| aVL | 1,375 | 0,148–1,078 | tak |
| aVF | 0,528 | 0,353–1,462 | nie |
| V1 | 3,252 | 0,498–1,560 | tak |
| V2 | 2,912 | 1,235–2,394 | tak |
| V3 | 2,508 | 0,859–2,679 | nie |
| V4 | 1,779 | 1,222–2,735 | nie |
| V5 | 1,436 | 0,903–2,245 | nie |
| V6 | 3,352 | 0,716–1,893 | tak |

Sześć z dwunastu odprowadzeń jest poza P5–P95 tej próby. To wykryta rozbieżność i powód dalszych prac, nie diagnoza ani samodzielny formalny test normy. Zgodność innych odprowadzeń z tym przedziałem nie dowodzi prawidłowej morfologii P/QRS/ST/T.

![Porównanie 12 odprowadzeń na jednakowych skalach](audit/normal-comparison.png)

Wykres wykonano w Matplotlib i obejrzano; wszystkie panele mają wspólne skale. Pełne liczby, liczby wykrytych beatów i RMSE względem mediany próby są w [reference-comparison.json](audit/reference-comparison.json). RMSE jest miarą opisową, bez ustalonego progu klinicznej akceptacji. Nie używa się tego zbioru do generowania przebiegu w aplikacji.

## Rejestracja i skurcz

Bieżące elektrody wpływają na nowe próbki przed puszczeniem myszy. Bufor zapisuje 500 Hz i zachowuje ostatnie 120 s; zmiany nie przeliczają poprzednich wartości. Zgodność z niezależną implementacją operatora batch przy stałych elektrodach sprawdzono z tolerancją 2×10⁻⁶ mV. Są też kontrole algebry odprowadzeń, przepełnienia bufora i oczekiwania na pełny QRS po zmianie elektrod przed pomiarem osi.

Aktywacja nadal bazuje na okresowej historii solvera. Zmiany przewodzenia obowiązują po powrocie wyniku obliczeń; nie przenoszą stanu jonowego między konfiguracjami. Rejestracja w czasie symulowanym nie jest bezterminową integracją modelu jonowego. Skurcz 0–12% jest opóźnioną animacją powierzchni, bez sił, ciśnień, bilansu objętości, rzutu czy wpływu mechaniki na EKG.

## Co jest potrzebne do dalszej walidacji

1. Ustalić konkretną anatomię referencyjną, tułów, położenia elektrod i mierzalne cele, wraz z niezależną oceną anatomiczną.
2. Sprawdzić zbieżność siatki i czasu, przewodzenie w cienkich ścianach, warstwy i włókna oraz jawny układ His–Purkinje.
3. Zweryfikować wspólny model przewodnika objętościowego i jednostki, bez osobnego skalowania odprowadzeń.
4. Użyć większego, niezależnego zbioru pomiarów, uprzednio ustalonych kryteriów morfologii i zaślepionej oceny eksperckiej. Oddzielić dane do strojenia od danych do oceny.
5. Dopiero po sprawdzeniu rytmu wyjściowego rozwijać walidację patologii. Dostępne presety pozostają eksperymentalne.

## Odtworzenie audytu

```sh
python scripts/fetch_audit_records.py /path/to/ptb-cache
node scripts/export_audit_simulation.mjs /path/to/ptb-cache/simulated.json
python scripts/audit_reference.py /path/to/ptb-cache
```

Python wymaga NumPy, SciPy i Matplotlib. Skrypt pobierający zapisuje selekcję i sumy SHA-256. Licencje, DOI zbioru i artykułów są w [THIRD_PARTY.md](../THIRD_PARTY.md). Dane surowe zostają w katalogu roboczym. Raport dotyczy domyślnego atlasu i ustawień, nie wszystkich możliwych położeń elektrod ani modeli importowanych.
