FHIR to OMOP FHIR IG
2.0.0-ballot - STU 1 Ballot 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 2.0.0-ballot 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 V4

Official URL: http://hl7.org/fhir/uv/omop/StructureMap/SimpleVitalSignsMapV4 Version: 2.0.0-ballot
Standards status: Trial-use Maturity Level: 2 Computable Name: SimpleVitalSignsMapV4
Other Identifiers: OID:2.16.840.1.113883.4.642.40.80.43.23

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/SimpleVitalSignsMapV4'
/// version = '2.0.0-ballot'
/// name = 'SimpleVitalSignsMapV4'
/// title = 'Mapping Vital Ssigns resource to Measurement OMOP Domain V4'
/// status = 'active'
/// description = 'This mapping maps simple FHIR Vital Signs instances that are considered measurements to OMOP Measurement Table objects.'

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

group VitalSigns(source src : VitalSigns, target tgt : MeasureTable) {
  src where (src.category.coding.code contains 'vital-signs') then {
    src where (src.effective.empty().not()) 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 = cast(display, 'string');
              src.effective : dateTime as edt ->  tgt.measurement_datetime = cast(edt, 'dateTime'),  tgt.measurement_date = (edt.toString().substring(0, 10));
              src.effective : instant as einst ->  tgt.measurement_datetime = cast(einst, 'dateTime'),  (einst.toString().substring(0, 10));
              src.effective : Period as s -> tgt then {
                s.start as eps ->  tgt.measurement_datetime = cast(eps, 'dateTime'),  tgt.measurement_date = (eps.toString().substring(0, 10));
              };
              // src.issued as s where (src.issued.toDate()  != src.effective) -> tgt.measurement_source_value = (s.toString());
              src.value : Quantity as s -> tgt then {
                s.value as a -> tgt.value_as_number = cast(a, 'decimal');
                s.unit as b -> tgt.unit_concept_id = cast(b, 'string');
              };
              src.value : CodeableConcept as s -> tgt then {
                s.coding as sc -> tgt then {
                  sc.code as code -> tgt.value_as_concept_id = cast(code, 'string');
                };
              };
              src.value : string as b -> tgt.value_source_value = cast(b, 'string');
              src.interpretation as c -> tgt.value_as_concept_id = cast(c, 'string');
              src.note as d -> tgt.measurement_source_value = cast(d, 'string');
            };
          };
        };
      };
    } "vitalSignMapping";
  } "OnlyMeasures";
}