FHIR to OMOP FHIR IG
1.0.0 - INFORMATIVE 1 International flag

FHIR to OMOP FHIR IG, published by HL7 International / Biomedical Research and Regulation. This guide is not an authorized publication; it is the continuous build for version 1.0.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/HL7/fhir-omop-ig/ and changes regularly. See the Directory of published versions

StructureMap: Mapping Vital Ssigns resource to Measurement OMOP Domain

Official URL: http://hl7.org/fhir/uv/omop/StructureMap/SimpleVitalSignsMap Version: 1.0.0
Standards status: Informative Draft as of 2026-04-02 Maturity Level: 1 Computable Name: SimpleVitalSignsMap

This mapping maps simple FHIR Vital Signs instances that are considered measurements to OMOP Measurement Table objects.

Language: en

/// url = 'http://hl7.org/fhir/uv/omop/StructureMap/SimpleVitalSignsMap'
/// name = 'SimpleVitalSignsMap'
/// title = 'Mapping Vital Ssigns resource to Measurement  OMOP Domain'
/// status = 'draft'

uses "http://hl7.org/fhir/StructureDefinition/vitalsigns" alias VitalSigns as source
uses "http://hl7.org/fhir/uv/omop/StructureDefinition/Measurement" alias MeasureTable as target

group Measures(source src : VitalSigns, target tgt : MeasureTable) {
  src where ('vital-signs').supersetOf(VitalSigns.category.coding.code) then {
    src.code as s -> tgt then {
      s.coding as sc -> tgt then {
        sc.system where ('http://loinc.org') then {
          sc.code as a where ((a in ('85354-9' | '8480-6' | '8462-4' | '8478-0')).not()) -> tgt.measurement_type_concept_id = translate(a, 'http://hl7.org/fhir/uv/omop/ConceptMap/VitalSignsCodes', 'code') then {
            sc.display as display -> tgt.measurement_concept_id = display;
            src.effective : dateTime as edt ->  tgt.measurement_datetime = edt,  tgt.measurement_date = cast(edt, 'date');
            src.effective : Period as s -> tgt then {
              s.start as eps ->  tgt.measurement_datetime = cast(eps, 'dateTime'),  tgt.measurement_date = cast(eps, 'date');
            };
            src.issued as s where (src.issued.toDate != src.effectiveDateTime) -> tgt.measurement_source_value = cast(s, 'string');
            src.value : Quantity as s -> tgt then {
              s.value as a -> tgt.value_as_number = a;
              s.unit as b -> tgt.unit_concept_id = b;
            };
            src.value : CodeableConcept as s -> tgt then {
              s.coding as sc -> tgt then {
                sc.code as code -> tgt.value_as_concept_id = code;
              };
            };
            src.value : string as b -> tgt.value_source_value = b;
            src.interpretation as c -> tgt.value_as_concept_id = c;
            src.note as d -> tgt.measurement_source_value = d;
          };
        };
      };
    };
  } "OnlyMeasures";
}