← Methods repository
CONCEPTADVANCEDPYTHON · R · SASlast reviewed 2026-08-24 · updated 2026-10-07 · 4 citations

CDISC Controlled Terminology for RWE Submissions

CDISC Controlled Terminology (CT) is the versioned codelist package — published quarterly by CDISC in partnership with NCI-EVS — that supplies every coded value used in an SDTM or ADaM submission (route, location, frequency, severity, unit-of-measure mappings to UCUM, PARAMCDs, and so on); for RWE it also pins the version of MedDRA, WHODrug, and LOINC used to translate raw claims/EHR/registry codes into the submission vocabulary, with every version lock recorded in define.xml and the ADRG.

Data Standardcdisccontrolled-terminologysubmission-standardsmeddrawhodrugloincucumicd-10-cm
On this page
Methods reference only. Use primary source citations and local policy before applying this in a study protocol, regulatory submission, payer dossier, or clinical decision.
In plain language

CDISC Controlled Terminology is the official values list that every coded field in an FDA submission must use. SDTM and ADaM define the structure of a variable; CT defines what the value has to be — every route, every unit, every severity grade comes from a CDISC-published list or from a partner vocabulary like MedDRA, WHODrug, LOINC, or UCUM. For real-world data the version pin is the audit signal that the translation from raw claims or EHR codes was performed against a fixed, named vocabulary release, not re-coded mid-study.

When to use it
—Always use the full set for an FDA submission. A single-source approach will fail Pinnacle 21 conformance.
—Always for FDA submissions. Re-coding midstream breaks traceability.
—Keep ICD-10-CM in MH domain; translate to MedDRA PT for AE domain. Document the mapping in the ADRG.
Watch out for
—Multiple version pins to manage; the locked versions must be carried into define.xml and the ADRG.
—Means the analysis is frozen at the chosen version even if a newer release adds a clinically important term; the fix is a pre-specified change in a protocol amendment.
—ICD-10-CM codes lack the granular PT structure MedDRA reviewers use for safety analysis. FDA expects MedDRA-coded AEs.

CDISC Controlled Terminology (CT)

is the set of machine-readable codelists CDISC publishes alongside SDTM and ADaM: for every SDTM variable flagged "(CT)" in the IG, permissible values are drawn from a published codelist (e.g., RACE, SEX, UNIT, ROUTE of administration, DOSAGE FORM, frequency, disposition reason). CT is versioned quarterly; the FDA Data Standards Catalog names which CT version applies to submissions received in a given window. Alongside CDISC CT, submission packages rely on partner terminologies: MedDRA for adverse events and medical history, WHODrug for medications, LOINC for laboratory tests, UCUM for units — each with its own version governance.

Why it matters for RWE

Real-world data arrives coded in source vocabularies — ICD-10-CM diagnosis codes, NDC drug codes, CPT/HCPCS procedures, SNOMED CT in EHRs, local lab panels. None of these are submission terminologies. Mapping RWD into SDTM/ADaM therefore always involves a two-stage vocabulary pipeline: source code → intermediate standard (often already done by the data vendor) → submission terminology (MedDRA PT, WHODrug B3 format, CDISC CT submission values). Each arrow is a lossy, versioned transformation that a regulatory reviewer may want to inspect, so the pipeline must be recorded — in SUPPQUAL variables preserving the source value, and in define.xml algorithms documenting the translation.

Operational mapping decisions in RWD

  • Diagnoses → MedDRA: ICD-10-CM codes for incident events mapped to MedDRA preferred terms for AE/MH domains. Verbatim terms should preserve the source description; the MSSO browser's ICD-to-MedDRA mappings help, but ambiguous cases (an ICD code covering several PTs) require documented rules.
  • Dispensings → WHODrug: NDC → generic ingredient/dosage form via a maintained cross-reference, then WHODrug B3 coding for CM/EX. NDCs are repackaged and reused — pin the NDC directory version and document it.
  • Labs → LOINC + UCUM: EHR result strings and local codes mapped to LOINC; units harmonized to UCUM with conversion factors recorded.
  • Submission-value enforcement: SDTM --DECOD/--TESTCD variables carry controlled submission values; free-text --TERM carries the source verbatim. Both are needed; collapsing them destroys traceability.

Version governance

  • Lock versions at build time: MedDRA, WHODrug, LOINC, UCUM, and CDISC CT versions are stamped into define.xml and the ADRG. Re-coding after a MedDRA annual release is a documented version change, not a silent update.
  • Extensible codelists: some codelists (e.g., certain --CAT values) permit sponsor extensions ("EXTENSIBLE"); extensions require justification and reviewer burden. Never invent values inside non-extensible codelists — the conformance validator rejects them.
  • Cross-version consistency: multi-study RWE packages spanning years may carry different MedDRA versions per study; document per-dataset versions rather than force-unifying.

Pros, cons, and trade-offs

  • vs free-text values: controlled terms let the Pinnacle 21 validator machine-check the whole package; free text is flexible but unverifiable at scale.
  • vs sponsor-defined terms everywhere: standard terms travel without explanation; use extensible-codelist extensions only where no standard term exists.
  • Trade-off: granularity vs coding effort — ICD-10-CM→MedDRA loses specificity; keep the source code in SUPPQUAL rather than inventing non-standard terms.

When NOT to use

Not as a substitute for source-vocabulary fidelity — preserve original ICD/NDC/local values in SUPPQUAL whenever the controlled term is coarser. And do not mix terminology versions mid-package; lock, document, finish.

Decision diagram

flowchart LR
  R[Raw RWD codes<br/>ICD-10-CM, NDC, LOINC, SNOMED] --> T[Translate to CDISC CT values<br/>using locked package versions]
  T --> CT[CDISC CT quarterly release]
  T --> MD[MedDRA preferred terms]
  T --> WD[WHODrug preferred names]
  T --> LC[LOINC codes]
  T --> UC[UCUM units]
  CT --> L[Lock versions in define.xml + ADRG]
  MD --> L
  WD --> L
  LC --> L
  UC --> L
  L --> V[Pinnacle 21 conformance<br/>against locked versions]
  V --> F[FDA submission<br/>package]
RWD source codes translate to CDISC CT and partner-terminology values; the version locks flow into define.xml and the ADRG and validate against Pinnacle 21.

Worked example

Scenario

We need to lock the controlled terminology versions for an FDA submission built from a claims-derived SDTM. Three version pins must be recorded: the CDISC CT package version used to populate EXROUTE, AESEV, AGEU, PARAMCD and similar values; the MedDRA version used to translate ICD-10-CM diagnoses into MedDRA preferred terms for the AE and MH domains; and the WHODrug version used to translate NDC codes into preferred drug names for the EX and CM domains. All three go into define.xml codelist metadata and the ADRG narrative.

Dataset

Three terminology version locks for a claims-derived SDTM submission.

vocabularypackageversion_lockedused_forwhere_recorded
CDISC CT - 2024-09-26 quarterly release - 2024-09-26 - EXROUTEAESEVAGEUPARAMCD... - define.xml codelist + ADRG
MedDRA - MSSO biannual release - MedDRA 27.1 (Sep 2024) - AE and MH coded values - define.xml + SDRG + ADRG
WHODrug Global - UMC biannual release - C3 format2024-09 release - EXTRT and CMTRT for medications - define.xml + ADRG
UCUM - stable - current as of build - LBORRESUVSORRESUEXDOSU - define.xml variable metadata
ICD-10-CM (US) - annual release (CDC/NCHS) - FY2024 - AETERM / MHDECOD source vocabulary - define.xml algorithm + ADRG

Steps

1Pick the CDISC CT package version aligned with the submission window per the FDA Data Standards Catalog and lock it.
2Translate raw ICD-10-CM codes to MedDRA preferred terms using the chosen MedDRA version; record the translation date and dictionary version in define.xml and the ADRG.
3Translate raw NDC codes to WHODrug preferred drug names using the chosen WHODrug version (C3 format); record the version and re-coding policy in define.xml.
4Standardize all unit values to UCUM (case-correct); record the UCUM version in define.xml variable metadata.
5Run Pinnacle 21 conformance against the locked versions; warnings on extensible codelists are acceptable with documented rationale; errors block submission.

Result

All five vocabulary versions are pinned: CDISC CT 2024-09-26, MedDRA 27.1, WHODrug Global 2024-09 (C3), UCUM current, ICD-10-CM FY2024. The ADRG narrative records each lock; the define.xml codelist metadata carries the versions into the submission package; the Pinnacle 21 run validates against them. A reviewer can re-derive any coded value.

Trade-offs

vs. Single source terminology (e.g., MedDRA only)
Pros of this
—CDISC CT + partner terminologies covers every coded value the submission needs — diagnoses (ICD-10-CM / MedDRA), drugs (WHODrug), labs (LOINC), units (UCUM), plus the CDISC-native codelists for severity, route, location, and analysis parameters.
vs. Re coding midstream
Pros of this
—Version locking at SDTM build time gives an honest trace from raw source code to submitted value; reviewers can re-derive any coded value with the same dictionary version.
vs. ICD 10 CM only (no MedDRA translation)
Pros of this
—ICD-10-CM is the source vocabulary in US claims; preserving it as-is keeps the trace simple. But MedDRA is what reviewers expect in the AE domain.

Runnable example

Loads the CDISC CT package and materializes a version-lock metadata object that goes into define.xml and the ADRG.

requires: pandas · openpyxl
import pandas as pd
import json, zipfile

# Lock the CT package version at SDTM build time.
CDISC_CT_VERSION   = "2024-09-26"   # CDISC CT quarterly release
MEDDRA_VERSION     = "27.1"          # MSSO biannual release
WHODRUG_VERSION    = "2024-09"       # UMC biannual release, C3 format
UCUM_VERSION       = "current"

def load_cdisc_ct(ct_zip_path: str) -> dict:
    # Returns a {codelist_name: [submission_values]} dict from the CDISC CT Excel/CSV inside the zip.
    with zipfile.ZipFile(ct_zip_path) as zf:
        # The CDISC CT package publishes a single spreadsheet; load it and index by codelist name.
        ct_file = [n for n in zf.namelist() if n.endswith((".xlsx", ".csv"))][0]
        df = pd.read_csv(zf.open(ct_file)) if ct_file.endswith(".csv") \
            else pd.read_excel(zf.open(ct_file))
    return {row["Codelist Name"]: row["CDISC Submission Value"]
            for _, row in df.iterrows()}

def build_define_metadata() -> dict:
    # Materialize the version-lock metadata that goes into define.xml + ADRG.
    return {
        "cdisc_ct":    {"package": "CDISC CT",   "version": CDISC_CT_VERSION},
        "meddra":      {"package": "MedDRA",     "version": MEDDRA_VERSION},
        "whodrug":     {"package": "WHODrug",    "version": WHODRUG_VERSION},
        "ucum":        {"package": "UCUM",       "version": UCUM_VERSION},
    }

Citations

FOUNDATIONAL / METHODS
  1. [1]CDISC. Controlled Terminology. CDISC standards.
  2. [2]U.S. Food and Drug Administration. Providing Regulatory Submissions in Electronic Format — Standardized Study Data. FDA Guidance for Industry.
  3. [3]MedDRA MSSO. MedDRA Support Documentation. Medical Dictionary for Regulatory Activities, Maintenance and Support Services Organization.
APPLIED EXAMPLES
  1. [4]Muhlbradt EE, Li JV, Whiteman L, Remennik L. NCI-EVS: Building the Semantic Infrastructure to Support CDISC Data Standards and Real-World Data. Journal of the Society for Clinical Data Management. 2023;3(1).