England Pathology and Laboratory Medicine (PaLM) Technical Framework
0.1.0 - ci-build
England Pathology and Laboratory Medicine (PaLM) Technical Framework - Local Development build (v0.1.0) built by the FHIR (HL7® FHIR® Standard) Build Tools. See the Directory of published versions
Pathology reports come in two broad kinds. Which kind a report is decides how easily it fits
a FHIR Document. A FHIR Document requires a Composition with human-readable narrative,
so the kind that fits worst is the discrete result (FBC, HbA1c, U&E) - the opposite of what
is often assumed.
| Term used in this guide | Also called | Meaning |
|---|---|---|
| Narrative (interpretive) report | unstructured / semi-structured report, opinion-based or consultative report, document-based report | The result is the opinion of a pathologist or clinical scientist, written as text - often under headings, sometimes as a PDF |
| Discrete (numeric) result | structured / coded result, analytical result, observation-based result, atomic data | The result is a set of values produced by an analyser - a code, a value, units, a reference range and a flag for each test |
| Synoptic report | structured report, dataset report | A narrative report whose key items are recorded as discrete data from a defined dataset (for example the RCPath cancer datasets) |
Where a single word is wanted on each side, this guide uses report for the narrative kind and result for the discrete kind. The NHS and RCPath split between cellular pathology and blood sciences follows the same line roughly, but not exactly: microbiology, genomics and interpretive comments in blood sciences fall on either side.
In messaging the difference shows as:
| Narrative report | Discrete result | |
|---|---|---|
| HL7 v2 | OBX of type FT / TX (often many lines with \.br\), NTE, or ED (an embedded PDF) |
OBX of type NM, CWE / CE, SN, with OBX-6 units, OBX-7 range, OBX-8 flag |
| FHIR | DiagnosticReport.conclusion / presentedForm, Observation.valueString, Composition.section.text |
Observation.valueQuantity / valueCodeableConcept, referenceRange, interpretation |
Usually narrative (text with headings, or PDF):
Usually discrete:
Cellular pathology is out of scope of this guide - see Cancer Pathology Report; genomics is covered by the NW GMSA FHIR IG. They are listed here because the distinction matters for the specialisms that are in scope (see Specialisms), which are mostly discrete with some narrative.
Each diagram shows the FHIR resources, the HL7 v2 segment each one comes from, and the element that links them.
ORU^R01 equivalent) and to FHIR RESTful Resource Access (IPA / QEDm - for
example a shared care record queried for results)For FHIR Messages and Resource Access. A report is one DiagnosticReport (the OBRs sharing OBR-3). Each DiagnosticReport.result
is either a panel - a test group, one OBR with several OBX, as an organizer Observation
whose hasMember are the results - or a single result (an OBR with one OBX).
Panel - for example the full blood count:
flowchart LR
DR["DiagnosticReport<br/>ORU_R01 report<br/>OBR-3, OBR-22, OBR-25"]
P["Observation - panel<br/>test group (organizer)<br/>OBR-4 e.g. FBC"]
R1["Observation - result<br/>OBX e.g. Haemoglobin"]
R2["Observation - result<br/>OBX e.g. White cell count"]
R3["Observation - result<br/>OBX ..."]
DR -- result --> P
P -- hasMember --> R1
P -- hasMember --> R2
P -- hasMember --> R3
Single result - for example HbA1c:
flowchart LR
DR["DiagnosticReport<br/>ORU_R01 report<br/>OBR-3, OBR-22, OBR-25"]
R["Observation - result<br/>OBX e.g. HbA1c<br/>(OBR-4 is the same test)"]
DR -- result --> R
Both patterns can be mixed in one report - for example lipids (a panel) and HbA1c (a single result) from one request:
flowchart LR
DR["DiagnosticReport<br/>OBRs sharing OBR-3"]
P["Observation - panel<br/>OBR 1: Serum lipids"]
R1["Observation - result<br/>OBX Cholesterol"]
R2["Observation - result<br/>OBX HDL cholesterol"]
S["Observation - result<br/>OBR 2 / OBX HbA1c"]
DR -- result --> P
P -- hasMember --> R1
P -- hasMember --> R2
DR -- result --> S
Examples: FBC (panel), HbA1c (single result), LFT and U&E (two panels), Lipids and HbA1c (mixed) - see NHS England Examples.
Rendered report (PDF) - an OBX of type ED (Base64 PDF) or RP (a link) becomes a
DocumentReference and a Binary (the OBX type ED
convention). The DiagnosticReport stays the parent: it lists the DocumentReference among its
results, and the DocumentReference points to the PDF:
flowchart LR
DR["DiagnosticReport<br/>ORU_R01 report"]
DOC["DocumentReference<br/>OBX type ED / RP<br/>OBX-3 document type"]
BIN["Binary<br/>the PDF<br/>OBX-5 ED-5 Base64 data"]
DR -- "result<br/>(R4: media.link)" --> DOC
DOC -- content.attachment.url --> BIN
DiagnosticReport.result can only reference an Observation. The link from
the report to its DocumentReference is therefore made with HL7 Europe's
DiagnosticReport.media.link extension (which references a DocumentReference), with
presentedForm.url giving the PDF directly and DocumentReference.context.related
pointing back to the report.
A rendered report is normally exchanged in one of two ways (see the general rule above):
presentedForm / the DocumentReference)Text report in a FHIR Message or Resource Access - the text is in OBX of type ST / FT (or TX
lines), and becomes a result whose value is the text - for example the unstructured GTT and urine MCS
reports:
flowchart LR
DR["DiagnosticReport<br/>ORU_R01 report"]
R["Observation - result<br/>valueString<br/>OBX type ST / FT<br/>(line breaks become new lines)"]
DR -- result --> R
Text report in a FHIR Document (Document Exchange) - the link is simply Composition to section to narrative.
The OBX of type ST / FT is used to create the section: OBX-3 gives section.code (and
title), and OBX-5 (with \.br\ as line breaks) gives section.text:
flowchart LR
C["Composition<br/>FHIR Document header<br/>Composition.text"]
S["section<br/>section.code from OBX-3"]
N["Narrative<br/>section.text<br/>from OBX-5 (ST / FT)"]
C -- section --> S
S -- text --> N
Examples: GTT and urine MCS (FHIR Messages), and their FHIR Documents (GTT, urine MCS).
A Composition can also carry discrete results. The Composition is the parent: the DiagnosticReport is an entry in a section, and links on to its panels and results as in the FHIR Message. The Observations are also entries in the sections: a section entry can be the panel Observation (usually one section per panel, as in the NHS England examples) or an individual result directly. The section's narrative is generated from those results - see Why Discrete Results Are Harder to Send as a FHIR Document:
flowchart LR
C["Composition<br/>FHIR Document header<br/>Composition.text"]
S["section<br/>section.text = generated<br/>table of results"]
DR["DiagnosticReport<br/>ORU_R01 report"]
P["Observation - panel<br/>OBR-4"]
R1["Observation - result<br/>OBX"]
R2["Observation - result<br/>OBX"]
C -- section --> S
S -- entry --> DR
S -- entry --> P
S -- entry --> R2
DR -- result --> P
P -- hasMember --> R1
P -- hasMember --> R2
Examples: FBC, LFT and U&E and Lipids and HbA1c (FHIR Documents).
A FHIR Document is a Bundle of type document whose first entry is a Composition.
The NHS England Pathology Laboratory Reporting API requires
one, and HL7 Europe Composition-eu-lab (the parent of the
Laboratory Report Composition)
requires at least one section and makes section.text mandatory (1..1). The narrative
is the attested, human-readable content of the document
(Human Readable and Computer Processable).
For a narrative report this fits naturally: the laboratory already wrote the narrative.
Its headings (macroscopic, microscopic, conclusion) become sections, the authorised text
becomes section.text, and what is coded is added alongside it. The document is a wrapper
for content that already exists.
For a discrete result there is usually nothing to put there:
ORU^R01 has no text form of it beyond a few NTE comments. The sender SHALL make one
to meet section.text 1..1OBR), so each test group becomes a section, with the test group
code as section.codeObservations, as it does today from EDIFACT; the narrative adds a second copy
that must be kept in step. The NHS England examples leave section.text as empty
(text.status = empty), which shows the difficultyORU^R01 and FHIR Messages carry discrete
results without a Composition. HL7 Europe DiagnosticReport-eu-lab requires the
DiagnosticReport.composition extension, which is why this guide's
Laboratory Report is derived from EU Core
instead (see Why These Parents)In short, the FHIR Document model suits narrative reports, where a document already exists.
For discrete results it adds an artificial document that has to be generated. For how to
generate the narrative safely from an ORU^R01, see
What it means when transforming ORU^R01.