BFF to OMOP
BFF to OMOP CDM - Schemas
Information
This table reflects the current bff2omop implementation in convert-pheno.
The conversion maps one Beacon individual into OMOP PERSON and expands
repeated Beacon fields into OMOP row arrays such as CONDITION_OCCURRENCE,
OBSERVATION, PROCEDURE_OCCURRENCE, MEASUREMENT, and DRUG_EXPOSURE.
Version 0.31â
Output model: OMOP CDM
Entity: PERSON, CONDITION_OCCURRENCE, OBSERVATION, PROCEDURE_OCCURRENCE, MEASUREMENT, DRUG_EXPOSURE
Termsâ
PERSONâ
| Source field | Target field | Notes |
|---|---|---|
id | PERSON.person_id | Direct when numeric; otherwise convert-pheno allocates a surrogate integer and preserves the original value in person_source_value |
id | PERSON.person_source_value | Direct |
info.dateOfBirth | PERSON.birth_datetime | Direct |
info.dateOfBirth | PERSON.year_of_birth, month_of_birth, day_of_birth | Extracted from the ISO8601 timestamp |
missing info.dateOfBirth | PERSON.birth_datetime | Defaults to 1900-01-01T00:00:00Z |
missing info.dateOfBirth | PERSON.year_of_birth | Defaults to 1900 |
sex.label | PERSON.gender_concept_id, gender_source_value | Inverse-mapped through the Athena-OHDSI label lookup |
ethnicity.label | PERSON.race_concept_id, race_source_value | Used as the current source for OMOP race_* |
geographicOrigin.label | PERSON.ethnicity_concept_id, ethnicity_source_value | Used as the current source for OMOP ethnicity_* |
missing ethnicity / geographicOrigin | PERSON.race_concept_id, ethnicity_concept_id | Default concept id 0 with empty source values |
CONDITION_OCCURRENCEâ
| Source field | Target field | Notes |
|---|---|---|
diseases[].diseaseCode.label | CONDITION_OCCURRENCE.condition_concept_id, condition_source_value | Inverse-mapped through the Athena-OHDSI label lookup |
diseases[].ageOfOnset.age.iso8601duration + PERSON.year_of_birth | CONDITION_OCCURRENCE.condition_start_date | Converted with get_date_at_age(...) |
missing diseases[].ageOfOnset | CONDITION_OCCURRENCE.condition_start_date | Defaults to 1900-01-01 |
generated by convert-pheno | CONDITION_OCCURRENCE.condition_occurrence_id | Monotonic counter |
| default | CONDITION_OCCURRENCE.condition_type_concept_id | Currently forced to concept id 0 |
diseases[]._visit.occurrence_id | CONDITION_OCCURRENCE.visit_occurrence_id | Direct when numeric; otherwise a surrogate integer is allocated |
diseases[]._visit.detail_id | CONDITION_OCCURRENCE.visit_detail_id | Direct |
| current individual id | CONDITION_OCCURRENCE.person_id | Reuses PERSON.person_id |
OBSERVATION from exposuresâ
| Source field | Target field | Notes |
|---|---|---|
exposures[].exposureCode.label | OBSERVATION.observation_concept_id, observation_source_value | Inverse-mapped through the Athena-OHDSI label lookup |
exposures[].date | OBSERVATION.observation_date | Direct |
exposures[].value | OBSERVATION.value_as_number | Direct |
missing exposures[].value | OBSERVATION.value_as_number | Defaults to -1 |
exposures[].unit.label | OBSERVATION.unit_concept_id, unit_source_value | Inverse-mapped through the Athena-OHDSI label lookup |
generated by convert-pheno | OBSERVATION.observation_id | Monotonic counter |
| default | OBSERVATION.observation_type_concept_id | Currently forced to concept id 0 |
| default | OBSERVATION.value_as_concept_id, value_as_string | Currently emitted as empty strings |
exposures[]._visit.occurrence_id | OBSERVATION.visit_occurrence_id | Direct when numeric; otherwise a surrogate integer is allocated |
exposures[]._visit.detail_id | OBSERVATION.visit_detail_id | Direct |
| current individual id | OBSERVATION.person_id | Reuses PERSON.person_id |
OBSERVATION from phenotypicFeaturesâ
| Source field | Target field | Notes |
|---|---|---|
phenotypicFeatures[].featureType.label | OBSERVATION.observation_concept_id, observation_source_value | Inverse-mapped through the Athena-OHDSI label lookup |
phenotypicFeatures[].onset.iso8601duration + PERSON.year_of_birth | OBSERVATION.observation_date | Converted with get_date_at_age(...) |
missing phenotypicFeatures[].onset | OBSERVATION.observation_date | Defaults to 1900-01-01 |
phenotypicFeatures[].value | OBSERVATION.value_as_number | Direct |
missing phenotypicFeatures[].value | OBSERVATION.value_as_number | Defaults to -1 |
phenotypicFeatures[].unit.label | OBSERVATION.unit_concept_id, unit_source_value | Inverse-mapped through the Athena-OHDSI label lookup |
phenotypicFeatures[].excluded == true | none | Skipped entirely |
generated by convert-pheno | OBSERVATION.observation_id | Monotonic counter, appended to any existing exposure-derived observations |
| default | OBSERVATION.observation_type_concept_id | Currently forced to concept id 0 |
| default | OBSERVATION.value_as_concept_id, value_as_string | Currently emitted as empty strings |
phenotypicFeatures[]._visit.occurrence_id | OBSERVATION.visit_occurrence_id | Direct when numeric; otherwise a surrogate integer is allocated |
phenotypicFeatures[]._visit.detail_id | OBSERVATION.visit_detail_id | Direct |
| current individual id | OBSERVATION.person_id | Reuses PERSON.person_id |
PROCEDURE_OCCURRENCEâ
| Source field | Target field | Notes |
|---|---|---|
interventionsOrProcedures[].procedureCode.label | PROCEDURE_OCCURRENCE.procedure_concept_id, procedure_source_value | Inverse-mapped through the Athena-OHDSI label lookup |
interventionsOrProcedures[].dateOfProcedure | PROCEDURE_OCCURRENCE.procedure_date | Direct |
interventionsOrProcedures[].dateOfProcedure | PROCEDURE_OCCURRENCE.procedure_datetime | Converted to YYYY-MM-DDTHH:MM:SSZ |
missing interventionsOrProcedures[].dateOfProcedure | PROCEDURE_OCCURRENCE.procedure_date, procedure_datetime | Defaults to 1900-01-01 and 1900-01-01T00:00:00Z |
generated by convert-pheno | PROCEDURE_OCCURRENCE.procedure_occurrence_id | Monotonic counter |
| default | PROCEDURE_OCCURRENCE.procedure_type_concept_id | Currently forced to concept id 0 |
interventionsOrProcedures[]._visit.occurrence_id | PROCEDURE_OCCURRENCE.visit_occurrence_id | Direct when numeric; otherwise a surrogate integer is allocated |
interventionsOrProcedures[]._visit.detail_id | PROCEDURE_OCCURRENCE.visit_detail_id | Direct |
| current individual id | PROCEDURE_OCCURRENCE.person_id | Reuses PERSON.person_id |
MEASUREMENTâ
| Source field | Target field | Notes |
|---|---|---|
measures[].assayCode.label | MEASUREMENT.measurement_concept_id, measurement_source_value | Inverse-mapped through the Athena-OHDSI label lookup |
measures[].date | MEASUREMENT.measurement_date | Direct |
measures[].measurementValue (scalar) | MEASUREMENT.value_as_number | Direct |
measures[].measurementValue.quantity.value | MEASUREMENT.value_as_number | Used when the measurement value is a quantity object |
measures[].measurementValue.quantity.referenceRange.low | MEASUREMENT.range_low | Direct |
measures[].measurementValue.quantity.referenceRange.high | MEASUREMENT.range_high | Direct |
measures[].measurementValue.quantity.unit.label | MEASUREMENT.unit_concept_id, unit_source_value | Inverse-mapped through the Athena-OHDSI label lookup |
missing measures[].measurementValue | MEASUREMENT.value_as_number | Defaults to -1 |
MEASUREMENT.value_as_number | MEASUREMENT.value_source_value | Copied back as provenance/source payload |
measures[].procedure.procedureCode.label | MEASUREMENT.measurement_type_concept_id, measurement_type_source_value | Inverse-mapped when a nested procedure is present |
missing measures[].procedure | MEASUREMENT.measurement_type_concept_id | Defaults to concept id 0 with empty source value |
generated by convert-pheno | MEASUREMENT.measurement_id | Monotonic counter |
measures[]._visit.occurrence_id | MEASUREMENT.visit_occurrence_id | Direct when numeric; otherwise a surrogate integer is allocated |
measures[]._visit.detail_id | MEASUREMENT.visit_detail_id | Direct |
| current individual id | MEASUREMENT.person_id | Reuses PERSON.person_id |
DRUG_EXPOSUREâ
| Source field | Target field | Notes |
|---|---|---|
treatments[].treatmentCode.label | DRUG_EXPOSURE.drug_concept_id, drug_source_value | Inverse-mapped through the Athena-OHDSI label lookup |
treatments[].doseIntervals[0].quantity.value | DRUG_EXPOSURE.quantity | Uses only the first dose interval |
missing treatments[].doseIntervals[].quantity.value | DRUG_EXPOSURE.quantity | Defaults to -1 |
treatments[].doseIntervals[0].quantity.unit.label | DRUG_EXPOSURE.dose_unit_source_value | Uses only the first dose interval |
treatments[].routeOfAdministration.label | DRUG_EXPOSURE.route_concept_id, route_source_value | Inverse-mapped through the Athena-OHDSI label lookup |
treatments[].doseIntervals[0].interval.start/end | DRUG_EXPOSURE.drug_exposure_start_date, drug_exposure_end_date | Preferred source; timestamps are truncated to dates and a single bound is reused for both fields when the other is missing |
treatments[].ageOfOnset.age.iso8601duration + PERSON.year_of_birth | DRUG_EXPOSURE.drug_exposure_start_date | Used when no interval dates are present |
missing interval dates and missing ageOfOnset | DRUG_EXPOSURE.drug_exposure_start_date | Defaults to 1900-01-01 |
| missing explicit end date | DRUG_EXPOSURE.drug_exposure_end_date | Reuses the resolved start date |
treatments[].cumulativeDose.unit.label + cumulativeDose.value | DRUG_EXPOSURE.days_supply | Converted with convert_label_to_days(...) |
generated by convert-pheno | DRUG_EXPOSURE.drug_exposure_id | Monotonic counter |
| default | DRUG_EXPOSURE.drug_type_concept_id | Currently forced to 0 |
treatments[]._visit.occurrence_id | DRUG_EXPOSURE.visit_occurrence_id | Direct when numeric; otherwise a surrogate integer is allocated |
treatments[]._visit.detail_id | DRUG_EXPOSURE.visit_detail_id | Direct |
| current individual id | DRUG_EXPOSURE.person_id | Reuses PERSON.person_id |