Curriculum
Module 5·~60 min

Observations & Diagnostics

Vitals, labs, smoking status, BP panel, DiagnosticReport, ServiceRequest.

5.1

Vital Signs — the canonical Observation

Every vital follows the same shape: status, category=vital-signs, a LOINC code, a subject, an effective time, and a value with UCUM units.

Vitals are the easiest Observations to learn because they're tightly profiled in base FHIR (and US Core inherits + tightens).

Required pattern

  • status — usually final
  • category — must include vital-signs
  • code — LOINC. e.g. body weight = 29463-7, height = 8302-2, heart rate = 8867-4.
  • subject — Patient
  • effective[x]effectiveDateTime or effectivePeriod
  • value[x] — usually valueQuantity with system http://unitsofmeasure.org (UCUM)

UCUM units are case-sensitive: kg not Kg, mm[Hg] for blood pressure (with brackets!).

Example · Body weight observation
json
{
  "resourceType": "Observation",
  "id": "weight",
  "meta": {
    "profile": [
      "http://hl7.org/fhir/us/core/StructureDefinition/us-core-vital-signs"
    ]
  },
  "status": "final",
  "category": [
    {
      "coding": [
        {
          "system": "http://terminology.hl7.org/CodeSystem/observation-category",
          "code": "vital-signs"
        }
      ]
    }
  ],
  "code": {
    "coding": [
      {
        "system": "http://loinc.org",
        "code": "29463-7",
        "display": "Body weight"
      }
    ]
  },
  "subject": {
    "reference": "Patient/amy-shaw"
  },
  "effectiveDateTime": "2024-09-12",
  "valueQuantity": {
    "value": 72.5,
    "unit": "kg",
    "system": "http://unitsofmeasure.org",
    "code": "kg"
  }
}
5.2

Blood Pressure — the panel pattern

BP is not one number, it's two. FHIR encodes it as a panel Observation with `component` entries, not as two separate resources.

BP teaches you the component pattern, used everywhere data comes in pairs (BP, vision OD/OS, etc.).

The wrapping Observation has code = LOINC 85354-9 (Blood pressure panel) and no `valueQuantity` of its own. Instead it has two component entries:

  • systolic — LOINC 8480-6, valueQuantity in mm[Hg]
  • diastolic — LOINC 8462-4, valueQuantity in mm[Hg]
Example · Blood pressure panel
json
{
  "resourceType": "Observation",
  "id": "bp",
  "meta": {
    "profile": [
      "http://hl7.org/fhir/us/core/StructureDefinition/us-core-blood-pressure"
    ]
  },
  "status": "final",
  "category": [
    {
      "coding": [
        {
          "system": "http://terminology.hl7.org/CodeSystem/observation-category",
          "code": "vital-signs"
        }
      ]
    }
  ],
  "code": {
    "coding": [
      {
        "system": "http://loinc.org",
        "code": "85354-9",
        "display": "Blood pressure panel"
      }
    ]
  },
  "subject": {
    "reference": "Patient/amy-shaw"
  },
  "effectiveDateTime": "2024-09-12T10:30:00Z",
  "component": [
    {
      "code": {
        "coding": [
          {
            "system": "http://loinc.org",
            "code": "8480-6",
            "display": "Systolic BP"
          }
        ]
      },
      "valueQuantity": {
        "value": 122,
        "unit": "mm[Hg]",
        "system": "http://unitsofmeasure.org",
        "code": "mm[Hg]"
      }
    },
    {
      "code": {
        "coding": [
          {
            "system": "http://loinc.org",
            "code": "8462-4",
            "display": "Diastolic BP"
          }
        ]
      },
      "valueQuantity": {
        "value": 78,
        "unit": "mm[Hg]",
        "system": "http://unitsofmeasure.org",
        "code": "mm[Hg]"
      }
    }
  ]
}
5.3

Lab results — Observation + DiagnosticReport

Labs come in two layers: granular Observations (one per analyte) and a DiagnosticReport that groups them into the report you'd hand a clinician.

us-core-laboratory-result-observation — one Observation per result. category includes laboratory. LOINC code, value, optional reference range, optional interpretation (H, L, N, A).

us-core-diagnosticreport-lab — wraps several Observations into a panel/report. Required status, category (LAB), code, subject, effective[x], issued, performer. Must Support result — array of references to the underlying Observations.

There's a parallel us-core-diagnosticreport-note for clinical notes (radiology reads, pathology reports) where the payload is a presentedForm PDF/HTML attachment.

5.4

Smoking Status, Pregnancy, Social History

These look like Observations but use carefully curated value sets. Smoking Status is the classic example.

us-core-smokingstatus — LOINC code 72166-2 (Tobacco smoking status), valueCodeableConcept from a tight value set (current every-day smoker, former smoker, never smoker, unknown if ever smoked, etc.).

us-core-observation-pregnancystatus and -pregnancyintent were added in 7+ to support reproductive-health workflows.

us-core-observation-screening-assessment wraps standardized instruments (PHQ-9, AUDIT-C, SDOH screeners). Often paired with a QuestionnaireResponse for the granular answers.

5.5

ServiceRequest — orders

ServiceRequest represents an order: 'do this lab', 'do this imaging', 'consult cardiology'. It's the upstream of a future Observation/DiagnosticReport.

Required: status (draft/active/completed…), intent (proposal/plan/order…), code, subject. Must Support authoredOn, requester, occurrence[x], category.

Use basedOn on the resulting Observation/DiagnosticReport to link back to the order. This closes the order→result loop in your data model.

Checkpoint quiz

Answer all questions to check your understanding before moving on.

1. How is a blood pressure reading represented?

2. What is the UCUM code for millimeters of mercury?

3. What is the relationship between a US Core lab Observation and a us-core-diagnosticreport-lab?