Device device_exposure documented primary

FHIR Device and DeviceUseStatement together map to one OMOP device_exposure row. Device carries identity (type, UDI, manufacturer, lot/serial); DeviceUseStatement records the clinical event (who, when, why). Alternatively, Procedure.usedCode can be a source. The mapper must resolve the two-resource join: DeviceUseStatement.device references a Device resource from which type, UDI, and production identifiers are extracted.

Conversion profile omop-device-device-exposure
A FHIR instance converts to device_exposure iff it validates against this profile.
Path Card Type Binding / Fixed Comment
Device.type 1..*MS omop-device-codesrequired
Device.patient 1..* Reference Required for device_exposure.person_id. May be resolved via DeviceUseStatement.subject when Device.patient is absent.
ViewDefinition (Stage 1 flattener) omop-device-device-exposure
11 columns · resource Device
column name FHIRPath type
id Device.id id
type_snomed Device.type.coding.where(system='http://snomed.info/sct').first().code code
type_text Device.type.text string
subject_id DeviceUseStatement.subject Reference(Patient)
device_exposure_start_date DeviceUseStatement.timing[x] (start) dateTime | Period
device_exposure_start_datetime DeviceUseStatement.timing[x] (start) dateTime | Period
device_exposure_end_date DeviceUseStatement.timing[x] (end) Period
device_exposure_end_datetime DeviceUseStatement.timing[x] (end) Period
unique_device_id Device.udiCarrier[0].deviceIdentifier string
production_id Device.lotNumber string
performer_id DeviceUseStatement.source Reference(Practitioner | PractitionerRole | RelatedPerson)

Fields (19)

Vocabularies

device_type

Source Display Concept ID Concept Name
360046005 Cardiac pacemaker 4141267 Cardiac pacemaker
304120007 Total hip replacement prosthesis 4216669 Total hip replacement prosthesis
303608005 Ophthalmic intraocular lens prosthesis 4230167 Ophthalmic intraocular lens prosthesis
272265001 Bone screw 4109487 Bone screw
14106009 Cardiac defibrillator 4324032 Cardiac defibrillator
(unmapped) No standard concept found 0 No matching concept

device_type_concept

Source Display Concept ID Concept Name
EHR EHR record 32817 EHR
EHR order EHR order list entry 44818707 EHR order list entry
Claim Claim 32810 Claim
Self-reported Patient self-report 32865 Patient self-report

device_vocabulary_systems

Source Display Concept ID Concept Name
http://snomed.info/sct SNOMED CT - SNOMED
https://www.gmdnagency.org GMDN - GMDN
http://hl7.org/fhir/NamingSystem/fda-udi GUDID / UDI - None standard
http://www.cms.gov/Medicare/Coding/ICD10 ICD-10-PCS - ICD10PCS

Edge Cases

Missing Device.type
device_concept_id = 0, device_source_value = null. Log warning. The record is still valid -- OMOP allows concept 0.
timing[x] is dateTime (not Period)
Use the dateTime for device_exposure_start_date. device_exposure_end_date = null (point-in-time exposure).
timing[x] is Timing (repeating)
No natural OMOP representation. Options: (a) use Timing.repeat.boundsPeriod as start/end, (b) create one row per event occurrence, (c) skip and log warning. No implementation handles this case.
timing[x] absent
Fall back to DeviceUseStatement.recordedOn for start date. If that is also absent, the record cannot be created (device_exposure_start_date is NOT NULL). Skip and log.
Multiple Device.udiCarrier[] entries
Take the first entry's deviceIdentifier for unique_device_id. OMOP has a single field; additional UDI carriers are lost.
DeviceUseStatement.status = entered-in-error
Do not create a device_exposure row. ETL-German filters on acceptable status values (completed, active, on-hold).
Device is external (not contained)
Must resolve the Device reference before mapping. If the Device resource is unavailable, log warning and set device_concept_id = 0, unique_device_id = null.
Procedure.usedCode with multiple codings
Create one device_exposure row per coding entry (ETL-German approach). Deduplicate if needed.
device_source_value exceeds 50 chars
OMOP field is varchar(50). Truncate the source value. system:code format from omoponfhir may exceed this limit for long system URIs.
Device.type has multiple codings (e.g., SNOMED + GMDN)
Use the first coding that maps to a standard OMOP concept. Store all codings in device_source_value or pick the primary one. omoponfhir uses getCodingFirstRep().
Implantable device with no end date
device_exposure_end_date = null. This is correct for permanent implants -- the exposure is ongoing.
production_id composition
OMOP v5.4 added this field. Combine Device.lotNumber and/or Device.serialNumber. No standard format. Suggestion: lot:{value} or serial:{value} or concatenated.

Reference Implementations