Build with USDM

USDM Examples

Three fully worked USDM examples — a two-arm parallel design, a Schedule of Activities with a PK sub-timeline, and a conditional (decision-branching) visit — explained end to end.

Example 1: A parallel two-arm design

This is the canonical "hello world" of USDM: a Phase 1, two-arm, parallel design with three epochs (Screening, Treatment, Follow-up). It exercises exactly the relationships covered in USDM Relationships.

Screen Epoch Treatment Epoch Follow-up Epoch Arm A Arm B ScreeningElement Drug AElement Follow-upElement ScreeningElement PlaceboElement Follow-upElement StudyCell
Study Cell = the intersection of a StudyArm and a StudyEpoch. Each cell holds one or more StudyElements describing the treatment strategy.

The design needs: 2 StudyArms, 3 StudyEpochs (chained with previous/next), 6 StudyCells (one per arm/epoch pair), and 4 StudyElements (Screening, Drug, Placebo, Follow-up — Screening and Follow-up are reused across both arms). Download the complete worked JSON below to see every id and cross-reference filled in.

Example 2: Schedule of Activities with a PK sub-timeline

A common real-world complication: a protocol footnote says "PK blood samples: predose, 1h post-dose, 24h post-dose" for a single visit. Flattening that into the main timeline as three separate visits would be wrong — it's really one visit (Dosing Day) with a nested sequence of sample timepoints. USDM's answer is a sub-timeline: a second ScheduleTimeline, referenced from the main timeline's ScheduledActivityInstance (or directly from the Activity), with its own independent set of instances and timings.

Screening Day 1 (Anchor) Day 8 Day 30 P28D / Before P7D / After P29D / After Timingtype=Fixed Reference Timingvalue=P28D, type=Before Timingvalue=P29D, type=After
Every visit is timed relative to an anchor (Fixed Reference) using ISO 8601 durations and a Before/After type — not a hard-coded calendar date.

Inside the sub-timeline, the dosing instance acts as the anchor (type = Fixed Reference, value P0D), the predose sample is Before dosing by PT30M with a 10-minute lower window, and the two post-dose samples are After dosing by PT1H and P1D respectively. This is exactly the pattern used for triplicate ECGs, serial PK profiles, and repeated vitals measurements in cross-over designs — define the sequence once as a reusable sub-timeline, then reference it wherever it recurs.

Example 3: A conditional visit (decision branching)

Suppose a protocol footnote reads: "If subject does not have mutation X, Visit 8 is not required." In USDM this is modeled with a ScheduledDecisionInstance inserted into the main timeline in place of a plain ScheduledActivityInstance. It carries a defaultCondition (the normal next step) and one or more ConditionAssignments describing alternative routes — for example, "no mutation X" → skip directly to the follow-up scheduled instance, bypassing Visit 8 entirely.

This same mechanism handles oncology-style treatment cycles: a decision instance checks "eligible to continue cycle?" and either loops back to the start of the cycle's activities or exits to the next timeline segment when the stopping condition is met.

Download the worked examples

Download the sample — the full Example 1 parallel two-arm design, including every StudyArm, StudyEpoch, StudyCell, StudyElement, Encounter, ScheduleTimeline and Timing instance.

usdm-sample-study.json
Download JSON

Download the sample — the Example 2 PK sub-timeline, showing an anchor plus Before/After timings with windows.

usdm-timing-example.json
Download JSON

Download the sample — an Activity linked to a BiomedicalConceptCategory, individual BiomedicalConcepts, and their properties/response codes.

usdm-biomedical-concept-example.json
Download JSON

Example 4: A cross-over design with a reusable PK profile

Cross-over trials are a good test of USDM's reuse features because the same assessment profile typically repeats identically in every treatment period. Consider a two-period cross-over where each period requires an identical set of PK sample timepoints relative to that period's own dosing event. Rather than defining the PK sub-timeline twice, you define it once as a named ScheduleTimeline, then reference it from the ScheduledActivityInstance (or Activity) representing dosing in both Period 1 and Period 2. Each reference re-triggers the same relative timing pattern (predose, 1h, 24h) against that period's own local anchor — the sub-timeline's internal timings never need to know which period they're being used in, because they're all relative, not absolute.

Example 5: Multiple cohorts sharing a single StudyDesignPopulation

A common complex-design pattern from the Implementation Guide: a Phase 2 basket-style design with three cohorts, where most eligibility criteria apply to the whole population, but two criteria (say, EX02 and EX03) apply only to two of the three cohorts. USDM handles this by letting each EligibilityCriterion be referenced from either the StudyDesignPopulation (if it applies to everyone) or from the specific StudyCohort instances it actually applies to — never both. This lets a single set of unique criterion text definitions (stored independently) serve a design with any number of cohorts, with each cohort's specific eligibility profile expressed purely through which criteria it references.

What these five examples have in common

Every example on this page follows the same underlying discipline: define shared content once, and reference it from every place that needs it. Whether that's a reused Study Element (Example 1), a reused sub-timeline (Examples 2 and 4), a decision instance instead of duplicated branches (Example 3), or a shared eligibility criterion pool (Example 5), the pattern is identical. If you find yourself copy-pasting the same block of USDM JSON to represent something that's conceptually the same thing occurring twice, that's usually a signal to introduce a reference instead — it's very rarely what a well-formed USDM design actually needs.

Common authoring mistakes across all five examples

  • Flattening a sub-timeline into the main timeline. The PK sample sequence in Example 2 should never become three separate top-level visits — that loses the fact they're all part of one dosing encounter.
  • Hard-coding what should be a decision. If a visit only sometimes happens, model it with a ScheduledDecisionInstance and condition rather than simply omitting the visit for some arms and hoping downstream tooling infers the logic correctly.
  • Duplicating criteria text per cohort. When the same eligibility rule genuinely applies to two of three cohorts, reference the one existing EligibilityCriterion from both cohorts — don't create near-duplicate criterion text for each.
  • Forgetting the anchor. Every timeline, including every sub-timeline, needs its own Fixed Reference anchor — a sub-timeline is not automatically anchored to the main timeline's anchor.

From example to your own protocol

The fastest way to internalize these patterns is to pick one visit from a real protocol you know well and model it fully — Encounter, ScheduledActivityInstance, Timing, and the Activities it contains — before attempting a whole study. Once one visit is right, extending to a full Schedule of Activities is mostly repetition of the same pattern, not new modeling concepts.

Frequently asked questions

Are these official CDISC example files?

No — these are simplified, educational examples built by USDM Play to teach the structure. For the official, complete example protocols (with full JSON and visualizations), see CDISC's cdisc-org/DDF-RA GitHub repository under Documents/Examples.

What's a good first study design to practice modeling in USDM?

A simple two-arm, three-epoch parallel design (Screening → Treatment → Follow-up) with one visit per epoch is the standard teaching example — it exercises Arm, Epoch, Cell, Element, Encounter and a basic ScheduleTimeline without any decision branching.

How do I model a cycle (e.g. 21-day oncology cycles) in USDM?

Cycles are modeled with a ScheduledDecisionInstance that loops back to an earlier point in the timeline when a 'continue cycle' condition is met, and exits to the next timeline segment when a stopping condition (e.g. 'not fit for next cycle') is met.

Where can I see how footnotes turn into USDM structures?

The USDM Implementation Guide's section 4.23 (Addressing Footnotes) catalogs about ten footnote patterns — sub-timelines, alternative visit schedules, conditional activities, timing windows, and more — each mapped to a specific USDM modeling pattern.