Patientdatalagen i openEHR-baserade system
Presenteras 2022-05-18, 13:30 i sal F2, på Vitalis 2022
Erik Sundvall
Tekn. Dr. Medicinsk informatik, Civ. ing. IT.
Informationsarkitekt @ Datalager och analys, �Stab Vårdstöd och Teknik, Karolinska Universitetssjukhuset
Affiliated researcher @ HIC, LIME, Karolinska Institutet
Adjunct Senior Lecturer @ IMT, Linköping University
Föreläsningsbeskrivning från vitalisprogrammet
En guidad tur i de delar av journalsystemsstandarden openEHR som är extra intressanta vid tillämning av svenska patientdatalagen (PDL).
Under slutet av 2021 genomfördes första fasen av ett samarbetsprojekt mellan leverantörer och vårdgivare fokuserat på hur openEHR kan tillämpas för att stödja uppfyllnad av patientdatalagen på ett leverantöresneutralt och organisationsöverskridande sätt.
Föredraget orienterar lite allmänt om viktiga relaterade strukturer i openEHR och förklarar många av de designval som nu fomaliserats i en gemensam öppet tillgänglig implementationsguide för PDL i openEHR. Under 2022 fördjupas arbetet med ytterligare aspekter, deltagande i projektet är öppet för alla intresserade.
Snabbrepris från Vitalis 2021
2021 hölls ett helt openEHR-spår, mycket finns fortfarande tillgängligt via
https://discourse.openehr.org/t/openehr-vitalis-2021/1512
Eller sök ”Vitalis” på http://openehr.se (diskussionsforum inkl. länkar till material)
Vitalis openEHR-spår 2021
Intro. Några reprisbilder följer snart
Datauttag, sökfrågor med AQL m.m.
Kolla gärna först
för sammanhang
Svensk förvaltning
Omtolkningsproblem – Var och hur komma överens om vad med vem?
EHR = Electronic Health Record = Elektronisk Patientjournal�
T.ex. openEHR �
T.ex. INERAs nuvarande tjänstekontrakt, �HL7 v2 eller HL7 FHIR
T.ex. openEHR �
Omtolkningsproblem, Typ I
Exempel | System A | System B |
Typ I�A <-- --> B �Lösbart med algoritm (kan automatiseras) | Födelsevikt: 3300g�Datum: 1954-03-13 | Kroppsvikt: 3,3 kg�Tidpunkt: 13 Mar 1954 |
�
Omtolkningsproblem, Typ II
Exempel | System A | System B |
Typ II A --> B�Semantiska förluster och förvrängningar i omtolkningen.�Algoritmiskt�svårlösbart och riskfyllt �(ofta omöjligt)�…men görs ganska ofta manuellt…�…vid varenda överföring/delning… B --> A�Saknad information kan ibland efterfrågas, kompletteras och omtolkas manuellt av medicinskt kunnig person.�Algoritmiskt olösbart! | Opereras senast: 2018-01-30�Preliminär operationstid: 2018-01-20 15:30�Huvuddiagnos*: 323291000119108 | osteoartrit i vänster höftled |�Övriga diagnoser*: �25343008 | sekundär lokaliserad osteoartros i bäckenregion |�299308007 | smärta i höftled vid rörelse | �Åtgärd*: �33788003 | insättning av total protes eller protetisk utrustning i höft med metylmetakrylat |�Operationstyp**: Lubinus SP II med klack �Önskad anestesi*: 18946005 | epiduralanestesi |�NEWS2-score vid inskrivning: 1�Anestesibedömning:�- Kondition: klarar lättare fysisk träning�- Hjärta/kärl: u.a. (u.a. = utan anmärkning)�- Lungor: u.a.�- Svalg: u.a.�- Mag/tarm*: 162030005 | halsbränna med sur eller vattnig uppstötning *) Koder från Snomed CT�**) en särskild typ av höftledsplastik med cement | Operationsdatum: 2018-01-20�Diagnoskod: M167; Annan sekundär koxartros�Operationskod: NFB49; Primär total höftledsplastik med cement�Anestesikod: ZXH50; Epiduralanestesi�ASA-klass: 1 – Frisk patient
|
| | |
�
Omtolkningsproblem , Typ III
Exempel | System A | System B |
Typ III Omöjligt att veta rätt omtolkning om data t.ex. aggregerats (förvanskats) på �olika sätt. | Antal rökta cigaretter per vecka: 6-10�…angivna i ett system med alternativen:�0, 1-5, 6-10, 11-15, 16-30, 31-50, 51-100, 101+ | Antal rökta cigaretter per vecka: ? …angivna i ett system med alternativen: 0, 1-3, 4-7, 8-14, 15-28, 29-69, 70+ |
�
Omtolkningsproblem, Typ I, II & III (nu på samma bild)
Exempel | System A | System B |
Typ I�A <-- --> B �Lösbart med algoritm | Födelsevikt: 3300g�Datum: 1954-03-13 | Kroppsvikt: 3,3 kg�Tidpunkt: 13 Mar 1954 |
Typ II A --> B�Semantiska förluster och förvrängningar i omtolkningen.�Algoritmiskt�svårlösbart och riskfyllt �(ofta omöjligt)�…men görs ganska ofta manuellt B --> A�Saknad information kan ibland efterfrågas, kompletteras och omtolkas manuellt av medicinskt kunnig person.�Algoritmiskt olösbart! | Opereras senast: 2018-01-30�Preliminär operationstid: 2018-01-20 15:30�Huvuddiagnos*: 323291000119108 | osteoartrit i vänster höftled |�Övriga diagnoser*: �25343008 | sekundär lokaliserad osteoartros i bäckenregion |�299308007 | smärta i höftled vid rörelse | �Åtgärd*: �33788003 | insättning av total protes eller protetisk utrustning i höft med metylmetakrylat |�Operationstyp**: Lubinus SP II med klack �Önskad anestesi*: 18946005 | epiduralanestesi |�NEWS2-score vid inskrivning: 1�Anestesibedömning:�- Kondition: klarar lättare fysisk träning�- Hjärta/kärl: u.a. (u.a. = utan anmärkning)�- Lungor: u.a.�- Svalg: u.a.�- Mag/tarm*: 162030005 | halsbränna med sur eller vattnig uppstötning *) Koder från Snomed CT�**) en särskild typ av höftledsplastik med cement | Operationsdatum: 2018-01-20�Diagnoskod: M167; Annan sekundär koxartros�Operationskod: NFB49; Primär total höftledsplastik med cement�Anestesikod: ZXH50; Epiduralanestesi�ASA-klass: 1 – Frisk patient
|
Typ III�Omöjligt att veta rätt omtolkning om data t.ex. aggregerats (förvanskats) på olika sätt. | Antal rökta cigaretter per vecka: 6-10�…angivna i ett system med alternativen:�0, 1-5, 6-10, 11-15, 16-30, 31-50, 51-100, 101+ | Antal rökta cigaretter per vecka: ? …angivna i ett system med alternativen: 0, 1-3, 4-7, 8-14, 15-28, 29-69, 70+ |
�
Omtolkningsproblem – Var och hur komma överens om vad med vem?
Typ I kan �lösas bl.a. här
Typ II & III måste �lösas här �löser även typ I
Typ II & III måste �lösas här �löser även typ I
Gemensam tolkning av hur PDL-stöd representeras via openEHR i systemen
Exempel på medverkan i svenska openEHR-förvaltningens PDL-arbetsgrupp hitills
���(ännu fler leverantörer och vårdgivare är med i generella openEHR-förvaltningen)
Erfarenheter från PDL i VGR via deltagande från Mollyware AB
PDL – Patientdatalagen
This caregiver/region
This Ward/division
Other caregivers/regions
Active choice by staff
Active choice by staff + Patient consent
Region X
Region Y
Emergency Ward
Geriatric ward
Active choice by staff
Consent
Patient chosen block/lock
+ Hälsoärende, vårdepisod
(similar to Contys’ Healthcare matters)
Region X
Region Y
Emergency Ward
Geriatric ward
Active choice by staff
Consent
Patient chosen block/lock
+ Hälsoärende, vårdepisod
(similar to Contys’ Healthcare matters)
Bra exempel på PDL-implementation med flera vårdgivare i ett system
Användbara tolkningar 🡪 rimlig användarupplevelse
Svensk implementationsguide för PDL i openEHR-baserade system
Framtagen genom samarbete mellan flera leverantörer och vårdgivare
PDL-relaterade implementationsguider från SFMIs openEHR-förvaltning (koordinator):
Frågor i AQL är ett exempel på del av lösningsmönster �(t.ex. ”WHERE-clause inject” respektive parametriserade lagrade AQL-frågor)
Testa!
PDL-relaterade delar �& designval i openEHR
…och samtidigt en guidning i:
referensmodell (RM), arketyper, templates (mallar) och frågespråket AQL.
https://openehr.org/
Archetypes (arketyper)�Återanvändbara dokumentationsmönster
Template (mall)�Specifik för ett användningsfall.�Kombinerar och konfigurerar flera arketyper.
Form (formulär/gränssnitt)�Automatiskt genererat från template, sedan manuellt justerat
”Adoptera” de arketyper du vill följa diskussioner för och t.ex. få inbjudan till review för.
Stöder olika språk. Flera arketyper finns redan på svenska.
Ordentlig Sökfunktion
Begränsad namnsökning
Versionshistorik
En ”arketyp”
”Template” (mall) väljer ut & anpassar från arketyper, exempelvis:
= inmatning/datafångst
= ställer in passande default-värde (kan ändras vid behov)�utan pil = fält som inte behövs i just detta exempel/användningsfall, syns då ej i formulär m.m.
Archetypes (arketyper)�Återanvändbara dokumentationsmönster
Template (mall)�Specifik för ett användningsfall.�Kombinerar och konfigurerar flera arketyper.
Form (formulär/gränssnitt)�Automatiskt genererat från template, sedan manuellt justerat
”Cluster”
PDL-organisationer
Se senare bilder…
Denna generella bild från en openEHR-specifikation matchar
inte exakt det specifika akutmalls-exemplet till vänster
Figure 20. High-level Structure of the openEHR EHR
Vårdenhetens namn
Vårdenhetens ID
Vårdenhetens ID
Notera:
Attributet ”id” syns inte i editorn…
…eftersom det brukar sättas i runtime,
inte begränsas/konfigureras i template
Vårdenhetens ID
Vårdenhet
Roll
Vårdgivare…
…id
…namn
…roll
AQL som filter för tillgång & spärr?
Namn | Org nr �(för enskild firma = PNR) | HSA-id | Funktion i exempel |
Stockholms läns sjukvårdsområde | 232100-0016 | SE2321000016-2GJS* | Vårdgivare |
Brandbergens vårdcentral | | SE2321000016-1003 | Vårdenhet (Vårdcenral) |
Distriktssköterskemottagning (vid Brandbergens vårdcentral) | | SE2321000016-14LF | Den mest specifika enheten |
Täby Vårdcentral | | SE2321000016-150H | Vårdenhet (Vårdcenral) |
Beroendecentrum Stockholm | | SE2321000016-15FL | Vårdenhet (spärrexempel) |
Danderyds Sjukhus AB | 556575-6169 | SE2321000016-1K2W* | Vårdgivare |
Ortopedkliniken �(vid Danderyds Sjukhus AB) | | SE2321000016-1K6Q | Vårdenhet� |
Vårdavdelning 14 gynekologi�(vid Danderyds Sjukhus AB) | | SE2321000016-1K54 | Vårdenhet (spärrexempel) |
Annas Medicinska Fotvård EN | 790127-1111 | | Vårdgivare (Enskild firma) |
Annas Medicinska Fotvård | | SE2321000016-DGM2 | “Vårdenhet” |
Exempelmallar (templates) finns i https://github.com/modellbibliotek/Arbetsyta-openEHR/tree/master/local i form av filerna
*) Får gärna anges, men behöver ej anges
Demo i frågeverktyg
Reservbilder - körs sannolikt live på Vitalis om inget strular
Öppen fråga, pulsmätningar över 10 slag/minut utan PDL-koll alls, visar den totala mängden matchande exempel i testdatabasen
SELECT obs/data[at0002]/events[at0003]/data[at0001]/items[at0004]/value/magnitude AS pulse_rate,
cu/items[at0001]/value AS cu_name,
cu/items[at0003]/value AS cu_id,
cu/items[at0004]/value/defining_code/code_string AS cu_role,
cp/items[at0001]/value AS cp_name,
cp/items[at0003]/value AS cp_id,
cp/items[at0004]/value/defining_code/code_string AS cp_role
FROM EHR e
CONTAINS COMPOSITION c[openEHR-EHR-COMPOSITION.encounter.v1]
CONTAINS (
OBSERVATION obs[openEHR-EHR-OBSERVATION.pulse.v2] -- exempel på klinisk data
AND
CLUSTER cu[openEHR-EHR-CLUSTER.organisation.v0] -- Vårdenhet (cu)
CONTAINS CLUSTER cp[openEHR-EHR-CLUSTER.organisation.v0] -- vårdgivare (cp) nästlad som "parent organisation"
)
WHERE pulse_rate > 10 -- exempel på kliniskt villkor för dataurval
AND
(cp_role = "143591000052106" AND cp/items[at0003]/value/id = "232100-0016" ) -- vårdgivarfilter
OFFSET 0 LIMIT 10
Om patienten inte har några spärrar alls så motsvarar detta fall 02, där allt hos vårdgivaren “Stockholms läns sjukvårdsområde“ listas
SELECT obs/data[at0002]/events[at0003]/data[at0001]/items[at0004]/value/magnitude AS pulse_rate,
cu/items[at0001]/value AS cu_name,
cu/items[at0003]/value AS cu_id,
cu/items[at0004]/value/defining_code/code_string AS cu_role,
cp/items[at0001]/value AS cp_name,
cp/items[at0003]/value AS cp_id,
cp/items[at0004]/value/defining_code/code_string AS cp_role
FROM EHR e
CONTAINS COMPOSITION c[openEHR-EHR-COMPOSITION.encounter.v1]
CONTAINS (
OBSERVATION obs[openEHR-EHR-OBSERVATION.pulse.v2] -- exempel på klinisk data
AND
CLUSTER cu[openEHR-EHR-CLUSTER.organisation.v0] -- Vårdenhet (cu)
CONTAINS CLUSTER cp[openEHR-EHR-CLUSTER.organisation.v0] -- vårdgivare (cp) nästlad som "parent organisation"
)
WHERE pulse_rate > 10 -- exempel på kliniskt villkor för dataurval
AND
(cp_role = "143591000052106" AND cp/items[at0003]/value/id = "232100-0016" ) -- vårdgivarfilter
AND
(cu_role = "43741000" AND cu/items[at0003]/value/id = "SE2321000016-1003" ) -- vårdenhetsfilter
OFFSET 0 LIMIT 10
Fall 00: …och om “vårdenhetsfiltret” också läggs till och sätts till “Brandbergens vårdcentral“ så ser “WHERE” delen av frågan ut så här…
SELECT obs/data[at0002]/events[at0003]/data[at0001]/items[at0004]/value/magnitude AS pulse_rate,
cu/items[at0001]/value AS cu_name,
cu/items[at0003]/value AS cu_id,
cu/items[at0004]/value/defining_code/code_string AS cu_role,
cp/items[at0001]/value AS cp_name,
cp/items[at0003]/value AS cp_id,
cp/items[at0004]/value/defining_code/code_string AS cp_role
FROM EHR e
CONTAINS COMPOSITION c[openEHR-EHR-COMPOSITION.encounter.v1]
CONTAINS (
OBSERVATION obs[openEHR-EHR-OBSERVATION.pulse.v2] -- exempel på klinisk data
AND
CLUSTER cu[openEHR-EHR-CLUSTER.organisation.v0] -- Vårdenhet (cu)
CONTAINS CLUSTER cp[openEHR-EHR-CLUSTER.organisation.v0] -- vårdgivare (cp) nästlad som "parent organisation"
)
WHERE pulse_rate > 10 -- exempel på kliniskt villkor för dataurval
AND
(cp_role = "143591000052106" AND cp/items[at0003]/value/id = "232100-0016" ) -- vårdgivarfilter SLSO
AND
(cu_role = "43741000" AND NOT cu/items[at0003]/value/id matches {'SE2321000016-15FL', 'SE2321000016-1K54'} ) -- spärrlista vårdenheter
Om vi söker med på hela vårdgivaren “Stockholms läns sjukvårdsområde“ men en lista med spärrade vårdenheter (beroendekliniken och gyn) också anges så ser “WHERE” delen av frågan ut så här…
Vid sammanhållen journalföring (alltså alla samverkande vårdgivare) och samma spärrlista så ser “WHERE” delen av frågan ut så här…
SELECT obs/data[at0002]/events[at0003]/data[at0001]/items[at0004]/value/magnitude AS pulse_rate,
cu/items[at0001]/value AS cu_name,
cu/items[at0003]/value AS cu_id,
cu/items[at0004]/value/defining_code/code_string AS cu_role,
cp/items[at0001]/value AS cp_name,
cp/items[at0003]/value AS cp_id,
cp/items[at0004]/value/defining_code/code_string AS cp_role
FROM EHR e
CONTAINS COMPOSITION c[openEHR-EHR-COMPOSITION.encounter.v1]
CONTAINS (
OBSERVATION obs[openEHR-EHR-OBSERVATION.pulse.v2] -- exempel på klinisk data
AND
CLUSTER cu[openEHR-EHR-CLUSTER.organisation.v0] -- Vårdenhet (cu = care unit)
CONTAINS CLUSTER cp[openEHR-EHR-CLUSTER.organisation.v0] -- vårdgivare (cp = care provider) nästlad som "parent organisation"
)
WHERE pulse_rate > 10 -- exempel på kliniskt villkor för dataurval
AND
(cu_role = "43741000" AND NOT cu/items[at0003]/value/id matches {'SE2321000016-15FL', 'SE2321000016-1K54'}) -- spärrlista vårdenheter
�
Fortsatt arbete
PDL-relaterade implementationsguider från SFMIs openEHR-förvaltning (koordinator):
Frågor i AQL är ett exempel på del av lösningsmönster �(t.ex. ”WHERE-clause inject” respektive parametriserade lagrade AQL-frågor)
Testa!
Exempel på medverkan i svenska
openEHR-förvaltningens PDL-arbetsgrupp hitills
�
fler än dessa är med i generella openEHR-förvaltningen
Erfarenheter från PDL i VGR via deltagande från Mollyware AB
SFMIs openEHR-utbildning, del 1, 2 & 4 finns på YouTube
4
För utvecklare, integratörer, leverantörer, IT-arkitekter, och andra som vill veta mer om de tekniska förutsättningarna i openEHR
3
För informatiker och terminologer och dem som skapar och underhåller sökordsmallar etc. i vård-IT-system.
�
🡨 Övningar med dator
1
Allmän orientering om openEHR för beslutsfattare, nybörjare inom openEHR, och för den som vill få en samlad bild eller uppdatering av vad som händer inom området.�
#1 är förkunskapskrav inför #2 och #4
2
För kliniker, forskare och andra som behöver välstrukturerad, detaljerad data. Den vänder sig även till informatiker, terminologer och personer som skapar och underhåller sökordsmallar i vård-IT-system.
#2 är förkunskapskrav inför #3
Videoinspelningar och presentationer finns gratis tillgängliga:
https://discourse.openehr.org/t/digital-utbildningsserie-om-openehr-nov-2020-jan-2021/1105
Genväg till svenska delen av openEHRs diskussionsforum:
http://openehr.se
Referenser + mer om openEHR
Fördjupningstips SFMIs openEHR-utbildningar och Vitalis-tema 2021 (video + PPT/PDF)
openEHR-relaterade saker (kvar) på Vitalis 🡪��Tack för att ni lyssnade!��Frågor? Diskussion!��Erik Sundvall, erik.sundvall@regionstockholm.se�
Genväg till svenska delen av openEHRs diskussionsforum:
http://openehr.se