openehr terminology and aql

41
Dr Ian McNicoll AQL, Terminology and Integration Copyright 2012 Ocean Informatics

Upload: freshehr-clinical-informatics-ltd

Post on 14-Apr-2017

168 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: openEHR terminology and AQL

Dr Ian McNicoll

AQL, Terminology and Integration

Copyright 2012 Ocean Informatics

Page 2: openEHR terminology and AQL

Model-driven

GUI

Page 3: openEHR terminology and AQL

Model-driven

GUI

Page 4: openEHR terminology and AQL

Model-driven

GUI

Page 5: openEHR terminology and AQL

Model-driven tech

development

Page 6: openEHR terminology and AQL

TDO

Model-driven tech

development

Page 7: openEHR terminology and AQL

TDS

TDO

Model-driven tech

development

Page 8: openEHR terminology and AQL

TDO Examples

How does this translate to Java code?

Page 9: openEHR terminology and AQL

TDSTDS = template data schema - is an xml schema for the corresponding template

Authoring of xml documents based on this schema is possible using standard tools (XMLSpy, Oxygen, etc)

Can also be used for form programming

Page 10: openEHR terminology and AQL

TDD/ Web templatesTDD = template data document - an xml document which conforms to a specific TDS

An openEHR engine can convert TDDs to canonical OpenEHR Compositions or also directly commit a TDD

Web templates are more modern JSON based equivalent

Page 11: openEHR terminology and AQL

SELECT pulse FROM EHR[ehr_id/value=$ehruid] CONTAINS COMPOSITION c

CONTAINS OBSERVATION hr[openEHR-EHR-OBSERVATION.heart_rate_pulse-zn.v1]

WHERE c/name/value='Encounter‘AND c/context/start_time/value <= $endperiodAND c/context/start_time/value >= $startPeriod

AND pulse/data[at0001]/events[at0006|Anyevent]/ data[at0003]/items[at0004|Rate]/value/value < 60

AQL

Model-driven

querying

Page 12: openEHR terminology and AQL

SELECT pulse FROM EHR[ehr_id/value=$ehruid] CONTAINS COMPOSITION c

CONTAINS OBSERVATION hr[openEHR-EHR-OBSERVATION.heart_rate_pulse-zn.v1]

WHERE c/name/value='Encounter‘AND c/context/start_time/value <= $endperiodAND c/context/start_time/value >= $startPeriod

AND pulse/data[at0001]/events[at0006|Anyevent]/ data[at0003]/items[at0004|Rate]/value/value < 60

AQL

Model-driven

querying

Page 13: openEHR terminology and AQL

SELECT pulse FROM EHR[ehr_id/value=$ehruid] CONTAINS COMPOSITION c

CONTAINS OBSERVATION hr[openEHR-EHR-OBSERVATION.heart_rate_pulse-zn.v1]

WHERE c/name/value='Encounter‘AND c/context/start_time/value <= $endperiodAND c/context/start_time/value >= $startPeriod

AND pulse/data[at0001]/events[at0006|Anyevent]/ data[at0003]/items[at0004|Rate]/value/value < 60

AQL

Model-driven

querying

Page 14: openEHR terminology and AQL

Example AQLAll Nursing reports during this admission for patient … with a clinical synopsis record…

SELECT c FROM EHR[ehr_id/value='a4a3f0c8-254a-49a5-97dd-784d50c46b78']

CONTAINS Composition c[openEHR-EHR-COMPOSITION.encounter.v1] CONTAINS Evaluation e[openEHR-EHR- EVALUATION.clinical_synopsis.v1]

WHERE c/name/value matches {'Summary report'} AND c/context/start_time >= '20110328T000000.000+0200' AND c/context/start_time < '30000101T010000.000+0100'

Page 15: openEHR terminology and AQL

Vital signs chartSELECT com0/context/start_time/value as START_DATE, obs1/data[at0001]/events[at0006]/data[at0003]/items[at0004]/value/magnitude as SYSTOLIC, obs1/data[at0001]/events[at0006]/data[at0003]/items[at0005]/value/magnitude as DIASTOLIC, obs3/data[at0002]/events[at0003]/data[at0001]/items[at0004]/value/magnitude as PULSE_RATE, obs4/data[at0001]/events[at0002]/data[at0003]/items[at0004]/value/magnitude as RESPIRATORY_RATE, obs6/data[at0001]/events[at0002]/data[at0003]/items[at0006]/value as SPO2_PROPORTION, obs7/data[at0002]/events[at0003]/data[at0001]/items[at0004]/value as BODY_TEMPERATURE_QUANTITY FROM EHR e[ehr_id/value='a4a3f0c8-254a-49a5-97dd-784d50c46b78'] CONTAINS COMPOSITION com0 [openEHR-EHR-COMPOSITION.encounter.v1] CONTAINS (OBSERVATION obs7 [openEHR-EHR-OBSERVATION.body_temperature-zn.v1] OR OBSERVATION obs3 [openEHR-EHR-OBSERVATION.heart_rate-pulse-zn.v1] OR OBSERVATION obs1 [openEHR-EHR-OBSERVATION.blood_pressure-zn.v1] OR OBSERVATION obs6 [openEHR-EHR-OBSERVATION.indirect_oximetry.v1] OR OBSERVATION obs4 [openEHR-EHR-OBSERVATION.respiration.v1])

WHERE com0/name/value matches {'Vital functions', 'Respiratory assessment'} AND com0/context/start_time >= '20110328T000000.000+0200' AND com0/context/start_time >= '30000101T000000.000+0100'

Page 16: openEHR terminology and AQL

Vital signs chartSELECT com0/context/start_time/value as START_DATE, obs1/data[at0001]/events[at0006]/data[at0003]/items[at0004]/value/magnitude as SYSTOLIC, obs1/data[at0001]/events[at0006]/data[at0003]/items[at0005]/value/magnitude as DIASTOLIC, obs3/data[at0002]/events[at0003]/data[at0001]/items[at0004]/value/magnitude as PULSE_RATE, obs4/data[at0001]/events[at0002]/data[at0003]/items[at0004]/value/magnitude as RESPIRATORY_RATE, obs6/data[at0001]/events[at0002]/data[at0003]/items[at0006]/value as SPO2_PROPORTION, obs7/data[at0002]/events[at0003]/data[at0001]/items[at0004]/value as BODY_TEMPERATURE_QUANTITY FROM EHR e[ehr_id/value='a4a3f0c8-254a-49a5-97dd-784d50c46b78'] CONTAINS COMPOSITION com0 [openEHR-EHR-COMPOSITION.encounter.v1] CONTAINS (OBSERVATION obs7 [openEHR-EHR-OBSERVATION.body_temperature-zn.v1] OR OBSERVATION obs3 [openEHR-EHR-OBSERVATION.heart_rate-pulse-zn.v1] OR OBSERVATION obs1 [openEHR-EHR-OBSERVATION.blood_pressure-zn.v1] OR OBSERVATION obs6 [openEHR-EHR-OBSERVATION.indirect_oximetry.v1] OR OBSERVATION obs4 [openEHR-EHR-OBSERVATION.respiration.v1])

WHERE com0/name/value matches {'Vital functions', 'Respiratory assessment'} AND com0/context/start_time >= '20110328T000000.000+0200' AND com0/context/start_time >= '30000101T000000.000+0100'

Page 17: openEHR terminology and AQL

Result: openEHR data

Page 18: openEHR terminology and AQL

Archetypes and terminologyEach archetype has its own internal terminology “atCodes”

may be mapped to >= 1 external terminologies

The Archetype terminology provides “names” in name/value pairs

on internal valuesets

External terminology may be ‘bound’ to provide values for coded text nodes

Page 19: openEHR terminology and AQL
Page 20: openEHR terminology and AQL
Page 21: openEHR terminology and AQL
Page 22: openEHR terminology and AQL

Terminology binding patternsDirect node-binding

e.g ‘Urine colour’ node

Node name e.g. “Urine colour”

Automatically has unique internal term ‘at0007’

Can be ‘run-time’ coded by external term

Can be ‘run-time’ mapped to an external term

Node value e.g. ‘Red, yellow, purple’

Unique term provided by Internal valueset ‘at0009’

External term mapped to term from Internal valueset

External term used as the value

Page 23: openEHR terminology and AQL

External terminologiesMedications / drug allergies

ICD-10, SNOMED-CT

Lab tests/analytes

Local admin terminologies Organisation types

Sex / gender

Clinical roles

Page 24: openEHR terminology and AQL

Local admin terminologies

Page 25: openEHR terminology and AQL

External terminologies -TermsetsTerminologies can be very large

‘Termsets’ define a small subset of the large terminology that can be handled by a drop-down GUI or other ‘browse’ facility

Sometimes called subsets or refsets

e.g.

RUPROC::“All Orthopaedic procedures”

ICD10::“Gynaecological diagnoses”

Page 26: openEHR terminology and AQL

Termset-binding guidanceGenerally at Template-level

Layered constraint approach All procedures

Orthopaedic procedures

Knee specialist procedures

But generally have to provide option to override the constraint for unusual clinical situations

e.g. Non-orthopaedic procedure carried out in Orthopaedic department.

Page 27: openEHR terminology and AQL

Termset-binding guidance

NHS Common User Interface (CUI)

Layered constraint with ‘termset filters

‘Get-out clause’ where constraint is too tight

Page 28: openEHR terminology and AQL

Problem/diagnosis

Page 29: openEHR terminology and AQL

Problem/diagnosis

Page 30: openEHR terminology and AQL
Page 31: openEHR terminology and AQL

openEHR and integration

In one sense openEHR nothing special!! transforms, transforms, transforms

But -

do it once for the whole openEHR community

Share the transforms

Page 32: openEHR terminology and AQL

Integration targetsDICOM

Back office use mostly but well-established

HL7 v2: devices, labs, radiology, ADT

v3: limited usage

CDA: largely limited to Level 1-2

FHIR: Hype ++ but will move the world onwards!

Page 33: openEHR terminology and AQL

SMARTPlatforms Pluggable Webapp

API

HL7 FHIR Clinical Content

Exchange NHS API

‘inVivo’ Datastore API

Detailed Clinical Content Development

Clinical leadership PRSB

Terminology CentreHSCIC

Non openEHR systems

Archetype+ SNOMED Clinical Content definitions

Page 34: openEHR terminology and AQL

HSPC

Page 35: openEHR terminology and AQL

SMARTPlatforms APIScopes and permissions: OAuth2

Simple sign-in: OpenID Connect

Lightweight UI integration: HTML5 via Pluggable app framework

Page 36: openEHR terminology and AQL

SMARTPlatforms APIScopes and permissions: OAuth2

Simple sign-in: OpenID Connect

Lightweight UI integration: HTML5 via Pluggable app framework

Page 37: openEHR terminology and AQL

HL7 FHIR API

Page 38: openEHR terminology and AQL

What is FHIR good at?Communication of information between systems with limited querying

Strengths

Developer friendly

Lightweight approach

Great documentation / community

Page 39: openEHR terminology and AQL

Where might FHIR be weaker?Not designed for persistence

can work but will it scale?

hard-wired querying only

Resources will not work ‘out of the box’ in the real world

Need local extensions and profiles

Version control / governance of the profiles

Page 40: openEHR terminology and AQL

Endeavour Health

Page 41: openEHR terminology and AQL