-
Notifications
You must be signed in to change notification settings - Fork 452
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #552 from OHDSI/doc-tooling-support
Tooling support page
- Loading branch information
Showing
6 changed files
with
2,047 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,110 @@ | ||
--- | ||
title: "**OMOP CDM v5.4 Detailed Tooling Support**" | ||
output: | ||
html_document: | ||
toc: TRUE | ||
toc_float: TRUE | ||
--- | ||
|
||
# Introduction | ||
This tables below contain an overview of which standard OHDSI tools make use of which OMOP CDM fields. | ||
The goal is to inform ETL developers, tooling developers and CDM extensions. | ||
|
||
- For ETL developers it helps to have guidance on which fieds to prioritise in the mapping. Most value will be gained from populating fields support across the OHDSI tooling. | ||
- For OHDSI tooling developers, this page provides insight in the gaps of support and can drive future development efforts. | ||
- For CDM extenstions, it helps to known what it means for an OMOP CDM table/field to be part of the standard. In other words: what OHDSI tooling do we at least expect to support the new extensions? | ||
|
||
Currently four OHDSI tools have been evaluated: DataQualityDashboard, Achilles, Atlas (Data Sources and Cohort creation) and Feature Extraction. | ||
|
||
## Criteria | ||
Tool | Supports CDM Field if | Link to resource used | ||
--- | --- | --- | ||
DataQualityDashboard | Part of Field Level checks | https://github.com/OHDSI/DataQualityDashboard/blob/main/inst/csv/OMOP_CDMv5.4_Field_Level.csv | ||
Achilles | Covered by at least one Achilles analysis | https://github.com/OHDSI/Achilles/blob/main/inst/csv/achilles/achilles_analysis_details.csv | ||
Atlas Data Sources | A statistic based on the field is shown in a 'Data Sources' visualisation | https://atlas-demo.ohdsi.org/ | ||
Atlas Cohort | Used in te Atlas User Interface for cohort definition criteria (directly, or via 'Add attribute') | https://atlas-demo.ohdsi.org/ | ||
Feature Extraction | Used in one of the Feature Extraction analyses | https://github.com/OHDSI/FeatureExtraction/blob/main/inst/csv/ | ||
|
||
General criteria: | ||
- `r emo::ji("white heavy check mark")` if the field essential for OMOP CDM definition (Primary Key, Foreign Key) e.g. person_id not explicitly used, but essential. (if the PK is marked as False, it typically means the whole table is not used in the tool e.g. `_source_value` fields that are used for traceability in ETL) | ||
- `r emo::ji("warning")` if field is used by the tool, but not in a meaningful way. e.g. `provider_id` in Achilles only checked for a valid foreign key to the provider table. | ||
|
||
# Tooling Support for OMOP fields | ||
**Abbrevations** | | ||
--- | --- | ||
**PK** | Primary Key | ||
**SV** | Source Value (for data quality / etl validation) | ||
**BC** | Backwards Compatibility, to support CDM <v5.4 | ||
**FC** | Forwards Compatibility, to easy support for CDM v6 in the future. | ||
|
||
## Person | ||
cdmTableName | cdmFieldName | Special Fields | DQD (v1.0) | Achilles (v1.7) | Atlas Cohort (v2.10) | Atlas Cohort (v2.12) | Atlas Data Sources (v2.12) | Feature Extraction (v3.2) | Comment | ||
--- | --- | :---: | :---: | :---: | :---: | :---: | :---: | :---: | --- | ||
PERSON | person_id | PK | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | | ||
PERSON | gender_concept_id | | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | | ||
PERSON | year_of_birth | | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | | ||
PERSON | month_of_birth | | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
PERSON | day_of_birth | | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
PERSON | birth_datetime | FC | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
PERSON | race_concept_id | | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | | ||
PERSON | ethnicity_concept_id | | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | | ||
PERSON | location_id | | `r emo::ji("white heavy check mark")` | `r emo::ji("warning")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | Achilles only does FK check | ||
PERSON | provider_id | | `r emo::ji("white heavy check mark")` | `r emo::ji("warning")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | Achilles only does FK check | ||
PERSON | care_site_id | | `r emo::ji("white heavy check mark")` | `r emo::ji("warning")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | Achilles only does FK check | ||
PERSON | person_source_value | SV | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
PERSON | gender_source_value | SV | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
PERSON | gender_source_concept_id | | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
PERSON | race_source_value | SV | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
PERSON | race_source_concept_id | | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
PERSON | ethnicity_source_value | SV | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
PERSON | ethnicity_source_concept_id | | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
|
||
## Observation Period | ||
cdmTableName | cdmFieldName | Special Fields | DQD (v1.0) | Achilles (v1.7) | Atlas Cohort (v2.10) | Atlas Cohort (v2.12) | Atlas Data Sources (v2.12) | Feature Extraction (v3.2) | Comment | ||
--- | --- | :---: | :---: | :---: | :---: | :---: | :---: | :---: | --- | ||
OBSERVATION_PERIOD | observation_period_id | PK | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | | ||
OBSERVATION_PERIOD | person_id | Pid | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | | ||
OBSERVATION_PERIOD | observation_period_start_date | | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | | ||
OBSERVATION_PERIOD | observation_period_end_date | | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | | ||
OBSERVATION_PERIOD | period_type_concept_id | | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
|
||
## Visit Occurrence | ||
cdmTableName | cdmFieldName | Special Fields | DQD (v1.0) | Achilles (v1.7) | Atlas Cohort (v2.10) | Atlas Cohort (v2.12) | Atlas Data Sources (v2.12) | Feature Extraction (v3.2) | Comment | ||
--- | --- | :---: | :---: | :---: | :---: | :---: | :---: | :---: | --- | ||
VISIT_OCCURRENCE | visit_occurrence_id | PK | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | | ||
VISIT_OCCURRENCE | person_id | Pid | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | | ||
VISIT_OCCURRENCE | visit_concept_id | | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | | ||
VISIT_OCCURRENCE | visit_source_concept_id | | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
VISIT_OCCURRENCE | visit_source_value | SV | `r emo::ji("white heavy check mark")` | `r emo::ji("warning")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
VISIT_OCCURRENCE | visit_start_date | | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | Achilles check 1900 | ||
VISIT_OCCURRENCE | visit_start_datetime | FC | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
VISIT_OCCURRENCE | visit_end_date | | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("white heavy check mark")` | | ||
VISIT_OCCURRENCE | visit_end_datetime | FC | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
VISIT_OCCURRENCE | visit_type_concept_id | | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
VISIT_OCCURRENCE | provider_id | | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | Atlas uses provider.specialty_concept_id | ||
VISIT_OCCURRENCE | care_site_id | | `r emo::ji("white heavy check mark")` | `r emo::ji("warning")` | `r emo::ji("white heavy check mark")` | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | Achilles only does FK check, Atlas uses care_site.place_of_service_concept_id | ||
VISIT_OCCURRENCE | admitted_from_concept_id | | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
VISIT_OCCURRENCE | admitted_from_source_value | SV | `r emo::ji("white heavy check mark")` | `r emo::ji("warning")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | Achilles check 1900 | ||
VISIT_OCCURRENCE | discharged_to_concept_id | | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
VISIT_OCCURRENCE | discharged_to_source_value | SV | `r emo::ji("white heavy check mark")` | `r emo::ji("warning")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | Achilles check 1900 | ||
VISIT_OCCURRENCE | preceding_visit_occurrence_id | | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
|
||
## Episode | ||
cdmTableName | cdmFieldName | Special Fields | DQD (v1.0) | Achilles (v1.7) | Atlas Cohort (v2.10) | Atlas Cohort (v2.12) | Atlas Data Sources (v2.12) | Feature Extraction (v3.2) | Comment | ||
--- | --- | :---: | :---: | :---: | :---: | :---: | :---: | :---: | --- | ||
EPISODE | episode_id | PK | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
EPISODE | person_id | Pid | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
EPISODE | episode_concept_id | | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
EPISODE | episode_start_date | | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
EPISODE | episode_start_datetime | FC | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
EPISODE | episode_end_date | | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
EPISODE | episode_end_datetime | FC | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
EPISODE | episode_parent_id | | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
EPISODE | episode_number | | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
EPISODE | episode_object_concept_id | | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
EPISODE | episode_type_concept_id | | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
EPISODE | episode_source_value | SV | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
EPISODE | episode_source_concept_id | | `r emo::ji("white heavy check mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | `r emo::ji("cross_mark")` | | ||
|
||
This was an effort by the CDM Working Group in 2022. | ||
*Credits: Clair Blacketer, Maxim Moinat, Nitin Park |
Oops, something went wrong.