---
title: "**OMOP CDM v5.4**"
output:
html_document:
toc: yes
toc_depth: 5
toc_float: yes
---
```{r setup, include=FALSE, eval=TRUE}
#todo figure out how to get the document dynamically without specifying the name
library(rmarkdown)
library(knitr)
library(kableExtra)
library(magrittr)
library(dplyr)
library(stringr)
```
Below is the specification document for the OMOP Common Data Model, v5.4. **This is the latest version of the OMOP CDM.** Each table is represented with a high-level description and ETL conventions that should be followed. This is continued with a discussion of each field in each table, any conventions related to the field, and constraints that should be followed (like primary key, foreign key, etc). Should you have questions please feel free to visit the [forums](https://forums.ohdsi.org/) or the [github issue](https://github.com/ohdsi/CommonDataModel/issues) page.
Looking to send us a pull request for a bug fix? Please see the [readme](https://github.com/OHDSI/CommonDataModel#readme) on the main github page.
```{r docLoop54, echo=FALSE, results='asis'}
tableSpecs <- read.csv("../inst/csv/OMOP_CDMv5.4_Table_Level.csv", stringsAsFactors = FALSE)
cdmSpecs <- read.csv("../inst/csv/OMOP_CDMv5.4_Field_Level.csv", stringsAsFactors = FALSE)
tables <- tableSpecs$cdmTableName
cdmSpecsClean <- cdmSpecs %>%
dplyr::select(`CDM Table` = cdmTableName,
`CDM Field` = cdmFieldName,
`User Guide` = userGuidance,
`ETL Conventions` = etlConventions,
`Datatype` = cdmDatatype,
`Required` = isRequired,
`Primary Key` = isPrimaryKey,
`Foreign Key` = isForeignKey,
`FK Table` = fkTableName,
`FK Domain` = fkDomain
)
cdmSpecsClean[is.na(cdmSpecsClean)] <- ""
for(tb in tables) {
if(tb == 'PERSON'){
cat("## **Clinical Data Tables**\n\n")
}
if(tb == 'LOCATION'){
cat("## **Health System Data Tables**\n\n")
}
if(tb == 'PAYER_PLAN_PERIOD'){
cat("## **Health Economics Data Tables**\n\n")
}
if(tb == 'DRUG_ERA'){
cat("## **Standardized Derived Elements**\n\n")
}
if(tb == 'METADATA'){
cat("## **Metadata Tables**\n\n")
}
if(tb == 'CONCEPT'){
cat("## **Vocabulary Tables**\n\n")
}
cat("###", tb, "{.tabset .tabset-pills} \n\n")
tableInfo <- subset(tableSpecs, cdmTableName == tb)
cat("**Table Description**\n\n",tableInfo[,"tableDescription"], "\n\n")
if(!isTRUE(tableInfo[,"userGuidance"]=="")){
cat("**User Guide**\n\n",tableInfo[,"userGuidance"],"\n\n")
}
if(!isTRUE(tableInfo[,"etlConventions"]=="")){
cat("**ETL Conventions**\n\n",tableInfo[,"etlConventions"],"\n\n")
}
loopTable <- subset(cdmSpecsClean, `CDM Table` == tb)
loopTable <- subset(loopTable, select = -c(1))
print(kable(x = loopTable, align = "l", row.names = FALSE, format = "html", escape = FALSE) %>%
column_spec(1, bold = T) %>%
column_spec(2, width = "3in", include_thead = T) %>%
column_spec(3, width = "4in", include_thead = T) %>%
column_spec(4:9, width = "1in", include_thead = T) %>%
kable_styling(c("condensed","hover"), position = "center", full_width = T, font_size = 13))
}
```