diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000..c57f6c1
Binary files /dev/null and b/.DS_Store differ
diff --git a/docs/_site/assets/css/style.css b/docs/_site/assets/css/style.css
deleted file mode 100644
index bc2033b..0000000
--- a/docs/_site/assets/css/style.css
+++ /dev/null
@@ -1,2883 +0,0 @@
-/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */
-/** 1. Change the default font family in all browsers (opinionated). 2. Prevent adjustments of font size after orientation changes in IE and iOS. */
-html { font-family: sans-serif; /* 1 */ -ms-text-size-adjust: 100%; /* 2 */ -webkit-text-size-adjust: 100%; /* 2 */ }
-
-/** Remove the margin in all browsers (opinionated). */
-body { margin: 0; }
-
-/* HTML5 display definitions ========================================================================== */
-/** Add the correct display in IE 9-. 1. Add the correct display in Edge, IE, and Firefox. 2. Add the correct display in IE. */
-article, aside, details, figcaption, figure, footer, header, main, menu, nav, section { /* 1 */ display: block; }
-
-summary { display: list-item; }
-
-/** Add the correct display in IE 9-. */
-audio, canvas, progress, video { display: inline-block; }
-
-/** Add the correct display in iOS 4-7. */
-audio:not([controls]) { display: none; height: 0; }
-
-/** Add the correct vertical alignment in Chrome, Firefox, and Opera. */
-progress { vertical-align: baseline; }
-
-/** Add the correct display in IE 10-. 1. Add the correct display in IE. */
-template, [hidden] { display: none !important; }
-
-/* Links ========================================================================== */
-/** Remove the gray background on active links in IE 10. */
-a { background-color: transparent; /* 1 */ }
-
-/** Remove the outline on focused links when they are also active or hovered in all browsers (opinionated). */
-a:active, a:hover { outline-width: 0; }
-
-/* Text-level semantics ========================================================================== */
-/** 1. Remove the bottom border in Firefox 39-. 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. */
-abbr[title] { border-bottom: none; /* 1 */ text-decoration: underline; /* 2 */ text-decoration: underline dotted; /* 2 */ }
-
-/** Prevent the duplicate application of `bolder` by the next rule in Safari 6. */
-b, strong { font-weight: inherit; }
-
-/** Add the correct font weight in Chrome, Edge, and Safari. */
-b, strong { font-weight: bolder; }
-
-/** Add the correct font style in Android 4.3-. */
-dfn { font-style: italic; }
-
-/** Correct the font size and margin on `h1` elements within `section` and `article` contexts in Chrome, Firefox, and Safari. */
-h1 { font-size: 2em; margin: 0.67em 0; }
-
-/** Add the correct background and color in IE 9-. */
-mark { background-color: #ff0; color: #000; }
-
-/** Add the correct font size in all browsers. */
-small { font-size: 80%; }
-
-/** Prevent `sub` and `sup` elements from affecting the line height in all browsers. */
-sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
-
-sub { bottom: -0.25em; }
-
-sup { top: -0.5em; }
-
-/* Embedded content ========================================================================== */
-/** Remove the border on images inside links in IE 10-. */
-img { border-style: none; }
-
-/** Hide the overflow in IE. */
-svg:not(:root) { overflow: hidden; }
-
-/* Grouping content ========================================================================== */
-/** 1. Correct the inheritance and scaling of font size in all browsers. 2. Correct the odd `em` font sizing in all browsers. */
-code, kbd, pre, samp { font-family: monospace, monospace; /* 1 */ font-size: 1em; /* 2 */ }
-
-/** Add the correct margin in IE 8. */
-figure { margin: 1em 40px; }
-
-/** 1. Add the correct box sizing in Firefox. 2. Show the overflow in Edge and IE. */
-hr { box-sizing: content-box; /* 1 */ height: 0; /* 1 */ overflow: visible; /* 2 */ }
-
-/* Forms ========================================================================== */
-/** 1. Change font properties to `inherit` in all browsers (opinionated). 2. Remove the margin in Firefox and Safari. */
-button, input, select, textarea { font: inherit; /* 1 */ margin: 0; /* 2 */ }
-
-/** Restore the font weight unset by the previous rule. */
-optgroup { font-weight: bold; }
-
-/** Show the overflow in IE. 1. Show the overflow in Edge. */
-button, input { /* 1 */ overflow: visible; }
-
-/** Remove the inheritance of text transform in Edge, Firefox, and IE. 1. Remove the inheritance of text transform in Firefox. */
-button, select { /* 1 */ text-transform: none; }
-
-/** 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` controls in Android 4. 2. Correct the inability to style clickable types in iOS and Safari. */
-button, html [type="button"], [type="reset"], [type="submit"] { -webkit-appearance: button; /* 2 */ }
-
-/** Remove the inner border and padding in Firefox. */
-button::-moz-focus-inner, [type="button"]::-moz-focus-inner, [type="reset"]::-moz-focus-inner, [type="submit"]::-moz-focus-inner { border-style: none; padding: 0; }
-
-/** Restore the focus styles unset by the previous rule. */
-button:-moz-focusring, [type="button"]:-moz-focusring, [type="reset"]:-moz-focusring, [type="submit"]:-moz-focusring { outline: 1px dotted ButtonText; }
-
-/** Change the border, margin, and padding in all browsers (opinionated). */
-fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; }
-
-/** 1. Correct the text wrapping in Edge and IE. 2. Correct the color inheritance from `fieldset` elements in IE. 3. Remove the padding so developers are not caught out when they zero out `fieldset` elements in all browsers. */
-legend { box-sizing: border-box; /* 1 */ color: inherit; /* 2 */ display: table; /* 1 */ max-width: 100%; /* 1 */ padding: 0; /* 3 */ white-space: normal; /* 1 */ }
-
-/** Remove the default vertical scrollbar in IE. */
-textarea { overflow: auto; }
-
-/** 1. Add the correct box sizing in IE 10-. 2. Remove the padding in IE 10-. */
-[type="checkbox"], [type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ }
-
-/** Correct the cursor style of increment and decrement buttons in Chrome. */
-[type="number"]::-webkit-inner-spin-button, [type="number"]::-webkit-outer-spin-button { height: auto; }
-
-/** 1. Correct the odd appearance in Chrome and Safari. 2. Correct the outline style in Safari. */
-[type="search"] { -webkit-appearance: textfield; /* 1 */ outline-offset: -2px; /* 2 */ }
-
-/** Remove the inner padding and cancel buttons in Chrome and Safari on OS X. */
-[type="search"]::-webkit-search-cancel-button, [type="search"]::-webkit-search-decoration { -webkit-appearance: none; }
-
-/** Correct the text style of placeholders in Chrome, Edge, and Safari. */
-::-webkit-input-placeholder { color: inherit; opacity: 0.54; }
-
-/** 1. Correct the inability to style clickable types in iOS and Safari. 2. Change font properties to `inherit` in Safari. */
-::-webkit-file-upload-button { -webkit-appearance: button; /* 1 */ font: inherit; /* 2 */ }
-
-* { box-sizing: border-box; }
-
-input, select, textarea, button { font-family: inherit; font-size: inherit; line-height: inherit; }
-
-body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 14px; line-height: 1.5; color: #24292e; background-color: #fff; }
-
-a { color: #0366d6; text-decoration: none; }
-a:hover { text-decoration: underline; }
-
-b, strong { font-weight: 600; }
-
-hr, .rule { height: 0; margin: 15px 0; overflow: hidden; background: transparent; border: 0; border-bottom: 1px solid #dfe2e5; }
-hr::before, .rule::before { display: table; content: ""; }
-hr::after, .rule::after { display: table; clear: both; content: ""; }
-
-table { border-spacing: 0; border-collapse: collapse; }
-
-td, th { padding: 0; }
-
-button { cursor: pointer; border-radius: 0; }
-
-[hidden][hidden] { display: none !important; }
-
-details summary { cursor: pointer; }
-details:not([open]) > *:not(summary) { display: none !important; }
-
-h1, h2, h3, h4, h5, h6 { margin-top: 0; margin-bottom: 0; }
-
-h1 { font-size: 32px; font-weight: 600; }
-
-h2 { font-size: 24px; font-weight: 600; }
-
-h3 { font-size: 20px; font-weight: 600; }
-
-h4 { font-size: 16px; font-weight: 600; }
-
-h5 { font-size: 14px; font-weight: 600; }
-
-h6 { font-size: 12px; font-weight: 600; }
-
-p { margin-top: 0; margin-bottom: 10px; }
-
-small { font-size: 90%; }
-
-blockquote { margin: 0; }
-
-ul, ol { padding-left: 0; margin-top: 0; margin-bottom: 0; }
-
-ol ol, ul ol { list-style-type: lower-roman; }
-
-ul ul ol, ul ol ol, ol ul ol, ol ol ol { list-style-type: lower-alpha; }
-
-dd { margin-left: 0; }
-
-tt, code { font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; }
-
-pre { margin-top: 0; margin-bottom: 0; font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; }
-
-.octicon { vertical-align: text-bottom; }
-
-/* Fade in an element */
-.anim-fade-in { animation-name: fade-in; animation-duration: 1s; animation-timing-function: ease-in-out; }
-.anim-fade-in.fast { animation-duration: 300ms; }
-
-@keyframes fade-in { 0% { opacity: 0; }
- 100% { opacity: 1; } }
-/* Fade out an element */
-.anim-fade-out { animation-name: fade-out; animation-duration: 1s; animation-timing-function: ease-out; }
-.anim-fade-out.fast { animation-duration: 0.3s; }
-
-@keyframes fade-out { 0% { opacity: 1; }
- 100% { opacity: 0; } }
-/* Fade in and slide up an element */
-.anim-fade-up { opacity: 0; animation-name: fade-up; animation-duration: 0.3s; animation-fill-mode: forwards; animation-timing-function: ease-out; animation-delay: 1s; }
-
-@keyframes fade-up { 0% { opacity: 0.8; transform: translateY(100%); }
- 100% { opacity: 1; transform: translateY(0); } }
-/* Fade an element out and slide down */
-.anim-fade-down { animation-name: fade-down; animation-duration: 0.3s; animation-fill-mode: forwards; animation-timing-function: ease-in; }
-
-@keyframes fade-down { 0% { opacity: 1; transform: translateY(0); }
- 100% { opacity: 0.5; transform: translateY(100%); } }
-/* Grow an element width from 0 to 100% */
-.anim-grow-x { width: 0%; animation-name: grow-x; animation-duration: 0.3s; animation-fill-mode: forwards; animation-timing-function: ease; animation-delay: 0.5s; }
-
-@keyframes grow-x { to { width: 100%; } }
-/* Shrink an element from 100% to 0% */
-.anim-shrink-x { animation-name: shrink-x; animation-duration: 0.3s; animation-fill-mode: forwards; animation-timing-function: ease-in-out; animation-delay: 0.5s; }
-
-@keyframes shrink-x { to { width: 0%; } }
-/* Fade in an element and scale it fast */
-.anim-scale-in { animation-name: scale-in; animation-duration: 0.15s; animation-timing-function: cubic-bezier(0.2, 0, 0.13, 1.5); }
-
-@keyframes scale-in { 0% { opacity: 0; transform: scale(0.5); }
- 100% { opacity: 1; transform: scale(1); } }
-/* Pulse an element's opacity */
-.anim-pulse { animation-name: pulse; animation-duration: 2s; animation-timing-function: linear; animation-iteration-count: infinite; }
-
-@keyframes pulse { 0% { opacity: 0.3; }
- 10% { opacity: 1; }
- 100% { opacity: 0.3; } }
-/* Pulse in an element */
-.anim-pulse-in { animation-name: pulse-in; animation-duration: 0.5s; }
-
-@keyframes pulse-in { 0% { transform: scale3d(1, 1, 1); }
- 50% { transform: scale3d(1.1, 1.1, 1.1); }
- 100% { transform: scale3d(1, 1, 1); } }
-/* Increase scale of an element on hover */
-.hover-grow { transition: transform 0.3s; backface-visibility: hidden; }
-.hover-grow:hover { transform: scale(1.025); }
-
-/* Add a gray border on all sides */
-.border { border: 1px #e1e4e8 solid !important; }
-
-/* Add a gray border to the left and right */
-.border-y { border-top: 1px #e1e4e8 solid !important; border-bottom: 1px #e1e4e8 solid !important; }
-
-/* Remove borders from all sides */
-.border-0 { border: 0 !important; }
-
-.border-dashed { border-style: dashed !important; }
-
-/* Use with .border to turn the border blue */
-.border-blue { border-color: #0366d6 !important; }
-
-/* Use with .border to turn the border blue-light */
-.border-blue-light { border-color: #c8e1ff !important; }
-
-/* Use with .border to turn the border green */
-.border-green { border-color: #34d058 !important; }
-
-/* Use with .border to turn the border green light */
-.border-green-light { border-color: #a2cbac !important; }
-
-/* Use with .border to turn the border red */
-.border-red { border-color: #d73a49 !important; }
-
-/* Use with .border to turn the border red-light */
-.border-red-light { border-color: #cea0a5 !important; }
-
-/* Use with .border to turn the border purple */
-.border-purple { border-color: #6f42c1 !important; }
-
-/* Use with .border to turn the border yellow */
-.border-yellow { border-color: #d9d0a5 !important; }
-
-/* Use with .border to turn the border gray-light */
-.border-gray-light { border-color: #eaecef !important; }
-
-/* Use with .border to turn the border gray-dark */
-.border-gray-dark { border-color: #d1d5da !important; }
-
-/* Use with .border to turn the border rgba black 0.15 */
-.border-black-fade { border-color: rgba(27, 31, 35, 0.15) !important; }
-
-/* Add a gray border */
-/* Add a gray border to the top */
-.border-top { border-top: 1px #e1e4e8 solid !important; }
-
-/* Add a gray border to the right */
-.border-right { border-right: 1px #e1e4e8 solid !important; }
-
-/* Add a gray border to the bottom */
-.border-bottom { border-bottom: 1px #e1e4e8 solid !important; }
-
-/* Add a gray border to the left */
-.border-left { border-left: 1px #e1e4e8 solid !important; }
-
-/* Remove the top border */
-.border-top-0 { border-top: 0 !important; }
-
-/* Remove the right border */
-.border-right-0 { border-right: 0 !important; }
-
-/* Remove the bottom border */
-.border-bottom-0 { border-bottom: 0 !important; }
-
-/* Remove the left border */
-.border-left-0 { border-left: 0 !important; }
-
-/* Remove the border-radius */
-.rounded-0 { border-radius: 0 !important; }
-
-/* Add a border-radius to all corners */
-.rounded-1 { border-radius: 3px !important; }
-
-/* Add a 2x border-radius to all corners */
-.rounded-2 { border-radius: 6px !important; }
-
-.rounded-top-0 { border-top-left-radius: 0 !important; border-top-right-radius: 0 !important; }
-
-.rounded-top-1 { border-top-left-radius: 3px !important; border-top-right-radius: 3px !important; }
-
-.rounded-top-2 { border-top-left-radius: 6px !important; border-top-right-radius: 6px !important; }
-
-.rounded-right-0 { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; }
-
-.rounded-right-1 { border-top-right-radius: 3px !important; border-bottom-right-radius: 3px !important; }
-
-.rounded-right-2 { border-top-right-radius: 6px !important; border-bottom-right-radius: 6px !important; }
-
-.rounded-bottom-0 { border-bottom-right-radius: 0 !important; border-bottom-left-radius: 0 !important; }
-
-.rounded-bottom-1 { border-bottom-right-radius: 3px !important; border-bottom-left-radius: 3px !important; }
-
-.rounded-bottom-2 { border-bottom-right-radius: 6px !important; border-bottom-left-radius: 6px !important; }
-
-.rounded-left-0 { border-bottom-left-radius: 0 !important; border-top-left-radius: 0 !important; }
-
-.rounded-left-1 { border-bottom-left-radius: 3px !important; border-top-left-radius: 3px !important; }
-
-.rounded-left-2 { border-bottom-left-radius: 6px !important; border-top-left-radius: 6px !important; }
-
-@media (min-width: 544px) { /* Add a gray border */
- /* Add a gray border to the top */
- .border-sm-top { border-top: 1px #e1e4e8 solid !important; }
- /* Add a gray border to the right */
- .border-sm-right { border-right: 1px #e1e4e8 solid !important; }
- /* Add a gray border to the bottom */
- .border-sm-bottom { border-bottom: 1px #e1e4e8 solid !important; }
- /* Add a gray border to the left */
- .border-sm-left { border-left: 1px #e1e4e8 solid !important; }
- /* Remove the top border */
- .border-sm-top-0 { border-top: 0 !important; }
- /* Remove the right border */
- .border-sm-right-0 { border-right: 0 !important; }
- /* Remove the bottom border */
- .border-sm-bottom-0 { border-bottom: 0 !important; }
- /* Remove the left border */
- .border-sm-left-0 { border-left: 0 !important; }
- /* Remove the border-radius */
- .rounded-sm-0 { border-radius: 0 !important; }
- /* Add a border-radius to all corners */
- .rounded-sm-1 { border-radius: 3px !important; }
- /* Add a 2x border-radius to all corners */
- .rounded-sm-2 { border-radius: 6px !important; }
- .rounded-sm-top-0 { border-top-left-radius: 0 !important; border-top-right-radius: 0 !important; }
- .rounded-sm-top-1 { border-top-left-radius: 3px !important; border-top-right-radius: 3px !important; }
- .rounded-sm-top-2 { border-top-left-radius: 6px !important; border-top-right-radius: 6px !important; }
- .rounded-sm-right-0 { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; }
- .rounded-sm-right-1 { border-top-right-radius: 3px !important; border-bottom-right-radius: 3px !important; }
- .rounded-sm-right-2 { border-top-right-radius: 6px !important; border-bottom-right-radius: 6px !important; }
- .rounded-sm-bottom-0 { border-bottom-right-radius: 0 !important; border-bottom-left-radius: 0 !important; }
- .rounded-sm-bottom-1 { border-bottom-right-radius: 3px !important; border-bottom-left-radius: 3px !important; }
- .rounded-sm-bottom-2 { border-bottom-right-radius: 6px !important; border-bottom-left-radius: 6px !important; }
- .rounded-sm-left-0 { border-bottom-left-radius: 0 !important; border-top-left-radius: 0 !important; }
- .rounded-sm-left-1 { border-bottom-left-radius: 3px !important; border-top-left-radius: 3px !important; }
- .rounded-sm-left-2 { border-bottom-left-radius: 6px !important; border-top-left-radius: 6px !important; } }
-@media (min-width: 768px) { /* Add a gray border */
- /* Add a gray border to the top */
- .border-md-top { border-top: 1px #e1e4e8 solid !important; }
- /* Add a gray border to the right */
- .border-md-right { border-right: 1px #e1e4e8 solid !important; }
- /* Add a gray border to the bottom */
- .border-md-bottom { border-bottom: 1px #e1e4e8 solid !important; }
- /* Add a gray border to the left */
- .border-md-left { border-left: 1px #e1e4e8 solid !important; }
- /* Remove the top border */
- .border-md-top-0 { border-top: 0 !important; }
- /* Remove the right border */
- .border-md-right-0 { border-right: 0 !important; }
- /* Remove the bottom border */
- .border-md-bottom-0 { border-bottom: 0 !important; }
- /* Remove the left border */
- .border-md-left-0 { border-left: 0 !important; }
- /* Remove the border-radius */
- .rounded-md-0 { border-radius: 0 !important; }
- /* Add a border-radius to all corners */
- .rounded-md-1 { border-radius: 3px !important; }
- /* Add a 2x border-radius to all corners */
- .rounded-md-2 { border-radius: 6px !important; }
- .rounded-md-top-0 { border-top-left-radius: 0 !important; border-top-right-radius: 0 !important; }
- .rounded-md-top-1 { border-top-left-radius: 3px !important; border-top-right-radius: 3px !important; }
- .rounded-md-top-2 { border-top-left-radius: 6px !important; border-top-right-radius: 6px !important; }
- .rounded-md-right-0 { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; }
- .rounded-md-right-1 { border-top-right-radius: 3px !important; border-bottom-right-radius: 3px !important; }
- .rounded-md-right-2 { border-top-right-radius: 6px !important; border-bottom-right-radius: 6px !important; }
- .rounded-md-bottom-0 { border-bottom-right-radius: 0 !important; border-bottom-left-radius: 0 !important; }
- .rounded-md-bottom-1 { border-bottom-right-radius: 3px !important; border-bottom-left-radius: 3px !important; }
- .rounded-md-bottom-2 { border-bottom-right-radius: 6px !important; border-bottom-left-radius: 6px !important; }
- .rounded-md-left-0 { border-bottom-left-radius: 0 !important; border-top-left-radius: 0 !important; }
- .rounded-md-left-1 { border-bottom-left-radius: 3px !important; border-top-left-radius: 3px !important; }
- .rounded-md-left-2 { border-bottom-left-radius: 6px !important; border-top-left-radius: 6px !important; } }
-@media (min-width: 1012px) { /* Add a gray border */
- /* Add a gray border to the top */
- .border-lg-top { border-top: 1px #e1e4e8 solid !important; }
- /* Add a gray border to the right */
- .border-lg-right { border-right: 1px #e1e4e8 solid !important; }
- /* Add a gray border to the bottom */
- .border-lg-bottom { border-bottom: 1px #e1e4e8 solid !important; }
- /* Add a gray border to the left */
- .border-lg-left { border-left: 1px #e1e4e8 solid !important; }
- /* Remove the top border */
- .border-lg-top-0 { border-top: 0 !important; }
- /* Remove the right border */
- .border-lg-right-0 { border-right: 0 !important; }
- /* Remove the bottom border */
- .border-lg-bottom-0 { border-bottom: 0 !important; }
- /* Remove the left border */
- .border-lg-left-0 { border-left: 0 !important; }
- /* Remove the border-radius */
- .rounded-lg-0 { border-radius: 0 !important; }
- /* Add a border-radius to all corners */
- .rounded-lg-1 { border-radius: 3px !important; }
- /* Add a 2x border-radius to all corners */
- .rounded-lg-2 { border-radius: 6px !important; }
- .rounded-lg-top-0 { border-top-left-radius: 0 !important; border-top-right-radius: 0 !important; }
- .rounded-lg-top-1 { border-top-left-radius: 3px !important; border-top-right-radius: 3px !important; }
- .rounded-lg-top-2 { border-top-left-radius: 6px !important; border-top-right-radius: 6px !important; }
- .rounded-lg-right-0 { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; }
- .rounded-lg-right-1 { border-top-right-radius: 3px !important; border-bottom-right-radius: 3px !important; }
- .rounded-lg-right-2 { border-top-right-radius: 6px !important; border-bottom-right-radius: 6px !important; }
- .rounded-lg-bottom-0 { border-bottom-right-radius: 0 !important; border-bottom-left-radius: 0 !important; }
- .rounded-lg-bottom-1 { border-bottom-right-radius: 3px !important; border-bottom-left-radius: 3px !important; }
- .rounded-lg-bottom-2 { border-bottom-right-radius: 6px !important; border-bottom-left-radius: 6px !important; }
- .rounded-lg-left-0 { border-bottom-left-radius: 0 !important; border-top-left-radius: 0 !important; }
- .rounded-lg-left-1 { border-bottom-left-radius: 3px !important; border-top-left-radius: 3px !important; }
- .rounded-lg-left-2 { border-bottom-left-radius: 6px !important; border-top-left-radius: 6px !important; } }
-@media (min-width: 1280px) { /* Add a gray border */
- /* Add a gray border to the top */
- .border-xl-top { border-top: 1px #e1e4e8 solid !important; }
- /* Add a gray border to the right */
- .border-xl-right { border-right: 1px #e1e4e8 solid !important; }
- /* Add a gray border to the bottom */
- .border-xl-bottom { border-bottom: 1px #e1e4e8 solid !important; }
- /* Add a gray border to the left */
- .border-xl-left { border-left: 1px #e1e4e8 solid !important; }
- /* Remove the top border */
- .border-xl-top-0 { border-top: 0 !important; }
- /* Remove the right border */
- .border-xl-right-0 { border-right: 0 !important; }
- /* Remove the bottom border */
- .border-xl-bottom-0 { border-bottom: 0 !important; }
- /* Remove the left border */
- .border-xl-left-0 { border-left: 0 !important; }
- /* Remove the border-radius */
- .rounded-xl-0 { border-radius: 0 !important; }
- /* Add a border-radius to all corners */
- .rounded-xl-1 { border-radius: 3px !important; }
- /* Add a 2x border-radius to all corners */
- .rounded-xl-2 { border-radius: 6px !important; }
- .rounded-xl-top-0 { border-top-left-radius: 0 !important; border-top-right-radius: 0 !important; }
- .rounded-xl-top-1 { border-top-left-radius: 3px !important; border-top-right-radius: 3px !important; }
- .rounded-xl-top-2 { border-top-left-radius: 6px !important; border-top-right-radius: 6px !important; }
- .rounded-xl-right-0 { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; }
- .rounded-xl-right-1 { border-top-right-radius: 3px !important; border-bottom-right-radius: 3px !important; }
- .rounded-xl-right-2 { border-top-right-radius: 6px !important; border-bottom-right-radius: 6px !important; }
- .rounded-xl-bottom-0 { border-bottom-right-radius: 0 !important; border-bottom-left-radius: 0 !important; }
- .rounded-xl-bottom-1 { border-bottom-right-radius: 3px !important; border-bottom-left-radius: 3px !important; }
- .rounded-xl-bottom-2 { border-bottom-right-radius: 6px !important; border-bottom-left-radius: 6px !important; }
- .rounded-xl-left-0 { border-bottom-left-radius: 0 !important; border-top-left-radius: 0 !important; }
- .rounded-xl-left-1 { border-bottom-left-radius: 3px !important; border-top-left-radius: 3px !important; }
- .rounded-xl-left-2 { border-bottom-left-radius: 6px !important; border-top-left-radius: 6px !important; } }
-/* Add a 50% border-radius to make something into a circle */
-.circle { border-radius: 50% !important; }
-
-.box-shadow { box-shadow: 0 1px 1px rgba(27, 31, 35, 0.1) !important; }
-
-.box-shadow-medium { box-shadow: 0 1px 5px rgba(27, 31, 35, 0.15) !important; }
-
-.box-shadow-large { box-shadow: 0 1px 15px rgba(27, 31, 35, 0.15) !important; }
-
-.box-shadow-extra-large { box-shadow: 0 10px 50px rgba(27, 31, 35, 0.07) !important; }
-
-.box-shadow-none { box-shadow: none !important; }
-
-/* Set the background to $bg-white */
-.bg-white { background-color: #fff !important; }
-
-/* Set the background to $bg-blue */
-.bg-blue { background-color: #0366d6 !important; }
-
-/* Set the background to $bg-blue-light */
-.bg-blue-light { background-color: #f1f8ff !important; }
-
-/* Set the background to $bg-gray-dark */
-.bg-gray-dark { background-color: #24292e !important; }
-
-/* Set the background to $bg-gray */
-.bg-gray { background-color: #f6f8fa !important; }
-
-/* Set the background to $bg-gray-light */
-.bg-gray-light { background-color: #fafbfc !important; }
-
-/* Set the background to $bg-green */
-.bg-green { background-color: #28a745 !important; }
-
-/* Set the background to $bg-green-light */
-.bg-green-light { background-color: #dcffe4 !important; }
-
-/* Set the background to $bg-red */
-.bg-red { background-color: #d73a49 !important; }
-
-/* Set the background to $bg-red-light */
-.bg-red-light { background-color: #ffdce0 !important; }
-
-/* Set the background to $bg-yellow */
-.bg-yellow { background-color: #ffd33d !important; }
-
-/* Set the background to $bg-yellow-light */
-.bg-yellow-light { background-color: #fff5b1 !important; }
-
-/* Set the background to $bg-purple */
-.bg-purple { background-color: #6f42c1 !important; }
-
-/* Set the background to $bg-purple-light */
-.bg-purple-light { background-color: #f5f0ff !important; }
-
-.bg-shade-gradient { background-image: linear-gradient(180deg, rgba(27, 31, 35, 0.065), rgba(27, 31, 35, 0)) !important; background-repeat: no-repeat !important; background-size: 100% 200px !important; }
-
-/* Set the text color to $text-blue */
-.text-blue { color: #0366d6 !important; }
-
-/* Set the text color to $text-red */
-.text-red { color: #cb2431 !important; }
-
-/* Set the text color to $text-gray-light */
-.text-gray-light { color: #6a737d !important; }
-
-/* Set the text color to $text-gray */
-.text-gray { color: #586069 !important; }
-
-/* Set the text color to $text-gray-dark */
-.text-gray-dark { color: #24292e !important; }
-
-/* Set the text color to $text-green */
-.text-green { color: #28a745 !important; }
-
-/* Set the text color to $text-orange */
-.text-orange { color: #a04100 !important; }
-
-/* Set the text color to $text-orange-light */
-.text-orange-light { color: #e36209 !important; }
-
-/* Set the text color to $text-purple */
-.text-purple { color: #6f42c1 !important; }
-
-/* Set the text color to $text-white */
-.text-white { color: #fff !important; }
-
-/* Set the text color to inherit */
-.text-inherit { color: inherit !important; }
-
-.text-pending { color: #b08800 !important; }
-
-.bg-pending { color: #dbab09 !important; }
-
-.link-gray { color: #586069 !important; }
-.link-gray:hover { color: #0366d6 !important; }
-
-.link-gray-dark { color: #24292e !important; }
-.link-gray-dark:hover { color: #0366d6 !important; }
-
-/* Set the link color to $text-blue on hover Useful when you want only part of a link to turn blue on hover */
-.link-hover-blue:hover { color: #0366d6 !important; }
-
-/* Make a link $text-gray, then $text-blue on hover and removes the underline */
-.muted-link { color: #586069 !important; }
-.muted-link:hover { color: #0366d6 !important; text-decoration: none; }
-
-.details-overlay[open] > summary::before { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 80; display: block; cursor: default; content: " "; background: transparent; }
-
-.details-overlay-dark[open] > summary::before { z-index: 99; background: rgba(27, 31, 35, 0.5); }
-
-.flex-row { flex-direction: row !important; }
-
-.flex-row-reverse { flex-direction: row-reverse !important; }
-
-.flex-column { flex-direction: column !important; }
-
-.flex-wrap { flex-wrap: wrap !important; }
-
-.flex-nowrap { flex-wrap: nowrap !important; }
-
-.flex-justify-start { justify-content: flex-start !important; }
-
-.flex-justify-end { justify-content: flex-end !important; }
-
-.flex-justify-center { justify-content: center !important; }
-
-.flex-justify-between { justify-content: space-between !important; }
-
-.flex-justify-around { justify-content: space-around !important; }
-
-.flex-items-start { align-items: flex-start !important; }
-
-.flex-items-end { align-items: flex-end !important; }
-
-.flex-items-center { align-items: center !important; }
-
-.flex-items-baseline { align-items: baseline !important; }
-
-.flex-items-stretch { align-items: stretch !important; }
-
-.flex-content-start { align-content: flex-start !important; }
-
-.flex-content-end { align-content: flex-end !important; }
-
-.flex-content-center { align-content: center !important; }
-
-.flex-content-between { align-content: space-between !important; }
-
-.flex-content-around { align-content: space-around !important; }
-
-.flex-content-stretch { align-content: stretch !important; }
-
-.flex-auto { flex: 1 1 auto !important; }
-
-.flex-shrink-0 { flex-shrink: 0 !important; }
-
-.flex-self-auto { align-self: auto !important; }
-
-.flex-self-start { align-self: flex-start !important; }
-
-.flex-self-end { align-self: flex-end !important; }
-
-.flex-self-center { align-self: center !important; }
-
-.flex-self-baseline { align-self: baseline !important; }
-
-.flex-self-stretch { align-self: stretch !important; }
-
-.flex-item-equal { flex-grow: 1; flex-basis: 0; }
-
-@media (min-width: 544px) { .flex-sm-row { flex-direction: row !important; }
- .flex-sm-row-reverse { flex-direction: row-reverse !important; }
- .flex-sm-column { flex-direction: column !important; }
- .flex-sm-wrap { flex-wrap: wrap !important; }
- .flex-sm-nowrap { flex-wrap: nowrap !important; }
- .flex-sm-justify-start { justify-content: flex-start !important; }
- .flex-sm-justify-end { justify-content: flex-end !important; }
- .flex-sm-justify-center { justify-content: center !important; }
- .flex-sm-justify-between { justify-content: space-between !important; }
- .flex-sm-justify-around { justify-content: space-around !important; }
- .flex-sm-items-start { align-items: flex-start !important; }
- .flex-sm-items-end { align-items: flex-end !important; }
- .flex-sm-items-center { align-items: center !important; }
- .flex-sm-items-baseline { align-items: baseline !important; }
- .flex-sm-items-stretch { align-items: stretch !important; }
- .flex-sm-content-start { align-content: flex-start !important; }
- .flex-sm-content-end { align-content: flex-end !important; }
- .flex-sm-content-center { align-content: center !important; }
- .flex-sm-content-between { align-content: space-between !important; }
- .flex-sm-content-around { align-content: space-around !important; }
- .flex-sm-content-stretch { align-content: stretch !important; }
- .flex-sm-auto { flex: 1 1 auto !important; }
- .flex-sm-shrink-0 { flex-shrink: 0 !important; }
- .flex-sm-self-auto { align-self: auto !important; }
- .flex-sm-self-start { align-self: flex-start !important; }
- .flex-sm-self-end { align-self: flex-end !important; }
- .flex-sm-self-center { align-self: center !important; }
- .flex-sm-self-baseline { align-self: baseline !important; }
- .flex-sm-self-stretch { align-self: stretch !important; }
- .flex-sm-item-equal { flex-grow: 1; flex-basis: 0; } }
-@media (min-width: 768px) { .flex-md-row { flex-direction: row !important; }
- .flex-md-row-reverse { flex-direction: row-reverse !important; }
- .flex-md-column { flex-direction: column !important; }
- .flex-md-wrap { flex-wrap: wrap !important; }
- .flex-md-nowrap { flex-wrap: nowrap !important; }
- .flex-md-justify-start { justify-content: flex-start !important; }
- .flex-md-justify-end { justify-content: flex-end !important; }
- .flex-md-justify-center { justify-content: center !important; }
- .flex-md-justify-between { justify-content: space-between !important; }
- .flex-md-justify-around { justify-content: space-around !important; }
- .flex-md-items-start { align-items: flex-start !important; }
- .flex-md-items-end { align-items: flex-end !important; }
- .flex-md-items-center { align-items: center !important; }
- .flex-md-items-baseline { align-items: baseline !important; }
- .flex-md-items-stretch { align-items: stretch !important; }
- .flex-md-content-start { align-content: flex-start !important; }
- .flex-md-content-end { align-content: flex-end !important; }
- .flex-md-content-center { align-content: center !important; }
- .flex-md-content-between { align-content: space-between !important; }
- .flex-md-content-around { align-content: space-around !important; }
- .flex-md-content-stretch { align-content: stretch !important; }
- .flex-md-auto { flex: 1 1 auto !important; }
- .flex-md-shrink-0 { flex-shrink: 0 !important; }
- .flex-md-self-auto { align-self: auto !important; }
- .flex-md-self-start { align-self: flex-start !important; }
- .flex-md-self-end { align-self: flex-end !important; }
- .flex-md-self-center { align-self: center !important; }
- .flex-md-self-baseline { align-self: baseline !important; }
- .flex-md-self-stretch { align-self: stretch !important; }
- .flex-md-item-equal { flex-grow: 1; flex-basis: 0; } }
-@media (min-width: 1012px) { .flex-lg-row { flex-direction: row !important; }
- .flex-lg-row-reverse { flex-direction: row-reverse !important; }
- .flex-lg-column { flex-direction: column !important; }
- .flex-lg-wrap { flex-wrap: wrap !important; }
- .flex-lg-nowrap { flex-wrap: nowrap !important; }
- .flex-lg-justify-start { justify-content: flex-start !important; }
- .flex-lg-justify-end { justify-content: flex-end !important; }
- .flex-lg-justify-center { justify-content: center !important; }
- .flex-lg-justify-between { justify-content: space-between !important; }
- .flex-lg-justify-around { justify-content: space-around !important; }
- .flex-lg-items-start { align-items: flex-start !important; }
- .flex-lg-items-end { align-items: flex-end !important; }
- .flex-lg-items-center { align-items: center !important; }
- .flex-lg-items-baseline { align-items: baseline !important; }
- .flex-lg-items-stretch { align-items: stretch !important; }
- .flex-lg-content-start { align-content: flex-start !important; }
- .flex-lg-content-end { align-content: flex-end !important; }
- .flex-lg-content-center { align-content: center !important; }
- .flex-lg-content-between { align-content: space-between !important; }
- .flex-lg-content-around { align-content: space-around !important; }
- .flex-lg-content-stretch { align-content: stretch !important; }
- .flex-lg-auto { flex: 1 1 auto !important; }
- .flex-lg-shrink-0 { flex-shrink: 0 !important; }
- .flex-lg-self-auto { align-self: auto !important; }
- .flex-lg-self-start { align-self: flex-start !important; }
- .flex-lg-self-end { align-self: flex-end !important; }
- .flex-lg-self-center { align-self: center !important; }
- .flex-lg-self-baseline { align-self: baseline !important; }
- .flex-lg-self-stretch { align-self: stretch !important; }
- .flex-lg-item-equal { flex-grow: 1; flex-basis: 0; } }
-@media (min-width: 1280px) { .flex-xl-row { flex-direction: row !important; }
- .flex-xl-row-reverse { flex-direction: row-reverse !important; }
- .flex-xl-column { flex-direction: column !important; }
- .flex-xl-wrap { flex-wrap: wrap !important; }
- .flex-xl-nowrap { flex-wrap: nowrap !important; }
- .flex-xl-justify-start { justify-content: flex-start !important; }
- .flex-xl-justify-end { justify-content: flex-end !important; }
- .flex-xl-justify-center { justify-content: center !important; }
- .flex-xl-justify-between { justify-content: space-between !important; }
- .flex-xl-justify-around { justify-content: space-around !important; }
- .flex-xl-items-start { align-items: flex-start !important; }
- .flex-xl-items-end { align-items: flex-end !important; }
- .flex-xl-items-center { align-items: center !important; }
- .flex-xl-items-baseline { align-items: baseline !important; }
- .flex-xl-items-stretch { align-items: stretch !important; }
- .flex-xl-content-start { align-content: flex-start !important; }
- .flex-xl-content-end { align-content: flex-end !important; }
- .flex-xl-content-center { align-content: center !important; }
- .flex-xl-content-between { align-content: space-between !important; }
- .flex-xl-content-around { align-content: space-around !important; }
- .flex-xl-content-stretch { align-content: stretch !important; }
- .flex-xl-auto { flex: 1 1 auto !important; }
- .flex-xl-shrink-0 { flex-shrink: 0 !important; }
- .flex-xl-self-auto { align-self: auto !important; }
- .flex-xl-self-start { align-self: flex-start !important; }
- .flex-xl-self-end { align-self: flex-end !important; }
- .flex-xl-self-center { align-self: center !important; }
- .flex-xl-self-baseline { align-self: baseline !important; }
- .flex-xl-self-stretch { align-self: stretch !important; }
- .flex-xl-item-equal { flex-grow: 1; flex-basis: 0; } }
-/* Set position to static */
-.position-static { position: static !important; }
-
-/* Set position to relative */
-.position-relative { position: relative !important; }
-
-/* Set position to absolute */
-.position-absolute { position: absolute !important; }
-
-/* Set position to fixed */
-.position-fixed { position: fixed !important; }
-
-/* Set top 0 */
-.top-0 { top: 0 !important; }
-
-/* Set right 0 */
-.right-0 { right: 0 !important; }
-
-/* Set bottom 0 */
-.bottom-0 { bottom: 0 !important; }
-
-/* Set left 0 */
-.left-0 { left: 0 !important; }
-
-/* Vertical align middle */
-.v-align-middle { vertical-align: middle !important; }
-
-/* Vertical align top */
-.v-align-top { vertical-align: top !important; }
-
-/* Vertical align bottom */
-.v-align-bottom { vertical-align: bottom !important; }
-
-/* Vertical align to the top of the text */
-.v-align-text-top { vertical-align: text-top !important; }
-
-/* Vertical align to the bottom of the text */
-.v-align-text-bottom { vertical-align: text-bottom !important; }
-
-/* Vertical align to the parent's baseline */
-.v-align-baseline { vertical-align: baseline !important; }
-
-/* Set the overflow hidden */
-.overflow-hidden { overflow: hidden !important; }
-
-/* Set the overflow scroll */
-.overflow-scroll { overflow: scroll !important; }
-
-/* Set the overflow auto */
-.overflow-auto { overflow: auto !important; }
-
-/* Clear floats around the element */
-.clearfix::before { display: table; content: ""; }
-.clearfix::after { display: table; clear: both; content: ""; }
-
-/* Float to the left */
-.float-left { float: left !important; }
-
-/* Float to the right */
-.float-right { float: right !important; }
-
-/* No float */
-.float-none { float: none !important; }
-
-@media (min-width: 544px) { /* Float to the left */
- .float-sm-left { float: left !important; }
- /* Float to the right */
- .float-sm-right { float: right !important; }
- /* No float */
- .float-sm-none { float: none !important; } }
-@media (min-width: 768px) { /* Float to the left */
- .float-md-left { float: left !important; }
- /* Float to the right */
- .float-md-right { float: right !important; }
- /* No float */
- .float-md-none { float: none !important; } }
-@media (min-width: 1012px) { /* Float to the left */
- .float-lg-left { float: left !important; }
- /* Float to the right */
- .float-lg-right { float: right !important; }
- /* No float */
- .float-lg-none { float: none !important; } }
-@media (min-width: 1280px) { /* Float to the left */
- .float-xl-left { float: left !important; }
- /* Float to the right */
- .float-xl-right { float: right !important; }
- /* No float */
- .float-xl-none { float: none !important; } }
-/* Max width 100% */
-.width-fit { max-width: 100% !important; }
-
-/* Set the width to 100% */
-.width-full { width: 100% !important; }
-
-/* Max height 100% */
-.height-fit { max-height: 100% !important; }
-
-/* Set the height to 100% */
-.height-full { height: 100% !important; }
-
-/* Remove min-width from element */
-.min-width-0 { min-width: 0 !important; }
-
-/* Set the direction to rtl */
-.direction-rtl { direction: rtl !important; }
-
-/* Set the direction to ltr */
-.direction-ltr { direction: ltr !important; }
-
-@media (min-width: 544px) { /* Set the direction to rtl */
- .direction-sm-rtl { direction: rtl !important; }
- /* Set the direction to ltr */
- .direction-sm-ltr { direction: ltr !important; } }
-@media (min-width: 768px) { /* Set the direction to rtl */
- .direction-md-rtl { direction: rtl !important; }
- /* Set the direction to ltr */
- .direction-md-ltr { direction: ltr !important; } }
-@media (min-width: 1012px) { /* Set the direction to rtl */
- .direction-lg-rtl { direction: rtl !important; }
- /* Set the direction to ltr */
- .direction-lg-ltr { direction: ltr !important; } }
-@media (min-width: 1280px) { /* Set the direction to rtl */
- .direction-xl-rtl { direction: rtl !important; }
- /* Set the direction to ltr */
- .direction-xl-ltr { direction: ltr !important; } }
-/* Set a $size margin to all sides at $breakpoint */
-.m-0 { margin: 0 !important; }
-
-/* Set a $size margin on the top at $breakpoint */
-.mt-0 { margin-top: 0 !important; }
-
-/* Set a $size margin on the right at $breakpoint */
-.mr-0 { margin-right: 0 !important; }
-
-/* Set a $size margin on the bottom at $breakpoint */
-.mb-0 { margin-bottom: 0 !important; }
-
-/* Set a $size margin on the left at $breakpoint */
-.ml-0 { margin-left: 0 !important; }
-
-/* Set a $size margin on the left & right at $breakpoint */
-.mx-0 { margin-right: 0 !important; margin-left: 0 !important; }
-
-/* Set a $size margin on the top & bottom at $breakpoint */
-.my-0 { margin-top: 0 !important; margin-bottom: 0 !important; }
-
-/* Set a $size margin to all sides at $breakpoint */
-.m-1 { margin: 4px !important; }
-
-/* Set a $size margin on the top at $breakpoint */
-.mt-1 { margin-top: 4px !important; }
-
-/* Set a $size margin on the right at $breakpoint */
-.mr-1 { margin-right: 4px !important; }
-
-/* Set a $size margin on the bottom at $breakpoint */
-.mb-1 { margin-bottom: 4px !important; }
-
-/* Set a $size margin on the left at $breakpoint */
-.ml-1 { margin-left: 4px !important; }
-
-/* Set a negative $size margin on top at $breakpoint */
-.mt-n1 { margin-top: -4px !important; }
-
-/* Set a negative $size margin on the right at $breakpoint */
-.mr-n1 { margin-right: -4px !important; }
-
-/* Set a negative $size margin on the bottom at $breakpoint */
-.mb-n1 { margin-bottom: -4px !important; }
-
-/* Set a negative $size margin on the left at $breakpoint */
-.ml-n1 { margin-left: -4px !important; }
-
-/* Set a $size margin on the left & right at $breakpoint */
-.mx-1 { margin-right: 4px !important; margin-left: 4px !important; }
-
-/* Set a $size margin on the top & bottom at $breakpoint */
-.my-1 { margin-top: 4px !important; margin-bottom: 4px !important; }
-
-/* Set a $size margin to all sides at $breakpoint */
-.m-2 { margin: 8px !important; }
-
-/* Set a $size margin on the top at $breakpoint */
-.mt-2 { margin-top: 8px !important; }
-
-/* Set a $size margin on the right at $breakpoint */
-.mr-2 { margin-right: 8px !important; }
-
-/* Set a $size margin on the bottom at $breakpoint */
-.mb-2 { margin-bottom: 8px !important; }
-
-/* Set a $size margin on the left at $breakpoint */
-.ml-2 { margin-left: 8px !important; }
-
-/* Set a negative $size margin on top at $breakpoint */
-.mt-n2 { margin-top: -8px !important; }
-
-/* Set a negative $size margin on the right at $breakpoint */
-.mr-n2 { margin-right: -8px !important; }
-
-/* Set a negative $size margin on the bottom at $breakpoint */
-.mb-n2 { margin-bottom: -8px !important; }
-
-/* Set a negative $size margin on the left at $breakpoint */
-.ml-n2 { margin-left: -8px !important; }
-
-/* Set a $size margin on the left & right at $breakpoint */
-.mx-2 { margin-right: 8px !important; margin-left: 8px !important; }
-
-/* Set a $size margin on the top & bottom at $breakpoint */
-.my-2 { margin-top: 8px !important; margin-bottom: 8px !important; }
-
-/* Set a $size margin to all sides at $breakpoint */
-.m-3 { margin: 16px !important; }
-
-/* Set a $size margin on the top at $breakpoint */
-.mt-3 { margin-top: 16px !important; }
-
-/* Set a $size margin on the right at $breakpoint */
-.mr-3 { margin-right: 16px !important; }
-
-/* Set a $size margin on the bottom at $breakpoint */
-.mb-3 { margin-bottom: 16px !important; }
-
-/* Set a $size margin on the left at $breakpoint */
-.ml-3 { margin-left: 16px !important; }
-
-/* Set a negative $size margin on top at $breakpoint */
-.mt-n3 { margin-top: -16px !important; }
-
-/* Set a negative $size margin on the right at $breakpoint */
-.mr-n3 { margin-right: -16px !important; }
-
-/* Set a negative $size margin on the bottom at $breakpoint */
-.mb-n3 { margin-bottom: -16px !important; }
-
-/* Set a negative $size margin on the left at $breakpoint */
-.ml-n3 { margin-left: -16px !important; }
-
-/* Set a $size margin on the left & right at $breakpoint */
-.mx-3 { margin-right: 16px !important; margin-left: 16px !important; }
-
-/* Set a $size margin on the top & bottom at $breakpoint */
-.my-3 { margin-top: 16px !important; margin-bottom: 16px !important; }
-
-/* Set a $size margin to all sides at $breakpoint */
-.m-4 { margin: 24px !important; }
-
-/* Set a $size margin on the top at $breakpoint */
-.mt-4 { margin-top: 24px !important; }
-
-/* Set a $size margin on the right at $breakpoint */
-.mr-4 { margin-right: 24px !important; }
-
-/* Set a $size margin on the bottom at $breakpoint */
-.mb-4 { margin-bottom: 24px !important; }
-
-/* Set a $size margin on the left at $breakpoint */
-.ml-4 { margin-left: 24px !important; }
-
-/* Set a negative $size margin on top at $breakpoint */
-.mt-n4 { margin-top: -24px !important; }
-
-/* Set a negative $size margin on the right at $breakpoint */
-.mr-n4 { margin-right: -24px !important; }
-
-/* Set a negative $size margin on the bottom at $breakpoint */
-.mb-n4 { margin-bottom: -24px !important; }
-
-/* Set a negative $size margin on the left at $breakpoint */
-.ml-n4 { margin-left: -24px !important; }
-
-/* Set a $size margin on the left & right at $breakpoint */
-.mx-4 { margin-right: 24px !important; margin-left: 24px !important; }
-
-/* Set a $size margin on the top & bottom at $breakpoint */
-.my-4 { margin-top: 24px !important; margin-bottom: 24px !important; }
-
-/* Set a $size margin to all sides at $breakpoint */
-.m-5 { margin: 32px !important; }
-
-/* Set a $size margin on the top at $breakpoint */
-.mt-5 { margin-top: 32px !important; }
-
-/* Set a $size margin on the right at $breakpoint */
-.mr-5 { margin-right: 32px !important; }
-
-/* Set a $size margin on the bottom at $breakpoint */
-.mb-5 { margin-bottom: 32px !important; }
-
-/* Set a $size margin on the left at $breakpoint */
-.ml-5 { margin-left: 32px !important; }
-
-/* Set a negative $size margin on top at $breakpoint */
-.mt-n5 { margin-top: -32px !important; }
-
-/* Set a negative $size margin on the right at $breakpoint */
-.mr-n5 { margin-right: -32px !important; }
-
-/* Set a negative $size margin on the bottom at $breakpoint */
-.mb-n5 { margin-bottom: -32px !important; }
-
-/* Set a negative $size margin on the left at $breakpoint */
-.ml-n5 { margin-left: -32px !important; }
-
-/* Set a $size margin on the left & right at $breakpoint */
-.mx-5 { margin-right: 32px !important; margin-left: 32px !important; }
-
-/* Set a $size margin on the top & bottom at $breakpoint */
-.my-5 { margin-top: 32px !important; margin-bottom: 32px !important; }
-
-/* Set a $size margin to all sides at $breakpoint */
-.m-6 { margin: 40px !important; }
-
-/* Set a $size margin on the top at $breakpoint */
-.mt-6 { margin-top: 40px !important; }
-
-/* Set a $size margin on the right at $breakpoint */
-.mr-6 { margin-right: 40px !important; }
-
-/* Set a $size margin on the bottom at $breakpoint */
-.mb-6 { margin-bottom: 40px !important; }
-
-/* Set a $size margin on the left at $breakpoint */
-.ml-6 { margin-left: 40px !important; }
-
-/* Set a negative $size margin on top at $breakpoint */
-.mt-n6 { margin-top: -40px !important; }
-
-/* Set a negative $size margin on the right at $breakpoint */
-.mr-n6 { margin-right: -40px !important; }
-
-/* Set a negative $size margin on the bottom at $breakpoint */
-.mb-n6 { margin-bottom: -40px !important; }
-
-/* Set a negative $size margin on the left at $breakpoint */
-.ml-n6 { margin-left: -40px !important; }
-
-/* Set a $size margin on the left & right at $breakpoint */
-.mx-6 { margin-right: 40px !important; margin-left: 40px !important; }
-
-/* Set a $size margin on the top & bottom at $breakpoint */
-.my-6 { margin-top: 40px !important; margin-bottom: 40px !important; }
-
-/* responsive horizontal auto margins */
-.mx-auto { margin-right: auto !important; margin-left: auto !important; }
-
-@media (min-width: 544px) { /* Set a $size margin to all sides at $breakpoint */
- .m-sm-0 { margin: 0 !important; }
- /* Set a $size margin on the top at $breakpoint */
- .mt-sm-0 { margin-top: 0 !important; }
- /* Set a $size margin on the right at $breakpoint */
- .mr-sm-0 { margin-right: 0 !important; }
- /* Set a $size margin on the bottom at $breakpoint */
- .mb-sm-0 { margin-bottom: 0 !important; }
- /* Set a $size margin on the left at $breakpoint */
- .ml-sm-0 { margin-left: 0 !important; }
- /* Set a $size margin on the left & right at $breakpoint */
- .mx-sm-0 { margin-right: 0 !important; margin-left: 0 !important; }
- /* Set a $size margin on the top & bottom at $breakpoint */
- .my-sm-0 { margin-top: 0 !important; margin-bottom: 0 !important; }
- /* Set a $size margin to all sides at $breakpoint */
- .m-sm-1 { margin: 4px !important; }
- /* Set a $size margin on the top at $breakpoint */
- .mt-sm-1 { margin-top: 4px !important; }
- /* Set a $size margin on the right at $breakpoint */
- .mr-sm-1 { margin-right: 4px !important; }
- /* Set a $size margin on the bottom at $breakpoint */
- .mb-sm-1 { margin-bottom: 4px !important; }
- /* Set a $size margin on the left at $breakpoint */
- .ml-sm-1 { margin-left: 4px !important; }
- /* Set a negative $size margin on top at $breakpoint */
- .mt-sm-n1 { margin-top: -4px !important; }
- /* Set a negative $size margin on the right at $breakpoint */
- .mr-sm-n1 { margin-right: -4px !important; }
- /* Set a negative $size margin on the bottom at $breakpoint */
- .mb-sm-n1 { margin-bottom: -4px !important; }
- /* Set a negative $size margin on the left at $breakpoint */
- .ml-sm-n1 { margin-left: -4px !important; }
- /* Set a $size margin on the left & right at $breakpoint */
- .mx-sm-1 { margin-right: 4px !important; margin-left: 4px !important; }
- /* Set a $size margin on the top & bottom at $breakpoint */
- .my-sm-1 { margin-top: 4px !important; margin-bottom: 4px !important; }
- /* Set a $size margin to all sides at $breakpoint */
- .m-sm-2 { margin: 8px !important; }
- /* Set a $size margin on the top at $breakpoint */
- .mt-sm-2 { margin-top: 8px !important; }
- /* Set a $size margin on the right at $breakpoint */
- .mr-sm-2 { margin-right: 8px !important; }
- /* Set a $size margin on the bottom at $breakpoint */
- .mb-sm-2 { margin-bottom: 8px !important; }
- /* Set a $size margin on the left at $breakpoint */
- .ml-sm-2 { margin-left: 8px !important; }
- /* Set a negative $size margin on top at $breakpoint */
- .mt-sm-n2 { margin-top: -8px !important; }
- /* Set a negative $size margin on the right at $breakpoint */
- .mr-sm-n2 { margin-right: -8px !important; }
- /* Set a negative $size margin on the bottom at $breakpoint */
- .mb-sm-n2 { margin-bottom: -8px !important; }
- /* Set a negative $size margin on the left at $breakpoint */
- .ml-sm-n2 { margin-left: -8px !important; }
- /* Set a $size margin on the left & right at $breakpoint */
- .mx-sm-2 { margin-right: 8px !important; margin-left: 8px !important; }
- /* Set a $size margin on the top & bottom at $breakpoint */
- .my-sm-2 { margin-top: 8px !important; margin-bottom: 8px !important; }
- /* Set a $size margin to all sides at $breakpoint */
- .m-sm-3 { margin: 16px !important; }
- /* Set a $size margin on the top at $breakpoint */
- .mt-sm-3 { margin-top: 16px !important; }
- /* Set a $size margin on the right at $breakpoint */
- .mr-sm-3 { margin-right: 16px !important; }
- /* Set a $size margin on the bottom at $breakpoint */
- .mb-sm-3 { margin-bottom: 16px !important; }
- /* Set a $size margin on the left at $breakpoint */
- .ml-sm-3 { margin-left: 16px !important; }
- /* Set a negative $size margin on top at $breakpoint */
- .mt-sm-n3 { margin-top: -16px !important; }
- /* Set a negative $size margin on the right at $breakpoint */
- .mr-sm-n3 { margin-right: -16px !important; }
- /* Set a negative $size margin on the bottom at $breakpoint */
- .mb-sm-n3 { margin-bottom: -16px !important; }
- /* Set a negative $size margin on the left at $breakpoint */
- .ml-sm-n3 { margin-left: -16px !important; }
- /* Set a $size margin on the left & right at $breakpoint */
- .mx-sm-3 { margin-right: 16px !important; margin-left: 16px !important; }
- /* Set a $size margin on the top & bottom at $breakpoint */
- .my-sm-3 { margin-top: 16px !important; margin-bottom: 16px !important; }
- /* Set a $size margin to all sides at $breakpoint */
- .m-sm-4 { margin: 24px !important; }
- /* Set a $size margin on the top at $breakpoint */
- .mt-sm-4 { margin-top: 24px !important; }
- /* Set a $size margin on the right at $breakpoint */
- .mr-sm-4 { margin-right: 24px !important; }
- /* Set a $size margin on the bottom at $breakpoint */
- .mb-sm-4 { margin-bottom: 24px !important; }
- /* Set a $size margin on the left at $breakpoint */
- .ml-sm-4 { margin-left: 24px !important; }
- /* Set a negative $size margin on top at $breakpoint */
- .mt-sm-n4 { margin-top: -24px !important; }
- /* Set a negative $size margin on the right at $breakpoint */
- .mr-sm-n4 { margin-right: -24px !important; }
- /* Set a negative $size margin on the bottom at $breakpoint */
- .mb-sm-n4 { margin-bottom: -24px !important; }
- /* Set a negative $size margin on the left at $breakpoint */
- .ml-sm-n4 { margin-left: -24px !important; }
- /* Set a $size margin on the left & right at $breakpoint */
- .mx-sm-4 { margin-right: 24px !important; margin-left: 24px !important; }
- /* Set a $size margin on the top & bottom at $breakpoint */
- .my-sm-4 { margin-top: 24px !important; margin-bottom: 24px !important; }
- /* Set a $size margin to all sides at $breakpoint */
- .m-sm-5 { margin: 32px !important; }
- /* Set a $size margin on the top at $breakpoint */
- .mt-sm-5 { margin-top: 32px !important; }
- /* Set a $size margin on the right at $breakpoint */
- .mr-sm-5 { margin-right: 32px !important; }
- /* Set a $size margin on the bottom at $breakpoint */
- .mb-sm-5 { margin-bottom: 32px !important; }
- /* Set a $size margin on the left at $breakpoint */
- .ml-sm-5 { margin-left: 32px !important; }
- /* Set a negative $size margin on top at $breakpoint */
- .mt-sm-n5 { margin-top: -32px !important; }
- /* Set a negative $size margin on the right at $breakpoint */
- .mr-sm-n5 { margin-right: -32px !important; }
- /* Set a negative $size margin on the bottom at $breakpoint */
- .mb-sm-n5 { margin-bottom: -32px !important; }
- /* Set a negative $size margin on the left at $breakpoint */
- .ml-sm-n5 { margin-left: -32px !important; }
- /* Set a $size margin on the left & right at $breakpoint */
- .mx-sm-5 { margin-right: 32px !important; margin-left: 32px !important; }
- /* Set a $size margin on the top & bottom at $breakpoint */
- .my-sm-5 { margin-top: 32px !important; margin-bottom: 32px !important; }
- /* Set a $size margin to all sides at $breakpoint */
- .m-sm-6 { margin: 40px !important; }
- /* Set a $size margin on the top at $breakpoint */
- .mt-sm-6 { margin-top: 40px !important; }
- /* Set a $size margin on the right at $breakpoint */
- .mr-sm-6 { margin-right: 40px !important; }
- /* Set a $size margin on the bottom at $breakpoint */
- .mb-sm-6 { margin-bottom: 40px !important; }
- /* Set a $size margin on the left at $breakpoint */
- .ml-sm-6 { margin-left: 40px !important; }
- /* Set a negative $size margin on top at $breakpoint */
- .mt-sm-n6 { margin-top: -40px !important; }
- /* Set a negative $size margin on the right at $breakpoint */
- .mr-sm-n6 { margin-right: -40px !important; }
- /* Set a negative $size margin on the bottom at $breakpoint */
- .mb-sm-n6 { margin-bottom: -40px !important; }
- /* Set a negative $size margin on the left at $breakpoint */
- .ml-sm-n6 { margin-left: -40px !important; }
- /* Set a $size margin on the left & right at $breakpoint */
- .mx-sm-6 { margin-right: 40px !important; margin-left: 40px !important; }
- /* Set a $size margin on the top & bottom at $breakpoint */
- .my-sm-6 { margin-top: 40px !important; margin-bottom: 40px !important; }
- /* responsive horizontal auto margins */
- .mx-sm-auto { margin-right: auto !important; margin-left: auto !important; } }
-@media (min-width: 768px) { /* Set a $size margin to all sides at $breakpoint */
- .m-md-0 { margin: 0 !important; }
- /* Set a $size margin on the top at $breakpoint */
- .mt-md-0 { margin-top: 0 !important; }
- /* Set a $size margin on the right at $breakpoint */
- .mr-md-0 { margin-right: 0 !important; }
- /* Set a $size margin on the bottom at $breakpoint */
- .mb-md-0 { margin-bottom: 0 !important; }
- /* Set a $size margin on the left at $breakpoint */
- .ml-md-0 { margin-left: 0 !important; }
- /* Set a $size margin on the left & right at $breakpoint */
- .mx-md-0 { margin-right: 0 !important; margin-left: 0 !important; }
- /* Set a $size margin on the top & bottom at $breakpoint */
- .my-md-0 { margin-top: 0 !important; margin-bottom: 0 !important; }
- /* Set a $size margin to all sides at $breakpoint */
- .m-md-1 { margin: 4px !important; }
- /* Set a $size margin on the top at $breakpoint */
- .mt-md-1 { margin-top: 4px !important; }
- /* Set a $size margin on the right at $breakpoint */
- .mr-md-1 { margin-right: 4px !important; }
- /* Set a $size margin on the bottom at $breakpoint */
- .mb-md-1 { margin-bottom: 4px !important; }
- /* Set a $size margin on the left at $breakpoint */
- .ml-md-1 { margin-left: 4px !important; }
- /* Set a negative $size margin on top at $breakpoint */
- .mt-md-n1 { margin-top: -4px !important; }
- /* Set a negative $size margin on the right at $breakpoint */
- .mr-md-n1 { margin-right: -4px !important; }
- /* Set a negative $size margin on the bottom at $breakpoint */
- .mb-md-n1 { margin-bottom: -4px !important; }
- /* Set a negative $size margin on the left at $breakpoint */
- .ml-md-n1 { margin-left: -4px !important; }
- /* Set a $size margin on the left & right at $breakpoint */
- .mx-md-1 { margin-right: 4px !important; margin-left: 4px !important; }
- /* Set a $size margin on the top & bottom at $breakpoint */
- .my-md-1 { margin-top: 4px !important; margin-bottom: 4px !important; }
- /* Set a $size margin to all sides at $breakpoint */
- .m-md-2 { margin: 8px !important; }
- /* Set a $size margin on the top at $breakpoint */
- .mt-md-2 { margin-top: 8px !important; }
- /* Set a $size margin on the right at $breakpoint */
- .mr-md-2 { margin-right: 8px !important; }
- /* Set a $size margin on the bottom at $breakpoint */
- .mb-md-2 { margin-bottom: 8px !important; }
- /* Set a $size margin on the left at $breakpoint */
- .ml-md-2 { margin-left: 8px !important; }
- /* Set a negative $size margin on top at $breakpoint */
- .mt-md-n2 { margin-top: -8px !important; }
- /* Set a negative $size margin on the right at $breakpoint */
- .mr-md-n2 { margin-right: -8px !important; }
- /* Set a negative $size margin on the bottom at $breakpoint */
- .mb-md-n2 { margin-bottom: -8px !important; }
- /* Set a negative $size margin on the left at $breakpoint */
- .ml-md-n2 { margin-left: -8px !important; }
- /* Set a $size margin on the left & right at $breakpoint */
- .mx-md-2 { margin-right: 8px !important; margin-left: 8px !important; }
- /* Set a $size margin on the top & bottom at $breakpoint */
- .my-md-2 { margin-top: 8px !important; margin-bottom: 8px !important; }
- /* Set a $size margin to all sides at $breakpoint */
- .m-md-3 { margin: 16px !important; }
- /* Set a $size margin on the top at $breakpoint */
- .mt-md-3 { margin-top: 16px !important; }
- /* Set a $size margin on the right at $breakpoint */
- .mr-md-3 { margin-right: 16px !important; }
- /* Set a $size margin on the bottom at $breakpoint */
- .mb-md-3 { margin-bottom: 16px !important; }
- /* Set a $size margin on the left at $breakpoint */
- .ml-md-3 { margin-left: 16px !important; }
- /* Set a negative $size margin on top at $breakpoint */
- .mt-md-n3 { margin-top: -16px !important; }
- /* Set a negative $size margin on the right at $breakpoint */
- .mr-md-n3 { margin-right: -16px !important; }
- /* Set a negative $size margin on the bottom at $breakpoint */
- .mb-md-n3 { margin-bottom: -16px !important; }
- /* Set a negative $size margin on the left at $breakpoint */
- .ml-md-n3 { margin-left: -16px !important; }
- /* Set a $size margin on the left & right at $breakpoint */
- .mx-md-3 { margin-right: 16px !important; margin-left: 16px !important; }
- /* Set a $size margin on the top & bottom at $breakpoint */
- .my-md-3 { margin-top: 16px !important; margin-bottom: 16px !important; }
- /* Set a $size margin to all sides at $breakpoint */
- .m-md-4 { margin: 24px !important; }
- /* Set a $size margin on the top at $breakpoint */
- .mt-md-4 { margin-top: 24px !important; }
- /* Set a $size margin on the right at $breakpoint */
- .mr-md-4 { margin-right: 24px !important; }
- /* Set a $size margin on the bottom at $breakpoint */
- .mb-md-4 { margin-bottom: 24px !important; }
- /* Set a $size margin on the left at $breakpoint */
- .ml-md-4 { margin-left: 24px !important; }
- /* Set a negative $size margin on top at $breakpoint */
- .mt-md-n4 { margin-top: -24px !important; }
- /* Set a negative $size margin on the right at $breakpoint */
- .mr-md-n4 { margin-right: -24px !important; }
- /* Set a negative $size margin on the bottom at $breakpoint */
- .mb-md-n4 { margin-bottom: -24px !important; }
- /* Set a negative $size margin on the left at $breakpoint */
- .ml-md-n4 { margin-left: -24px !important; }
- /* Set a $size margin on the left & right at $breakpoint */
- .mx-md-4 { margin-right: 24px !important; margin-left: 24px !important; }
- /* Set a $size margin on the top & bottom at $breakpoint */
- .my-md-4 { margin-top: 24px !important; margin-bottom: 24px !important; }
- /* Set a $size margin to all sides at $breakpoint */
- .m-md-5 { margin: 32px !important; }
- /* Set a $size margin on the top at $breakpoint */
- .mt-md-5 { margin-top: 32px !important; }
- /* Set a $size margin on the right at $breakpoint */
- .mr-md-5 { margin-right: 32px !important; }
- /* Set a $size margin on the bottom at $breakpoint */
- .mb-md-5 { margin-bottom: 32px !important; }
- /* Set a $size margin on the left at $breakpoint */
- .ml-md-5 { margin-left: 32px !important; }
- /* Set a negative $size margin on top at $breakpoint */
- .mt-md-n5 { margin-top: -32px !important; }
- /* Set a negative $size margin on the right at $breakpoint */
- .mr-md-n5 { margin-right: -32px !important; }
- /* Set a negative $size margin on the bottom at $breakpoint */
- .mb-md-n5 { margin-bottom: -32px !important; }
- /* Set a negative $size margin on the left at $breakpoint */
- .ml-md-n5 { margin-left: -32px !important; }
- /* Set a $size margin on the left & right at $breakpoint */
- .mx-md-5 { margin-right: 32px !important; margin-left: 32px !important; }
- /* Set a $size margin on the top & bottom at $breakpoint */
- .my-md-5 { margin-top: 32px !important; margin-bottom: 32px !important; }
- /* Set a $size margin to all sides at $breakpoint */
- .m-md-6 { margin: 40px !important; }
- /* Set a $size margin on the top at $breakpoint */
- .mt-md-6 { margin-top: 40px !important; }
- /* Set a $size margin on the right at $breakpoint */
- .mr-md-6 { margin-right: 40px !important; }
- /* Set a $size margin on the bottom at $breakpoint */
- .mb-md-6 { margin-bottom: 40px !important; }
- /* Set a $size margin on the left at $breakpoint */
- .ml-md-6 { margin-left: 40px !important; }
- /* Set a negative $size margin on top at $breakpoint */
- .mt-md-n6 { margin-top: -40px !important; }
- /* Set a negative $size margin on the right at $breakpoint */
- .mr-md-n6 { margin-right: -40px !important; }
- /* Set a negative $size margin on the bottom at $breakpoint */
- .mb-md-n6 { margin-bottom: -40px !important; }
- /* Set a negative $size margin on the left at $breakpoint */
- .ml-md-n6 { margin-left: -40px !important; }
- /* Set a $size margin on the left & right at $breakpoint */
- .mx-md-6 { margin-right: 40px !important; margin-left: 40px !important; }
- /* Set a $size margin on the top & bottom at $breakpoint */
- .my-md-6 { margin-top: 40px !important; margin-bottom: 40px !important; }
- /* responsive horizontal auto margins */
- .mx-md-auto { margin-right: auto !important; margin-left: auto !important; } }
-@media (min-width: 1012px) { /* Set a $size margin to all sides at $breakpoint */
- .m-lg-0 { margin: 0 !important; }
- /* Set a $size margin on the top at $breakpoint */
- .mt-lg-0 { margin-top: 0 !important; }
- /* Set a $size margin on the right at $breakpoint */
- .mr-lg-0 { margin-right: 0 !important; }
- /* Set a $size margin on the bottom at $breakpoint */
- .mb-lg-0 { margin-bottom: 0 !important; }
- /* Set a $size margin on the left at $breakpoint */
- .ml-lg-0 { margin-left: 0 !important; }
- /* Set a $size margin on the left & right at $breakpoint */
- .mx-lg-0 { margin-right: 0 !important; margin-left: 0 !important; }
- /* Set a $size margin on the top & bottom at $breakpoint */
- .my-lg-0 { margin-top: 0 !important; margin-bottom: 0 !important; }
- /* Set a $size margin to all sides at $breakpoint */
- .m-lg-1 { margin: 4px !important; }
- /* Set a $size margin on the top at $breakpoint */
- .mt-lg-1 { margin-top: 4px !important; }
- /* Set a $size margin on the right at $breakpoint */
- .mr-lg-1 { margin-right: 4px !important; }
- /* Set a $size margin on the bottom at $breakpoint */
- .mb-lg-1 { margin-bottom: 4px !important; }
- /* Set a $size margin on the left at $breakpoint */
- .ml-lg-1 { margin-left: 4px !important; }
- /* Set a negative $size margin on top at $breakpoint */
- .mt-lg-n1 { margin-top: -4px !important; }
- /* Set a negative $size margin on the right at $breakpoint */
- .mr-lg-n1 { margin-right: -4px !important; }
- /* Set a negative $size margin on the bottom at $breakpoint */
- .mb-lg-n1 { margin-bottom: -4px !important; }
- /* Set a negative $size margin on the left at $breakpoint */
- .ml-lg-n1 { margin-left: -4px !important; }
- /* Set a $size margin on the left & right at $breakpoint */
- .mx-lg-1 { margin-right: 4px !important; margin-left: 4px !important; }
- /* Set a $size margin on the top & bottom at $breakpoint */
- .my-lg-1 { margin-top: 4px !important; margin-bottom: 4px !important; }
- /* Set a $size margin to all sides at $breakpoint */
- .m-lg-2 { margin: 8px !important; }
- /* Set a $size margin on the top at $breakpoint */
- .mt-lg-2 { margin-top: 8px !important; }
- /* Set a $size margin on the right at $breakpoint */
- .mr-lg-2 { margin-right: 8px !important; }
- /* Set a $size margin on the bottom at $breakpoint */
- .mb-lg-2 { margin-bottom: 8px !important; }
- /* Set a $size margin on the left at $breakpoint */
- .ml-lg-2 { margin-left: 8px !important; }
- /* Set a negative $size margin on top at $breakpoint */
- .mt-lg-n2 { margin-top: -8px !important; }
- /* Set a negative $size margin on the right at $breakpoint */
- .mr-lg-n2 { margin-right: -8px !important; }
- /* Set a negative $size margin on the bottom at $breakpoint */
- .mb-lg-n2 { margin-bottom: -8px !important; }
- /* Set a negative $size margin on the left at $breakpoint */
- .ml-lg-n2 { margin-left: -8px !important; }
- /* Set a $size margin on the left & right at $breakpoint */
- .mx-lg-2 { margin-right: 8px !important; margin-left: 8px !important; }
- /* Set a $size margin on the top & bottom at $breakpoint */
- .my-lg-2 { margin-top: 8px !important; margin-bottom: 8px !important; }
- /* Set a $size margin to all sides at $breakpoint */
- .m-lg-3 { margin: 16px !important; }
- /* Set a $size margin on the top at $breakpoint */
- .mt-lg-3 { margin-top: 16px !important; }
- /* Set a $size margin on the right at $breakpoint */
- .mr-lg-3 { margin-right: 16px !important; }
- /* Set a $size margin on the bottom at $breakpoint */
- .mb-lg-3 { margin-bottom: 16px !important; }
- /* Set a $size margin on the left at $breakpoint */
- .ml-lg-3 { margin-left: 16px !important; }
- /* Set a negative $size margin on top at $breakpoint */
- .mt-lg-n3 { margin-top: -16px !important; }
- /* Set a negative $size margin on the right at $breakpoint */
- .mr-lg-n3 { margin-right: -16px !important; }
- /* Set a negative $size margin on the bottom at $breakpoint */
- .mb-lg-n3 { margin-bottom: -16px !important; }
- /* Set a negative $size margin on the left at $breakpoint */
- .ml-lg-n3 { margin-left: -16px !important; }
- /* Set a $size margin on the left & right at $breakpoint */
- .mx-lg-3 { margin-right: 16px !important; margin-left: 16px !important; }
- /* Set a $size margin on the top & bottom at $breakpoint */
- .my-lg-3 { margin-top: 16px !important; margin-bottom: 16px !important; }
- /* Set a $size margin to all sides at $breakpoint */
- .m-lg-4 { margin: 24px !important; }
- /* Set a $size margin on the top at $breakpoint */
- .mt-lg-4 { margin-top: 24px !important; }
- /* Set a $size margin on the right at $breakpoint */
- .mr-lg-4 { margin-right: 24px !important; }
- /* Set a $size margin on the bottom at $breakpoint */
- .mb-lg-4 { margin-bottom: 24px !important; }
- /* Set a $size margin on the left at $breakpoint */
- .ml-lg-4 { margin-left: 24px !important; }
- /* Set a negative $size margin on top at $breakpoint */
- .mt-lg-n4 { margin-top: -24px !important; }
- /* Set a negative $size margin on the right at $breakpoint */
- .mr-lg-n4 { margin-right: -24px !important; }
- /* Set a negative $size margin on the bottom at $breakpoint */
- .mb-lg-n4 { margin-bottom: -24px !important; }
- /* Set a negative $size margin on the left at $breakpoint */
- .ml-lg-n4 { margin-left: -24px !important; }
- /* Set a $size margin on the left & right at $breakpoint */
- .mx-lg-4 { margin-right: 24px !important; margin-left: 24px !important; }
- /* Set a $size margin on the top & bottom at $breakpoint */
- .my-lg-4 { margin-top: 24px !important; margin-bottom: 24px !important; }
- /* Set a $size margin to all sides at $breakpoint */
- .m-lg-5 { margin: 32px !important; }
- /* Set a $size margin on the top at $breakpoint */
- .mt-lg-5 { margin-top: 32px !important; }
- /* Set a $size margin on the right at $breakpoint */
- .mr-lg-5 { margin-right: 32px !important; }
- /* Set a $size margin on the bottom at $breakpoint */
- .mb-lg-5 { margin-bottom: 32px !important; }
- /* Set a $size margin on the left at $breakpoint */
- .ml-lg-5 { margin-left: 32px !important; }
- /* Set a negative $size margin on top at $breakpoint */
- .mt-lg-n5 { margin-top: -32px !important; }
- /* Set a negative $size margin on the right at $breakpoint */
- .mr-lg-n5 { margin-right: -32px !important; }
- /* Set a negative $size margin on the bottom at $breakpoint */
- .mb-lg-n5 { margin-bottom: -32px !important; }
- /* Set a negative $size margin on the left at $breakpoint */
- .ml-lg-n5 { margin-left: -32px !important; }
- /* Set a $size margin on the left & right at $breakpoint */
- .mx-lg-5 { margin-right: 32px !important; margin-left: 32px !important; }
- /* Set a $size margin on the top & bottom at $breakpoint */
- .my-lg-5 { margin-top: 32px !important; margin-bottom: 32px !important; }
- /* Set a $size margin to all sides at $breakpoint */
- .m-lg-6 { margin: 40px !important; }
- /* Set a $size margin on the top at $breakpoint */
- .mt-lg-6 { margin-top: 40px !important; }
- /* Set a $size margin on the right at $breakpoint */
- .mr-lg-6 { margin-right: 40px !important; }
- /* Set a $size margin on the bottom at $breakpoint */
- .mb-lg-6 { margin-bottom: 40px !important; }
- /* Set a $size margin on the left at $breakpoint */
- .ml-lg-6 { margin-left: 40px !important; }
- /* Set a negative $size margin on top at $breakpoint */
- .mt-lg-n6 { margin-top: -40px !important; }
- /* Set a negative $size margin on the right at $breakpoint */
- .mr-lg-n6 { margin-right: -40px !important; }
- /* Set a negative $size margin on the bottom at $breakpoint */
- .mb-lg-n6 { margin-bottom: -40px !important; }
- /* Set a negative $size margin on the left at $breakpoint */
- .ml-lg-n6 { margin-left: -40px !important; }
- /* Set a $size margin on the left & right at $breakpoint */
- .mx-lg-6 { margin-right: 40px !important; margin-left: 40px !important; }
- /* Set a $size margin on the top & bottom at $breakpoint */
- .my-lg-6 { margin-top: 40px !important; margin-bottom: 40px !important; }
- /* responsive horizontal auto margins */
- .mx-lg-auto { margin-right: auto !important; margin-left: auto !important; } }
-@media (min-width: 1280px) { /* Set a $size margin to all sides at $breakpoint */
- .m-xl-0 { margin: 0 !important; }
- /* Set a $size margin on the top at $breakpoint */
- .mt-xl-0 { margin-top: 0 !important; }
- /* Set a $size margin on the right at $breakpoint */
- .mr-xl-0 { margin-right: 0 !important; }
- /* Set a $size margin on the bottom at $breakpoint */
- .mb-xl-0 { margin-bottom: 0 !important; }
- /* Set a $size margin on the left at $breakpoint */
- .ml-xl-0 { margin-left: 0 !important; }
- /* Set a $size margin on the left & right at $breakpoint */
- .mx-xl-0 { margin-right: 0 !important; margin-left: 0 !important; }
- /* Set a $size margin on the top & bottom at $breakpoint */
- .my-xl-0 { margin-top: 0 !important; margin-bottom: 0 !important; }
- /* Set a $size margin to all sides at $breakpoint */
- .m-xl-1 { margin: 4px !important; }
- /* Set a $size margin on the top at $breakpoint */
- .mt-xl-1 { margin-top: 4px !important; }
- /* Set a $size margin on the right at $breakpoint */
- .mr-xl-1 { margin-right: 4px !important; }
- /* Set a $size margin on the bottom at $breakpoint */
- .mb-xl-1 { margin-bottom: 4px !important; }
- /* Set a $size margin on the left at $breakpoint */
- .ml-xl-1 { margin-left: 4px !important; }
- /* Set a negative $size margin on top at $breakpoint */
- .mt-xl-n1 { margin-top: -4px !important; }
- /* Set a negative $size margin on the right at $breakpoint */
- .mr-xl-n1 { margin-right: -4px !important; }
- /* Set a negative $size margin on the bottom at $breakpoint */
- .mb-xl-n1 { margin-bottom: -4px !important; }
- /* Set a negative $size margin on the left at $breakpoint */
- .ml-xl-n1 { margin-left: -4px !important; }
- /* Set a $size margin on the left & right at $breakpoint */
- .mx-xl-1 { margin-right: 4px !important; margin-left: 4px !important; }
- /* Set a $size margin on the top & bottom at $breakpoint */
- .my-xl-1 { margin-top: 4px !important; margin-bottom: 4px !important; }
- /* Set a $size margin to all sides at $breakpoint */
- .m-xl-2 { margin: 8px !important; }
- /* Set a $size margin on the top at $breakpoint */
- .mt-xl-2 { margin-top: 8px !important; }
- /* Set a $size margin on the right at $breakpoint */
- .mr-xl-2 { margin-right: 8px !important; }
- /* Set a $size margin on the bottom at $breakpoint */
- .mb-xl-2 { margin-bottom: 8px !important; }
- /* Set a $size margin on the left at $breakpoint */
- .ml-xl-2 { margin-left: 8px !important; }
- /* Set a negative $size margin on top at $breakpoint */
- .mt-xl-n2 { margin-top: -8px !important; }
- /* Set a negative $size margin on the right at $breakpoint */
- .mr-xl-n2 { margin-right: -8px !important; }
- /* Set a negative $size margin on the bottom at $breakpoint */
- .mb-xl-n2 { margin-bottom: -8px !important; }
- /* Set a negative $size margin on the left at $breakpoint */
- .ml-xl-n2 { margin-left: -8px !important; }
- /* Set a $size margin on the left & right at $breakpoint */
- .mx-xl-2 { margin-right: 8px !important; margin-left: 8px !important; }
- /* Set a $size margin on the top & bottom at $breakpoint */
- .my-xl-2 { margin-top: 8px !important; margin-bottom: 8px !important; }
- /* Set a $size margin to all sides at $breakpoint */
- .m-xl-3 { margin: 16px !important; }
- /* Set a $size margin on the top at $breakpoint */
- .mt-xl-3 { margin-top: 16px !important; }
- /* Set a $size margin on the right at $breakpoint */
- .mr-xl-3 { margin-right: 16px !important; }
- /* Set a $size margin on the bottom at $breakpoint */
- .mb-xl-3 { margin-bottom: 16px !important; }
- /* Set a $size margin on the left at $breakpoint */
- .ml-xl-3 { margin-left: 16px !important; }
- /* Set a negative $size margin on top at $breakpoint */
- .mt-xl-n3 { margin-top: -16px !important; }
- /* Set a negative $size margin on the right at $breakpoint */
- .mr-xl-n3 { margin-right: -16px !important; }
- /* Set a negative $size margin on the bottom at $breakpoint */
- .mb-xl-n3 { margin-bottom: -16px !important; }
- /* Set a negative $size margin on the left at $breakpoint */
- .ml-xl-n3 { margin-left: -16px !important; }
- /* Set a $size margin on the left & right at $breakpoint */
- .mx-xl-3 { margin-right: 16px !important; margin-left: 16px !important; }
- /* Set a $size margin on the top & bottom at $breakpoint */
- .my-xl-3 { margin-top: 16px !important; margin-bottom: 16px !important; }
- /* Set a $size margin to all sides at $breakpoint */
- .m-xl-4 { margin: 24px !important; }
- /* Set a $size margin on the top at $breakpoint */
- .mt-xl-4 { margin-top: 24px !important; }
- /* Set a $size margin on the right at $breakpoint */
- .mr-xl-4 { margin-right: 24px !important; }
- /* Set a $size margin on the bottom at $breakpoint */
- .mb-xl-4 { margin-bottom: 24px !important; }
- /* Set a $size margin on the left at $breakpoint */
- .ml-xl-4 { margin-left: 24px !important; }
- /* Set a negative $size margin on top at $breakpoint */
- .mt-xl-n4 { margin-top: -24px !important; }
- /* Set a negative $size margin on the right at $breakpoint */
- .mr-xl-n4 { margin-right: -24px !important; }
- /* Set a negative $size margin on the bottom at $breakpoint */
- .mb-xl-n4 { margin-bottom: -24px !important; }
- /* Set a negative $size margin on the left at $breakpoint */
- .ml-xl-n4 { margin-left: -24px !important; }
- /* Set a $size margin on the left & right at $breakpoint */
- .mx-xl-4 { margin-right: 24px !important; margin-left: 24px !important; }
- /* Set a $size margin on the top & bottom at $breakpoint */
- .my-xl-4 { margin-top: 24px !important; margin-bottom: 24px !important; }
- /* Set a $size margin to all sides at $breakpoint */
- .m-xl-5 { margin: 32px !important; }
- /* Set a $size margin on the top at $breakpoint */
- .mt-xl-5 { margin-top: 32px !important; }
- /* Set a $size margin on the right at $breakpoint */
- .mr-xl-5 { margin-right: 32px !important; }
- /* Set a $size margin on the bottom at $breakpoint */
- .mb-xl-5 { margin-bottom: 32px !important; }
- /* Set a $size margin on the left at $breakpoint */
- .ml-xl-5 { margin-left: 32px !important; }
- /* Set a negative $size margin on top at $breakpoint */
- .mt-xl-n5 { margin-top: -32px !important; }
- /* Set a negative $size margin on the right at $breakpoint */
- .mr-xl-n5 { margin-right: -32px !important; }
- /* Set a negative $size margin on the bottom at $breakpoint */
- .mb-xl-n5 { margin-bottom: -32px !important; }
- /* Set a negative $size margin on the left at $breakpoint */
- .ml-xl-n5 { margin-left: -32px !important; }
- /* Set a $size margin on the left & right at $breakpoint */
- .mx-xl-5 { margin-right: 32px !important; margin-left: 32px !important; }
- /* Set a $size margin on the top & bottom at $breakpoint */
- .my-xl-5 { margin-top: 32px !important; margin-bottom: 32px !important; }
- /* Set a $size margin to all sides at $breakpoint */
- .m-xl-6 { margin: 40px !important; }
- /* Set a $size margin on the top at $breakpoint */
- .mt-xl-6 { margin-top: 40px !important; }
- /* Set a $size margin on the right at $breakpoint */
- .mr-xl-6 { margin-right: 40px !important; }
- /* Set a $size margin on the bottom at $breakpoint */
- .mb-xl-6 { margin-bottom: 40px !important; }
- /* Set a $size margin on the left at $breakpoint */
- .ml-xl-6 { margin-left: 40px !important; }
- /* Set a negative $size margin on top at $breakpoint */
- .mt-xl-n6 { margin-top: -40px !important; }
- /* Set a negative $size margin on the right at $breakpoint */
- .mr-xl-n6 { margin-right: -40px !important; }
- /* Set a negative $size margin on the bottom at $breakpoint */
- .mb-xl-n6 { margin-bottom: -40px !important; }
- /* Set a negative $size margin on the left at $breakpoint */
- .ml-xl-n6 { margin-left: -40px !important; }
- /* Set a $size margin on the left & right at $breakpoint */
- .mx-xl-6 { margin-right: 40px !important; margin-left: 40px !important; }
- /* Set a $size margin on the top & bottom at $breakpoint */
- .my-xl-6 { margin-top: 40px !important; margin-bottom: 40px !important; }
- /* responsive horizontal auto margins */
- .mx-xl-auto { margin-right: auto !important; margin-left: auto !important; } }
-/* Set a $size padding to all sides at $breakpoint */
-.p-0 { padding: 0 !important; }
-
-/* Set a $size padding to the top at $breakpoint */
-.pt-0 { padding-top: 0 !important; }
-
-/* Set a $size padding to the right at $breakpoint */
-.pr-0 { padding-right: 0 !important; }
-
-/* Set a $size padding to the bottom at $breakpoint */
-.pb-0 { padding-bottom: 0 !important; }
-
-/* Set a $size padding to the left at $breakpoint */
-.pl-0 { padding-left: 0 !important; }
-
-/* Set a $size padding to the left & right at $breakpoint */
-.px-0 { padding-right: 0 !important; padding-left: 0 !important; }
-
-/* Set a $size padding to the top & bottom at $breakpoint */
-.py-0 { padding-top: 0 !important; padding-bottom: 0 !important; }
-
-/* Set a $size padding to all sides at $breakpoint */
-.p-1 { padding: 4px !important; }
-
-/* Set a $size padding to the top at $breakpoint */
-.pt-1 { padding-top: 4px !important; }
-
-/* Set a $size padding to the right at $breakpoint */
-.pr-1 { padding-right: 4px !important; }
-
-/* Set a $size padding to the bottom at $breakpoint */
-.pb-1 { padding-bottom: 4px !important; }
-
-/* Set a $size padding to the left at $breakpoint */
-.pl-1 { padding-left: 4px !important; }
-
-/* Set a $size padding to the left & right at $breakpoint */
-.px-1 { padding-right: 4px !important; padding-left: 4px !important; }
-
-/* Set a $size padding to the top & bottom at $breakpoint */
-.py-1 { padding-top: 4px !important; padding-bottom: 4px !important; }
-
-/* Set a $size padding to all sides at $breakpoint */
-.p-2 { padding: 8px !important; }
-
-/* Set a $size padding to the top at $breakpoint */
-.pt-2 { padding-top: 8px !important; }
-
-/* Set a $size padding to the right at $breakpoint */
-.pr-2 { padding-right: 8px !important; }
-
-/* Set a $size padding to the bottom at $breakpoint */
-.pb-2 { padding-bottom: 8px !important; }
-
-/* Set a $size padding to the left at $breakpoint */
-.pl-2 { padding-left: 8px !important; }
-
-/* Set a $size padding to the left & right at $breakpoint */
-.px-2 { padding-right: 8px !important; padding-left: 8px !important; }
-
-/* Set a $size padding to the top & bottom at $breakpoint */
-.py-2 { padding-top: 8px !important; padding-bottom: 8px !important; }
-
-/* Set a $size padding to all sides at $breakpoint */
-.p-3 { padding: 16px !important; }
-
-/* Set a $size padding to the top at $breakpoint */
-.pt-3 { padding-top: 16px !important; }
-
-/* Set a $size padding to the right at $breakpoint */
-.pr-3 { padding-right: 16px !important; }
-
-/* Set a $size padding to the bottom at $breakpoint */
-.pb-3 { padding-bottom: 16px !important; }
-
-/* Set a $size padding to the left at $breakpoint */
-.pl-3 { padding-left: 16px !important; }
-
-/* Set a $size padding to the left & right at $breakpoint */
-.px-3 { padding-right: 16px !important; padding-left: 16px !important; }
-
-/* Set a $size padding to the top & bottom at $breakpoint */
-.py-3 { padding-top: 16px !important; padding-bottom: 16px !important; }
-
-/* Set a $size padding to all sides at $breakpoint */
-.p-4 { padding: 24px !important; }
-
-/* Set a $size padding to the top at $breakpoint */
-.pt-4 { padding-top: 24px !important; }
-
-/* Set a $size padding to the right at $breakpoint */
-.pr-4 { padding-right: 24px !important; }
-
-/* Set a $size padding to the bottom at $breakpoint */
-.pb-4 { padding-bottom: 24px !important; }
-
-/* Set a $size padding to the left at $breakpoint */
-.pl-4 { padding-left: 24px !important; }
-
-/* Set a $size padding to the left & right at $breakpoint */
-.px-4 { padding-right: 24px !important; padding-left: 24px !important; }
-
-/* Set a $size padding to the top & bottom at $breakpoint */
-.py-4 { padding-top: 24px !important; padding-bottom: 24px !important; }
-
-/* Set a $size padding to all sides at $breakpoint */
-.p-5 { padding: 32px !important; }
-
-/* Set a $size padding to the top at $breakpoint */
-.pt-5 { padding-top: 32px !important; }
-
-/* Set a $size padding to the right at $breakpoint */
-.pr-5 { padding-right: 32px !important; }
-
-/* Set a $size padding to the bottom at $breakpoint */
-.pb-5 { padding-bottom: 32px !important; }
-
-/* Set a $size padding to the left at $breakpoint */
-.pl-5 { padding-left: 32px !important; }
-
-/* Set a $size padding to the left & right at $breakpoint */
-.px-5 { padding-right: 32px !important; padding-left: 32px !important; }
-
-/* Set a $size padding to the top & bottom at $breakpoint */
-.py-5 { padding-top: 32px !important; padding-bottom: 32px !important; }
-
-/* Set a $size padding to all sides at $breakpoint */
-.p-6 { padding: 40px !important; }
-
-/* Set a $size padding to the top at $breakpoint */
-.pt-6 { padding-top: 40px !important; }
-
-/* Set a $size padding to the right at $breakpoint */
-.pr-6 { padding-right: 40px !important; }
-
-/* Set a $size padding to the bottom at $breakpoint */
-.pb-6 { padding-bottom: 40px !important; }
-
-/* Set a $size padding to the left at $breakpoint */
-.pl-6 { padding-left: 40px !important; }
-
-/* Set a $size padding to the left & right at $breakpoint */
-.px-6 { padding-right: 40px !important; padding-left: 40px !important; }
-
-/* Set a $size padding to the top & bottom at $breakpoint */
-.py-6 { padding-top: 40px !important; padding-bottom: 40px !important; }
-
-@media (min-width: 544px) { /* Set a $size padding to all sides at $breakpoint */
- .p-sm-0 { padding: 0 !important; }
- /* Set a $size padding to the top at $breakpoint */
- .pt-sm-0 { padding-top: 0 !important; }
- /* Set a $size padding to the right at $breakpoint */
- .pr-sm-0 { padding-right: 0 !important; }
- /* Set a $size padding to the bottom at $breakpoint */
- .pb-sm-0 { padding-bottom: 0 !important; }
- /* Set a $size padding to the left at $breakpoint */
- .pl-sm-0 { padding-left: 0 !important; }
- /* Set a $size padding to the left & right at $breakpoint */
- .px-sm-0 { padding-right: 0 !important; padding-left: 0 !important; }
- /* Set a $size padding to the top & bottom at $breakpoint */
- .py-sm-0 { padding-top: 0 !important; padding-bottom: 0 !important; }
- /* Set a $size padding to all sides at $breakpoint */
- .p-sm-1 { padding: 4px !important; }
- /* Set a $size padding to the top at $breakpoint */
- .pt-sm-1 { padding-top: 4px !important; }
- /* Set a $size padding to the right at $breakpoint */
- .pr-sm-1 { padding-right: 4px !important; }
- /* Set a $size padding to the bottom at $breakpoint */
- .pb-sm-1 { padding-bottom: 4px !important; }
- /* Set a $size padding to the left at $breakpoint */
- .pl-sm-1 { padding-left: 4px !important; }
- /* Set a $size padding to the left & right at $breakpoint */
- .px-sm-1 { padding-right: 4px !important; padding-left: 4px !important; }
- /* Set a $size padding to the top & bottom at $breakpoint */
- .py-sm-1 { padding-top: 4px !important; padding-bottom: 4px !important; }
- /* Set a $size padding to all sides at $breakpoint */
- .p-sm-2 { padding: 8px !important; }
- /* Set a $size padding to the top at $breakpoint */
- .pt-sm-2 { padding-top: 8px !important; }
- /* Set a $size padding to the right at $breakpoint */
- .pr-sm-2 { padding-right: 8px !important; }
- /* Set a $size padding to the bottom at $breakpoint */
- .pb-sm-2 { padding-bottom: 8px !important; }
- /* Set a $size padding to the left at $breakpoint */
- .pl-sm-2 { padding-left: 8px !important; }
- /* Set a $size padding to the left & right at $breakpoint */
- .px-sm-2 { padding-right: 8px !important; padding-left: 8px !important; }
- /* Set a $size padding to the top & bottom at $breakpoint */
- .py-sm-2 { padding-top: 8px !important; padding-bottom: 8px !important; }
- /* Set a $size padding to all sides at $breakpoint */
- .p-sm-3 { padding: 16px !important; }
- /* Set a $size padding to the top at $breakpoint */
- .pt-sm-3 { padding-top: 16px !important; }
- /* Set a $size padding to the right at $breakpoint */
- .pr-sm-3 { padding-right: 16px !important; }
- /* Set a $size padding to the bottom at $breakpoint */
- .pb-sm-3 { padding-bottom: 16px !important; }
- /* Set a $size padding to the left at $breakpoint */
- .pl-sm-3 { padding-left: 16px !important; }
- /* Set a $size padding to the left & right at $breakpoint */
- .px-sm-3 { padding-right: 16px !important; padding-left: 16px !important; }
- /* Set a $size padding to the top & bottom at $breakpoint */
- .py-sm-3 { padding-top: 16px !important; padding-bottom: 16px !important; }
- /* Set a $size padding to all sides at $breakpoint */
- .p-sm-4 { padding: 24px !important; }
- /* Set a $size padding to the top at $breakpoint */
- .pt-sm-4 { padding-top: 24px !important; }
- /* Set a $size padding to the right at $breakpoint */
- .pr-sm-4 { padding-right: 24px !important; }
- /* Set a $size padding to the bottom at $breakpoint */
- .pb-sm-4 { padding-bottom: 24px !important; }
- /* Set a $size padding to the left at $breakpoint */
- .pl-sm-4 { padding-left: 24px !important; }
- /* Set a $size padding to the left & right at $breakpoint */
- .px-sm-4 { padding-right: 24px !important; padding-left: 24px !important; }
- /* Set a $size padding to the top & bottom at $breakpoint */
- .py-sm-4 { padding-top: 24px !important; padding-bottom: 24px !important; }
- /* Set a $size padding to all sides at $breakpoint */
- .p-sm-5 { padding: 32px !important; }
- /* Set a $size padding to the top at $breakpoint */
- .pt-sm-5 { padding-top: 32px !important; }
- /* Set a $size padding to the right at $breakpoint */
- .pr-sm-5 { padding-right: 32px !important; }
- /* Set a $size padding to the bottom at $breakpoint */
- .pb-sm-5 { padding-bottom: 32px !important; }
- /* Set a $size padding to the left at $breakpoint */
- .pl-sm-5 { padding-left: 32px !important; }
- /* Set a $size padding to the left & right at $breakpoint */
- .px-sm-5 { padding-right: 32px !important; padding-left: 32px !important; }
- /* Set a $size padding to the top & bottom at $breakpoint */
- .py-sm-5 { padding-top: 32px !important; padding-bottom: 32px !important; }
- /* Set a $size padding to all sides at $breakpoint */
- .p-sm-6 { padding: 40px !important; }
- /* Set a $size padding to the top at $breakpoint */
- .pt-sm-6 { padding-top: 40px !important; }
- /* Set a $size padding to the right at $breakpoint */
- .pr-sm-6 { padding-right: 40px !important; }
- /* Set a $size padding to the bottom at $breakpoint */
- .pb-sm-6 { padding-bottom: 40px !important; }
- /* Set a $size padding to the left at $breakpoint */
- .pl-sm-6 { padding-left: 40px !important; }
- /* Set a $size padding to the left & right at $breakpoint */
- .px-sm-6 { padding-right: 40px !important; padding-left: 40px !important; }
- /* Set a $size padding to the top & bottom at $breakpoint */
- .py-sm-6 { padding-top: 40px !important; padding-bottom: 40px !important; } }
-@media (min-width: 768px) { /* Set a $size padding to all sides at $breakpoint */
- .p-md-0 { padding: 0 !important; }
- /* Set a $size padding to the top at $breakpoint */
- .pt-md-0 { padding-top: 0 !important; }
- /* Set a $size padding to the right at $breakpoint */
- .pr-md-0 { padding-right: 0 !important; }
- /* Set a $size padding to the bottom at $breakpoint */
- .pb-md-0 { padding-bottom: 0 !important; }
- /* Set a $size padding to the left at $breakpoint */
- .pl-md-0 { padding-left: 0 !important; }
- /* Set a $size padding to the left & right at $breakpoint */
- .px-md-0 { padding-right: 0 !important; padding-left: 0 !important; }
- /* Set a $size padding to the top & bottom at $breakpoint */
- .py-md-0 { padding-top: 0 !important; padding-bottom: 0 !important; }
- /* Set a $size padding to all sides at $breakpoint */
- .p-md-1 { padding: 4px !important; }
- /* Set a $size padding to the top at $breakpoint */
- .pt-md-1 { padding-top: 4px !important; }
- /* Set a $size padding to the right at $breakpoint */
- .pr-md-1 { padding-right: 4px !important; }
- /* Set a $size padding to the bottom at $breakpoint */
- .pb-md-1 { padding-bottom: 4px !important; }
- /* Set a $size padding to the left at $breakpoint */
- .pl-md-1 { padding-left: 4px !important; }
- /* Set a $size padding to the left & right at $breakpoint */
- .px-md-1 { padding-right: 4px !important; padding-left: 4px !important; }
- /* Set a $size padding to the top & bottom at $breakpoint */
- .py-md-1 { padding-top: 4px !important; padding-bottom: 4px !important; }
- /* Set a $size padding to all sides at $breakpoint */
- .p-md-2 { padding: 8px !important; }
- /* Set a $size padding to the top at $breakpoint */
- .pt-md-2 { padding-top: 8px !important; }
- /* Set a $size padding to the right at $breakpoint */
- .pr-md-2 { padding-right: 8px !important; }
- /* Set a $size padding to the bottom at $breakpoint */
- .pb-md-2 { padding-bottom: 8px !important; }
- /* Set a $size padding to the left at $breakpoint */
- .pl-md-2 { padding-left: 8px !important; }
- /* Set a $size padding to the left & right at $breakpoint */
- .px-md-2 { padding-right: 8px !important; padding-left: 8px !important; }
- /* Set a $size padding to the top & bottom at $breakpoint */
- .py-md-2 { padding-top: 8px !important; padding-bottom: 8px !important; }
- /* Set a $size padding to all sides at $breakpoint */
- .p-md-3 { padding: 16px !important; }
- /* Set a $size padding to the top at $breakpoint */
- .pt-md-3 { padding-top: 16px !important; }
- /* Set a $size padding to the right at $breakpoint */
- .pr-md-3 { padding-right: 16px !important; }
- /* Set a $size padding to the bottom at $breakpoint */
- .pb-md-3 { padding-bottom: 16px !important; }
- /* Set a $size padding to the left at $breakpoint */
- .pl-md-3 { padding-left: 16px !important; }
- /* Set a $size padding to the left & right at $breakpoint */
- .px-md-3 { padding-right: 16px !important; padding-left: 16px !important; }
- /* Set a $size padding to the top & bottom at $breakpoint */
- .py-md-3 { padding-top: 16px !important; padding-bottom: 16px !important; }
- /* Set a $size padding to all sides at $breakpoint */
- .p-md-4 { padding: 24px !important; }
- /* Set a $size padding to the top at $breakpoint */
- .pt-md-4 { padding-top: 24px !important; }
- /* Set a $size padding to the right at $breakpoint */
- .pr-md-4 { padding-right: 24px !important; }
- /* Set a $size padding to the bottom at $breakpoint */
- .pb-md-4 { padding-bottom: 24px !important; }
- /* Set a $size padding to the left at $breakpoint */
- .pl-md-4 { padding-left: 24px !important; }
- /* Set a $size padding to the left & right at $breakpoint */
- .px-md-4 { padding-right: 24px !important; padding-left: 24px !important; }
- /* Set a $size padding to the top & bottom at $breakpoint */
- .py-md-4 { padding-top: 24px !important; padding-bottom: 24px !important; }
- /* Set a $size padding to all sides at $breakpoint */
- .p-md-5 { padding: 32px !important; }
- /* Set a $size padding to the top at $breakpoint */
- .pt-md-5 { padding-top: 32px !important; }
- /* Set a $size padding to the right at $breakpoint */
- .pr-md-5 { padding-right: 32px !important; }
- /* Set a $size padding to the bottom at $breakpoint */
- .pb-md-5 { padding-bottom: 32px !important; }
- /* Set a $size padding to the left at $breakpoint */
- .pl-md-5 { padding-left: 32px !important; }
- /* Set a $size padding to the left & right at $breakpoint */
- .px-md-5 { padding-right: 32px !important; padding-left: 32px !important; }
- /* Set a $size padding to the top & bottom at $breakpoint */
- .py-md-5 { padding-top: 32px !important; padding-bottom: 32px !important; }
- /* Set a $size padding to all sides at $breakpoint */
- .p-md-6 { padding: 40px !important; }
- /* Set a $size padding to the top at $breakpoint */
- .pt-md-6 { padding-top: 40px !important; }
- /* Set a $size padding to the right at $breakpoint */
- .pr-md-6 { padding-right: 40px !important; }
- /* Set a $size padding to the bottom at $breakpoint */
- .pb-md-6 { padding-bottom: 40px !important; }
- /* Set a $size padding to the left at $breakpoint */
- .pl-md-6 { padding-left: 40px !important; }
- /* Set a $size padding to the left & right at $breakpoint */
- .px-md-6 { padding-right: 40px !important; padding-left: 40px !important; }
- /* Set a $size padding to the top & bottom at $breakpoint */
- .py-md-6 { padding-top: 40px !important; padding-bottom: 40px !important; } }
-@media (min-width: 1012px) { /* Set a $size padding to all sides at $breakpoint */
- .p-lg-0 { padding: 0 !important; }
- /* Set a $size padding to the top at $breakpoint */
- .pt-lg-0 { padding-top: 0 !important; }
- /* Set a $size padding to the right at $breakpoint */
- .pr-lg-0 { padding-right: 0 !important; }
- /* Set a $size padding to the bottom at $breakpoint */
- .pb-lg-0 { padding-bottom: 0 !important; }
- /* Set a $size padding to the left at $breakpoint */
- .pl-lg-0 { padding-left: 0 !important; }
- /* Set a $size padding to the left & right at $breakpoint */
- .px-lg-0 { padding-right: 0 !important; padding-left: 0 !important; }
- /* Set a $size padding to the top & bottom at $breakpoint */
- .py-lg-0 { padding-top: 0 !important; padding-bottom: 0 !important; }
- /* Set a $size padding to all sides at $breakpoint */
- .p-lg-1 { padding: 4px !important; }
- /* Set a $size padding to the top at $breakpoint */
- .pt-lg-1 { padding-top: 4px !important; }
- /* Set a $size padding to the right at $breakpoint */
- .pr-lg-1 { padding-right: 4px !important; }
- /* Set a $size padding to the bottom at $breakpoint */
- .pb-lg-1 { padding-bottom: 4px !important; }
- /* Set a $size padding to the left at $breakpoint */
- .pl-lg-1 { padding-left: 4px !important; }
- /* Set a $size padding to the left & right at $breakpoint */
- .px-lg-1 { padding-right: 4px !important; padding-left: 4px !important; }
- /* Set a $size padding to the top & bottom at $breakpoint */
- .py-lg-1 { padding-top: 4px !important; padding-bottom: 4px !important; }
- /* Set a $size padding to all sides at $breakpoint */
- .p-lg-2 { padding: 8px !important; }
- /* Set a $size padding to the top at $breakpoint */
- .pt-lg-2 { padding-top: 8px !important; }
- /* Set a $size padding to the right at $breakpoint */
- .pr-lg-2 { padding-right: 8px !important; }
- /* Set a $size padding to the bottom at $breakpoint */
- .pb-lg-2 { padding-bottom: 8px !important; }
- /* Set a $size padding to the left at $breakpoint */
- .pl-lg-2 { padding-left: 8px !important; }
- /* Set a $size padding to the left & right at $breakpoint */
- .px-lg-2 { padding-right: 8px !important; padding-left: 8px !important; }
- /* Set a $size padding to the top & bottom at $breakpoint */
- .py-lg-2 { padding-top: 8px !important; padding-bottom: 8px !important; }
- /* Set a $size padding to all sides at $breakpoint */
- .p-lg-3 { padding: 16px !important; }
- /* Set a $size padding to the top at $breakpoint */
- .pt-lg-3 { padding-top: 16px !important; }
- /* Set a $size padding to the right at $breakpoint */
- .pr-lg-3 { padding-right: 16px !important; }
- /* Set a $size padding to the bottom at $breakpoint */
- .pb-lg-3 { padding-bottom: 16px !important; }
- /* Set a $size padding to the left at $breakpoint */
- .pl-lg-3 { padding-left: 16px !important; }
- /* Set a $size padding to the left & right at $breakpoint */
- .px-lg-3 { padding-right: 16px !important; padding-left: 16px !important; }
- /* Set a $size padding to the top & bottom at $breakpoint */
- .py-lg-3 { padding-top: 16px !important; padding-bottom: 16px !important; }
- /* Set a $size padding to all sides at $breakpoint */
- .p-lg-4 { padding: 24px !important; }
- /* Set a $size padding to the top at $breakpoint */
- .pt-lg-4 { padding-top: 24px !important; }
- /* Set a $size padding to the right at $breakpoint */
- .pr-lg-4 { padding-right: 24px !important; }
- /* Set a $size padding to the bottom at $breakpoint */
- .pb-lg-4 { padding-bottom: 24px !important; }
- /* Set a $size padding to the left at $breakpoint */
- .pl-lg-4 { padding-left: 24px !important; }
- /* Set a $size padding to the left & right at $breakpoint */
- .px-lg-4 { padding-right: 24px !important; padding-left: 24px !important; }
- /* Set a $size padding to the top & bottom at $breakpoint */
- .py-lg-4 { padding-top: 24px !important; padding-bottom: 24px !important; }
- /* Set a $size padding to all sides at $breakpoint */
- .p-lg-5 { padding: 32px !important; }
- /* Set a $size padding to the top at $breakpoint */
- .pt-lg-5 { padding-top: 32px !important; }
- /* Set a $size padding to the right at $breakpoint */
- .pr-lg-5 { padding-right: 32px !important; }
- /* Set a $size padding to the bottom at $breakpoint */
- .pb-lg-5 { padding-bottom: 32px !important; }
- /* Set a $size padding to the left at $breakpoint */
- .pl-lg-5 { padding-left: 32px !important; }
- /* Set a $size padding to the left & right at $breakpoint */
- .px-lg-5 { padding-right: 32px !important; padding-left: 32px !important; }
- /* Set a $size padding to the top & bottom at $breakpoint */
- .py-lg-5 { padding-top: 32px !important; padding-bottom: 32px !important; }
- /* Set a $size padding to all sides at $breakpoint */
- .p-lg-6 { padding: 40px !important; }
- /* Set a $size padding to the top at $breakpoint */
- .pt-lg-6 { padding-top: 40px !important; }
- /* Set a $size padding to the right at $breakpoint */
- .pr-lg-6 { padding-right: 40px !important; }
- /* Set a $size padding to the bottom at $breakpoint */
- .pb-lg-6 { padding-bottom: 40px !important; }
- /* Set a $size padding to the left at $breakpoint */
- .pl-lg-6 { padding-left: 40px !important; }
- /* Set a $size padding to the left & right at $breakpoint */
- .px-lg-6 { padding-right: 40px !important; padding-left: 40px !important; }
- /* Set a $size padding to the top & bottom at $breakpoint */
- .py-lg-6 { padding-top: 40px !important; padding-bottom: 40px !important; } }
-@media (min-width: 1280px) { /* Set a $size padding to all sides at $breakpoint */
- .p-xl-0 { padding: 0 !important; }
- /* Set a $size padding to the top at $breakpoint */
- .pt-xl-0 { padding-top: 0 !important; }
- /* Set a $size padding to the right at $breakpoint */
- .pr-xl-0 { padding-right: 0 !important; }
- /* Set a $size padding to the bottom at $breakpoint */
- .pb-xl-0 { padding-bottom: 0 !important; }
- /* Set a $size padding to the left at $breakpoint */
- .pl-xl-0 { padding-left: 0 !important; }
- /* Set a $size padding to the left & right at $breakpoint */
- .px-xl-0 { padding-right: 0 !important; padding-left: 0 !important; }
- /* Set a $size padding to the top & bottom at $breakpoint */
- .py-xl-0 { padding-top: 0 !important; padding-bottom: 0 !important; }
- /* Set a $size padding to all sides at $breakpoint */
- .p-xl-1 { padding: 4px !important; }
- /* Set a $size padding to the top at $breakpoint */
- .pt-xl-1 { padding-top: 4px !important; }
- /* Set a $size padding to the right at $breakpoint */
- .pr-xl-1 { padding-right: 4px !important; }
- /* Set a $size padding to the bottom at $breakpoint */
- .pb-xl-1 { padding-bottom: 4px !important; }
- /* Set a $size padding to the left at $breakpoint */
- .pl-xl-1 { padding-left: 4px !important; }
- /* Set a $size padding to the left & right at $breakpoint */
- .px-xl-1 { padding-right: 4px !important; padding-left: 4px !important; }
- /* Set a $size padding to the top & bottom at $breakpoint */
- .py-xl-1 { padding-top: 4px !important; padding-bottom: 4px !important; }
- /* Set a $size padding to all sides at $breakpoint */
- .p-xl-2 { padding: 8px !important; }
- /* Set a $size padding to the top at $breakpoint */
- .pt-xl-2 { padding-top: 8px !important; }
- /* Set a $size padding to the right at $breakpoint */
- .pr-xl-2 { padding-right: 8px !important; }
- /* Set a $size padding to the bottom at $breakpoint */
- .pb-xl-2 { padding-bottom: 8px !important; }
- /* Set a $size padding to the left at $breakpoint */
- .pl-xl-2 { padding-left: 8px !important; }
- /* Set a $size padding to the left & right at $breakpoint */
- .px-xl-2 { padding-right: 8px !important; padding-left: 8px !important; }
- /* Set a $size padding to the top & bottom at $breakpoint */
- .py-xl-2 { padding-top: 8px !important; padding-bottom: 8px !important; }
- /* Set a $size padding to all sides at $breakpoint */
- .p-xl-3 { padding: 16px !important; }
- /* Set a $size padding to the top at $breakpoint */
- .pt-xl-3 { padding-top: 16px !important; }
- /* Set a $size padding to the right at $breakpoint */
- .pr-xl-3 { padding-right: 16px !important; }
- /* Set a $size padding to the bottom at $breakpoint */
- .pb-xl-3 { padding-bottom: 16px !important; }
- /* Set a $size padding to the left at $breakpoint */
- .pl-xl-3 { padding-left: 16px !important; }
- /* Set a $size padding to the left & right at $breakpoint */
- .px-xl-3 { padding-right: 16px !important; padding-left: 16px !important; }
- /* Set a $size padding to the top & bottom at $breakpoint */
- .py-xl-3 { padding-top: 16px !important; padding-bottom: 16px !important; }
- /* Set a $size padding to all sides at $breakpoint */
- .p-xl-4 { padding: 24px !important; }
- /* Set a $size padding to the top at $breakpoint */
- .pt-xl-4 { padding-top: 24px !important; }
- /* Set a $size padding to the right at $breakpoint */
- .pr-xl-4 { padding-right: 24px !important; }
- /* Set a $size padding to the bottom at $breakpoint */
- .pb-xl-4 { padding-bottom: 24px !important; }
- /* Set a $size padding to the left at $breakpoint */
- .pl-xl-4 { padding-left: 24px !important; }
- /* Set a $size padding to the left & right at $breakpoint */
- .px-xl-4 { padding-right: 24px !important; padding-left: 24px !important; }
- /* Set a $size padding to the top & bottom at $breakpoint */
- .py-xl-4 { padding-top: 24px !important; padding-bottom: 24px !important; }
- /* Set a $size padding to all sides at $breakpoint */
- .p-xl-5 { padding: 32px !important; }
- /* Set a $size padding to the top at $breakpoint */
- .pt-xl-5 { padding-top: 32px !important; }
- /* Set a $size padding to the right at $breakpoint */
- .pr-xl-5 { padding-right: 32px !important; }
- /* Set a $size padding to the bottom at $breakpoint */
- .pb-xl-5 { padding-bottom: 32px !important; }
- /* Set a $size padding to the left at $breakpoint */
- .pl-xl-5 { padding-left: 32px !important; }
- /* Set a $size padding to the left & right at $breakpoint */
- .px-xl-5 { padding-right: 32px !important; padding-left: 32px !important; }
- /* Set a $size padding to the top & bottom at $breakpoint */
- .py-xl-5 { padding-top: 32px !important; padding-bottom: 32px !important; }
- /* Set a $size padding to all sides at $breakpoint */
- .p-xl-6 { padding: 40px !important; }
- /* Set a $size padding to the top at $breakpoint */
- .pt-xl-6 { padding-top: 40px !important; }
- /* Set a $size padding to the right at $breakpoint */
- .pr-xl-6 { padding-right: 40px !important; }
- /* Set a $size padding to the bottom at $breakpoint */
- .pb-xl-6 { padding-bottom: 40px !important; }
- /* Set a $size padding to the left at $breakpoint */
- .pl-xl-6 { padding-left: 40px !important; }
- /* Set a $size padding to the left & right at $breakpoint */
- .px-xl-6 { padding-right: 40px !important; padding-left: 40px !important; }
- /* Set a $size padding to the top & bottom at $breakpoint */
- .py-xl-6 { padding-top: 40px !important; padding-bottom: 40px !important; } }
-.p-responsive { padding-right: 16px !important; padding-left: 16px !important; }
-@media (min-width: 544px) { .p-responsive { padding-right: 40px !important; padding-left: 40px !important; } }
-@media (min-width: 1012px) { .p-responsive { padding-right: 16px !important; padding-left: 16px !important; } }
-
-/* Set the font size to 26px */
-.h1 { font-size: 26px !important; }
-@media (min-width: 768px) { .h1 { font-size: 32px !important; } }
-
-/* Set the font size to 22px */
-.h2 { font-size: 22px !important; }
-@media (min-width: 768px) { .h2 { font-size: 24px !important; } }
-
-/* Set the font size to 18px */
-.h3 { font-size: 18px !important; }
-@media (min-width: 768px) { .h3 { font-size: 20px !important; } }
-
-/* Set the font size to 16px */
-.h4 { font-size: 16px !important; }
-
-/* Set the font size to 14px */
-.h5 { font-size: 14px !important; }
-
-/* Set the font size to 12px */
-.h6 { font-size: 12px !important; }
-
-.h1, .h2, .h3, .h4, .h5, .h6 { font-weight: 600 !important; }
-
-/* Set the font size to 26px */
-.f1 { font-size: 26px !important; }
-@media (min-width: 768px) { .f1 { font-size: 32px !important; } }
-
-/* Set the font size to 22px */
-.f2 { font-size: 22px !important; }
-@media (min-width: 768px) { .f2 { font-size: 24px !important; } }
-
-/* Set the font size to 18px */
-.f3 { font-size: 18px !important; }
-@media (min-width: 768px) { .f3 { font-size: 20px !important; } }
-
-/* Set the font size to 16px */
-.f4 { font-size: 16px !important; }
-@media (min-width: 768px) { .f4 { font-size: 16px !important; } }
-
-/* Set the font size to 14px */
-.f5 { font-size: 14px !important; }
-
-/* Set the font size to 12px */
-.f6 { font-size: 12px !important; }
-
-/* Set the font size to 40px and weight to light */
-.f00-light { font-size: 40px !important; font-weight: 300 !important; }
-@media (min-width: 768px) { .f00-light { font-size: 48px !important; } }
-
-/* Set the font size to 32px and weight to light */
-.f0-light { font-size: 32px !important; font-weight: 300 !important; }
-@media (min-width: 768px) { .f0-light { font-size: 40px !important; } }
-
-/* Set the font size to 26px and weight to light */
-.f1-light { font-size: 26px !important; font-weight: 300 !important; }
-@media (min-width: 768px) { .f1-light { font-size: 32px !important; } }
-
-/* Set the font size to 22px and weight to light */
-.f2-light { font-size: 22px !important; font-weight: 300 !important; }
-@media (min-width: 768px) { .f2-light { font-size: 24px !important; } }
-
-/* Set the font size to 18px and weight to light */
-.f3-light { font-size: 18px !important; font-weight: 300 !important; }
-@media (min-width: 768px) { .f3-light { font-size: 20px !important; } }
-
-/* Set the font size to ${#h6-size} */
-.text-small { font-size: 12px !important; }
-
-/* Large leading paragraphs */
-.lead { margin-bottom: 30px; font-size: 20px; font-weight: 300; color: #586069; }
-
-/* Set the line height to ultra condensed */
-.lh-condensed-ultra { line-height: 1 !important; }
-
-/* Set the line height to condensed */
-.lh-condensed { line-height: 1.25 !important; }
-
-/* Set the line height to default */
-.lh-default { line-height: 1.5 !important; }
-
-/* Set the line height to zero */
-.lh-0 { line-height: 0 !important; }
-
-/* Text align to the right */
-.text-right { text-align: right !important; }
-
-/* Text align to the left */
-.text-left { text-align: left !important; }
-
-/* Text align to the center */
-.text-center { text-align: center !important; }
-
-@media (min-width: 544px) { /* Text align to the right */
- .text-sm-right { text-align: right !important; }
- /* Text align to the left */
- .text-sm-left { text-align: left !important; }
- /* Text align to the center */
- .text-sm-center { text-align: center !important; } }
-@media (min-width: 768px) { /* Text align to the right */
- .text-md-right { text-align: right !important; }
- /* Text align to the left */
- .text-md-left { text-align: left !important; }
- /* Text align to the center */
- .text-md-center { text-align: center !important; } }
-@media (min-width: 1012px) { /* Text align to the right */
- .text-lg-right { text-align: right !important; }
- /* Text align to the left */
- .text-lg-left { text-align: left !important; }
- /* Text align to the center */
- .text-lg-center { text-align: center !important; } }
-@media (min-width: 1280px) { /* Text align to the right */
- .text-xl-right { text-align: right !important; }
- /* Text align to the left */
- .text-xl-left { text-align: left !important; }
- /* Text align to the center */
- .text-xl-center { text-align: center !important; } }
-/* Set the font weight to normal */
-.text-normal { font-weight: 400 !important; }
-
-/* Set the font weight to bold */
-.text-bold { font-weight: 600 !important; }
-
-/* Set the font to italic */
-.text-italic { font-style: italic !important; }
-
-/* Make text uppercase */
-.text-uppercase { text-transform: uppercase !important; }
-
-/* Underline text */
-.text-underline { text-decoration: underline !important; }
-
-/* Don't underline text */
-.no-underline { text-decoration: none !important; }
-
-/* Don't wrap white space */
-.no-wrap { white-space: nowrap !important; }
-
-/* Normal white space */
-.ws-normal { white-space: normal !important; }
-
-/* Allow long lines with no spaces to line break */
-.wb-break-all { word-break: break-all !important; }
-
-.text-emphasized { font-weight: 600; color: #24292e; }
-
-.list-style-none { list-style: none !important; }
-
-/* Add a dark text shadow */
-.text-shadow-dark { text-shadow: 0 1px 1px rgba(27, 31, 35, 0.25), 0 1px 25px rgba(27, 31, 35, 0.75); }
-
-/* Add a light text shadow */
-.text-shadow-light { text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); }
-
-/* Set to monospace font */
-.text-mono { font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; }
-
-/* Disallow user from selecting text */
-.user-select-none { user-select: none !important; }
-
-.d-block { display: block !important; }
-
-.d-flex { display: flex !important; }
-
-.d-inline { display: inline !important; }
-
-.d-inline-block { display: inline-block !important; }
-
-.d-inline-flex { display: inline-flex !important; }
-
-.d-none { display: none !important; }
-
-.d-table { display: table !important; }
-
-.d-table-cell { display: table-cell !important; }
-
-@media (min-width: 544px) { .d-sm-block { display: block !important; }
- .d-sm-flex { display: flex !important; }
- .d-sm-inline { display: inline !important; }
- .d-sm-inline-block { display: inline-block !important; }
- .d-sm-inline-flex { display: inline-flex !important; }
- .d-sm-none { display: none !important; }
- .d-sm-table { display: table !important; }
- .d-sm-table-cell { display: table-cell !important; } }
-@media (min-width: 768px) { .d-md-block { display: block !important; }
- .d-md-flex { display: flex !important; }
- .d-md-inline { display: inline !important; }
- .d-md-inline-block { display: inline-block !important; }
- .d-md-inline-flex { display: inline-flex !important; }
- .d-md-none { display: none !important; }
- .d-md-table { display: table !important; }
- .d-md-table-cell { display: table-cell !important; } }
-@media (min-width: 1012px) { .d-lg-block { display: block !important; }
- .d-lg-flex { display: flex !important; }
- .d-lg-inline { display: inline !important; }
- .d-lg-inline-block { display: inline-block !important; }
- .d-lg-inline-flex { display: inline-flex !important; }
- .d-lg-none { display: none !important; }
- .d-lg-table { display: table !important; }
- .d-lg-table-cell { display: table-cell !important; } }
-@media (min-width: 1280px) { .d-xl-block { display: block !important; }
- .d-xl-flex { display: flex !important; }
- .d-xl-inline { display: inline !important; }
- .d-xl-inline-block { display: inline-block !important; }
- .d-xl-inline-flex { display: inline-flex !important; }
- .d-xl-none { display: none !important; }
- .d-xl-table { display: table !important; }
- .d-xl-table-cell { display: table-cell !important; } }
-.v-hidden { visibility: hidden !important; }
-
-.v-visible { visibility: visible !important; }
-
-@media (max-width: 544px) { .hide-sm { display: none !important; } }
-@media (min-width: 544px) and (max-width: 768px) { .hide-md { display: none !important; } }
-@media (min-width: 768px) and (max-width: 1012px) { .hide-lg { display: none !important; } }
-@media (min-width: 1012px) { .hide-xl { display: none !important; } }
-/* Set the table-layout to fixed */
-.table-fixed { table-layout: fixed !important; }
-
-.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; overflow: hidden; clip: rect(0, 0, 0, 0); word-wrap: normal; border: 0; }
-
-.show-on-focus { position: absolute; width: 1px; height: 1px; margin: 0; overflow: hidden; clip: rect(1px, 1px, 1px, 1px); }
-.show-on-focus:focus { z-index: 20; width: auto; height: auto; clip: auto; }
-
-.container { width: 980px; margin-right: auto; margin-left: auto; }
-.container::before { display: table; content: ""; }
-.container::after { display: table; clear: both; content: ""; }
-
-.container-md { max-width: 768px; margin-right: auto; margin-left: auto; }
-
-.container-lg { max-width: 1012px; margin-right: auto; margin-left: auto; }
-
-.container-xl { max-width: 1280px; margin-right: auto; margin-left: auto; }
-
-.columns { margin-right: -10px; margin-left: -10px; }
-.columns::before { display: table; content: ""; }
-.columns::after { display: table; clear: both; content: ""; }
-
-.column { float: left; padding-right: 10px; padding-left: 10px; }
-
-.one-third { width: 33.333333%; }
-
-.two-thirds { width: 66.666667%; }
-
-.one-fourth { width: 25%; }
-
-.one-half { width: 50%; }
-
-.three-fourths { width: 75%; }
-
-.one-fifth { width: 20%; }
-
-.four-fifths { width: 80%; }
-
-.centered { display: block; float: none; margin-right: auto; margin-left: auto; }
-
-.col-1 { width: 8.3333333333%; }
-
-.col-2 { width: 16.6666666667%; }
-
-.col-3 { width: 25%; }
-
-.col-4 { width: 33.3333333333%; }
-
-.col-5 { width: 41.6666666667%; }
-
-.col-6 { width: 50%; }
-
-.col-7 { width: 58.3333333333%; }
-
-.col-8 { width: 66.6666666667%; }
-
-.col-9 { width: 75%; }
-
-.col-10 { width: 83.3333333333%; }
-
-.col-11 { width: 91.6666666667%; }
-
-.col-12 { width: 100%; }
-
-@media (min-width: 544px) { .col-sm-1 { width: 8.3333333333%; }
- .col-sm-2 { width: 16.6666666667%; }
- .col-sm-3 { width: 25%; }
- .col-sm-4 { width: 33.3333333333%; }
- .col-sm-5 { width: 41.6666666667%; }
- .col-sm-6 { width: 50%; }
- .col-sm-7 { width: 58.3333333333%; }
- .col-sm-8 { width: 66.6666666667%; }
- .col-sm-9 { width: 75%; }
- .col-sm-10 { width: 83.3333333333%; }
- .col-sm-11 { width: 91.6666666667%; }
- .col-sm-12 { width: 100%; } }
-@media (min-width: 768px) { .col-md-1 { width: 8.3333333333%; }
- .col-md-2 { width: 16.6666666667%; }
- .col-md-3 { width: 25%; }
- .col-md-4 { width: 33.3333333333%; }
- .col-md-5 { width: 41.6666666667%; }
- .col-md-6 { width: 50%; }
- .col-md-7 { width: 58.3333333333%; }
- .col-md-8 { width: 66.6666666667%; }
- .col-md-9 { width: 75%; }
- .col-md-10 { width: 83.3333333333%; }
- .col-md-11 { width: 91.6666666667%; }
- .col-md-12 { width: 100%; } }
-@media (min-width: 1012px) { .col-lg-1 { width: 8.3333333333%; }
- .col-lg-2 { width: 16.6666666667%; }
- .col-lg-3 { width: 25%; }
- .col-lg-4 { width: 33.3333333333%; }
- .col-lg-5 { width: 41.6666666667%; }
- .col-lg-6 { width: 50%; }
- .col-lg-7 { width: 58.3333333333%; }
- .col-lg-8 { width: 66.6666666667%; }
- .col-lg-9 { width: 75%; }
- .col-lg-10 { width: 83.3333333333%; }
- .col-lg-11 { width: 91.6666666667%; }
- .col-lg-12 { width: 100%; } }
-@media (min-width: 1280px) { .col-xl-1 { width: 8.3333333333%; }
- .col-xl-2 { width: 16.6666666667%; }
- .col-xl-3 { width: 25%; }
- .col-xl-4 { width: 33.3333333333%; }
- .col-xl-5 { width: 41.6666666667%; }
- .col-xl-6 { width: 50%; }
- .col-xl-7 { width: 58.3333333333%; }
- .col-xl-8 { width: 66.6666666667%; }
- .col-xl-9 { width: 75%; }
- .col-xl-10 { width: 83.3333333333%; }
- .col-xl-11 { width: 91.6666666667%; }
- .col-xl-12 { width: 100%; } }
-.gutter { margin-right: -16px; margin-left: -16px; }
-.gutter > [class*="col-"] { padding-right: 16px !important; padding-left: 16px !important; }
-
-.gutter-condensed { margin-right: -8px; margin-left: -8px; }
-.gutter-condensed > [class*="col-"] { padding-right: 8px !important; padding-left: 8px !important; }
-
-.gutter-spacious { margin-right: -24px; margin-left: -24px; }
-.gutter-spacious > [class*="col-"] { padding-right: 24px !important; padding-left: 24px !important; }
-
-@media (min-width: 544px) { .gutter-sm { margin-right: -16px; margin-left: -16px; }
- .gutter-sm > [class*="col-"] { padding-right: 16px !important; padding-left: 16px !important; }
- .gutter-sm-condensed { margin-right: -8px; margin-left: -8px; }
- .gutter-sm-condensed > [class*="col-"] { padding-right: 8px !important; padding-left: 8px !important; }
- .gutter-sm-spacious { margin-right: -24px; margin-left: -24px; }
- .gutter-sm-spacious > [class*="col-"] { padding-right: 24px !important; padding-left: 24px !important; } }
-@media (min-width: 768px) { .gutter-md { margin-right: -16px; margin-left: -16px; }
- .gutter-md > [class*="col-"] { padding-right: 16px !important; padding-left: 16px !important; }
- .gutter-md-condensed { margin-right: -8px; margin-left: -8px; }
- .gutter-md-condensed > [class*="col-"] { padding-right: 8px !important; padding-left: 8px !important; }
- .gutter-md-spacious { margin-right: -24px; margin-left: -24px; }
- .gutter-md-spacious > [class*="col-"] { padding-right: 24px !important; padding-left: 24px !important; } }
-@media (min-width: 1012px) { .gutter-lg { margin-right: -16px; margin-left: -16px; }
- .gutter-lg > [class*="col-"] { padding-right: 16px !important; padding-left: 16px !important; }
- .gutter-lg-condensed { margin-right: -8px; margin-left: -8px; }
- .gutter-lg-condensed > [class*="col-"] { padding-right: 8px !important; padding-left: 8px !important; }
- .gutter-lg-spacious { margin-right: -24px; margin-left: -24px; }
- .gutter-lg-spacious > [class*="col-"] { padding-right: 24px !important; padding-left: 24px !important; } }
-@media (min-width: 1280px) { .gutter-xl { margin-right: -16px; margin-left: -16px; }
- .gutter-xl > [class*="col-"] { padding-right: 16px !important; padding-left: 16px !important; }
- .gutter-xl-condensed { margin-right: -8px; margin-left: -8px; }
- .gutter-xl-condensed > [class*="col-"] { padding-right: 8px !important; padding-left: 8px !important; }
- .gutter-xl-spacious { margin-right: -24px; margin-left: -24px; }
- .gutter-xl-spacious > [class*="col-"] { padding-right: 24px !important; padding-left: 24px !important; } }
-.offset-1 { margin-left: 8.3333333333% !important; }
-
-.offset-2 { margin-left: 16.6666666667% !important; }
-
-.offset-3 { margin-left: 25% !important; }
-
-.offset-4 { margin-left: 33.3333333333% !important; }
-
-.offset-5 { margin-left: 41.6666666667% !important; }
-
-.offset-6 { margin-left: 50% !important; }
-
-.offset-7 { margin-left: 58.3333333333% !important; }
-
-.offset-8 { margin-left: 66.6666666667% !important; }
-
-.offset-9 { margin-left: 75% !important; }
-
-.offset-10 { margin-left: 83.3333333333% !important; }
-
-.offset-11 { margin-left: 91.6666666667% !important; }
-
-@media (min-width: 544px) { .offset-sm-1 { margin-left: 8.3333333333% !important; }
- .offset-sm-2 { margin-left: 16.6666666667% !important; }
- .offset-sm-3 { margin-left: 25% !important; }
- .offset-sm-4 { margin-left: 33.3333333333% !important; }
- .offset-sm-5 { margin-left: 41.6666666667% !important; }
- .offset-sm-6 { margin-left: 50% !important; }
- .offset-sm-7 { margin-left: 58.3333333333% !important; }
- .offset-sm-8 { margin-left: 66.6666666667% !important; }
- .offset-sm-9 { margin-left: 75% !important; }
- .offset-sm-10 { margin-left: 83.3333333333% !important; }
- .offset-sm-11 { margin-left: 91.6666666667% !important; } }
-@media (min-width: 768px) { .offset-md-1 { margin-left: 8.3333333333% !important; }
- .offset-md-2 { margin-left: 16.6666666667% !important; }
- .offset-md-3 { margin-left: 25% !important; }
- .offset-md-4 { margin-left: 33.3333333333% !important; }
- .offset-md-5 { margin-left: 41.6666666667% !important; }
- .offset-md-6 { margin-left: 50% !important; }
- .offset-md-7 { margin-left: 58.3333333333% !important; }
- .offset-md-8 { margin-left: 66.6666666667% !important; }
- .offset-md-9 { margin-left: 75% !important; }
- .offset-md-10 { margin-left: 83.3333333333% !important; }
- .offset-md-11 { margin-left: 91.6666666667% !important; } }
-@media (min-width: 1012px) { .offset-lg-1 { margin-left: 8.3333333333% !important; }
- .offset-lg-2 { margin-left: 16.6666666667% !important; }
- .offset-lg-3 { margin-left: 25% !important; }
- .offset-lg-4 { margin-left: 33.3333333333% !important; }
- .offset-lg-5 { margin-left: 41.6666666667% !important; }
- .offset-lg-6 { margin-left: 50% !important; }
- .offset-lg-7 { margin-left: 58.3333333333% !important; }
- .offset-lg-8 { margin-left: 66.6666666667% !important; }
- .offset-lg-9 { margin-left: 75% !important; }
- .offset-lg-10 { margin-left: 83.3333333333% !important; }
- .offset-lg-11 { margin-left: 91.6666666667% !important; } }
-@media (min-width: 1280px) { .offset-xl-1 { margin-left: 8.3333333333% !important; }
- .offset-xl-2 { margin-left: 16.6666666667% !important; }
- .offset-xl-3 { margin-left: 25% !important; }
- .offset-xl-4 { margin-left: 33.3333333333% !important; }
- .offset-xl-5 { margin-left: 41.6666666667% !important; }
- .offset-xl-6 { margin-left: 50% !important; }
- .offset-xl-7 { margin-left: 58.3333333333% !important; }
- .offset-xl-8 { margin-left: 66.6666666667% !important; }
- .offset-xl-9 { margin-left: 75% !important; }
- .offset-xl-10 { margin-left: 83.3333333333% !important; }
- .offset-xl-11 { margin-left: 91.6666666667% !important; } }
-.markdown-body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 16px; line-height: 1.5; word-wrap: break-word; }
-.markdown-body::before { display: table; content: ""; }
-.markdown-body::after { display: table; clear: both; content: ""; }
-.markdown-body > *:first-child { margin-top: 0 !important; }
-.markdown-body > *:last-child { margin-bottom: 0 !important; }
-.markdown-body a:not([href]) { color: inherit; text-decoration: none; }
-.markdown-body .absent { color: #cb2431; }
-.markdown-body .anchor { float: left; padding-right: 4px; margin-left: -20px; line-height: 1; }
-.markdown-body .anchor:focus { outline: none; }
-.markdown-body p, .markdown-body blockquote, .markdown-body ul, .markdown-body ol, .markdown-body dl, .markdown-body table, .markdown-body pre { margin-top: 0; margin-bottom: 16px; }
-.markdown-body hr { height: 0.25em; padding: 0; margin: 24px 0; background-color: #e1e4e8; border: 0; }
-.markdown-body blockquote { padding: 0 1em; color: #6a737d; border-left: 0.25em solid #dfe2e5; }
-.markdown-body blockquote > :first-child { margin-top: 0; }
-.markdown-body blockquote > :last-child { margin-bottom: 0; }
-.markdown-body kbd { display: inline-block; padding: 3px 5px; font-size: 11px; line-height: 10px; color: #444d56; vertical-align: middle; background-color: #fafbfc; border: solid 1px #c6cbd1; border-bottom-color: #959da5; border-radius: 3px; box-shadow: inset 0 -1px 0 #959da5; }
-
-.markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 { margin-top: 24px; margin-bottom: 16px; font-weight: 600; line-height: 1.25; }
-.markdown-body h1 .octicon-link, .markdown-body h2 .octicon-link, .markdown-body h3 .octicon-link, .markdown-body h4 .octicon-link, .markdown-body h5 .octicon-link, .markdown-body h6 .octicon-link { color: #1b1f23; vertical-align: middle; visibility: hidden; }
-.markdown-body h1:hover .anchor, .markdown-body h2:hover .anchor, .markdown-body h3:hover .anchor, .markdown-body h4:hover .anchor, .markdown-body h5:hover .anchor, .markdown-body h6:hover .anchor { text-decoration: none; }
-.markdown-body h1:hover .anchor .octicon-link, .markdown-body h2:hover .anchor .octicon-link, .markdown-body h3:hover .anchor .octicon-link, .markdown-body h4:hover .anchor .octicon-link, .markdown-body h5:hover .anchor .octicon-link, .markdown-body h6:hover .anchor .octicon-link { visibility: visible; }
-.markdown-body h1 tt, .markdown-body h1 code, .markdown-body h2 tt, .markdown-body h2 code, .markdown-body h3 tt, .markdown-body h3 code, .markdown-body h4 tt, .markdown-body h4 code, .markdown-body h5 tt, .markdown-body h5 code, .markdown-body h6 tt, .markdown-body h6 code { font-size: inherit; }
-.markdown-body h1 { padding-bottom: 0.3em; font-size: 2em; border-bottom: 1px solid #eaecef; }
-.markdown-body h2 { padding-bottom: 0.3em; font-size: 1.5em; border-bottom: 1px solid #eaecef; }
-.markdown-body h3 { font-size: 1.25em; }
-.markdown-body h4 { font-size: 1em; }
-.markdown-body h5 { font-size: 0.875em; }
-.markdown-body h6 { font-size: 0.85em; color: #6a737d; }
-
-.markdown-body ul, .markdown-body ol { padding-left: 2em; }
-.markdown-body ul.no-list, .markdown-body ol.no-list { padding: 0; list-style-type: none; }
-.markdown-body ul ul, .markdown-body ul ol, .markdown-body ol ol, .markdown-body ol ul { margin-top: 0; margin-bottom: 0; }
-.markdown-body li { word-wrap: break-all; }
-.markdown-body li > p { margin-top: 16px; }
-.markdown-body li + li { margin-top: 0.25em; }
-.markdown-body dl { padding: 0; }
-.markdown-body dl dt { padding: 0; margin-top: 16px; font-size: 1em; font-style: italic; font-weight: 600; }
-.markdown-body dl dd { padding: 0 16px; margin-bottom: 16px; }
-
-.markdown-body table { display: block; width: 100%; overflow: auto; }
-.markdown-body table th { font-weight: 600; }
-.markdown-body table th, .markdown-body table td { padding: 6px 13px; border: 1px solid #dfe2e5; }
-.markdown-body table tr { background-color: #fff; border-top: 1px solid #c6cbd1; }
-.markdown-body table tr:nth-child(2n) { background-color: #f6f8fa; }
-.markdown-body table img { background-color: transparent; }
-
-.markdown-body img { max-width: 100%; box-sizing: content-box; background-color: #fff; }
-.markdown-body img[align=right] { padding-left: 20px; }
-.markdown-body img[align=left] { padding-right: 20px; }
-.markdown-body .emoji { max-width: none; vertical-align: text-top; background-color: transparent; }
-.markdown-body span.frame { display: block; overflow: hidden; }
-.markdown-body span.frame > span { display: block; float: left; width: auto; padding: 7px; margin: 13px 0 0; overflow: hidden; border: 1px solid #dfe2e5; }
-.markdown-body span.frame span img { display: block; float: left; }
-.markdown-body span.frame span span { display: block; padding: 5px 0 0; clear: both; color: #24292e; }
-.markdown-body span.align-center { display: block; overflow: hidden; clear: both; }
-.markdown-body span.align-center > span { display: block; margin: 13px auto 0; overflow: hidden; text-align: center; }
-.markdown-body span.align-center span img { margin: 0 auto; text-align: center; }
-.markdown-body span.align-right { display: block; overflow: hidden; clear: both; }
-.markdown-body span.align-right > span { display: block; margin: 13px 0 0; overflow: hidden; text-align: right; }
-.markdown-body span.align-right span img { margin: 0; text-align: right; }
-.markdown-body span.float-left { display: block; float: left; margin-right: 13px; overflow: hidden; }
-.markdown-body span.float-left span { margin: 13px 0 0; }
-.markdown-body span.float-right { display: block; float: right; margin-left: 13px; overflow: hidden; }
-.markdown-body span.float-right > span { display: block; margin: 13px auto 0; overflow: hidden; text-align: right; }
-
-.markdown-body code, .markdown-body tt { padding: 0.2em 0.4em; margin: 0; font-size: 85%; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px; }
-.markdown-body code br, .markdown-body tt br { display: none; }
-.markdown-body del code { text-decoration: inherit; }
-.markdown-body pre { word-wrap: normal; }
-.markdown-body pre > code { padding: 0; margin: 0; font-size: 100%; word-break: normal; white-space: pre; background: transparent; border: 0; }
-.markdown-body .highlight { margin-bottom: 16px; }
-.markdown-body .highlight pre { margin-bottom: 0; word-break: normal; }
-.markdown-body .highlight pre, .markdown-body pre { padding: 16px; overflow: auto; font-size: 85%; line-height: 1.45; background-color: #f6f8fa; border-radius: 3px; }
-.markdown-body pre code, .markdown-body pre tt { display: inline; max-width: auto; padding: 0; margin: 0; overflow: visible; line-height: inherit; word-wrap: normal; background-color: transparent; border: 0; }
-
-.markdown-body .csv-data td, .markdown-body .csv-data th { padding: 5px; overflow: hidden; font-size: 12px; line-height: 1; text-align: left; white-space: nowrap; }
-.markdown-body .csv-data .blob-num { padding: 10px 8px 9px; text-align: right; background: #fff; border: 0; }
-.markdown-body .csv-data tr { border-top: 0; }
-.markdown-body .csv-data th { font-weight: 600; background: #f6f8fa; border-top: 0; }
-
-.highlight table td { padding: 5px; }
-
-.highlight table pre { margin: 0; }
-
-.highlight .cm { color: #999988; font-style: italic; }
-
-.highlight .cp { color: #999999; font-weight: bold; }
-
-.highlight .c1 { color: #999988; font-style: italic; }
-
-.highlight .cs { color: #999999; font-weight: bold; font-style: italic; }
-
-.highlight .c, .highlight .cd { color: #999988; font-style: italic; }
-
-.highlight .err { color: #a61717; background-color: #e3d2d2; }
-
-.highlight .gd { color: #000000; background-color: #ffdddd; }
-
-.highlight .ge { color: #000000; font-style: italic; }
-
-.highlight .gr { color: #aa0000; }
-
-.highlight .gh { color: #999999; }
-
-.highlight .gi { color: #000000; background-color: #ddffdd; }
-
-.highlight .go { color: #888888; }
-
-.highlight .gp { color: #555555; }
-
-.highlight .gs { font-weight: bold; }
-
-.highlight .gu { color: #aaaaaa; }
-
-.highlight .gt { color: #aa0000; }
-
-.highlight .kc { color: #000000; font-weight: bold; }
-
-.highlight .kd { color: #000000; font-weight: bold; }
-
-.highlight .kn { color: #000000; font-weight: bold; }
-
-.highlight .kp { color: #000000; font-weight: bold; }
-
-.highlight .kr { color: #000000; font-weight: bold; }
-
-.highlight .kt { color: #445588; font-weight: bold; }
-
-.highlight .k, .highlight .kv { color: #000000; font-weight: bold; }
-
-.highlight .mf { color: #009999; }
-
-.highlight .mh { color: #009999; }
-
-.highlight .il { color: #009999; }
-
-.highlight .mi { color: #009999; }
-
-.highlight .mo { color: #009999; }
-
-.highlight .m, .highlight .mb, .highlight .mx { color: #009999; }
-
-.highlight .sb { color: #d14; }
-
-.highlight .sc { color: #d14; }
-
-.highlight .sd { color: #d14; }
-
-.highlight .s2 { color: #d14; }
-
-.highlight .se { color: #d14; }
-
-.highlight .sh { color: #d14; }
-
-.highlight .si { color: #d14; }
-
-.highlight .sx { color: #d14; }
-
-.highlight .sr { color: #009926; }
-
-.highlight .s1 { color: #d14; }
-
-.highlight .ss { color: #990073; }
-
-.highlight .s { color: #d14; }
-
-.highlight .na { color: #008080; }
-
-.highlight .bp { color: #999999; }
-
-.highlight .nb { color: #0086B3; }
-
-.highlight .nc { color: #445588; font-weight: bold; }
-
-.highlight .no { color: #008080; }
-
-.highlight .nd { color: #3c5d5d; font-weight: bold; }
-
-.highlight .ni { color: #800080; }
-
-.highlight .ne { color: #990000; font-weight: bold; }
-
-.highlight .nf { color: #990000; font-weight: bold; }
-
-.highlight .nl { color: #990000; font-weight: bold; }
-
-.highlight .nn { color: #555555; }
-
-.highlight .nt { color: #000080; }
-
-.highlight .vc { color: #008080; }
-
-.highlight .vg { color: #008080; }
-
-.highlight .vi { color: #008080; }
-
-.highlight .nv { color: #008080; }
-
-.highlight .ow { color: #000000; font-weight: bold; }
-
-.highlight .o { color: #000000; font-weight: bold; }
-
-.highlight .w { color: #bbbbbb; }
-
-.highlight { background-color: #f8f8f8; }
diff --git a/docs/_site/background.html b/docs/_site/background.html
deleted file mode 100644
index 94e27bb..0000000
--- a/docs/_site/background.html
+++ /dev/null
@@ -1,590 +0,0 @@
-
-
-
-
-
The Observational Medical Outcomes Partnership (OMOP) was a public-private partnership established to inform the appropriate use of observational healthcare databases for studying the effects of medical products. Over the course of the 5-year project and through its community of researchers from industry, government, and academia, OMOP successfully achieved its aims to:
-
-
Conduct methodological research to empirically evaluate the performance of various analytical methods on their ability to identify true associations and avoid false findings
-
Develop tools and capabilities for transforming, characterizing, and analysing disparate data sources across the health care delivery spectrum
-
Establish a shared resource so that the broader research community can collaboratively advance the science
-
-
The results of OMOP’s research has been widely published and presented at scientific conferences, including annual symposia.
-
The OMOP Legacy continues…
-
The community is actively using the OMOP Common Data Model for their various research purposes. Those tools will continue to be maintained and supported, and information about this work is available in the public domain.
-
The OMOP Common Data Model will continue to be an open-source community standard for observational healthcare data. The model specifications and associated work products will be placed in the public domain, and the entire research community is encouraged to use these tools to support everybody’s own research activities.
-
-
-
The Role of the Common Data Model
-
No single observational data source provides a comprehensive view of the clinical data a patient accumulates while receiving healthcare, and therefore none can be sufficient to meet all expected outcome analysis needs. This explains the need for assessing and analyzing multiple data sources concurrently using a common data standard. This standard is provided by the OMOP Common Data Model (CDM).
-
The CDM is designed to support the conduct of research to identify and evaluate associations between interventions (drug exposure, procedures, healthcare policy changes etc.) and outcomes caused by these interventions (condition occurrences, procedures, drug exposure etc.). Outcomes can be efficacious (benefit) or adverse (safety risk). Often times, specific patient cohorts (e.g., those taking a certain drug or suffering from a certain disease) may be defined for treatments or outcomes, using clinical events (diagnoses, observations, procedures, etc.) that occur in predefined temporal relationships to each other. The CDM, combined with its standardized content (via the Standardized Vocabularies), will ensure that research methods can be systematically applied to produce meaningfully comparable and reproducible results.
-
-
-
Design Principles
-
The CDM is designed to include all observational health data elements (experiences of the patient receiving health care) that are relevant for analytic use cases to support the generation of reliable scientific evidence about disease natural history, healthcare delivery, effects of medical interventions, the identification of demographic information, health care interventions and outcomes.
-
Therefore, the CDM is designed to store observational data to allow for research, under the following principles:
-
-
Suitability for purpose: The CDM aims to provide data organized in a way optimal for analysis, rather than for the purpose of addressing the operational needs of health care providers or payers.
-
Data protection: All data that might jeopardize the identity and protection of patients, such as names, precise birthdays etc. are limited. Exceptions are possible where the research expressly requires more detailed information, such as precise birth dates for the study of infants.
-
Design of domains: The domains are modeled in a person-centric relational data model, where for each record the identity of the person and a date is captured as a minimum.
-
Rationale for domains: Domains are identified and separately defined in an entity-relationship model if they have an analysis use case and the domain has specific attributes that are not otherwise applicable. All other data can be preserved as an observation in an entity-attribute-value structure.
-
Standardized Vocabularies: To standardize the content of those records, the CDM relies on the Standardized Vocabularies containing all necessary and appropriate corresponding standard healthcare concepts.
-
Reuse of existing vocabularies: If possible, these concepts are leveraged from national or industry standardization or vocabulary definition organizations or initiatives, such as the National Library of Medicine, the Department of Veterans’ Affairs, the Center of Disease Control and Prevention, etc.
-
Maintaining source codes: Even though all codes are mapped to the Standardized Vocabularies, the model also stores the original source code to ensure no information is lost.
-
Technology neutrality: The CDM does not require a specific technology. It can be realized in any relational database, such as Oracle, SQL Server etc., or as SAS analytical datasets.
-
Scalability: The CDM is optimized for data processing and computational analysis to accommodate data sources that vary in size, including databases with up to hundreds of millions of persons and billions of clinical observations.
-
Backwards compatibility: All changes from previous CDMs are clearly delineated in the github repository. Older versions of the CDM can be easily created from the CDMv5, and no information is lost that was present previously.
Below is the specification document for the OMOP Common Data Model, v5.3.1. 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 or the github issue page.
-
–after regeneration of DDLs link to csv of cdm link to pdf of cdm documentation link to forum on doc page
-
-
Clinical Data Tables
-
-
PERSON
-
Table Description
-
This table serves as the central identity management for all Persons in the database. It contains records that uniquely identify each person or patient, and some demographic information.
-
User Guide
-
All records in this table are independent Persons.
-
ETL Conventions
-
All Persons in a database needs one record in this table, unless they fail data quality requirements specified in the ETL. Persons with no Events should have a record nonetheless. If more than one data source contributes Events to the database, Persons must be reconciled, if possible, across the sources to create one single record per Person. The content of the BIRTH_DATETIME must be equivalent to the content of BIRTH_DAY, BIRTH_MONTH and BIRTH_YEAR.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-person_id
-
-
-It is assumed that every person with a different unique identifier is in fact a different person and should be treated independently.
-
-
-Any person linkage that needs to occur to uniquely identify Persons ought to be done prior to writing this table. This identifier can be the original id from the source data provided if it is an integer, otherwise it can be an autogenerated number.
-
-
-integer
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-gender_concept_id
-
-
-This field is meant to capture the biological sex at birth of the Person. This field should not be used to study gender identity issues.
-
-
-Use the gender or sex value present in the data under the assumption that it is the biological sex at birth. If the source data captures gender identity it should be stored in the OBSERVATION table. Accepted gender concepts
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Gender
-
-
-
-
-year_of_birth
-
-
-Compute age using year_of_birth.
-
-
-For data sources with date of birth, the year should be extracted. For data sources where the year of birth is not available, the approximate year of birth could be derived based on age group categorization, if available.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-month_of_birth
-
-
-
-
-For data sources that provide the precise date of birth, the month should be extracted and stored in this field.
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-day_of_birth
-
-
-
-
-For data sources that provide the precise date of birth, the day should be extracted and stored in this field.
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-birth_datetime
-
-
-
-
-This field is not required but highly encouraged. For data sources that provide the precise datetime of birth, that value should be stored in this field. If birth_datetime is not provided in the source, use the following logic to infer the date: If day_of_birth is null and month_of_birth is not null then use the first of the month in that year. If month_of_birth is null or if day_of_birth AND month_of_birth are both null and the person has records during their year of birth then use the date of the earliest record, otherwise use the 15th of June of that year. If time of birth is not given use midnight (00:00:0000).
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-race_concept_id
-
-
-This field captures race or ethnic background of the person.
-
-
-Only use this field if you have information about race or ethnic background. The Vocabulary contains Concepts about the main races and ethnic backgrounds in a hierarchical system. Due to the imprecise nature of human races and ethnic backgrounds, this is not a perfect system. Mixed races are not supported. If a clear race or ethnic background cannot be established, use Concept_Id 0. Accepted Race Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Race
-
-
-
-
-ethnicity_concept_id
-
-
-This field captures Ethnicity as defined by the Office of Management and Budget (OMB) of the US Government: it distinguishes only between “Hispanic” and “Not Hispanic”. Races and ethnic backgrounds are not stored here.
-
-
-Only use this field if you have US-based data and a source of this information. Do not attempt to infer Ethnicity from the race or ethnic background of the Person. Accepted ethnicity concepts
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Ethnicity
-
-
-
-
-location_id
-
-
-The location refers to the physical address of the person. This field should capture the last known location of the person.
-
-
-Put the location_id from the LOCATION table here that represents the most granular location information for the person. This could represent anything from postal code or parts thereof, state, or county for example. Since many databases contain deidentified data, it is common that the precision of the location is reduced to prevent re-identification. This field should capture the last known location.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-LOCATION
-
-
-
-
-
-
-provider_id
-
-
-The Provider refers to the last known primary care provider (General Practitioner).
-
-
-Put the provider_id from the PROVIDER table of the last known general practitioner of the person. If there are multiple providers, it is up to the ETL to decide which to put here.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-PROVIDER
-
-
-
-
-
-
-care_site_id
-
-
-The Care Site refers to where the Provider typically provides the primary care.
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CARE_SITE
-
-
-
-
-
-
-person_source_value
-
-
-Use this field to link back to persons in the source data. This is typically used for error checking of ETL logic.
-
-
-Some use cases require the ability to link back to persons in the source data. This field allows for the storing of the person value as it appears in the source. This field is not required but strongly recommended.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-gender_source_value
-
-
-This field is used to store the biological sex of the person from the source data. It is not intended for use in standard analytics but for reference only.
-
-
-Put the biological sex of the person as it appears in the source data.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-gender_source_concept_id
-
-
-Due to the small number of options, this tends to be zero.
-
-
-If the source data codes biological sex in a non-standard vocabulary, store the concept_id here.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-race_source_value
-
-
-This field is used to store the race of the person from the source data. It is not intended for use in standard analytics but for reference only.
-
-
-Put the race of the person as it appears in the source data.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-race_source_concept_id
-
-
-Due to the small number of options, this tends to be zero.
-
-
-If the source data codes race in an OMOP supported vocabulary store the concept_id here.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-ethnicity_source_value
-
-
-This field is used to store the ethnicity of the person from the source data. It is not intended for use in standard analytics but for reference only.
-
-
-If the person has an ethnicity other than the OMB standard of “Hispanic” or “Not Hispanic” store that value from the source data here.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-ethnicity_source_concept_id
-
-
-Due to the small number of options, this tends to be zero.
-
-
-If the source data codes ethnicity in an OMOP supported vocabulary, store the concept_id here.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-
-
-
OBSERVATION_PERIOD
-
Table Description
-
This table contains records which define spans of time during which two conditions are expected to hold: (i) Clinical Events that happened to the Person are recorded in the Event tables, and (ii) absense of records indicate such Events did not occur during this span of time.
-
User Guide
-
For each Person, one or more OBSERVATION_PERIOD records may be present, but they will not overlap or be back to back to each other. Events may exist outside all of the time spans of the OBSERVATION_PERIOD records for a patient, however, absence of an Event outside these time spans cannot be construed as evidence of absence of an Event. Incidence or prevalence rates should only be calculated for the time of active OBSERVATION_PERIOD records. When constructing cohorts, outside Events can be used for inclusion criteria definition, but without any guarantee for the performance of these criteria. Also, OBSERVATION_PERIOD records can be as short as a single day, greatly disturbing the denominator of any rate calculation as part of cohort characterizations. To avoid that, apply minimal observation time as a requirement for any cohort definition.
-
ETL Conventions
-
Each Person needs to have at least one OBSERVATION_PERIOD record, which should represent time intervals with a high capture rate of Clinical Events. Some source data have very similar concepts, such as enrollment periods in insurance claims data. In other source data such as most EHR systems these time spans need to be inferred under a set of assumptions. It is the discretion of the ETL developer to define these assumptions. In many ETL solutions the start date of the first occurrence or the first high quality occurrence of a Clinical Event (Condition, Drug, Procedure, Device, Measurement, Visit) is defined as the start of the OBSERVATION_PERIOD record, and the end date of the last occurrence of last high quality occurrence of a Clinical Event, or the end of the database period becomes the end of the OBSERVATOIN_PERIOD for each Person. If a Person only has a single Clinical Event the OBSERVATION_PERIOD record can be as short as one day. Depending on these definitions it is possible that Clinical Events fall outside the time spans defined by OBSERVATION_PERIOD records. Family history or history of Clinical Events generally are not used to generate OBSERVATION_PERIOD records around the time they are referring to. Any two overlapping or adjacent OBSERVATION_PERIOD records have to be merged into one.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-observation_period_id
-
-
-A Person can have multiple discrete Observation Periods which are identified by the Observation_Period_Id.
-
-
-Assign a unique observation_period_id to each discrete Observation Period for a Person.
-
-
-integer
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-The Person ID of the PERSON record for which the Observation Period is recorded.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-observation_period_start_date
-
-
-Use this date to determine the start date of the Observation Period.
-
-
-It is often the case that the idea of Observation Periods does not exist in source data. In those cases, the observation_period_start_date can be inferred as the earliest Event date available for the Person. In insurance claim data, the Observation Period can be considered as the time period the Person is enrolled with a payer. If a Person switches plans but stays with the same payer, and therefore capturing of data continues, that change would be captured in PAYER_PLAN_PERIOD.
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-observation_period_end_date
-
-
-Use this date to determine the end date of the period for which we can assume that all events for a Person are recorded.
-
-
-It is often the case that the idea of Observation Periods does not exist in source data. In those cases, the observation_period_end_date can be inferred as the last Event date available for the Person. In insurance claim data, the Observation Period can be considered as the time period the Person is enrolled with a payer.
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-period_type_concept_id
-
-
-This field can be used to determine the provenance of the Observation Period as in whether the period was determined from an insurance enrollment file, EHR healthcare encounters, or other sources.
-
-
-Choose the observation_period_type_concept_id that best represents how the period was determined. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Type Concept
-
-
-
-
-
-
-
VISIT_OCCURRENCE
-
Table Description
-
This table contains Events where Persons engage with the healthcare system for a duration of time. They are often also called “Encounters”. Visits are defined by a configuration of circumstances under which they occur, such as (i) whether the patient comes to a healthcare institution, the other way around, or the interaction is remote, (ii) whether and what kind of trained medical staff is delivering the service during the Visit, and (iii) whether the Visit is transient or for a longer period involving a stay in bed.
-
User Guide
-
The configuration defining the Visit are described by Concepts in the Visit Domain, which form a hierarchical structure, but rolling up to generally familiar Visits adopted in most healthcare systems worldwide:
-
-
Inpatient Visit: Person visiting hospital, at a Care Site, in bed, for duration of more than one day, with physicians and other Providers permanently available to deliver service around the clock
-
Emergency Room Visit: Person visiting dedicated healthcare institution for treating emergencies, at a Care Site, within one day, with physicians and Providers permanently available to deliver service around the clock
-
Emergency Room and Inpatient Visit: Person visiting ER followed by a subsequent Inpatient Visit, where Emergency department is part of hospital, and transition from the ER to other hospital departments is undefined
-
Non-hospital institution Visit: Person visiting dedicated institution for reasons of poor health, at a Care Site, long-term or permanently, with no physician but possibly other Providers permanently available to deliver service around the clock
-
Outpatient Visit: Person visiting dedicated ambulatory healthcare institution, at a Care Site, within one day, without bed, with physicians or medical Providers delivering service during Visit
-
Home Visit: Provider visiting Person, without a Care Site, within one day, delivering service
-
Telehealth Visit: Patient engages with Provider through communication media
-
Pharmacy Visit: Person visiting pharmacy for dispensing of Drug, at a Care Site, within one day
-
Laboratory Visit: Patient visiting dedicated institution, at a Care Site, within one day, for the purpose of a Measurement.
-
Ambulance Visit: Person using transportation service for the purpose of initiating one of the other Visits, without a Care Site, within one day, potentially with Providers accompanying the Visit and delivering service
-
Case Management Visit: Person interacting with healthcare system, without a Care Site, within a day, with no Providers involved, for administrative purposes
-
-
The Visit duration, or ‘length of stay’, is defined as VISIT_END_DATE - VISIT_START_DATE. For all Visits this is <1 day, except Inpatient Visits and Non-hospital institution Visits. The CDM also contains the VISIT_DETAIL table where additional information about the Visit is stored, for example, transfers between units during an inpatient Visit.
-
ETL Conventions
-
Visits can be derived easily if the source data contain coding systems for Place of Service or Procedures, like CPT codes for well visits. In those cases, the codes can be looked up and mapped to a Standard Visit Concept. Otherwise, Visit Concepts have to be identified in the ETL process. This table will contain concepts in the Visit domain. These concepts are arranged in a hierarchical structure to facilitate cohort definitions by rolling up to generally familiar Visits adopted in most healthcare systems worldwide. Visits can be adjacent to each other, i.e. the end date of one can be identical with the start date of the other. As a consequence, more than one-day Visits or their descendants can be recorded for the same day. Multi-day visits must not overlap, i.e. share days other than start and end days. It is often the case that some logic should be written for how to define visits and how to assign Visit_Concept_Id. For example, in US claims outpatient visits that appear to occur within the time period of an inpatient visit can be rolled into one with the same Visit_Occurrence_Id. In EHR data inpatient visits that are within one day of each other may be strung together to create one visit. It will all depend on the source data and how encounter records should be translated to visit occurrences. Providers can be associated with a Visit through the PROVIDER_ID field, or indirectly through PROCEDURE_OCCURRENCE records linked both to the VISIT and PROVIDER tables.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-visit_occurrence_id
-
-
-Use this to identify unique interactions between a person and the health care system. This identifier links across the other CDM event tables to associate events with a visit.
-
-
-This should be populated by creating a unique identifier for each unique interaction between a person and the healthcare system where the person receives a medical good or service over a span of time.
-
-
-integer
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-visit_concept_id
-
-
-This field contains a concept id representing the kind of visit, like inpatient or outpatient. All concepts in this field should be standard and belong to the Visit domain.
-
-
-Populate this field based on the kind of visit that took place for the person. For example this could be “Inpatient Visit”, “Outpatient Visit”, “Ambulatory Visit”, etc. This table will contain standard concepts in the Visit domain. These concepts are arranged in a hierarchical structure to facilitate cohort definitions by rolling up to generally familiar Visits adopted in most healthcare systems worldwide. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Visit
-
-
-
-
-visit_start_date
-
-
-For inpatient visits, the start date is typically the admission date. For outpatient visits the start date and end date will be the same.
-
-
-When populating VISIT_START_DATE, you should think about the patient experience to make decisions on how to define visits. In the case of an inpatient visit this should be the date the patient was admitted to the hospital or institution. In all other cases this should be the date of the patient-provider interaction.
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-visit_start_datetime
-
-
-
-
-If no time is given for the start date of a visit, set it to midnight (00:00:0000).
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-visit_end_date
-
-
-For inpatient visits the end date is typically the discharge date.
-
-
-Visit end dates are mandatory. If end dates are not provided in the source there are three ways in which to derive them: - Outpatient Visit: visit_end_datetime = visit_start_datetime - Emergency Room Visit: visit_end_datetime = visit_start_datetime - Inpatient Visit: Usually there is information about discharge. If not, you should be able to derive the end date from the sudden decline of activity or from the absence of inpatient procedures/drugs. - Non-hospital institution Visits: Particularly for claims data, if end dates are not provided assume the visit is for the duration of month that it occurs. For Inpatient Visits ongoing at the date of ETL, put date of processing the data into visit_end_datetime and visit_type_concept_id with 32220 “Still patient” to identify the visit as incomplete. - All other Visits: visit_end_datetime = visit_start_datetime. If this is a one-day visit the end date should match the start date.
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-visit_end_datetime
-
-
-
-
-If no time is given for the end date of a visit, set it to midnight (00:00:0000).
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-visit_type_concept_id
-
-
-Use this field to understand the provenance of the visit record, or where the record comes from.
-
-
-Populate this field based on the provenance of the visit record, as in whether it came from an EHR record or billing claim. Accepted Concepts.
-
-
-Integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Type Concept
-
-
-
-
-provider_id
-
-
-There will only be one provider per visit record and the ETL document should clearly state how they were chosen (attending, admitting, etc.). If there are multiple providers associated with a visit in the source, this can be reflected in the event tables (CONDITION_OCCURRENCE, PROCEDURE_OCCURRENCE, etc.) or in the VISIT_DETAIL table.
-
-
-If there are multiple providers associated with a visit, you will need to choose which one to put here. The additional providers can be stored in the VISIT_DETAIL table.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-PROVIDER
-
-
-
-
-
-
-care_site_id
-
-
-This field provides information about the Care Site where the Visit took place.
-
-
-There should only be one Care Site associated with a Visit.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CARE_SITE
-
-
-
-
-
-
-visit_source_value
-
-
-This field houses the verbatim value from the source data representing the kind of visit that took place (inpatient, outpatient, emergency, etc.)
-
-
-If there is information about the kind of visit in the source data that value should be stored here. If a visit is an amalgamation of visits from the source then use a hierarchy to choose the visit source value, such as IP -> ER-> OP. This should line up with the logic chosen to determine how visits are created.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-visit_source_concept_id
-
-
-
-
-If the visit source value is coded in the source data using an OMOP supported vocabulary put the concept id representing the source value here.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-admitting_source_concept_id
-
-
-Use this field to determine where the patient was admitted from. This concept is part of the visit domain and can indicate if a patient was admitted to the hospital from a long-term care facility, for example.
-
-
-If available, map the admitted_from_source_value to a standard concept in the visit domain. Accepted Concepts.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Visit
-
-
-
-
-admitting_source_value
-
-
-
-
-This information may be called something different in the source data but the field is meant to contain a value indicating where a person was admitted from. Typically this applies only to visits that have a length of stay, like inpatient visits or long-term care visits.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-discharge_to_concept_id
-
-
-Use this field to determine where the patient was discharged to after a visit. This concept is part of the visit domain and can indicate if a patient was discharged to home or sent to a long-term care facility, for example.
-
-
-If available, map the discharge_to_source_value to a standard concept in the visit domain. Accepted Concepts.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Visit
-
-
-
-
-discharge_to_source_value
-
-
-
-
-This information may be called something different in the source data but the field is meant to contain a value indicating where a person was discharged to after a visit, as in they went home or were moved to long-term care. Typically this applies only to visits that have a length of stay of a day or more.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-preceding_visit_occurrence_id
-
-
-Use this field to find the visit that occurred for the person prior to the given visit. There could be a few days or a few years in between.
-
-
-This field can be used to link a visit immediately preceding the current visit. Note this is not symmetrical, and there is no such thing as a “following_visit_id”.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_OCCURRENCE
-
-
-
-
-
-
-
-
-
VISIT_DETAIL
-
Table Description
-
The VISIT_DETAIL table is an optional table used to represents details of each record in the parent VISIT_OCCURRENCE table. A good example of this would be the movement between units in a hospital during an inpatient stay or claim lines associated with a one insurance claim. For every record in the VISIT_OCCURRENCE table there may be 0 or more records in the VISIT_DETAIL table with a 1:n relationship where n may be 0. The VISIT_DETAIL table is structurally very similar to VISIT_OCCURRENCE table and belongs to the visit domain.
-
User Guide
-
The configuration defining the Visit Detail is described by Concepts in the Visit Domain, which form a hierarchical structure. The Visit Detail record will have an associated to the Visit Occurrence record in two ways: 1. The Visit Detail record will have the VISIT_OCCURRENCE_ID it is associated to 2. The VISIT_DETAIL_CONCEPT_ID will be a descendant of the VISIT_CONCEPT_ID for the Visit.
-
ETL Conventions
-
It is not mandatory that the VISIT_DETAIL table be filled in, but if you find that the logic to create VISIT_OCCURRENCE records includes the roll-up of multiple smaller records to create one picture of a Visit then it is a good idea to use VISIT_DETAIL. In EHR data, for example, a Person may be in the hospital but instead of one over-arching Visit their encounters are recorded as times they interacted with a health care provider. A Person in the hospital interacts with multiple providers multiple times a day so the encounters must be strung together using some heuristic (defined by the ETL) to identify the entire Visit. In this case the encounters would be considered Visit Details and the entire Visit would be the Visit Occurrence. In this example it is also possible to use the Vocabulary to distinguish Visit Details from a Visit Occurrence by setting the VISIT_CONCEPT_ID to 9201 and the VISIT_DETAIL_CONCEPT_IDs either to 9201 or its children to indicate where the patient was in the hospital at the time of care.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-visit_detail_id
-
-
-Use this to identify unique interactions between a person and the health care system. This identifier links across the other CDM event tables to associate events with a visit detail.
-
-
-This should be populated by creating a unique identifier for each unique interaction between a person and the healthcare system where the person receives a medical good or service over a span of time.
-
-
-integer
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-visit_detail_concept_id
-
-
-This field contains a concept id representing the kind of visit detail, like inpatient or outpatient. All concepts in this field should be standard and belong to the Visit domain.
-
-
-Populate this field based on the kind of visit that took place for the person. For example this could be “Inpatient Visit”, “Outpatient Visit”, “Ambulatory Visit”, etc. This table will contain standard concepts in the Visit domain. These concepts are arranged in a hierarchical structure to facilitate cohort definitions by rolling up to generally familiar Visits adopted in most healthcare systems worldwide. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Visit
-
-
-
-
-visit_detail_start_date
-
-
-This is the date of the start of the encounter. This may or may not be equal to the date of the Visit the Visit Detail is associated with.
-
-
-When populating VISIT_DETAIL_START_DATE, you should think about the patient experience to make decisions on how to define visits. Most likely this should be the date of the patient-provider interaction.
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-visit_detail_start_datetime
-
-
-
-
-If no time is given for the start date of a visit, set it to midnight (00:00:0000).
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-visit_detail_end_date
-
-
-This the end date of the patient-provider interaction.
-
-
-Visit Detail end dates are mandatory. If end dates are not provided in the source there are three ways in which to derive them: - Outpatient Visit Detail: visit_detail_end_datetime = visit_detail_start_datetime - Emergency Room Visit Detail: visit_detail_end_datetime = visit_detail_start_datetime - Inpatient Visit Detail: Usually there is information about discharge. If not, you should be able to derive the end date from the sudden decline of activity or from the absence of inpatient procedures/drugs. - Non-hospital institution Visit Details: Particularly for claims data, if end dates are not provided assume the visit is for the duration of month that it occurs. For Inpatient Visit Details ongoing at the date of ETL, put date of processing the data into visit_detai_end_datetime and visit_detail_type_concept_id with 32220 “Still patient” to identify the visit as incomplete. All other Visits Details: visit_detail_end_datetime = visit_detail_start_datetime.
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-visit_detail_end_datetime
-
-
-
-
-If no time is given for the end date of a visit, set it to midnight (00:00:0000).
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-visit_detail_type_concept_id
-
-
-Use this field to understand the provenance of the visit detail record, or where the record comes from.
-
-
-Populate this field based on the provenance of the visit detail record, as in whether it came from an EHR record or billing claim. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Type Concept
-
-
-
-
-provider_id
-
-
-There will only be one provider per visit record and the ETL document should clearly state how they were chosen (attending, admitting, etc.). This is a typical reason for leveraging the VISIT_DETAIL table as even though each VISIT_DETAIL record can only have one provider, there is no limit to the number of VISIT_DETAIL records that can be associated to a VISIT_OCCURRENCE record.
-
-
-The additional providers associated to a Visit can be stored in this table where each VISIT_DETAIL record represents a different provider.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-PROVIDER
-
-
-
-
-
-
-care_site_id
-
-
-This field provides information about the Care Site where the Visit Detail took place.
-
-
-There should only be one Care Site associated with a Visit Detail.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CARE_SITE
-
-
-
-
-
-
-visit_detail_source_value
-
-
-This field houses the verbatim value from the source data representing the kind of visit detail that took place (inpatient, outpatient, emergency, etc.)
-
-
-If there is information about the kind of visit detail in the source data that value should be stored here. If a visit is an amalgamation of visits from the source then use a hierarchy to choose the VISIT_DETAIL_SOURCE_VALUE, such as IP -> ER-> OP. This should line up with the logic chosen to determine how visits are created.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-visit_detail_source_concept_id
-
-
-
-
-If the VISIT_DETAIL_SOURCE_VALUE is coded in the source data using an OMOP supported vocabulary put the concept id representing the source value here.
-
-
-Integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-admitting_source_value
-
-
-
-
-This information may be called something different in the source data but the field is meant to contain a value indicating where a person was admitted from. Typically this applies only to visits that have a length of stay, like inpatient visits or long-term care visits.
-
-
-Varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-admitting_source_concept_id
-
-
-Use this field to determine where the patient was admitted from. This concept is part of the visit domain and can indicate if a patient was admitted to the hospital from a long-term care facility, for example.
-
-
-If available, map the admitted_from_source_value to a standard concept in the visit domain. Accepted Concepts.
-
-
-Integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Visit
-
-
-
-
-discharge_to_source_value
-
-
-
-
-This information may be called something different in the source data but the field is meant to contain a value indicating where a person was discharged to after a visit, as in they went home or were moved to long-term care. Typically this applies only to visits that have a length of stay of a day or more.
-
-
-Varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-discharge_to_concept_id
-
-
-Use this field to determine where the patient was discharged to after a visit detail record. This concept is part of the visit domain and can indicate if a patient was discharged to home or sent to a long-term care facility, for example.
-
-
-If available, map the DISCHARGE_TO_SOURCE_VALUE to a Standard Concept in the Visit domain. Accepted Concepts.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Visit
-
-
-
-
-preceding_visit_detail_id
-
-
-Use this field to find the visit detail that occurred for the person prior to the given visit detail record. There could be a few days or a few years in between.
-
-
-The PRECEDING_VISIT_DETAIL_ID can be used to link a visit immediately preceding the current Visit Detail. Note this is not symmetrical, and there is no such thing as a “following_visit_id”.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_DETAIL
-
-
-
-
-
-
-visit_detail_parent_id
-
-
-Use this field to find the visit detail that subsumes the given visit detail record. This is used in the case that a visit detail record needs to be nested beyond the VISIT_OCCURRENCE/VISIT_DETAIL relationship.
-
-
-If there are multiple nested levels to how Visits are represented in the source, the VISIT_DETAIL_PARENT_ID can be used to record this relationship.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_DETAIL
-
-
-
-
-
-
-visit_occurrence_id
-
-
-Use this field to link the VISIT_DETAIL record to its VISIT_OCCURRENCE.
-
-
-Put the VISIT_OCCURRENCE_ID that subsumes the VISIT_DETAIL record here.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-VISIT_OCCURRENCE
-
-
-
-
-
-
-
-
-
CONDITION_OCCURRENCE
-
Table Description
-
This table contains records of Events of a Person suggesting the presence of a disease or medical condition stated as a diagnosis, a sign, or a symptom, which is either observed by a Provider or reported by the patient.
-
User Guide
-
Conditions are defined by Concepts from the Condition domain, which form a complex hierarchy. As a result, the same Person with the same disease may have multiple Condition records, which belong to the same hierarchical family. Most Condition records are mapped from diagnostic codes, but recorded signs, symptoms and summary descriptions also contribute to this table. Rule out diagnoses should not be recorded in this table, but in reality their negating nature is not always captured in the source data, and other precautions must be taken when when identifying Persons who should suffer from the recorded Condition. Record all conditions as they exist in the source data. Any decisions about diagnosis/phenotype definitions would be done through cohort specifications. These cohorts can be housed in the COHORT table. Conditions span a time interval from start to end, but are typically recorded as single snapshot records with no end date. The reason is twofold: (i) At the time of the recording the duration is not known and later not recorded, and (ii) the Persons typically cease interacting with the healthcare system when they feel better, which leads to incomplete capture of resolved Conditions. The CONDITION_ERA table addresses this issue. Family history and past diagnoses (‘history of’) are not recorded in this table. Instead, they are listed in the OBSERVATION table. Codes written in the process of establishing the diagnosis, such as ‘question of’ of and ‘rule out’, should not represented here. Instead, they should be recorded in the OBSERVATION table, if they are used for analyses. However, this information is not always available.
-
ETL Conventions
-
Source codes and source text fields mapped to Standard Concepts of the Condition Domain have to be recorded here.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-condition_occurrence_id
-
-
-The unique key given to a condition record for a person. Refer to the ETL for how duplicate conditions during the same visit were handled.
-
-
-Each instance of a condition present in the source data should be assigned this unique key. In some cases, a person can have multiple records of the same condition within the same visit. It is valid to keep these duplicates and assign them individual, unique, CONDITION_OCCURRENCE_IDs, though it is up to the ETL how they should be handled.
-
-
-integer
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-The PERSON_ID of the PERSON for whom the condition is recorded.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-condition_concept_id
-
-
-The CONDITION_CONCEPT_ID field is recommended for primary use in analyses, and must be used for network studies. This is the standard concept mapped from the source value which represents a condition
-
-
-The CONCEPT_ID that the CONDITION_SOURCE_VALUE maps to. Only records whose source values map to concepts with a domain of “Condition” should go in this table. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Condition
-
-
-
-
-condition_start_date
-
-
-Use this date to determine the start date of the condition
-
-
-Most often data sources do not have the idea of a start date for a condition. Rather, if a source only has one date associated with a condition record it is acceptable to use that date for both the CONDITION_START_DATE and the CONDITION_END_DATE.
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-condition_start_datetime
-
-
-
-
-If a source does not specify datetime the convention is to set the time to midnight (00:00:0000)
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-condition_end_date
-
-
-Use this date to determine the end date of the condition
-
-
-Most often data sources do not have the idea of a start date for a condition. Rather, if a source only has one date associated with a condition record it is acceptable to use that date for both the CONDITION_START_DATE and the CONDITION_END_DATE.
-
-
-date
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-condition_end_datetime
-
-
-
-
-If a source does not specify datetime the convention is to set the time to midnight (00:00:0000)
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-condition_type_concept_id
-
-
-This field can be used to determine the provenance of the Condition record, as in whether the condition was from an EHR system, insurance claim, registry, or other sources.
-
-
-Choose the CONDITION_TYPE_CONCEPT_ID that best represents the provenance of the record. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Type Concept
-
-
-
-
-condition_status_concept_id
-
-
-This concept represents the point during the visit the diagnosis was given (admitting diagnosis, final diagnosis), whether the diagnosis was determined due to laboratory findings, if the diagnosis was exclusionary, or if it was a preliminary diagnosis, among others.
-
-
-Choose the Concept in the Condition Status domain that best represents the point during the visit when the diagnosis was given. These can include admitting diagnosis, principal diagnosis, and secondary diagnosis. Accepted Concepts.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Condition Status
-
-
-
-
-stop_reason
-
-
-The Stop Reason indicates why a Condition is no longer valid with respect to the purpose within the source data. Note that a Stop Reason does not necessarily imply that the condition is no longer occurring.
-
-
-This information is often not populated in source data and it is a valid etl choice to leave it blank if the information does not exist.
-
-
-varchar(20)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-provider_id
-
-
-The provider associated with condition record, e.g. the provider who made the diagnosis or the provider who recorded the symptom.
-
-
-The ETL may need to make a choice as to which PROVIDER_ID to put here. Based on what is available this may or may not be different than the provider associated with the overall VISIT_OCCURRENCE record, for example the admitting vs attending physician on an EHR record.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-PROVIDER
-
-
-
-
-
-
-visit_occurrence_id
-
-
-The visit during which the condition occurred.
-
-
-Depending on the structure of the source data, this may have to be determined based on dates. If a CONDITION_START_DATE occurs within the start and end date of a Visit it is a valid ETL choice to choose the VISIT_OCCURRENCE_ID from the Visit that subsumes it, even if not explicitly stated in the data. While not required, an attempt should be made to locate the VISIT_OCCURRENCE_ID of the CONDITION_OCCURRENCE record.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_OCCURRENCE
-
-
-
-
-
-
-visit_detail_id
-
-
-The VISIT_DETAIL record during which the condition occurred. For example, if the person was in the ICU at the time of the diagnosis the VISIT_OCCURRENCE record would reflect the overall hospital stay and the VISIT_DETAIL record would reflect the ICU stay during the hospital visit.
-
-
-Same rules apply as for the VISIT_OCCURRENCE_ID.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_DETAIL
-
-
-
-
-
-
-condition_source_value
-
-
-This field houses the verbatim value from the source data representing the condition that occurred. For example, this could be an ICD10 or Read code.
-
-
-This code is mapped to a Standard Condition Concept in the Standardized Vocabularies and the original code is stored here for reference.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-condition_source_concept_id
-
-
-This is the concept representing the condition source value and may not necessarily be standard. This field is discouraged from use in analysis because it is not required to contain Standard Concepts that are used across the OHDSI community, and should only be used when Standard Concepts do not adequately represent the source detail for the Condition necessary for a given analytic use case. Consider using CONDITION_CONCEPT_ID instead to enable standardized analytics that can be consistent across the network.
-
-
-If the CONDITION_SOURCE_VALUE is coded in the source data using an OMOP supported vocabulary put the concept id representing the source value here.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-condition_status_source_value
-
-
-This field houses the verbatim value from the source data representing the condition status.
-
-
-This information may be called something different in the source data but the field is meant to contain a value indicating when and how a diagnosis was given to a patient. This source value is mapped to a standard concept which is stored in the CONDITION_STATUS_CONCEPT_ID field.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
DRUG_EXPOSURE
-
Table Description
-
This table captures records about the exposure to a Drug ingested or otherwise introduced into the body. A Drug is a biochemical substance formulated in such a way that when administered to a Person it will exert a certain biochemical effect on the metabolism. Drugs include prescription and over-the-counter medicines, vaccines, and large-molecule biologic therapies. Radiological devices ingested or applied locally do not count as Drugs.
-
User Guide
-
The purpose of records in this table is to indicate an exposure to a certain drug as best as possible. In this context a drug is defined as an active ingredient. Drug Exposures are defined by Concepts from the Drug domain, which form a complex hierarchy. As a result, one DRUG_SOURCE_CONCEPT_ID may map to multiple standard concept ids if it is a combination product. Records in this table represent prescriptions written, prescriptions dispensed, and drugs administered by a provider to name a few. The DRUG_TYPE_CONCEPT_ID can be used to find and filter on these types. This table includes additional information about the drug products, the quantity given, and route of administration.
-
ETL Conventions
-
Information about quantity and dose is provided in a variety of different ways and it is important for the ETL to provide as much information as possible from the data. Depending on the provenance of the data fields may be captured differently i.e. quantity for drugs administered may have a separate meaning from quantity for prescriptions dispensed. If a patient has multiple records on the same day for the same drug or procedures the ETL should not de-dupe them unless there is probable reason to believe the item is a true data duplicate. Take note on how to handle refills for prescriptions written.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-drug_exposure_id
-
-
-The unique key given to records of drug dispensings or administrations for a person. Refer to the ETL for how duplicate drugs during the same visit were handled.
-
-
-Each instance of a drug dispensing or administration present in the source data should be assigned this unique key. In some cases, a person can have multiple records of the same drug within the same visit. It is valid to keep these duplicates and assign them individual, unique, DRUG_EXPOSURE_IDs, though it is up to the ETL how they should be handled.
-
-
-integer
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-The PERSON_ID of the PERSON for whom the drug dispensing or administration is recorded. This may be a system generated code.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-drug_concept_id
-
-
-The DRUG_CONCEPT_ID field is recommended for primary use in analyses, and must be used for network studies. This is the standard concept mapped from the source concept id which represents a drug product or molecule otherwise introduced to the body. The drug concepts can have a varying degree of information about drug strength and dose. This information is relevant in the context of quantity and administration information in the subsequent fields plus strength information from the DRUG_STRENGTH table, provided as part of the standard vocabulary download.
-
-
-The CONCEPT_ID that the DRUG_SOURCE_VALUE maps to. The concept id should be derived either from mapping from the source concept id or by picking the drug concept representing the most amount of detail you have. Records whose source values map to standard concepts with a domain of Drug should go in this table. When the Drug Source Value of the code cannot be translated into Standard Drug Concept IDs, a Drug exposure entry is stored with only the corresponding SOURCE_CONCEPT_ID and DRUG_SOURCE_VALUE and a DRUG_CONCEPT_ID of 0. The Drug Concept with the most detailed content of information is preferred during the mapping process. These are indicated in the CONCEPT_CLASS_ID field of the Concept and are recorded in the following order of precedence: ‘Branded Pack’, ‘Clinical Pack’, ‘Branded Drug’, ‘Clinical Drug’, ‘Branded Drug Component’, ‘Clinical Drug Component’, ‘Branded Drug Form’, ‘Clinical Drug Form’, and only if no other information is available ‘Ingredient’. Note: If only the drug class is known, the DRUG_CONCEPT_ID field should contain 0. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Drug
-
-
-
-
-drug_exposure_start_date
-
-
-Use this date to determine the start date of the drug record.
-
-
-Valid entries include a start date of a prescription, the date a prescription was filled, or the date on which a Drug administration was recorded. It is a valid ETL choice to use the date the drug was ordered as the DRUG_EXPOSURE_START_DATE.
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-drug_exposure_start_datetime
-
-
-
-
-This is not required, though it is in v6. If a source does not specify datetime the convention is to set the time to midnight (00:00:0000)
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-drug_exposure_end_date
-
-
-The DRUG_EXPOSURE_END_DATE denotes the day the drug exposure ended for the patient.
-
-
-If this information is not explicitly available in the data, infer the end date using the following methods:
1. Start first with duration or days supply using the calculation drug start date + days supply -1 day. 2. Use quantity divided by daily dose that you may obtain from the sig or a source field (or assumed daily dose of 1) for solid, indivisibile, drug products. If quantity represents ingredient amount, quantity divided by daily dose * concentration (from drug_strength) drug concept id tells you the dose form. 3. If it is an administration record, set drug end date equal to drug start date. If the record is a written prescription then set end date to start date + 29. If the record is a mail-order prescription set end date to start date + 89. The end date must be equal to or greater than the start date. Ibuprofen 20mg/mL oral solution concept tells us this is oral solution. Calculate duration as quantity (200 example) * daily dose (5mL) /concentration (20mg/mL) 200*5/20 = 50 days. Examples by dose form
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-drug_exposure_end_datetime
-
-
-
-
-This is not required, though it is in v6. If a source does not specify datetime the convention is to set the time to midnight (00:00:0000)
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-verbatim_end_date
-
-
-This is the end date of the drug exposure as it appears in the source data, if it is given
-
-
-Put the end date or discontinuation date as it appears from the source data or leave blank if unavailable.
-
-
-date
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-drug_type_concept_id
-
-
-You can use the TYPE_CONCEPT_ID to delineate between prescriptions written vs. prescriptions dispensed vs. medication history vs. patient-reported exposure, etc.
-
-
-Choose the drug_type_concept_id that best represents the provenance of the record, for example whether it came from a record of a prescription written or physician administered drug. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Type Concept
-
-
-
-
-stop_reason
-
-
-The reason a person stopped a medication as it is represented in the source. Reasons include regimen completed, changed, removed, etc. This field will be retired in v6.0.
-
-
-This information is often not populated in source data and it is a valid etl choice to leave it blank if the information does not exist.
-
-
-varchar(20)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-refills
-
-
-This is only filled in when the record is coming from a prescription written this field is meant to represent intended refills at time of the prescription.
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-quantity
-
-
-
-
-To find the dose form of a drug the RELATIONSHIP table can be used where the relationship_id is ‘Has dose form’. If liquid, quantity stands for the total amount dispensed or ordered of ingredient in the units given by the drug_strength table. If the unit from the source data does not align with the unit in the DRUG_STRENGTH table the quantity should be converted to the correct unit given in DRUG_STRENGTH. For clinical drugs with fixed dose forms (tablets etc.) the quantity is the number of units/tablets/capsules prescribed or dispensed (can be partial, but then only 1/2 or 1/3, not 0.01). Clinical drugs with divisible dose forms (injections) the quantity is the amount of ingredient the patient got. For example, if the injection is 2mg/mL but the patient got 80mL then quantity is reported as 160. Quantified clinical drugs with divisible dose forms (prefilled syringes), the quantity is the amount of ingredient similar to clinical drugs. Please see how to calculate drug dose for more information.
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-days_supply
-
-
-
-
-Days supply of the drug. This should be the verbatim days_supply as given on the prescription. If the drug is physician administered use duration end date if given or set to 1 as default if duration is not available.
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-sig
-
-
-This is the verbatim instruction for the drug as written by the provider.
-
-
-Put the written out instructions for the drug as it is verbatim in the source, if available.
-
-
-varchar(MAX)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-route_concept_id
-
-
-
-
-The standard CONCEPT_ID that the ROUTE_SOURCE_VALUE maps to in the route domain.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Route
-
-
-
-
-lot_number
-
-
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-provider_id
-
-
-The Provider associated with drug record, e.g. the provider who wrote the prescription or the provider who administered the drug.
-
-
-The ETL may need to make a choice as to which PROVIDER_ID to put here. Based on what is available this may or may not be different than the provider associated with the overall VISIT_OCCURRENCE record, for example the ordering vs administering physician on an EHR record.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-PROVIDER
-
-
-
-
-
-
-visit_occurrence_id
-
-
-The Visit during which the drug was prescribed, administered or dispensed.
-
-
-To populate this field drug exposures must be explicitly initiated in the visit.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_OCCURRENCE
-
-
-
-
-
-
-visit_detail_id
-
-
-The VISIT_DETAIL record during which the drug exposure occurred. For example, if the person was in the ICU at the time of the drug administration the VISIT_OCCURRENCE record would reflect the overall hospital stay and the VISIT_DETAIL record would reflect the ICU stay during the hospital visit.
-
-
-Same rules apply as for the VISIT_OCCURRENCE_ID.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_DETAIL
-
-
-
-
-
-
-drug_source_value
-
-
-This field houses the verbatim value from the source data representing the drug exposure that occurred. For example, this could be an NDC or Gemscript code.
-
-
-This code is mapped to a Standard Drug Concept in the Standardized Vocabularies and the original code is stored here for reference.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-drug_source_concept_id
-
-
-This is the concept representing the drug source value and may not necessarily be standard. This field is discouraged from use in analysis because it is not required to contain Standard Concepts that are used across the OHDSI community, and should only be used when Standard Concepts do not adequately represent the source detail for the Drug necessary for a given analytic use case. Consider using DRUG_CONCEPT_ID instead to enable standardized analytics that can be consistent across the network.
-
-
-If the DRUG_SOURCE_VALUE is coded in the source data using an OMOP supported vocabulary put the concept id representing the source value here.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-route_source_value
-
-
-This field houses the verbatim value from the source data representing the drug route.
-
-
-This information may be called something different in the source data but the field is meant to contain a value indicating when and how a drug was given to a patient. This source value is mapped to a standard concept which is stored in the ROUTE_CONCEPT_ID field.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-dose_unit_source_value
-
-
-This field houses the verbatim value from the source data representing the dose unit of the drug given.
-
-
-This information may be called something different in the source data but the field is meant to contain a value indicating the unit of dosage of drug given to the patient. This is an older column and will be deprecated in an upcoming version.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
PROCEDURE_OCCURRENCE
-
Table Description
-
This table contains records of activities or processes ordered by, or carried out by, a healthcare provider on the patient with a diagnostic or therapeutic purpose.
-
User Guide
-
Lab tests are not a procedure, if something is observed with an expected resulting amount and unit then it should be a measurement. Phlebotomy is a procedure but so trivial that it tends to be rarely captured. It can be assumed that there is a phlebotomy procedure associated with many lab tests, therefore it is unnecessary to add them as separate procedures. If the user finds the same procedure over concurrent days, it is assumed those records are part of a procedure lasting more than a day. This logic is in lieu of the procedure_end_date, which will be added in a future version of the CDM.
-
ETL Conventions
-
If a procedure lasts more than a day, then it should be recorded as a separate record for each day the procedure occurred, this logic is in lieu of the PROCEDURE_END_DATE, which will be added in a future version of the CDM. When dealing with duplicate records, the ETL must determine whether to sum them up into one record or keep them separate. Things to consider are: - Same Procedure - Same PROCEDURE_DATETIME - Same Visit Occurrence or Visit Detail - Same Provider - Same Modifier for Procedures. Source codes and source text fields mapped to Standard Concepts of the Procedure Domain have to be recorded here.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-procedure_occurrence_id
-
-
-The unique key given to a procedure record for a person. Refer to the ETL for how duplicate procedures during the same visit were handled.
-
-
-Each instance of a procedure occurrence in the source data should be assigned this unique key. In some cases, a person can have multiple records of the same procedure within the same visit. It is valid to keep these duplicates and assign them individual, unique, PROCEDURE_OCCURRENCE_IDs, though it is up to the ETL how they should be handled.
-
-
-integer
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-The PERSON_ID of the PERSON for whom the procedure is recorded. This may be a system generated code.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-procedure_concept_id
-
-
-The PROCEDURE_CONCEPT_ID field is recommended for primary use in analyses, and must be used for network studies. This is the standard concept mapped from the source value which represents a procedure
-
-
-The CONCEPT_ID that the PROCEDURE_SOURCE_VALUE maps to. Only records whose source values map to standard concepts with a domain of “Procedure” should go in this table. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Procedure
-
-
-
-
-procedure_date
-
-
-Use this date to determine the date the procedure occurred.
-
-
-If a procedure lasts more than a day, then it should be recorded as a separate record for each day the procedure occurred, this logic is in lieu of the procedure_end_date, which will be added in a future version of the CDM.
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-procedure_datetime
-
-
-
-
-This is not required, though it is in v6. If a source does not specify datetime the convention is to set the time to midnight (00:00:0000)
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-procedure_type_concept_id
-
-
-This field can be used to determine the provenance of the Procedure record, as in whether the procedure was from an EHR system, insurance claim, registry, or other sources.
-
-
-Choose the PROCEDURE_TYPE_CONCEPT_ID that best represents the provenance of the record, for example whether it came from an EHR record or billing claim. If a procedure is recorded as an EHR encounter, the PROCEDURE_TYPE_CONCEPT would be ‘EHR encounter record’. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Type Concept
-
-
-
-
-modifier_concept_id
-
-
-The modifiers are intended to give additional information about the procedure but as of now the vocabulary is under review.
-
-
-It is up to the ETL to choose how to map modifiers if they exist in source data. These concepts are typically distinguished by ‘Modifier’ concept classes (e.g., ‘CPT4 Modifier’ as part of the ‘CPT4’ vocabulary). If there is more than one modifier on a record, one should be chosen that pertains to the procedure rather than provider. Accepted Concepts.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-quantity
-
-
-If the quantity value is omitted, a single procedure is assumed.
-
-
-If a Procedure has a quantity of ‘0’ in the source, this should default to ‘1’ in the ETL. If there is a record in the source it can be assumed the exposure occurred at least once
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-provider_id
-
-
-The provider associated with the procedure record, e.g. the provider who performed the Procedure.
-
-
-The ETL may need to make a choice as to which PROVIDER_ID to put here. Based on what is available this may or may not be different than the provider associated with the overall VISIT_OCCURRENCE record, for example the admitting vs attending physician on an EHR record.
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-PROVIDER
-
-
-
-
-
-
-visit_occurrence_id
-
-
-The visit during which the procedure occurred.
-
-
-Depending on the structure of the source data, this may have to be determined based on dates. If a PROCEDURE_DATE occurs within the start and end date of a Visit it is a valid ETL choice to choose the VISIT_OCCURRENCE_ID from the Visit that subsumes it, even if not explicitly stated in the data. While not required, an attempt should be made to locate the VISIT_OCCURRENCE_ID of the PROCEDURE_OCCURRENCE record.
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-VISIT_OCCURRENCE
-
-
-
-
-
-
-visit_detail_id
-
-
-The VISIT_DETAIL record during which the Procedure occurred. For example, if the Person was in the ICU at the time of the Procedure the VISIT_OCCURRENCE record would reflect the overall hospital stay and the VISIT_DETAIL record would reflect the ICU stay during the hospital visit.
-
-
-Same rules apply as for the VISIT_OCCURRENCE_ID.
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-VISIT_DETAIL
-
-
-
-
-
-
-procedure_source_value
-
-
-This field houses the verbatim value from the source data representing the procedure that occurred. For example, this could be an CPT4 or OPCS4 code.
-
-
-Use this value to look up the source concept id and then map the source concept id to a standard concept id.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-procedure_source_concept_id
-
-
-This is the concept representing the procedure source value and may not necessarily be standard. This field is discouraged from use in analysis because it is not required to contain Standard Concepts that are used across the OHDSI community, and should only be used when Standard Concepts do not adequately represent the source detail for the Procedure necessary for a given analytic use case. Consider using PROCEDURE_CONCEPT_ID instead to enable standardized analytics that can be consistent across the network.
-
-
-If the PROCEDURE_SOURCE_VALUE is coded in the source data using an OMOP supported vocabulary put the concept id representing the source value here.
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-CONCEPT
-
-
-
-
-
-
-modifier_source_value
-
-
-
-
-The original modifier code from the source is stored here for reference.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
DEVICE_EXPOSURE
-
Table Description
-
The Device domain captures information about a person’s exposure to a foreign physical object or instrument which is used for diagnostic or therapeutic purposes through a mechanism beyond chemical action. Devices include implantable objects (e.g. pacemakers, stents, artificial joints), medical equipment and supplies (e.g. bandages, crutches, syringes), other instruments used in medical procedures (e.g. sutures, defibrillators) and material used in clinical care (e.g. adhesives, body material, dental material, surgical material).
-
User Guide
-
The distinction between Devices or supplies and Procedures are sometimes blurry, but the former are physical objects while the latter are actions, often to apply a Device or supply.
-
ETL Conventions
-
Source codes and source text fields mapped to Standard Concepts of the Device Domain have to be recorded here.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-device_exposure_id
-
-
-The unique key given to records a person’s exposure to a foreign physical object or instrument.
-
-
-Each instance of an exposure to a foreign object or device present in the source data should be assigned this unique key.
-
-
-integer
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-device_concept_id
-
-
-The DEVICE_CONCEPT_ID field is recommended for primary use in analyses, and must be used for network studies. This is the standard concept mapped from the source concept id which represents a foreign object or instrument the person was exposed to.
-
-
-The CONCEPT_ID that the DEVICE_SOURCE_VALUE maps to.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Device
-
-
-
-
-device_exposure_start_date
-
-
-Use this date to determine the start date of the device record.
-
-
-Valid entries include a start date of a procedure to implant a device, the date of a prescription for a device, or the date of device administration.
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-device_exposure_start_datetime
-
-
-
-
-This is not required, though it is in v6. If a source does not specify datetime the convention is to set the time to midnight (00:00:0000)
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-device_exposure_end_date
-
-
-The DEVICE_EXPOSURE_END_DATE denotes the day the device exposure ended for the patient, if given.
-
-
-Put the end date or discontinuation date as it appears from the source data or leave blank if unavailable.
-
-
-date
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-device_exposure_end_datetime
-
-
-
-
-If a source does not specify datetime the convention is to set the time to midnight (00:00:0000)
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-device_type_concept_id
-
-
-You can use the TYPE_CONCEPT_ID to denote the provenance of the record, as in whether the record is from administrative claims or EHR.
-
-
-Choose the drug_type_concept_id that best represents the provenance of the record, for example whether it came from a record of a prescription written or physician administered drug. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Type Concept
-
-
-
-
-unique_device_id
-
-
-This is the Unique Device Identification number for devices regulated by the FDA, if given.
-
-
-For medical devices that are regulated by the FDA, a Unique Device Identification (UDI) is provided if available in the data source and is recorded in the UNIQUE_DEVICE_ID field.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-quantity
-
-
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-provider_id
-
-
-The Provider associated with device record, e.g. the provider who wrote the prescription or the provider who implanted the device.
-
-
-The ETL may need to make a choice as to which PROVIDER_ID to put here. Based on what is available this may or may not be different than the provider associated with the overall VISIT_OCCURRENCE record.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-PROVIDER
-
-
-
-
-
-
-visit_occurrence_id
-
-
-The Visit during which the device was prescribed or given.
-
-
-To populate this field device exposures must be explicitly initiated in the visit.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_OCCURRENCE
-
-
-
-
-
-
-visit_detail_id
-
-
-The Visit Detail during which the device was prescribed or given.
-
-
-To populate this field device exposures must be explicitly initiated in the visit detail record.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_DETAIL
-
-
-
-
-
-
-device_source_value
-
-
-This field houses the verbatim value from the source data representing the device exposure that occurred. For example, this could be an NDC or Gemscript code.
-
-
-This code is mapped to a Standard Device Concept in the Standardized Vocabularies and the original code is stored here for reference.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-device_source_concept_id
-
-
-This is the concept representing the device source value and may not necessarily be standard. This field is discouraged from use in analysis because it is not required to contain Standard Concepts that are used across the OHDSI community, and should only be used when Standard Concepts do not adequately represent the source detail for the Device necessary for a given analytic use case. Consider using DEVICE_CONCEPT_ID instead to enable standardized analytics that can be consistent across the network.
-
-
-If the DEVICE_SOURCE_VALUE is coded in the source data using an OMOP supported vocabulary put the concept id representing the source value here.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-
-
-
MEASUREMENT
-
Table Description
-
The MEASUREMENT table contains records of Measurements, i.e. structured values (numerical or categorical) obtained through systematic and standardized examination or testing of a Person or Person’s sample. The MEASUREMENT table contains both orders and results of such Measurements as laboratory tests, vital signs, quantitative findings from pathology reports, etc. Measurements are stored as attribute value pairs, with the attribute as the Measurement Concept and the value representing the result. The value can be a Concept (stored in VALUE_AS_CONCEPT), or a numerical value (VALUE_AS_NUMBER) with a Unit (UNIT_CONCEPT_ID). The Procedure for obtaining the sample is housed in the PROCEDURE_OCCURRENCE table, though it is unnecessary to create a PROCEDURE_OCCURRENCE record for each measurement if one does not exist in the source data. Measurements differ from Observations in that they require a standardized test or some other activity to generate a quantitative or qualitative result. If there is no result, it is assumed that the lab test was conducted but the result was not captured.
-
User Guide
-
Measurements are predominately lab tests with a few exceptions, like blood pressure or function tests. Results are given in the form of a value and unit combination. When investigating measurements, look for operator_concept_ids (<, >, etc.).
-
ETL Conventions
-
Only records where the source value maps to a Concept in the measurement domain should be included in this table. Even though each Measurement always has a result, the fields VALUE_AS_NUMBER and VALUE_AS_CONCEPT_ID are not mandatory as often the result is not given in the source data. When the result is not known, the Measurement record represents just the fact that the corresponding Measurement was carried out, which in itself is already useful information for some use cases. For some Measurement Concepts, the result is included in the test. For example, ICD10 CONCEPT_ID 45548980 ‘Abnormal level of unspecified serum enzyme’ indicates a Measurement and the result (abnormal). In those situations, the CONCEPT_RELATIONSHIP table in addition to the ‘Maps to’ record contains a second record with the relationship_id set to ‘Maps to value’. In this example, the ‘Maps to’ relationship directs to 4046263 ‘Enzyme measurement’ as well as a ‘Maps to value’ record to 4135493 ‘Abnormal’.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-measurement_id
-
-
-The unique key given to a Measurement record for a Person. Refer to the ETL for how duplicate Measurements during the same Visit were handled.
-
-
-Each instance of a measurement present in the source data should be assigned this unique key. In some cases, a person can have multiple records of the same measurement within the same visit. It is valid to keep these duplicates and assign them individual, unique, MEASUREMENT_IDs, though it is up to the ETL how they should be handled.
-
-
-integer
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-The PERSON_ID of the Person for whom the Measurement is recorded. This may be a system generated code.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-measurement_concept_id
-
-
-The MEASUREMENT_CONCEPT_ID field is recommended for primary use in analyses, and must be used for network studies.
-
-
-The CONCEPT_ID that the MEASUREMENT_SOURCE_CONCEPT_ID maps to. Only records whose SOURCE_CONCEPT_IDs map to Standard Concepts with a domain of “Measurement” should go in this table.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Measurement
-
-
-
-
-measurement_date
-
-
-Use this date to determine the date of the measurement.
-
-
-If there are multiple dates in the source data associated with a record such as order_date, draw_date, and result_date, choose the one that is closest to the date the sample was drawn from the patient.
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-measurement_datetime
-
-
-
-
-This is not required, though it is in v6. If a source does not specify datetime the convention is to set the time to midnight (00:00:0000)
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-measurement_time
-
-
-
-
-This is present for backwards compatibility and will be deprecated in an upcoming version.
-
-
-varchar(10)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-measurement_type_concept_id
-
-
-This field can be used to determine the provenance of the Measurement record, as in whether the measurement was from an EHR system, insurance claim, registry, or other sources.
-
-
-Choose the MEASUREMENT_TYPE_CONCEPT_ID that best represents the provenance of the record, for example whether it came from an EHR record or billing claim. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Type Concept
-
-
-
-
-operator_concept_id
-
-
-The meaning of Concept 4172703 for ‘=’ is identical to omission of a OPERATOR_CONCEPT_ID value. Since the use of this field is rare, it’s important when devising analyses to not to forget testing for the content of this field for values different from =.
-
-
-Operators are =, > and these concepts belong to the ‘Meas Value Operator’ domain. Accepted Concepts.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-value_as_number
-
-
-This is the numerical value of the Result of the Measurement, if available. Note that measurements such as blood pressures will be split into their component parts i.e. one record for systolic, one record for diastolic.
-
-
-If there is a negative value coming from the source, set the VALUE_AS_NUMBER to NULL, with the exception of the following Measurements (listed as LOINC codes): - 1925-7 Base excess in Arterial blood by calculation - 1927-3 Base excess in Venous blood by calculation - 8632-2 QRS-Axis - 11555-0 Base excess in Blood by calculation - 1926-5 Base excess in Capillary blood by calculation - 28638-5 Base excess in Arterial cord blood by calculation 28639-3 Base excess in Venous cord blood by calculation
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-value_as_concept_id
-
-
-If the raw data gives a categorial result for measurements those values are captured and mapped to standard concepts in the ‘Meas Value’ domain.
-
-
-If the raw data provides categorial results as well as continuous results for measurements, it is a valid ETL choice to preserve both values. The continuous value should go in the VALUE_AS_NUMBER field and the categorical value should be mapped to a standard concept in the ‘Meas Value’ domain and put in the VALUE_AS_CONCEPT_ID field. This is also the destination for the ‘Maps to value’ relationship.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-unit_concept_id
-
-
-There is currently no vocabulary link between measurement Concepts and unit Concepts, the UNIT_CONCEPT_ID is a representation of the units as provided by the source data after ETL clean up.
-
-
-There is no standardization requirement for units associated with MEASUREMENT_CONCEPT_IDs, however, it is the responsibility of the ETL to choose the most plausible unit.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Unit
-
-
-
-
-range_low
-
-
-Ranges have the same unit as the VALUE_AS_NUMBER. These ranges are provided by the source and should remain NULL if not given.
-
-
-If reference ranges for upper and lower limit of normal as provided (typically by a laboratory) these are stored in the RANGE_HIGH and RANGE_LOW fields. This should be set to NULL if not provided.
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-range_high
-
-
-Ranges have the same unit as the VALUE_AS_NUMBER. These ranges are provided by the source and should remain NULL if not given.
-
-
-If reference ranges for upper and lower limit of normal as provided (typically by a laboratory) these are stored in the RANGE_HIGH and RANGE_LOW fields. This should be set to NULL if not provided.
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-provider_id
-
-
-The provider associated with measurement record, e.g. the provider who ordered the test or the provider who recorded the result.
-
-
-The ETL may need to make a choice as to which PROVIDER_ID to put here. Based on what is available this may or may not be different than the provider associated with the overall VISIT_OCCURRENCE record. For example the admitting vs attending physician on an EHR record.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-PROVIDER
-
-
-
-
-
-
-visit_occurrence_id
-
-
-The visit during which the Measurement occurred.
-
-
-Depending on the structure of the source data, this may have to be determined based on dates. If a MEASUREMENT_DATE occurs within the start and end date of a Visit it is a valid ETL choice to choose the VISIT_OCCURRENCE_ID from the visit that subsumes it, even if not explicitly stated in the data. While not required, an attempt should be made to locate the VISIT_OCCURRENCE_ID of the measurement record. If a measurement is related to a visit explicitly in the source data, it is possible that the result date of the Measurement falls outside of the bounds of the Visit dates.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_OCCURRENCE
-
-
-
-
-
-
-visit_detail_id
-
-
-The VISIT_DETAIL record during which the Measurement occurred. For example, if the Person was in the ICU at the time the VISIT_OCCURRENCE record would reflect the overall hospital stay and the VISIT_DETAIL record would reflect the ICU stay during the hospital visit.
-
-
-Same rules apply as for the VISIT_OCCURRENCE_ID.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_DETAIL
-
-
-
-
-
-
-measurement_source_value
-
-
-This field houses the verbatim value from the source data representing the Measurement that occurred. For example, this could be an ICD10 or Read code.
-
-
-This code is mapped to a Standard Measurement Concept in the Standardized Vocabularies and the original code is stored here for reference.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-measurement_source_concept_id
-
-
-This is the concept representing the MEASUREMENT_SOURCE_VALUE and may not necessarily be standard. This field is discouraged from use in analysis because it is not required to contain Standard Concepts that are used across the OHDSI community, and should only be used when Standard Concepts do not adequately represent the source detail for the Measurement necessary for a given analytic use case. Consider using MEASUREMENT_CONCEPT_ID instead to enable standardized analytics that can be consistent across the network.
-
-
-If the MEASUREMENT_SOURCE_VALUE is coded in the source data using an OMOP supported vocabulary put the concept id representing the source value here.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-unit_source_value
-
-
-This field houses the verbatim value from the source data representing the unit of the Measurement that occurred.
-
-
-This code is mapped to a Standard Condition Concept in the Standardized Vocabularies and the original code is stored here for reference.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-value_source_value
-
-
-This field houses the verbatim result value of the Measurement from the source data .
-
-
-If both a continuous and categorical result are given in the source data such that both VALUE_AS_NUMBER and VALUE_AS_CONCEPT_ID are both included, store the verbatim value that was mapped to VALUE_AS_CONCEPT_ID here.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
OBSERVATION
-
Table Description
-
The OBSERVATION table captures clinical facts about a Person obtained in the context of examination, questioning or a procedure. Any data that cannot be represented by any other domains, such as social and lifestyle facts, medical history, family history, etc. are recorded here.
-
User Guide
-
Observations differ from Measurements in that they do not require a standardized test or some other activity to generate clinical fact. Typical observations are medical history, family history, the stated need for certain treatment, social circumstances, lifestyle choices, healthcare utilization patterns, etc. If the generation clinical facts requires a standardized testing such as lab testing or imaging and leads to a standardized result, the data item is recorded in the MEASUREMENT table. If the clinical fact observed determines a sign, symptom, diagnosis of a disease or other medical condition, it is recorded in the CONDITION_OCCURRENCE table. Valid Observation Concepts are not enforced to be from any domain though they still should be Standard Concepts.
-
ETL Conventions
-
Records whose Source Values map to any domain besides Condition, Procedure, Drug, Measurement or Device should be stored in the Observation table. Observations can be stored as attribute value pairs, with the attribute as the Observation Concept and the value representing the clinical fact. This fact can be a Concept (stored in VALUE_AS_CONCEPT), a numerical value (VALUE_AS_NUMBER), a verbatim string (VALUE_AS_STRING), or a datetime (VALUE_AS_DATETIME). Even though Observations do not have an explicit result, the clinical fact can be stated separately from the type of Observation in the VALUE_AS_* fields. It is recommended for Observations that are suggestive statements of positive assertion should have a value of ‘Yes’ (concept_id=4188539), recorded, even though the null value is the equivalent.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-observation_id
-
-
-The unique key given to an Observation record for a Person. Refer to the ETL for how duplicate Observations during the same Visit were handled.
-
-
-Each instance of an observation present in the source data should be assigned this unique key.
-
-
-integer
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-The PERSON_ID of the Person for whom the Observation is recorded. This may be a system generated code.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-observation_concept_id
-
-
-The OBSERVATION_CONCEPT_ID field is recommended for primary use in analyses, and must be used for network studies.
-
-
-The CONCEPT_ID that the OBSERVATION_SOURCE_CONCEPT_ID maps to. There is no specified domain that the Concepts in this table must adhere to. The only rule is that records with Concepts in the Condition, Procedure, Drug, Measurement, or Device domains MUST go to the corresponding table.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-observation_date
-
-
-The date of the Observation. Depending on what the Observation represents this could be the date of a lab test, the date of a survey, or the date a patient’s family history was taken.
-
-
-For some observations the ETL may need to make a choice as to which date to choose.
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-observation_datetime
-
-
-
-
-If no time is given set to midnight (00:00:00).
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-observation_type_concept_id
-
-
-This field can be used to determine the provenance of the Observation record, as in whether the measurement was from an EHR system, insurance claim, registry, or other sources.
-
-
-Choose the OBSERVATION_TYPE_CONCEPT_ID that best represents the provenance of the record, for example whether it came from an EHR record or billing claim. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Type Concept
-
-
-
-
-value_as_number
-
-
-This is the numerical value of the Result of the Observation, if applicable and available. It is not expected that all Observations will have numeric results, rather, this field is here to house values should they exist.
-
-
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-value_as_string
-
-
-This is the categorical value of the Result of the Observation, if applicable and available.
-
-
-
-
-varchar(60)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-value_as_concept_id
-
-
-It is possible that some records destined for the Observation table have two clinical ideas represented in one source code. This is common with ICD10 codes that describe a family history of some Condition, for example. In OMOP the Vocabulary breaks these two clinical ideas into two codes; one becomes the OBSERVATION_CONCEPT_ID and the other becomes the VALUE_AS_CONCEPT_ID. It is important when using the Observation table to keep this possibility in mind and to examine the VALUE_AS_CONCEPT_ID field for relevant information.
-
-
-Note that the value of VALUE_AS_CONCEPT_ID may be provided through mapping from a source Concept which contains the content of the Observation. In those situations, the CONCEPT_RELATIONSHIP table in addition to the ‘Maps to’ record contains a second record with the relationship_id set to ‘Maps to value’. For example, ICD10 Z82.4 ‘Family history of ischaemic heart disease and other diseases of the circulatory system’ has a ‘Maps to’ relationship to 4167217 ‘Family history of clinical finding’ as well as a ‘Maps to value’ record to 134057 ‘Disorder of cardiovascular system’.
-
-
-Integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-qualifier_concept_id
-
-
-This field contains all attributes specifying the clinical fact further, such as as degrees, severities, drug-drug interaction alerts etc.
-
-
-Use your best judgement as to what Concepts to use here and if they are necessary to accurately represent the clinical record. There is no restriction on the domain of these Concepts, they just need to be Standard.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-unit_concept_id
-
-
-There is currently no vocabulary link between observation Concepts and unit Concepts, the UNIT_CONCEPT_ID is a representation of the units as provided by the source data after ETL clean up.
-
-
-There is no standardization requirement for units associated with OBSERVATION_CONCEPT_IDs, however, it is the responsibility of the ETL to choose the most plausible unit.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Unit
-
-
-
-
-provider_id
-
-
-The provider associated with the observation record, e.g. the provider who ordered the test or the provider who recorded the result.
-
-
-The ETL may need to make a choice as to which PROVIDER_ID to put here. Based on what is available this may or may not be different than the provider associated with the overall VISIT_OCCURRENCE record. For example the admitting vs attending physician on an EHR record.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-PROVIDER
-
-
-
-
-
-
-visit_occurrence_id
-
-
-The visit during which the Observation occurred.
-
-
-Depending on the structure of the source data, this may have to be determined based on dates. If an OBSERVATION_DATE occurs within the start and end date of a Visit it is a valid ETL choice to choose the VISIT_OCCURRENCE_ID from the visit that subsumes it, even if not explicitly stated in the data. While not required, an attempt should be made to locate the VISIT_OCCURRENCE_ID of the observation record. If an observation is related to a visit explicitly in the source data, it is possible that the result date of the Observation falls outside of the bounds of the Visit dates.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_OCCURRENCE
-
-
-
-
-
-
-visit_detail_id
-
-
-The VISIT_DETAIL record during which the Observation occurred. For example, if the Person was in the ICU at the time the VISIT_OCCURRENCE record would reflect the overall hospital stay and the VISIT_DETAIL record would reflect the ICU stay during the hospital visit.
-
-
-Same rules apply as for the VISIT_OCCURRENCE_ID.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_DETAIL
-
-
-
-
-
-
-observation_source_value
-
-
-This field houses the verbatim value from the source data representing the Observation that occurred. For example, this could be an ICD10 or Read code.
-
-
-This code is mapped to a Standard Concept in the Standardized Vocabularies and the original code is stored here for reference.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-observation_source_concept_id
-
-
-This is the concept representing the OBSERVATION_SOURCE_VALUE and may not necessarily be standard. This field is discouraged from use in analysis because it is not required to contain Standard Concepts that are used across the OHDSI community, and should only be used when Standard Concepts do not adequately represent the source detail for the Observation necessary for a given analytic use case. Consider using OBSERVATION_CONCEPT_ID instead to enable standardized analytics that can be consistent across the network.
-
-
-If the OBSERVATION_SOURCE_VALUE is coded in the source data using an OMOP supported vocabulary put the concept id representing the source value here.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-unit_source_value
-
-
-This field houses the verbatim value from the source data representing the unit of the Observation that occurred.
-
-
-This code is mapped to a Standard Condition Concept in the Standardized Vocabularies and the original code is stored here for reference.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-qualifier_source_value
-
-
-This field houses the verbatim value from the source data representing the qualifier of the Observation that occurred.
-
-
-This code is mapped to a Standard Condition Concept in the Standardized Vocabularies and the original code is stored here for reference.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
DEATH
-
Table Description
-
The death domain contains the clinical event for how and when a Person dies. A person can have up to one record if the source system contains evidence about the Death, such as: Condition in an administrative claim, status of enrollment into a health plan, or explicit record in EHR data.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-person_id
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-death_date
-
-
-The date the person was deceased.
-
-
-If the precise date include day or month is not known or not allowed, December is used as the default month, and the last day of the month the default day.
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-death_datetime
-
-
-
-
-If not available set time to midnight (00:00:00)
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-death_type_concept_id
-
-
-This is the provenance of the death record, i.e., where it came from. It is possible that an administrative claims database would source death information from a government file so do not assume the Death Type is the same as the Visit Type, etc.
-
-
-Use the type concept that be reflects the source of the death record. Accepted Concepts.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Type Concept
-
-
-
-
-cause_concept_id
-
-
-This is the Standard Concept representing the Person’s cause of death, if available.
-
-
-There is no specified domain for this concept, just choose the Standard Concept Id that best represents the person’s cause of death.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-cause_source_value
-
-
-
-
-If available, put the source code representing the cause of death here.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-cause_source_concept_id
-
-
-
-
-If the cause of death was coded using a Vocabulary present in the OMOP Vocabularies put the CONCEPT_ID representing the cause of death here.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-
-
-
NOTE
-
Table Description
-
The NOTE table captures unstructured information that was recorded by a provider about a patient in free text (in ASCII, or preferably in UTF8 format) notes on a given date. The type of note_text is CLOB or varchar(MAX) depending on RDBMS.
-
ETL Conventions
-
HL7/LOINC CDO is a standard for consistent naming of documents to support a range of use cases: retrieval, organization, display, and exchange. It guides the creation of LOINC codes for clinical notes. CDO annotates each document with 5 dimensions:
-
-
Kind of Document: Characterizes the general structure of the document at a macro level (e.g. Anesthesia Consent)
-
Type of Service: Characterizes the kind of service or activity (e.g. evaluations, consultations, and summaries). The notion of time sequence, e.g., at the beginning (admission) at the end (discharge) is subsumed in this axis. Example: Discharge Teaching.
-
Setting: Setting is an extension of CMS’s definitions (e.g. Inpatient, Outpatient)
-
Subject Matter Domain (SMD): Characterizes the subject matter domain of a note (e.g. Anesthesiology)
-
Role: Characterizes the training or professional level of the author of the document, but does not break down to specialty or subspecialty (e.g. Physician) Each combination of these 5 dimensions rolls up to a unique LOINC code.
-
-
According to CDO requirements, only 2 of the 5 dimensions are required to properly annotate a document; Kind of Document and any one of the other 4 dimensions. However, not all the permutations of the CDO dimensions will necessarily yield an existing LOINC code. Each of these dimensions are contained in the OMOP Vocabulary under the domain of ‘Meas Value’ with each dimension represented as a Concept Class.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-note_id
-
-
-A unique identifier for each note.
-
-
-
-
-integer
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-note_date
-
-
-The date the note was recorded.
-
-
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-note_datetime
-
-
-
-
-If time is not given set the time to midnight.
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-note_type_concept_id
-
-
-The provenance of the note. Most likely this will be EHR.
-
-
-Put the source system of the note, as in EHR record. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Type Concept
-
-
-
-
-note_class_concept_id
-
-
-A Standard Concept Id representing the HL7 LOINC Document Type Vocabulary classification of the note.
-
-
-Map the note classification to a Standard Concept. For more information see the ETL Conventions in the description of the NOTE table. Accepted Concepts. This Concept can alternatively be represented by concepts with the relationship ‘Kind of (LOINC)’ to 706391 (Note).
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-note_title
-
-
-The title of the note.
-
-
-
-
-varchar(250)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-note_text
-
-
-The content of the note.
-
-
-
-
-varchar(MAX)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-encoding_concept_id
-
-
-This is the Concept representing the character encoding type.
-
-
-Put the Concept Id that represents the encoding character type here. Currently the only option is UTF-8 (32678). It the note is encoded in any other type, like ASCII then put 0.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-language_concept_id
-
-
-The language of the note.
-
-
-Use Concepts that are descendants of the concept 4182347 (World Languages).
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-provider_id
-
-
-The Provider who wrote the note.
-
-
-The ETL may need to make a determination on which provider to put here.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-PROVIDER
-
-
-
-
-
-
-visit_occurrence_id
-
-
-The Visit during which the note was written.
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_OCCURRENCE
-
-
-
-
-
-
-visit_detail_id
-
-
-The Visit Detail during which the note was written.
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_DETAIL
-
-
-
-
-
-
-note_source_value
-
-
-
-
-The source value mapped to the NOTE_CLASS_CONCEPT_ID.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
NOTE_NLP
-
Table Description
-
The NOTE_NLP table encodes all output of NLP on clinical notes. Each row represents a single extracted term from a note.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-note_nlp_id
-
-
-A unique identifier for the NLP record.
-
-
-
-
-integer
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-note_id
-
-
-This is the NOTE_ID for the NOTE record the NLP record is associated to.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-section_concept_id
-
-
-
-
-The SECTION_CONCEPT_ID should be used to represent the note section contained in the NOTE_NLP record. These concepts can be found as parts of document panels and are based on the type of note written, i.e. a discharge summary. These panels can be found as concepts with the relationship ‘Subsumes’ to CONCEPT_ID 45875957.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-snippet
-
-
-A small window of text surrounding the term
-
-
-
-
-varchar(250)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-offset
-
-
-Character offset of the extracted term in the input note
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-lexical_variant
-
-
-Raw text extracted from the NLP tool.
-
-
-
-
-varchar(250)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-note_nlp_concept_id
-
-
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-note_nlp_source_concept_id
-
-
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-nlp_system
-
-
-
-
-Name and version of the NLP system that extracted the term. Useful for data provenance.
-
-
-varchar(250)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-nlp_date
-
-
-The date of the note processing.
-
-
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-nlp_datetime
-
-
-The date and time of the note processing.
-
-
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-term_exists
-
-
-
-
-Term_exists is defined as a flag that indicates if the patient actually has or had the condition. Any of the following modifiers would make Term_exists false: Negation = true Subject = [anything other than the patient] Conditional = true/li> Rule_out = true Uncertain = very low certainty or any lower certainties A complete lack of modifiers would make Term_exists true.
-
-
-varchar(1)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-term_temporal
-
-
-
-
-Term_temporal is to indicate if a condition is present or just in the past. The following would be past:
- History = true - Concept_date = anything before the time of the report
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-term_modifiers
-
-
-
-
-For the modifiers that are there, they would have to have these values:
- Negation = false - Subject = patient - Conditional = false - Rule_out = false - Uncertain = true or high or moderate or even low (could argue about low). Term_modifiers will concatenate all modifiers for different types of entities (conditions, drugs, labs etc) into one string. Lab values will be saved as one of the modifiers.
-
-
-varchar(2000)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
SPECIMEN
-
Table Description
-
The specimen domain contains the records identifying biological samples from a person.
-
ETL Conventions
-
Anatomic site is coded at the most specific level of granularity possible, such that higher level classifications can be derived using the Standardized Vocabularies.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-specimen_id
-
-
-Unique identifier for each specimen.
-
-
-
-
-integer
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-The person from whom the specimen is collected.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-specimen_concept_id
-
-
-
-
-The standard CONCEPT_ID that the SPECIMEN_SOURCE_VALUE maps to in the specimen domain. Accepted Concepts
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-specimen_type_concept_id
-
-
-
-
-Put the source of the specimen record, as in an EHR system. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Type Concept
-
-
-
-
-specimen_date
-
-
-The date the specimen was collected.
-
-
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-specimen_datetime
-
-
-
-
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-quantity
-
-
-The amount of specimen collected from the person.
-
-
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-unit_concept_id
-
-
-The unit for the quantity of the specimen.
-
-
-Map the UNIT_SOURCE_VALUE to a Standard Concept in the Unit domain. Accepted Concepts
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-anatomic_site_concept_id
-
-
-This is the site on the body where the specimen is from.
-
-
-Map the ANATOMIC_SITE_SOURCE_VALUE to a Standard Concept in the Spec Anatomic Site domain. This should be coded at the lowest level of granularity Accepted Concepts
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-disease_status_concept_id
-
-
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-specimen_source_id
-
-
-This is the identifier for the specimen from the source system.
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-specimen_source_value
-
-
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-unit_source_value
-
-
-
-
-This unit for the quantity of the specimen, as represented in the source.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-anatomic_site_source_value
-
-
-
-
-This is the site on the body where the specimen was taken from, as represented in the source.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-disease_status_source_value
-
-
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
FACT_RELATIONSHIP
-
Table Description
-
The FACT_RELATIONSHIP table contains records about the relationships between facts stored as records in any table of the CDM. Relationships can be defined between facts from the same domain, or different domains. Examples of Fact Relationships include: Person relationships (parent-child), care site relationships (hierarchical organizational structure of facilities within a health system), indication relationship (between drug exposures and associated conditions), usage relationships (of devices during the course of an associated procedure), or facts derived from one another (measurements derived from an associated specimen).
-
ETL Conventions
-
All relationships are directional, and each relationship is represented twice symmetrically within the FACT_RELATIONSHIP table. For example, two persons if person_id = 1 is the mother of person_id = 2 two records are in the FACT_RELATIONSHIP table (all strings in fact concept_id records in the Concept table: - Person, 1, Person, 2, parent of - Person, 2, Person, 1, child of
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-domain_concept_id_1
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-fact_id_1
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-domain_concept_id_2
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-fact_id_2
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-relationship_concept_id
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-
-
-
-
Health System Data Tables
-
-
LOCATION
-
Table Description
-
The LOCATION table represents a generic way to capture physical location or address information of Persons and Care Sites.
-
ETL Conventions
-
Each address or Location is unique and is present only once in the table. Locations do not contain names, such as the name of a hospital. In order to construct a full address that can be used in the postal service, the address information from the Location needs to be combined with information from the Care Site.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-location_id
-
-
-The unique key given to a unique Location.
-
-
-Each instance of a Location in the source data should be assigned this unique key.
-
-
-integer
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-address_1
-
-
-This is the first line of the address.
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-address_2
-
-
-This is the second line of the address
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-city
-
-
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-state
-
-
-
-
-
-
-varchar(2)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-zip
-
-
-
-
-Zip codes are handled as strings of up to 9 characters length. For US addresses, these represent either a 3-digit abbreviated Zip code as provided by many sources for patient protection reasons, the full 5-digit Zip or the 9-digit (ZIP + 4) codes. Unless for specific reasons analytical methods should expect and utilize only the first 3 digits. For international addresses, different rules apply.
-
-
-varchar(9)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-county
-
-
-
-
-
-
-varchar(20)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-location_source_value
-
-
-
-
-Put the verbatim value for the location here, as it shows up in the source.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
CARE_SITE
-
Table Description
-
The CARE_SITE table contains a list of uniquely identified institutional (physical or organizational) units where healthcare delivery is practiced (offices, wards, hospitals, clinics, etc.).
-
ETL Conventions
-
Care site is a unique combination of location_id and place_of_service_source_value. Care site does not take into account the provider (human) information such a specialty. Many source data do not make a distinction between individual and institutional providers. The CARE_SITE table contains the institutional providers. If the source, instead of uniquely identifying individual Care Sites, only provides limited information such as Place of Service, generic or “pooled” Care Site records are listed in the CARE_SITE table. There can be hierarchical and business relationships between Care Sites. For example, wards can belong to clinics or departments, which can in turn belong to hospitals, which in turn can belong to hospital systems, which in turn can belong to HMOs.The relationships between Care Sites are defined in the FACT_RELATIONSHIP table.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-care_site_id
-
-
-
-
-Assign an id to each unique combination of location_id and place_of_service_source_value
-
-
-integer
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-care_site_name
-
-
-The name of the care_site as it appears in the source data
-
-
-
-
-varchar(255)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-place_of_service_concept_id
-
-
-This is a high-level way of characterizing a Care Site. Typically, however, Care Sites can provide care in multiple settings (inpatient, outpatient, etc.) and this granularity should be reflected in the visit.
-
-
-Choose the concept in the visit domain that best represents the setting in which healthcare is provided in the Care Site. If most visits in a Care Site are Inpatient, then the place_of_service_concept_id should represent Inpatient. If information is present about a unique Care Site (e.g. Pharmacy) then a Care Site record should be created. Accepted Concepts.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-location_id
-
-
-The location_id from the LOCATION table representing the physical location of the care_site.
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-LOCATION
-
-
-
-
-
-
-care_site_source_value
-
-
-The identifier of the care_site as it appears in the source data. This could be an identifier separate from the name of the care_site.
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-place_of_service_source_value
-
-
-
-
-Put the place of service of the care_site as it appears in the source data.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
PROVIDER
-
Table Description
-
The PROVIDER table contains a list of uniquely identified healthcare providers. These are individuals providing hands-on healthcare to patients, such as physicians, nurses, midwives, physical therapists etc.
-
User Guide
-
Many sources do not make a distinction between individual and institutional providers. The PROVIDER table contains the individual providers. If the source, instead of uniquely identifying individual providers, only provides limited information such as specialty, generic or ‘pooled’ Provider records are listed in the PROVIDER table.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-provider_id
-
-
-It is assumed that every provider with a different unique identifier is in fact a different person and should be treated independently.
-
-
-This identifier can be the original id from the source data provided it is an integer, otherwise it can be an autogenerated number.
-
-
-integer
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-provider_name
-
-
-
-
-This field is not necessary as it is not necessary to have the actual identity of the Provider. Rather, the idea is to uniquely and anonymously identify providers of care across the database.
-
-
-varchar(255)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-npi
-
-
-This is the National Provider Number issued to health care providers in the US by the Centers for Medicare and Medicaid Services (CMS).
-
-
-
-
-varchar(20)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-dea
-
-
-This is the identifier issued by the DEA, a US federal agency, that allows a provider to write prescriptions for controlled substances.
-
-
-
-
-varchar(20)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-specialty_concept_id
-
-
-This field either represents the most common specialty that occurs in the data or the most specific concept that represents all specialties listed, should the provider have more than one. This includes physician specialties such as internal medicine, emergency medicine, etc. and allied health professionals such as nurses, midwives, and pharmacists.
-
-
-If a Provider has more than one Specialty, there are two options: 1. Choose a concept_id which is a common ancestor to the multiple specialties, or, 2. Choose the specialty that occurs most often for the provider. Concepts in this field should be Standard with a domain of Provider. Accepted Concepts.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-care_site_id
-
-
-This is the CARE_SITE_ID for the location that the provider primarily practices in.
-
-
-If a Provider has more than one Care Site, the main or most often exerted CARE_SITE_ID should be recorded.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CARE_SITE
-
-
-
-
-
-
-year_of_birth
-
-
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-gender_concept_id
-
-
-This field represents the recorded gender of the provider in the source data.
-
-
-If given, put a concept from the gender domain representing the recorded gender of the provider. Accepted Concepts.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Gender
-
-
-
-
-provider_source_value
-
-
-Use this field to link back to providers in the source data. This is typically used for error checking of ETL logic.
-
-
-Some use cases require the ability to link back to providers in the source data. This field allows for the storing of the provider identifier as it appears in the source.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-specialty_source_value
-
-
-This is the kind of provider or specialty as it appears in the source data. This includes physician specialties such as internal medicine, emergency medicine, etc. and allied health professionals such as nurses, midwives, and pharmacists.
-
-
-Put the kind of provider as it appears in the source data. This field is up to the discretion of the ETL-er as to whether this should be the coded value from the source or the text description of the lookup value.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-specialty_source_concept_id
-
-
-This is often zero as many sites use proprietary codes to store physician speciality.
-
-
-If the source data codes provider specialty in an OMOP supported vocabulary store the concept_id here.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-gender_source_value
-
-
-This is provider’s gender as it appears in the source data.
-
-
-Put the provider’s gender as it appears in the source data. This field is up to the discretion of the ETL-er as to whether this should be the coded value from the source or the text description of the lookup value.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-gender_source_concept_id
-
-
-This is often zero as many sites use proprietary codes to store provider gender.
-
-
-If the source data codes provider gender in an OMOP supported vocabulary store the concept_id here.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-
-
-
-
Health Economics Data Tables
-
-
PAYER_PLAN_PERIOD
-
Table Description
-
The PAYER_PLAN_PERIOD table captures details of the period of time that a Person is continuously enrolled under a specific health Plan benefit structure from a given Payer. Each Person receiving healthcare is typically covered by a health benefit plan, which pays for (fully or partially), or directly provides, the care. These benefit plans are provided by payers, such as health insurances or state or government agencies. In each plan the details of the health benefits are defined for the Person or her family, and the health benefit Plan might change over time typically with increasing utilization (reaching certain cost thresholds such as deductibles), plan availability and purchasing choices of the Person. The unique combinations of Payer organizations, health benefit Plans and time periods in which they are valid for a Person are recorded in this table.
-
User Guide
-
A Person can have multiple, overlapping, Payer_Plan_Periods in this table. For example, medical and drug coverage in the US can be represented by two Payer_Plan_Periods. The details of the benefit structure of the Plan is rarely known, the idea is just to identify that the Plans are different.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-payer_plan_period_id
-
-
-A unique identifier for each unique combination of a Person, Payer, Plan, and Period of time.
-
-
-
-
-integer
-
-
-Yes
-
-
-Yes
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-person_id
-
-
-The Person covered by the Plan.
-
-
-A single Person can have multiple, overlapping, PAYER_PLAN_PERIOD records
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-payer_plan_period_start_date
-
-
-Start date of Plan coverage.
-
-
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-payer_plan_period_end_date
-
-
-End date of Plan coverage.
-
-
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-payer_concept_id
-
-
-This field represents the organization who reimburses the provider which administers care to the Person.
-
-
-Map the Payer directly to a standard CONCEPT_ID. If one does not exists please contact the vocabulary team. There is no global controlled vocabulary available for this information. The point is to stratify on this information and identify if Persons have the same payer, though the name of the Payer is not necessary. Accepted Concepts.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-payer_source_value
-
-
-This is the Payer as it appears in the source data.
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-payer_source_concept_id
-
-
-
-
-If the source data codes the Payer in an OMOP supported vocabulary store the concept_id here.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-plan_concept_id
-
-
-This field represents the specific health benefit Plan the Person is enrolled in.
-
-
-Map the Plan directly to a standard CONCEPT_ID. If one does not exists please contact the vocabulary team. There is no global controlled vocabulary available for this information. The point is to stratify on this information and identify if Persons have the same health benefit Plan though the name of the Plan is not necessary. Accepted Concepts.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-plan_source_value
-
-
-This is the health benefit Plan of the Person as it appears in the source data.
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-plan_source_concept_id
-
-
-
-
-If the source data codes the Plan in an OMOP supported vocabulary store the concept_id here.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-sponsor_concept_id
-
-
-This field represents the sponsor of the Plan who finances the Plan. This includes self-insured, small group health plan and large group health plan.
-
-
-Map the sponsor directly to a standard CONCEPT_ID. If one does not exists please contact the vocabulary team. There is no global controlled vocabulary available for this information. The point is to stratify on this information and identify if Persons have the same sponsor though the name of the sponsor is not necessary. Accepted Concepts.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-sponsor_source_value
-
-
-The Plan sponsor as it appears in the source data.
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-sponsor_source_concept_id
-
-
-
-
-If the source data codes the sponsor in an OMOP supported vocabulary store the concept_id here.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-family_source_value
-
-
-The common identifier for all people (often a family) that covered by the same policy.
-
-
-Often these are the common digits of the enrollment id of the policy members.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-stop_reason_concept_id
-
-
-This field represents the reason the Person left the Plan, if known.
-
-
-Map the stop reason directly to a standard CONCEPT_ID. If one does not exists please contact the vocabulary team. There is no global controlled vocabulary available for this information. Accepted Concepts.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-stop_reason_source_value
-
-
-The Plan stop reason as it appears in the source data.
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-stop_reason_source_concept_id
-
-
-
-
-If the source data codes the stop reason in an OMOP supported vocabulary store the concept_id here.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-
-
-
COST
-
Table Description
-
The COST table captures records containing the cost of any medical event recorded in one of the OMOP clinical event tables such as DRUG_EXPOSURE, PROCEDURE_OCCURRENCE, VISIT_OCCURRENCE, VISIT_DETAIL, DEVICE_OCCURRENCE, OBSERVATION or MEASUREMENT.
-
Each record in the cost table account for the amount of money transacted for the clinical event. So, the COST table may be used to represent both receivables (charges) and payments (paid), each transaction type represented by its COST_CONCEPT_ID. The COST_TYPE_CONCEPT_ID field will use concepts in the Standardized Vocabularies to designate the source (provenance) of the cost data. A reference to the health plan information in the PAYER_PLAN_PERIOD table is stored in the record for information used for the adjudication system to determine the persons benefit for the clinical event.
-
User Guide
-
When dealing with summary costs, the cost of the goods or services the provider provides is often not known directly, but derived from the hospital charges multiplied by an average cost-to-charge ratio.
-
ETL Conventions
-
One cost record is generated for each response by a payer. In a claims databases, the payment and payment terms reported by the payer for the goods or services billed will generate one cost record. If the source data has payment information for more than one payer (i.e. primary insurance and secondary insurance payment for one entity), then a cost record is created for each reporting payer. Therefore, it is possible for one procedure to have multiple cost records for each payer, but typically it contains one or no record per entity. Payer reimbursement cost records will be identified by using the PAYER_PLAN_ID field. Drug costs are composed of ingredient cost (the amount charged by the wholesale distributor or manufacturer), the dispensing fee (the amount charged by the pharmacy and the sales tax).
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-cost_id
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-cost_event_id
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-cost_domain_id
-
-
-
-
-
-
-varchar(20)
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-DOMAIN
-
-
-
-
-
-
-cost_type_concept_id
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-currency_concept_id
-
-
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-total_charge
-
-
-
-
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-total_cost
-
-
-
-
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-total_paid
-
-
-
-
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-paid_by_payer
-
-
-
-
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-paid_by_patient
-
-
-
-
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-paid_patient_copay
-
-
-
-
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-paid_patient_coinsurance
-
-
-
-
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-paid_patient_deductible
-
-
-
-
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-paid_by_primary
-
-
-
-
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-paid_ingredient_cost
-
-
-
-
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-paid_dispensing_fee
-
-
-
-
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-payer_plan_period_id
-
-
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-amount_allowed
-
-
-
-
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-revenue_code_concept_id
-
-
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-revenue_code_source_value
-
-
-Revenue codes are a method to charge for a class of procedures and conditions in the U.S. hospital system.
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-drg_concept_id
-
-
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-drg_source_value
-
-
-Diagnosis Related Groups are US codes used to classify hospital cases into one of approximately 500 groups.
-
-
-
-
-varchar(3)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
-
Standardized Derived Elements
-
-
DRUG_ERA
-
Table Description
-
A Drug Era is defined as a span of time when the Person is assumed to be exposed to a particular active ingredient. A Drug Era is not the same as a Drug Exposure: Exposures are individual records corresponding to the source when Drug was delivered to the Person, while successive periods of Drug Exposures are combined under certain rules to produce continuous Drug Eras.
-
ETL Conventions
-
The SQL script for generating DRUG_ERA records can be found here.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-drug_era_id
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-drug_concept_id
-
-
-The Concept Id representing the specific drug ingredient.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Drug
-
-
-
-
-drug_era_start_date
-
-
-
-
-The Drug Era Start Date is the start date of the first Drug Exposure for a given ingredient, with at least 31 days since the previous exposure.
-
-
-datetime
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-drug_era_end_date
-
-
-
-
-The Drug Era End Date is the end date of the last Drug Exposure. The End Date of each Drug Exposure is either taken from the field drug_exposure_end_date or, as it is typically not available, inferred using the following rules: For pharmacy prescription data, the date when the drug was dispensed plus the number of days of supply are used to extrapolate the End Date for the Drug Exposure. Depending on the country-specific healthcare system, this supply information is either explicitly provided in the day_supply field or inferred from package size or similar information. For Procedure Drugs, usually the drug is administered on a single date (i.e., the administration date). A standard Persistence Window of 30 days (gap, slack) is permitted between two subsequent such extrapolated DRUG_EXPOSURE records to be considered to be merged into a single Drug Era.
-
-
-datetime
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-drug_exposure_count
-
-
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-gap_days
-
-
-
-
-The Gap Days determine how many total drug-free days are observed between all Drug Exposure events that contribute to a DRUG_ERA record. It is assumed that the drugs are “not stockpiled” by the patient, i.e. that if a new drug prescription or refill is observed (a new DRUG_EXPOSURE record is written), the remaining supply from the previous events is abandoned. The difference between Persistence Window and Gap Days is that the former is the maximum drug-free time allowed between two subsequent DRUG_EXPOSURE records, while the latter is the sum of actual drug-free days for the given Drug Era under the above assumption of non-stockpiling.
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
DOSE_ERA
-
Table Description
-
A Dose Era is defined as a span of time when the Person is assumed to be exposed to a constant dose of a specific active ingredient.
-
ETL Conventions
-
Dose Eras will be derived from records in the DRUG_EXPOSURE table and the Dose information from the DRUG_STRENGTH table using a standardized algorithm. Dose Form information is not taken into account. So, if the patient changes between different formulations, or different manufacturers with the same formulation, the Dose Era is still spanning the entire time of exposure to the Ingredient.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-dose_era_id
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-drug_concept_id
-
-
-The Concept Id representing the specific drug ingredient.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Drug
-
-
-
-
-unit_concept_id
-
-
-The Concept Id representing the unit of the specific drug ingredient.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Unit
-
-
-
-
-dose_value
-
-
-The numeric value of the dosage of the drug_ingredient.
-
-
-
-
-float
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-dose_era_start_date
-
-
-The date the Person started on the specific dosage, with at least 31 days since any prior exposure.
-
-
-
-
-datetime
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-dose_era_end_date
-
-
-
-
-The date the Person was no longer exposed to the dosage of the specific drug ingredient. An era is ended if there are 31 days or more between dosage records.
-
-
-datetime
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
CONDITION_ERA
-
Table Description
-
A Condition Era is defined as a span of time when the Person is assumed to have a given condition. Similar to Drug Eras, Condition Eras are chronological periods of Condition Occurrence. Combining individual Condition Occurrences into a single Condition Era serves two purposes:
-
-
It allows aggregation of chronic conditions that require frequent ongoing care, instead of treating each Condition Occurrence as an independent event.
-
It allows aggregation of multiple, closely timed doctor visits for the same Condition to avoid double-counting the Condition Occurrences. For example, consider a Person who visits her Primary Care Physician (PCP) and who is referred to a specialist. At a later time, the Person visits the specialist, who confirms the PCP’s original diagnosis and provides the appropriate treatment to resolve the condition. These two independent doctor visits should be aggregated into one Condition Era.
-
-
ETL Conventions
-
Each Condition Era corresponds to one or many Condition Occurrence records that form a continuous interval. The condition_concept_id field contains Concepts that are identical to those of the CONDITION_OCCURRENCE table records that make up the Condition Era. In contrast to Drug Eras, Condition Eras are not aggregated to contain Conditions of different hierarchical layers. The SQl Script for generating CONDITION_ERA records can be found here The Condition Era Start Date is the start date of the first Condition Occurrence. The Condition Era End Date is the end date of the last Condition Occurrence. Condition Eras are built with a Persistence Window of 30 days, meaning, if no occurrence of the same condition_concept_id happens within 30 days of any one occurrence, it will be considered the condition_era_end_date.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-condition_era_id
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-No
-
-
-PERSON
-
-
-
-
-
-
-condition_concept_id
-
-
-The Concept Id representing the Condition.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Condition
-
-
-
-
-condition_era_start_date
-
-
-The start date for the Condition Era constructed from the individual instances of Condition Occurrences. It is the start date of the very first chronologically recorded instance of the condition with at least 31 days since any prior record of the same Condition.
-
-
-
-
-datetime
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-condition_era_end_date
-
-
-The end date for the Condition Era constructed from the individual instances of Condition Occurrences. It is the end date of the final continuously recorded instance of the Condition.
-
-
-
-
-datetime
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-condition_occurrence_count
-
-
-The number of individual Condition Occurrences used to construct the condition era.
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
-
Metadata Tables
-
-
METADATA
-
Table Description
-
The METADATA table contains metadata information about a dataset that has been transformed to the OMOP Common Data Model.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-metadata_concept_id
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-metadata_type_concept_id
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-name
-
-
-
-
-
-
-varchar(250)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-value_as_string
-
-
-
-
-
-
-varchar(250)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-value_as_concept_id
-
-
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-metadata_date
-
-
-
-
-
-
-date
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-metadata_datetime
-
-
-
-
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
CDM_SOURCE
-
Table Description
-
The CDM_SOURCE table contains detail about the source database and the process used to transform the data into the OMOP Common Data Model.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-cdm_source_name
-
-
-The name of the CDM instance.
-
-
-
-
-varchar(255)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-cdm_source_abbreviation
-
-
-The abbreviation of the CDM instance.
-
-
-
-
-varchar(25)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-cdm_holder
-
-
-The holder of the CDM instance.
-
-
-
-
-varchar(255)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-source_description
-
-
-The description of the CDM instance.
-
-
-
-
-varchar(MAX)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-source_documentation_reference
-
-
-
-
-
-
-varchar(255)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-cdm_etl_reference
-
-
-
-
-Put the link to the CDM version used.
-
-
-varchar(255)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-source_release_date
-
-
-The release date of the source data.
-
-
-
-
-date
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-cdm_release_date
-
-
-The release data of the CDM instance.
-
-
-
-
-date
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-cdm_version
-
-
-
-
-
-
-varchar(10)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-vocabulary_version
-
-
-
-
-
-
-varchar(20)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
-
Vocabulary Tables
-
-
CONCEPT
-
Table Description
-
The Standardized Vocabularies contains records, or Concepts, that uniquely identify each fundamental unit of meaning used to express clinical information in all domain tables of the CDM. Concepts are derived from vocabularies, which represent clinical information across a domain (e.g. conditions, drugs, procedures) through the use of codes and associated descriptions. Some Concepts are designated Standard Concepts, meaning these Concepts can be used as normative expressions of a clinical entity within the OMOP Common Data Model and within standardized analytics. Each Standard Concept belongs to one domain, which defines the location where the Concept would be expected to occur within data tables of the CDM.
-
Concepts can represent broad categories (like ‘Cardiovascular disease’), detailed clinical elements (‘Myocardial infarction of the anterolateral wall’) or modifying characteristics and attributes that define Concepts at various levels of detail (severity of a disease, associated morphology, etc.).
-
Records in the Standardized Vocabularies tables are derived from national or international vocabularies such as SNOMED-CT, RxNorm, and LOINC, or custom Concepts defined to cover various aspects of observational data analysis.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-concept_id
-
-
-A unique identifier for each Concept across all domains.
-
-
-
-
-integer
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-concept_name
-
-
-An unambiguous, meaningful and descriptive name for the Concept.
-
-
-
-
-varchar(255)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-domain_id
-
-
-A foreign key to the DOMAIN table the Concept belongs to.
-
-
-
-
-varchar(20)
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-DOMAIN
-
-
-
-
-
-
-vocabulary_id
-
-
-A foreign key to the VOCABULARY table indicating from which source the Concept has been adapted.
-
-
-
-
-varchar(20)
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-VOCABULARY
-
-
-
-
-
-
-concept_class_id
-
-
-The attribute or concept class of the Concept. Examples are ‘Clinical Drug’, ‘Ingredient’, ‘Clinical Finding’ etc.
-
-
-
-
-varchar(20)
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT_CLASS
-
-
-
-
-
-
-standard_concept
-
-
-This flag determines where a Concept is a Standard Concept, i.e. is used in the data, a Classification Concept, or a non-standard Source Concept. The allowable values are ‘S’ (Standard Concept) and ‘C’ (Classification Concept), otherwise the content is NULL.
-
-
-
-
-varchar(1)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-concept_code
-
-
-The concept code represents the identifier of the Concept in the source vocabulary, such as SNOMED-CT concept IDs, RxNorm RXCUIs etc. Note that concept codes are not unique across vocabularies.
-
-
-
-
-varchar(50)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-valid_start_date
-
-
-The date when the Concept was first recorded. The default value is 1-Jan-1970, meaning, the Concept has no (known) date of inception.
-
-
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-valid_end_date
-
-
-The date when the Concept became invalid because it was deleted or superseded (updated) by a new concept. The default value is 31-Dec-2099, meaning, the Concept is valid until it becomes deprecated.
-
-
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-invalid_reason
-
-
-Reason the Concept was invalidated. Possible values are D (deleted), U (replaced with an update) or NULL when valid_end_date has the default value.
-
-
-
-
-varchar(1)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
VOCABULARY
-
Table Description
-
The VOCABULARY table includes a list of the Vocabularies collected from various sources or created de novo by the OMOP community. This reference table is populated with a single record for each Vocabulary source and includes a descriptive name and other associated attributes for the Vocabulary.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-vocabulary_id
-
-
-A unique identifier for each Vocabulary, such as ICD9CM, SNOMED, Visit.
-
-
-
-
-varchar(20)
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-vocabulary_name
-
-
-The name describing the vocabulary, for example, International Classification of Diseases, Ninth Revision, Clinical Modification, Volume 1 and 2 (NCHS) etc.
-
-
-
-
-varchar(255)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-vocabulary_reference
-
-
-External reference to documentation or available download of the about the vocabulary.
-
-
-
-
-varchar(255)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-vocabulary_version
-
-
-Version of the Vocabulary as indicated in the source.
-
-
-
-
-varchar(255)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-vocabulary_concept_id
-
-
-A Concept that represents the Vocabulary the VOCABULARY record belongs to.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-
-
-
DOMAIN
-
Table Description
-
The DOMAIN table includes a list of OMOP-defined Domains the Concepts of the Standardized Vocabularies can belong to. A Domain defines the set of allowable Concepts for the standardized fields in the CDM tables. For example, the “Condition” Domain contains Concepts that describe a condition of a patient, and these Concepts can only be stored in the condition_concept_id field of the CONDITION_OCCURRENCE and CONDITION_ERA tables. This reference table is populated with a single record for each Domain and includes a descriptive name for the Domain.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-domain_id
-
-
-A unique key for each domain.
-
-
-
-
-varchar(20)
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-domain_name
-
-
-The name describing the Domain, e.g. Condition, Procedure, Measurement etc.
-
-
-
-
-varchar(255)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-domain_concept_id
-
-
-A Concept representing the Domain Concept the DOMAIN record belongs to.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-
-
-
CONCEPT_CLASS
-
Table Description
-
The CONCEPT_CLASS table is a reference table, which includes a list of the classifications used to differentiate Concepts within a given Vocabulary. This reference table is populated with a single record for each Concept Class.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-concept_class_id
-
-
-A unique key for each class.
-
-
-
-
-varchar(20)
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-concept_class_name
-
-
-The name describing the Concept Class, e.g. Clinical Finding, Ingredient, etc.
-
-
-
-
-varchar(255)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-concept_class_concept_id
-
-
-A Concept that represents the Concept Class.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-
-
-
CONCEPT_RELATIONSHIP
-
Table Description
-
The CONCEPT_RELATIONSHIP table contains records that define direct relationships between any two Concepts and the nature or type of the relationship. Each type of a relationship is defined in the RELATIONSHIP table.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-concept_id_1
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-concept_id_2
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-relationship_id
-
-
-The relationship between CONCEPT_ID_1 and CONCEPT_ID_2. Please see the Vocabulary Conventions. for more information.
-
-
-
-
-varchar(20)
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-RELATIONSHIP
-
-
-
-
-
-
-valid_start_date
-
-
-The date when the relationship is first recorded.
-
-
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-valid_end_date
-
-
-The date when the relationship is invalidated.
-
-
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-invalid_reason
-
-
-Reason the relationship was invalidated. Possible values are ‘D’ (deleted), ‘U’ (updated) or NULL.
-
-
-
-
-varchar(1)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
RELATIONSHIP
-
Table Description
-
The RELATIONSHIP table provides a reference list of all types of relationships that can be used to associate any two concepts in the CONCEPT_RELATIONSHP table.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-relationship_id
-
-
-The type of relationship captured by the relationship record.
-
-
-
-
-varchar(20)
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-relationship_name
-
-
-
-
-
-
-varchar(255)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-is_hierarchical
-
-
-Defines whether a relationship defines concepts into classes or hierarchies. Values are 1 for hierarchical relationship or 0 if not.
-
-
-
-
-varchar(1)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-defines_ancestry
-
-
-Defines whether a hierarchical relationship contributes to the concept_ancestor table. These are subsets of the hierarchical relationships. Valid values are 1 or 0.
-
-
-
-
-varchar(1)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-reverse_relationship_id
-
-
-The identifier for the relationship used to define the reverse relationship between two concepts.
-
-
-
-
-varchar(20)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-relationship_concept_id
-
-
-A foreign key that refers to an identifier in the CONCEPT table for the unique relationship concept.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-
-
-
CONCEPT_SYNONYM
-
Table Description
-
The CONCEPT_SYNONYM table is used to store alternate names and descriptions for Concepts.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-concept_id
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-concept_synonym_name
-
-
-
-
-
-
-varchar(1000)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-language_concept_id
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-
-
-
CONCEPT_ANCESTOR
-
Table Description
-
The CONCEPT_ANCESTOR table is designed to simplify observational analysis by providing the complete hierarchical relationships between Concepts. Only direct parent-child relationships between Concepts are stored in the CONCEPT_RELATIONSHIP table. To determine higher level ancestry connections, all individual direct relationships would have to be navigated at analysis time. The CONCEPT_ANCESTOR table includes records for all parent-child relationships, as well as grandparent-grandchild relationships and those of any other level of lineage. Using the CONCEPT_ANCESTOR table allows for querying for all descendants of a hierarchical concept. For example, drug ingredients and drug products are all descendants of a drug class ancestor.
-
This table is entirely derived from the CONCEPT, CONCEPT_RELATIONSHIP and RELATIONSHIP tables.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-ancestor_concept_id
-
-
-The Concept Id for the higher-level concept that forms the ancestor in the relationship.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-descendant_concept_id
-
-
-The Concept Id for the lower-level concept that forms the descendant in the relationship.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-min_levels_of_separation
-
-
-The minimum separation in number of levels of hierarchy between ancestor and descendant concepts. This is an attribute that is used to simplify hierarchic analysis.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-max_levels_of_separation
-
-
-The maximum separation in number of levels of hierarchy between ancestor and descendant concepts. This is an attribute that is used to simplify hierarchic analysis.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
SOURCE_TO_CONCEPT_MAP
-
Table Description
-
The source to concept map table is a legacy data structure within the OMOP Common Data Model, recommended for use in ETL processes to maintain local source codes which are not available as Concepts in the Standardized Vocabularies, and to establish mappings for each source code into a Standard Concept as target_concept_ids that can be used to populate the Common Data Model tables. The SOURCE_TO_CONCEPT_MAP table is no longer populated with content within the Standardized Vocabularies published to the OMOP community.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-source_code
-
-
-The source code being translated into a Standard Concept.
-
-
-
-
-varchar(50)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-source_concept_id
-
-
-A foreign key to the Source Concept that is being translated into a Standard Concept.
-
-
-This is either 0 or should be a number above 2 billion, which are the Concepts reserved for site-specific codes and mappings.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-source_vocabulary_id
-
-
-A foreign key to the VOCABULARY table defining the vocabulary of the source code that is being translated to a Standard Concept.
-
-
-
-
-varchar(20)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-source_code_description
-
-
-An optional description for the source code. This is included as a convenience to compare the description of the source code to the name of the concept.
-
-
-
-
-varchar(255)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-target_concept_id
-
-
-The target Concept to which the source code is being mapped.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-target_vocabulary_id
-
-
-The Vocabulary of the target Concept.
-
-
-
-
-varchar(20)
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-VOCABULARY
-
-
-
-
-
-
-valid_start_date
-
-
-The date when the mapping instance was first recorded.
-
-
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-valid_end_date
-
-
-The date when the mapping instance became invalid because it was deleted or superseded (updated) by a new relationship. Default value is 31-Dec-2099.
-
-
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-invalid_reason
-
-
-Reason the mapping instance was invalidated. Possible values are D (deleted), U (replaced with an update) or NULL when valid_end_date has the default value.
-
-
-
-
-varchar(1)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
DRUG_STRENGTH
-
Table Description
-
The DRUG_STRENGTH table contains structured content about the amount or concentration and associated units of a specific ingredient contained within a particular drug product. This table is supplemental information to support standardized analysis of drug utilization.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-drug_concept_id
-
-
-The Concept representing the Branded Drug or Clinical Drug Product.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-ingredient_concept_id
-
-
-The Concept representing the active ingredient contained within the drug product.
-
-
-Combination Drugs will have more than one record in this table, one for each active Ingredient.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-amount_value
-
-
-The numeric value or the amount of active ingredient contained within the drug product.
-
-
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-amount_unit_concept_id
-
-
-The Concept representing the Unit of measure for the amount of active ingredient contained within the drug product.
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-numerator_value
-
-
-The concentration of the active ingredient contained within the drug product.
-
-
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-numerator_unit_concept_id
-
-
-The Concept representing the Unit of measure for the concentration of active ingredient.
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-denominator_value
-
-
-The amount of total liquid (or other divisible product, such as ointment, gel, spray, etc.).
-
-
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-denominator_unit_concept_id
-
-
-The Concept representing the denominator unit for the concentration of active ingredient.
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-box_size
-
-
-The number of units of Clinical Branded Drug or Quantified Clinical or Branded Drug contained in a box as dispensed to the patient.
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-valid_start_date
-
-
-The date when the Concept was first recorded. The default value is 1-Jan-1970.
-
-
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-valid_end_date
-
-
-The date when then Concept became invalid.
-
-
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-invalid_reason
-
-
-
Reason the concept was invalidated. Possible values are t
Below is the specification document for the OMOP Common Data Model, v6.0. 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 or the github issue page.
-
–after regeneration of DDLs link to csv of cdm link to pdf of cdm documentation link to forum on doc page
The name of ADMISSION_SOURCE_CONCEPT_ID was changed to ADMITTED_FROM_CONCEPT_ID in VISIT_OCCURRENCE and VISIT_DETAIL
-
All Concept_Ids are now mandatory except for UNIT_CONCEPT_ID, VALUE_AS_CONCEPT_ID, and OPERATOR_CONCEPT_ID. If there is no value available then a Concept_Id should be set to 0 instead of NULL.
-
DEATH table removed and DEATH_DATETIME field added to the PERSON table. Cause of death is stored in the CONDITION_OCCURRENCE
-
DATETIME fields were made mandatory and date fields were made optional.
-
-
-
-
Clinical Data Tables
-
-
PERSON
-
Table Description
-
This table serves as the central identity management for all Persons in the database. It contains records that uniquely identify each person or patient, and some demographic information.
-
User Guide
-
All records in this table are independent Persons.
-
ETL Conventions
-
All Persons in a database needs one record in this table, unless they fail data quality requirements specified in the ETL. Persons with no Events should have a record nonetheless. If more than one data source contributes Events to the database, Persons must be reconciled, if possible, across the sources to create one single record per Person. The BIRTH_DATETIME must be equivalent to the content of BIRTH_DAY, BIRTH_MONTH and BIRTH_YEAR. There is a helpful rule listed in table below for how to derive BIRTH_DATETIME if it is not available in the source. New to CDM v6.0 The person’s death date is now stored in this table instead of the separate DEATH table.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-person_id
-
-
-It is assumed that every person with a different unique identifier is in fact a different person and should be treated independently.
-
-
-Any person linkage that needs to occur to uniquely identify Persons ought to be done prior to writing this table. This identifier can be the original id from the source data provided if it is an integer, otherwise it can be an autogenerated number.
-
-
-bigint
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-gender_concept_id
-
-
-This field is meant to capture the biological sex at birth of the Person. This field should not be used to study gender identity issues.
-
-
-Use the gender or sex value present in the data under the assumption that it is the biological sex at birth. If the source data captures gender identity it should be stored in the OBSERVATION table. Accepted gender concepts
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Gender
-
-
-
-
-year_of_birth
-
-
-Compute age using year_of_birth.
-
-
-For data sources with date of birth, the year should be extracted. For data sources where the year of birth is not available, the approximate year of birth could be derived based on age group categorization, if available.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-month_of_birth
-
-
-
-
-For data sources that provide the precise date of birth, the month should be extracted and stored in this field.
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-day_of_birth
-
-
-
-
-For data sources that provide the precise date of birth, the day should be extracted and stored in this field.
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-birth_datetime
-
-
-
-
-This field is not required but highly encouraged. For data sources that provide the precise datetime of birth, that value should be stored in this field. If birth_datetime is not provided in the source, use the following logic to infer the date: If day_of_birth is null and month_of_birth is not null then use the first of the month in that year. If month_of_birth is null or if day_of_birth AND month_of_birth are both null and the person has records during their year of birth then use the date of the earliest record, otherwise use the 15th of June of that year. If time of birth is not given use midnight (00:00:0000).
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-death_datetime
-
-
-This field is the death date to be used in analysis, as determined by the ETL logic. Any additional information about a Person’s death is stored in the OBSERVATION table with the concept_id 4306655 or in the CONDITION_OCCURRENCE .
-
-
-If there are multiple dates of death given for a Person, choose the one that is deemed most reliable. This may be a discharge from the hospital where the Person is listed as deceased or it could be latest death date provided. If a patient has clinical activity more than 60 days after the death date given in the source, it is a viable option to drop the death record as it may have been falsely reported. Similarly, if the death record is from a reputable source (e.g. government provided information) it is also a viable option to remove event records that occur in the data > 60 days after death.
-
-
-datetime
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
-
-race_concept_id
-
-
-This field captures race or ethnic background of the person.
-
-
-Only use this field if you have information about race or ethnic background. The Vocabulary contains Concepts about the main races and ethnic backgrounds in a hierarchical system. Due to the imprecise nature of human races and ethnic backgrounds, this is not a perfect system. Mixed races are not supported. If a clear race or ethnic background cannot be established, use Concept_Id 0. Accepted Race Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Race
-
-
-
-
-ethnicity_concept_id
-
-
-This field captures Ethnicity as defined by the Office of Management and Budget (OMB) of the US Government: it distinguishes only between “Hispanic” and “Not Hispanic”. Races and ethnic backgrounds are not stored here.
-
-
-Only use this field if you have US-based data and a source of this information. Do not attempt to infer Ethnicity from the race or ethnic background of the Person. Accepted ethnicity concepts
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Ethnicity
-
-
-
-
-location_id
-
-
-The location refers to the physical address of the person. This field should capture the last known location of the person. Any prior locations are captured in the LOCATION_HISTORY table.
-
-
-Put the location_id from the LOCATION table here that represents the most granular location information for the person. This could represent anything from postal code or parts thereof, state, or county for example. Since many databases contain deidentified data, it is common that the precision of the location is reduced to prevent re-identification. This field should capture the last known location. Any prior locations are captured in the LOCATION_HISTORY table.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-LOCATION
-
-
-
-
-
-
-provider_id
-
-
-The Provider refers to the last known primary care provider (General Practitioner).
-
-
-Put the provider_id from the PROVIDER table of the last known general practitioner of the person. If there are multiple providers, it is up to the ETL to decide which to put here.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-PROVIDER
-
-
-
-
-
-
-care_site_id
-
-
-The Care Site refers to where the Provider typically provides the primary care.
-
-
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CARE_SITE
-
-
-
-
-
-
-person_source_value
-
-
-Use this field to link back to persons in the source data. This is typically used for error checking of ETL logic.
-
-
-Some use cases require the ability to link back to persons in the source data. This field allows for the storing of the person value as it appears in the source. This field is not required but strongly recommended.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-gender_source_value
-
-
-This field is used to store the biological sex of the person from the source data. It is not intended for use in standard analytics but for reference only.
-
-
-Put the biological sex of the person as it appears in the source data.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-gender_source_concept_id
-
-
-Due to the small number of options, this tends to be zero.
-
-
-If the source data codes biological sex in a non-standard vocabulary, store the concept_id here, otherwise set to 0.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-race_source_value
-
-
-This field is used to store the race of the person from the source data. It is not intended for use in standard analytics but for reference only.
-
-
-Put the race of the person as it appears in the source data.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-race_source_concept_id
-
-
-Due to the small number of options, this tends to be zero.
-
-
-If the source data codes race in an OMOP supported vocabulary store the concept_id here, otherwise set to 0.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-ethnicity_source_value
-
-
-This field is used to store the ethnicity of the person from the source data. It is not intended for use in standard analytics but for reference only.
-
-
-If the person has an ethnicity other than the OMB standard of “Hispanic” or “Not Hispanic” store that value from the source data here.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-ethnicity_source_concept_id
-
-
-Due to the small number of options, this tends to be zero.
-
-
-If the source data codes ethnicity in an OMOP supported vocabulary, store the concept_id here, otherwise set to 0.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-
-
-
OBSERVATION_PERIOD
-
Table Description
-
This table contains records which define spans of time during which two conditions are expected to hold: (i) Clinical Events that happened to the Person are recorded in the Event tables, and (ii) absense of records indicate such Events did not occur during this span of time.
-
User Guide
-
For each Person, one or more OBSERVATION_PERIOD records may be present, but they will not overlap or be back to back to each other. Events may exist outside all of the time spans of the OBSERVATION_PERIOD records for a patient, however, absence of an Event outside these time spans cannot be construed as evidence of absence of an Event. Incidence or prevalence rates should only be calculated for the time of active OBSERVATION_PERIOD records. When constructing cohorts, outside Events can be used for inclusion criteria definition, but without any guarantee for the performance of these criteria. Also, OBSERVATION_PERIOD records can be as short as a single day, greatly disturbing the denominator of any rate calculation as part of cohort characterizations. To avoid that, apply minimal observation time as a requirement for any cohort definition.
-
ETL Conventions
-
Each Person needs to have at least one OBSERVATION_PERIOD record, which should represent time intervals with a high capture rate of Clinical Events. Some source data have very similar concepts, such as enrollment periods in insurance claims data. In other source data such as most EHR systems these time spans need to be inferred under a set of assumptions. It is the discretion of the ETL developer to define these assumptions. In many ETL solutions the start date of the first occurrence or the first high quality occurrence of a Clinical Event (Condition, Drug, Procedure, Device, Measurement, Visit) is defined as the start of the OBSERVATION_PERIOD record, and the end date of the last occurrence of last high quality occurrence of a Clinical Event, or the end of the database period becomes the end of the OBSERVATOIN_PERIOD for each Person. If a Person only has a single Clinical Event the OBSERVATION_PERIOD record can be as short as one day. Depending on these definitions it is possible that Clinical Events fall outside the time spans defined by OBSERVATION_PERIOD records. Family history or history of Clinical Events generally are not used to generate OBSERVATION_PERIOD records around the time they are referring to. Any two overlapping or adjacent OBSERVATION_PERIOD records have to be merged into one.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-observation_period_id
-
-
-A Person can have multiple discrete Observation Periods which are identified by the Observation_Period_Id.
-
-
-Assign a unique observation_period_id to each discrete Observation Period for a Person.
-
-
-bigint
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-The Person ID of the PERSON record for which the Observation Period is recorded.
-
-
-
-
-bigint
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-observation_period_start_date
-
-
-Use this date to determine the start date of the Observation Period
-
-
-It is often the case that the idea of Observation Periods does not exist in source data. In those cases, the observation_period_start_date can be inferred as the earliest Event date available for the Person. In insurance claim data, the Observation Period can be considered as the time period the Person is enrolled with a payer. If a Person switches plans but stays with the same payer, and therefore capturing of data continues, that change would be captured in PAYER_PLAN_PERIOD.
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-observation_period_end_date
-
-
-Use this date to determine the end date of the period for which we can assume that all events for a Person are recorded.
-
-
-It is often the case that the idea of Observation Periods does not exist in source data. In those cases, the observation_period_end_date can be inferred as the last Event date available for the Person. In insurance claim data, the Observation Period can be considered as the time period the Person is enrolled with a payer.
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-period_type_concept_id
-
-
-This field can be used to determine the provenance of the Observation Period as in whether the period was determined from an insurance enrollment file, EHR healthcare encounters, or other sources.
-
-
-Choose the observation_period_type_concept_id that best represents how the period was determined. Accepted Concepts.
-
-
-Integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Type Concept
-
-
-
-
-
-
-
VISIT_OCCURRENCE
-
Table Description
-
This table contains Events where Persons engage with the healthcare system for a duration of time. They are often also called “Encounters”. Visits are defined by a configuration of circumstances under which they occur, such as (i) whether the patient comes to a healthcare institution, the other way around, or the interaction is remote, (ii) whether and what kind of trained medical staff is delivering the service during the Visit, and (iii) whether the Visit is transient or for a longer period involving a stay in bed.
-
User Guide
-
The configuration defining the Visit are described by Concepts in the Visit Domain, which form a hierarchical structure, but rolling up to generally familiar Visits adopted in most healthcare systems worldwide:
-
-
Inpatient Visit: Person visiting hospital, at a Care Site, in bed, for duration of more than one day, with physicians and other Providers permanently available to deliver service around the clock
-
Emergency Room Visit: Person visiting dedicated healthcare institution for treating emergencies, at a Care Site, within one day, with physicians and Providers permanently available to deliver service around the clock
-
Emergency Room and Inpatient Visit: Person visiting ER followed by a subsequent Inpatient Visit, where Emergency department is part of hospital, and transition from the ER to other hospital departments is undefined
-
Non-hospital institution Visit: Person visiting dedicated institution for reasons of poor health, at a Care Site, long-term or permanently, with no physician but possibly other Providers permanently available to deliver service around the clock
-
Outpatient Visit: Person visiting dedicated ambulatory healthcare institution, at a Care Site, within one day, without bed, with physicians or medical Providers delivering service during Visit
-
Home Visit: Provider visiting Person, without a Care Site, within one day, delivering service
-
Telehealth Visit: Patient engages with Provider through communication media
-
Pharmacy Visit: Person visiting pharmacy for dispensing of Drug, at a Care Site, within one day
-
Laboratory Visit: Patient visiting dedicated institution, at a Care Site, within one day, for the purpose of a Measurement.
-
Ambulance Visit: Person using transportation service for the purpose of initiating one of the other Visits, without a Care Site, within one day, potentially with Providers accompanying the Visit and delivering service
-
Case Management Visit: Person interacting with healthcare system, without a Care Site, within a day, with no Providers involved, for administrative purposes
-
-
The Visit duration, or ‘length of stay’, is defined as VISIT_END_DATE - VISIT_START_DATE. For all Visits this is <1 day, except Inpatient Visits and Non-hospital institution Visits. The CDM also contains the VISIT_DETAIL table where additional information about the Visit is stored, for example, transfers between units during an inpatient Visit.
-
ETL Conventions
-
Visits can be derived easily if the source data contain coding systems for Place of Service or Procedures, like CPT codes for well visits. In those cases, the codes can be looked up and mapped to a Standard Visit Concept. Otherwise, Visit Concepts have to be identified in the ETL process. This table will contain concepts in the Visit domain. These concepts are arranged in a hierarchical structure to facilitate cohort definitions by rolling up to generally familiar Visits adopted in most healthcare systems worldwide. Visits can be adjacent to each other, i.e. the end date of one can be identical with the start date of the other. As a consequence, more than one-day Visits or their descendants can be recorded for the same day. Multi-day visits must not overlap, i.e. share days other than start and end days. It is often the case that some logic should be written for how to define visits and how to assign Visit_Concept_Id. For example, in US claims outpatient visits that appear to occur within the time period of an inpatient visit can be rolled into one with the same Visit_Occurrence_Id. In EHR data inpatient visits that are within one day of each other may be strung together to create one visit. It will all depend on the source data and how encounter records should be translated to visit occurrences. Providers can be associated with a Visit through the PROVIDER_ID field, or indirectly through PROCEDURE_OCCURRENCE records linked both to the VISIT and PROVIDER tables.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-visit_occurrence_id
-
-
-Use this to identify unique interactions between a person and the health care system. This identifier links across the other CDM event tables to associate events with a visit.
-
-
-This should be populated by creating a unique identifier for each unique interaction between a person and the healthcare system where the person receives a medical good or service over a span of time.
-
-
-bigint
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-
-
-
-
-bigint
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-visit_concept_id
-
-
-This field contains a concept id representing the kind of visit, like inpatient or outpatient. All concepts in this field should be standard and belong to the Visit domain.
-
-
-Populate this field based on the kind of visit that took place for the person. For example this could be “Inpatient Visit”, “Outpatient Visit”, “Ambulatory Visit”, etc. This table will contain standard concepts in the Visit domain. These concepts are arranged in a hierarchical structure to facilitate cohort definitions by rolling up to generally familiar Visits adopted in most healthcare systems worldwide.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Visit
-
-
-
-
-visit_start_date
-
-
-For inpatient visits, the start date is typically the admission date. For outpatient visits the start date and end date will be the same.
-
-
-When populating visit_start_date, you should think about the patient experience to make decisions on how to define visits. In the case of an inpatient visit this should be the date the patient was admitted to the hospital or institution. In all other cases this should be the date of the patient-provider interaction.
-
-
-date
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-visit_start_datetime
-
-
-
-
-If no time is given for the start date of a visit, set it to midnight (00:00:0000).
-
-
-datetime
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-visit_end_date
-
-
-For inpatient visits the end date is typically the discharge date.
-
-
-Visit end dates are mandatory. If end dates are not provided in the source there are three ways in which to derive them: Outpatient Visit: visit_end_datetime = visit_start_datetime Emergency Room Visit: visit_end_datetime = visit_start_datetime Inpatient Visit: Usually there is information about discharge. If not, you should be able to derive the end date from the sudden decline of activity or from the absence of inpatient procedures/drugs. Non-hospital institution Visits: Particularly for claims data, if end dates are not provided assume the visit is for the duration of month that it occurs. For Inpatient Visits ongoing at the date of ETL, put date of processing the data into visit_end_datetime and visit_type_concept_id with 32220 “Still patient” to identify the visit as incomplete. All other Visits: visit_end_datetime = visit_start_datetime. If this is a one-day visit the end date should match the start date.
-
-
-date
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-visit_end_datetime
-
-
-
-
-If no time is given for the end date of a visit, set it to midnight (00:00:0000).
-
-
-datetime
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-visit_type_concept_id
-
-
-Use this field to understand the provenance of the visit record, or where the record comes from.
-
-
-Populate this field based on the provenance of the visit record, as in whether it came from an EHR record or billing claim.
-
-
-Integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Type Concept
-
-
-
-
-provider_id
-
-
-There will only be one provider per visit record and the ETL document should clearly state how they were chosen (attending, admitting, etc.). If there are multiple providers associated with a visit in the source, this can be reflected in the event tables (CONDITION_OCCURRENCE, PROCEDURE_OCCURRENCE, etc.) or in the VISIT_DETAIL table.
-
-
-If there are multiple providers associated with a visit, you will need to choose which one to put here. The additional providers can be stored in the visit_detail table.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-PROVIDER
-
-
-
-
-
-
-care_site_id
-
-
-This field provides information about the care site where the visit took place.
-
-
-There should only be one care site associated with a visit.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CARE_SITE
-
-
-
-
-
-
-visit_source_value
-
-
-This field houses the verbatim value from the source data representing the kind of visit that took place (inpatient, outpatient, emergency, etc.)
-
-
-If there is information about the kind of visit in the source data that value should be stored here. If a visit is an amalgamation of visits from the source then use a hierarchy to choose the visit source value, such as IP -> ER-> OP. This should line up with the logic chosen to determine how visits are created.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-visit_source_concept_id
-
-
-
-
-If the visit source value is coded in the source data using an OMOP supported vocabulary put the concept id representing the source value here. If not available set to 0.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-admitted_from_concept_id
-
-
-Use this field to determine where the patient was admitted from. This concept is part of the visit domain and can indicate if a patient was admitted to the hospital from a long-term care facility, for example.
-
-
-If available, map the admitted_from_source_value to a standard concept in the visit domain. If not available set to 0.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Visit
-
-
-
-
-admitted_from_source_value
-
-
-
-
-This information may be called something different in the source data but the field is meant to contain a value indicating where a person was admitted from. Typically this applies only to visits that have a length of stay, like inpatient visits or long-term care visits.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-discharge_to_concept_id
-
-
-Use this field to determine where the patient was discharged to after a visit. This concept is part of the visit domain and can indicate if a patient was discharged to home or sent to a long-term care facility, for example.
-
-
-If available, map the discharge_to_source_value to a standard concept in the visit domain. If not available set to 0.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Visit
-
-
-
-
-discharge_to_source_value
-
-
-
-
-This information may be called something different in the source data but the field is meant to contain a value indicating where a person was discharged to after a visit, as in they went home or were moved to long-term care. Typically this applies only to visits that have a length of stay of a day or more.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-preceding_visit_occurrence_id
-
-
-Use this field to find the visit that occurred for the person prior to the given visit. There could be a few days or a few years in between.
-
-
-The preceding_visit_id can be used to link a visit immediately preceding the current visit. Note this is not symmetrical, and there is no such thing as a “following_visit_id”.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_OCCURRENCE
-
-
-
-
-
-
-
-
-
VISIT_DETAIL
-
Table Description
-
The VISIT_DETAIL table is an optional table used to represents details of each record in the parent VISIT_OCCURRENCE table. A good example of this would be the movement between units in a hospital during an inpatient stay or claim lines associated with a one insurance claim. For every record in the VISIT_OCCURRENCE table there may be 0 or more records in the VISIT_DETAIL table with a 1:n relationship where n may be 0. The VISIT_DETAIL table is structurally very similar to VISIT_OCCURRENCE table and belongs to the visit domain.
-
User Guide
-
The configuration defining the Visit Detail is described by Concepts in the Visit Domain, which form a hierarchical structure. The Visit Detail record will have an associated to the Visit Occurrence record in two ways: 1. The Visit Detail record will have the VISIT_OCCURRENCE_ID it is associated to 2. The VISIT_DETAIL_CONCEPT_ID will be a descendant of the VISIT_CONCEPT_ID for the Visit.
-
ETL Conventions
-
It is not mandatory that the VISIT_DETAIL table be filled in, but if you find that the logic to create VISIT_OCCURRENCE records includes the roll-up of multiple smaller records to create one picture of a Visit then it is a good idea to use VISIT_DETAIL. In EHR data, for example, a Person may be in the hospital but instead of one over-arching Visit their encounters are recorded as times they interacted with a health care provider. A Person in the hospital interacts with multiple providers multiple times a day so the encounters must be strung together using some heuristic (defined by the ETL) to identify the entire Visit. In this case the encounters would be considered Visit Details and the entire Visit would be the Visit Occurrence. In this example it is also possible to use the Vocabulary to distinguish Visit Details from a Visit Occurrence by setting the VISIT_CONCEPT_ID to 9201 and the VISIT_DETAIL_CONCEPT_IDs either to 9201 or its children to indicate where the patient was in the hospital at the time of care.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-visit_detail_id
-
-
-Use this to identify unique interactions between a person and the health care system. This identifier links across the other CDM event tables to associate events with a visit detail.
-
-
-This should be populated by creating a unique identifier for each unique interaction between a person and the healthcare system where the person receives a medical good or service over a span of time.
-
-
-bigint
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-
-
-
-
-bigint
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-visit_detail_concept_id
-
-
-This field contains a concept id representing the kind of visit detail, like inpatient or outpatient. All concepts in this field should be standard and belong to the Visit domain.
-
-
-Populate this field based on the kind of visit that took place for the person. For example this could be “Inpatient Visit”, “Outpatient Visit”, “Ambulatory Visit”, etc. This table will contain standard concepts in the Visit domain. These concepts are arranged in a hierarchical structure to facilitate cohort definitions by rolling up to generally familiar Visits adopted in most healthcare systems worldwide. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Visit
-
-
-
-
-visit_detail_start_date
-
-
-This is the date of the start of the encounter. This may or may not be equal to the date of the Visit the Visit Detail is associated with.
-
-
-When populating visit_start_date, you should think about the patient experience to make decisions on how to define visits. Most likely this should be the date of the patient-provider interaction.
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-visit_detail_start_datetime
-
-
-
-
-If no time is given for the start date of a visit, set it to midnight (00:00:0000).
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-visit_detail_end_date
-
-
-This the end date of the patient-provider interaction.
-
-
-Visit Detail end dates are mandatory. If end dates are not provided in the source there are three ways in which to derive them:<br> - Outpatient Visit Detail: visit_detail_end_datetime = visit_detail_start_datetime - Emergency Room Visit Detail: visit_detail_end_datetime = visit_detail_start_datetime - Inpatient Visit Detail: Usually there is information about discharge. If not, you should be able to derive the end date from the sudden decline of activity or from the absence of inpatient procedures/drugs. - Non-hospital institution Visit Details: Particularly for claims data, if end dates are not provided assume the visit is for the duration of month that it occurs.<br> For Inpatient Visit Details ongoing at the date of ETL, put date of processing the data into visit_detai_end_datetime and visit_detail_type_concept_id with 32220 “Still patient” to identify the visit as incomplete. All other Visits Details: visit_detail_end_datetime = visit_detail_start_datetime.
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-visit_detail_end_datetime
-
-
-
-
-If no time is given for the end date of a visit, set it to midnight (00:00:0000).
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-visit_detail_type_concept_id
-
-
-Use this field to understand the provenance of the visit detail record, or where the record comes from.
-
-
-Populate this field based on the provenance of the visit detail record, as in whether it came from an EHR record or billing claim. Accepted Concepts.
-
-
-Integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Type Concept
-
-
-
-
-provider_id
-
-
-There will only be one provider per visit record and the ETL document should clearly state how they were chosen (attending, admitting, etc.). This is a typical reason for leveraging the VISIT_DETAIL table as even though each VISIT_DETAIL record can only have one provider, there is no limit to the number of VISIT_DETAIL records that can be associated to a VISIT_OCCURRENCE record.
-
-
-The additional providers associated to a Visit can be stored in this table where each VISIT_DETAIL record represents a different provider.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-PROVIDER
-
-
-
-
-
-
-care_site_id
-
-
-This field provides information about the Care Site where the Visit Detail took place.
-
-
-There should only be one Care Site associated with a Visit Detail.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CARE_SITE
-
-
-
-
-
-
-visit_detail_source_value
-
-
-This field houses the verbatim value from the source data representing the kind of visit detail that took place (inpatient, outpatient, emergency, etc.)
-
-
-If there is information about the kind of visit detail in the source data that value should be stored here. If a visit is an amalgamation of visits from the source then use a hierarchy to choose the VISIT_DETAIL_SOURCE_VALUE, such as IP -> ER-> OP. This should line up with the logic chosen to determine how visits are created.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-visit_detail_source_concept_id
-
-
-
-
-If the VISIT_DETAIL_SOURCE_VALUE is coded in the source data using an OMOP supported vocabulary put the concept id representing the source value here. If not available, map to 0.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-admitting_source_value
-
-
-
-
-This information may be called something different in the source data but the field is meant to contain a value indicating where a person was admitted from. Typically this applies only to visits that have a length of stay, like inpatient visits or long-term care visits.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-admitting_source_concept_id
-
-
-Use this field to determine where the patient was admitted from. This concept is part of the visit domain and can indicate if a patient was admitted to the hospital from a long-term care facility, for example.
-
-
-If available, map the admitted_from_source_value to a standard concept in the visit domain. If not available, map to 0. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Visit
-
-
-
-
-discharge_to_source_value
-
-
-
-
-This information may be called something different in the source data but the field is meant to contain a value indicating where a person was discharged to after a visit, as in they went home or were moved to long-term care. Typically this applies only to visits that have a length of stay of a day or more.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-discharge_to_concept_id
-
-
-Use this field to determine where the patient was discharged to after a visit detail record. This concept is part of the visit domain and can indicate if a patient was discharged to home or sent to a long-term care facility, for example.
-
-
-If available, map the DISCHARGE_TO_SOURCE_VALUE to a Standard Concept in the Visit domain. If not available, set to 0. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Visit
-
-
-
-
-preceding_visit_detail_id
-
-
-Use this field to find the visit detail that occurred for the person prior to the given visit detail record. There could be a few days or a few years in between.
-
-
-The PRECEDING_VISIT_DETAIL_ID can be used to link a visit immediately preceding the current Visit Detail. Note this is not symmetrical, and there is no such thing as a “following_visit_id”.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_DETAIL
-
-
-
-
-
-
-visit_detail_parent_id
-
-
-Use this field to find the visit detail that subsumes the given visit detail record. This is used in the case that a visit detail record needs to be nested beyond the VISIT_OCCURRENCE/VISIT_DETAIL relationship.
-
-
-If there are multiple nested levels to how Visits are represented in the source, the VISIT_DETAIL_PARENT_ID can be used to record this relationship.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_DETAIL
-
-
-
-
-
-
-visit_occurrence_id
-
-
-Use this field to link the VISIT_DETAIL record to its VISIT_OCCURRENCE.
-
-
-Put the VISIT_OCCURRENCE_ID that subsumes the VISIT_DETAIL record here.
-
-
-bigint
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-VISIT_OCCURRENCE
-
-
-
-
-
-
-
-
-
CONDITION_OCCURRENCE
-
Table Description
-
This table contains records of Events of a Person suggesting the presence of a disease or medical condition stated as a diagnosis, a sign, or a symptom, which is either observed by a Provider or reported by the patient.
-
User Guide
-
Conditions are defined by Concepts from the Condition domain, which form a complex hierarchy. As a result, the same Person with the same disease may have multiple Condition records, which belong to the same hierarchical family. Most Condition records are mapped from diagnostic codes, but recorded signs, symptoms and summary descriptions also contribute to this table. Rule out diagnoses should not be recorded in this table, but in reality their negating nature is not always captured in the source data, and other precautions must be taken when when identifying Persons who should suffer from the recorded Condition. Record all conditions as they exist in the source data. Any decisions about diagnosis/phenotype definitions would be done through cohort specifications. These cohorts can be housed in the COHORT table. Conditions span a time interval from start to end, but are typically recorded as single snapshot records with no end date. The reason is twofold: (i) At the time of the recording the duration is not known and later not recorded, and (ii) the Persons typically cease interacting with the healthcare system when they feel better, which leads to incomplete capture of resolved Conditions. The CONDITION_ERA table addresses this issue. Family history and past diagnoses (‘history of’) are not recorded in this table. Instead, they are listed in the OBSERVATION table. Codes written in the process of establishing the diagnosis, such as ‘question of’ of and ‘rule out’, should not represented here. Instead, they should be recorded in the OBSERVATION table, if they are used for analyses. However, this information is not always available.
-
ETL Conventions
-
Source codes and source text fields mapped to Standard Concepts of the Condition Domain have to be recorded here.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-condition_occurrence_id
-
-
-The unique key given to a condition record for a person. Refer to the ETL for how duplicate conditions during the same visit were handled.
-
-
-Each instance of a condition present in the source data should be assigned this unique key. In some cases, a person can have multiple records of the same condition within the same visit. It is valid to keep these duplicates and assign them individual, unique, CONDITION_OCCURRENCE_IDs, though it is up to the ETL how they should be handled.
-
-
-bigint
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-The PERSON_ID of the PERSON for whom the condition is recorded.
-
-
-
-
-bigint
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-condition_concept_id
-
-
-The CONDITION_CONCEPT_ID field is recommended for primary use in analyses, and must be used for network studies. This is the standard concept mapped from the source value which represents a condition
-
-
-The CONCEPT_ID that the CONDITION_SOURCE_VALUE maps to. Only records whose source values map to concepts with a domain of “Condition” should go in this table. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Condition
-
-
-
-
-condition_start_date
-
-
-Use this date to determine the start date of the condition
-
-
-Most often data sources do not have the idea of a start date for a condition. Rather, if a source only has one date associated with a condition record it is acceptable to use that date for both the CONDITION_START_DATE and the CONDITION_END_DATE.
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-condition_start_datetime
-
-
-
-
-If a source does not specify datetime the convention is to set the time to midnight (00:00:0000)
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-condition_end_date
-
-
-Use this date to determine the end date of the condition
-
-
-Most often data sources do not have the idea of a start date for a condition. Rather, if a source only has one date associated with a condition record it is acceptable to use that date for both the CONDITION_START_DATE and the CONDITION_END_DATE.
-
-
-date
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-condition_end_datetime
-
-
-
-
-If a source does not specify datetime the convention is to set the time to midnight (00:00:0000)
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-condition_type_concept_id
-
-
-This field can be used to determine the provenance of the Condition record, as in whether the condition was from an EHR system, insurance claim, registry, or other sources.
-
-
-Choose the condition_type_concept_id that best represents the provenance of the record. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Type Concept
-
-
-
-
-condition_status_concept_id
-
-
-This concept represents the point during the visit the diagnosis was given (admitting diagnosis, final diagnosis), whether the diagnosis was determined due to laboratory findings, if the diagnosis was exclusionary, or if it was a preliminary diagnosis, among others.
-
-
-Choose the Concept in the Condition Status domain that best represents the point during the visit when the diagnosis was given. These can include admitting diagnosis, principal diagnosis, and secondary diagnosis. If not available, set to 0. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-stop_reason
-
-
-The Stop Reason indicates why a Condition is no longer valid with respect to the purpose within the source data. Note that a Stop Reason does not necessarily imply that the condition is no longer occurring.
-
-
-This information is often not populated in source data and it is a valid etl choice to leave it blank if the information does not exist.
-
-
-varchar(20)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-provider_id
-
-
-The provider associated with condition record, e.g. the provider who made the diagnosis or the provider who recorded the symptom.
-
-
-The ETL may need to make a choice as to which PROVIDER_ID to put here. Based on what is available this may or may not be different than the provider associated with the overall VISIT_OCCURRENCE record, for example the admitting vs attending physician on an EHR record.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-PROVIDER
-
-
-
-
-
-
-visit_occurrence_id
-
-
-The visit during which the condition occurred.
-
-
-Depending on the structure of the source data, this may have to be determined based on dates. If a CONDITION_START_DATE occurs within the start and end date of a Visit it is a valid ETL choice to choose the VISIT_OCCURRENCE_ID from the Visit that subsumes it, even if not explicitly stated in the data. While not required, an attempt should be made to locate the VISIT_OCCURRENCE_ID of the CONDITION_OCCURRENCE record.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_OCCURRENCE
-
-
-
-
-
-
-visit_detail_id
-
-
-The VISIT_DETAIL record during which the condition occurred. For example, if the person was in the ICU at the time of the diagnosis the VISIT_OCCURRENCE record would reflect the overall hospital stay and the VISIT_DETAIL record would reflect the ICU stay during the hospital visit.
-
-
-Same rules apply as for the VISIT_OCCURRENCE_ID.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_DETAIL
-
-
-
-
-
-
-condition_source_value
-
-
-This field houses the verbatim value from the source data representing the condition that occurred. For example, this could be an ICD10 or Read code.
-
-
-This code is mapped to a Standard Condition Concept in the Standardized Vocabularies and the original code is stored here for reference.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-condition_source_concept_id
-
-
-This is the concept representing the condition source value and may not necessarily be standard. This field is discouraged from use in analysis because it is not required to contain Standard Concepts that are used across the OHDSI community, and should only be used when Standard Concepts do not adequately represent the source detail for the Condition necessary for a given analytic use case. Consider using CONDITION_CONCEPT_ID instead to enable standardized analytics that can be consistent across the network.
-
-
-If the CONDITION_SOURCE_VALUE is coded in the source data using an OMOP supported vocabulary put the concept id representing the source value here. If not available, set to 0.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-condition_status_source_value
-
-
-This field houses the verbatim value from the source data representing the condition status.
-
-
-This information may be called something different in the source data but the field is meant to contain a value indicating when and how a diagnosis was given to a patient. This source value is mapped to a standard concept which is stored in the CONDITION_STATUS_CONCEPT_ID field.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
DRUG_EXPOSURE
-
Table Description
-
This table captures records about the exposure to a Drug ingested or otherwise introduced into the body. A Drug is a biochemical substance formulated in such a way that when administered to a Person it will exert a certain biochemical effect on the metabolism. Drugs include prescription and over-the-counter medicines, vaccines, and large-molecule biologic therapies. Radiological devices ingested or applied locally do not count as Drugs.
-
User Guide
-
The purpose of records in this table is to indicate an exposure to a certain drug as best as possible. In this context a drug is defined as an active ingredient. Drug Exposures are defined by Concepts from the Drug domain, which form a complex hierarchy. As a result, one DRUG_SOURCE_CONCEPT_ID may map to multiple standard concept ids if it is a combination product. Records in this table represent prescriptions written, prescriptions dispensed, and drugs administered by a provider to name a few. The DRUG_TYPE_CONCEPT_ID can be used to find and filter on these types. This table includes additional information about the drug products, the quantity given, and route of administration.
-
ETL Conventions
-
Information about quantity and dose is provided in a variety of different ways and it is important for the ETL to provide as much information as possible from the data. Depending on the provenance of the data fields may be captured differently i.e. quantity for drugs administered may have a separate meaning from quantity for prescriptions dispensed. If a patient has multiple records on the same day for the same drug or procedures the ETL should not de-dupe them unless there is probable reason to believe the item is a true data duplicate. Take note on how to handle refills for prescriptions written.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-drug_exposure_id
-
-
-The unique key given to records of drug dispensings or administrations for a person. Refer to the ETL for how duplicate drugs during the same visit were handled.
-
-
-Each instance of a drug dispensing or administration present in the source data should be assigned this unique key. In some cases, a person can have multiple records of the same drug within the same visit. It is valid to keep these duplicates and assign them individual, unique, DRUG_EXPOSURE_IDs, though it is up to the ETL how they should be handled.
-
-
-bigint
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-The PERSON_ID of the PERSON for whom the drug dispensing or administration is recorded. This may be a system generated code.
-
-
-
-
-bigint
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-drug_concept_id
-
-
-The DRUG_CONCEPT_ID field is recommended for primary use in analyses, and must be used for network studies. This is the standard concept mapped from the source concept id which represents a drug product or molecule otherwise introduced to the body. The drug concepts can have a varying degree of information about drug strength and dose. This information is relevant in the context of quantity and administration information in the subsequent fields plus strength information from the DRUG_STRENGTH table, provided as part of the standard vocabulary download.
-
-
-The CONCEPT_ID that the DRUG_SOURCE_VALUE maps to. The concept id should be derived either from mapping from the source concept id or by picking the drug concept representing the most amount of detail you have. Records whose source values map to standard concepts with a domain of Drug should go in this table. When the Drug Source Value of the code cannot be translated into Standard Drug Concept IDs, a Drug exposure entry is stored with only the corresponding SOURCE_CONCEPT_ID and DRUG_SOURCE_VALUE and a DRUG_CONCEPT_ID of 0. The Drug Concept with the most detailed content of information is preferred during the mapping process. These are indicated in the CONCEPT_CLASS_ID field of the Concept and are recorded in the following order of precedence: ‘Branded Pack’, ‘Clinical Pack’, ‘Branded Drug’, ‘Clinical Drug’, ‘Branded Drug Component’, ‘Clinical Drug Component’, ‘Branded Drug Form’, ‘Clinical Drug Form’, and only if no other information is available ‘Ingredient’. Note: If only the drug class is known, the DRUG_CONCEPT_ID field should contain 0. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Drug
-
-
-
-
-drug_exposure_start_date
-
-
-Use this date to determine the start date of the drug record.
-
-
-Valid entries include a start date of a prescription, the date a prescription was filled, or the date on which a Drug administration was recorded. It is a valid ETL choice to use the date the drug was ordered as the DRUG_EXPOSURE_START_DATE.
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-drug_exposure_start_datetime
-
-
-
-
-This is not required, though it is in v6. If a source does not specify datetime the convention is to set the time to midnight (00:00:0000)
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-drug_exposure_end_date
-
-
-The DRUG_EXPOSURE_END_DATE denotes the day the drug exposure ended for the patient.
-
-
-If this information is not explicitly available in the data, infer the end date using the following methods:/n/n 1. Start first with duration or days supply using the calculation drug start date + days supply -1 day. 2. Use quantity divided by daily dose that you may obtain from the sig or a source field (or assumed daily dose of 1) for solid, indivisibile, drug products. If quantity represents ingredient amount, quantity divided by daily dose * concentration (from drug_strength) drug concept id tells you the dose form. 3. If it is an administration record, set drug end date equal to drug start date. If the record is a written prescription then set end date to start date + 29. If the record is a mail-order prescription set end date to start date + 89. The end date must be equal to or greater than the start date. Ibuprofen 20mg/mL oral solution concept tells us this is oral solution. Calculate duration as quantity (200 example) * daily dose (5mL) /concentration (20mg/mL) 200*5/20 = 50 days. Examples by dose form
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-drug_exposure_end_datetime
-
-
-
-
-This is not required, though it is in v6. If a source does not specify datetime the convention is to set the time to midnight (00:00:0000)
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-verbatim_end_date
-
-
-This is the end date of the drug exposure as it appears in the source data, if it is given
-
-
-Put the end date or discontinuation date as it appears from the source data or leave blank if unavailable.
-
-
-date
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-drug_type_concept_id
-
-
-You can use the TYPE_CONCEPT_ID to delineate between prescriptions written vs. prescriptions dispensed vs. medication history vs. patient-reported exposure, etc.
-
-
-Choose the drug_type_concept_id that best represents the provenance of the record, for example whether it came from a record of a prescription written or physician administered drug. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Type Concept
-
-
-
-
-stop_reason
-
-
-The reason a person stopped a medication as it is represented in the source. Reasons include regimen completed, changed, removed, etc. This field will be retired in v6.0.
-
-
-This information is often not populated in source data and it is a valid etl choice to leave it blank if the information does not exist.
-
-
-varchar(20)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-refills
-
-
-This is only filled in when the record is coming from a prescription written this field is meant to represent intended refills at time of the prescription.
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-quantity
-
-
-
-
-To find the dose form of a drug the RELATIONSHIP table can be used where the relationship_id is ‘Has dose form’. If liquid, quantity stands for the total amount dispensed or ordered of ingredient in the units given by the drug_strength table. If the unit from the source data does not align with the unit in the DRUG_STRENGTH table the quantity should be converted to the correct unit given in DRUG_STRENGTH. For clinical drugs with fixed dose forms (tablets etc.) the quantity is the number of units/tablets/capsules prescribed or dispensed (can be partial, but then only 1/2 or 1/3, not 0.01). Clinical drugs with divisible dose forms (injections) the quantity is the amount of ingredient the patient got. For example, if the injection is 2mg/mL but the patient got 80mL then quantity is reported as 160. Quantified clinical drugs with divisible dose forms (prefilled syringes), the quantity is the amount of ingredient similar to clinical drugs. Please see how to calculate drug dose for more information.
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-days_supply
-
-
-
-
-Days supply of the drug. This should be the verbatim days_supply as given on the prescription. If the drug is physician administered use duration end date if given or set to 1 as default if duration is not available.
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-sig
-
-
-This is the verbatim instruction for the drug as written by the provider.
-
-
-Put the written out instructions for the drug as it is verbatim in the source, if available.
-
-
-varchar(MAX)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-route_concept_id
-
-
-
-
-The standard CONCEPT_ID that the ROUTE_SOURCE_VALUE maps to in the route domain.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Route
-
-
-
-
-lot_number
-
-
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-provider_id
-
-
-The Provider associated with drug record, e.g. the provider who wrote the prescription or the provider who administered the drug.
-
-
-The ETL may need to make a choice as to which PROVIDER_ID to put here. Based on what is available this may or may not be different than the provider associated with the overall VISIT_OCCURRENCE record, for example the ordering vs administering physician on an EHR record.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-PROVIDER
-
-
-
-
-
-
-visit_occurrence_id
-
-
-The Visit during which the drug was prescribed, administered or dispensed.
-
-
-To populate this field drug exposures must be explicitly initiated in the visit.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_OCCURRENCE
-
-
-
-
-
-
-visit_detail_id
-
-
-The VISIT_DETAIL record during which the drug exposure occurred. For example, if the person was in the ICU at the time of the drug administration the VISIT_OCCURRENCE record would reflect the overall hospital stay and the VISIT_DETAIL record would reflect the ICU stay during the hospital visit.
-
-
-Same rules apply as for the VISIT_OCCURRENCE_ID.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_DETAIL
-
-
-
-
-
-
-drug_source_value
-
-
-This field houses the verbatim value from the source data representing the drug exposure that occurred. For example, this could be an NDC or Gemscript code.
-
-
-This code is mapped to a Standard Drug Concept in the Standardized Vocabularies and the original code is stored here for reference.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-drug_source_concept_id
-
-
-This is the concept representing the drug source value and may not necessarily be standard. This field is discouraged from use in analysis because it is not required to contain Standard Concepts that are used across the OHDSI community, and should only be used when Standard Concepts do not adequately represent the source detail for the Drug necessary for a given analytic use case. Consider using DRUG_CONCEPT_ID instead to enable standardized analytics that can be consistent across the network.
-
-
-If the DRUG_SOURCE_VALUE is coded in the source data using an OMOP supported vocabulary put the concept id representing the source value here. If unavailable, set to 0.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-route_source_value
-
-
-This field houses the verbatim value from the source data representing the drug route.
-
-
-This information may be called something different in the source data but the field is meant to contain a value indicating when and how a drug was given to a patient. This source value is mapped to a standard concept which is stored in the ROUTE_CONCEPT_ID field.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-dose_unit_source_value
-
-
-This field houses the verbatim value from the source data representing the dose unit of the drug given.
-
-
-This information may be called something different in the source data but the field is meant to contain a value indicating the unit of dosage of drug given to the patient. This is an older column and will be deprecated in an upcoming version.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
PROCEDURE_OCCURRENCE
-
Table Description
-
This table contains records of activities or processes ordered by, or carried out by, a healthcare provider on the patient with a diagnostic or therapeutic purpose.
-
User Guide
-
Lab tests are not a procedure, if something is observed with an expected resulting amount and unit then it should be a measurement. Phlebotomy is a procedure but so trivial that it tends to be rarely captured. It can be assumed that there is a phlebotomy procedure associated with many lab tests, therefore it is unnecessary to add them as separate procedures. If the user finds the same procedure over concurrent days, it is assumed those records are part of a procedure lasting more than a day. This logic is in lieu of the procedure_end_date, which will be added in a future version of the CDM.
-
ETL Conventions
-
If a procedure lasts more than a day, then it should be recorded as a separate record for each day the procedure occurred, this logic is in lieu of the PROCEDURE_END_DATE, which will be added in a future version of the CDM. When dealing with duplicate records, the ETL must determine whether to sum them up into one record or keep them separate. Things to consider are: - Same Procedure - Same PROCEDURE_DATETIME - Same Visit Occurrence or Visit Detail - Same Provider - Same Modifier for Procedures. Source codes and source text fields mapped to Standard Concepts of the Procedure Domain have to be recorded here.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-procedure_occurrence_id
-
-
-The unique key given to a procedure record for a person. Refer to the ETL for how duplicate procedures during the same visit were handled.
-
-
-Each instance of a procedure occurrence in the source data should be assigned this unique key. In some cases, a person can have multiple records of the same procedure within the same visit. It is valid to keep these duplicates and assign them individual, unique, PROCEDURE_OCCURRENCE_IDs, though it is up to the ETL how they should be handled.
-
-
-bigint
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-The PERSON_ID of the PERSON for whom the procedure is recorded. This may be a system generated code.
-
-
-
-
-bigint
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-procedure_concept_id
-
-
-The PROCEDURE_CONCEPT_ID field is recommended for primary use in analyses, and must be used for network studies. This is the standard concept mapped from the source value which represents a procedure
-
-
-The CONCEPT_ID that the PROCEDURE_SOURCE_VALUE maps to. Only records whose source values map to standard concepts with a domain of “Procedure” should go in this table. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Procedure
-
-
-
-
-procedure_date
-
-
-Use this date to determine the date the procedure occurred.
-
-
-If a procedure lasts more than a day, then it should be recorded as a separate record for each day the procedure occurred, this logic is in lieu of the procedure_end_date, which will be added in a future version of the CDM.
-
-
-date
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-procedure_datetime
-
-
-
-
-This is not required, though it is in v6. If a source does not specify datetime the convention is to set the time to midnight (00:00:0000)
-
-
-datetime
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-procedure_type_concept_id
-
-
-This field can be used to determine the provenance of the Procedure record, as in whether the procedure was from an EHR system, insurance claim, registry, or other sources.
-
-
-Choose the PROCEDURE_TYPE_CONCEPT_ID that best represents the provenance of the record, for example whether it came from an EHR record or billing claim. If a procedure is recorded as an EHR encounter, the PROCEDURE_TYPE_CONCEPT would be ‘EHR encounter record’. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Type Concept
-
-
-
-
-modifier_concept_id
-
-
-The modifiers are intended to give additional information about the procedure but as of now the vocabulary is under review.
-
-
-It is up to the ETL to choose how to map modifiers if they exist in source data. These concepts are typically distinguished by ‘Modifier’ concept classes (e.g., ‘CPT4 Modifier’ as part of the ‘CPT4’ vocabulary). If there is more than one modifier on a record, one should be chosen that pertains to the procedure rather than provider. If not available, set to 0. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-quantity
-
-
-If the quantity value is omitted, a single procedure is assumed.
-
-
-If a Procedure has a quantity of ‘0’ in the source, this should default to ‘1’ in the ETL. If there is a record in the source it can be assumed the exposure occurred at least once
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-provider_id
-
-
-The provider associated with the procedure record, e.g. the provider who performed the Procedure.
-
-
-The ETL may need to make a choice as to which PROVIDER_ID to put here. Based on what is available this may or may not be different than the provider associated with the overall VISIT_OCCURRENCE record, for example the admitting vs attending physician on an EHR record.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-No
-
-
-PROVIDER
-
-
-
-
-
-
-visit_occurrence_id
-
-
-The visit during which the procedure occurred.
-
-
-Depending on the structure of the source data, this may have to be determined based on dates. If a PROCEDURE_DATE occurs within the start and end date of a Visit it is a valid ETL choice to choose the VISIT_OCCURRENCE_ID from the Visit that subsumes it, even if not explicitly stated in the data. While not required, an attempt should be made to locate the VISIT_OCCURRENCE_ID of the PROCEDURE_OCCURRENCE record.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-No
-
-
-VISIT_OCCURRENCE
-
-
-
-
-
-
-visit_detail_id
-
-
-The VISIT_DETAIL record during which the Procedure occurred. For example, if the Person was in the ICU at the time of the Procedure the VISIT_OCCURRENCE record would reflect the overall hospital stay and the VISIT_DETAIL record would reflect the ICU stay during the hospital visit.
-
-
-Same rules apply as for the VISIT_OCCURRENCE_ID.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-No
-
-
-VISIT_DETAIL
-
-
-
-
-
-
-procedure_source_value
-
-
-This field houses the verbatim value from the source data representing the procedure that occurred. For example, this could be an CPT4 or OPCS4 code.
-
-
-Use this value to look up the source concept id and then map the source concept id to a standard concept id.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-procedure_source_concept_id
-
-
-This is the concept representing the procedure source value and may not necessarily be standard. This field is discouraged from use in analysis because it is not required to contain Standard Concepts that are used across the OHDSI community, and should only be used when Standard Concepts do not adequately represent the source detail for the Procedure necessary for a given analytic use case. Consider using PROCEDURE_CONCEPT_ID instead to enable standardized analytics that can be consistent across the network.
-
-
-If the PROCEDURE_SOURCE_VALUE is coded in the source data using an OMOP supported vocabulary put the concept id representing the source value here. If not available, set to 0.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-No
-
-
-CONCEPT
-
-
-
-
-
-
-modifier_source_value
-
-
-
-
-The original modifier code from the source is stored here for reference.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
DEVICE_EXPOSURE
-
Table Description
-
The Device domain captures information about a person’s exposure to a foreign physical object or instrument which is used for diagnostic or therapeutic purposes through a mechanism beyond chemical action. Devices include implantable objects (e.g. pacemakers, stents, artificial joints), medical equipment and supplies (e.g. bandages, crutches, syringes), other instruments used in medical procedures (e.g. sutures, defibrillators) and material used in clinical care (e.g. adhesives, body material, dental material, surgical material).
-
User Guide
-
The distinction between Devices or supplies and Procedures are sometimes blurry, but the former are physical objects while the latter are actions, often to apply a Device or supply.
-
ETL Conventions
-
Source codes and source text fields mapped to Standard Concepts of the Device Domain have to be recorded here.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-device_exposure_id
-
-
-The unique key given to records a person’s exposure to a foreign physical object or instrument.
-
-
-Each instance of an exposure to a foreign object or device present in the source data should be assigned this unique key.
-
-
-bigint
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-
-
-
-
-bigint
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-device_concept_id
-
-
-The DEVICE_CONCEPT_ID field is recommended for primary use in analyses, and must be used for network studies. This is the standard concept mapped from the source concept id which represents a foreign object or instrument the person was exposed to.
-
-
-The CONCEPT_ID that the DEVICE_SOURCE_VALUE maps to.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Device
-
-
-
-
-device_exposure_start_date
-
-
-Use this date to determine the start date of the device record.
-
-
-Valid entries include a start date of a procedure to implant a device, the date of a prescription for a device, or the date of device administration.
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-device_exposure_start_datetime
-
-
-
-
-This is not required, though it is in v6. If a source does not specify datetime the convention is to set the time to midnight (00:00:0000)
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-device_exposure_end_date
-
-
-The DEVICE_EXPOSURE_END_DATE denotes the day the device exposure ended for the patient, if given.
-
-
-Put the end date or discontinuation date as it appears from the source data or leave blank if unavailable.
-
-
-date
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-device_exposure_end_datetime
-
-
-
-
-If a source does not specify datetime the convention is to set the time to midnight (00:00:0000)
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-device_type_concept_id
-
-
-You can use the TYPE_CONCEPT_ID to denote the provenance of the record, as in whether the record is from administrative claims or EHR. Accepted Concepts.
-
-
-Choose the drug_type_concept_id that best represents the provenance of the record, for example whether it came from a record of a prescription written or physician administered drug.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Type Concept
-
-
-
-
-unique_device_id
-
-
-This is the Unique Device Identification number for devices regulated by the FDA, if given.
-
-
-For medical devices that are regulated by the FDA, a Unique Device Identification (UDI) is provided if available in the data source and is recorded in the UNIQUE_DEVICE_ID field.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-quantity
-
-
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-provider_id
-
-
-The Provider associated with device record, e.g. the provider who wrote the prescription or the provider who implanted the device.
-
-
-The ETL may need to make a choice as to which PROVIDER_ID to put here. Based on what is available this may or may not be different than the provider associated with the overall VISIT_OCCURRENCE record.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-PROVIDER
-
-
-
-
-
-
-visit_occurrence_id
-
-
-The Visit during which the device was prescribed or given.
-
-
-To populate this field device exposures must be explicitly initiated in the visit.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_OCCURRENCE
-
-
-
-
-
-
-visit_detail_id
-
-
-The Visit Detail during which the device was prescribed or given.
-
-
-To populate this field device exposures must be explicitly initiated in the visit detail record.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_DETAIL
-
-
-
-
-
-
-device_source_value
-
-
-This field houses the verbatim value from the source data representing the device exposure that occurred. For example, this could be an NDC or Gemscript code.
-
-
-This code is mapped to a Standard Device Concept in the Standardized Vocabularies and the original code is stored here for reference.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-device_source_concept_id
-
-
-This is the concept representing the device source value and may not necessarily be standard. This field is discouraged from use in analysis because it is not required to contain Standard Concepts that are used across the OHDSI community, and should only be used when Standard Concepts do not adequately represent the source detail for the Device necessary for a given analytic use case. Consider using DEVICE_CONCEPT_ID instead to enable standardized analytics that can be consistent across the network.
-
-
-If the DEVICE_SOURCE_VALUE is coded in the source data using an OMOP supported vocabulary put the concept id representing the source value here. If unavailable, set to 0.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-
-
-
MEASUREMENT
-
Table Description
-
The MEASUREMENT table contains records of Measurements, i.e. structured values (numerical or categorical) obtained through systematic and standardized examination or testing of a Person or Person’s sample. The MEASUREMENT table contains both orders and results of such Measurements as laboratory tests, vital signs, quantitative findings from pathology reports, etc. Measurements are stored as attribute value pairs, with the attribute as the Measurement Concept and the value representing the result. The value can be a Concept (stored in VALUE_AS_CONCEPT), or a numerical value (VALUE_AS_NUMBER) with a Unit (UNIT_CONCEPT_ID). The Procedure for obtaining the sample is housed in the PROCEDURE_OCCURRENCE table, though it is unnecessary to create a PROCEDURE_OCCURRENCE record for each measurement if one does not exist in the source data. Measurements differ from Observations in that they require a standardized test or some other activity to generate a quantitative or qualitative result. If there is no result, it is assumed that the lab test was conducted but the result was not captured.
-
User Guide
-
Measurements are predominately lab tests with a few exceptions, like blood pressure or function tests. Results are given in the form of a value and unit combination. When investigating measurements, look for operator_concept_ids (<, >, etc.).
-
ETL Conventions
-
Only records where the source value maps to a Concept in the measurement domain should be included in this table. Even though each Measurement always has a result, the fields VALUE_AS_NUMBER and VALUE_AS_CONCEPT_ID are not mandatory as often the result is not given in the source data. When the result is not known, the Measurement record represents just the fact that the corresponding Measurement was carried out, which in itself is already useful information for some use cases. For some Measurement Concepts, the result is included in the test. For example, ICD10 CONCEPT_ID 45548980 ‘Abnormal level of unspecified serum enzyme’ indicates a Measurement and the result (abnormal). In those situations, the CONCEPT_RELATIONSHIP table in addition to the ‘Maps to’ record contains a second record with the relationship_id set to ‘Maps to value’. In this example, the ‘Maps to’ relationship directs to 4046263 ‘Enzyme measurement’ as well as a ‘Maps to value’ record to 4135493 ‘Abnormal’.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-measurement_id
-
-
-The unique key given to a Measurement record for a Person. Refer to the ETL for how duplicate Measurements during the same Visit were handled.
-
-
-Each instance of a measurement present in the source data should be assigned this unique key. In some cases, a person can have multiple records of the same measurement within the same visit. It is valid to keep these duplicates and assign them individual, unique, MEASUREMENT_IDs, though it is up to the ETL how they should be handled.
-
-
-bigint
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-The PERSON_ID of the PERSON for whom the measurement is recorded. This may be a system generated code.
-
-
-
-
-bigint
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-measurement_concept_id
-
-
-The MEASUREMENT_CONCEPT_ID field is recommended for primary use in analyses, and must be used for network studies.
-
-
-The CONCEPT_ID that the MEASUREMENT_SOURCE_CONCEPT_ID maps to. Only records whose SOURCE_CONCEPT_IDs map to Standard Concepts with a domain of “Measurement” should go in this table.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Measurement
-
-
-
-
-measurement_date
-
-
-Use this date to determine the date of the measurement.
-
-
-If there are multiple dates in the source data associated with a record such as order_date, draw_date, and result_date, choose the one that is closest to the date the sample was drawn from the patient.
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-measurement_datetime
-
-
-
-
-This is not required, though it is in v6. If a source does not specify datetime the convention is to set the time to midnight (00:00:0000)
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-measurement_time
-
-
-
-
-This is present for backwards compatibility and will be deprecated in an upcoming version.
-
-
-varchar(10)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-measurement_type_concept_id
-
-
-This field can be used to determine the provenance of the Measurement record, as in whether the measurement was from an EHR system, insurance claim, registry, or other sources.
-
-
-Choose the MEASUREMENT_TYPE_CONCEPT_ID that best represents the provenance of the record, for example whether it came from an EHR record or billing claim. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Type Concept
-
-
-
-
-operator_concept_id
-
-
-The meaning of Concept 4172703 for ‘=’ is identical to omission of a OPERATOR_CONCEPT_ID value. Since the use of this field is rare, it’s important when devising analyses to not to forget testing for the content of this field for values different from =.
-
-
-Operators are <, <=, =, >=, > and these concepts belong to the ‘Meas Value Operator’ domain. Accepted Concepts.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-value_as_number
-
-
-This is the numerical value of the Result of the Measurement, if available. Note that measurements such as blood pressures will be split into their component parts i.e. one record for systolic, one record for diastolic.
-
-
-If there is a negative value coming from the source, set the VALUE_AS_NUMBER to NULL, with the exception of the following Measurements (listed as LOINC codes):<br>- 1925-7 Base excess in Arterial blood by calculation - 1927-3 Base excess in Venous blood by calculation - 8632-2 QRS-Axis - 11555-0 Base excess in Blood by calculation - 1926-5 Base excess in Capillary blood by calculation - 28638-5 Base excess in Arterial cord blood by calculation 28639-3 Base excess in Venous cord blood by calculation
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-value_as_concept_id
-
-
-If the raw data gives a categorial result for measurements those values are captured and mapped to standard concepts in the ‘Meas Value’ domain.
-
-
-If the raw data provides categorial results as well as continuous results for measurements, it is a valid ETL choice to preserve both values. The continuous value should go in the VALUE_AS_NUMBER field and the categorical value should be mapped to a standard concept in the ‘Meas Value’ domain and put in the VALUE_AS_CONCEPT_ID field. This is also the destination for the ‘Maps to value’ relationship.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-unit_concept_id
-
-
-There is currently no vocabulary link between measurement Concepts and unit Concepts, the UNIT_CONCEPT_ID is a representation of the units as provided by the source data after ETL clean up.
-
-
-There is no standardization requirement for units associated with MEASUREMENT_CONCEPT_IDs, however, it is the responsibility of the ETL to choose the most plausible unit.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Unit
-
-
-
-
-range_low
-
-
-Ranges have the same unit as the VALUE_AS_NUMBER. These ranges are provided by the source and should remain NULL if not given.
-
-
-If reference ranges for upper and lower limit of normal as provided (typically by a laboratory) these are stored in the RANGE_HIGH and RANGE_LOW fields. This should be set to NULL if not provided.
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-range_high
-
-
-Ranges have the same unit as the VALUE_AS_NUMBER. These ranges are provided by the source and should remain NULL if not given.
-
-
-If reference ranges for upper and lower limit of normal as provided (typically by a laboratory) these are stored in the RANGE_HIGH and RANGE_LOW fields. This should be set to NULL if not provided.
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-provider_id
-
-
-The provider associated with measurement record, e.g. the provider who ordered the test or the provider who recorded the result.
-
-
-The ETL may need to make a choice as to which PROVIDER_ID to put here. Based on what is available this may or may not be different than the provider associated with the overall VISIT_OCCURRENCE record. For example the admitting vs attending physician on an EHR record.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-PROVIDER
-
-
-
-
-
-
-visit_occurrence_id
-
-
-The visit during which the Measurement occurred.
-
-
-Depending on the structure of the source data, this may have to be determined based on dates. If a MEASUREMENT_DATE occurs within the start and end date of a Visit it is a valid ETL choice to choose the VISIT_OCCURRENCE_ID from the visit that subsumes it, even if not explicitly stated in the data. While not required, an attempt should be made to locate the VISIT_OCCURRENCE_ID of the measurement record. If a measurement is related to a visit explicitly in the source data, it is possible that the result date of the Measurement falls outside of the bounds of the Visit dates.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_OCCURRENCE
-
-
-
-
-
-
-visit_detail_id
-
-
-The VISIT_DETAIL record during which the Measurement occurred. For example, if the Person was in the ICU at the time the VISIT_OCCURRENCE record would reflect the overall hospital stay and the VISIT_DETAIL record would reflect the ICU stay during the hospital visit.
-
-
-Same rules apply as for the VISIT_OCCURRENCE_ID.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_DETAIL
-
-
-
-
-
-
-measurement_source_value
-
-
-This field houses the verbatim value from the source data representing the Measurement that occurred. For example, this could be an ICD10 or Read code.
-
-
-This code is mapped to a Standard Measurement Concept in the Standardized Vocabularies and the original code is stored here for reference.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-measurement_source_concept_id
-
-
-This is the concept representing the MEASUREMENT_SOURCE_VALUE and may not necessarily be standard. This field is discouraged from use in analysis because it is not required to contain Standard Concepts that are used across the OHDSI community, and should only be used when Standard Concepts do not adequately represent the source detail for the Measurement necessary for a given analytic use case. Consider using MEASUREMENT_CONCEPT_ID instead to enable standardized analytics that can be consistent across the network.
-
-
-If the MEASUREMENT_SOURCE_VALUE is coded in the source data using an OMOP supported vocabulary put the concept id representing the source value here. If not available, set to 0.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-unit_source_value
-
-
-This field houses the verbatim value from the source data representing the unit of the Measurement that occurred.
-
-
-This code is mapped to a Standard Condition Concept in the Standardized Vocabularies and the original code is stored here for reference.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-value_source_value
-
-
-This field houses the verbatim result value of the Measurement from the source data .
-
-
-If both a continuous and categorical result are given in the source data such that both VALUE_AS_NUMBER and VALUE_AS_CONCEPT_ID are both included, store the verbatim value that was mapped to VALUE_AS_CONCEPT_ID here.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
OBSERVATION
-
Table Description
-
The OBSERVATION table captures clinical facts about a Person obtained in the context of examination, questioning or a procedure. Any data that cannot be represented by any other domains, such as social and lifestyle facts, medical history, family history, etc. are recorded here. New to CDM v6.0 An Observation can now be linked to other records in the CDM instance using the fields OBSERVATION_EVENT_ID and OBS_EVENT_FIELD_CONCEPT_ID. To link another record to an Observation, the primary key goes in OBSERVATION_EVENT_ID (CONDITION_OCCURRENCE_ID, DRUG_EXPOSURE_ID, etc.) and the Concept representing the field where the OBSERVATION_EVENT_ID was taken from go in the OBS_EVENT_FIELD_CONCEPT_ID. For example, a CONDITION_OCCURRENCE of Asthma might be linked to an Observation of a family history of Asthma. In this case the CONDITION_OCCURRENCE_ID of the Asthma record would go in OBSERVATION_EVENT_ID of the family history record and the CONCEPT_ID 1147127 would go in OBS_EVENT_FIELD_CONCEPT_ID to denote that the OBSERVATION_EVENT_ID represents a CONDITION_OCCURRENCE_ID.
-
User Guide
-
Observations differ from Measurements in that they do not require a standardized test or some other activity to generate clinical fact. Typical observations are medical history, family history, the stated need for certain treatment, social circumstances, lifestyle choices, healthcare utilization patterns, etc. If the generation clinical facts requires a standardized testing such as lab testing or imaging and leads to a standardized result, the data item is recorded in the MEASUREMENT table. If the clinical fact observed determines a sign, symptom, diagnosis of a disease or other medical condition, it is recorded in the CONDITION_OCCURRENCE table. Valid Observation Concepts are not enforced to be from any domain though they still should be Standard Concepts.
-
ETL Conventions
-
Records whose Source Values map to any domain besides Condition, Procedure, Drug, Measurement or Device should be stored in the Observation table. Observations can be stored as attribute value pairs, with the attribute as the Observation Concept and the value representing the clinical fact. This fact can be a Concept (stored in VALUE_AS_CONCEPT), a numerical value (VALUE_AS_NUMBER), a verbatim string (VALUE_AS_STRING), or a datetime (VALUE_AS_DATETIME). Even though Observations do not have an explicit result, the clinical fact can be stated separately from the type of Observation in the VALUE_AS_* fields. It is recommended for Observations that are suggestive statements of positive assertion should have a value of ‘Yes’ (concept_id=4188539), recorded, even though the null value is the equivalent.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-observation_id
-
-
-The unique key given to an Observation record for a Person. Refer to the ETL for how duplicate Observations during the same Visit were handled.
-
-
-Each instance of an observation present in the source data should be assigned this unique key.
-
-
-bigint
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-The PERSON_ID of the Person for whom the Observation is recorded. This may be a system generated code.
-
-
-
-
-bigint
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-observation_concept_id
-
-
-The OBSERVATION_CONCEPT_ID field is recommended for primary use in analyses, and must be used for network studies.
-
-
-The CONCEPT_ID that the OBSERVATION_SOURCE_CONCEPT_ID maps to. There is no specified domain that the Concepts in this table must adhere to. The only rule is that records with Concepts in the Condition, Procedure, Drug, Measurement, or Device domains MUST go to the corresponding table.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-observation_date
-
-
-The date of the Observation. Depending on what the Observation represents this could be the date of a lab test, the date of a survey, or the date a patient’s family history was taken.
-
-
-For some observations the ETL may need to make a choice as to which date to choose.
-
-
-date
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-observation_datetime
-
-
-
-
-If no time is given set to midnight (00:00:00).
-
-
-datetime
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-observation_type_concept_id
-
-
-This field can be used to determine the provenance of the Observation record, as in whether the measurement was from an EHR system, insurance claim, registry, or other sources.
-
-
-Choose the OBSERVATION_TYPE_CONCEPT_ID that best represents the provenance of the record, for example whether it came from an EHR record or billing claim. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Type Concept
-
-
-
-
-value_as_number
-
-
-This is the numerical value of the Result of the Observation, if applicable and available. It is not expected that all Observations will have numeric results, rather, this field is here to house values should they exist.
-
-
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-value_as_string
-
-
-This is the categorical value of the Result of the Observation, if applicable and available.
-
-
-
-
-varchar(60)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-value_as_concept_id
-
-
-It is possible that some records destined for the Observation table have two clinical ideas represented in one source code. This is common with ICD10 codes that describe a family history of some Condition, for example. In OMOP the Vocabulary breaks these two clinical ideas into two codes; one becomes the OBSERVATION_CONCEPT_ID and the other becomes the VALUE_AS_CONCEPT_ID. It is important when using the Observation table to keep this possibility in mind and to examine the VALUE_AS_CONCEPT_ID field for relevant information.
-
-
-Note that the value of VALUE_AS_CONCEPT_ID may be provided through mapping from a source Concept which contains the content of the Observation. In those situations, the CONCEPT_RELATIONSHIP table in addition to the ‘Maps to’ record contains a second record with the relationship_id set to ‘Maps to value’. For example, ICD10 Z82.4 ‘Family history of ischaemic heart disease and other diseases of the circulatory system’ has a ‘Maps to’ relationship to 4167217 ‘Family history of clinical finding’ as well as a ‘Maps to value’ record to 134057 ‘Disorder of cardiovascular system’.
-
-
-Integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-qualifier_concept_id
-
-
-This field contains all attributes specifying the clinical fact further, such as as degrees, severities, drug-drug interaction alerts etc.
-
-
-Use your best judgement as to what Concepts to use here and if they are necessary to accurately represent the clinical record. There is no restriction on the domain of these Concepts, they just need to be Standard.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-unit_concept_id
-
-
-There is currently no vocabulary link between observation Concepts and unit Concepts, the UNIT_CONCEPT_ID is a representation of the units as provided by the source data after ETL clean up.
-
-
-There is no standardization requirement for units associated with OBSERVATION_CONCEPT_IDs, however, it is the responsibility of the ETL to choose the most plausible unit.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Unit
-
-
-
-
-provider_id
-
-
-The provider associated with the observation record, e.g. the provider who ordered the test or the provider who recorded the result.
-
-
-The ETL may need to make a choice as to which PROVIDER_ID to put here. Based on what is available this may or may not be different than the provider associated with the overall VISIT_OCCURRENCE record. For example the admitting vs attending physician on an EHR record.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-PROVIDER
-
-
-
-
-
-
-visit_occurrence_id
-
-
-The visit during which the Observation occurred.
-
-
-Depending on the structure of the source data, this may have to be determined based on dates. If an OBSERVATION_DATE occurs within the start and end date of a Visit it is a valid ETL choice to choose the VISIT_OCCURRENCE_ID from the visit that subsumes it, even if not explicitly stated in the data. While not required, an attempt should be made to locate the VISIT_OCCURRENCE_ID of the observation record. If an observation is related to a visit explicitly in the source data, it is possible that the result date of the Observation falls outside of the bounds of the Visit dates.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_OCCURRENCE
-
-
-
-
-
-
-visit_detail_id
-
-
-The VISIT_DETAIL record during which the Observation occurred. For example, if the Person was in the ICU at the time the VISIT_OCCURRENCE record would reflect the overall hospital stay and the VISIT_DETAIL record would reflect the ICU stay during the hospital visit.
-
-
-Same rules apply as for the VISIT_OCCURRENCE_ID.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_DETAIL
-
-
-
-
-
-
-observation_source_value
-
-
-This field houses the verbatim value from the source data representing the Observation that occurred. For example, this could be an ICD10 or Read code.
-
-
-This code is mapped to a Standard Concept in the Standardized Vocabularies and the original code is stored here for reference.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-observation_source_concept_id
-
-
-This is the concept representing the OBSERVATION_SOURCE_VALUE and may not necessarily be standard. This field is discouraged from use in analysis because it is not required to contain Standard Concepts that are used across the OHDSI community, and should only be used when Standard Concepts do not adequately represent the source detail for the Observation necessary for a given analytic use case. Consider using OBSERVATION_CONCEPT_ID instead to enable standardized analytics that can be consistent across the network.
-
-
-If the OBSERVATION_SOURCE_VALUE is coded in the source data using an OMOP supported vocabulary put the concept id representing the source value here. If not available, set to 0.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-unit_source_value
-
-
-This field houses the verbatim value from the source data representing the unit of the Observation that occurred.
-
-
-This code is mapped to a Standard Condition Concept in the Standardized Vocabularies and the original code is stored here for reference.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-qualifier_source_value
-
-
-This field houses the verbatim value from the source data representing the qualifier of the Observation that occurred.
-
-
-This code is mapped to a Standard Condition Concept in the Standardized Vocabularies and the original code is stored here for reference.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-observation_event_id
-
-
-If the Observation record is related to another record in the database, this field is the primary key of the linked record.
-
-If the Observation record is related to another record in the database, this field is the CONCEPT_ID that identifies which table the primary key of the linked record came from.
-
-
-Put the CONCEPT_ID that identifies which table and field the OBSERVATION_EVENT_ID came from.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-value_as_datetime
-
-
-It is possible that some Observation records might store a result as a date value.
-
-
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
NOTE
-
Table Description
-
The NOTE table captures unstructured information that was recorded by a provider about a patient in free text (in ASCII, or preferably in UTF8 format) notes on a given date. The type of note_text is CLOB or varchar(MAX) depending on RDBMS.
-
ETL Conventions
-
HL7/LOINC CDO is a standard for consistent naming of documents to support a range of use cases: retrieval, organization, display, and exchange. It guides the creation of LOINC codes for clinical notes. CDO annotates each document with 5 dimensions:
-
-
Kind of Document: Characterizes the general structure of the document at a macro level (e.g. Anesthesia Consent)
-
Type of Service: Characterizes the kind of service or activity (e.g. evaluations, consultations, and summaries). The notion of time sequence, e.g., at the beginning (admission) at the end (discharge) is subsumed in this axis. Example: Discharge Teaching.
-
Setting: Setting is an extension of CMS’s definitions (e.g. Inpatient, Outpatient)
-
Subject Matter Domain (SMD): Characterizes the subject matter domain of a note (e.g. Anesthesiology)
-
Role: Characterizes the training or professional level of the author of the document, but does not break down to specialty or subspecialty (e.g. Physician) Each combination of these 5 dimensions rolls up to a unique LOINC code.
-
-
According to CDO requirements, only 2 of the 5 dimensions are required to properly annotate a document; Kind of Document and any one of the other 4 dimensions. However, not all the permutations of the CDO dimensions will necessarily yield an existing LOINC code. Each of these dimensions are contained in the OMOP Vocabulary under the domain of ‘Meas Value’ with each dimension represented as a Concept Class.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-note_id
-
-
-A unique identifier for each note.
-
-
-
-
-integer
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-
-
-
-
-bigint
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-note_event_id
-
-
-
-
-
-
-bigint
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-note_event_field_concept_id
-
-
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-note_date
-
-
-The date the note was recorded.
-
-
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-note_datetime
-
-
-
-
-If time is not given set the time to midnight.
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-note_type_concept_id
-
-
-The provenance of the note. Most likely this will be EHR.
-
-
-Put the source system of the note, as in EHR record. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Type Concept
-
-
-
-
-note_class_concept_id
-
-
-A Standard Concept Id representing the HL7 LOINC Document Type Vocabulary classification of the note.
-
-
-Map the note classification to a Standard Concept. For more information see the ETL Conventions in the description of the NOTE table. AcceptedConcepts. This Concept can alternatively be represented by concepts with the relationship ‘Kind of (LOINC)’ to 706391 (Note).
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-note_title
-
-
-The title of the note.
-
-
-
-
-varchar(250)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-note_text
-
-
-The content of the note.
-
-
-
-
-varchar(MAX)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-encoding_concept_id
-
-
-This is the Concept representing the character encoding type.
-
-
-Put the Concept Id that represents the encoding character type here. Currently the only option is UTF-8 (32678). It the note is encoded in any other type, like ASCII then put 0.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-language_concept_id
-
-
-The language of the note.
-
-
-Use Concepts that are descendants of the concept 4182347 (World Languages).
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-provider_id
-
-
-The Provider who wrote the note.
-
-
-The ETL may need to make a determination on which provider to put here.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-PROVIDER
-
-
-
-
-
-
-visit_occurrence_id
-
-
-The Visit during which the note was written.
-
-
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_OCCURRENCE
-
-
-
-
-
-
-visit_detail_id
-
-
-The Visit Detail during which the note was written.
-
-
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_DETAIL
-
-
-
-
-
-
-note_source_value
-
-
-
-
-The source value mapped to the NOTE_CLASS_CONCEPT_ID.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
NOTE_NLP
-
Table Description
-
The NOTE_NLP table encodes all output of NLP on clinical notes. Each row represents a single extracted term from a note.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-note_nlp_id
-
-
-A unique identifier for the NLP record.
-
-
-
-
-bigint
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-note_id
-
-
-This is the NOTE_ID for the NOTE record the NLP record is associated to.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-section_concept_id
-
-
-
-
-The SECTION_CONCEPT_ID should be used to represent the note section contained in the NOTE_NLP record. These concepts can be found as parts of document panels and are based on the type of note written, i.e. a discharge summary. These panels can be found as concepts with the relationship ‘Subsumes’ to CONCEPT_ID 45875957.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-snippet
-
-
-A small window of text surrounding the term
-
-
-
-
-varchar(250)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-offset
-
-
-Character offset of the extracted term in the input note
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-lexical_variant
-
-
-Raw text extracted from the NLP tool.
-
-
-
-
-varchar(250)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-note_nlp_concept_id
-
-
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-note_nlp_source_concept_id
-
-
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-nlp_system
-
-
-
-
-Name and version of the NLP system that extracted the term. Useful for data provenance.
-
-
-varchar(250)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-nlp_date
-
-
-The date of the note processing.
-
-
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-nlp_datetime
-
-
-The date and time of the note processing.
-
-
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-term_exists
-
-
-
-
-Term_exists is defined as a flag that indicates if the patient actually has or had the condition. Any of the following modifiers would make Term_exists false: Negation = true Subject = [anything other than the patient] Conditional = true/li> Rule_out = true Uncertain = very low certainty or any lower certainties A complete lack of modifiers would make Term_exists true.
-
-
-varchar(1)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-term_temporal
-
-
-
-
-Term_temporal is to indicate if a condition is present or just in the past. The following would be past:<br><br> - History = true - Concept_date = anything before the time of the report
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-term_modifiers
-
-
-
-
-For the modifiers that are there, they would have to have these values:<br><br> - Negation = false - Subject = patient - Conditional = false - Rule_out = false - Uncertain = true or high or moderate or even low (could argue about low). Term_modifiers will concatenate all modifiers for different types of entities (conditions, drugs, labs etc) into one string. Lab values will be saved as one of the modifiers.
-
-
-varchar(2000)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
SPECIMEN
-
Table Description
-
The specimen domain contains the records identifying biological samples from a person.
-
ETL Conventions
-
Anatomic site is coded at the most specific level of granularity possible, such that higher level classifications can be derived using the Standardized Vocabularies.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-specimen_id
-
-
-Unique identifier for each specimen.
-
-
-
-
-bigint
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-The person from whom the specimen is collected.
-
-
-
-
-bigint
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-specimen_concept_id
-
-
-
-
-The standard CONCEPT_ID that the SPECIMEN_SOURCE_VALUE maps to in the specimen domain. Accepted Concepts
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-specimen_type_concept_id
-
-
-
-
-Put the source of the specimen record, as in an EHR system. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Type Concept
-
-
-
-
-specimen_date
-
-
-The date the specimen was collected.
-
-
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-specimen_datetime
-
-
-
-
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-quantity
-
-
-The amount of specimen collected from the person.
-
-
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-unit_concept_id
-
-
-The unit for the quantity of the specimen.
-
-
-Map the UNIT_SOURCE_VALUE to a Standard Concept in the Unit domain. Accepted Concepts
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-anatomic_site_concept_id
-
-
-This is the site on the body where the specimen is from.
-
-
-Map the ANATOMIC_SITE_SOURCE_VALUE to a Standard Concept in the Spec Anatomic Site domain. This should be coded at the lowest level of granularity Accepted Concepts
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-disease_status_concept_id
-
-
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-specimen_source_id
-
-
-This is the identifier for the specimen from the source system.
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-specimen_source_value
-
-
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-unit_source_value
-
-
-
-
-This unit for the quantity of the specimen, as represented in the source.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-anatomic_site_source_value
-
-
-
-
-This is the site on the body where the specimen was taken from, as represented in the source.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-disease_status_source_value
-
-
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
FACT_RELATIONSHIP
-
Table Description
-
The FACT_RELATIONSHIP table contains records about the relationships between facts stored as records in any table of the CDM. Relationships can be defined between facts from the same domain, or different domains. Examples of Fact Relationships include: Person relationships (parent-child), care site relationships (hierarchical organizational structure of facilities within a health system), indication relationship (between drug exposures and associated conditions), usage relationships (of devices during the course of an associated procedure), or facts derived from one another (measurements derived from an associated specimen).
-
ETL Conventions
-
All relationships are directional, and each relationship is represented twice symmetrically within the FACT_RELATIONSHIP table. For example, two persons if person_id = 1 is the mother of person_id = 2 two records are in the FACT_RELATIONSHIP table (all strings in fact concept_id records in the Concept table: - Person, 1, Person, 2, parent of - Person, 2, Person, 1, child of
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-domain_concept_id_1
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-fact_id_1
-
-
-
-
-
-
-bigint
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-domain_concept_id_2
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-fact_id_2
-
-
-
-
-
-
-bigint
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-relationship_concept_id
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-
-
-
SURVEY_CONDUCT
-
Table Description
-
The SURVEY_CONDUCT table is used to store an instance of a completed survey or questionnaire.
-
User Guide
-
This table captures details of the individual questionnaire such as who completed it, when it was completed and to which patient treatment or visit it relates to (if any).
-
ETL Conventions
-
Each SURVEY has a SURVEY_CONCEPT_ID, a concept in the CONCEPT table identifying the questionnaire e.g. EQ5D, VR12, SF12. Each questionnaire should exist in the CONCEPT table. Each SURVEY can be optionally related to a specific Visit in order to link it both to the Visit during which it was completed and any subsequent Visit where treatment was assigned based on the patient’s responses.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-survey_conduct_id
-
-
-Unique identifier for each completed survey.
-
-
-For each instance of a survey completion create a unique identifier.
-
-
-bigint
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-
-
-
-
-bigint
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-survey_concept_id
-
-
-This is the Concept that represents the survey that was completed.
-
-
-Put the CONCEPT_ID that identifies the survey that the Person completed. There is no specified domain for this table but the concept class ‘staging/scales’ contains many common surveys. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-survey_start_date
-
-
-Date on which the survey was started.
-
-
-
-
-date
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-survey_start_datetime
-
-
-
-
-If no time given, set to midnight.
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-survey_end_date
-
-
-Date on which the survey was completed.
-
-
-
-
-date
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-survey_end_datetime
-
-
-
-
-If no time given, set to midnight.
-
-
-datetime
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-provider_id
-
-
-This is the Provider associated with the survey completion.
-
-
-The ETL may need to make a choice as to which Provider to put here. This could either be the provider that ordered the survey or the provider who observed the completion of the survey.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-PROVIDER
-
-
-
-
-
-
-assisted_concept_id
-
-
-This is a Concept that represents whether the survey was completed with assistance or independently.
-
-
-There is no specific domain or class for this field, just choose the one that best represents the value given in the source.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-respondent_type_concept_id
-
-
-This is a Concept that represents who actually recorded the answers to the survey. For example, this could be the patient or a research associate.
-
-
-There is no specific domain or class for this field, just choose the one that best represents the value given in the source.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-timing_concept_id
-
-
-This is a Concept that represents the timing of the survey. For example this could be the 3-month follow-up appointment.
-
-
-There is no specific domain or class for this field, just choose the one that best represents the value given in the source.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-collection_method_concept_id
-
-
-This Concept represents how the responses were collected.
-
-
-Use the concepts that have the relationship ‘Has Answer’ with the CONCEPT_ID 42529316.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-assisted_source_value
-
-
-Source value representing whether patient required assistance to complete the survey. Example: ‘Completed without assistance’, ‘Completed with assistance’.
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-respondent_type_source_value
-
-
-Source code representing role of person who completed the survey.
-
-
-
-
-varchar(100)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-timing_source_value
-
-
-Text string representing the timing of the survey. Example: Baseline, 6-month follow-up.
-
-
-
-
-varchar(100)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-collection_method_source_value
-
-
-The collection method as it appears in the source data.
-
-
-
-
-varchar(100)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-survey_source_value
-
-
-The survey name/title as it appears in the source data.
-
-
-
-
-varchar(100)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-survey_source_concept_id
-
-
-
-
-If unavailable, set to 0.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-survey_source_identifier
-
-
-Unique identifier for each completed survey in source system.
-
-
-
-
-varchar(100)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-validated_survey_concept_id
-
-
-
-
-If unavailable, set to 0.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-validated_survey_source_value
-
-
-Source value representing the validation status of the survey.
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-survey_version_number
-
-
-Version number of the questionnaire or survey used.
-
-
-
-
-varchar(20)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-visit_occurrence_id
-
-
-The Visit during which the Survey occurred.
-
-
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_OCCURRENCE
-
-
-
-
-
-
-response_visit_occurrence_id
-
-
-The Visit during which any treatment related to the Survey was carried out.
-
-
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-VISIT_OCCURRENCE
-
-
-
-
-
-
-
-
-
-
Health System Data Tables
-
-
LOCATION
-
Table Description
-
The LOCATION table represents a generic way to capture physical location or address information of Persons and Care Sites. New to CDM v6.0 The LOCATION table now includes latitude and longitude.
-
ETL Conventions
-
Each address or Location is unique and is present only once in the table. Locations do not contain names, such as the name of a hospital. In order to construct a full address that can be used in the postal service, the address information from the Location needs to be combined with information from the Care Site. For standardized geospatial visualization and analysis, addresses need to be, at the minimum be geocoded into latitude and longitude.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-location_id
-
-
-The unique key given to a unique Location.
-
-
-Each instance of a Location in the source data should be assigned this unique key.
-
-
-bigint
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-address_1
-
-
-This is the first line of the address.
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-address_2
-
-
-This is the second line of the address
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-city
-
-
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-state
-
-
-
-
-
-
-varchar(2)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-zip
-
-
-
-
-Zip codes are handled as strings of up to 9 characters length. For US addresses, these represent either a 3-digit abbreviated Zip code as provided by many sources for patient protection reasons, the full 5-digit Zip or the 9-digit (ZIP + 4) codes. Unless for specific reasons analytical methods should expect and utilize only the first 3 digits. For international addresses, different rules apply.
-
-
-varchar(9)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-county
-
-
-
-
-
-
-varchar(20)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-location_source_value
-
-
-
-
-Put the verbatim value for the location here, as it shows up in the source.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-latitude
-
-
-The geocoded latitude.
-
-
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-longitude
-
-
-The geocoded longitude.
-
-
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
LOCATION_HISTORY
-
Table Description
-
The LOCATION HISTORY table stores relationships between Persons or Care Sites and geographic locations over time. This table is new to CDM v6.0
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-location_id
-
-
-This is the LOCATION_ID for the LOCATION_HISTORY record.
-
-
-
-
-bigint
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-LOCATION
-
-
-
-
-
-
-relationship_type_concept_id
-
-
-This is the relationship between the location and the entity (PERSON, PROVIDER, or CARE_SITE)
-
-
-Concepts in this field must be in the Location class. Accepted Concepts. If the DOMAIN_ID is CARE_SITE this should be 0 and when the domain is PROVIDER the value is Office.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-domain_id
-
-
-
-
-The domain of the entity that is related to the location. Either PERSON, PROVIDER, or CARE_SITE.
-
-
-varchar(50)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-entity_id
-
-
-
-
-The unique identifier for the entity. References either person_id, provider_id, or care_site_id, depending on domain_id.
-
-
-bigint
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-start_date
-
-
-The date the relationship started
-
-
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-end_date
-
-
-The date the relationship ended
-
-
-
-
-date
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
CARE_SITE
-
Table Description
-
The CARE_SITE table contains a list of uniquely identified institutional (physical or organizational) units where healthcare delivery is practiced (offices, wards, hospitals, clinics, etc.).
-
ETL Conventions
-
Care site is a unique combination of location_id and place_of_service_source_value. Care site does not take into account the provider (human) information such a specialty. Many source data do not make a distinction between individual and institutional providers. The CARE_SITE table contains the institutional providers. If the source, instead of uniquely identifying individual Care Sites, only provides limited information such as Place of Service, generic or “pooled” Care Site records are listed in the CARE_SITE table. There can be hierarchical and business relationships between Care Sites. For example, wards can belong to clinics or departments, which can in turn belong to hospitals, which in turn can belong to hospital systems, which in turn can belong to HMOs.The relationships between Care Sites are defined in the FACT_RELATIONSHIP table.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-care_site_id
-
-
-
-
-Assign an id to each unique combination of location_id and place_of_service_source_value.
-
-
-bigint
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-care_site_name
-
-
-The name of the care_site as it appears in the source data
-
-
-
-
-varchar(255)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-place_of_service_concept_id
-
-
-This is a high-level way of characterizing a Care Site. Typically, however, Care Sites can provide care in multiple settings (inpatient, outpatient, etc.) and this granularity should be reflected in the visit.
-
-
-Choose the concept in the visit domain that best represents the setting in which healthcare is provided in the Care Site. If most visits in a Care Site are Inpatient, then the place_of_service_concept_id should represent Inpatient. If information is present about a unique Care Site (e.g. Pharmacy) then a Care Site record should be created. If this information is not available then set to 0. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-location_id
-
-
-The location_id from the LOCATION table representing the physical location of the care_site.
-
-
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-LOCATION
-
-
-
-
-
-
-care_site_source_value
-
-
-The identifier of the care_site as it appears in the source data. This could be an identifier separate from the name of the care_site.
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-place_of_service_source_value
-
-
-
-
-Put the place of service of the care_site as it appears in the source data.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
PROVIDER
-
Table Description
-
The PROVIDER table contains a list of uniquely identified healthcare providers. These are individuals providing hands-on healthcare to patients, such as physicians, nurses, midwives, physical therapists etc.
-
User Guide
-
Many sources do not make a distinction between individual and institutional providers. The PROVIDER table contains the individual providers. If the source, instead of uniquely identifying individual providers, only provides limited information such as specialty, generic or ‘pooled’ Provider records are listed in the PROVIDER table.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-provider_id
-
-
-It is assumed that every provider with a different unique identifier is in fact a different person and should be treated independently.
-
-
-This identifier can be the original id from the source data provided it is an integer, otherwise it can be an autogenerated number.
-
-
-bigint
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-provider_name
-
-
-
-
-This field is not necessary as it is not necessary to have the actual identity of the Provider. Rather, the idea is to uniquely and anonymously identify providers of care across the database.
-
-
-varchar(255)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-npi
-
-
-This is the National Provider Number issued to health care providers in the US by the Centers for Medicare and Medicaid Services (CMS).
-
-
-
-
-varchar(20)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-dea
-
-
-This is the identifier issued by the DEA, a US federal agency, that allows a provider to write prescriptions for controlled substances.
-
-
-
-
-varchar(20)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-specialty_concept_id
-
-
-This field either represents the most common specialty that occurs in the data or the most specific concept that represents all specialties listed, should the provider have more than one. This includes physician specialties such as internal medicine, emergency medicine, etc. and allied health professionals such as nurses, midwives, and pharmacists.
-
-
-If a Provider has more than one Specialty, there are two options: 1. Choose a concept_id which is a common ancestor to the multiple specialties, or, 2. Choose the specialty that occurs most often for the provider. Concepts in this field should be Standard with a domain of Provider. If not available, set to 0. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-care_site_id
-
-
-This is the CARE_SITE_ID for the location that the provider primarily practices in.
-
-
-If a Provider has more than one Care Site, the main or most often exerted CARE_SITE_ID should be recorded.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CARE_SITE
-
-
-
-
-
-
-year_of_birth
-
-
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-gender_concept_id
-
-
-This field represents the recorded gender of the provider in the source data.
-
-
-If given, put a concept from the gender domain representing the recorded gender of the provider. If not available, set to 0. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Gender
-
-
-
-
-provider_source_value
-
-
-Use this field to link back to providers in the source data. This is typically used for error checking of ETL logic.
-
-
-Some use cases require the ability to link back to providers in the source data. This field allows for the storing of the provider identifier as it appears in the source.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-specialty_source_value
-
-
-This is the kind of provider or specialty as it appears in the source data. This includes physician specialties such as internal medicine, emergency medicine, etc. and allied health professionals such as nurses, midwives, and pharmacists.
-
-
-Put the kind of provider as it appears in the source data. This field is up to the discretion of the ETL-er as to whether this should be the coded value from the source or the text description of the lookup value.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-specialty_source_concept_id
-
-
-This is often zero as many sites use proprietary codes to store physician speciality.
-
-
-If the source data codes provider specialty in an OMOP supported vocabulary store the concept_id here. If not available, set to 0.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-gender_source_value
-
-
-This is provider’s gender as it appears in the source data.
-
-
-Put the provider’s gender as it appears in the source data. This field is up to the discretion of the ETL-er as to whether this should be the coded value from the source or the text description of the lookup value.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-gender_source_concept_id
-
-
-This is often zero as many sites use proprietary codes to store provider gender.
-
-
-If the source data codes provider gender in an OMOP supported vocabulary store the concept_id here. If not available, set to 0.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-
-
-
-
Health Economics Data Tables
-
-
PAYER_PLAN_PERIOD
-
Table Description
-
The PAYER_PLAN_PERIOD table captures details of the period of time that a Person is continuously enrolled under a specific health Plan benefit structure from a given Payer. Each Person receiving healthcare is typically covered by a health benefit plan, which pays for (fully or partially), or directly provides, the care. These benefit plans are provided by payers, such as health insurances or state or government agencies. In each plan the details of the health benefits are defined for the Person or her family, and the health benefit Plan might change over time typically with increasing utilization (reaching certain cost thresholds such as deductibles), plan availability and purchasing choices of the Person. The unique combinations of Payer organizations, health benefit Plans and time periods in which they are valid for a Person are recorded in this table.
-
User Guide
-
A Person can have multiple, overlapping, Payer_Plan_Periods in this table. For example, medical and drug coverage in the US can be represented by two Payer_Plan_Periods. The details of the benefit structure of the Plan is rarely known, the idea is just to identify that the Plans are different.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-payer_plan_period_id
-
-
-A unique identifier for each unique combination of a Person, Payer, Plan, and Period of time.
-
-
-
-
-bigint
-
-
-Yes
-
-
-Yes
-
-
-
-
-
-
-
-
-
-
-person_id
-
-
-The Person covered by the Plan.
-
-
-A single Person can have multiple, overlapping, PAYER_PLAN_PERIOD records
-
-
-bigint
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-contract_person_id
-
-
-The Person who is the primary subscriber/contract owner for Plan.
-
-
-This may or may not be the same as the PERSON_ID. For example, if a mother has her son on her plan and the PAYER_PLAN_PERIOD record is the for son, the sons’s PERSON_ID would go in PAYER_PLAN_PERIOD.PERSON_ID and the mother’s PERSON_ID would go in PAYER_PLAN_PERIOD.CONTRACT_PERSON_ID.
-
-
-bigint
-
-
-No
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-payer_plan_period_start_date
-
-
-Start date of Plan coverage.
-
-
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-payer_plan_period_end_date
-
-
-End date of Plan coverage.
-
-
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-payer_concept_id
-
-
-This field represents the organization who reimburses the provider which administers care to the Person.
-
-
-Map the Payer directly to a standard CONCEPT_ID. If one does not exists please contact the vocabulary team. There is no global controlled vocabulary available for this information. The point is to stratify on this information and identify if Persons have the same payer, though the name of the Payer is not necessary. If not available, set to 0. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-payer_source_value
-
-
-This is the Payer as it appears in the source data.
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-payer_source_concept_id
-
-
-
-
-If the source data codes the Payer in an OMOP supported vocabulary store the concept_id here. If not available, set to 0.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-plan_concept_id
-
-
-This field represents the specific health benefit Plan the Person is enrolled in.
-
-
-Map the Plan directly to a standard CONCEPT_ID. If one does not exists please contact the vocabulary team. There is no global controlled vocabulary available for this information. The point is to stratify on this information and identify if Persons have the same health benefit Plan though the name of the Plan is not necessary. If not available, set to 0. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-plan_source_value
-
-
-This is the health benefit Plan of the Person as it appears in the source data.
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-plan_source_concept_id
-
-
-
-
-If the source data codes the Plan in an OMOP supported vocabulary store the concept_id here. If not available, set to 0.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-contract_concept_id
-
-
-This field represents the relationship between the PERSON_ID and CONTRACT_PERSON_ID. It should be read as PERSON_ID is the CONTRACT_CONCEPT_ID of the CONTRACT_PERSON_ID. So if CONTRACT_CONCEPT_ID represents the relationship ‘Stepdaughter’ then the Person for whom PAYER_PLAN_PERIOD record was recorded is the stepdaughter of the CONTRACT_PERSON_ID.
-
-
-If available, use this field to represent the relationship between the PERSON_ID and the CONTRACT_PERSON_ID. If the Person for whom the PAYER_PLAN_PERIOD record was recorded is the stepdaughter of the CONTRACT_PERSON_ID then CONTRACT_CONCEPT_ID would be 4330864. If not available, set to 0. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-contract_source_value
-
-
-This is the relationship of the PERSON_ID to CONTRACT_PERSON_ID as it appears in the source data.
-
-
-
-
-varchar(50)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-contract_source_concept_id
-
-
-
-
-If the source data codes the relationship between the PERSON_ID and CONTRACT_PERSON_ID in an OMOP supported vocabulary store the concept_id here. If not available, set to 0.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-sponsor_concept_id
-
-
-This field represents the sponsor of the Plan who finances the Plan. This includes self-insured, small group health plan and large group health plan.
-
-
-Map the sponsor directly to a standard CONCEPT_ID. If one does not exists please contact the vocabulary team. There is no global controlled vocabulary available for this information. The point is to stratify on this information and identify if Persons have the same sponsor though the name of the sponsor is not necessary. If not available, set to 0. Accepted Concepts.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-sponsor_source_value
-
-
-The Plan sponsor as it appears in the source data.
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-sponsor_source_concept_id
-
-
-
-
-If the source data codes the sponsor in an OMOP supported vocabulary store the concept_id here.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-family_source_value
-
-
-The common identifier for all people (often a family) that covered by the same policy.
-
-
-Often these are the common digits of the enrollment id of the policy members.
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-stop_reason_concept_id
-
-
-This field represents the reason the Person left the Plan, if known.
-
-
-Map the stop reason directly to a standard CONCEPT_ID. If one does not exists please contact the vocabulary team. There is no global controlled vocabulary available for this information. Accepted Concepts.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-stop_reason_source_value
-
-
-The Plan stop reason as it appears in the source data.
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-stop_reason_source_concept_id
-
-
-
-
-If the source data codes the stop reason in an OMOP supported vocabulary store the concept_id here.
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-
-
-
COST
-
Table Description
-
The COST table captures records containing the cost of any medical event recorded in one of the OMOP clinical event tables such as DRUG_EXPOSURE, PROCEDURE_OCCURRENCE, VISIT_OCCURRENCE, VISIT_DETAIL, DEVICE_OCCURRENCE, OBSERVATION or MEASUREMENT.
-
Each record in the cost table account for the amount of money transacted for the clinical event. So, the COST table may be used to represent both receivables (charges) and payments (paid), each transaction type represented by its COST_CONCEPT_ID. The COST_TYPE_CONCEPT_ID field will use concepts in the Standardized Vocabularies to designate the source (provenance) of the cost data. A reference to the health plan information in the PAYER_PLAN_PERIOD table is stored in the record for information used for the adjudication system to determine the persons benefit for the clinical event.
-
User Guide
-
When dealing with summary costs, the cost of the goods or services the provider provides is often not known directly, but derived from the hospital charges multiplied by an average cost-to-charge ratio.
-
ETL Conventions
-
One cost record is generated for each response by a payer. In a claims databases, the payment and payment terms reported by the payer for the goods or services billed will generate one cost record. If the source data has payment information for more than one payer (i.e. primary insurance and secondary insurance payment for one entity), then a cost record is created for each reporting payer. Therefore, it is possible for one procedure to have multiple cost records for each payer, but typically it contains one or no record per entity. Payer reimbursement cost records will be identified by using the PAYER_PLAN_ID field. Drug costs are composed of ingredient cost (the amount charged by the wholesale distributor or manufacturer), the dispensing fee (the amount charged by the pharmacy and the sales tax).
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-cost_id
-
-
-
-
-
-
-INTEGER
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-cost_event_id
-
-
-
-
-
-
-bigint
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-cost_domain_id
-
-
-
-
-
-
-VARCHAR(20)
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-DOMAIN
-
-
-
-
-
-
-cost_type_concept_id
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-currency_concept_id
-
-
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-total_charge
-
-
-
-
-
-
-FLOAT
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-total_cost
-
-
-
-
-
-
-FLOAT
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-total_paid
-
-
-
-
-
-
-FLOAT
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-paid_by_payer
-
-
-
-
-
-
-FLOAT
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-paid_by_patient
-
-
-
-
-
-
-FLOAT
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-paid_patient_copay
-
-
-
-
-
-
-FLOAT
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-paid_patient_coinsurance
-
-
-
-
-
-
-FLOAT
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-paid_patient_deductible
-
-
-
-
-
-
-FLOAT
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-paid_by_primary
-
-
-
-
-
-
-FLOAT
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-paid_ingredient_cost
-
-
-
-
-
-
-FLOAT
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-paid_dispensing_fee
-
-
-
-
-
-
-FLOAT
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-payer_plan_period_id
-
-
-
-
-
-
-bigint
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-amount_allowed
-
-
-
-
-
-
-FLOAT
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-revenue_code_concept_id
-
-
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-revenue_code_source_value
-
-
-Revenue codes are a method to charge for a class of procedures and conditions in the U.S. hospital system.
-
-
-
-
-VARCHAR(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-drg_concept_id
-
-
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-drg_source_value
-
-
-Diagnosis Related Groups are US codes used to classify hospital cases into one of approximately 500 groups.
-
-
-
-
-VARCHAR(3)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
-
Standardized Derived Elements
-
-
DRUG_ERA
-
Table Description
-
A Drug Era is defined as a span of time when the Person is assumed to be exposed to a particular active ingredient. A Drug Era is not the same as a Drug Exposure: Exposures are individual records corresponding to the source when Drug was delivered to the Person, while successive periods of Drug Exposures are combined under certain rules to produce continuous Drug Eras.
-
ETL Conventions
-
The SQL script for generating DRUG_ERA records can be found here.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-drug_era_id
-
-
-
-
-
-
-bigint
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-
-
-
-
-bigint
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-drug_concept_id
-
-
-The Concept Id representing the specific drug ingredient.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Drug
-
-
-
-
-drug_era_start_date
-
-
-
-
-The Drug Era Start Date is the start date of the first Drug Exposure for a given ingredient, with at least 31 days since the previous exposure.
-
-
-datetime
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-drug_era_end_date
-
-
-
-
-The Drug Era End Date is the end date of the last Drug Exposure. The End Date of each Drug Exposure is either taken from the field drug_exposure_end_date or, as it is typically not available, inferred using the following rules: For pharmacy prescription data, the date when the drug was dispensed plus the number of days of supply are used to extrapolate the End Date for the Drug Exposure. Depending on the country-specific healthcare system, this supply information is either explicitly provided in the day_supply field or inferred from package size or similar information. For Procedure Drugs, usually the drug is administered on a single date (i.e., the administration date). A standard Persistence Window of 30 days (gap, slack) is permitted between two subsequent such extrapolated DRUG_EXPOSURE records to be considered to be merged into a single Drug Era.
-
-
-datetime
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-drug_exposure_count
-
-
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-gap_days
-
-
-
-
-The Gap Days determine how many total drug-free days are observed between all Drug Exposure events that contribute to a DRUG_ERA record. It is assumed that the drugs are “not stockpiled” by the patient, i.e. that if a new drug prescription or refill is observed (a new DRUG_EXPOSURE record is written), the remaining supply from the previous events is abandoned. The difference between Persistence Window and Gap Days is that the former is the maximum drug-free time allowed between two subsequent DRUG_EXPOSURE records, while the latter is the sum of actual drug-free days for the given Drug Era under the above assumption of non-stockpiling.
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
DOSE_ERA
-
Table Description
-
A Dose Era is defined as a span of time when the Person is assumed to be exposed to a constant dose of a specific active ingredient.
-
ETL Conventions
-
Dose Eras will be derived from records in the DRUG_EXPOSURE table and the Dose information from the DRUG_STRENGTH table using a standardized algorithm. Dose Form information is not taken into account. So, if the patient changes between different formulations, or different manufacturers with the same formulation, the Dose Era is still spanning the entire time of exposure to the Ingredient.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-dose_era_id
-
-
-
-
-
-
-bigint
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-
-
-
-
-bigint
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-drug_concept_id
-
-
-The Concept Id representing the specific drug ingredient.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Drug
-
-
-
-
-unit_concept_id
-
-
-The Concept Id representing the unit of the specific drug ingredient.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Unit
-
-
-
-
-dose_value
-
-
-The numeric value of the dosage of the drug_ingredient.
-
-
-
-
-float
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-dose_era_start_date
-
-
-The date the Person started on the specific dosage, with at least 31 days since any prior exposure.
-
-
-
-
-datetime
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-dose_era_end_date
-
-
-
-
-The date the Person was no longer exposed to the dosage of the specific drug ingredient. An era is ended if there are 31 days or more between dosage records.
-
-
-datetime
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
CONDITION_ERA
-
Table Description
-
A Condition Era is defined as a span of time when the Person is assumed to have a given condition. Similar to Drug Eras, Condition Eras are chronological periods of Condition Occurrence. Combining individual Condition Occurrences into a single Condition Era serves two purposes:
-
-
It allows aggregation of chronic conditions that require frequent ongoing care, instead of treating each Condition Occurrence as an independent event.
-
It allows aggregation of multiple, closely timed doctor visits for the same Condition to avoid double-counting the Condition Occurrences. For example, consider a Person who visits her Primary Care Physician (PCP) and who is referred to a specialist. At a later time, the Person visits the specialist, who confirms the PCP’s original diagnosis and provides the appropriate treatment to resolve the condition. These two independent doctor visits should be aggregated into one Condition Era.
-
-
ETL Conventions
-
Each Condition Era corresponds to one or many Condition Occurrence records that form a continuous interval. The condition_concept_id field contains Concepts that are identical to those of the CONDITION_OCCURRENCE table records that make up the Condition Era. In contrast to Drug Eras, Condition Eras are not aggregated to contain Conditions of different hierarchical layers. The SQl Script for generating CONDITION_ERA records can be found here The Condition Era Start Date is the start date of the first Condition Occurrence. The Condition Era End Date is the end date of the last Condition Occurrence. Condition Eras are built with a Persistence Window of 30 days, meaning, if no occurrence of the same condition_concept_id happens within 30 days of any one occurrence, it will be considered the condition_era_end_date.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-condition_era_id
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-person_id
-
-
-
-
-
-
-bigint
-
-
-Yes
-
-
-No
-
-
-No
-
-
-PERSON
-
-
-
-
-
-
-condition_concept_id
-
-
-The Concept Id representing the Condition.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Condition
-
-
-
-
-condition_era_start_date
-
-
-The start date for the Condition Era constructed from the individual instances of Condition Occurrences. It is the start date of the very first chronologically recorded instance of the condition with at least 31 days since any prior record of the same Condition.
-
-
-
-
-datetime
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-condition_era_end_date
-
-
-The end date for the Condition Era constructed from the individual instances of Condition Occurrences. It is the end date of the final continuously recorded instance of the Condition.
-
-
-
-
-datetime
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-condition_occurrence_count
-
-
-The number of individual Condition Occurrences used to construct the condition era.
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
-
Metadata Tables
-
-
METADATA
-
Table Description
-
The METADATA table contains metadata information about a dataset that has been transformed to the OMOP Common Data Model.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-metadata_concept_id
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-metadata_type_concept_id
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-name
-
-
-
-
-
-
-varchar(250)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-value_as_string
-
-
-
-
-
-
-varchar(250)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-value_as_concept_id
-
-
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-metadata_date
-
-
-
-
-
-
-date
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-metadata_datetime
-
-
-
-
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
CDM_SOURCE
-
Table Description
-
The CDM_SOURCE table contains detail about the source database and the process used to transform the data into the OMOP Common Data Model.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-cdm_source_name
-
-
-The name of the CDM instance.
-
-
-
-
-varchar(255)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-cdm_source_abbreviation
-
-
-The abbreviation of the CDM instance.
-
-
-
-
-varchar(25)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-cdm_holder
-
-
-The holder of the CDM instance.
-
-
-
-
-varchar(255)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-source_description
-
-
-The description of the CDM instance.
-
-
-
-
-varchar(MAX)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-source_documentation_reference
-
-
-
-
-
-
-varchar(255)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-cdm_etl_reference
-
-
-
-
-Put the link to the CDM version used.
-
-
-varchar(255)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-source_release_date
-
-
-The release date of the source data.
-
-
-
-
-date
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-cdm_release_date
-
-
-The release data of the CDM instance.
-
-
-
-
-date
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-cdm_version
-
-
-
-
-
-
-varchar(10)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-vocabulary_version
-
-
-
-
-
-
-varchar(20)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
-
Vocabulary Tables
-
-
CONCEPT
-
Table Description
-
The Standardized Vocabularies contains records, or Concepts, that uniquely identify each fundamental unit of meaning used to express clinical information in all domain tables of the CDM. Concepts are derived from vocabularies, which represent clinical information across a domain (e.g. conditions, drugs, procedures) through the use of codes and associated descriptions. Some Concepts are designated Standard Concepts, meaning these Concepts can be used as normative expressions of a clinical entity within the OMOP Common Data Model and within standardized analytics. Each Standard Concept belongs to one domain, which defines the location where the Concept would be expected to occur within data tables of the CDM.
-
Concepts can represent broad categories (like ‘Cardiovascular disease’), detailed clinical elements (‘Myocardial infarction of the anterolateral wall’) or modifying characteristics and attributes that define Concepts at various levels of detail (severity of a disease, associated morphology, etc.).
-
Records in the Standardized Vocabularies tables are derived from national or international vocabularies such as SNOMED-CT, RxNorm, and LOINC, or custom Concepts defined to cover various aspects of observational data analysis.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-concept_id
-
-
-A unique identifier for each Concept across all domains.
-
-
-
-
-integer
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-concept_name
-
-
-An unambiguous, meaningful and descriptive name for the Concept.
-
-
-
-
-varchar(255)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-domain_id
-
-
-A foreign key to the DOMAIN table the Concept belongs to.
-
-
-
-
-varchar(20)
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-DOMAIN
-
-
-
-
-
-
-vocabulary_id
-
-
-A foreign key to the VOCABULARY table indicating from which source the Concept has been adapted.
-
-
-
-
-varchar(20)
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-VOCABULARY
-
-
-
-
-
-
-concept_class_id
-
-
-The attribute or concept class of the Concept. Examples are ‘Clinical Drug’, ‘Ingredient’, ‘Clinical Finding’ etc.
-
-
-
-
-varchar(20)
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT_CLASS
-
-
-
-
-
-
-standard_concept
-
-
-This flag determines where a Concept is a Standard Concept, i.e. is used in the data, a Classification Concept, or a non-standard Source Concept. The allowable values are ‘S’ (Standard Concept) and ‘C’ (Classification Concept), otherwise the content is NULL.
-
-
-
-
-varchar(1)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-concept_code
-
-
-The concept code represents the identifier of the Concept in the source vocabulary, such as SNOMED-CT concept IDs, RxNorm RXCUIs etc. Note that concept codes are not unique across vocabularies.
-
-
-
-
-varchar(50)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-valid_start_date
-
-
-The date when the Concept was first recorded. The default value is 1-Jan-1970, meaning, the Concept has no (known) date of inception.
-
-
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-valid_end_date
-
-
-The date when the Concept became invalid because it was deleted or superseded (updated) by a new concept. The default value is 31-Dec-2099, meaning, the Concept is valid until it becomes deprecated.
-
-
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-invalid_reason
-
-
-Reason the Concept was invalidated. Possible values are D (deleted), U (replaced with an update) or NULL when valid_end_date has the default value.
-
-
-
-
-varchar(1)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
VOCABULARY
-
Table Description
-
The VOCABULARY table includes a list of the Vocabularies collected from various sources or created de novo by the OMOP community. This reference table is populated with a single record for each Vocabulary source and includes a descriptive name and other associated attributes for the Vocabulary.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-vocabulary_id
-
-
-A unique identifier for each Vocabulary, such as ICD9CM, SNOMED, Visit.
-
-
-
-
-varchar(20)
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-vocabulary_name
-
-
-The name describing the vocabulary, for example International Classification of Diseases, Ninth Revision, Clinical Modification, Volume 1 and 2 (NCHS) etc.
-
-
-
-
-varchar(255)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-vocabulary_reference
-
-
-External reference to documentation or available download of the about the vocabulary.
-
-
-
-
-varchar(255)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-vocabulary_version
-
-
-Version of the Vocabulary as indicated in the source.
-
-
-
-
-varchar(255)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-vocabulary_concept_id
-
-
-A Concept that represents the Vocabulary the VOCABULARY record belongs to.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-
-
-
DOMAIN
-
Table Description
-
The DOMAIN table includes a list of OMOP-defined Domains the Concepts of the Standardized Vocabularies can belong to. A Domain defines the set of allowable Concepts for the standardized fields in the CDM tables. For example, the “Condition” Domain contains Concepts that describe a condition of a patient, and these Concepts can only be stored in the condition_concept_id field of the CONDITION_OCCURRENCE and CONDITION_ERA tables. This reference table is populated with a single record for each Domain and includes a descriptive name for the Domain.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-domain_id
-
-
-A unique key for each domain.
-
-
-
-
-varchar(20)
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-domain_name
-
-
-The name describing the Domain, e.g. Condition, Procedure, Measurement etc.
-
-
-
-
-varchar(255)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-domain_concept_id
-
-
-A Concept representing the Domain Concept the DOMAIN record belongs to.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-
-
-
CONCEPT_CLASS
-
Table Description
-
The CONCEPT_CLASS table is a reference table, which includes a list of the classifications used to differentiate Concepts within a given Vocabulary. This reference table is populated with a single record for each Concept Class.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-concept_class_id
-
-
-A unique key for each class.
-
-
-
-
-varchar(20)
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-concept_class_name
-
-
-The name describing the Concept Class, e.g. Clinical Finding, Ingredient, etc.
-
-
-
-
-varchar(255)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-concept_class_concept_id
-
-
-A Concept that represents the Concept Class.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-
-
-
CONCEPT_RELATIONSHIP
-
Table Description
-
The CONCEPT_RELATIONSHIP table contains records that define direct relationships between any two Concepts and the nature or type of the relationship. Each type of a relationship is defined in the RELATIONSHIP table.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-concept_id_1
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-concept_id_2
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-relationship_id
-
-
-The relationship between CONCEPT_ID_1 and CONCEPT_ID_2. Please see the Vocabulary Conventions. for more information.
-
-
-
-
-varchar(20)
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-RELATIONSHIP
-
-
-
-
-
-
-valid_start_date
-
-
-The date when the relationship is first recorded.
-
-
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-valid_end_date
-
-
-The date when the relationship is invalidated.
-
-
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-invalid_reason
-
-
-Reason the relationship was invalidated. Possible values are ‘D’ (deleted), ‘U’ (updated) or NULL.
-
-
-
-
-varchar(1)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
RELATIONSHIP
-
Table Description
-
The RELATIONSHIP table provides a reference list of all types of relationships that can be used to associate any two concepts in the CONCEPT_RELATIONSHP table.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-relationship_id
-
-
-
-
-
-
-varchar(20)
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-relationship_name
-
-
-
-
-
-
-varchar(255)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-is_hierarchical
-
-
-
-
-
-
-varchar(1)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-defines_ancestry
-
-
-
-
-
-
-varchar(1)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-reverse_relationship_id
-
-
-
-
-
-
-varchar(20)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-relationship_concept_id
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-
-
-
CONCEPT_SYNONYM
-
Table Description
-
The CONCEPT_SYNONYM table is used to store alternate names and descriptions for Concepts.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-concept_id
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-concept_synonym_name
-
-
-
-
-
-
-varchar(1000)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-language_concept_id
-
-
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-
-
-
CONCEPT_ANCESTOR
-
Table Description
-
The CONCEPT_ANCESTOR table is designed to simplify observational analysis by providing the complete hierarchical relationships between Concepts. Only direct parent-child relationships between Concepts are stored in the CONCEPT_RELATIONSHIP table. To determine higher level ancestry connections, all individual direct relationships would have to be navigated at analysis time. The CONCEPT_ANCESTOR table includes records for all parent-child relationships, as well as grandparent-grandchild relationships and those of any other level of lineage. Using the CONCEPT_ANCESTOR table allows for querying for all descendants of a hierarchical concept. For example, drug ingredients and drug products are all descendants of a drug class ancestor.
-
This table is entirely derived from the CONCEPT, CONCEPT_RELATIONSHIP and RELATIONSHIP tables.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-ancestor_concept_id
-
-
-The Concept Id for the higher-level concept that forms the ancestor in the relationship.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-descendant_concept_id
-
-
-The Concept Id for the lower-level concept that forms the descendant in the relationship.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-min_levels_of_separation
-
-
-The minimum separation in number of levels of hierarchy between ancestor and descendant concepts. This is an attribute that is used to simplify hierarchic analysis.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-max_levels_of_separation
-
-
-The maximum separation in number of levels of hierarchy between ancestor and descendant concepts. This is an attribute that is used to simplify hierarchic analysis.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
SOURCE_TO_CONCEPT_MAP
-
Table Description
-
The source to concept map table is a legacy data structure within the OMOP Common Data Model, recommended for use in ETL processes to maintain local source codes which are not available as Concepts in the Standardized Vocabularies, and to establish mappings for each source code into a Standard Concept as target_concept_ids that can be used to populate the Common Data Model tables. The SOURCE_TO_CONCEPT_MAP table is no longer populated with content within the Standardized Vocabularies published to the OMOP community.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-source_code
-
-
-The source code being translated into a Standard Concept.
-
-
-
-
-varchar(50)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-source_concept_id
-
-
-A foreign key to the Source Concept that is being translated into a Standard Concept.
-
-
-This is either 0 or should be a number above 2 billion, which are the Concepts reserved for site-specific codes and mappings.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-source_vocabulary_id
-
-
-A foreign key to the VOCABULARY table defining the vocabulary of the source code that is being translated to a Standard Concept.
-
-
-
-
-varchar(20)
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-source_code_description
-
-
-An optional description for the source code. This is included as a convenience to compare the description of the source code to the name of the concept.
-
-
-
-
-varchar(255)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-target_concept_id
-
-
-The target Concept to which the source code is being mapped.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-target_vocabulary_id
-
-
-The Vocabulary of the target Concept.
-
-
-
-
-varchar(20)
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-VOCABULARY
-
-
-
-
-
-
-valid_start_date
-
-
-The date when the mapping instance was first recorded.
-
-
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-valid_end_date
-
-
-The date when the mapping instance became invalid because it was deleted or superseded (updated) by a new relationship. Default value is 31-Dec-2099.
-
-
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-invalid_reason
-
-
-Reason the mapping instance was invalidated. Possible values are D (deleted), U (replaced with an update) or NULL when valid_end_date has the default value.
-
-
-
-
-varchar(1)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-
DRUG_STRENGTH
-
Table Description
-
The DRUG_STRENGTH table contains structured content about the amount or concentration and associated units of a specific ingredient contained within a particular drug product. This table is supplemental information to support standardized analysis of drug utilization.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-
-
-
-
-drug_concept_id
-
-
-The Concept representing the Branded Drug or Clinical Drug Product.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-ingredient_concept_id
-
-
-The Concept representing the active ingredient contained within the drug product.
-
-
-Combination Drugs will have more than one record in this table, one for each active Ingredient.
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-amount_value
-
-
-The numeric value or the amount of active ingredient contained within the drug product.
-
-
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-amount_unit_concept_id
-
-
-The Concept representing the Unit of measure for the amount of active ingredient contained within the drug product.
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-numerator_value
-
-
-The concentration of the active ingredient contained within the drug product.
-
-
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-numerator_unit_concept_id
-
-
-The Concept representing the Unit of measure for the concentration of active ingredient.
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-denominator_value
-
-
-The amount of total liquid (or other divisible product, such as ointment, gel, spray, etc.).
-
-
-
-
-float
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-denominator_unit_concept_id
-
-
-The Concept representing the denominator unit for the concentration of active ingredient.
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-box_size
-
-
-The number of units of Clinical Branded Drug or Quantified Clinical or Branded Drug contained in a box as dispensed to the patient.
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-valid_start_date
-
-
-The date when the Concept was first recorded. The default value is 1-Jan-1970.
-
-
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-valid_end_date
-
-
-The date when then Concept became invalid.
-
-
-
-
-date
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-invalid_reason
-
-
-
Reason the concept was invalidated. Possible values are
Chances are someone else has already asked your question on the forum and it has been answered.
-
-
-
Check the Issue Log
-
If you think you’ve found a bug you can check to see if someone also had that same problem on our issue page of the Common Data Model github. If you don’t see your issue feel free to open one. Try and be as specific as possible. What error message occurs? Can you provide a simple example as to why you are requesting a change to the model?
-
-
-
Join meetings
-
Please come to meetings, ask your question and contribute to the discussion! All details can be found on our home page.
There are a number of implicit and explicit conventions that have been adopted in the CDM. Developers of methods that run against the CDM need to understand these conventions.
-
-
General
-
The OMOP CDM is platform-independent. Data types are defined generically using ANSI SQL data types (VARCHAR, INTEGER, FLOAT, DATE, DATETIME, CLOB). Precision is provided only for VARCHAR. It reflects the minimal required string length and can be expanded within a CDM instantiation. The CDM does not prescribe the date and datetime format. Standard queries against CDM may vary for local instantiations and date/datetime configurations.
-
-
Tables
-
For the tables of the main domains of the CDM it is imperative that concepts used are strictly limited to the domain. For example, the CONDITION_OCCURRENCE table contains only information about conditions (diagnoses, signs, symptoms), but no information about procedures. Not all source coding schemes adhere to such rules. For example, ICD-9-CM codes, which contain mostly diagnoses of human disease, also contain information about the status of patients having received a procedure. The ICD-9-CM code V20.3 ‘Newborn health supervision’ defines a continuous procedure and is therefore stored in the PROCEDURE_OCCURRENCE table.
-
-
-
Fields
-
Variable names across all tables follow one convention:
-
-
-
-
-
-
-
-
Notation
-
Description
-
-
-
-
-
_SOURCE_VALUE
-
Verbatim information from the source data, typically used in ETL to map to CONCEPT_ID, and not to be used by any standard analytics. For example, CONDITION_SOURCE_VALUE = ‘787.02’ was the ICD-9 code captured as a diagnosis from the administrative claim.
-
-
-
_ID
-
Unique identifiers for key entities, which can serve as foreign keys to establish relationships across entities. For example, PERSON_ID uniquely identifies each individual. VISIT_OCCURRENCE_ID uniquely identifies a PERSON encounter at a point of care.
-
-
-
_CONCEPT_ID
-
Foreign key into the Standardized Vocabularies (i.e. the standard_concept attribute for the corresponding term is true), which serves as the primary basis for all standardized analytics. For example, CONDITION_CONCEPT_ID = 31967 contains the reference value for the SNOMED concept of ‘Nausea’
-
-
-
_SOURCE_CONCEPT_ID
-
Foreign key into the Standardized Vocabularies representing the concept and terminology used in the source data, when applicable. For example, CONDITION_SOURCE_CONCEPT_ID = 45431665 denotes the concept of ‘Nausea’ in the Read terminology; the analogous CONDITION_CONCEPT_ID might be 31967, since SNOMED-CT is the Standardized Vocabulary for most clinical diagnoses and findings.
-
-
-
_TYPE_CONCEPT_ID
-
Delineates the origin of the source information, standardized within the Standardized Vocabularies. For example, DRUG_TYPE_CONCEPT_ID can allow analysts to discriminate between ‘Pharmacy dispensing’ and ‘Prescription written’
-
-
-
-
-
-
-
Vocabulary
-
-
Concepts
-
Concepts in the Common Data Model are derived from a number of public or proprietary terminologies such as SNOMED-CT and RxNorm, or custom generated to standardize aspects of observational data. Both types of Concepts are integrated based on the following rules:
-
-
All Concepts are maintained centrally by the CDM and Vocabularies Working Group. Additional concepts can be added, as needed, upon request by creating a Github issue.
-
For all Concepts, whether they are custom generated or adopted from published terminologies, a unique numeric identifier concept_id is assigned and used as the key to link all observational data to the corresponding Concept reference data.
-
The concept_id of a Concept is persistent, i.e. stays the same for the same Concept between releases of the Standardized Vocabularies.
-
A descriptive name for each Concept is stored as the Concept Name as part of the CONCEPT table. Additional names and descriptions for the Concept are stored as Synonyms in the CONCEPT_SYNONYM table.
-
Each Concept is assigned to a Domain. For Standard Concepts, there is always a single Domain. Source Concepts can be composite or coordinated entities, and therefore can belong to more than one Domain. The domain_id field of the record contains the abbreviation of the Domain, or Domain combination. Please refer to the Standardized Vocabularies specification for details of the Domain Assignment.
-
Concept Class designations are attributes of Concepts. Each Vocabulary has its own set of permissible Concept Classes, although the same Concept Class can be used by more than one Vocabulary. Depending on the Vocabulary, the Concept Class may categorize Concepts vertically (parallel) or horizontally (hierarchically). See the specification of each vocabulary for details.
-
Concept Class attributes should not be confused with Classification Concepts. These are separate Concepts that have a hierarchical relationship to Standard Concepts or each other, while Concept Classes are unique Vocabulary-specific attributes for each Concept.
-
For Concepts inherited from published terminologies, the source code is retained in the concept_code field and can be used to reference the source vocabulary.
-
Standard Concepts (designated as ‘S’ in the standard_concept field) may appear in CDM tables in all *_concept_id fields, whereas Classification Concepts (‘C’) should not appear in the CDM data, but participate in the construction of the CONCEPT_ANCESTOR table and can be used to identify Descendants that may appear in the data. See CONCEPT_ANCESTOR table. Non-standard Concepts can only appear in *_source_concept_id fields and are not used in CONCEPT_ANCESTOR table. Please refer to the Standardized Vocabularies specifications for details of the Standard Concept designation.
-
All logical data elements associated with the various CDM tables (usually in the _type_concept_id field) are called Type Concepts, including defining characteristics, qualifying attributes etc. They are also stored as Concepts in the CONCEPT table. Since they are generated by OMOP, their is no meaningful concept_code.
-
The lifespan of a Concept is recorded through its valid_start_date, valid_end_date and the invalid_ reason fields. This allows Concepts to correctly reflect at which point in time were defined. Usually, Concepts get deprecated if their meaning was deemed ambiguous, a duplication of another Concept, or needed revision for scientific reason. For example, drug ingredients get updated when different salt or isomer variants enter the market. Usually, drugs taken off the market do not cause a deprecation by the terminology vendor. Since observational data are valid with respect to the time they are recorded, it is key for the Standardized Vocabularies to provide even obsolete codes and maintain their relationships to other current Concepts .
-
Concepts without a known instantiated date are assigned valid_start_date of ‘1-Jan-1970’.
-
Concepts that are not invalid are assigned valid_end_date of ‘31-Dec-2099’.
-
Deprecated Concepts (with a valid_end_date before the release date of the Standardized Vocabularies) will have a value of ‘D’ (deprecated without successor) or ‘U’ (updated). The updated Concepts have a record in the CONCEPT_RELATIONSHIP table indicating their active replacement Concept.
-
Values for concept_ids generated as part of Standardized Vocabularies will be reserved from 0 to 2,000,000,000. Above this range, concept_ids are available for local use and are guaranteed not to clash with future releases of the Standardized Vocabularies.
-
-
-
-
Vocabularies
-
-
There is one record for each Vocabulary. One Vocabulary source or vendor can issue several Vocabularies, each of them creating their own record in the VOCABULARY table. However, the choice of whether a Vocabulary contains Concepts of different Concept Classes, or when these different classes constitute separate Vocabularies cannot precisely be decided based on the definition of what constitutes a Vocabulary. For example, the ICD-9 Volume 1 and 2 codes (ICD9CM, containing predominantly conditions and some procedures and observations) and the ICD-9 Volume 3 codes (ICD9Proc, containing predominantly procedures) are realized as two different Vocabularies. On the other hand, SNOMED-CT codes of the class Condition and those of the class Procedure are part of one and the same Vocabulary. Please refer to the Standardized Vocabularies specifications for details of each Vocabulary.
-
The vocabulary_id field contains an alphanumerical identifier, that can also be used as the abbreviation of the Vocabulary name.
-
The record with vocabulary_id = ‘None’ is reserved to contain information regarding the current version of the Entire Standardized Vocabularies.
-
The vocabulary_name field contains the full official name of the Vocabulary, as well as the source or vendor in parenthesis.
-
Each Vocabulary has an entry in the CONCEPT table, which is recorded in the vocabulary_concept_id field. This is for purposes of creating a closed Information Model, where all entities in the OMOP CDM are covered by a unique Concept.
-
-
-
-
Domains
-
-
There is one record for each Domain. The domains are defined by the tables and fields in the OMOP CDM that can contain Concepts describing all the various aspects of the healthcare experience of a patient.
-
The domain_id field contains an alphanumerical identifier, that can also be used as the abbreviation of the Domain.
-
The domain_name field contains the unabbreviated names of the Domain.
-
Each Domain also has an entry in the Concept table, which is recorded in the domain_concept_id field. This is for purposes of creating a closed Information Model, where all entities in the OMOP CDM are covered by unique Concept.
-
Versions prior to v5.0.0 of the OMOP CDM did not support the notion of a Domain.
-
-
-
-
Concept Classes
-
-
There is one record for each Concept Class. Concept Classes are used to create additional structure to the Concepts within each Vocabulary. Some Concept Classes are unique to a Vocabulary (for example “Clinical Finding” in SNOMED), but others can be used across different Vocabularies. The separation of Concepts through Concept Classes can be semantically horizontal (each Class subsumes Concepts of the same hierarchical level, akin to sub-Vocabularies within a Vocabulary) or vertical (each Class subsumes Concepts of a certain kind, going across hierarchical levels). For example, Concept Classes in SNOMED are vertical: The classes “Procedure” and “Clinical Finding” define very granular to very generic Concepts. On the other hand, “Clinical Drug” and “Ingredient” Concept Classes define horizontal layers or strata in the RxNorm vocabulary, which all belong to the same concept of a Drug.
-
The concept_class_id field contains an alphanumerical identifier, that can also be used as the abbreviation of the Concept Class.
-
The concept_class_name field contains the unabbreviated names of the Concept Class.
-
Each Concept Class also has an entry in the Concept table, which is recorded in the concept_ class_concept_id field. This is for purposes of creating a closed Information Model, where all entities in the OMOP CDM are covered by unique Concepts.
-
-
-
-
Concept Relationships
-
-
Relationships can generally be classified as hierarchical (parent-child) or non-hierarchical (lateral).
-
All Relationships are directional, and each Concept Relationship is represented twice symmetrically within the CONCEPT_RELATIONSHIP table. For example, the two SNOMED concepts of ‘Acute myocardial infarction of the anterior wall’ and ‘Acute myocardial infarction’ have two Concept Relationships:
-
-
‘Acute myocardial infarction of the anterior wall’ ‘Is a’ ‘Acute myocardial infarction’, and
-
‘Acute myocardial infarction’ ‘Subsumes’ ‘Acute myocardial infarction of the anterior wall’.
-
-
There is one record for each Concept Relationship connecting the same Concepts with the same relationship_id.
-
Since all Concept Relationships exist with their mirror image (concept_id_1 and concept_id_2 swapped, and the relationship_id replaced by the reverse_relationship_id from the RELATIONSHIP table), it is not necessary to query for the existence of a relationship both in the concept_id_1 and concept_id_2 fields.
-
Concept Relationships define direct relationships between Concepts. Indirect relationships through 3rd Concepts are not captured in this table. However, the CONCEPT_ANCESTOR table does this for hierachical relationships over several “generations” of direct relationships.
-
In previous versions of the CDM, the relationship_id used to be a numerical identifier. See the RELATIONSHIP table.
-
-
-
-
Relationship Table
-
-
There is one record for each Relationship.
-
Relationships are classified as hierarchical (parent-child) or non-hierarchical (lateral)
-
They are used to determine which concept relationship records should be included in the computation of the CONCEPT_ANCESTOR table.
-
The relationship_id field contains an alphanumerical identifier, that can also be used as the abbreviation of the Relationship.
-
The relationship_name field contains the unabbreviated names of the Relationship.
-
Relationships all exist symmetrically, i.e. in both direction. The relationship_id of the opposite Relationship is provided in the reverse_relationship_id field.
-
Each Relationship also has an equivalent entry in the Concept table, which is recorded in the relationship_ concept_id field. This is for purposes of creating a closed Information Model, where all entities in the OMOP CDM are covered by unique Concepts.
-
Hierarchical Relationships are used to build a hierarchical tree out of the Concepts, which is recorded in the CONCEPT_ANCESTOR table. For example, “has_ingredient” is a Relationship between Concept of the Concept Class ‘Clinical Drug’ and those of ‘Ingredient’, and all Ingredients can be classified as the “parental” hierarchical Concepts for the drug products they are part of. All ‘Is a’ Relationships are hierarchical.
-
Relationships, also hierarchical, can be between Concepts within the same Vocabulary or those adopted from different Vocabulary sources.
-
-
-
-
Concept Synonyms
-
-
The concept_synonym_name field contains a valid Synonym of a concept, including the description in the concept_name itself. I.e. each Concept has at least one Synonym in the CONCEPT_SYNONYM table. As an example, for a SNOMED-CT Concept, if the fully specified name is stored as the concept_name of the CONCEPT table, then the Preferred Term and Synonyms associated with the Concept are stored in the CONCEPT_SYNONYM table.
-
Only Synonyms that are active and current are stored in the CONCEPT_SYNONYM table. Tracking synonym/description history and mapping of obsolete synonyms to current Concepts/Synonyms is out of scope for the Standard Vocabularies.
-
Currently, only English Synonyms are included.
-
-
-
-
Concept Ancestor
-
-
Each concept is also recorded as an ancestor of itself.
-
Only valid and Standard Concepts participate in the CONCEPT_ANCESTOR table. It is not possible to find ancestors or descendants of deprecated or Source Concepts.
-
Usually, only Concepts of the same Domain are connected through records of the CONCEPT_ANCESTOR table, but there might be exceptions.
-
-
-
-
Source to Concept Map
-
-
This table is no longer used to distribute mapping information between source codes and Standard Concepts for the Standard Vocabularies. Instead, the CONCEPT_RELATIONSHIP table is used for this purpose, using the relationship_id=‘Maps to’.
-
However, this table can still be used for the translation of local source codes into Standard Concepts.
-
Note: This table should not be used to translate source codes to Source Concepts. The source code of a Source Concept is captured in its concept_code field. If the source codes used in a given database do not follow correct formatting the ETL will have to perform this translation. For example, if ICD-9-CM codes are recorded without a dot the ETL will have to perform a lookup function that allows identifying the correct ICD-9-CM Source Concept (with the dot in the concept_code field).
-
The source_concept_id, or the combination of the fields source_code and the source_vocabulary_id uniquely identifies the source information. It is the equivalent to the concept_id_1 field in the CONCEPT_RELATIONSHIP table.
-
If there is no source_concept_id available because the source codes are local and not supported by the Standard Vocabulary, the content of the field is 0 (zero, not null) encoding an undefined concept. However, local Source Concepts are established (concept_id values above 2,000,000,000).
-
The source_code_description contains an optional description of the source code.
-
The target_concept_id contains the Concept the source code is mapped to. It is equivalent to the concept_id_2 in the CONCEPT_RELATIONSHIP table
-
The target_vocabulary_id field contains the vocabulary_id of the target concept. It is a duplication of the same information in the CONCEPT record of the Target Concept.
-
The fields valid_start_date, valid_end_date and invalid_reason are used to define the life cycle of the mapping information. Invalid mapping records should not be used for mapping information.
-
-
-
-
Drug Strength
-
-
The DRUG_STRENGTH table contains information for each active (non-deprecated) Standard Drug Concept.
-
A drug which contains multiple active Ingredients will result in multiple DRUG_STRENGTH records, one for each active ingredient.
-
Ingredient strength information is provided either as absolute amount (usually for solid formulations) or as concentration (usually for liquid formulations).
-
If the absolute amount is provided (for example, ‘Acetaminophen 5 MG Tablet’) the amount_value and amount_unit_concept_id are used to define this content (in this case 5 and ‘MG’).
-
If the concentration is provided (for example ‘Acetaminophen 48 MG/ML Oral Solution’) the numerator_ value in combination with the numerator_unit_concept_id and denominator_unit_concept_id are used to define this content (in this case 48, ‘MG’ and ‘ML’).
-
In case of Quantified Clinical or Branded Drugs the denominator_value contains the total amount of the solution (not the amount of the ingredient). In all other drug concept classes the denominator amount is NULL because the concentration is always normalized to the unit of the denominator. So, a product containing 960 mg in 20 mL is provided as 48 mg/mL in the Clinical Drug and Clinical Drug Component, while as a Quantified Clinical Drug it is written as 960 mg/20 mL.
-
If the strength is provided in % (volume or mass-percent are not distinguished) it is stored in the numerator_value/numerator_unit_concept_id field combination, with both the denominator_value and denominator_unit_concept_id set to NULL. If it is a Quantified Drug the total amount of drug is provided in the denominator_value/denominator_unit_concept_id pair. E.g., the 30 G Isoconazole 2% Topical Cream is provided as 2% / in Clinical Drug and Clinical Drug Component, and as 2% /30 G.
-
Sometimes, one Ingredient is listed with different units within the same drug. This is very rare, and usually this happens if there are more than one Precise Ingredient. For example, ‘Penicillin G, 30 Benzathine 150000 UNT/ML / Penicillin G, Procaine 150000 MEQ/ML Injectable Suspension’ contains Penicillin G in two different forms.
-
Sometimes, different ingredients in liquid drugs are listed with different units in the denominator_ unit_concept_id. This is usually the case if the ingredients are liquids themselves (concentration provided as mL/mL) or solid substances (mg/mg). In these cases, the general assumptions is made that the density of the drug is that of water, and one can assume 1 g = 1 mL.
-
All Drug vocabularies containing Standard Concepts have entries in the DRUG_STRENGTH table.
-
There is now a Concept Class for supplier information whose relationships can be found in CONCEPT_ RELATIONSHIP with a relationship_id of ‘Has supplier’ and ‘Supplier of’
-
-
-
-
-
Mapping
-
-
Representing content as Concepts
-
In CDM data tables the meaning of the content of each record is represented using Concepts. Concepts are stored with their CONCEPT_ID as foreign keys to the CONCEPT table in the Standardized Vocabularies, which contains Concepts necessary to describe the healthcare experience of a patient. If a Standard Concept does not exist or cannot be identified, the Concept with the CONCEPT_ID 0 is used, representing a non-existing or un-mappable concept.
-
Records in the CONCEPT table contain all the detailed information about it (name, domain, class etc.). Concepts, Concept Relationships and other information relating to Concepts is contained in the tables of the Standardized Vocabularies.
-
-
-
Concept IDs and Source Values
-
Many tables contain equivalent information multiple times: As a Source Value, a Source Concept and as a Standard Concept.
-
-
Source Values contain the codes from public code systems such as ICD-9-CM, NDC, CPT-4 etc. or locally controlled vocabularies (such as F for female and M for male) copied from the source data. Source Values are stored in the *_SOURCE_VALUE fields in the data tables.
-
Concepts are CDM-specific entities that represent the meaning of a clinical fact. Most concepts are based on code systems used in healthcare (called Source Concepts), while others were created de-novo (CONCEPT_CODE = ‘OMOP generated’). Concepts have unique IDs across all domains.
-
Source Concepts are the concepts that represent the code used in the source. Source Concepts are only used for common healthcare code systems, not for OMOP-generated Concepts. Source Concepts are stored in the *_SOURCE_CONCEPT_ID field in the data tables.
-
Standard Concepts are those concepts that are used to define the unique meaning of a clinical entity. For each entity there is one Standard Concept. Standard Concepts are typically drawn from existing public vocabulary sources. Concepts that have the equivalent meaning to a Standard Concept are mapped to the Standard Concept. Standard Concepts are referred to in the _CONCEPT_ID field of the data tables.
-
-
Source Values are only provided for convenience and quality assurance (QA) purposes. Source Values and Source Concepts are optional, while Standard Concepts are mandatory. Source Values may contain information that is only meaningful in the context of a specific data source.
-
-
-
General Concepts and Type Concepts
-
Type Concepts (ending in _TYPE_CONCEPT_ID) and general Concepts (ending in _CONCEPT_ID) are part of many tables. The former are special Concepts with the purpose of indicating where the data are derived from in the source. For example, the Type Concept field can be used to distinguish a DRUG_EXPOSURE record that is derived from a pharmacy-dispensing claim from one indicative of a prescription written in an electronic health record (EHR).
-
-
-
Time span of available data
-
Data tables for clinical data contain a datetime stamp (ending in _DATETIME, _START_DATETIME or _END_DATETIME), indicating when that clinical event occurred. As a rule, no record can be outside of a valid OBSERVATION_PERIOD time period. Clinical information that relates to events that happened prior to the first OBSERVATION_PERIOD will be captured as a record in the OBSERVATION table as ‘Medical history’ (CONCEPT_ID = 43054928), with the OBSERVATION_DATETIME set to the first OBSERVATION_PERIOD_START_DATE of that patient, and the VALUE_AS_CONCEPT_ID set to the corresponding CONCEPT_ID for the condition/drug/procedure that occurred in the past. No data occurring after the last OBSERVATION_PERIOD_END_DATE can be valid records in the CDM. * When mapping source data to the CDM, if time is unknown the default time of 00:00:00 should be chosen.
-
-
-
Source Values, Source Concept Ids, and Standard Concept Ids
-
Each table contains fields for Source Values, Source Concept Ids, and Standard Concept Ids.
-
-
Source Values are fields to maintain the verbatim information from the source database, stored as unstructured text, and are generally not to be used by any standardized analytics. There is no standardization for these fields and these columns can be used as the local CDM builders see fit. A typical example would be an ICD-9 code without the decimal from an administrative claim as condition_source_value = ‘78702’ which is how it appeared in the source.
-
Source Concept Ids provide a repeatable representation of the source concept, when the source data are drawn from a commonly-used, internationally-recognized vocabulary that has been distributed with the OMOP Common Data Model. Specific use cases where source vocabulary-specific analytics are required can be accommodated by the use of the *_SOURCE_CONCEPT_ID fields, but these are generally not applicable across disparate data sources. The standard *_CONCEPT_ID fields are strongly suggested to be used in all standardized analytics, as specific vocabularies have been established within each data domain to facilitate standardization of both structure and content within the OMOP Common Data Model.
-
-
The following provide conventions for processing source data using these three fields in each domain:
-
When processing data where the source value is either free text or a reference to a coding scheme that is not contained within the Standardized Vocabularies:
-
-
Map all Source Values to the corresponding Standard CONCEPT_IDs. Store the CONCEPT_IDs in the TARGET_CONCEPT_ID field of the SOURCE_TO_CONCEPT_MAP table.
-
-
If a CONCEPT_ID is not available for the source code, the TARGET_CONCEPT_ID field is set to 0.
-
-
-
When processing your data where Source Value is a reference to a coding scheme contained within the Standardized Vocabularies:
-
-
Find all CONCEPT_IDs in the Source Vocabulary that correspond to your Source Values. Store the result in the SOURCE_CONCEPT_ID field.
-
-
If the source code follows the same formatting as the distributed vocabulary, the mapping can be directly obtained from the CONCEPT table using the CONCEPT_CODE field.
-
If the source code uses alternative formatting (ex. format has removed decimal point from ICD-9 codes), you will need to perform the formatting transformation within the ETL. In this case, you may wish to store the mappings from original codes to SOURCE_CONCEPT_IDs in the SOURCE_TO_CONCEPT_MAP table.
-
If the source code is not found in a vocabulary, the SOURCE_CONCEPT_ID field is set to 0
-
-
Use the CONCEPT_RELATIONSHIP table to identify the Standard CONCEPT_ID that corresponds to the SOURCE_CONCEPT_ID in the domain.
-
-
Each SOURCE_CONCEPT_ID can have 1 or more Standard CONCEPT_IDs mapped to it. Each Standard CONCEPT_ID belongs to only one primary domain but when a source CONCEPT_ID maps to multiple Standard CONCEPT_IDs, it is possible for that SOURCE_CONCEPT_ID to result in records being produced across multiple domains. For example, ICD-10-CM code Z34.00 ‘Encounter for supervision of normal first pregnancy, unspecified trimester’ will be mapped to the SNOMED concept ‘Routine antenatal care’ in the procedure domain and the concept in the condition domain ‘Primagravida’. It is also possible for one SOURCE_CONCEPT_ID to map to multiple Standard CONCEPT_IDs within the same domain. For example, ICD-9-CM code 070.43 ‘Hepatitis E with hepatic coma’ maps to the SNOMED concept for ‘Acute hepatitis E’ and a second SNOMED concept for ‘Hepatic coma’, in which case multiple CONDITION_OCCURRENCE records will be generated for the one source value record.
-
If the SOURCE_CONCEPT_ID is not mappable to any Standard CONCEPT_ID, the _CONCEPT_ID field is set to 0.
-
-
Write the data record into the table(s) corresponding to the domain of the Standard CONCEPT_ID(s).
-
-
If the Source Value has a SOURCE_CONCEPT_ID but the SOURCE_CONCEPT_ID is not mapped to a Standard CONCEPT_ID, then the domain for the data record, and hence it’s table location, is determined by the DOMAIN_ID field of the CONCEPT record the SOURCE_CONCEPT_ID refers to. The Standard _CONCEPT_ID is set to 0.
-
If the Source Value cannot be mapped to a SOURCE_CONCEPT_ID or Standard CONCEPT_ID, then direct the data record to the most appropriate CDM domain based on your local knowledge of the intent of the source data and associated value. For example, if the un-mappable Source Value came from a ‘diagnosis’ table then, in the absence of other information, you may choose to record that fact in the CONDITION_OCCURRENCE table.
-
-
-
Each Standard CONCEPT_ID field has a set of allowable CONCEPT_ID values. The allowable values are defined by the domain of the concepts. For example, there is a domain concept of ‘Gender’, for which there are only two allowable standard concepts of practical use (8507 - ‘Male’, 8532- ‘Female’) and one allowable generic concept to represent a standard notion of ‘no information’ (concept_id = 0). This ‘no information’ concept should be used when there is no mapping to a standard concept available or if there is no information available for that field. The exceptions are MEASUREMENT.VALUE_AS_CONCEPT_ID, OBSERVATION.VALUE_AS_CONCEPT_ID, MEASUREMENT.UNIT_CONCEPT_ID, OBSERVATION.UNIT_CONCEPT_ID, MEASUREMENT.OPERATOR_CONCEPT_ID, and OBSERVATION.MODIFIER_CONCEPT_ID, which can be NULL if the data do not contain the information (THEMIS issue #11).
-
There is no constraint on allowed CONCEPT_IDs within the SOURCE_CONCEPT_ID fields.
-
-
-
Custom SOURCE_TO_CONCEPT_MAP
-
When the source data uses coding systems that are not currently in the Standardized Vocabularies (e.g. ICPC codes for diagnoses), the convention is to store the mapping of such source codes to Standard Concepts in the SOURCE_TO_CONCEPT_MAP table. The codes used in the data source can be recorded in the SOURCE_VALUE fields, but no SOURCE_CONCEPT_ID will be available.
-
Custom source codes are not allowed to map to Standard Concepts that are marked as invalid.
All code for the ddls, constraints and indices are available on our github. Each version of the Common Data Model is denoted by a release. The OHDSI community supports the database management systems (dbms) Sql Server, Postgresql, Oracle, Redshift, Parallel Data Warehouse, BigQuery, Impala, and Netezza. Included in each release is a folder for each dbms. After downloading, choose the folder for your specific system and you will see all necessary files. For example the Sql Server folder has the ddl, primary key constraints, indices, and foreign key constraints. In contrast, the redshift folder only has a ddl.
-
These sql scripts have been fully tested on Oracle, Sql Server, and Postgresql and the rest are generated using the SqlRender package. If run into any problems please let us know by creating an issue on our github.
These conventions have been curated to show how to consider calculating cumulative and daily drug dose for a given exposure record. These are high-level examples meant to demonstrate how one might use the DRUG_STRENGTH table and they do not take into account switching or stockpiling.
-
1. Tablets and other fixed amount formulations
Example: Acetaminophen (Paracetamol) 500 mg, 20 tablets. DRUG_STRENGTH The denominator_unit is empty DRUG_EXPOSURE The quantity refers to number of pieces, e.g. tablets. In the example: 20 Ingredient dose= quantity x amount_value [amount_unit_concept_id] Acetaminophen dose = 20 x 500mg = 10,000mg Daily dose = Acetaminophen dose/drug duration
-
2. Puffs of an inhaler
Note: There is no difference to use case 1 above besides that the DRUG_STRENGTH table may put {actuat} in the denominator unit. In this case the strength is provided in the numerator. DRUG_STRENGTH The denominator_unit is {actuat} DRUG_EXPOSURE The quantity refers to the number of pieces, e.g. puffs Ingredient dose= quantity x numerator_value [numerator_unit_concept_id] Daily dose = Ingredient dose/drug duration
3. Quantified Drugs which are formulated as a concentration
Example: The Clinical Drug is Acetaminophen 250 mg/mL in a 5mL oral suspension. The Quantified Clinical Drug would have 1250 mg / 5 ml in the DRUG_STRENGTH table. Two suspensions are dispensed. DRUG_STRENGTH The denominator_unit is either mg or mL. The denominator_value might be different from 1. DRUG_EXPOSURE The quantity refers to a fraction or multiple of the pack. In the example: 2 Ingredient dose= quantity x numerator_value [numerator_unit_concept_id] Acetaminophen dose = 2 x 1250mg = 2500mg Daily dose = Acetaminophen dose/drug duration
4. Drugs with the total amount provided in quantity, e.g. chemotherapeutics
Example: 42799258 “Benzyl Alcohol 0.1 ML/ML / Pramoxine hydrochloride 0.01 MG/MG Topical Gel” dispensed in a 1.25oz pack. DRUG_STRENGTH The denominator_unit is either mg or mL. Example: Benzyl Alcohol in mL and Pramoxine hydrochloride in mg DRUG_EXPOSURE The quantity refers to mL or g. Example: 1.25 x 30 (conversion factor oz -> mL) = 37 Ingredient dose= quantity x numerator_value [numerator_unit_concept_id] Benzyl Alcohol dose = 37 x 0.1mL = 3.7mL Daily dose = Benzyl Alcohol dose/drug duration Pramoxine hydrochloride dose = 37 x 0.01mg x 1000 = 370mg Daily dose = Pramoxine hydrochloride dose/drug duration
Note: The analytical side should check the denominator in the DRUG_STRENGTH table. As mg is used for the second ingredient the factor 1000 will be applied to convert between g and mg.
5. Compounded drugs
Example: Ibuprofen 20%/Piroxicam 1% Cream, 30ml in 5ml tubes. DRUG_STRENGTH We need entries for the ingredients of Ibuprofen and Piroxicam, probably with an amount_value of 1 and a unit of mg. DRUG_EXPOSURE The quantity refers to the total amount of the compound. Use one record in the DRUG_EXPOSURE table for each compound. Example: 20% Ibuprofen of 30ml = 6mL, 1% Piroxicam of 30ml = 0.3mL Ingredient dose= Depends on the drugs involved: One of the use cases above.Ibuprofen dose = 6 x 1mg x 1000 = 6000mg Daily dose = Ibuprofen dose/drug duration Piroxicam dose = 0.3 x 1mg x 1000 = 300mg Daily dose = Piroxicam dose/drug duration Note: The analytical side determines that the denominator for both ingredients in the DRUG_STRENGTH table is mg and applies the factor 1000 to convert between mL/g and mg.
6. Drugs with the active ingredient released over time, e.g. patches
Example: Ethinyl Estradiol 0.000833 MG/HR / norelgestromin 0.00625 MG/HR Weekly Transdermal Patch DRUG_STRENGTH The denominator units refer to hour. Example: Ethinyl Estradiol 0.000833 mg/h / norelgestromin 0.00625 mg/h DRUG_EXPOSURE The quantity refers to the number of pieces. Example: 1 patch Ingredient rate= numerator_value [numerator_unit_concept_id] Ethinyl Estradiol rate = 0.000833 mg/h norelgestromin rate 0.00625 mg/h Note: This can be converted to a daily dosage by multiplying it with 24. (Assuming 1 patch at a time for at least 24 hours)
1. I understand that the common data model (CDM) is a way of organizing disparate data sources into the same relational database design, but how can it be effective since many databases use different coding schemes?
-
During the extract, transform, load (ETL) process of converting a data source into the OMOP common data model, we standardize the structure (e.g. tables, fields, data types), conventions (e.g. rules that govern how source data should be represented), and content (e.g. what common vocabularies are used to speak the same language across clinical domains). The common data model preserves all source data, including the original source vocabulary codes, but adds the standardized vocabularies to allow for network research across the entire OHDSI research community.
-
2. How does my data get transformed into the common data model?
-
You or someone in your organization will need to create a process to build your CDM. Don’t worry though, you are not alone! The open nature of the community means that much of the code that other participants have written to transform their own data is available for you to use. If you have a data license for a large administrative claims database like IBM MarketScan® or Optum’s Clinformatics® Extended Data Mart, chances are that someone has already done the legwork. Here is one example of a full builder freely available on github that has been written for a variety of data sources.
-
The community forums are also a great place to ask questions if you are stuck or need guidance on how to represent your data in the common data model. Members are usually very responsive!
-
3. Are any tables or fields optional?
-
It is expected that all tables will be present in a CDM though it is not a requirement that they are all populated. The two mandatory tables are:
-
-
Person: Contains records that uniquely identify each patient in the source data who is at-risk to have clinical observations recorded within the source systems.
-
Observation_period: Contains records which uniquely define the spans of time for which a Person is at-risk to have clinical events recorded within the source systems.
4. Does the data model include any derived information? Which tables or values are derived?
-
The common data model stores verbatim data from the source across various clinical domains, such as records for conditions, drugs, procedures, and measurements. In addition, to assist the analyst, the common data model also provides some derived tables, based on commonly used analytic procedures. For example, the Condition_era table is derived from the Condition_occurrence table and both the Drug_era and Dose_era tables are derived from the Drug_exposure table. An era is defined as a span of time when a patient is assumed to have a given condition or exposure to a particular active ingredient. Members of the community have written code to create these tables and it is out on the github if you choose to use it in your CDM build. It is important to reinforce, the analyst has the opportunity, but not the obligation, to use any of the derived tables and all of the source data is still available for direct use if the analysis calls for different assumptions.
-
5. How is age captured in the model?
-
Year_of_birth, month_of_birth, day_of_birth and birth_datetime are all fields in the Person table designed to capture some form of date of birth. While only year_of_birth is required, these fields allow for maximum flexibility over a wide range of data sources.
-
6. How are gender, race, and ethnicity captured in the model? Are they coded using values a human reader can understand?
-
Standard Concepts are used to denote all clinical entities throughout the OMOP common data model, including gender, race, and ethnicity. Source values are mapped to Standard Concepts during the extract, transform, load (ETL) process of converting a database to the OMOP Common Data Model. These are then stored in the Gender_concept_id, Race_concept_id and Ethnicity_concept_id fields in the Person table. Because the standard concepts span across all clinical domains, and in keeping with Cimino’s ‘Desiderata for Controlled Medical Vocabularies in the Twenty-First Century’, the identifiers are unique, persistent nonsematic identifiers. Gender, for example, is stored as either 8532 (female) or 8507 (male) in gender_concept_id while the original value from the source is stored in gender_source_value (M, male, F, etc)..
-
**7. Are there conditions/procedures/drugs or other domains that should be masked or hidden in the CDM?
-
The masking of information related to a person is dependent on the organization’s privacy policies and may vary by data asset (THEMIS issue #21).
-
7. How is time-varying patient information such as location of residence addressed in the model?
-
The OMOP common data model has been pragmatically defined based on the desired analytic use cases of the community, as well as the available types of data that community members have access to. Prior to CDM v6.0, each person record had associated demographic attributes which are assumed to be constant for the patient throughout the course of their periods of observation, like location and primary care provider. With the release of CDM v6.0, the Location_History table is now available to track the movements of people, care sites, and providers over time. Only the most recent location_id should be stored in the Person table to eliminate duplication, while the person’s movements are stored in Location_History.
-
Something like marital status is a little different as it is considered to be an observation rather than a demographic attribute. This means that it is housed in the Observation table rather than the Person table, giving the opportunity to store each change in status as a unique record.
-
If someone in the community had a use case for time-varying location of residence and also had source data that contains this information, we’d welcome participation in the CDM workgroup to evolve the model further.
-
8. How does the model denote the time period during which a Person’s information is valid?
-
The OMOP Common Data Model uses something called observation periods (stored in the Observation_period table) as a way to define the time span during which a patient is at-risk to have a clinical event recorded. In administrative claims databases, for example, these observation periods are often analogous to the notion of ‘enrollment’.
-
9. How does the model capture start and stop dates for insurance coverage? What if a person’s coverage changes?
-
The Payer_plan_period table captures details of the period of time that a Person is continuously enrolled under a specific health Plan benefit structure from a given Payer. Payer plan periods, as opposed to observation periods, can overlap so as to denote the time when a Person is enrolled in multiple plans at the same time such as Medicare Part A and Medicare Part D.
-
10. What if I have EHR data? How would I create observation periods?
-
An observation period is considered as the time at which a patient is at-risk to have a clinical event recorded in the source system. Determining the appropriate observation period for each source data can vary, depending on what information the source contains. If a source does not provide information about a patient’s entry or exit from a system, then reasonable heuristics need to be developed and applied within the ETL.
-
-
Vocabulary Mapping
-
11. Do I have to map my source codes to Standard Concepts myself? Are there vocabulary mappings that already exist for me to leverage?
-
If your data use any of the 55 source vocabularies that are currently supported, the mappings have been done for you. The full list is available from the open-source ATHENA tool under the download tab (see below). You can choose to download the ten vocabulary tables from there as well – you will need a copy in your environment if you plan on building a CDM.
-
-
The ATHENA tool also allows you to explore the vocabulary before downloading it if you are curious about the mappings or if you have a specific code in mind and would like to know which standard concept it is associated with; just click on the search tab and type in a keyword to begin searching.
-
12. If I want to apply the mappings myself, can I do so? Are they transparent to all users?
-
Yes, all mappings are available in the Concept_relationship table (which can be downloaded from ATHENA). Each value in a supported source terminology is assigned a Concept_id (which is considered non-standard). Each Source_concept_id will have a mapping to a Standard_concept_id. For example:
-
-
In this case the standard SNOMED concept 201826 for type 2 diabetes mellitus would be stored in the Condition_occurrence table as the Condition_concept_id and the ICD10CM concept 1567956 for type 2 diabetes mellitus would be stored as the Condition_source_concept_id.
-
13. Can RXNorm codes be stored in the model? Can I store multiple levels if I so choose? What if one collaborator uses a different level of RXNorm than I use when transforming their database?
-
In the OMOP Common Data Model RXNorm is considered the standard vocabulary for representing drug exposures. One of the great things about the Standardized Vocabulary is that the hierarchical nature of RXNorm is preserved to enable efficient querying. It is agreed upon best practice to store the lowest level RXNorm available and then use the Vocabulary to explore any pertinent relationships. Drug ingredients are the highest-level ancestors so a query for the descendants of an ingredient should turn up all drug products (Clinical Drug or Branded Drug) containing that ingredient. A query designed in this way will find drugs of interest in any CDM regardless of the level of RXNorm used.
-
14. What if the vocabulary has a mapping I don’t agree with? Can it be changed?
-
Yes, that is the beauty of the community! If you find a mapping in the vocabulary that doesn’t seem to belong or that you think could be better, feel free to write a note on the forums or on the vocabulary github. If the community agrees with your assessment it will be addressed in the next vocabulary version.
-
15. What if I have source codes that are specific to my site? How would these be mapped?
-
In the OMOP Vocabulary there is an empty table called the Source_to_concept_map. It is a simple table structure that allows you to establish mapping(s) for each source code with a standard concept in the OMOP Vocabulary (TARGET_CONCEPT_ID). This work can be facilitated by the OHDSI tool Usagi (pictured below) which searches for text similarity between your source code descriptions and the OMOP Vocabulary and exports mappings in a SOURCE_TO_CONCEPT_MAP table structure. Example Source_to_concept_map files can be found here. These generated Source_to_concept_map files are then loaded into the OMOP Vocabulary’s empty Source_to_concept_map prior to processing the native data into the CDM so that the CDM builder can use them in a build.
-
-
If an source code is not supported by the OMOP Vocabulary, one can create a new records in the CONCEPT table, however the CONCEPT_IDs should start >2000000000 so that it is easy to tell between the OMOP Vocabulary concepts and the site specific concepts. Once those concepts exist CONCEPT_RELATIONSHIPS can be generated to assign them to a standard terminologies, USAGI can facilitate this process as well (THEMIS issue #22).
-
16. How are one-to-many mappings applied?
-
If one source code maps to two Standard Concepts then two rows are stored in the corresponding clinical event table.
-
17. What if I want to keep my original data as well as the mapped values? Is there a way for me to do that?
-
Yes! Source values and Source Concepts are fully maintained within the OMOP Common Data Model. A Source Concept represents the code in the source data. Each Source Concept is mapped to one or more Standard Concepts during the ETL process and both are stored in the corresponding clinical event table. If no mapping is available, the Standard Concept with the concept_id = 0 is written into the *_concept_id field (Condition_concept_id, Procedure_concept_id, etc.) so as to preserve the record from the native data.
-
-
-
Common Data Model Versioning
-
18. Who decides when and how to change the data model?
-
The community! There is a working group designed around updating the model and everything is done by consensus. Members submit proposed changes to the github in the form of issues and the group meets once a month to discuss and vote on the changes. Any ratified proposals are then added to the queue for a future version of the Common Data Model.
-
19. Are changes to the model backwards compatible?
-
Generally point version changes (5.1 -> 5.2) are backwards compatible and major version changes (4.0 -> 5.0) may not be. All updates to the model are listed in the release notes for each version and anything that could potentially affect backwards compatibility is clearly labeled.
-
20. How frequently does the model change?
-
The current schedule is for major versions to be released every year and point versions to be release every quarter though that is subject to the needs of the community.
-
21. What is the dissemination plan for changes?
-
Changes are first listed in the release notes on the github and in the common data model wiki. New versions are also announced on the weekly community calls and on the community forums.
-
-
-
OHDSI Tools
-
22. What are the currently available analytic tools?
-
While there are a variety of tools freely available from the community, these are the most widely used:
-
-
ACHILLES – a stand-alone tool for database characterization
-
ATLAS - an integrated platform for vocabulary exploration, cohort definition, case review, clinical characterization, incidence estimation, population-level effect estimation design, and patient-level prediction design (link to github)
-
ARACHNE – a tool to facilitate distributed network analyses
-
WhiteRabbit - an application that can be used to analyse the structure and contents of a database as preparation for designing an ETL
-
RabbitInAHat - an application for interactive design of an ETL to the OMOP Common Data Model with the help of the the scan report generated by White Rabbit
-
Usagi - an application to help create mappings between coding systems and the Vocabulary standard concepts.
-
-
23. Who is responsible for updating the tools to account for data model changes, bugs, and errors?
-
The community! All the tools are open source meaning that anyone can submit an issue they have found, offer suggestions, and write code to fix the problem.
-
24. Do the current tools allow a user to define a treatment gap (persistence window) of any value when creating treatment episodes?
-
Yes – the ATLAS tool allows you to specify a persistence window between drug exposures when defining a cohort (see image below).
-
-
25. Can the current tools identify medication use during pregnancy?
-
Yes, you can identify pregnancy markers from various clinical domains, including conditions and procedures, for example ‘live birth’, and then define temporal logic to look for drug exposure records in some interval prior to the pregnancy end. In addition, members of the community have built an advanced logic to define pregnancy episodes with all pregnancy outcomes represented, which can be useful for this type of research.
-
26. Do the current tools execute against the mapped values or source values?
-
The tools can execute against both source and mapped values, though mapped values are strongly encouraged. Since one of the aims of OHDSI is to create a distributed data network across the world on which to run research studies, the use of source values fails to take advantage of the benefits of the Common Data Model.
-
-
-
Network Research Studies
-
27. Who can generate requests?
-
Anyone in the community! Any question that gains enough interest and participation can be a network research study.
-
28. Who will develop the queries to distribute to the network?
-
Typically a principal investigator leads the development of a protocol. The PI may also lead the development of the analysis procedure corresponding to the protocol. If the PI does not have the technical skills required to write the analysis procedure that implements the protocol, someone in the community can help them put it together.
-
29. What language are the queries written in?
-
Queries are written in R and SQL. The SqlRender package can translate any query written in a templated SQL Server-like dialect to any of the supported RDBMS environments, including Postgresql, Oracle, Redshift, Parallel Data Warehouse, Hadoop Impala, Google BigQuery, and Netezza.
-
30. How do the queries get to the data partners and how are they run once there?
-
OHDSI runs as a distributed data network. All analyses are publicly available and can be downloaded to run at each site. The packages can be run locally and, at the data partner’s discretion, aggregate results can be shared with the study coordinator.
-
Data partners can also make use of one of OHDSI’s open-source tools called ARACHNE, a tool to facilitate distributed network analytics against the OMOP CDM.
The OMOP Common Data Model is managed by the OHDSI CDM Working Group. Through the end of 2019 and into 2020 our goal was to fully update the documentation in an effort to facilitate greater understanding of the model. Almost every forum post relating to a question on how to map data into the CDM inevitably referenced the (now outdated) technical and difficult-to-understand explanations of the tables and fields currently on the wiki. To remedy we focused on one or two tables each month, diving fully into the user guidance and ETL specifications. The results of our efforts can be seen on the pages detailing v5.3.1 and v6.0.
-
In addition to documentation the formal remit of the CDM Working Group is to hear proposals for change, ratifying only those with valid use cases and data to support them. This process will be slower through 2020 though proposals related to existing CDM tables will be considered during the months those tables are being updated. For example November 2019 will be focused on the PERSON and OBSERVATION_PERIOD tables so any proposals related to those two tables will be evaluated during November 2019. Once proposals are accepted they are listed as such and will be integrated in an upcoming version of the OMOP CDM. Currently accepted proposals can be found under the “Proposals” drop down across the top.
-
-
CDM WG Meeting Information
-
Every first Tuesday of the month at 1pm estTeams Meeting
-
Note This was recently changed from a Skype meeting to a Microsoft Teams meeting. If you do you have access to the OHDSI Teams Tenet, please contact Clair Blacketer at mblacke@its.jnj.com.
OMOP Common Data Model Oncology Extension Documentation
-
This documentation details the ratified proposal of adding an oncology extension to the OMOP CDM. These tables and fields will become part of the next release (v6.1) of the Common Data Model. Below are their descriptions; showing additions to the model only. For example, two fields were added to the MEASUREMENT table as part of this extension so only those two fields are listed below for MEASUREMENT instead of the entire table. For more information, please see the OMOP Oncology wiki site.
-
The DDLs for these tables are located on the Oncology github, as detailed in the installation instructions.
-
-
EPISODE
-
Table Description
-
The EPISODE table aggregates lower-level clinical events (VISIT_OCCURRENCE, DRUG_EXPOSURE, PROCEDURE_OCCURRENCE, DEVICE_EXPOSURE) into a higher-level abstraction representing clinically and analytically relevant disease phases/outcomes and treatments. The EPISODE_EVENT table connects qualifying clinical events (VISIT_OCCURRENCE, DRUG_EXPOSURE, PROCEDURE_OCCURRENCE, DEVICE_EXPOSURE) to the appropriate EPISODE entry.
-
ETL Conventions
-
Valid Episode Concepts belong to the ‘Episode’ domain.
Standard Episode Concepts are categorized by concept class: Disease Episode 32528 “Disease First Occurrence” 32529 “Disease Recurrence” 32530 “Disease Remission” 32677 “Disease Progression” Treatment Episode 32531 “Treatment Regimen” 32532 “Treatment Cycle” Episode of Care 32533 “Episode of Care”
The relationship between a disease episode and treatment episodes can be represented by the self-referencing foreign key column EPISODE.episode_parent_id.
A treatment EPISODE can be delivered at regular intervals, cycles or fractions. The parent-child relationship between a treatment episode and its constituent treatment cycles can be represented by the self-referencing foreign key column EPISODE.episode_parent_id. 5 Some episodes may not have links to any underlying clinical events. For such episodes, the EPISODE_EVENT table is not populated.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-FK Class
-
-
-
-
-
-
-episode_id
-
-
-A unique identifier for each Episode event.
-
-
-
-
-bigint
-
-
-Yes
-
-
-Yes
-
-
-No
-
-
-
-
-
-
-
-
-
-
-person_id
-
-
-A foreign key identifier to the Person who is experiencing the episdoe. The demographic details of that Person are stored in the PERSON table.
-
-
-
-
-bigint
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-PERSON
-
-
-
-
-
-
-
-
-episode_concept_id
-
-
-A foreign key that refers to a Standard Concept identifier in the Standardized Vocabularies belonging to the ‘Episode’ domain.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-
-
-Episode
-
-
-
-
-
-
-episode_start_datetime
-
-
-The date and time when the Episode begins.
-
-
-
-
-datetime
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-episode_end_datetime
-
-
-The date when the instance of the Episode is considered to have ended.
-
-
-
-
-datetime
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-episode_parent_id
-
-
-A foreign key that refers to a parent Episode entry representing an entire episode if the episode spans multiple cycles.
-
-
-
-
-bigint
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-episode_number
-
-
-An ordinal count for an Episode that spans multiple times.
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-episode_object_concept_id
-
-
-A foreign key that refers to a concept identifier in the Standardized Vocabularies describing the disease, treatment, or other abstraction that the episode describes. Episode entries from the ‘Disease Episode’ concept class should have an episode_object_concept_id that comes from the Condition domain. Episode entries from the ‘Treatment Episode’ concept class should have an episode_object_concept_id that scome from the ‘Procedure’ or ‘Regimen’ domain.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Procedure, Regimen
-
-
-
-
-
-
-episode_type_concept_id
-
-
-A foreign key to the predefined Concept identifier in the Standardized Vocabularies reflecting the source data from which the Episode was recorded, the level of standardization, and the type of occurrence. These belong to the ‘Episode Type’ vocabulary
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Type Concept
-
-
-
-
-
-
-episode_source_value
-
-
-The source code for the Episdoe as it appears in the source data. This code is mapped to a Standard Condition Concept in the Standardized Vocabularies and the original code is stored here for reference.
-
-
-
-
-varchar(50)
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-episode_source_concept_id
-
-
-A foreign key to a Episdoe Concept that refers to the code used in the source.
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-
-
-
-
-
EPISODE_EVENT
-
Table Description
-
The EPISODE_EVENT table connects qualifying clinical events (VISIT_OCCURRENCE, DRUG_EXPOSURE, PROCEDURE_OCCURRENCE, DEVICE_EXPOSURE) to the appropriate EPISODE entry. The EPISODE_EVENT table supports the linkage of an EPISODE abstraction to the low-level clinical events that implement the EPISODE abstraction.
-
ETL Conventions
-
Some episodes may not have links to any underlying clinical events. For such episodes, the EPISODE_EVENT table is not populated.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-FK Class
-
-
-
-
-
-
-episode_id
-
-
-A foreign key identifier to the Episode that the Episode Event belongs to.
-
-
-
-
-bigint
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-EPISODE
-
-
-Episode
-
-
-
-
-
-
-event_id
-
-
-A foreign key identifier to the underlying event (condition, procedure, measurement, etc.) record in a respective table for which an episode is recorded.
-
-
-
-
-bigint
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-episode_event_field_concept_id
-
-
-A foreign key identifier to the standardized concept corresponding to the table primary key column (condition_occurrence.condition_occurrence_id, procedure_occurrence.procedure_occurrence_id, measurment.measurment_id etc.) where the underlying event is stored.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Metadata
-
-
-
-
-
-
-
-
-
MEASUREMENT
-
Table Description
-
The MEASUREMENT table contains records of Measurement, i.e. structured values (numerical or categorical) obtained through systematic and standardized examination or testing of a Person or Person’s sample. The MEASUREMENT table contains both orders and results of such Measurements as laboratory tests, vital signs, quantitative findings from pathology reports, etc. Measurements are stored as attribute value pairs, with the attribute as the Measurement Concept and the value representing the result. The value can be a Concept (stored in VALUE_AS_CONCEPT), or a numerical value (VALUE_AS_NUMBER) with a Unit (UNIT_CONCEPT_ID).
-
User Guide
-
Measurements differ from Observations in that they require a standardized test or some other activity to generate a quantitative or qualitative result.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-FK Class
-
-
-
-
-
-
-modifier_of_event_id
-
-
-A foreign key identifier to the event (e.g. condition, procedure, episode) record for which the modifier is recorded.
-
-
-
-
-bigint
-
-
-No
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-modifier_of_field_concept_id
-
-
-The concept representing the table field concept that contains the value of the event id for which the modifier is recorded (e.g. CONDITION_OCCURRENCE.condition_occurre nce_id).
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-Metadata
-
-
-
-
-
-
-
-
-
CONCEPT_NUMERIC
-
Table Description
-
In this table, numeric values, units and math operators indicating range limits (less than) corresponding to “numeric” concepts will be stored. It is an extension of the OMOP CDM and vocabulary that supports formal representation of concepts containing numeric values or ranges. This proposal has not yet been ratified by a larger CDM Workgroup. However, it plays a critical role in supporting ETL from tumor registries. NAACCR vocabulary includes concepts representing numeric values or numeric ranges. Often, these concepts also contain measurement units. For example, “Described as less than 1 centimeter (cm)”. In OMOP CDM, these concepts are normally used in Measurement and Observation tables to store value_as_concept_id. Analysis of these data is currently possible only if the user knows exactly which concepts are used to represent range or value, including their respective units. It is not possible to perform analysis on numeric values of these data, nor is it possible to differentiate numeric values by units.
-
-
-
-
-CDM Field
-
-
-User Guide
-
-
-ETL Conventions
-
-
-Datatype
-
-
-Required
-
-
-Primary Key
-
-
-Foreign Key
-
-
-FK Table
-
-
-FK Domain
-
-
-FK Class
-
-
-
-
-
-
-concept_id
-
-
-A foreign key that refers to a respective concept in the Standardized Vocabularies.
-
-
-
-
-integer
-
-
-Yes
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-
-
-value_as_number
-
-
-A value of the concept expressed as a numeric value.
-
-
-
-
-float
-
-
-Yes
-
-
-No
-
-
-No
-
-
-
-
-
-
-
-
-
-
-unit_concept_id
-
-
-A foreign key to a Standard Concept ID of the concept units in the Standardized Vocabularies that belong to the ‘Unit’ domain.
-
-
-
-
-integer
-
-
-No
-
-
-No
-
-
-Yes
-
-
-CONCEPT
-
-
-
-
-
-
-
-
-operator_concept_id
-
-
-A foreign key identifier to the predefined Concept in the Standardized Vocabularies reflecting the mathematical operator that is applied to the value_as_number. Operators are <, <=, =, >=, > and these concepts belong to the ‘Meas Value Operator’ domain.
-
WITH top_level AS (SELECT concept_id, concept_name FROM concept LEFT JOIN concept_ancestor ON concept_id=descendant_concept_id AND ancestor_concept_id!=descendant_concept_id WHERE domain_id=‘Visit’ AND standard_concept=‘S’ AND ancestor_concept_id IS NULL ) SELECT top_level.concept_id, top_level.concept_name, descendant.concept_id, descendant.concept_name FROM concept_ancestor JOIN top_level ON top_level.concept_id = ancestor_concept_id JOIN concept descendant ON descendant.concept_id = descendant_concept_id WHERE descendant.domain_id = ‘Visit’;
This table contains Events where Persons engage with the healthcare system for a duration of time. They are often also called “Encounters”. Visits are defined by a configuration of circumstances under which they occur, such as (i) whether the patient comes to a healthcare institution, the other way around, or the interaction is remote, (ii) whether and what kind of trained medical staff is delivering the service during the Visit, and (iii) whether the Visit is transient or for a longer period involving a stay in bed.
User Guide
@@ -1723,7 +1734,7 @@ VISIT_OCCURRENCE
-
VISIT_DETAIL
+
VISIT_DETAIL
Table Description
The VISIT_DETAIL table is an optional table used to represents details of each record in the parent VISIT_OCCURRENCE table. A good example of this would be the movement between units in a hospital during an inpatient stay or claim lines associated with a one insurance claim. For every record in the VISIT_OCCURRENCE table there may be 0 or more records in the VISIT_DETAIL table with a 1:n relationship where n may be 0. The VISIT_DETAIL table is structurally very similar to VISIT_OCCURRENCE table and belongs to the visit domain.
User Guide
@@ -2288,7 +2299,7 @@ VISIT_OCCURRENCE
-
CONDITION_OCCURRENCE
+
CONDITION_OCCURRENCE
Table Description
This table contains records of Events of a Person suggesting the presence of a disease or medical condition stated as a diagnosis, a sign, or a symptom, which is either observed by a Provider or reported by the patient.
User Guide
@@ -2772,7 +2783,7 @@ No
-
DRUG_EXPOSURE
+
DRUG_EXPOSURE
Table Description
This table captures records about the exposure to a Drug ingested or otherwise introduced into the body. A Drug is a biochemical substance formulated in such a way that when administered to a Person it will exert a certain biochemical effect on the metabolism. Drugs include prescription and over-the-counter medicines, vaccines, and large-molecule biologic therapies. Radiological devices ingested or applied locally do not count as Drugs.
User Guide
@@ -3439,7 +3450,7 @@ No
-
PROCEDURE_OCCURRENCE
+
PROCEDURE_OCCURRENCE
Table Description
This table contains records of activities or processes ordered by, or carried out by, a healthcare provider on the patient with a diagnostic or therapeutic purpose.
User Guide
@@ -3868,7 +3879,7 @@ No
-
DEVICE_EXPOSURE
+
DEVICE_EXPOSURE
Table Description
The Device domain captures information about a person’s exposure to a foreign physical object or instrument which is used for diagnostic or therapeutic purposes through a mechanism beyond chemical action. Devices include implantable objects (e.g. pacemakers, stents, artificial joints), medical equipment and supplies (e.g. bandages, crutches, syringes), other instruments used in medical procedures (e.g. sutures, defibrillators) and material used in clinical care (e.g. adhesives, body material, dental material, surgical material).
User Guide
@@ -4320,7 +4331,7 @@ CONCEPT
-
MEASUREMENT
+
MEASUREMENT
Table Description
The MEASUREMENT table contains records of Measurements, i.e. structured values (numerical or categorical) obtained through systematic and standardized examination or testing of a Person or Person’s sample. The MEASUREMENT table contains both orders and results of such Measurements as laboratory tests, vital signs, quantitative findings from pathology reports, etc. Measurements are stored as attribute value pairs, with the attribute as the Measurement Concept and the value representing the result. The value can be a Concept (stored in VALUE_AS_CONCEPT), or a numerical value (VALUE_AS_NUMBER) with a Unit (UNIT_CONCEPT_ID). The Procedure for obtaining the sample is housed in the PROCEDURE_OCCURRENCE table, though it is unnecessary to create a PROCEDURE_OCCURRENCE record for each measurement if one does not exist in the source data. Measurements differ from Observations in that they require a standardized test or some other activity to generate a quantitative or qualitative result. If there is no result, it is assumed that the lab test was conducted but the result was not captured.
User Guide
@@ -4914,7 +4925,7 @@ No
-
OBSERVATION
+
OBSERVATION
Table Description
The OBSERVATION table captures clinical facts about a Person obtained in the context of examination, questioning or a procedure. Any data that cannot be represented by any other domains, such as social and lifestyle facts, medical history, family history, etc. are recorded here.
User Guide
@@ -5452,7 +5463,7 @@ No
-
DEATH
+
DEATH
Table Description
The death domain contains the clinical event for how and when a Person dies. A person can have up to one record if the source system contains evidence about the Death, such as: Condition in an administrative claim, status of enrollment into a health plan, or explicit record in EHR data.
@@ -5681,7 +5692,7 @@ CONCEPT
-
NOTE
+
NOTE
Table Description
The NOTE table captures unstructured information that was recorded by a provider about a patient in free text (in ASCII, or preferably in UTF8 format) notes on a given date. The type of note_text is CLOB or varchar(MAX) depending on RDBMS.
ETL Conventions
@@ -6108,7 +6119,7 @@ No
-
NOTE_NLP
+
NOTE_NLP
Table Description
The NOTE_NLP table encodes all output of NLP on clinical notes. Each row represents a single extracted term from a note.
@@ -6513,7 +6524,7 @@ No
-
SPECIMEN
+
SPECIMEN
Table Description
The specimen domain contains the records identifying biological samples from a person.
ETL Conventions
@@ -6950,7 +6961,7 @@ No
-
FACT_RELATIONSHIP
+
FACT_RELATIONSHIP
Table Description
The FACT_RELATIONSHIP table contains records about the relationships between facts stored as records in any table of the CDM. Relationships can be defined between facts from the same domain, or different domains. Examples of Fact Relationships include: Person relationships (parent-child), care site relationships (hierarchical organizational structure of facilities within a health system), indication relationship (between drug exposures and associated conditions), usage relationships (of devices during the course of an associated procedure), or facts derived from one another (measurements derived from an associated specimen).
ETL Conventions
@@ -7123,7 +7134,7 @@ CONCEPT
Health System Data Tables
-
LOCATION
+
LOCATION
Table Description
The LOCATION table represents a generic way to capture physical location or address information of Persons and Care Sites.
ETL Conventions
@@ -7371,7 +7382,7 @@ No
-
CARE_SITE
+
CARE_SITE
Table Description
The CARE_SITE table contains a list of uniquely identified institutional (physical or organizational) units where healthcare delivery is practiced (offices, wards, hospitals, clinics, etc.).
ETL Conventions
@@ -7572,7 +7583,7 @@ No
-
PROVIDER
+
PROVIDER
Table Description
The PROVIDER table contains a list of uniquely identified healthcare providers. These are individuals providing hands-on healthcare to patients, such as physicians, nurses, midwives, physical therapists etc.
User Guide
@@ -7969,7 +7980,7 @@ CONCEPT
Health Economics Data Tables
-
PAYER_PLAN_PERIOD
+
PAYER_PLAN_PERIOD
Table Description
The PAYER_PLAN_PERIOD table captures details of the period of time that a Person is continuously enrolled under a specific health Plan benefit structure from a given Payer. Each Person receiving healthcare is typically covered by a health benefit plan, which pays for (fully or partially), or directly provides, the care. These benefit plans are provided by payers, such as health insurances or state or government agencies. In each plan the details of the health benefits are defined for the Person or her family, and the health benefit Plan might change over time typically with increasing utilization (reaching certain cost thresholds such as deductibles), plan availability and purchasing choices of the Person. The unique combinations of Payer organizations, health benefit Plans and time periods in which they are valid for a Person are recorded in this table.
User Guide
@@ -8469,7 +8480,7 @@ CONCEPT
-
COST
+
COST
Table Description
The COST table captures records containing the cost of any medical event recorded in one of the OMOP clinical event tables such as DRUG_EXPOSURE, PROCEDURE_OCCURRENCE, VISIT_OCCURRENCE, VISIT_DETAIL, DEVICE_OCCURRENCE, OBSERVATION or MEASUREMENT.
Each record in the cost table account for the amount of money transacted for the clinical event. So, the COST table may be used to represent both receivables (charges) and payments (paid), each transaction type represented by its COST_CONCEPT_ID. The COST_TYPE_CONCEPT_ID field will use concepts in the Standardized Vocabularies to designate the source (provenance) of the cost data. A reference to the health plan information in the PAYER_PLAN_PERIOD table is stored in the record for information used for the adjudication system to determine the persons benefit for the clinical event.
@@ -9074,7 +9085,7 @@ No
Standardized Derived Elements
-
DRUG_ERA
+
DRUG_ERA
Table Description
A Drug Era is defined as a span of time when the Person is assumed to be exposed to a particular active ingredient. A Drug Era is not the same as a Drug Exposure: Exposures are individual records corresponding to the source when Drug was delivered to the Person, while successive periods of Drug Exposures are combined under certain rules to produce continuous Drug Eras.
ETL Conventions
@@ -9298,7 +9309,7 @@ No
-
DOSE_ERA
+
DOSE_ERA
Table Description
A Dose Era is defined as a span of time when the Person is assumed to be exposed to a constant dose of a specific active ingredient.
ETL Conventions
@@ -9525,7 +9536,7 @@ No
-
CONDITION_ERA
+
CONDITION_ERA
Table Description
A Condition Era is defined as a span of time when the Person is assumed to have a given condition. Similar to Drug Eras, Condition Eras are chronological periods of Condition Occurrence. Combining individual Condition Occurrences into a single Condition Era serves two purposes:
@@ -9731,7 +9742,7 @@ No
Metadata Tables
-
METADATA
+
METADATA
Table Description
The METADATA table contains metadata information about a dataset that has been transformed to the OMOP Common Data Model.
@@ -9949,7 +9960,7 @@ No
-
CDM_SOURCE
+
CDM_SOURCE
Table Description
The CDM_SOURCE table contains detail about the source database and the process used to transform the data into the OMOP Common Data Model.
@@ -10249,7 +10260,7 @@ No
Vocabulary Tables
-
CONCEPT
+
CONCEPT
Table Description
The Standardized Vocabularies contains records, or Concepts, that uniquely identify each fundamental unit of meaning used to express clinical information in all domain tables of the CDM. Concepts are derived from vocabularies, which represent clinical information across a domain (e.g. conditions, drugs, procedures) through the use of codes and associated descriptions. Some Concepts are designated Standard Concepts, meaning these Concepts can be used as normative expressions of a clinical entity within the OMOP Common Data Model and within standardized analytics. Each Standard Concept belongs to one domain, which defines the location where the Concept would be expected to occur within data tables of the CDM.
Concepts can represent broad categories (like ‘Cardiovascular disease’), detailed clinical elements (‘Myocardial infarction of the anterolateral wall’) or modifying characteristics and attributes that define Concepts at various levels of detail (severity of a disease, associated morphology, etc.).
@@ -10554,7 +10565,7 @@ No
-
VOCABULARY
+
VOCABULARY
Table Description
The VOCABULARY table includes a list of the Vocabularies collected from various sources or created de novo by the OMOP community. This reference table is populated with a single record for each Vocabulary source and includes a descriptive name and other associated attributes for the Vocabulary.
@@ -10725,7 +10736,7 @@ CONCEPT
-
DOMAIN
+
DOMAIN
Table Description
The DOMAIN table includes a list of OMOP-defined Domains the Concepts of the Standardized Vocabularies can belong to. A Domain defines the set of allowable Concepts for the standardized fields in the CDM tables. For example, the “Condition” Domain contains Concepts that describe a condition of a patient, and these Concepts can only be stored in the condition_concept_id field of the CONDITION_OCCURRENCE and CONDITION_ERA tables. This reference table is populated with a single record for each Domain and includes a descriptive name for the Domain.
@@ -10844,7 +10855,7 @@ CONCEPT
-
CONCEPT_CLASS
+
CONCEPT_CLASS
Table Description
The CONCEPT_CLASS table is a reference table, which includes a list of the classifications used to differentiate Concepts within a given Vocabulary. This reference table is populated with a single record for each Concept Class.
@@ -10963,7 +10974,7 @@ CONCEPT
-
CONCEPT_RELATIONSHIP
+
CONCEPT_RELATIONSHIP
Table Description
The CONCEPT_RELATIONSHIP table contains records that define direct relationships between any two Concepts and the nature or type of the relationship. Each type of a relationship is defined in the RELATIONSHIP table.
@@ -11160,7 +11171,7 @@ No
-
RELATIONSHIP
+
RELATIONSHIP
Table Description
The RELATIONSHIP table provides a reference list of all types of relationships that can be used to associate any two concepts in the CONCEPT_RELATIONSHP table.
@@ -11356,7 +11367,7 @@ CONCEPT
-
CONCEPT_SYNONYM
+
CONCEPT_SYNONYM
Table Description
The CONCEPT_SYNONYM table is used to store alternate names and descriptions for Concepts.
@@ -11473,7 +11484,7 @@ CONCEPT
-
CONCEPT_ANCESTOR
+
CONCEPT_ANCESTOR
Table Description
The CONCEPT_ANCESTOR table is designed to simplify observational analysis by providing the complete hierarchical relationships between Concepts. Only direct parent-child relationships between Concepts are stored in the CONCEPT_RELATIONSHIP table. To determine higher level ancestry connections, all individual direct relationships would have to be navigated at analysis time. The CONCEPT_ANCESTOR table includes records for all parent-child relationships, as well as grandparent-grandchild relationships and those of any other level of lineage. Using the CONCEPT_ANCESTOR table allows for querying for all descendants of a hierarchical concept. For example, drug ingredients and drug products are all descendants of a drug class ancestor.
This table is entirely derived from the CONCEPT, CONCEPT_RELATIONSHIP and RELATIONSHIP tables.
@@ -11620,7 +11631,7 @@ No
-
SOURCE_TO_CONCEPT_MAP
+
SOURCE_TO_CONCEPT_MAP
Table Description
The source to concept map table is a legacy data structure within the OMOP Common Data Model, recommended for use in ETL processes to maintain local source codes which are not available as Concepts in the Standardized Vocabularies, and to establish mappings for each source code into a Standard Concept as target_concept_ids that can be used to populate the Common Data Model tables. The SOURCE_TO_CONCEPT_MAP table is no longer populated with content within the Standardized Vocabularies published to the OMOP community.
@@ -11898,7 +11909,7 @@ No
-
DRUG_STRENGTH
+
DRUG_STRENGTH
Table Description
The DRUG_STRENGTH table contains structured content about the amount or concentration and associated units of a specific ingredient contained within a particular drug product. This table is supplemental information to support standardized analysis of drug utilization.
@@ -12231,7 +12242,419 @@ No
invalid_reason
-
Reason the concept was invalidated. Possible values are t
+Reason the concept was invalidated. Possible values are D (deleted), U (replaced with an update) or NULL when valid_end_date has the default value.
+
+
+
+
+varchar(1)
+
+
+No
+
+
+No
+
+
+No
+
+
+
+
+
+
+
+
+
+
+
COHORT_DEFINITION
+
Table Description
+
The COHORT_DEFINITION table contains records defining a Cohort derived from the data through the associated description and syntax and upon instantiation (execution of the algorithm) placed into the COHORT table. Cohorts are a set of subjects that satisfy a given combination of inclusion criteria for a duration of time. The COHORT_DEFINITION table provides a standardized structure for maintaining the rules governing the inclusion of a subject into a cohort, and can store operational programming code to instantiate the cohort within the OMOP Common Data Model.
+
+
+
+
+CDM Field
+
+
+User Guide
+
+
+ETL Conventions
+
+
+Datatype
+
+
+Required
+
+
+Primary Key
+
+
+Foreign Key
+
+
+FK Table
+
+
+FK Domain
+
+
+
+
+
+
+cohort_definition_id
+
+
+This is the identifier given to the cohort, usually by the ATLAS application
+
+
+
+
+integer
+
+
+Yes
+
+
+No
+
+
+No
+
+
+
+
+
+
+
+
+cohort_definition_name
+
+
+A short description of the cohort
+
+
+
+
+varchar(255)
+
+
+Yes
+
+
+No
+
+
+No
+
+
+
+
+
+
+
+
+cohort_definition_description
+
+
+A complete description of the cohort.
+
+
+
+
+varchar(MAX)
+
+
+No
+
+
+No
+
+
+No
+
+
+
+
+
+
+
+
+definition_type_concept_id
+
+
+Type defining what kind of Cohort Definition the record represents and how the syntax may be executed.
+
+
+
+
+integer
+
+
+Yes
+
+
+No
+
+
+Yes
+
+
+CONCEPT
+
+
+
+
+
+
+cohort_definition_syntax
+
+
+Syntax or code to operationalize the Cohort Definition.
+
+
+
+
+varchar(MAX)
+
+
+No
+
+
+No
+
+
+No
+
+
+
+
+
+
+
+
+subject_concept_id
+
+
+This field contains a Concept that represents the domain of the subjects that are members of the cohort (e.g., Person, Provider, Visit).
+
+
+
+
+integer
+
+
+Yes
+
+
+No
+
+
+Yes
+
+
+CONCEPT
+
+
+
+
+
+
+cohort_initiation_date
+
+
+A date to indicate when the Cohort was initiated in the COHORT table.
+
+
+
+
+date
+
+
+No
+
+
+No
+
+
+No
+
+
+
+
+
+
+
+
+
+
+
ATTRIBUTE_DEFINITION
+
Table Description
+
The ATTRIBUTE_DEFINITION table contains records to define each attribute through an associated description and syntax. Attributes are derived elements that can be selected or calculated for a subject within a cohort. The ATTRIBUTE_DEFINITION table provides a standardized structure for maintaining the rules governing the calculation of covariates for a subject in a cohort, and can store operational programming code to instantiate the attributes for a given cohort within the OMOP Common Data Model.
This table serves as the central identity management for all Persons in the database. It contains records that uniquely identify each person or patient, and some demographic information.
User Guide
@@ -1056,7 +1067,7 @@ CONCEPT
-
OBSERVATION_PERIOD
+
OBSERVATION_PERIOD
Table Description
This table contains records which define spans of time during which two conditions are expected to hold: (i) Clinical Events that happened to the Person are recorded in the Event tables, and (ii) absense of records indicate such Events did not occur during this span of time.
User Guide
@@ -1237,7 +1248,7 @@ Type Concept
-
VISIT_OCCURRENCE
+
VISIT_OCCURRENCE
Table Description
This table contains Events where Persons engage with the healthcare system for a duration of time. They are often also called “Encounters”. Visits are defined by a configuration of circumstances under which they occur, such as (i) whether the patient comes to a healthcare institution, the other way around, or the interaction is remote, (ii) whether and what kind of trained medical staff is delivering the service during the Visit, and (iii) whether the Visit is transient or for a longer period involving a stay in bed.
User Guide
@@ -1760,7 +1771,7 @@ VISIT_OCCURRENCE
-
VISIT_DETAIL
+
VISIT_DETAIL
Table Description
The VISIT_DETAIL table is an optional table used to represents details of each record in the parent VISIT_OCCURRENCE table. A good example of this would be the movement between units in a hospital during an inpatient stay or claim lines associated with a one insurance claim. For every record in the VISIT_OCCURRENCE table there may be 0 or more records in the VISIT_DETAIL table with a 1:n relationship where n may be 0. The VISIT_DETAIL table is structurally very similar to VISIT_OCCURRENCE table and belongs to the visit domain.
User Guide
@@ -2325,7 +2336,7 @@ VISIT_OCCURRENCE
-
CONDITION_OCCURRENCE
+
CONDITION_OCCURRENCE
Table Description
This table contains records of Events of a Person suggesting the presence of a disease or medical condition stated as a diagnosis, a sign, or a symptom, which is either observed by a Provider or reported by the patient.
User Guide
@@ -2808,7 +2819,7 @@ No
-
DRUG_EXPOSURE
+
DRUG_EXPOSURE
Table Description
This table captures records about the exposure to a Drug ingested or otherwise introduced into the body. A Drug is a biochemical substance formulated in such a way that when administered to a Person it will exert a certain biochemical effect on the metabolism. Drugs include prescription and over-the-counter medicines, vaccines, and large-molecule biologic therapies. Radiological devices ingested or applied locally do not count as Drugs.
User Guide
@@ -3475,7 +3486,7 @@ No
-
PROCEDURE_OCCURRENCE
+
PROCEDURE_OCCURRENCE
Table Description
This table contains records of activities or processes ordered by, or carried out by, a healthcare provider on the patient with a diagnostic or therapeutic purpose.
User Guide
@@ -3904,7 +3915,7 @@ No
-
DEVICE_EXPOSURE
+
DEVICE_EXPOSURE
Table Description
The Device domain captures information about a person’s exposure to a foreign physical object or instrument which is used for diagnostic or therapeutic purposes through a mechanism beyond chemical action. Devices include implantable objects (e.g. pacemakers, stents, artificial joints), medical equipment and supplies (e.g. bandages, crutches, syringes), other instruments used in medical procedures (e.g. sutures, defibrillators) and material used in clinical care (e.g. adhesives, body material, dental material, surgical material).
User Guide
@@ -4356,7 +4367,7 @@ CONCEPT
-
MEASUREMENT
+
MEASUREMENT
Table Description
The MEASUREMENT table contains records of Measurements, i.e. structured values (numerical or categorical) obtained through systematic and standardized examination or testing of a Person or Person’s sample. The MEASUREMENT table contains both orders and results of such Measurements as laboratory tests, vital signs, quantitative findings from pathology reports, etc. Measurements are stored as attribute value pairs, with the attribute as the Measurement Concept and the value representing the result. The value can be a Concept (stored in VALUE_AS_CONCEPT), or a numerical value (VALUE_AS_NUMBER) with a Unit (UNIT_CONCEPT_ID). The Procedure for obtaining the sample is housed in the PROCEDURE_OCCURRENCE table, though it is unnecessary to create a PROCEDURE_OCCURRENCE record for each measurement if one does not exist in the source data. Measurements differ from Observations in that they require a standardized test or some other activity to generate a quantitative or qualitative result. If there is no result, it is assumed that the lab test was conducted but the result was not captured.
User Guide
@@ -4950,7 +4961,7 @@ No
-
OBSERVATION
+
OBSERVATION
Table Description
The OBSERVATION table captures clinical facts about a Person obtained in the context of examination, questioning or a procedure. Any data that cannot be represented by any other domains, such as social and lifestyle facts, medical history, family history, etc. are recorded here. New to CDM v6.0 An Observation can now be linked to other records in the CDM instance using the fields OBSERVATION_EVENT_ID and OBS_EVENT_FIELD_CONCEPT_ID. To link another record to an Observation, the primary key goes in OBSERVATION_EVENT_ID (CONDITION_OCCURRENCE_ID, DRUG_EXPOSURE_ID, etc.) and the Concept representing the field where the OBSERVATION_EVENT_ID was taken from go in the OBS_EVENT_FIELD_CONCEPT_ID. For example, a CONDITION_OCCURRENCE of Asthma might be linked to an Observation of a family history of Asthma. In this case the CONDITION_OCCURRENCE_ID of the Asthma record would go in OBSERVATION_EVENT_ID of the family history record and the CONCEPT_ID 1147127 would go in OBS_EVENT_FIELD_CONCEPT_ID to denote that the OBSERVATION_EVENT_ID represents a CONDITION_OCCURRENCE_ID.
User Guide
@@ -5569,7 +5580,7 @@ No
-
NOTE
+
NOTE
Table Description
The NOTE table captures unstructured information that was recorded by a provider about a patient in free text (in ASCII, or preferably in UTF8 format) notes on a given date. The type of note_text is CLOB or varchar(MAX) depending on RDBMS.
ETL Conventions
@@ -6047,7 +6058,7 @@ No
-
NOTE_NLP
+
NOTE_NLP
Table Description
The NOTE_NLP table encodes all output of NLP on clinical notes. Each row represents a single extracted term from a note.
@@ -6452,7 +6463,7 @@ No
-
SPECIMEN
+
SPECIMEN
Table Description
The specimen domain contains the records identifying biological samples from a person.
ETL Conventions
@@ -6889,7 +6900,7 @@ No
-
FACT_RELATIONSHIP
+
FACT_RELATIONSHIP
Table Description
The FACT_RELATIONSHIP table contains records about the relationships between facts stored as records in any table of the CDM. Relationships can be defined between facts from the same domain, or different domains. Examples of Fact Relationships include: Person relationships (parent-child), care site relationships (hierarchical organizational structure of facilities within a health system), indication relationship (between drug exposures and associated conditions), usage relationships (of devices during the course of an associated procedure), or facts derived from one another (measurements derived from an associated specimen).
ETL Conventions
@@ -7059,7 +7070,7 @@ CONCEPT
-
SURVEY_CONDUCT
+
SURVEY_CONDUCT
Table Description
The SURVEY_CONDUCT table is used to store an instance of a completed survey or questionnaire.
User Guide
@@ -7533,7 +7544,7 @@ No
survey_source_value
-The survey name/title as it appears in the source data.
+The survey name as it appears in the source data.
@@ -7747,7 +7758,7 @@ VISIT_OCCURRENCE
Health System Data Tables
-
LOCATION
+
LOCATION
Table Description
The LOCATION table represents a generic way to capture physical location or address information of Persons and Care Sites. New to CDM v6.0 The LOCATION table now includes latitude and longitude.
ETL Conventions
@@ -8047,7 +8058,7 @@ No
-
LOCATION_HISTORY
+
LOCATION_HISTORY
Table Description
The LOCATION HISTORY table stores relationships between Persons or Care Sites and geographic locations over time. This table is new to CDM v6.0
@@ -8246,7 +8257,7 @@ No
-
CARE_SITE
+
CARE_SITE
Table Description
The CARE_SITE table contains a list of uniquely identified institutional (physical or organizational) units where healthcare delivery is practiced (offices, wards, hospitals, clinics, etc.).
ETL Conventions
@@ -8447,7 +8458,7 @@ No
-
PROVIDER
+
PROVIDER
Table Description
The PROVIDER table contains a list of uniquely identified healthcare providers. These are individuals providing hands-on healthcare to patients, such as physicians, nurses, midwives, physical therapists etc.
User Guide
@@ -8844,7 +8855,7 @@ CONCEPT
Health Economics Data Tables
-
PAYER_PLAN_PERIOD
+
PAYER_PLAN_PERIOD
Table Description
The PAYER_PLAN_PERIOD table captures details of the period of time that a Person is continuously enrolled under a specific health Plan benefit structure from a given Payer. Each Person receiving healthcare is typically covered by a health benefit plan, which pays for (fully or partially), or directly provides, the care. These benefit plans are provided by payers, such as health insurances or state or government agencies. In each plan the details of the health benefits are defined for the Person or her family, and the health benefit Plan might change over time typically with increasing utilization (reaching certain cost thresholds such as deductibles), plan availability and purchasing choices of the Person. The unique combinations of Payer organizations, health benefit Plans and time periods in which they are valid for a Person are recorded in this table.
User Guide
@@ -9451,7 +9462,7 @@ CONCEPT
-
COST
+
COST
Table Description
The COST table captures records containing the cost of any medical event recorded in one of the OMOP clinical event tables such as DRUG_EXPOSURE, PROCEDURE_OCCURRENCE, VISIT_OCCURRENCE, VISIT_DETAIL, DEVICE_OCCURRENCE, OBSERVATION or MEASUREMENT.
Each record in the cost table account for the amount of money transacted for the clinical event. So, the COST table may be used to represent both receivables (charges) and payments (paid), each transaction type represented by its COST_CONCEPT_ID. The COST_TYPE_CONCEPT_ID field will use concepts in the Standardized Vocabularies to designate the source (provenance) of the cost data. A reference to the health plan information in the PAYER_PLAN_PERIOD table is stored in the record for information used for the adjudication system to determine the persons benefit for the clinical event.
@@ -10056,7 +10067,7 @@ No
Standardized Derived Elements
-
DRUG_ERA
+
DRUG_ERA
Table Description
A Drug Era is defined as a span of time when the Person is assumed to be exposed to a particular active ingredient. A Drug Era is not the same as a Drug Exposure: Exposures are individual records corresponding to the source when Drug was delivered to the Person, while successive periods of Drug Exposures are combined under certain rules to produce continuous Drug Eras.
ETL Conventions
@@ -10280,7 +10291,7 @@ No
-
DOSE_ERA
+
DOSE_ERA
Table Description
A Dose Era is defined as a span of time when the Person is assumed to be exposed to a constant dose of a specific active ingredient.
ETL Conventions
@@ -10507,7 +10518,7 @@ No
-
CONDITION_ERA
+
CONDITION_ERA
Table Description
A Condition Era is defined as a span of time when the Person is assumed to have a given condition. Similar to Drug Eras, Condition Eras are chronological periods of Condition Occurrence. Combining individual Condition Occurrences into a single Condition Era serves two purposes:
@@ -10713,7 +10724,7 @@ No
Metadata Tables
-
METADATA
+
METADATA
Table Description
The METADATA table contains metadata information about a dataset that has been transformed to the OMOP Common Data Model.
@@ -10931,7 +10942,7 @@ No
-
CDM_SOURCE
+
CDM_SOURCE
Table Description
The CDM_SOURCE table contains detail about the source database and the process used to transform the data into the OMOP Common Data Model.
@@ -11231,7 +11242,7 @@ No
Vocabulary Tables
-
CONCEPT
+
CONCEPT
Table Description
The Standardized Vocabularies contains records, or Concepts, that uniquely identify each fundamental unit of meaning used to express clinical information in all domain tables of the CDM. Concepts are derived from vocabularies, which represent clinical information across a domain (e.g. conditions, drugs, procedures) through the use of codes and associated descriptions. Some Concepts are designated Standard Concepts, meaning these Concepts can be used as normative expressions of a clinical entity within the OMOP Common Data Model and within standardized analytics. Each Standard Concept belongs to one domain, which defines the location where the Concept would be expected to occur within data tables of the CDM.
Concepts can represent broad categories (like ‘Cardiovascular disease’), detailed clinical elements (‘Myocardial infarction of the anterolateral wall’) or modifying characteristics and attributes that define Concepts at various levels of detail (severity of a disease, associated morphology, etc.).
@@ -11536,7 +11547,7 @@ No
-
VOCABULARY
+
VOCABULARY
Table Description
The VOCABULARY table includes a list of the Vocabularies collected from various sources or created de novo by the OMOP community. This reference table is populated with a single record for each Vocabulary source and includes a descriptive name and other associated attributes for the Vocabulary.
@@ -11707,7 +11718,7 @@ CONCEPT
-
DOMAIN
+
DOMAIN
Table Description
The DOMAIN table includes a list of OMOP-defined Domains the Concepts of the Standardized Vocabularies can belong to. A Domain defines the set of allowable Concepts for the standardized fields in the CDM tables. For example, the “Condition” Domain contains Concepts that describe a condition of a patient, and these Concepts can only be stored in the condition_concept_id field of the CONDITION_OCCURRENCE and CONDITION_ERA tables. This reference table is populated with a single record for each Domain and includes a descriptive name for the Domain.
@@ -11826,7 +11837,7 @@ CONCEPT
-
CONCEPT_CLASS
+
CONCEPT_CLASS
Table Description
The CONCEPT_CLASS table is a reference table, which includes a list of the classifications used to differentiate Concepts within a given Vocabulary. This reference table is populated with a single record for each Concept Class.
@@ -11945,7 +11956,7 @@ CONCEPT
-
CONCEPT_RELATIONSHIP
+
CONCEPT_RELATIONSHIP
Table Description
The CONCEPT_RELATIONSHIP table contains records that define direct relationships between any two Concepts and the nature or type of the relationship. Each type of a relationship is defined in the RELATIONSHIP table.
@@ -12142,7 +12153,7 @@ No
-
RELATIONSHIP
+
RELATIONSHIP
Table Description
The RELATIONSHIP table provides a reference list of all types of relationships that can be used to associate any two concepts in the CONCEPT_RELATIONSHP table.
@@ -12333,7 +12344,7 @@ CONCEPT
-
CONCEPT_SYNONYM
+
CONCEPT_SYNONYM
Table Description
The CONCEPT_SYNONYM table is used to store alternate names and descriptions for Concepts.
@@ -12450,7 +12461,7 @@ CONCEPT
-
CONCEPT_ANCESTOR
+
CONCEPT_ANCESTOR
Table Description
The CONCEPT_ANCESTOR table is designed to simplify observational analysis by providing the complete hierarchical relationships between Concepts. Only direct parent-child relationships between Concepts are stored in the CONCEPT_RELATIONSHIP table. To determine higher level ancestry connections, all individual direct relationships would have to be navigated at analysis time. The CONCEPT_ANCESTOR table includes records for all parent-child relationships, as well as grandparent-grandchild relationships and those of any other level of lineage. Using the CONCEPT_ANCESTOR table allows for querying for all descendants of a hierarchical concept. For example, drug ingredients and drug products are all descendants of a drug class ancestor.
This table is entirely derived from the CONCEPT, CONCEPT_RELATIONSHIP and RELATIONSHIP tables.
@@ -12597,7 +12608,7 @@ No
-
SOURCE_TO_CONCEPT_MAP
+
SOURCE_TO_CONCEPT_MAP
Table Description
The source to concept map table is a legacy data structure within the OMOP Common Data Model, recommended for use in ETL processes to maintain local source codes which are not available as Concepts in the Standardized Vocabularies, and to establish mappings for each source code into a Standard Concept as target_concept_ids that can be used to populate the Common Data Model tables. The SOURCE_TO_CONCEPT_MAP table is no longer populated with content within the Standardized Vocabularies published to the OMOP community.
@@ -12875,7 +12886,7 @@ No
-
DRUG_STRENGTH
+
DRUG_STRENGTH
Table Description
The DRUG_STRENGTH table contains structured content about the amount or concentration and associated units of a specific ingredient contained within a particular drug product. This table is supplemental information to support standardized analysis of drug utilization.
@@ -13208,7 +13219,253 @@ No
invalid_reason
-
Reason the concept was invalidated. Possible values are
+Reason the concept was invalidated. Possible values are D (deleted), U (replaced with an update) or NULL when valid_end_date has the default value.
+
+
+
+
+varchar(1)
+
+
+No
+
+
+No
+
+
+No
+
+
+
+
+
+
+
+
+
+
+
COHORT_DEFINITION
+
Table Description
+
The COHORT_DEFINITION table contains records defining a Cohort derived from the data through the associated description and syntax and upon instantiation (execution of the algorithm) placed into the COHORT table. Cohorts are a set of subjects that satisfy a given combination of inclusion criteria for a duration of time. The COHORT_DEFINITION table provides a standardized structure for maintaining the rules governing the inclusion of a subject into a cohort, and can store operational programming code to instantiate the cohort within the OMOP Common Data Model.
+
+
+
+
+CDM Field
+
+
+User Guide
+
+
+ETL Conventions
+
+
+Datatype
+
+
+Required
+
+
+Primary Key
+
+
+Foreign Key
+
+
+FK Table
+
+
+FK Domain
+
+
+
+
+
+
+cohort_definition_id
+
+
+This is the identifier given to the cohort, usually by the ATLAS application
+
+
+
+
+integer
+
+
+Yes
+
+
+No
+
+
+No
+
+
+
+
+
+
+
+
+cohort_definition_name
+
+
+A short description of the cohort
+
+
+
+
+varchar(255)
+
+
+Yes
+
+
+No
+
+
+No
+
+
+
+
+
+
+
+
+cohort_definition_description
+
+
+A complete description of the cohort.
+
+
+
+
+varchar(MAX)
+
+
+No
+
+
+No
+
+
+No
+
+
+
+
+
+
+
+
+definition_type_concept_id
+
+
+Type defining what kind of Cohort Definition the record represents and how the syntax may be executed.
+
+
+
+
+integer
+
+
+Yes
+
+
+No
+
+
+Yes
+
+
+CONCEPT
+
+
+
+
+
+
+cohort_definition_syntax
+
+
+Syntax or code to operationalize the Cohort Definition.
+
+
+
+
+varchar(MAX)
+
+
+No
+
+
+No
+
+
+No
+
+
+
+
+
+
+
+
+subject_concept_id
+
+
+This field contains a Concept that represents the domain of the subjects that are members of the cohort (e.g., Person, Provider, Visit).
+
+
+
+
+integer
+
+
+Yes
+
+
+No
+
+
+Yes
+
+
+CONCEPT
+
+
+
+
+
+
+cohort_initiation_date
+
+
+A date to indicate when the Cohort was initiated in the COHORT table.
+
Year_of_birth, month_of_birth, day_of_birth and birth_datetime are all fields in the Person table designed to capture some form of date of birth. While only year_of_birth is required, these fields allow for maximum flexibility over a wide range of data sources.
6. How are gender, race, and ethnicity captured in the model? Are they coded using values a human reader can understand?
-
Standard Concepts are used to denote all clinical entities throughout the OMOP common data model, including gender, race, and ethnicity. Source values are mapped to Standard Concepts during the extract, transform, load (ETL) process of converting a database to the OMOP Common Data Model. These are then stored in the Gender_concept_id, Race_concept_id and Ethnicity_concept_id fields in the Person table. Because the standard concepts span across all clinical domains, and in keeping with Cimino’s ‘Desiderata for Controlled Medical Vocabularies in the Twenty-First Century’, the identifiers are unique, persistent nonsematic identifiers. Gender, for example, is stored as either 8532 (female) or 8507 (male) in gender_concept_id while the original value from the source is stored in gender_source_value (M, male, F, etc)..
-
**7. Are there conditions/procedures/drugs or other domains that should be masked or hidden in the CDM?
+
Standard Concepts are used to denote all clinical entities throughout the OMOP common data model, including gender, race, and ethnicity. Source values are mapped to Standard Concepts during the extract, transform, load (ETL) process of converting a database to the OMOP Common Data Model. These are then stored in the Gender_concept_id, Race_concept_id and Ethnicity_concept_id fields in the Person table. Because the standard concepts span across all clinical domains, and in keeping with Cimino’s ‘Desiderata for Controlled Medical Vocabularies in the Twenty-First Century’, the identifiers are unique, persistent nonsematic identifiers. Gender, for example, is stored as either 8532 (female) or 8507 (male) in gender_concept_id while the original value from the source is stored in gender_source_value (M, male, F, etc).
+
7. Are there conditions/procedures/drugs or other domains that should be masked or hidden in the CDM?
The masking of information related to a person is dependent on the organization’s privacy policies and may vary by data asset (THEMIS issue #21).
-
7. How is time-varying patient information such as location of residence addressed in the model?
+
8. How is time-varying patient information such as location of residence addressed in the model?
The OMOP common data model has been pragmatically defined based on the desired analytic use cases of the community, as well as the available types of data that community members have access to. Prior to CDM v6.0, each person record had associated demographic attributes which are assumed to be constant for the patient throughout the course of their periods of observation, like location and primary care provider. With the release of CDM v6.0, the Location_History table is now available to track the movements of people, care sites, and providers over time. Only the most recent location_id should be stored in the Person table to eliminate duplication, while the person’s movements are stored in Location_History.
Something like marital status is a little different as it is considered to be an observation rather than a demographic attribute. This means that it is housed in the Observation table rather than the Person table, giving the opportunity to store each change in status as a unique record.
If someone in the community had a use case for time-varying location of residence and also had source data that contains this information, we’d welcome participation in the CDM workgroup to evolve the model further.
-
8. How does the model denote the time period during which a Person’s information is valid?
+
9. How does the model denote the time period during which a Person’s information is valid?
The OMOP Common Data Model uses something called observation periods (stored in the Observation_period table) as a way to define the time span during which a patient is at-risk to have a clinical event recorded. In administrative claims databases, for example, these observation periods are often analogous to the notion of ‘enrollment’.
-
9. How does the model capture start and stop dates for insurance coverage? What if a person’s coverage changes?
+
10. How does the model capture start and stop dates for insurance coverage? What if a person’s coverage changes?
The Payer_plan_period table captures details of the period of time that a Person is continuously enrolled under a specific health Plan benefit structure from a given Payer. Payer plan periods, as opposed to observation periods, can overlap so as to denote the time when a Person is enrolled in multiple plans at the same time such as Medicare Part A and Medicare Part D.
-
10. What if I have EHR data? How would I create observation periods?
+
11. What if I have EHR data? How would I create observation periods?
An observation period is considered as the time at which a patient is at-risk to have a clinical event recorded in the source system. Determining the appropriate observation period for each source data can vary, depending on what information the source contains. If a source does not provide information about a patient’s entry or exit from a system, then reasonable heuristics need to be developed and applied within the ETL.
Vocabulary Mapping
-
11. Do I have to map my source codes to Standard Concepts myself? Are there vocabulary mappings that already exist for me to leverage?
+
12. Do I have to map my source codes to Standard Concepts myself? Are there vocabulary mappings that already exist for me to leverage?
If your data use any of the 55 source vocabularies that are currently supported, the mappings have been done for you. The full list is available from the open-source ATHENA tool under the download tab (see below). You can choose to download the ten vocabulary tables from there as well – you will need a copy in your environment if you plan on building a CDM.
The ATHENA tool also allows you to explore the vocabulary before downloading it if you are curious about the mappings or if you have a specific code in mind and would like to know which standard concept it is associated with; just click on the search tab and type in a keyword to begin searching.
-
12. If I want to apply the mappings myself, can I do so? Are they transparent to all users?
+
13. If I want to apply the mappings myself, can I do so? Are they transparent to all users?
Yes, all mappings are available in the Concept_relationship table (which can be downloaded from ATHENA). Each value in a supported source terminology is assigned a Concept_id (which is considered non-standard). Each Source_concept_id will have a mapping to a Standard_concept_id. For example:
In this case the standard SNOMED concept 201826 for type 2 diabetes mellitus would be stored in the Condition_occurrence table as the Condition_concept_id and the ICD10CM concept 1567956 for type 2 diabetes mellitus would be stored as the Condition_source_concept_id.
-
13. Can RXNorm codes be stored in the model? Can I store multiple levels if I so choose? What if one collaborator uses a different level of RXNorm than I use when transforming their database?
+
14. Can RXNorm codes be stored in the model? Can I store multiple levels if I so choose? What if one collaborator uses a different level of RXNorm than I use when transforming their database?
In the OMOP Common Data Model RXNorm is considered the standard vocabulary for representing drug exposures. One of the great things about the Standardized Vocabulary is that the hierarchical nature of RXNorm is preserved to enable efficient querying. It is agreed upon best practice to store the lowest level RXNorm available and then use the Vocabulary to explore any pertinent relationships. Drug ingredients are the highest-level ancestors so a query for the descendants of an ingredient should turn up all drug products (Clinical Drug or Branded Drug) containing that ingredient. A query designed in this way will find drugs of interest in any CDM regardless of the level of RXNorm used.
-
14. What if the vocabulary has a mapping I don’t agree with? Can it be changed?
+
15. What if the vocabulary has a mapping I don’t agree with? Can it be changed?
Yes, that is the beauty of the community! If you find a mapping in the vocabulary that doesn’t seem to belong or that you think could be better, feel free to write a note on the forums or on the vocabulary github. If the community agrees with your assessment it will be addressed in the next vocabulary version.
-
15. What if I have source codes that are specific to my site? How would these be mapped?
+
16. What if I have source codes that are specific to my site? How would these be mapped?
In the OMOP Vocabulary there is an empty table called the Source_to_concept_map. It is a simple table structure that allows you to establish mapping(s) for each source code with a standard concept in the OMOP Vocabulary (TARGET_CONCEPT_ID). This work can be facilitated by the OHDSI tool Usagi (pictured below) which searches for text similarity between your source code descriptions and the OMOP Vocabulary and exports mappings in a SOURCE_TO_CONCEPT_MAP table structure. Example Source_to_concept_map files can be found here. These generated Source_to_concept_map files are then loaded into the OMOP Vocabulary’s empty Source_to_concept_map prior to processing the native data into the CDM so that the CDM builder can use them in a build.
If an source code is not supported by the OMOP Vocabulary, one can create a new records in the CONCEPT table, however the CONCEPT_IDs should start >2000000000 so that it is easy to tell between the OMOP Vocabulary concepts and the site specific concepts. Once those concepts exist CONCEPT_RELATIONSHIPS can be generated to assign them to a standard terminologies, USAGI can facilitate this process as well (THEMIS issue #22).
-
16. How are one-to-many mappings applied?
+
17. How are one-to-many mappings applied?
If one source code maps to two Standard Concepts then two rows are stored in the corresponding clinical event table.
-
17. What if I want to keep my original data as well as the mapped values? Is there a way for me to do that?
+
18. What if I want to keep my original data as well as the mapped values? Is there a way for me to do that?
Yes! Source values and Source Concepts are fully maintained within the OMOP Common Data Model. A Source Concept represents the code in the source data. Each Source Concept is mapped to one or more Standard Concepts during the ETL process and both are stored in the corresponding clinical event table. If no mapping is available, the Standard Concept with the concept_id = 0 is written into the *_concept_id field (Condition_concept_id, Procedure_concept_id, etc.) so as to preserve the record from the native data.
Common Data Model Versioning
-
18. Who decides when and how to change the data model?
+
19. Who decides when and how to change the data model?
The community! There is a working group designed around updating the model and everything is done by consensus. Members submit proposed changes to the github in the form of issues and the group meets once a month to discuss and vote on the changes. Any ratified proposals are then added to the queue for a future version of the Common Data Model.
-
19. Are changes to the model backwards compatible?
+
20. Are changes to the model backwards compatible?
Generally point version changes (5.1 -> 5.2) are backwards compatible and major version changes (4.0 -> 5.0) may not be. All updates to the model are listed in the release notes for each version and anything that could potentially affect backwards compatibility is clearly labeled.
-
20. How frequently does the model change?
+
21. How frequently does the model change?
The current schedule is for major versions to be released every year and point versions to be release every quarter though that is subject to the needs of the community.
-
21. What is the dissemination plan for changes?
+
22. What is the dissemination plan for changes?
Changes are first listed in the release notes on the github and in the common data model wiki. New versions are also announced on the weekly community calls and on the community forums.
OHDSI Tools
-
22. What are the currently available analytic tools?
+
23. What are the currently available analytic tools?
While there are a variety of tools freely available from the community, these are the most widely used:
ACHILLES – a stand-alone tool for database characterization
RabbitInAHat - an application for interactive design of an ETL to the OMOP Common Data Model with the help of the the scan report generated by White Rabbit
Usagi - an application to help create mappings between coding systems and the Vocabulary standard concepts.
-
23. Who is responsible for updating the tools to account for data model changes, bugs, and errors?
+
24. Who is responsible for updating the tools to account for data model changes, bugs, and errors?
The community! All the tools are open source meaning that anyone can submit an issue they have found, offer suggestions, and write code to fix the problem.
-
24. Do the current tools allow a user to define a treatment gap (persistence window) of any value when creating treatment episodes?
+
25. Do the current tools allow a user to define a treatment gap (persistence window) of any value when creating treatment episodes?
Yes – the ATLAS tool allows you to specify a persistence window between drug exposures when defining a cohort (see image below).
-
-
25. Can the current tools identify medication use during pregnancy?
+
+
26. Can the current tools identify medication use during pregnancy?
Yes, you can identify pregnancy markers from various clinical domains, including conditions and procedures, for example ‘live birth’, and then define temporal logic to look for drug exposure records in some interval prior to the pregnancy end. In addition, members of the community have built an advanced logic to define pregnancy episodes with all pregnancy outcomes represented, which can be useful for this type of research.
-
26. Do the current tools execute against the mapped values or source values?
+
27. Do the current tools execute against the mapped values or source values?
The tools can execute against both source and mapped values, though mapped values are strongly encouraged. Since one of the aims of OHDSI is to create a distributed data network across the world on which to run research studies, the use of source values fails to take advantage of the benefits of the Common Data Model.
Network Research Studies
-
27. Who can generate requests?
+
28. Who can generate requests?
Anyone in the community! Any question that gains enough interest and participation can be a network research study.
-
28. Who will develop the queries to distribute to the network?
+
29. Who will develop the queries to distribute to the network?
Typically a principal investigator leads the development of a protocol. The PI may also lead the development of the analysis procedure corresponding to the protocol. If the PI does not have the technical skills required to write the analysis procedure that implements the protocol, someone in the community can help them put it together.
-
29. What language are the queries written in?
+
30. What language are the queries written in?
Queries are written in R and SQL. The SqlRender package can translate any query written in a templated SQL Server-like dialect to any of the supported RDBMS environments, including Postgresql, Oracle, Redshift, Parallel Data Warehouse, Hadoop Impala, Google BigQuery, and Netezza.
-
30. How do the queries get to the data partners and how are they run once there?
+
31. How do the queries get to the data partners and how are they run once there?
OHDSI runs as a distributed data network. All analyses are publicly available and can be downloaded to run at each site. The packages can be run locally and, at the data partner’s discretion, aggregate results can be shared with the study coordinator.
Data partners can also make use of one of OHDSI’s open-source tools called ARACHNE, a tool to facilitate distributed network analytics against the OMOP CDM.
This documentation details the ratified proposal of adding an oncology extension to the OMOP CDM. These tables and fields will become part of the next release (v6.1) of the Common Data Model. Below are their descriptions; showing additions to the model only. For example, two fields were added to the MEASUREMENT table as part of this extension so only those two fields are listed below for MEASUREMENT instead of the entire table. For more information, please see the OMOP Oncology wiki site.
The DDLs for these tables are located on the Oncology github, as detailed in the installation instructions.
-
EPISODE
+
EPISODE
Table Description
The EPISODE table aggregates lower-level clinical events (VISIT_OCCURRENCE, DRUG_EXPOSURE, PROCEDURE_OCCURRENCE, DEVICE_EXPOSURE) into a higher-level abstraction representing clinically and analytically relevant disease phases/outcomes and treatments. The EPISODE_EVENT table connects qualifying clinical events (VISIT_OCCURRENCE, DRUG_EXPOSURE, PROCEDURE_OCCURRENCE, DEVICE_EXPOSURE) to the appropriate EPISODE entry.
ETL Conventions
@@ -840,7 +851,7 @@ CONCEPT
-
EPISODE_EVENT
+
EPISODE_EVENT
Table Description
The EPISODE_EVENT table connects qualifying clinical events (VISIT_OCCURRENCE, DRUG_EXPOSURE, PROCEDURE_OCCURRENCE, DEVICE_EXPOSURE) to the appropriate EPISODE entry. The EPISODE_EVENT table supports the linkage of an EPISODE abstraction to the low-level clinical events that implement the EPISODE abstraction.
ETL Conventions
@@ -973,7 +984,7 @@ Metadata
-
MEASUREMENT
+
MEASUREMENT
Table Description
The MEASUREMENT table contains records of Measurement, i.e. structured values (numerical or categorical) obtained through systematic and standardized examination or testing of a Person or Person’s sample. The MEASUREMENT table contains both orders and results of such Measurements as laboratory tests, vital signs, quantitative findings from pathology reports, etc. Measurements are stored as attribute value pairs, with the attribute as the Measurement Concept and the value representing the result. The value can be a Concept (stored in VALUE_AS_CONCEPT), or a numerical value (VALUE_AS_NUMBER) with a Unit (UNIT_CONCEPT_ID).
User Guide
@@ -1076,7 +1087,7 @@ Metadata
-
CONCEPT_NUMERIC
+
CONCEPT_NUMERIC
Table Description
In this table, numeric values, units and math operators indicating range limits (less than) corresponding to “numeric” concepts will be stored. It is an extension of the OMOP CDM and vocabulary that supports formal representation of concepts containing numeric values or ranges. This proposal has not yet been ratified by a larger CDM Workgroup. However, it plays a critical role in supporting ETL from tumor registries. NAACCR vocabulary includes concepts representing numeric values or numeric ranges. Often, these concepts also contain measurement units. For example, “Described as less than 1 centimeter (cm)”. In OMOP CDM, these concepts are normally used in Measurement and Observation tables to store value_as_concept_id. Analysis of these data is currently possible only if the user knows exactly which concepts are used to represent range or value, including their respective units. It is not possible to perform analysis on numeric values of these data, nor is it possible to differentiate numeric values by units.