Observation measurement implemented primary

Labs and vitals with numeric/coded results. Domain routing based on Observation.category: laboratory and vital-signs route here. Observations with components (e.g. blood pressure) are expanded -- each component produces its own measurement row.

Conversion profile omop-observation-measurement
A FHIR instance converts to measurement iff it validates against this profile.
Routing key Observation.code ∈ omop-measurement-codes (OMOP domain Measurement)
Path Card Type Binding / Fixed Comment
Observation.status fhir/observation-statusrequired OMOP measurement requires a finalized value.
Observation.code 1..*MS omop-measurement-codesrequired
Observation.subject 1..* Reference Required for measurement.person_id.
Observation.effective[x] 1..*MS Required for measurement.measurement_date / measurement_datetime.
Observation.value[x] 1..* Quantity|CodeableConcept|string|boolean|integer Required for measurement.value_as_number / value_as_concept_id / value_source_value.
Observation.valueQuantity.unit
Observation.valueQuantity.system fixed: http://unitsofmeasure.org Units must be UCUM for measurement.unit_concept_id resolution.
ViewDefinition (Stage 1 flattener) omop-observation-measurement
19 columns · resource Observation
column name FHIRPath type
id Observation.id id
code_loinc Observation.code.coding.where(system='http://loinc.org').first().code code
code_snomed Observation.code.coding.where(system='http://snomed.info/sct').first().code code
code_text Observation.code.text string
value_code_snomed Observation.valueCodeableConcept.coding.where(system='http://snomed.info/sct').first().code code
value_code_loinc Observation.valueCodeableConcept.coding.where(system='http://loinc.org').first().code code
value_code_text Observation.valueCodeableConcept.text string
subject_id Observation.subject Reference(Patient)
measurement_date Observation.effectiveDateTime dateTime
measurement_datetime Observation.effectiveDateTime dateTime
operator Observation.valueQuantity.comparator code
value_as_number Observation.valueQuantity.value decimal
unit_text Observation.valueQuantity.unit string
unit Observation.valueQuantity.code code
range_low Observation.referenceRange[0].low.value decimal
range_high Observation.referenceRange[0].high.value decimal
performer_id Observation.performer[0] Reference(Practitioner)
encounter_id Observation.encounter Reference(Encounter)
value_text Observation.valueQuantity string
Condition: category is laboratory or vital-signs (or absent/unknown -- default)
Implementation: src/mapper/observation.ts

Fields (20)

Vocabularies

operator

Source Display Concept ID Concept Name
< Less than 4171756 Less than
<= Less than or equal to 4171754 Less than or equal to
>= Greater than or equal to 4171755 Greater than or equal to
> Greater than 4172703 Greater than
(absent) No operator - No operator

measurement_type

Source Display Concept ID Concept Name
EHR EHR 32817 EHR

vital_signs_loinc

Source Display Concept ID Concept Name
85354-9 Blood pressure panel - Parent panel -- expanded via components
8480-6 Systolic blood pressure 3004249 Systolic blood pressure
8462-4 Diastolic blood pressure 3012888 Diastolic blood pressure
8310-5 Body temperature 3020891 Body temperature
8867-4 Heart rate 3027018 Heart rate
9279-1 Respiratory rate 3024171 Respiratory rate
2708-6 Oxygen saturation in Arterial blood 3016502 Oxygen saturation
29463-7 Body weight 3013762 Body weight
8302-2 Body height 3036277 Body height
39156-5 Body mass index (BMI) 3038553 Body mass index

Edge Cases

Missing effectiveDateTime
Skip -- measurement_date is required.
effectivePeriod instead of dateTime
Use period.start.
valueString (no value_as_string in measurement)
Captured in value_source_value only. omoponfhir attempts to map known strings to concept IDs.
Components (e.g. blood pressure)
Each component produces its own measurement row with suffixed ID. Parent metadata (date, subject, encounter, performer) is inherited.
Status not in {final, amended, corrected}
Skip entire observation.
Missing code.coding
Skip entire observation.
LOINC code not in OMOP vocabulary
measurement_concept_id=0. Code preserved in measurement_source_value.
Multiple referenceRange entries
Only first range used.
valueBoolean, valueInteger, valueRange, valueRatio
Not mapped. Could be coerced to value_as_number or value_source_value.

Reference Implementations