From 388d56a1ada5975c56766bbceb0cd1c31e97cd00 Mon Sep 17 00:00:00 2001 From: pendingintent <3921919+pendingintent@users.noreply.github.com> Date: Mon, 22 Jun 2026 14:16:02 -0400 Subject: [PATCH 01/20] Removed release-* branch statement from the deployments. --- .github/workflows/azure-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/azure-deploy.yml b/.github/workflows/azure-deploy.yml index 1b3fb0a..a356007 100644 --- a/.github/workflows/azure-deploy.yml +++ b/.github/workflows/azure-deploy.yml @@ -4,7 +4,7 @@ on: push: branches: - master - - release-* + # - release-* workflow_dispatch: #Allow manual triggers permissions: From f07b2172ca5c701e11dec0d3dfce6a4ebaf637d6 Mon Sep 17 00:00:00 2001 From: pendingintent <3921919+pendingintent@users.noreply.github.com> Date: Thu, 23 Jul 2026 13:53:39 -0400 Subject: [PATCH 02/20] Exclude submodule tests from pytest collection --- pytest.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pytest.ini b/pytest.ini index 7ea3dd3..8d24ed6 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,4 +1,4 @@ [pytest] pythonpath = src addopts = -q -norecursedirs = old-tests +norecursedirs = old-tests cdisc-biomedical-concept-groupings From 7dfe091b839f524a09f642efb25bbdc2beaf032a Mon Sep 17 00:00:00 2001 From: pendingintent <3921919+pendingintent@users.noreply.github.com> Date: Thu, 23 Jul 2026 13:54:20 -0400 Subject: [PATCH 03/20] New submodule added to support bc groupings --- .gitmodules | 3 +++ cdisc-biomedical-concept-groupings | 1 + 2 files changed, 4 insertions(+) create mode 160000 cdisc-biomedical-concept-groupings diff --git a/.gitmodules b/.gitmodules index 64dddfd..f71abca 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "cdisc-json-validation"] path = cdisc-json-validation url = https://github.com/pendingintent/cdisc-json-validation.git +[submodule "cdisc-biomedical-concept-groupings"] + path = cdisc-biomedical-concept-groupings + url = https://github.com/pendingintent/cdisc-biomedical-concept-groupings.git diff --git a/cdisc-biomedical-concept-groupings b/cdisc-biomedical-concept-groupings new file mode 160000 index 0000000..0dfa838 --- /dev/null +++ b/cdisc-biomedical-concept-groupings @@ -0,0 +1 @@ +Subproject commit 0dfa838501ce910305086d1b223be64ba07b6db7 From a57e17241c8ebaf090d1356488103970b591da56 Mon Sep 17 00:00:00 2001 From: pendingintent <3921919+pendingintent@users.noreply.github.com> Date: Thu, 23 Jul 2026 13:55:50 -0400 Subject: [PATCH 04/20] Removed setuptools created files --- src/soa_builder.egg-info/PKG-INFO | 58 ++++++++++++++++++++++++++++ src/soa_builder.egg-info/SOURCES.txt | 6 +++ 2 files changed, 64 insertions(+) diff --git a/src/soa_builder.egg-info/PKG-INFO b/src/soa_builder.egg-info/PKG-INFO index acbc707..356e83c 100644 --- a/src/soa_builder.egg-info/PKG-INFO +++ b/src/soa_builder.egg-info/PKG-INFO @@ -133,6 +133,64 @@ SOA_EAGER_BCP_POPULATION=1 | `CDISC_API_KEY` | _(shell env)_ | CDISC Library API key — set in shell, not `config.env` | | `CDISC_SUBSCRIPTION_KEY` | _(shell env)_ | CDISC Library subscription key — set in shell, not `config.env` | +### Configurable CT codelist codes (dropdowns) + +Many dropdowns in the UI (Epoch Type, Arm Type, Role Type, Timing Type, +etc.) present CDISC controlled terminology preferred terms while storing +the underlying codelist C-code in the database. The C-code that backs +each dropdown is itself configurable via `config.env` — edit the value +and restart the server to point that dropdown at an alternate/custom +codelist. Defaults are read by +[`src/soa_builder/web/codelist_config.py`](src/soa_builder/web/codelist_config.py). + +```ini +CODELIST_EPOCH_TYPE=C99079 +CODELIST_ARM_TYPE=C174222 +CODELIST_ARM_DATA_ORIGIN_TYPE=C188727 +CODELIST_ROLE_TYPE=C215480 +CODELIST_ORGANIZATION_TYPE=C215480 +CODELIST_AMENDMENT_REASON=C207415 +CODELIST_AMENDMENT_IMPACT_TYPE=C215481 +CODELIST_GEOGRAPHIC_SCOPE_TYPE=C207412 +CODELIST_GOVERNANCE_DATE_TYPE=C207413 +CODELIST_STUDY_TITLE_TYPE=C207419 +CODELIST_INTERVENTION_ROLE=C207417 +CODELIST_INTERVENTION_TYPE=C99078 +CODELIST_INTERVENTION_UNIT=C66781 +CODELIST_OBJECTIVE_LEVEL=C188725 +CODELIST_ENDPOINT_LEVEL=C188726 +CODELIST_ENCOUNTER_ENVIRONMENTAL_SETTING=C127262 +CODELIST_ENCOUNTER_CONTACT_MODE=C171445 +CODELIST_TIMING_TYPE=C201264 +CODELIST_TIMING_RELATIVE_TO_FROM=C201265 +``` + +| Variable | Default | Dropdown / feature | +|---|---|---| +| `CODELIST_EPOCH_TYPE` | `C99079` | Epoch Type | +| `CODELIST_ARM_TYPE` | `C174222` | Arm Type | +| `CODELIST_ARM_DATA_ORIGIN_TYPE` | `C188727` | Arm Data Origin Type | +| `CODELIST_ROLE_TYPE` | `C215480` | Study Role Type | +| `CODELIST_ORGANIZATION_TYPE` | `C215480` | Organization Type | +| `CODELIST_AMENDMENT_REASON` | `C207415` | Amendment Reason | +| `CODELIST_AMENDMENT_IMPACT_TYPE` | `C215481` | Amendment Impact Type | +| `CODELIST_GEOGRAPHIC_SCOPE_TYPE` | `C207412` | Geographic Scope Type | +| `CODELIST_GOVERNANCE_DATE_TYPE` | `C207413` | Governance Date Type | +| `CODELIST_STUDY_TITLE_TYPE` | `C207419` | Study Title Type | +| `CODELIST_INTERVENTION_ROLE` | `C207417` | Study Intervention Role | +| `CODELIST_INTERVENTION_TYPE` | `C99078` | Study Intervention Type | +| `CODELIST_INTERVENTION_UNIT` | `C66781` | Study Intervention Dose Unit | +| `CODELIST_OBJECTIVE_LEVEL` | `C188725` | Objective Level | +| `CODELIST_ENDPOINT_LEVEL` | `C188726` | Endpoint Level | +| `CODELIST_ENCOUNTER_ENVIRONMENTAL_SETTING` | `C127262` | Encounter Environmental Setting | +| `CODELIST_ENCOUNTER_CONTACT_MODE` | `C171445` | Encounter Contact Mode | +| `CODELIST_TIMING_TYPE` | `C201264` | Timing Type | +| `CODELIST_TIMING_RELATIVE_TO_FROM` | `C201265` | Timing Relative To/From | + +> These codes identify which CDISC CT *codelist* populates a dropdown's +> options — they are unrelated to `CDISC_API_KEY`/`CDISC_SUBSCRIPTION_KEY` +> (API credentials) or `CDISC_CONCEPTS_JSON` (Biomedical Concept overrides). + --- ## Start web server diff --git a/src/soa_builder.egg-info/SOURCES.txt b/src/soa_builder.egg-info/SOURCES.txt index 9202cfb..727b53c 100644 --- a/src/soa_builder.egg-info/SOURCES.txt +++ b/src/soa_builder.egg-info/SOURCES.txt @@ -19,6 +19,7 @@ src/soa_builder/mcp/__init__.py src/soa_builder/mcp/server.py src/soa_builder/web/app.py src/soa_builder/web/audit.py +src/soa_builder/web/codelist_config.py src/soa_builder/web/db.py src/soa_builder/web/initialize_database.py src/soa_builder/web/migrate_database.py @@ -80,6 +81,7 @@ src/usdm/generate_endpoints.py src/usdm/generate_estimands.py src/usdm/generate_extension_attributes.py src/usdm/generate_indications.py +src/usdm/generate_narrative_content.py src/usdm/generate_objectives.py src/usdm/generate_organizations.py src/usdm/generate_roles.py @@ -101,6 +103,7 @@ tests/test_categories_cache.py tests/test_categories_ui_force.py tests/test_cdisc_api_status.py tests/test_code_uid_generation.py +tests/test_codelist_config.py tests/test_concept_categories.py tests/test_concept_category_force_refresh.py tests/test_concepts_by_category_ui_force.py @@ -111,13 +114,16 @@ tests/test_element_id_generation.py tests/test_element_id_monotonic.py tests/test_epoch_reorder_audit_api.py tests/test_epoch_type_options.py +tests/test_fetch_crf_specializations.py tests/test_fetch_sdtm_specializations.py tests/test_generate_biomedical_concept_properties.py tests/test_generate_endpoints.py tests/test_generate_extension_attributes.py +tests/test_generate_narrative_content.py tests/test_generate_objectives.py tests/test_instances_audit.py tests/test_mcp_server.py +tests/test_migrate_backfill_crf_href.py tests/test_routers_activities.py tests/test_routers_activities_crf.py tests/test_routers_amendments.py From 060bd8dc23deb2f79d6c9d77bd1cd1367599ebda Mon Sep 17 00:00:00 2001 From: pendingintent <3921919+pendingintent@users.noreply.github.com> Date: Thu, 23 Jul 2026 13:57:44 -0400 Subject: [PATCH 05/20] Pilot study SOA in FHIR format --- .../fhir/NCT12345678-vulcan-soa-latest.json | 2649 +++++++++++++++++ output/fhir/usdm_to_vulcan_fhir.py | 396 +++ 2 files changed, 3045 insertions(+) create mode 100644 output/fhir/NCT12345678-vulcan-soa-latest.json create mode 100644 output/fhir/usdm_to_vulcan_fhir.py diff --git a/output/fhir/NCT12345678-vulcan-soa-latest.json b/output/fhir/NCT12345678-vulcan-soa-latest.json new file mode 100644 index 0000000..7d56da7 --- /dev/null +++ b/output/fhir/NCT12345678-vulcan-soa-latest.json @@ -0,0 +1,2649 @@ +{ + "resourceType": "Bundle", + "type": "collection", + "entry": [ + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-ProtocolDesign", + "resource": { + "resourceType": "PlanDefinition", + "id": "H2Q-MC-LZZT-ProtocolDesign", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyProtocolSoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-ProtocolDesign", + "identifier": [ + { + "use": "usual", + "value": "H2Q-MC-LZZT-ProtocolDesign-1" + } + ], + "version": "1.0.0", + "title": "H2Q-MC-LZZT CDISC Pilot LZZT Protocol Schedule of Activities", + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/plan-definition-type", + "code": "clinical-protocol" + } + ] + }, + "status": "active", + "purpose": "The purpose of this PlanDefinition is to illustrate the planned study encounters.", + "action": [ + { + "id": "Study-Visit-SCREEN1", + "title": "Screen 1", + "description": "Planned Visit [Screen 1]", + "definitionUri": "PlanDefinition/H2Q-MC-LZZT-Study-Visit-SCREEN1", + "relatedAction": [ + { + "actionId": "Study-Visit-DOSE", + "relationship": "before", + "offsetDuration": { + "value": 14.0, + "system": "http://unitsofmeasure.org", + "code": "d" + } + } + ] + }, + { + "id": "Study-Visit-SCREEN2", + "title": "Screen 2", + "description": "Planned Visit [Screen 2]", + "definitionUri": "PlanDefinition/H2Q-MC-LZZT-Study-Visit-SCREEN2", + "relatedAction": [ + { + "actionId": "Study-Visit-DOSE", + "relationship": "before", + "offsetDuration": { + "value": 2.0, + "system": "http://unitsofmeasure.org", + "code": "d" + }, + "extension": [ + { + "url": "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/AcceptableOffsetRangeSoa", + "valueRange": { + "low": { + "value": 1.833, + "system": "http://unitsofmeasure.org", + "code": "d" + }, + "high": { + "value": 2.0, + "system": "http://unitsofmeasure.org", + "code": "d" + } + } + } + ] + } + ] + }, + { + "id": "Study-Visit-DOSE", + "title": "Dose", + "description": "Planned Visit [Dose]", + "definitionUri": "PlanDefinition/H2Q-MC-LZZT-Study-Visit-DOSE" + }, + { + "id": "Study-Visit-WEEK2", + "title": "Week 2", + "description": "Planned Visit [Week 2]", + "definitionUri": "PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK2", + "relatedAction": [ + { + "actionId": "Study-Visit-DOSE", + "relationship": "after", + "offsetDuration": { + "value": 14.0, + "system": "http://unitsofmeasure.org", + "code": "d" + }, + "extension": [ + { + "url": "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/AcceptableOffsetRangeSoa", + "valueRange": { + "low": { + "value": 11.0, + "system": "http://unitsofmeasure.org", + "code": "d" + }, + "high": { + "value": 17.0, + "system": "http://unitsofmeasure.org", + "code": "d" + } + } + } + ] + } + ] + }, + { + "id": "Study-Visit-WEEK4", + "title": "Week 4", + "description": "Planned Visit [Week 4]", + "definitionUri": "PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK4", + "relatedAction": [ + { + "actionId": "Study-Visit-DOSE", + "relationship": "after", + "offsetDuration": { + "value": 28.0, + "system": "http://unitsofmeasure.org", + "code": "d" + }, + "extension": [ + { + "url": "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/AcceptableOffsetRangeSoa", + "valueRange": { + "low": { + "value": 25.0, + "system": "http://unitsofmeasure.org", + "code": "d" + }, + "high": { + "value": 31.0, + "system": "http://unitsofmeasure.org", + "code": "d" + } + } + } + ] + } + ] + }, + { + "id": "Study-Visit-WEEK6", + "title": "Week 6", + "description": "Planned Visit [Week 6]", + "definitionUri": "PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK6", + "relatedAction": [ + { + "actionId": "Study-Visit-DOSE", + "relationship": "after", + "offsetDuration": { + "value": 42.0, + "system": "http://unitsofmeasure.org", + "code": "d" + }, + "extension": [ + { + "url": "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/AcceptableOffsetRangeSoa", + "valueRange": { + "low": { + "value": 39.0, + "system": "http://unitsofmeasure.org", + "code": "d" + }, + "high": { + "value": 45.0, + "system": "http://unitsofmeasure.org", + "code": "d" + } + } + } + ] + } + ] + }, + { + "id": "Study-Visit-WEEK8", + "title": "Week 8", + "description": "Planned Visit [Week 8]", + "definitionUri": "PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK8", + "relatedAction": [ + { + "actionId": "Study-Visit-DOSE", + "relationship": "after", + "offsetDuration": { + "value": 56.0, + "system": "http://unitsofmeasure.org", + "code": "d" + }, + "extension": [ + { + "url": "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/AcceptableOffsetRangeSoa", + "valueRange": { + "low": { + "value": 53.0, + "system": "http://unitsofmeasure.org", + "code": "d" + }, + "high": { + "value": 59.0, + "system": "http://unitsofmeasure.org", + "code": "d" + } + } + } + ] + } + ] + }, + { + "id": "Study-Visit-WEEK8N", + "title": "Week 8 NPI", + "description": "Planned Visit [Week 8 NPI]", + "definitionUri": "PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK8N", + "relatedAction": [ + { + "actionId": "Study-Visit-WEEK8", + "relationship": "after", + "offsetDuration": { + "value": 14.0, + "system": "http://unitsofmeasure.org", + "code": "d" + } + } + ] + }, + { + "id": "Study-Visit-WEEK12", + "title": "Week 12", + "description": "Planned Visit [Week 12]", + "definitionUri": "PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK12", + "relatedAction": [ + { + "actionId": "Study-Visit-DOSE", + "relationship": "after", + "offsetDuration": { + "value": 84.0, + "system": "http://unitsofmeasure.org", + "code": "d" + }, + "extension": [ + { + "url": "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/AcceptableOffsetRangeSoa", + "valueRange": { + "low": { + "value": 80.0, + "system": "http://unitsofmeasure.org", + "code": "d" + }, + "high": { + "value": 88.0, + "system": "http://unitsofmeasure.org", + "code": "d" + } + } + } + ] + } + ] + }, + { + "id": "Study-Visit-WEEK12N", + "title": "Week 12 NPI", + "description": "Planned Visit [Week 12 NPI]", + "definitionUri": "PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK12N", + "relatedAction": [ + { + "actionId": "Study-Visit-WEEK12", + "relationship": "after", + "offsetDuration": { + "value": 14.0, + "system": "http://unitsofmeasure.org", + "code": "d" + } + } + ] + }, + { + "id": "Study-Visit-WEEK16", + "title": "Week 16", + "description": "Planned Visit [Week 16]", + "definitionUri": "PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK16", + "relatedAction": [ + { + "actionId": "Study-Visit-DOSE", + "relationship": "after", + "offsetDuration": { + "value": 112.0, + "system": "http://unitsofmeasure.org", + "code": "d" + }, + "extension": [ + { + "url": "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/AcceptableOffsetRangeSoa", + "valueRange": { + "low": { + "value": 108.0, + "system": "http://unitsofmeasure.org", + "code": "d" + }, + "high": { + "value": 116.0, + "system": "http://unitsofmeasure.org", + "code": "d" + } + } + } + ] + } + ] + }, + { + "id": "Study-Visit-WEEK16N", + "title": "Week 16 NPI", + "description": "Planned Visit [Week 16 NPI]", + "definitionUri": "PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK16N", + "relatedAction": [ + { + "actionId": "Study-Visit-WEEK16", + "relationship": "after", + "offsetDuration": { + "value": 14.0, + "system": "http://unitsofmeasure.org", + "code": "d" + } + } + ] + }, + { + "id": "Study-Visit-WEEK20", + "title": "Week 20", + "description": "Planned Visit [Week 20]", + "definitionUri": "PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK20", + "relatedAction": [ + { + "actionId": "Study-Visit-DOSE", + "relationship": "after", + "offsetDuration": { + "value": 140.0, + "system": "http://unitsofmeasure.org", + "code": "d" + }, + "extension": [ + { + "url": "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/AcceptableOffsetRangeSoa", + "valueRange": { + "low": { + "value": 136.0, + "system": "http://unitsofmeasure.org", + "code": "d" + }, + "high": { + "value": 144.0, + "system": "http://unitsofmeasure.org", + "code": "d" + } + } + } + ] + } + ] + }, + { + "id": "Study-Visit-WEEK20N", + "title": "Week 20 NPI", + "description": "Planned Visit [Week 20 NPI]", + "definitionUri": "PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK20N", + "relatedAction": [ + { + "actionId": "Study-Visit-WEEK20", + "relationship": "after", + "offsetDuration": { + "value": 14.0, + "system": "http://unitsofmeasure.org", + "code": "d" + } + } + ] + }, + { + "id": "Study-Visit-WEEK24", + "title": "Week 24", + "description": "Planned Visit [Week 24]", + "definitionUri": "PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK24", + "relatedAction": [ + { + "actionId": "Study-Visit-DOSE", + "relationship": "after", + "offsetDuration": { + "value": 168.0, + "system": "http://unitsofmeasure.org", + "code": "d" + }, + "extension": [ + { + "url": "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/AcceptableOffsetRangeSoa", + "valueRange": { + "low": { + "value": 164.0, + "system": "http://unitsofmeasure.org", + "code": "d" + }, + "high": { + "value": 172.0, + "system": "http://unitsofmeasure.org", + "code": "d" + } + } + } + ] + } + ] + }, + { + "id": "Study-Visit-WEEK26", + "title": "Week 26", + "description": "Planned Visit [Week 26]", + "definitionUri": "PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK26", + "relatedAction": [ + { + "actionId": "Study-Visit-DOSE", + "relationship": "after", + "offsetDuration": { + "value": 182.0, + "system": "http://unitsofmeasure.org", + "code": "d" + }, + "extension": [ + { + "url": "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/AcceptableOffsetRangeSoa", + "valueRange": { + "low": { + "value": 179.0, + "system": "http://unitsofmeasure.org", + "code": "d" + }, + "high": { + "value": 185.0, + "system": "http://unitsofmeasure.org", + "code": "d" + } + } + } + ] + } + ] + } + ] + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-SCREEN1", + "resource": { + "resourceType": "PlanDefinition", + "id": "H2Q-MC-LZZT-Study-Visit-SCREEN1", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyVisitSoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-SCREEN1", + "identifier": [ + { + "use": "usual", + "value": "H2Q-MC-LZZT-Study-Visit-SCREEN1" + } + ], + "version": "1.0.0", + "title": "H2Q-MC-LZZT Screen 1", + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/plan-definition-type", + "code": "clinical-protocol" + } + ] + }, + "status": "active", + "description": "Screen 1 Activity Instance", + "action": [ + { + "title": "Informed Consent", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Informed-Consent" + }, + { + "title": "Inclusion/Exclusion Criteria", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Inclusion-Exclusion-Criteria" + }, + { + "title": "Patient Number assigned", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Patient-number-assigned" + }, + { + "title": "Demographics", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Demographics" + }, + { + "title": "Education", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Education" + }, + { + "title": "Hachinski", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Hachinski" + }, + { + "title": "MMSE", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-MMSE" + }, + { + "title": "Physical examination", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Physical-examination" + }, + { + "title": "Medical History", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Medical-History" + }, + { + "title": "Habits", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Habits" + }, + { + "title": "Chest X-ray", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Chest-X-ray" + }, + { + "title": "Vital Signs", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Vital-Signs" + }, + { + "title": "ECG", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-ECG" + }, + { + "title": "Placebo TTS Test", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Placebo-TTS-Test" + }, + { + "title": "CT Scan", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-CT-Scan" + }, + { + "title": "MRI", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-MRI" + }, + { + "title": "MRI, CT Scan", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-MRI-CT-Scan" + }, + { + "title": "Concomitant medications", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Concomitant-medications" + }, + { + "title": "Hematology", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Hematology" + }, + { + "title": "Chemistry", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Chemistry" + }, + { + "title": "Urinalysis", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Urinalysis" + }, + { + "title": "Hemoglobin A1C", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Hemoglobin-A1C" + }, + { + "title": "CIBIC+", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-CIBIC" + }, + { + "title": "DAD", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-DAD" + }, + { + "title": "ADAS-Cog", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-ADAS-Cog" + }, + { + "title": "NPI-X", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-NPI-X" + } + ] + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-SCREEN2", + "resource": { + "resourceType": "PlanDefinition", + "id": "H2Q-MC-LZZT-Study-Visit-SCREEN2", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyVisitSoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-SCREEN2", + "identifier": [ + { + "use": "usual", + "value": "H2Q-MC-LZZT-Study-Visit-SCREEN2" + } + ], + "version": "1.0.0", + "title": "H2Q-MC-LZZT Screen 2", + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/plan-definition-type", + "code": "clinical-protocol" + } + ] + }, + "status": "active", + "description": "Screen 2 Activity Instance", + "action": [ + { + "title": "Vital Signs", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Vital-Signs" + }, + { + "title": "Ambulatory ECG placed", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Ambulatory-ECG-placed" + }, + { + "title": "NPI-X", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-NPI-X" + } + ] + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-DOSE", + "resource": { + "resourceType": "PlanDefinition", + "id": "H2Q-MC-LZZT-Study-Visit-DOSE", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyVisitSoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-DOSE", + "identifier": [ + { + "use": "usual", + "value": "H2Q-MC-LZZT-Study-Visit-DOSE" + } + ], + "version": "1.0.0", + "title": "H2Q-MC-LZZT Dose", + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/plan-definition-type", + "code": "clinical-protocol" + } + ] + }, + "status": "active", + "description": "Dose Activity Instance", + "action": [ + { + "title": "Patient randomized", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Patient-randomised" + }, + { + "title": "Vital Signs", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Vital-Signs" + }, + { + "title": "Ambulatory ECG removed", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Ambulatory-ECG-removed" + }, + { + "title": "Concomitant medications", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Concomitant-medications" + }, + { + "title": "Study Drug", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Study-Drug" + }, + { + "title": "Plasma Specimen (Xanomeline)", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Plasma-Specimen-Xanomeline" + }, + { + "title": "ADAS-Cog", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-ADAS-Cog" + }, + { + "title": "CIBIC+", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-CIBIC" + }, + { + "title": "DAD", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-DAD" + }, + { + "title": "NPI-X", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-NPI-X" + } + ] + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK2", + "resource": { + "resourceType": "PlanDefinition", + "id": "H2Q-MC-LZZT-Study-Visit-WEEK2", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyVisitSoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK2", + "identifier": [ + { + "use": "usual", + "value": "H2Q-MC-LZZT-Study-Visit-WEEK2" + } + ], + "version": "1.0.0", + "title": "H2Q-MC-LZZT Week 2", + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/plan-definition-type", + "code": "clinical-protocol" + } + ] + }, + "status": "active", + "description": "Week 2 Activity Instance", + "action": [ + { + "title": "Apo E genotyping", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Apo-E-genotyping" + }, + { + "title": "Vital Signs", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Vital-Signs" + }, + { + "title": "Concomitant medications", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Concomitant-medications" + }, + { + "title": "Hematology", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Hematology" + }, + { + "title": "Urinalysis", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Urinalysis" + }, + { + "title": "Plasma Specimen (Xanomeline)", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Plasma-Specimen-Xanomeline" + }, + { + "title": "Study Drug", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Study-Drug" + }, + { + "title": "ECG", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-ECG" + }, + { + "title": "Chemistry", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Chemistry" + }, + { + "title": "NPI-X", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-NPI-X" + } + ] + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK4", + "resource": { + "resourceType": "PlanDefinition", + "id": "H2Q-MC-LZZT-Study-Visit-WEEK4", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyVisitSoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK4", + "identifier": [ + { + "use": "usual", + "value": "H2Q-MC-LZZT-Study-Visit-WEEK4" + } + ], + "version": "1.0.0", + "title": "H2Q-MC-LZZT Week 4", + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/plan-definition-type", + "code": "clinical-protocol" + } + ] + }, + "status": "active", + "description": "Week 4 Activity Instance", + "action": [ + { + "title": "Vital Signs", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Vital-Signs" + }, + { + "title": "ECG", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-ECG" + }, + { + "title": "Concomitant medications", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Concomitant-medications" + }, + { + "title": "Hematology", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Hematology" + }, + { + "title": "Chemistry", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Chemistry" + }, + { + "title": "Plasma Specimen (Xanomeline)", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Plasma-Specimen-Xanomeline" + }, + { + "title": "Study Drug", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Study-Drug" + }, + { + "title": "NPI-X", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-NPI-X" + } + ] + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK6", + "resource": { + "resourceType": "PlanDefinition", + "id": "H2Q-MC-LZZT-Study-Visit-WEEK6", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyVisitSoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK6", + "identifier": [ + { + "use": "usual", + "value": "H2Q-MC-LZZT-Study-Visit-WEEK6" + } + ], + "version": "1.0.0", + "title": "H2Q-MC-LZZT Week 6", + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/plan-definition-type", + "code": "clinical-protocol" + } + ] + }, + "status": "active", + "description": "Week 6 Activity Instance", + "action": [ + { + "title": "Vital Signs", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Vital-Signs" + }, + { + "title": "ECG", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-ECG" + }, + { + "title": "Concomitant medications", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Concomitant-medications" + }, + { + "title": "Hematology", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Hematology" + }, + { + "title": "Chemistry", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Chemistry" + }, + { + "title": "Plasma Specimen (Xanomeline)", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Plasma-Specimen-Xanomeline" + }, + { + "title": "Study Drug", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Study-Drug" + }, + { + "title": "NPI-X", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-NPI-X" + } + ] + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK8", + "resource": { + "resourceType": "PlanDefinition", + "id": "H2Q-MC-LZZT-Study-Visit-WEEK8", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyVisitSoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK8", + "identifier": [ + { + "use": "usual", + "value": "H2Q-MC-LZZT-Study-Visit-WEEK8" + } + ], + "version": "1.0.0", + "title": "H2Q-MC-LZZT Week 8", + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/plan-definition-type", + "code": "clinical-protocol" + } + ] + }, + "status": "active", + "description": "Week 8 Activity Instance", + "action": [ + { + "title": "Vital Signs", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Vital-Signs" + }, + { + "title": "ECG", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-ECG" + }, + { + "title": "Concomitant medications", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Concomitant-medications" + }, + { + "title": "Hematology", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Hematology" + }, + { + "title": "Chemistry", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Chemistry" + }, + { + "title": "Study Drug", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Study-Drug" + }, + { + "title": "ADAS-Cog", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-ADAS-Cog" + }, + { + "title": "CIBIC+", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-CIBIC" + }, + { + "title": "DAD", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-DAD" + }, + { + "title": "NPI-X", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-NPI-X" + } + ] + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK8N", + "resource": { + "resourceType": "PlanDefinition", + "id": "H2Q-MC-LZZT-Study-Visit-WEEK8N", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyVisitSoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK8N", + "identifier": [ + { + "use": "usual", + "value": "H2Q-MC-LZZT-Study-Visit-WEEK8N" + } + ], + "version": "1.0.0", + "title": "H2Q-MC-LZZT Week 8 NPI", + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/plan-definition-type", + "code": "clinical-protocol" + } + ] + }, + "status": "active", + "description": "Week 8 NPI Activity Instance", + "action": [ + { + "title": "Vital Signs", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Vital-Signs" + }, + { + "title": "ECG", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-ECG" + }, + { + "title": "Concomitant medications", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Concomitant-medications" + }, + { + "title": "Hematology", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Hematology" + }, + { + "title": "Chemistry", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Chemistry" + }, + { + "title": "Study Drug", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Study-Drug" + }, + { + "title": "ADAS-Cog", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-ADAS-Cog" + }, + { + "title": "CIBIC+", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-CIBIC" + }, + { + "title": "DAD", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-DAD" + }, + { + "title": "NPI-X", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-NPI-X" + } + ] + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK12", + "resource": { + "resourceType": "PlanDefinition", + "id": "H2Q-MC-LZZT-Study-Visit-WEEK12", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyVisitSoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK12", + "identifier": [ + { + "use": "usual", + "value": "H2Q-MC-LZZT-Study-Visit-WEEK12" + } + ], + "version": "1.0.0", + "title": "H2Q-MC-LZZT Week 12", + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/plan-definition-type", + "code": "clinical-protocol" + } + ] + }, + "status": "active", + "description": "Week 12", + "action": [ + { + "title": "NPI-X", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-NPI-X" + }, + { + "title": "Vital Signs", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Vital-Signs" + }, + { + "title": "ECG", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-ECG" + }, + { + "title": "Concomitant medications", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Concomitant-medications" + }, + { + "title": "Hematology", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Hematology" + }, + { + "title": "Chemistry", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Chemistry" + }, + { + "title": "Urinalysis", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Urinalysis" + }, + { + "title": "Plasma Specimen (Xanomeline)", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Plasma-Specimen-Xanomeline" + }, + { + "title": "Study Drug", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Study-Drug" + } + ] + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK12N", + "resource": { + "resourceType": "PlanDefinition", + "id": "H2Q-MC-LZZT-Study-Visit-WEEK12N", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyVisitSoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK12N", + "identifier": [ + { + "use": "usual", + "value": "H2Q-MC-LZZT-Study-Visit-WEEK12N" + } + ], + "version": "1.0.0", + "title": "H2Q-MC-LZZT Week 12 NPI", + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/plan-definition-type", + "code": "clinical-protocol" + } + ] + }, + "status": "active", + "description": "Week 12 NPI", + "action": [ + { + "title": "NPI-X", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-NPI-X" + }, + { + "title": "Vital Signs", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Vital-Signs" + }, + { + "title": "ECG", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-ECG" + }, + { + "title": "Concomitant medications", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Concomitant-medications" + }, + { + "title": "Hematology", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Hematology" + }, + { + "title": "Chemistry", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Chemistry" + }, + { + "title": "Urinalysis", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Urinalysis" + }, + { + "title": "Plasma Specimen (Xanomeline)", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Plasma-Specimen-Xanomeline" + }, + { + "title": "Study Drug", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Study-Drug" + } + ] + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK16", + "resource": { + "resourceType": "PlanDefinition", + "id": "H2Q-MC-LZZT-Study-Visit-WEEK16", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyVisitSoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK16", + "identifier": [ + { + "use": "usual", + "value": "H2Q-MC-LZZT-Study-Visit-WEEK16" + } + ], + "version": "1.0.0", + "title": "H2Q-MC-LZZT Week 16", + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/plan-definition-type", + "code": "clinical-protocol" + } + ] + }, + "status": "active", + "description": "Week 16", + "action": [ + { + "title": "Vital Signs", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Vital-Signs" + }, + { + "title": "ECG", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-ECG" + }, + { + "title": "Concomitant medications", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Concomitant-medications" + }, + { + "title": "Hematology", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Hematology" + }, + { + "title": "Chemistry", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Chemistry" + }, + { + "title": "Study Drug", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Study-Drug" + }, + { + "title": "ADAS-Cog", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-ADAS-Cog" + }, + { + "title": "DAD", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-DAD" + }, + { + "title": "CIBIC+", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-CIBIC" + }, + { + "title": "NPI-X", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-NPI-X" + } + ] + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK16N", + "resource": { + "resourceType": "PlanDefinition", + "id": "H2Q-MC-LZZT-Study-Visit-WEEK16N", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyVisitSoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK16N", + "identifier": [ + { + "use": "usual", + "value": "H2Q-MC-LZZT-Study-Visit-WEEK16N" + } + ], + "version": "1.0.0", + "title": "H2Q-MC-LZZT Week 16 NPI", + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/plan-definition-type", + "code": "clinical-protocol" + } + ] + }, + "status": "active", + "description": "Week 16 NPI", + "action": [ + { + "title": "Vital Signs", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Vital-Signs" + }, + { + "title": "ECG", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-ECG" + }, + { + "title": "Concomitant medications", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Concomitant-medications" + }, + { + "title": "Hematology", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Hematology" + }, + { + "title": "Chemistry", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Chemistry" + }, + { + "title": "Study Drug", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Study-Drug" + }, + { + "title": "ADAS-Cog", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-ADAS-Cog" + }, + { + "title": "DAD", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-DAD" + }, + { + "title": "CIBIC+", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-CIBIC" + }, + { + "title": "NPI-X", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-NPI-X" + } + ] + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK20", + "resource": { + "resourceType": "PlanDefinition", + "id": "H2Q-MC-LZZT-Study-Visit-WEEK20", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyVisitSoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK20", + "identifier": [ + { + "use": "usual", + "value": "H2Q-MC-LZZT-Study-Visit-WEEK20" + } + ], + "version": "1.0.0", + "title": "H2Q-MC-LZZT Week 20", + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/plan-definition-type", + "code": "clinical-protocol" + } + ] + }, + "status": "active", + "description": "Week 20", + "action": [ + { + "title": "NPI-X", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-NPI-X" + }, + { + "title": "Vital Signs", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Vital-Signs" + }, + { + "title": "ECG", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-ECG" + }, + { + "title": "Concomitant medications", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Concomitant-medications" + }, + { + "title": "Hematology", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Hematology" + }, + { + "title": "Chemistry", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Chemistry" + }, + { + "title": "Plasma Specimen (Xanomeline)", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Plasma-Specimen-Xanomeline" + }, + { + "title": "Study Drug", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Study-Drug" + } + ] + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK20N", + "resource": { + "resourceType": "PlanDefinition", + "id": "H2Q-MC-LZZT-Study-Visit-WEEK20N", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyVisitSoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK20N", + "identifier": [ + { + "use": "usual", + "value": "H2Q-MC-LZZT-Study-Visit-WEEK20N" + } + ], + "version": "1.0.0", + "title": "H2Q-MC-LZZT Week 20 NPI", + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/plan-definition-type", + "code": "clinical-protocol" + } + ] + }, + "status": "active", + "description": "Week 20 NPI", + "action": [ + { + "title": "NPI-X", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-NPI-X" + }, + { + "title": "Vital Signs", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Vital-Signs" + }, + { + "title": "ECG", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-ECG" + }, + { + "title": "Concomitant medications", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Concomitant-medications" + }, + { + "title": "Hematology", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Hematology" + }, + { + "title": "Chemistry", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Chemistry" + }, + { + "title": "Plasma Specimen (Xanomeline)", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Plasma-Specimen-Xanomeline" + }, + { + "title": "Study Drug", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Study-Drug" + } + ] + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK24", + "resource": { + "resourceType": "PlanDefinition", + "id": "H2Q-MC-LZZT-Study-Visit-WEEK24", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyVisitSoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK24", + "identifier": [ + { + "use": "usual", + "value": "H2Q-MC-LZZT-Study-Visit-WEEK24" + } + ], + "version": "1.0.0", + "title": "H2Q-MC-LZZT Week 24", + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/plan-definition-type", + "code": "clinical-protocol" + } + ] + }, + "status": "active", + "description": "Week 24", + "action": [ + { + "title": "NPI-X", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-NPI-X" + }, + { + "title": "Vital Signs", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Vital-Signs" + }, + { + "title": "ECG", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-ECG" + }, + { + "title": "Concomitant medications", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Concomitant-medications" + }, + { + "title": "Hematology", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Hematology" + }, + { + "title": "Chemistry", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Chemistry" + }, + { + "title": "Urinalysis", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Urinalysis" + }, + { + "title": "Study Drug", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Study-Drug" + }, + { + "title": "ADAS-Cog", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-ADAS-Cog" + }, + { + "title": "DAD", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-DAD" + }, + { + "title": "CIBIC+", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-CIBIC" + } + ] + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK26", + "resource": { + "resourceType": "PlanDefinition", + "id": "H2Q-MC-LZZT-Study-Visit-WEEK26", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyVisitSoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/PlanDefinition/H2Q-MC-LZZT-Study-Visit-WEEK26", + "identifier": [ + { + "use": "usual", + "value": "H2Q-MC-LZZT-Study-Visit-WEEK26" + } + ], + "version": "1.0.0", + "title": "H2Q-MC-LZZT Week 26", + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/plan-definition-type", + "code": "clinical-protocol" + } + ] + }, + "status": "active", + "description": "Week 26", + "action": [ + { + "title": "NPI-X", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-NPI-X" + }, + { + "title": "Vital Signs", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Vital-Signs" + }, + { + "title": "ECG", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-ECG" + }, + { + "title": "Concomitant medications", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Concomitant-medications" + }, + { + "title": "Hematology", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Hematology" + }, + { + "title": "Chemistry", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Chemistry" + }, + { + "title": "Study Drug", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-Study-Drug" + }, + { + "title": "TTS Acceptability Survey", + "definitionUri": "ActivityDefinition/H2Q-MC-LZZT-Activity-TTS-Acceptability-Survey" + } + ] + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-NPI-X", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-NPI-X", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-NPI-X", + "identifier": [ + { + "use": "usual", + "value": "NPI-X" + } + ], + "name": "NPI_X", + "title": "NPI-X", + "status": "active", + "description": "NPI-X results" + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Urinalysis", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-Urinalysis", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Urinalysis", + "identifier": [ + { + "use": "usual", + "value": "Urinalysis" + } + ], + "name": "Urinalysis", + "title": "Urinalysis", + "status": "active", + "description": "Urinalysis results", + "code": { + "coding": [ + { + "system": "https://ncithesaurus.nci.nih.gov", + "code": "C64546", + "display": "Color Assessment" + } + ], + "text": "Color Assessment" + } + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Hachinski", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-Hachinski", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Hachinski", + "identifier": [ + { + "use": "usual", + "value": "Hachinski" + } + ], + "name": "Hachinski", + "title": "Hachinski", + "status": "active", + "description": "Hachinski test" + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Study-Drug", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-Study-Drug", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Study-Drug", + "identifier": [ + { + "use": "usual", + "value": "Study Drug" + } + ], + "name": "Study_Drug", + "title": "Study Drug", + "status": "active", + "description": "Study Drug activity", + "code": { + "coding": [ + { + "system": "https://ncithesaurus.nci.nih.gov", + "code": "C117466", + "display": "Exposure as Collected Domain" + } + ], + "text": "Exposure as Collected Domain" + } + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Education", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-Education", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Education", + "identifier": [ + { + "use": "usual", + "value": "Education" + } + ], + "name": "Education", + "title": "Education", + "status": "active", + "description": "Education activity", + "code": { + "coding": [ + { + "system": "https://ncithesaurus.nci.nih.gov", + "code": "C17953", + "display": "Education Level" + } + ], + "text": "Education Level" + } + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Ambulatory-ECG-placed", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-Ambulatory-ECG-placed", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Ambulatory-ECG-placed", + "identifier": [ + { + "use": "usual", + "value": "Ambulatory ECG placed" + } + ], + "name": "Ambulatory_ECG_placed", + "title": "Ambulatory ECG placed", + "status": "active", + "description": "Ambulatory ECG placed activity", + "code": { + "coding": [ + { + "system": "https://ncithesaurus.nci.nih.gov", + "code": "C119561", + "display": "ECG Continuous Monitoring Indicator" + } + ], + "text": "ECG Continuous Monitoring Indicator" + } + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-ECG", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-ECG", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-ECG", + "identifier": [ + { + "use": "usual", + "value": "ECG" + } + ], + "name": "ECG", + "title": "ECG", + "status": "active", + "description": "ECG results", + "code": { + "coding": [ + { + "system": "https://ncithesaurus.nci.nih.gov", + "code": "C181655", + "display": "Electrocardiogram Analysis" + } + ], + "text": "Electrocardiogram Analysis" + } + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-MRI", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-MRI", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-MRI", + "identifier": [ + { + "use": "usual", + "value": "MRI" + } + ], + "name": "MRI", + "title": "MRI", + "status": "active", + "description": "MRI results", + "code": { + "coding": [ + { + "system": "https://ncithesaurus.nci.nih.gov", + "code": "C16809", + "display": "Magnetic Resonance Imaging" + } + ], + "text": "Magnetic Resonance Imaging" + } + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Demographics", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-Demographics", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Demographics", + "identifier": [ + { + "use": "usual", + "value": "Demographics" + } + ], + "name": "Demographics", + "title": "Demographics", + "status": "active", + "description": "Demographics activity", + "code": { + "coding": [ + { + "system": "https://ncithesaurus.nci.nih.gov", + "code": "C17049", + "display": "Race" + } + ], + "text": "Race" + } + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Habits", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-Habits", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Habits", + "identifier": [ + { + "use": "usual", + "value": "Habits" + } + ], + "name": "Habits", + "title": "Habits", + "status": "active", + "description": "List of habits", + "code": { + "coding": [ + { + "system": "https://ncithesaurus.nci.nih.gov", + "code": "C81229", + "display": "Alcohol Use History" + } + ], + "text": "Alcohol Use History" + } + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Vital-Signs", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-Vital-Signs", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Vital-Signs", + "identifier": [ + { + "use": "usual", + "value": "Vital Signs" + } + ], + "name": "Vital_Signs", + "title": "Vital Signs", + "status": "active", + "description": "Vital Signs result", + "code": { + "coding": [ + { + "system": "https://ncithesaurus.nci.nih.gov", + "code": "C174446", + "display": "Body Temperature" + } + ], + "text": "Body Temperature" + } + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Apo-E-genotyping", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-Apo-E-genotyping", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Apo-E-genotyping", + "identifier": [ + { + "use": "usual", + "value": "Apo E genotyping" + } + ], + "name": "Apo_E_genotyping", + "title": "Apo E genotyping", + "status": "active", + "description": "Apo E genotyping test" + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-CT-Scan", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-CT-Scan", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-CT-Scan", + "identifier": [ + { + "use": "usual", + "value": "CT Scan" + } + ], + "name": "CT_Scan", + "title": "CT Scan", + "status": "active", + "description": "CT Scan results", + "code": { + "coding": [ + { + "system": "https://ncithesaurus.nci.nih.gov", + "code": "C17204", + "display": "Computed Tomography" + } + ], + "text": "Computed Tomography" + } + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Medical-History", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-Medical-History", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Medical-History", + "identifier": [ + { + "use": "usual", + "value": "Medical History" + } + ], + "name": "Medical_History", + "title": "Medical History", + "status": "active", + "description": "Medical History response", + "code": { + "coding": [ + { + "system": "https://ncithesaurus.nci.nih.gov", + "code": "C200145", + "display": "Solicited Medical History" + } + ], + "text": "Solicited Medical History" + } + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Ambulatory-ECG-removed", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-Ambulatory-ECG-removed", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Ambulatory-ECG-removed", + "identifier": [ + { + "use": "usual", + "value": "Ambulatory ECG removed" + } + ], + "name": "Ambulatory_ECG_removed", + "title": "Ambulatory ECG removed", + "status": "active", + "description": "Ambulatory ECG removed activity", + "code": { + "coding": [ + { + "system": "https://ncithesaurus.nci.nih.gov", + "code": "C119561", + "display": "ECG Continuous Monitoring Indicator" + } + ], + "text": "ECG Continuous Monitoring Indicator" + } + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Physical-examination", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-Physical-examination", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Physical-examination", + "identifier": [ + { + "use": "usual", + "value": "Physical examination" + } + ], + "name": "Physical_examination", + "title": "Physical examination", + "status": "active", + "description": "Physical examination results", + "code": { + "coding": [ + { + "system": "https://ncithesaurus.nci.nih.gov", + "code": "C138967", + "display": "Isometric Muscle Strength" + } + ], + "text": "Isometric Muscle Strength" + } + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Placebo-TTS-Test", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-Placebo-TTS-Test", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Placebo-TTS-Test", + "identifier": [ + { + "use": "usual", + "value": "Placebo TTS Test" + } + ], + "name": "Placebo_TTS_Test", + "title": "Placebo TTS Test", + "status": "active", + "description": "Placebo TTS Test results", + "code": { + "coding": [ + { + "system": "https://ncithesaurus.nci.nih.gov", + "code": "NEW_LZZT", + "display": "TTS Acceptability Survey" + } + ], + "text": "TTS Acceptability Survey" + } + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-DAD", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-DAD", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-DAD", + "identifier": [ + { + "use": "usual", + "value": "DAD" + } + ], + "name": "DAD", + "title": "DAD", + "status": "active", + "description": "DAD results" + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Concomitant-medications", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-Concomitant-medications", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Concomitant-medications", + "identifier": [ + { + "use": "usual", + "value": "Concomitant medications" + } + ], + "name": "Concomitant_medications", + "title": "Concomitant medications", + "status": "active", + "description": "Concomitant medications information", + "code": { + "coding": [ + { + "system": "https://ncithesaurus.nci.nih.gov", + "code": "C83056", + "display": "Concomitant Medication Yes No Indicator" + } + ], + "text": "Concomitant Medication Yes No Indicator" + } + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Hematology", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-Hematology", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Hematology", + "identifier": [ + { + "use": "usual", + "value": "Hematology" + } + ], + "name": "Hematology", + "title": "Hematology", + "status": "active", + "description": "Hematology results", + "code": { + "coding": [ + { + "system": "https://ncithesaurus.nci.nih.gov", + "code": "C64848", + "display": "Hemoglobin Measurement" + } + ], + "text": "Hemoglobin Measurement" + } + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-MMSE", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-MMSE", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-MMSE", + "identifier": [ + { + "use": "usual", + "value": "MMSE" + } + ], + "name": "MMSE", + "title": "MMSE", + "status": "active", + "description": "MMSE test" + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-CIBIC", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-CIBIC", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-CIBIC", + "identifier": [ + { + "use": "usual", + "value": "CIBIC+" + } + ], + "name": "CIBIC", + "title": "CIBIC+", + "status": "active", + "description": "CIBIC+ results" + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-TTS-Acceptability-Survey", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-TTS-Acceptability-Survey", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-TTS-Acceptability-Survey", + "identifier": [ + { + "use": "usual", + "value": "TTS Acceptability Survey" + } + ], + "name": "TTS_Acceptability_Survey", + "title": "TTS Acceptability Survey", + "status": "active", + "description": "TTS Acceptability Survey results", + "code": { + "coding": [ + { + "system": "https://ncithesaurus.nci.nih.gov", + "code": "NEW_LZZT", + "display": "TTS Acceptability Survey" + } + ], + "text": "TTS Acceptability Survey" + } + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Patient-randomised", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-Patient-randomised", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Patient-randomised", + "identifier": [ + { + "use": "usual", + "value": "Patient randomised" + } + ], + "name": "Patient_randomised", + "title": "Patient randomized", + "status": "active", + "description": "Patient randomized activity", + "code": { + "coding": [ + { + "system": "https://ncithesaurus.nci.nih.gov", + "code": "C114209", + "display": "Subject is Randomized" + } + ], + "text": "Subject is Randomized" + } + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Plasma-Specimen-Xanomeline", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-Plasma-Specimen-Xanomeline", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Plasma-Specimen-Xanomeline", + "identifier": [ + { + "use": "usual", + "value": "Plasma Specimen (Xanomeline)" + } + ], + "name": "Plasma_Specimen_Xanomeline", + "title": "Plasma Specimen (Xanomeline)", + "status": "active", + "description": "Plasma Specimen (Xanomeline) results" + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Inclusion-Exclusion-Criteria", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-Inclusion-Exclusion-Criteria", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Inclusion-Exclusion-Criteria", + "identifier": [ + { + "use": "usual", + "value": "Inclusion/Exclusion Criteria" + } + ], + "name": "Inclusion_Exclusion_Criteria", + "title": "Inclusion/Exclusion Criteria", + "status": "active", + "description": "Inclusion/Exclusion Criteria activity", + "code": { + "coding": [ + { + "system": "https://ncithesaurus.nci.nih.gov", + "code": "C25532", + "display": "Inclusion Criteria" + } + ], + "text": "Inclusion Criteria" + } + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Chemistry", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-Chemistry", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Chemistry", + "identifier": [ + { + "use": "usual", + "value": "Chemistry" + } + ], + "name": "Chemistry", + "title": "Chemistry", + "status": "active", + "description": "Chemistry test results", + "code": { + "coding": [ + { + "system": "https://ncithesaurus.nci.nih.gov", + "code": "C64433", + "display": "Alanine Aminotransferase Measurement" + } + ], + "text": "Alanine Aminotransferase Measurement" + } + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-MRI-CT-Scan", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-MRI-CT-Scan", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-MRI-CT-Scan", + "identifier": [ + { + "use": "usual", + "value": "MRI, CT Scan" + } + ], + "name": "MRI_CT_Scan", + "title": "MRI, CT Scan", + "status": "active", + "description": "MRI, CT Scan results", + "code": { + "coding": [ + { + "system": "https://ncithesaurus.nci.nih.gov", + "code": "C16809", + "display": "Magnetic Resonance Imaging" + } + ], + "text": "Magnetic Resonance Imaging" + } + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Hemoglobin-A1C", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-Hemoglobin-A1C", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Hemoglobin-A1C", + "identifier": [ + { + "use": "usual", + "value": "Hemoglobin A1C" + } + ], + "name": "Hemoglobin_A1C", + "title": "Hemoglobin A1C", + "status": "active", + "description": "Hemoglobin A1C results", + "code": { + "coding": [ + { + "system": "https://ncithesaurus.nci.nih.gov", + "code": "C64849", + "display": "Hemoglobin A1C Measurement" + } + ], + "text": "Hemoglobin A1C Measurement" + } + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Patient-number-assigned", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-Patient-number-assigned", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Patient-number-assigned", + "identifier": [ + { + "use": "usual", + "value": "Patient number assigned" + } + ], + "name": "Patient_number_assigned", + "title": "Patient Number assigned", + "status": "active", + "description": "Patient Number assigned activity", + "code": { + "coding": [ + { + "system": "https://ncithesaurus.nci.nih.gov", + "code": "C114209", + "display": "Subject is Randomized" + } + ], + "text": "Subject is Randomized" + } + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Chest-X-ray", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-Chest-X-ray", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Chest-X-ray", + "identifier": [ + { + "use": "usual", + "value": "Chest X-ray" + } + ], + "name": "Chest_X_ray", + "title": "Chest X-ray", + "status": "active", + "description": "Chest X-ray result", + "code": { + "coding": [ + { + "system": "https://ncithesaurus.nci.nih.gov", + "code": "C38101", + "display": "X-Ray Imaging" + } + ], + "text": "X-Ray Imaging" + } + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Informed-Consent", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-Informed-Consent", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-Informed-Consent", + "identifier": [ + { + "use": "usual", + "value": "Informed Consent" + } + ], + "name": "Informed_Consent", + "title": "Informed Consent", + "status": "active", + "description": "Informed consent activity", + "code": { + "coding": [ + { + "system": "https://ncithesaurus.nci.nih.gov", + "code": "C16735", + "display": "Informed Consent" + } + ], + "text": "Informed Consent" + } + } + }, + { + "fullUrl": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-ADAS-Cog", + "resource": { + "resourceType": "ActivityDefinition", + "id": "H2Q-MC-LZZT-Activity-ADAS-Cog", + "meta": { + "profile": [ + "http://hl7.org/fhir/uv/vulcan-schedule/StructureDefinition/StudyActivitySoa" + ] + }, + "url": "http://hl7.org/fhir/uv/vulcan-schedule/ActivityDefinition/H2Q-MC-LZZT-Activity-ADAS-Cog", + "identifier": [ + { + "use": "usual", + "value": "ADAS-Cog" + } + ], + "name": "ADAS_Cog", + "title": "ADAS-Cog", + "status": "active", + "description": "ADAS-Cog results", + "code": { + "coding": [ + { + "system": "https://ncithesaurus.nci.nih.gov", + "code": "C100177", + "display": "CDISC ADAS-Cog - Word Recall Average Score" + } + ], + "text": "CDISC ADAS-Cog - Word Recall Average Score" + } + } + } + ] +} \ No newline at end of file diff --git a/output/fhir/usdm_to_vulcan_fhir.py b/output/fhir/usdm_to_vulcan_fhir.py new file mode 100644 index 0000000..e189ef6 --- /dev/null +++ b/output/fhir/usdm_to_vulcan_fhir.py @@ -0,0 +1,396 @@ +"""One-off USDM -> FHIR mapper following the HL7 Vulcan Schedule of +Activities Implementation Guide (StudyProtocolSoa / StudyVisitSoa / +StudyActivitySoa profiles), grounded against the IG's own published +H2Q-MC-LZZT example resources at +http://hl7.org/fhir/uv/vulcan-schedule/. + +Reads a USDM v4 JSON export from soa-workbench and emits a FHIR Bundle +containing: + - one top-level PlanDefinition (StudyProtocolSoa) with one action per + planned visit, carrying day offsets (action.relatedAction.offsetDuration) + and acceptable visit windows (AcceptableOffsetRangeSoa extension) + - one per-visit PlanDefinition (StudyVisitSoa) with one action per + activity performed at that visit + - one ActivityDefinition (StudyActivitySoa) per unique activity + referenced by the main schedule timeline + +Scope: main schedule timeline only. Branch timelines (adverse event, +early termination, vital-sign sub-profiles) are not represented -- see +the summary printed at the end of the run. +""" + +import json +import re +import sys +from pathlib import Path + +IG_BASE = "http://hl7.org/fhir/uv/vulcan-schedule" +OFFSET_RANGE_EXT_URL = f"{IG_BASE}/StructureDefinition/AcceptableOffsetRangeSoa" + +ISO_DURATION_RE = re.compile( + r"^(?P-)?P" + r"(?:(?P\d+(?:\.\d+)?)W)?" + r"(?:(?P\d+(?:\.\d+)?)D)?" + r"(?:T" + r"(?:(?P\d+(?:\.\d+)?)H)?" + r"(?:(?P\d+(?:\.\d+)?)M)?" + r")?$" +) + + +def parse_iso_duration_to_days(value): + """Parse an ISO 8601 duration (e.g. '-P2W', 'P2D', 'PT4H') into a + single signed value in days. The Vulcan IG's own example + (AcceptableOffsetRangeSoa, action.relatedAction.offsetDuration) + always expresses offsets/windows in UCUM 'd', so we normalize to + days here rather than carrying mixed units through the mapping. + """ + if not value: + return 0.0 + m = ISO_DURATION_RE.match(value) + if not m: + raise ValueError(f"Unrecognized ISO 8601 duration: {value!r}") + sign = -1 if m.group("sign") else 1 + weeks = float(m.group("weeks") or 0) + days = float(m.group("days") or 0) + hours = float(m.group("hours") or 0) + minutes = float(m.group("minutes") or 0) + total_days = weeks * 7 + days + hours / 24.0 + minutes / 1440.0 + return sign * total_days + + +def quantity(value, unit): + return {"value": value, "system": "http://unitsofmeasure.org", "code": unit} + + +def slugify(text): + text = re.sub(r"[^A-Za-z0-9]+", "-", text.strip()) + return re.sub(r"-+", "-", text).strip("-") + + +def load_usdm(path): + with open(path) as f: + return json.load(f) + + +def get_study_design(usdm): + version = usdm["study"]["versions"][0] + return version, version["studyDesigns"][0] + + +def index_by_id(items): + return {item["id"]: item for item in items} + + +def find_main_timeline(study_design): + for tl in study_design["scheduleTimelines"]: + if tl.get("mainTimeline"): + return tl + raise ValueError("No main schedule timeline found") + + +def walk_instance_order(timeline, instances_by_id): + """Follow entryId -> defaultConditionId to get true visit order, + skipping ScheduledDecisionInstance nodes (no encounterId).""" + order = [] + seen = set() + current_id = timeline["entryId"] + while current_id and current_id not in seen: + seen.add(current_id) + inst = instances_by_id.get(current_id) + if inst is None: + break + if inst.get("instanceType") == "ScheduledActivityInstance" and inst.get( + "encounterId" + ): + order.append(inst) + current_id = inst.get("defaultConditionId") + return order + + +def build_offset_range_extension(offset_days, window_lower, window_upper): + if window_lower is None and window_upper is None: + return None + lower_days = abs(parse_iso_duration_to_days(window_lower)) if window_lower else 0.0 + upper_days = abs(parse_iso_duration_to_days(window_upper)) if window_upper else 0.0 + low = offset_days - lower_days + high = offset_days + upper_days + return { + "url": OFFSET_RANGE_EXT_URL, + "valueRange": { + "low": quantity(round(low, 3), "d"), + "high": quantity(round(high, 3), "d"), + }, + } + + +def build_related_action(anchor_action_id, timing): + """Build PlanDefinition.action.relatedAction for a visit relative + to its anchor, or return None if this visit IS the anchor + (Timing.type == 'Fixed Reference', matching the IG's + Index-Activity-Event pattern where the anchor visit has no + relatedAction at all).""" + type_decode = timing["type"]["decode"] + if type_decode == "Fixed Reference": + return None + + relationship = {"Before": "before", "After": "after"}.get(type_decode) + if relationship is None: + raise ValueError(f"Unrecognized timing type: {type_decode!r}") + + offset_days = abs(parse_iso_duration_to_days(timing["value"])) + + related_action = { + "actionId": anchor_action_id, + "relationship": relationship, + "offsetDuration": quantity(round(offset_days, 3), "d"), + } + ext = build_offset_range_extension( + offset_days, timing.get("windowLower"), timing.get("windowUpper") + ) + if ext: + related_action["extension"] = [ext] + return related_action + + +def build_activity_definition(protocol_slug, activity, bc_by_id): + slug = f"{protocol_slug}-Activity-{slugify(activity['name'])}" + resource = { + "resourceType": "ActivityDefinition", + "id": slug, + "meta": {"profile": [f"{IG_BASE}/StructureDefinition/StudyActivitySoa"]}, + "url": f"{IG_BASE}/ActivityDefinition/{slug}", + "identifier": [{"use": "usual", "value": activity["name"]}], + "name": slugify(activity["name"]).replace("-", "_"), + "title": activity.get("label") or activity["name"], + "status": "active", + "description": activity.get("description") + or activity.get("label") + or activity["name"], + } + + bc_ids = activity.get("biomedicalConceptIds") or [] + if bc_ids: + bc = bc_by_id.get(bc_ids[0]) + if bc and bc.get("reference"): + code_value = bc["reference"].rsplit("/", 1)[-1] + resource["code"] = { + "coding": [ + { + "system": "https://ncithesaurus.nci.nih.gov", + "code": code_value, + "display": bc.get("name") or activity["name"], + } + ], + "text": bc.get("name") or activity["name"], + } + return resource + + +def build_visit_plan_definition( + protocol_slug, instance, encounter, activities_by_id, activity_def_ids +): + action_slug = f"{protocol_slug}-Study-Visit-{slugify(instance['name'])}" + display_label = instance.get("label") or encounter.get("label") or instance["name"] + display_description = ( + instance.get("description") or encounter.get("description") or display_label + ) + + actions = [] + seen_activity_ids = set() + duplicate_count = 0 + for activity_id in instance.get("activityIds", []): + if activity_id in seen_activity_ids: + duplicate_count += 1 + continue + seen_activity_ids.add(activity_id) + activity = activities_by_id.get(activity_id) + if activity is None: + continue + activity_def_id = activity_def_ids[activity_id] + actions.append( + { + "title": activity.get("label") or activity["name"], + "definitionUri": f"ActivityDefinition/{activity_def_id}", + } + ) + + return ( + { + "resourceType": "PlanDefinition", + "id": action_slug, + "meta": {"profile": [f"{IG_BASE}/StructureDefinition/StudyVisitSoa"]}, + "url": f"{IG_BASE}/PlanDefinition/{action_slug}", + "identifier": [{"use": "usual", "value": action_slug}], + "version": "1.0.0", + "title": f"{protocol_slug} {display_label}", + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/plan-definition-type", + "code": "clinical-protocol", + } + ] + }, + "status": "active", + "description": display_description, + "action": actions, + }, + action_slug, + duplicate_count, + ) + + +def main(usdm_path, output_path): + usdm = load_usdm(usdm_path) + version, study_design = get_study_design(usdm) + protocol_slug = study_design["name"] + study_name = f"{protocol_slug} {usdm['study'].get('label') or ''}".strip() + + encounters_by_id = index_by_id(study_design["encounters"]) + activities_by_id = index_by_id(study_design["activities"]) + bc_by_id = index_by_id(version.get("biomedicalConcepts", [])) + + main_timeline = find_main_timeline(study_design) + instances_by_id = index_by_id(main_timeline["instances"]) + timings_by_from_id = { + t["relativeFromScheduledInstanceId"]: t for t in main_timeline["timings"] + } + + ordered_visits = walk_instance_order(main_timeline, instances_by_id) + + # Pass 1: assign each visit its FHIR action id, so relatedAction + # references (which point at another visit's action id) resolve + # regardless of iteration order. + visit_action_ids = {} + for inst in ordered_visits: + visit_action_ids[inst["id"]] = f"Study-Visit-{slugify(inst['name'])}" + + # Pass 2: build the top-level protocol actions with relatedAction + # offsets/windows, and the per-visit PlanDefinitions. + protocol_actions = [] + visit_plan_definitions = [] + activity_def_ids = { + activity_id: f"{protocol_slug}-Activity-{slugify(activities_by_id[activity_id]['name'])}" + for activity_id in { + aid for inst in ordered_visits for aid in inst.get("activityIds", []) + } + } + + total_duplicate_activities = 0 + for inst in ordered_visits: + encounter = encounters_by_id[inst["encounterId"]] + action_id = visit_action_ids[inst["id"]] + visit_pd, visit_pd_id, dup_count = build_visit_plan_definition( + protocol_slug, inst, encounter, activities_by_id, activity_def_ids + ) + visit_plan_definitions.append(visit_pd) + total_duplicate_activities += dup_count + + display_label = inst.get("label") or encounter.get("label") or inst["name"] + protocol_action = { + "id": action_id, + "title": display_label, + "description": f"Planned Visit [{display_label}]", + "definitionUri": f"PlanDefinition/{visit_pd_id}", + } + + timing = timings_by_from_id.get(inst["id"]) + if timing is not None: + anchor_inst_id = timing["relativeToScheduledInstanceId"] + anchor_action_id = visit_action_ids.get(anchor_inst_id) + if anchor_action_id and anchor_action_id != action_id: + related_action = build_related_action(anchor_action_id, timing) + if related_action is not None: + protocol_action["relatedAction"] = [related_action] + protocol_actions.append(protocol_action) + + protocol_plan_definition = { + "resourceType": "PlanDefinition", + "id": f"{protocol_slug}-ProtocolDesign", + "meta": {"profile": [f"{IG_BASE}/StructureDefinition/StudyProtocolSoa"]}, + "url": f"{IG_BASE}/PlanDefinition/{protocol_slug}-ProtocolDesign", + "identifier": [{"use": "usual", "value": f"{protocol_slug}-ProtocolDesign-1"}], + "version": "1.0.0", + "title": f"{study_name} Protocol Schedule of Activities", + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/plan-definition-type", + "code": "clinical-protocol", + } + ] + }, + "status": "active", + "purpose": "The purpose of this PlanDefinition is to illustrate the planned study encounters.", + "action": protocol_actions, + } + + activity_definitions = [ + build_activity_definition(protocol_slug, activities_by_id[aid], bc_by_id) + for aid in activity_def_ids + ] + + all_resources = ( + [protocol_plan_definition] + visit_plan_definitions + activity_definitions + ) + bundle = { + "resourceType": "Bundle", + "type": "collection", + "entry": [{"fullUrl": r["url"], "resource": r} for r in all_resources], + } + + Path(output_path).parent.mkdir(parents=True, exist_ok=True) + with open(output_path, "w") as f: + json.dump(bundle, f, indent=2) + + print(f"Study: {study_name}") + print(f"Protocol slug: {protocol_slug}") + print( + f"Main timeline: {main_timeline['name']} ({len(ordered_visits)} visits walked)" + ) + print(f"Generated {len(all_resources)} resources:") + print( + f" - 1 top-level PlanDefinition (StudyProtocolSoa): {protocol_plan_definition['id']}" + ) + print( + f" - {len(visit_plan_definitions)} per-visit PlanDefinitions (StudyVisitSoa)" + ) + print(f" - {len(activity_definitions)} ActivityDefinitions (StudyActivitySoa)") + coded = sum(1 for a in activity_definitions if "code" in a) + print( + f" ({coded}/{len(activity_definitions)} carry a code, from linked BiomedicalConcepts)" + ) + if total_duplicate_activities: + print( + f"NOTE: skipped {total_duplicate_activities} duplicate activity " + f"references found in the source USDM data (several instances " + f"list every activityId twice) -- deduplicated per visit so " + f"each activity appears once in its PlanDefinition" + ) + other_timelines = [ + tl["name"] + for tl in study_design["scheduleTimelines"] + if not tl.get("mainTimeline") + ] + if other_timelines: + print(f"NOT mapped (out of scope): {', '.join(other_timelines)}") + print(f"\nWrote: {output_path}") + + +if __name__ == "__main__": + usdm_path = ( + sys.argv[1] + if len(sys.argv) > 1 + else ( + "/Users/dmoreland/projects/soa-workbench/output/json/NCT12345678-latest.json" + ) + ) + output_path = ( + sys.argv[2] + if len(sys.argv) > 2 + else ( + "/Users/dmoreland/projects/soa-workbench/output/fhir/NCT12345678-vulcan-soa-latest.json" + ) + ) + main(usdm_path, output_path) From 4b86f0cb23208d35499cb46aa0556bf11af5bd8b Mon Sep 17 00:00:00 2001 From: pendingintent <3921919+pendingintent@users.noreply.github.com> Date: Thu, 23 Jul 2026 14:52:42 -0400 Subject: [PATCH 06/20] CRF Specialization server URL and api-key now configurable. --- config.env | 7 +++++++ src/soa_builder/web/app.py | 15 ++++++++++----- src/soa_builder/web/routers/activities.py | 6 ++++-- src/soa_builder/web/utils.py | 21 +++++++++++++++++++++ 4 files changed, 42 insertions(+), 7 deletions(-) diff --git a/config.env b/config.env index e792af1..8e9660d 100644 --- a/config.env +++ b/config.env @@ -56,6 +56,13 @@ CDISC_BC_API_BASE_URL=https://api.library.cdisc.org/api/cosmos/v2 # Base URL for the CDISC Library CRF Specializations API. # Falls back to CDISC_BC_API_BASE_URL when not set. CDISC_CRF_API_BASE_URL=http://localhost:8000/api/cosmos/v2 +#CDISC_CRF_API_BASE_URL=https://apidev.cdisclibrary.org/api/cosmos/v2 + +# The CDISC Library CRF Specializations API uses a separate +# api-key/subscription-key from the main CDISC Library API. +# Set CDISC_CRF_API_KEY / CDISC_CRF_SUBSCRIPTION_KEY in your +# shell environment (do NOT add them here). Falls back to +# CDISC_API_KEY / CDISC_SUBSCRIPTION_KEY when not set. # Set to 1 to skip all remote CDISC Library API calls. # Useful for offline development or testing. diff --git a/src/soa_builder/web/app.py b/src/soa_builder/web/app.py index 26d8b46..cad8c12 100644 --- a/src/soa_builder/web/app.py +++ b/src/soa_builder/web/app.py @@ -218,6 +218,8 @@ ) from .utils import ( get_cdisc_api_key as _get_cdisc_api_key, + get_cdisc_crf_api_key as _get_cdisc_crf_api_key, + get_cdisc_crf_subscription_key as _get_cdisc_crf_subscription_key, get_concepts_override as _get_concepts_override, get_next_code_uid as _get_next_code_uid, get_next_concept_uid as _get_next_concept_uid, @@ -339,7 +341,10 @@ def _configure_logging(): _migrate_biomedical_concept_audit() _migrate_backfill_biomedical_concept_codes() _migrate_repoint_stale_bc_code_chains() -if os.environ.get("SOA_EAGER_BCP_POPULATION", "1").strip().lower() not in ("0", "false"): +if os.environ.get("SOA_EAGER_BCP_POPULATION", "1").strip().lower() not in ( + "0", + "false", +): _bcp_backfill() _migrate_add_soa_id_indexes() _migrate_add_footnote_table() @@ -1451,8 +1456,8 @@ def _normalize_href(h): f"?biomedicalconcept={code}" ) headers = {"Accept": "application/json"} - api_key = _get_cdisc_api_key() - subscription_key = os.environ.get("CDISC_SUBSCRIPTION_KEY") or api_key + api_key = _get_cdisc_crf_api_key() + subscription_key = _get_cdisc_crf_subscription_key() or api_key if subscription_key: headers["Ocp-Apim-Subscription-Key"] = subscription_key if api_key: @@ -1550,8 +1555,8 @@ def _normalize_href(h): return [] headers = {"Accept": "application/json"} - api_key = _get_cdisc_api_key() - subscription_key = os.environ.get("CDISC_SUBSCRIPTION_KEY") or api_key + api_key = _get_cdisc_crf_api_key() + subscription_key = _get_cdisc_crf_subscription_key() or api_key if subscription_key: headers["Ocp-Apim-Subscription-Key"] = subscription_key if api_key: diff --git a/src/soa_builder/web/routers/activities.py b/src/soa_builder/web/routers/activities.py index 8f0a67e..e633232 100644 --- a/src/soa_builder/web/routers/activities.py +++ b/src/soa_builder/web/routers/activities.py @@ -18,6 +18,8 @@ table_has_columns as _table_has_columns, get_next_concept_uid as _get_next_concept_uid, get_cdisc_api_key as _get_cdisc_api_key, + get_cdisc_crf_api_key as _get_cdisc_crf_api_key, + get_cdisc_crf_subscription_key as _get_cdisc_crf_subscription_key, ) import html as _html @@ -1524,8 +1526,8 @@ def ui_crf_detail_from_activity( import requests as _requests import json as _json - api_key = _get_cdisc_api_key() - subscription_key = os.environ.get("CDISC_SUBSCRIPTION_KEY") + api_key = _get_cdisc_crf_api_key() + subscription_key = _get_cdisc_crf_subscription_key() unified_key = subscription_key or api_key headers: dict = {} if unified_key: diff --git a/src/soa_builder/web/utils.py b/src/soa_builder/web/utils.py index c3c0d78..5527f31 100644 --- a/src/soa_builder/web/utils.py +++ b/src/soa_builder/web/utils.py @@ -176,6 +176,27 @@ def get_cdisc_api_key(): return os.environ.get("CDISC_API_KEY") +def get_cdisc_crf_api_key(): + """Return the API key for the CDISC Library CRF Specializations API. + + Falls back to `CDISC_API_KEY` when `CDISC_CRF_API_KEY` is unset, + since the CRF Specializations API may share credentials with the + main CDISC Library API in some environments. + """ + return os.environ.get("CDISC_CRF_API_KEY") or os.environ.get("CDISC_API_KEY") + + +def get_cdisc_crf_subscription_key(): + """Return the subscription key for the CDISC Library CRF API. + + Falls back to `CDISC_SUBSCRIPTION_KEY` when + `CDISC_CRF_SUBSCRIPTION_KEY` is unset. + """ + return os.environ.get("CDISC_CRF_SUBSCRIPTION_KEY") or os.environ.get( + "CDISC_SUBSCRIPTION_KEY" + ) + + def get_concepts_override(): return os.environ.get("CDISC_CONCEPTS_JSON") From 17b85ffa4de9b38e02f70aefedf8e8b5b73250f9 Mon Sep 17 00:00:00 2001 From: pendingintent <3921919+pendingintent@users.noreply.github.com> Date: Thu, 23 Jul 2026 16:17:15 -0400 Subject: [PATCH 07/20] Initial commit of CDISC BC Groupings browser. --- config.env | 22 + src/soa_builder/web/routers/concept_groups.py | 153 ++++ src/soa_builder/web/static/bc_explorer.js | 417 +++++++++ .../web/templates/bc_explorer.html | 867 ++++++++++++++++++ src/soa_builder/web/templates/bc_status.html | 14 + .../web/templates/concept_groups.html | 13 +- tests/test_routers_bc_grouping.py | 226 +++++ 7 files changed, 1710 insertions(+), 2 deletions(-) create mode 100644 src/soa_builder/web/static/bc_explorer.js create mode 100644 src/soa_builder/web/templates/bc_explorer.html create mode 100644 src/soa_builder/web/templates/bc_status.html create mode 100644 tests/test_routers_bc_grouping.py diff --git a/config.env b/config.env index 8e9660d..1148075 100644 --- a/config.env +++ b/config.env @@ -99,6 +99,28 @@ SOA_BUILDER_CACHE_TTL=3600 CDISC_REQUEST_TIMEOUT=15 +# ------------------------------------------------------------ +# Biomedical Concept Grouping Service +# ------------------------------------------------------------ + +# Base URL for the cdisc-biomedical-concept-groupings service +# (BC classification schemes/values/assignments powering the +# BC Grouping Explorer on the Concept Groups page). Run it via +# `python run.py` from the cdisc-biomedical-concept-groupings +# submodule directory. +BC_GROUPING_SERVICE_URL=http://127.0.0.1:8901 + +# Timeout (in seconds) for outbound HTTP requests to the +# BC Grouping service. Kept short since this is expected to be +# a local service — fail fast rather than hang the page load. +BC_GROUPING_REQUEST_TIMEOUT=3 + +# Time-to-live (in seconds) for the BC Grouping data cache. +# Default is 300 (5 minutes). Use the "Refresh" button on the +# BC Grouping Explorer to force an immediate refresh. +BC_GROUPING_CACHE_TTL=300 + + # ------------------------------------------------------------ # Biomedical Concept Property Population # ------------------------------------------------------------ diff --git a/src/soa_builder/web/routers/concept_groups.py b/src/soa_builder/web/routers/concept_groups.py index 79519d9..074fbdd 100644 --- a/src/soa_builder/web/routers/concept_groups.py +++ b/src/soa_builder/web/routers/concept_groups.py @@ -1,7 +1,9 @@ import logging import os +import time from typing import List, Optional +import requests from fastapi import APIRouter, BackgroundTasks, Form, HTTPException, Request from fastapi.responses import HTMLResponse, JSONResponse, RedirectResponse from fastapi.templating import Jinja2Templates @@ -868,3 +870,154 @@ def ui_remove_group_from_activity( from .bc_surrogates import _render_concepts_cell return _render_concepts_cell(request, soa_id, activity_id) + + +# --------------------------------------------------------------------------- +# BC Grouping Explorer — proxy to the cdisc-biomedical-concept-groupings +# service. This section is independent of the Custom Concept Groups +# code above: it makes no changes to ui_list_concept_groups and adds +# no data to its response. +# --------------------------------------------------------------------------- + +_BC_GROUPING_SERVICE_URL = os.environ.get( + "BC_GROUPING_SERVICE_URL", "http://127.0.0.1:8901" +) +_BC_GROUPING_REQUEST_TIMEOUT = float(os.environ.get("BC_GROUPING_REQUEST_TIMEOUT", "3")) +_BC_GROUPING_CACHE_TTL = int(os.environ.get("BC_GROUPING_CACHE_TTL", "300")) +_BC_GROUPING_PAGE_LIMIT = 500 + +_bc_grouping_cache = {"data": None, "fetched_at": 0} + + +def _bc_grouping_fetch_all(path: str, limit: int = _BC_GROUPING_PAGE_LIMIT) -> list: + """GET every page of a paginated bc-grouping-service list endpoint.""" + items = [] + offset = 0 + while True: + resp = requests.get( + f"{_BC_GROUPING_SERVICE_URL}{path}", + params={"limit": limit, "offset": offset}, + timeout=_BC_GROUPING_REQUEST_TIMEOUT, + ) + resp.raise_for_status() + page = resp.json() + items.extend(page.get("items", [])) + offset += limit + if offset >= page.get("total", 0): + break + return items + + +def fetch_bc_grouping_data(force: bool = False) -> dict: + """Fetch (and cache) BC/scheme/value/assignment data from the + bc-grouping service. Never raises — on any failure, returns + available=False with a human-readable detail message. + """ + now = time.time() + if ( + not force + and _bc_grouping_cache.get("data") + and now - _bc_grouping_cache.get("fetched_at", 0) < _BC_GROUPING_CACHE_TTL + ): + return _bc_grouping_cache["data"] + + try: + data = { + "bcs": _bc_grouping_fetch_all("/biomedical-concepts"), + "schemes": _bc_grouping_fetch_all("/classification-schemes"), + "values": _bc_grouping_fetch_all("/classification-values"), + "assignments": _bc_grouping_fetch_all("/classification-assignments"), + } + result = {"available": True, "detail": "", "data": data} + except requests.exceptions.Timeout: + result = { + "available": False, + "detail": ( + "BC Grouping service timed out. It may be slow to start " + "or temporarily unavailable." + ), + "data": None, + } + except requests.exceptions.ConnectionError: + result = { + "available": False, + "detail": ( + "BC Grouping service is not reachable at " + f"{_BC_GROUPING_SERVICE_URL}. Make sure it is running " + "(python run.py in cdisc-biomedical-concept-groupings)." + ), + "data": None, + } + except Exception as exc: + logger.warning("BC Grouping service fetch failed: %s", exc) + result = { + "available": False, + "detail": "BC Grouping service request failed. See server logs.", + "data": None, + } + + if result["available"]: + _bc_grouping_cache["data"] = result + _bc_grouping_cache["fetched_at"] = now + return result + + +@ui_router.get("/ui/concept-groups/bc-status", response_class=HTMLResponse) +def ui_bc_grouping_status(request: Request): + """Return HTML partial indicating BC Grouping service availability.""" + try: + resp = requests.get( + f"{_BC_GROUPING_SERVICE_URL}/health", + timeout=_BC_GROUPING_REQUEST_TIMEOUT, + ) + if resp.status_code < 500: + status, detail = "ok", "BC Grouping service is connected." + else: + status = "error" + detail = f"BC Grouping service returned HTTP {resp.status_code}." + except requests.exceptions.Timeout: + status, detail = ( + "error", + "BC Grouping service timed out. It may be temporarily unavailable.", + ) + except requests.exceptions.ConnectionError: + status, detail = ( + "error", + (f"BC Grouping service is not reachable at {_BC_GROUPING_SERVICE_URL}."), + ) + except Exception as exc: + logger.warning("BC Grouping service health check failed: %s", exc) + status, detail = ( + "error", + "BC Grouping service check failed. See server logs.", + ) + + return templates.TemplateResponse( + request, + "bc_status.html", + {"status": status, "detail": detail}, + ) + + +@ui_router.get("/ui/concept-groups/bc-explorer", response_class=HTMLResponse) +def ui_bc_explorer(request: Request): + """Return the BC Grouping Explorer partial (or an unavailable card).""" + result = fetch_bc_grouping_data() + return templates.TemplateResponse( + request, + "bc_explorer.html", + { + "available": result["available"], + "detail": result["detail"], + "data": result["data"], + }, + ) + + +@ui_router.post("/ui/concept-groups/bc-explorer/refresh", response_class=HTMLResponse) +def ui_bc_explorer_refresh(request: Request): + """Force refresh of the BC Grouping cache and redirect back to the list.""" + fetch_bc_grouping_data(force=True) + if request.headers.get("HX-Request") == "true": + return HTMLResponse("", headers={"HX-Redirect": "/ui/concept-groups"}) + return HTMLResponse("") diff --git a/src/soa_builder/web/static/bc_explorer.js b/src/soa_builder/web/static/bc_explorer.js new file mode 100644 index 0000000..810a450 --- /dev/null +++ b/src/soa_builder/web/static/bc_explorer.js @@ -0,0 +1,417 @@ +// BC Grouping Explorer — adapted from cdisc-biomedical-concept-groupings/ +// bc-explorer-prototype.html. Data is seeded server-side into BC_DATA +// (see templates/bc_explorer.html) instead of being loaded from an +// embedded mock or a client-side XLSX import. + +let store = BC_DATA; +let activeFilters = {}; // scheme_id -> Set of value_ids +let collapsedSchemes = new Set(); +let showZeros = false; +let searchQuery = ''; +let searchAllProperties = false; +let currentView = 'explorer'; +let selectedBcId = null; + +// ─── Lookup helpers ─── +function valueById(id) { return store.values.find(v => v.value_id === id); } +function schemeById(id) { return store.schemes.find(s => s.scheme_id === id); } +function bcById(id) { return store.bcs.find(b => b.bc_id === id); } +function assignmentsForBc(bcId) { return store.assignments.filter(a => a.bc_id === bcId); } +function bcsForValue(valueId) { + const bcIds = new Set(store.assignments.filter(a => a.value_id === valueId).map(a => a.bc_id)); + return store.bcs.filter(b => bcIds.has(b.bc_id)); +} +function valuesForScheme(schemeId) { return store.values.filter(v => v.scheme_id === schemeId); } + +// ─── Search match helper ─── +function bcMatchesSearch(bc, q) { + if (bc.short_name.toLowerCase().includes(q)) return true; + if (bc.bc_id.toLowerCase().includes(q)) return true; + if (bc.ncit_code.toLowerCase().includes(q)) return true; + if (!searchAllProperties) return false; + const asgns = assignmentsForBc(bc.bc_id); + return asgns.some(a => { + const v = valueById(a.value_id); + if (!v) return false; + if (v.label.toLowerCase().includes(q)) return true; + if (v.description && v.description.toLowerCase().includes(q)) return true; + return false; + }); +} + +// ─── Filtering logic ─── +function getFilteredBcs() { + let bcs = store.bcs; + + if (searchQuery) { + const q = searchQuery.toLowerCase(); + bcs = bcs.filter(bc => bcMatchesSearch(bc, q)); + } + + // Facet filters: AND across schemes, OR within a scheme + const activeSchemes = Object.keys(activeFilters).filter(k => activeFilters[k].size > 0); + if (activeSchemes.length > 0) { + bcs = bcs.filter(bc => { + const asgns = assignmentsForBc(bc.bc_id); + return activeSchemes.every(schemeId => { + const selectedValues = activeFilters[schemeId]; + return asgns.some(a => a.scheme_id === schemeId && selectedValues.has(a.value_id)); + }); + }); + } + + return bcs; +} + +function getValueCountForFiltered(valueId, schemeId) { + // count how many currently-filtered BCs have this value + // but ignore filters from the same scheme (so counts stay useful) + const activeSchemes = Object.keys(activeFilters).filter(k => activeFilters[k].size > 0 && k !== schemeId); + let bcs = store.bcs; + + if (searchQuery) { + const q = searchQuery.toLowerCase(); + bcs = bcs.filter(bc => bcMatchesSearch(bc, q)); + } + + if (activeSchemes.length > 0) { + bcs = bcs.filter(bc => { + const asgns = assignmentsForBc(bc.bc_id); + return activeSchemes.every(sid => { + const sv = activeFilters[sid]; + return asgns.some(a => a.scheme_id === sid && sv.has(a.value_id)); + }); + }); + } + + const bcIds = new Set(bcs.map(b => b.bc_id)); + return store.assignments.filter(a => a.value_id === valueId && bcIds.has(a.bc_id)).length; +} + +// ─── Highlight helper ─── +function highlight(text, query) { + if (!query) return text; + const esc = query.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + return text.replace(new RegExp(`(${esc})`, 'gi'), '$1'); +} + +// ─── Expand/collapse all helper ─── +function updateExpandAllBtn() { + const btn = document.getElementById('expandAllBtn'); + if (!btn || !store.schemes.length) return; + const allCollapsed = store.schemes.every(s => collapsedSchemes.has(s.scheme_id)); + btn.textContent = allCollapsed ? 'Expand all' : 'Collapse all'; +} + +// ─── Render: Facet sidebar ─── +function renderFacets() { + const container = document.getElementById('facets'); + const hasFilters = Object.values(activeFilters).some(s => s.size > 0); + const hasActive = hasFilters || searchQuery.length > 0; + document.getElementById('clearFilters').classList.toggle('visible', hasActive); + + container.innerHTML = store.schemes.map(scheme => { + const values = valuesForScheme(scheme.scheme_id); + const isActive = activeFilters[scheme.scheme_id] && activeFilters[scheme.scheme_id].size > 0; + const isCollapsed = collapsedSchemes.has(scheme.scheme_id); + + return ` +
+
+

${scheme.name}

+ +
+
+ ${values.map(v => { + const count = getValueCountForFiltered(v.value_id, scheme.scheme_id); + const active = activeFilters[scheme.scheme_id] && activeFilters[scheme.scheme_id].has(v.value_id); + if (!showZeros && count === 0 && !active) return ''; + return ` +
+
+ ${v.label} + ${count} +
`; + }).join('')} +
+
`; + }).join(''); + + // Event delegation + container.querySelectorAll('.facet-header').forEach(h => { + h.addEventListener('click', () => { + const schemeId = h.dataset.scheme; + if (collapsedSchemes.has(schemeId)) { + collapsedSchemes.delete(schemeId); + } else { + collapsedSchemes.add(schemeId); + } + h.classList.toggle('collapsed'); + h.nextElementSibling.classList.toggle('collapsed'); + updateExpandAllBtn(); + }); + }); + updateExpandAllBtn(); + + container.querySelectorAll('.facet-item').forEach(item => { + item.addEventListener('click', () => { + const schemeId = item.dataset.scheme; + const valueId = item.dataset.value; + if (!activeFilters[schemeId]) activeFilters[schemeId] = new Set(); + if (activeFilters[schemeId].has(valueId)) { + activeFilters[schemeId].delete(valueId); + } else { + activeFilters[schemeId].add(valueId); + } + renderAll(); + }); + }); + + const showZerosBtn = document.getElementById('showZerosBtn'); + if (showZerosBtn) { + showZerosBtn.disabled = store.bcs.length === 0; + showZerosBtn.textContent = showZeros ? 'Hide zeros' : 'Show zeros'; + showZerosBtn.classList.toggle('on', showZeros); + showZerosBtn.title = showZeros + ? 'Currently showing all classification values, including those with 0 BCs. Click to hide them.' + : 'Some classification values are hidden because they have 0 matching BCs. Click to reveal them.'; + } +} + +// ─── Render: Explorer view ─── +function renderExplorer() { + const container = document.getElementById('explorerView'); + const bcs = getFilteredBcs(); + + container.innerHTML = `
${bcs.map((bc, i) => { + const asgns = assignmentsForBc(bc.bc_id); + const tags = asgns.map(a => { + const v = valueById(a.value_id); + return v ? `${highlight(v.label, searchQuery)}` : ''; + }).join(''); + + return ` +
+
${highlight(bc.bc_id, searchQuery)}
+
${highlight(bc.short_name, searchQuery)}
+
${tags}
+
`; + }).join('')}
`; + + container.querySelectorAll('.bc-card').forEach(card => { + card.addEventListener('click', () => openDetail(card.dataset.bc)); + }); +} + +// ─── Render: Browse view (grouped by scheme, then value) ─── +function renderMatrix() { + const container = document.getElementById('matrixView'); + const filteredBcIds = new Set(getFilteredBcs().map(b => b.bc_id)); + + const schemeBlocks = store.schemes.map(scheme => { + const values = valuesForScheme(scheme.scheme_id); + + const valueRows = values.map(v => { + const bcs = bcsForValue(v.value_id).filter(b => filteredBcIds.has(b.bc_id)); + if (bcs.length === 0) return ''; + return ` +
+
+ ${v.label} + ${bcs.length} + +
+
+ ${bcs.map(bc => `${highlight(bc.short_name, searchQuery)}`).join('')} +
+
`; + }).join(''); + + if (!valueRows.trim()) return ''; + return ` +
+
+

${scheme.name}

+

${scheme.purpose}

+
+
${valueRows}
+
`; + }).join(''); + + container.innerHTML = `
${schemeBlocks}
`; + + container.querySelectorAll('.bc-chip').forEach(chip => { + chip.addEventListener('click', () => openDetail(chip.dataset.bc)); + }); + + container.querySelectorAll('.grouped-value-meta').forEach(meta => { + meta.addEventListener('click', () => { + const schemeId = meta.dataset.scheme; + const valueId = meta.dataset.value; + if (!activeFilters[schemeId]) activeFilters[schemeId] = new Set(); + activeFilters[schemeId].clear(); + activeFilters[schemeId].add(valueId); + switchView('explorer'); + renderAll(); + }); + }); +} + +// ─── Detail panel ─── +function openDetail(bcId) { + selectedBcId = bcId; + const bc = bcById(bcId); + if (!bc) return; + + const asgns = assignmentsForBc(bcId); + const panel = document.getElementById('detailPanel'); + const content = document.getElementById('detailContent'); + + // Group assignments by scheme + const grouped = {}; + asgns.forEach(a => { + if (!grouped[a.scheme_id]) grouped[a.scheme_id] = []; + grouped[a.scheme_id].push(a); + }); + + // Find related BCs (share at least one value) + const myValues = new Set(asgns.map(a => a.value_id)); + const relatedIds = new Set(); + store.assignments.forEach(a => { + if (a.bc_id !== bcId && myValues.has(a.value_id)) relatedIds.add(a.bc_id); + }); + + content.innerHTML = ` +
${bc.ncit_code}
+
${bc.short_name}
+
+ ${store.schemes.map(scheme => { + const vals = grouped[scheme.scheme_id] || []; + if (vals.length === 0) return ''; + return ` +
+
${scheme.name}
+ ${vals.map(a => { + const v = valueById(a.value_id); + return v ? `
+
${v.label}
+
${v.description}
+
` : ''; + }).join('')} +
`; + }).join('')} +
+
Related BCs (${relatedIds.size})
+
${[...relatedIds].map(rid => { + const r = bcById(rid); + return r ? `${r.short_name}` : ''; + }).join('')}
+
`; + + panel.classList.add('open'); + + content.querySelectorAll('.related-bc').forEach(el => { + el.addEventListener('click', () => openDetail(el.dataset.bc)); + }); + + // Update card / chip selection + document.querySelectorAll('.bc-card, .bc-chip').forEach(c => c.classList.toggle('selected', c.dataset.bc === bcId)); +} + +function closeDetail() { + selectedBcId = null; + document.getElementById('detailPanel').classList.remove('open'); + document.querySelectorAll('.bc-card.selected, .bc-chip.selected').forEach(c => c.classList.remove('selected')); +} + +// ─── View switching ─── +function switchView(view) { + currentView = view; + document.querySelectorAll('.view-tab').forEach(t => t.classList.toggle('active', t.dataset.view === view)); + document.getElementById('explorerView').classList.toggle('hidden', view !== 'explorer'); + document.getElementById('matrixView').classList.toggle('hidden', view !== 'matrix'); + document.getElementById('sidebar').style.display = ''; +} + +// ─── Master render ─── +function renderAll() { + const count = getFilteredBcs().length; + document.getElementById('searchCount').textContent = `${count} of ${store.bcs.length} BCs`; + renderFacets(); + if (currentView === 'explorer') renderExplorer(); + else if (currentView === 'matrix') renderMatrix(); +} + +// ─── Event wiring ─── +// NOTE: this script is injected dynamically by an HTMX swap, well after +// the page's own DOMContentLoaded has already fired — so it must not +// wait for that event (it would never fire again). By the time this +// script runs, the explorer's markup (from bc_explorer.html) is already +// in the DOM, since HTMX swaps the HTML in before executing scripts +// found within it. +(() => { + // View tabs + document.querySelectorAll('.view-tab').forEach(tab => { + tab.addEventListener('click', () => { + switchView(tab.dataset.view); + renderAll(); + }); + }); + + // Search + document.getElementById('globalSearch').addEventListener('input', e => { + searchQuery = e.target.value.trim(); + document.getElementById('searchClearBtn').classList.toggle('hidden', !searchQuery); + renderAll(); + }); + + // Clear search ✕ + document.getElementById('searchClearBtn').addEventListener('click', () => { + searchQuery = ''; + document.getElementById('globalSearch').value = ''; + document.getElementById('searchClearBtn').classList.add('hidden'); + renderAll(); + }); + + // Search scope toggle + document.getElementById('searchScopeBtn').addEventListener('click', () => { + searchAllProperties = !searchAllProperties; + const btn = document.getElementById('searchScopeBtn'); + btn.textContent = searchAllProperties ? 'All fields' : 'Names only'; + btn.classList.toggle('on', searchAllProperties); + if (searchQuery) renderAll(); + }); + + // Clear all (filters + search) + document.getElementById('clearFilters').addEventListener('click', () => { + activeFilters = {}; + searchQuery = ''; + document.getElementById('globalSearch').value = ''; + document.getElementById('searchClearBtn').classList.add('hidden'); + renderAll(); + }); + + // Show / hide zero-count facet values + document.getElementById('showZerosBtn').addEventListener('click', () => { + showZeros = !showZeros; + renderFacets(); + }); + + // Expand / collapse all facets + document.getElementById('expandAllBtn').addEventListener('click', () => { + const allCollapsed = store.schemes.every(s => collapsedSchemes.has(s.scheme_id)); + if (allCollapsed) { + collapsedSchemes.clear(); + } else { + store.schemes.forEach(s => collapsedSchemes.add(s.scheme_id)); + } + renderFacets(); + }); + + // Close detail + document.getElementById('detailClose').addEventListener('click', closeDetail); + document.addEventListener('keydown', e => { if (e.key === 'Escape') closeDetail(); }); + + switchView('explorer'); + renderAll(); +})(); diff --git a/src/soa_builder/web/templates/bc_explorer.html b/src/soa_builder/web/templates/bc_explorer.html new file mode 100644 index 0000000..016e703 --- /dev/null +++ b/src/soa_builder/web/templates/bc_explorer.html @@ -0,0 +1,867 @@ +{% if not available %} +
+ +
+ BC Grouping Explorer unavailable. + {{ detail }} +
+
+ +
+
+{% else %} + + +
+ +
+
+
+ +
+
+
+ CDISC + BC Grouping Explorer +
+
+ + + + +
+ + +
+ +
+ +
+
+ +
+ + +
+
+ +
+
+ +
+ +
+
+ +
+ + + +{% endif %} diff --git a/src/soa_builder/web/templates/bc_status.html b/src/soa_builder/web/templates/bc_status.html new file mode 100644 index 0000000..2041e66 --- /dev/null +++ b/src/soa_builder/web/templates/bc_status.html @@ -0,0 +1,14 @@ +{% if status == "ok" %} +
+ + BC Grouping Service is connected. +
+{% elif status == "error" %} +
+ +
+ BC Grouping Service unavailable. + {{ detail }} +
+
+{% endif %} diff --git a/src/soa_builder/web/templates/concept_groups.html b/src/soa_builder/web/templates/concept_groups.html index b24ba9c..91fc7cf 100644 --- a/src/soa_builder/web/templates/concept_groups.html +++ b/src/soa_builder/web/templates/concept_groups.html @@ -9,8 +9,17 @@

CDISC Concept Groups

-
-

__PLACEHOLDER__

+
+
+ +
+
Loading BC Grouping Explorer…

diff --git a/tests/test_routers_bc_grouping.py b/tests/test_routers_bc_grouping.py new file mode 100644 index 0000000..a310a9b --- /dev/null +++ b/tests/test_routers_bc_grouping.py @@ -0,0 +1,226 @@ +"""Tests for the BC Grouping Explorer proxy routes on the Concept +Groups page (routers/concept_groups.py). These cover only the new +BC-grouping-service integration; the Custom Concept Groups feature +on the same page is covered by the regression smoke test below. +""" + +from types import SimpleNamespace + +import pytest +import requests +from fastapi.testclient import TestClient + +from soa_builder.web.app import app +from soa_builder.web.routers.concept_groups import _bc_grouping_cache + +client = TestClient(app) + + +class DummyResponse: + def __init__(self, payload, status_code=200): + self._payload = payload + self.status_code = status_code + + def json(self): + return self._payload + + def raise_for_status(self): + if self.status_code >= 400: + raise requests.exceptions.HTTPError(f"HTTP {self.status_code}") + + +@pytest.fixture(autouse=True) +def clear_bc_grouping_cache(): + _bc_grouping_cache["data"] = None + _bc_grouping_cache["fetched_at"] = 0 + + +def _paged_get(pages_by_path): + """Build a fake requests.get that pages through pages_by_path. + + pages_by_path: {path: [ (items, total), ... ]} — one page per call, + keyed by request-count for that path. + """ + call_index = {} + + def fake_get(url, params=None, timeout=None): + for path, pages in pages_by_path.items(): + if url.endswith(path): + idx = call_index.get(path, 0) + items, total = pages[idx] + call_index[path] = idx + 1 + return DummyResponse({"items": items, "total": total}) + raise AssertionError(f"Unexpected URL: {url}") + + return fake_get + + +def _happy_path_get(monkeypatch, call_counter=None): + bcs = [{"bc_id": "C1", "short_name": "Sex", "ncit_code": "C1"}] + schemes = [ + { + "scheme_id": "concept_group", + "name": "Concept Group", + "description": "", + "purpose": "", + "intended_use": "", + } + ] + values = [ + { + "value_id": "cg_demo", + "scheme_id": "concept_group", + "label": "Demographics", + "description": "", + } + ] + # Two pages of assignments to exercise the pagination loop. + assignments_page1 = [ + { + "assignment_id": "a1", + "bc_id": "C1", + "scheme_id": "concept_group", + "value_id": "cg_demo", + } + ] + assignments_page2 = [ + { + "assignment_id": "a2", + "bc_id": "C1", + "scheme_id": "concept_group", + "value_id": "cg_demo", + } + ] + + fake_get = _paged_get( + { + "/biomedical-concepts": [(bcs, 1)], + "/classification-schemes": [(schemes, 1)], + "/classification-values": [(values, 1)], + "/classification-assignments": [ + (assignments_page1, 2), + (assignments_page2, 2), + ], + } + ) + + def counting_get(url, params=None, timeout=None): + if call_counter is not None: + call_counter.n += 1 + return fake_get(url, params=params, timeout=timeout) + + monkeypatch.setattr("requests.get", counting_get) + + +def test_bc_explorer_happy_path(monkeypatch): + _happy_path_get(monkeypatch) + + resp = client.get("/ui/concept-groups/bc-explorer") + assert resp.status_code == 200 + assert "BC Grouping Explorer unavailable" not in resp.text + assert "Demographics" in resp.text + assert "Sex" in resp.text + + +def test_bc_explorer_connection_error(monkeypatch): + def fake_get(url, params=None, timeout=None): + raise requests.exceptions.ConnectionError("boom") + + monkeypatch.setattr("requests.get", fake_get) + + resp = client.get("/ui/concept-groups/bc-explorer") + assert resp.status_code == 200 + assert "BC Grouping Explorer unavailable" in resp.text + assert "not reachable" in resp.text + + +def test_bc_explorer_timeout(monkeypatch): + def fake_get(url, params=None, timeout=None): + raise requests.exceptions.Timeout("boom") + + monkeypatch.setattr("requests.get", fake_get) + + resp = client.get("/ui/concept-groups/bc-explorer") + assert resp.status_code == 200 + assert "BC Grouping Explorer unavailable" in resp.text + assert "timed out" in resp.text + + +def test_bc_explorer_cache_hit_and_refresh(monkeypatch): + call_counter = SimpleNamespace(n=0) + _happy_path_get(monkeypatch, call_counter=call_counter) + + resp1 = client.get("/ui/concept-groups/bc-explorer") + assert resp1.status_code == 200 + calls_after_first = call_counter.n + assert calls_after_first > 0 + + # Second call within TTL should hit the cache — no new HTTP calls. + resp2 = client.get("/ui/concept-groups/bc-explorer") + assert resp2.status_code == 200 + assert call_counter.n == calls_after_first + + # Refresh forces a bypass. + refresh_resp = client.post("/ui/concept-groups/bc-explorer/refresh") + assert refresh_resp.status_code == 200 + assert call_counter.n > calls_after_first + + +def test_bc_grouping_pagination_helper_concatenates_all_pages(monkeypatch): + """Focused unit test of the pagination loop: total exceeds one page.""" + from soa_builder.web.routers.concept_groups import _bc_grouping_fetch_all + + pages = [ + ({"items": [{"id": 1}, {"id": 2}], "total": 5}), + ({"items": [{"id": 3}, {"id": 4}], "total": 5}), + ({"items": [{"id": 5}], "total": 5}), + ] + call_count = SimpleNamespace(n=0) + + def fake_get(url, params=None, timeout=None): + page = pages[call_count.n] + call_count.n += 1 + return DummyResponse(page) + + monkeypatch.setattr("requests.get", fake_get) + + items = _bc_grouping_fetch_all("/classification-assignments", limit=2) + assert call_count.n == 3 + assert [i["id"] for i in items] == [1, 2, 3, 4, 5] + + +def test_bc_status_ok(monkeypatch): + def fake_get(url, timeout=None): + return DummyResponse({"status": "ok"}) + + monkeypatch.setattr("requests.get", fake_get) + + resp = client.get("/ui/concept-groups/bc-status") + assert resp.status_code == 200 + assert "BC Grouping Service is connected" in resp.text + + +def test_bc_status_connection_error(monkeypatch): + def fake_get(url, timeout=None): + raise requests.exceptions.ConnectionError("boom") + + monkeypatch.setattr("requests.get", fake_get) + + resp = client.get("/ui/concept-groups/bc-status") + assert resp.status_code == 200 + assert "BC Grouping Service unavailable" in resp.text + + +def test_concept_groups_page_smoke_and_custom_groups_unchanged(): + """GET /ui/concept-groups makes no bc-grouping-service call itself, + so no monkeypatching is needed here. Regression guard: Custom + Concept Groups markup must still be present and the placeholder + must be gone. + """ + resp = client.get("/ui/concept-groups") + assert resp.status_code == 200 + assert "Custom Concept Groups" in resp.text + assert 'action="/ui/concept-groups/create"' in resp.text + assert "bc-explorer-root" in resp.text + assert "bc-status-notice" in resp.text + assert "__PLACEHOLDER__" not in resp.text From ce5580e709329e82839a35af633d4dc31b7bb44f Mon Sep 17 00:00:00 2001 From: pendingintent <3921919+pendingintent@users.noreply.github.com> Date: Fri, 24 Jul 2026 15:56:48 -0400 Subject: [PATCH 08/20] Add CDISC classification groups to the Activities "Add group" dropdown Materializes CDISC biomedical-concept classification data (schemes, values, and BC assignments from the cdisc-biomedical-concept-groupings service) into the existing concept_group/concept_group_concept tables, tagged as CDISC-sourced. Synced at app startup and via the BC Explorer refresh button, with a full idempotent replace-sync that never touches user-created Custom Concept Groups and survives the grouping service being temporarily unavailable. Because CDISC groups are just more rows in the existing tables, the whole assign/remove/display pipeline works for them unchanged. The "Add group" dropdown (concepts_cell.html, shared by the Activities page and SoA grid) now organizes options into scheme optgroups (COA Type, Collection Method, Concept Group, Implementation Domain Code, Age Category, Therapeutic Area) followed by Custom Concept Groups, and assigned-group headers show scheme context. The Custom Concept Groups admin page and its CRUD routes are scoped to user-created groups only. Consolidates three previously-duplicated "fetch concept groups for the dropdown" queries into one shared helper. --- src/soa_builder/web/app.py | 69 ++- src/soa_builder/web/migrate_database.py | 30 ++ src/soa_builder/web/routers/activities.py | 13 +- src/soa_builder/web/routers/bc_surrogates.py | 25 +- src/soa_builder/web/routers/concept_groups.py | 223 +++++++--- .../web/templates/concepts_cell.html | 16 +- tests/test_cdisc_concept_group_sync.py | 396 ++++++++++++++++++ 7 files changed, 692 insertions(+), 80 deletions(-) create mode 100644 tests/test_cdisc_concept_group_sync.py diff --git a/src/soa_builder/web/app.py b/src/soa_builder/web/app.py index cad8c12..0210253 100644 --- a/src/soa_builder/web/app.py +++ b/src/soa_builder/web/app.py @@ -79,6 +79,7 @@ _migrate_add_activity_surrogate_table, _migrate_add_bc_surrogate_audit_table, _migrate_add_concept_group_table, + _migrate_concept_group_add_cdisc_source_columns, _migrate_activity_concept_add_concept_group_uid, _migrate_surrogate_add_concept_group_uid, _migrate_activity_surrogate_add_concept_group_uid, @@ -357,6 +358,7 @@ def _configure_logging(): _migrate_add_activity_surrogate_table() _migrate_add_bc_surrogate_audit_table() _migrate_add_concept_group_table() +_migrate_concept_group_add_cdisc_source_columns() _migrate_activity_concept_add_concept_group_uid() _migrate_surrogate_add_concept_group_uid() _migrate_activity_surrogate_add_concept_group_uid() @@ -1643,6 +1645,13 @@ async def lifespan(app: FastAPI): logger.info("Lifespan preload CRF specializations count=%d", len(crf_specs)) except Exception as e: logger.error("Lifespan CRF specializations preload failed: %s", e) + try: + from .routers.concept_groups import sync_cdisc_concept_groups + + summary = sync_cdisc_concept_groups(force=True) + logger.info("Lifespan CDISC concept-group sync: %s", summary) + except Exception as e: + logger.error("Lifespan CDISC concept-group sync failed: %s", e) try: import threading from concurrent.futures import ThreadPoolExecutor @@ -2340,17 +2349,65 @@ def _get_activity_concepts(activity_id: int): return rows -def _get_concept_groups_for_cell(soa_id: int, activity_id: int): - """Return (concept_groups, activity_group_uids) for concepts_cell rendering.""" +_CDISC_SCHEME_HEADING_ORDER = [ + "COA Type", + "Collection Method", + "Concept Group", + "Implementation Domain Code", + "Age Category", + "Therapeutic Area", +] + + +def _get_concept_group_sections(): + """Return concept_group rows organized into "Add group" dropdown + sections: one per CDISC classification scheme (in a fixed display + order), then "Custom Concept Groups" last. Only non-empty sections + are included. Each group dict has {id, concept_group_uid, name, + label} — unchanged shape from before CDISC groups existed. + """ conn = _connect() cur = conn.cursor() cur.execute( - "SELECT id, concept_group_uid, name, label FROM concept_group ORDER BY id" + "SELECT id, concept_group_uid, name, label, source, cdisc_scheme_name " + "FROM concept_group ORDER BY id" ) - concept_groups = [ - {"id": r[0], "concept_group_uid": r[1], "name": r[2], "label": r[3]} - for r in cur.fetchall() + rows = cur.fetchall() + conn.close() + + by_heading = {} + for r in rows: + source, cdisc_scheme_name = r[4], r[5] + heading = ( + cdisc_scheme_name + if source == "cdisc" and cdisc_scheme_name + else "Custom Concept Groups" + ) + by_heading.setdefault(heading, []).append( + {"id": r[0], "concept_group_uid": r[1], "name": r[2], "label": r[3]} + ) + + sections = [ + {"heading": heading, "groups": by_heading[heading]} + for heading in _CDISC_SCHEME_HEADING_ORDER + if heading in by_heading ] + if "Custom Concept Groups" in by_heading: + sections.append( + { + "heading": "Custom Concept Groups", + "groups": by_heading["Custom Concept Groups"], + } + ) + return sections + + +def _get_concept_groups_for_cell(soa_id: int, activity_id: int): + """Return (concept_group_sections, activity_group_uids) for + concepts_cell rendering.""" + concept_groups = _get_concept_group_sections() + conn = _connect() + cur = conn.cursor() has_group = _table_has_columns(cur, "activity_concept", ("concept_group_uid",)) if has_group: cur.execute( diff --git a/src/soa_builder/web/migrate_database.py b/src/soa_builder/web/migrate_database.py index ebaa923..33986c7 100644 --- a/src/soa_builder/web/migrate_database.py +++ b/src/soa_builder/web/migrate_database.py @@ -1581,6 +1581,36 @@ def _migrate_add_concept_group_table(): logger.warning("_migrate_add_concept_group_table failed: %s", e) +def _migrate_concept_group_add_cdisc_source_columns(): + """Add columns to concept_group distinguishing CDISC-sourced rows + (materialized from the cdisc-biomedical-concept-groupings service) + from user-created Custom Concept Groups. + """ + try: + conn = _connect() + cur = conn.cursor() + cur.execute("PRAGMA table_info(concept_group)") + cols = {r[1] for r in cur.fetchall()} + if "source" not in cols: + cur.execute( + "ALTER TABLE concept_group ADD COLUMN source TEXT DEFAULT 'custom'" + ) + logger.info("Added source column to concept_group") + if "cdisc_scheme_id" not in cols: + cur.execute("ALTER TABLE concept_group ADD COLUMN cdisc_scheme_id TEXT") + logger.info("Added cdisc_scheme_id column to concept_group") + if "cdisc_scheme_name" not in cols: + cur.execute("ALTER TABLE concept_group ADD COLUMN cdisc_scheme_name TEXT") + logger.info("Added cdisc_scheme_name column to concept_group") + if "cdisc_value_id" not in cols: + cur.execute("ALTER TABLE concept_group ADD COLUMN cdisc_value_id TEXT") + logger.info("Added cdisc_value_id column to concept_group") + conn.commit() + conn.close() + except Exception as e: + logger.warning("_migrate_concept_group_add_cdisc_source_columns failed: %s", e) + + def _migrate_activity_concept_add_concept_group_uid(): """Add concept_group_uid column to activity_concept if missing.""" try: diff --git a/src/soa_builder/web/routers/activities.py b/src/soa_builder/web/routers/activities.py index e633232..9dde93d 100644 --- a/src/soa_builder/web/routers/activities.py +++ b/src/soa_builder/web/routers/activities.py @@ -723,14 +723,11 @@ def ui_list_activities(request: Request, soa_id: int): ) break - # Fetch concept groups globally (for the dropdown in concepts_cell) - cur.execute( - "SELECT id, concept_group_uid, name, label FROM concept_group ORDER BY id" - ) - concept_groups = [ - {"id": r[0], "concept_group_uid": r[1], "name": r[2], "label": r[3]} - for r in cur.fetchall() - ] + # Fetch concept groups globally (for the dropdown in concepts_cell), + # organized into CDISC-scheme + Custom Concept Groups sections. + from ..app import _get_concept_group_sections + + concept_groups = _get_concept_group_sections() conn.close() # Fetch CDISC BC categories list (for the category dropdown in concepts_cell) diff --git a/src/soa_builder/web/routers/bc_surrogates.py b/src/soa_builder/web/routers/bc_surrogates.py index 7f8e8ba..b1ecb3c 100644 --- a/src/soa_builder/web/routers/bc_surrogates.py +++ b/src/soa_builder/web/routers/bc_surrogates.py @@ -507,7 +507,7 @@ def _render_concepts_cell(request: Request, soa_id: int, activity_id: int): if has_group_uid and has_category: cur.execute( "SELECT ac.concept_code, ac.concept_title, ac.concept_group_uid, " - "cg.name AS group_name, ac.bc_category_name " + "cg.name AS group_name, cg.cdisc_scheme_name, ac.bc_category_name " "FROM activity_concept ac " "LEFT JOIN concept_group cg ON cg.concept_group_uid=ac.concept_group_uid " "WHERE ac.activity_id=? AND ac.soa_id=? " @@ -523,14 +523,15 @@ def _render_concepts_cell(request: Request, soa_id: int, activity_id: int): "dss_href": "", "concept_group_uid": r[2], "group_name": r[3], - "bc_category_name": r[4], + "cdisc_scheme_name": r[4], + "bc_category_name": r[5], } for r in cur.fetchall() ] elif has_group_uid: cur.execute( "SELECT ac.concept_code, ac.concept_title, ac.concept_group_uid, " - "cg.name AS group_name " + "cg.name AS group_name, cg.cdisc_scheme_name " "FROM activity_concept ac " "LEFT JOIN concept_group cg ON cg.concept_group_uid=ac.concept_group_uid " "WHERE ac.activity_id=? AND ac.soa_id=? " @@ -545,6 +546,7 @@ def _render_concepts_cell(request: Request, soa_id: int, activity_id: int): "dss_href": "", "concept_group_uid": r[2], "group_name": r[3], + "cdisc_scheme_name": r[4], "bc_category_name": None, } for r in cur.fetchall() @@ -563,6 +565,7 @@ def _render_concepts_cell(request: Request, soa_id: int, activity_id: int): "dss_href": "", "concept_group_uid": None, "group_name": None, + "cdisc_scheme_name": None, "bc_category_name": None, } for r in cur.fetchall() @@ -572,7 +575,7 @@ def _render_concepts_cell(request: Request, soa_id: int, activity_id: int): # Fetch linked surrogates (include concept_group_uid and group name) cur.execute( "SELECT bcs.id, bcs.surrogate_uid, bcs.name, bcs.label," - " asr.concept_group_uid, cg.name AS group_name " + " asr.concept_group_uid, cg.name AS group_name, cg.cdisc_scheme_name " "FROM activity_surrogate asr " "JOIN biomedical_concept_surrogate bcs " "ON bcs.surrogate_uid=asr.surrogate_uid AND bcs.soa_id=asr.soa_id " @@ -590,6 +593,7 @@ def _render_concepts_cell(request: Request, soa_id: int, activity_id: int): "label": r[3], "concept_group_uid": r[4], "group_name": r[5], + "cdisc_scheme_name": r[6], } for r in cur.fetchall() ] @@ -616,14 +620,11 @@ def _render_concepts_cell(request: Request, soa_id: int, activity_id: int): {c["bc_category_name"] for c in selected_list if c.get("bc_category_name")} ) - # Fetch all concept groups (for the dropdown) - cur.execute( - "SELECT id, concept_group_uid, name, label FROM concept_group ORDER BY id" - ) - concept_groups = [ - {"id": r[0], "concept_group_uid": r[1], "name": r[2], "label": r[3]} - for r in cur.fetchall() - ] + # Fetch all concept groups (for the dropdown), organized into + # CDISC-scheme + Custom Concept Groups sections. + from ..app import _get_concept_group_sections + + concept_groups = _get_concept_group_sections() activity_group_uids = list( {c["concept_group_uid"] for c in selected_list if c["concept_group_uid"]} | { diff --git a/src/soa_builder/web/routers/concept_groups.py b/src/soa_builder/web/routers/concept_groups.py index 074fbdd..5fbe0f7 100644 --- a/src/soa_builder/web/routers/concept_groups.py +++ b/src/soa_builder/web/routers/concept_groups.py @@ -1,5 +1,6 @@ import logging import os +import re import time from typing import List, Optional @@ -47,18 +48,39 @@ def _next_group_uid(cur) -> str: return f"{prefix}{max_n + 1}" -def _fetch_group_row(cur, group_id: int): - """Return (id, concept_group_uid, name) or raise 404.""" +def _fetch_group_row(cur, group_id: int, require_custom: bool = False): + """Return (id, concept_group_uid, name, source) or raise 404/400. + + When require_custom is True, reject (400) a CDISC-sourced group — + those are materialized from the bc-grouping service and must not + be edited/deleted through the Custom Concept Groups admin routes + (they'd just be overwritten by the next sync anyway). + """ cur.execute( - "SELECT id, concept_group_uid, name FROM concept_group WHERE id=?", + "SELECT id, concept_group_uid, name, source FROM concept_group WHERE id=?", (group_id,), ) row = cur.fetchone() if not row: raise HTTPException(404, "Group not found") + if require_custom and row[3] == "cdisc": + raise HTTPException( + 400, + "This group is sourced from CDISC classification data " + "and cannot be edited or deleted here.", + ) return row +def _fetch_custom_group_uid(cur, group_id: int) -> str: + """Return concept_group_uid for a group_id, rejecting CDISC-sourced + rows (400) and unknown ids (404). For routes that mutate a group's + definition (member concepts/surrogates) rather than assign it. + """ + row = _fetch_group_row(cur, group_id, require_custom=True) + return row[1] + + def _expand_group_to_activity( cur, soa_id: int, activity_id: int, activity_uid: str, group_uid: str ) -> int: @@ -164,7 +186,7 @@ def list_concept_groups(): cur = conn.cursor() cur.execute( "SELECT id, concept_group_uid, name, label, description " - "FROM concept_group ORDER BY id" + "FROM concept_group WHERE source='custom' OR source IS NULL ORDER BY id" ) groups = [ { @@ -231,7 +253,7 @@ def update_concept_group(group_id: int, payload: ConceptGroupUpdate): conn = _connect() cur = conn.cursor() cur.execute( - "SELECT id, concept_group_uid, name, label, description " + "SELECT id, concept_group_uid, name, label, description, source " "FROM concept_group WHERE id=?", (group_id,), ) @@ -239,6 +261,13 @@ def update_concept_group(group_id: int, payload: ConceptGroupUpdate): if not row: conn.close() raise HTTPException(404, "Group not found") + if row[5] == "cdisc": + conn.close() + raise HTTPException( + 400, + "This group is sourced from CDISC classification data " + "and cannot be edited or deleted here.", + ) new_name = _nz(payload.name) if payload.name is not None else row[2] new_label = _nz(payload.label) if payload.label is not None else row[3] new_desc = _nz(payload.description) if payload.description is not None else row[4] @@ -270,7 +299,7 @@ def update_concept_group(group_id: int, payload: ConceptGroupUpdate): def delete_concept_group(group_id: int): conn = _connect() cur = conn.cursor() - row = _fetch_group_row(cur, group_id) + row = _fetch_group_row(cur, group_id, require_custom=True) uid = row[1] cur.execute("DELETE FROM concept_group_concept WHERE concept_group_uid=?", (uid,)) cur.execute("PRAGMA table_info(activity_concept)") @@ -295,7 +324,7 @@ def delete_concept_group(group_id: int): def add_concepts_to_group(group_id: int, payload: ConceptsAdd): conn = _connect() cur = conn.cursor() - row = _fetch_group_row(cur, group_id) + row = _fetch_group_row(cur, group_id, require_custom=True) uid = row[1] from ..app import fetch_biomedical_concepts as _fetch_concepts @@ -326,7 +355,7 @@ def add_concepts_to_group(group_id: int, payload: ConceptsAdd): def remove_concept_from_group(group_id: int, concept_code: str): conn = _connect() cur = conn.cursor() - row = _fetch_group_row(cur, group_id) + row = _fetch_group_row(cur, group_id, require_custom=True) uid = row[1] cur.execute( "DELETE FROM concept_group_concept " @@ -351,7 +380,7 @@ def remove_concept_from_group(group_id: int, concept_code: str): def add_category_to_group(group_id: int, payload: CategoryAdd): conn = _connect() cur = conn.cursor() - row = _fetch_group_row(cur, group_id) + row = _fetch_group_row(cur, group_id, require_custom=True) uid = row[1] from ..app import ( fetch_biomedical_concepts_by_category as _fetch_by_cat, @@ -439,7 +468,7 @@ def ui_list_concept_groups(request: Request): cur = conn.cursor() cur.execute( "SELECT id, concept_group_uid, name, label, description " - "FROM concept_group ORDER BY id" + "FROM concept_group WHERE source='custom' OR source IS NULL ORDER BY id" ) groups = [ { @@ -575,12 +604,8 @@ def ui_update_concept_group( ): conn = _connect() cur = conn.cursor() - cur.execute("SELECT id, name FROM concept_group WHERE id=?", (group_id,)) - row = cur.fetchone() - if not row: - conn.close() - raise HTTPException(404, "Group not found") - new_name = name.strip() or row[1] + row = _fetch_group_row(cur, group_id, require_custom=True) + new_name = name.strip() or row[2] cur.execute( "UPDATE concept_group SET name=?, label=?, description=? WHERE id=?", (new_name, _nz(label), _nz(description), group_id), @@ -594,14 +619,7 @@ def ui_update_concept_group( def ui_delete_concept_group(request: Request, group_id: int): conn = _connect() cur = conn.cursor() - cur.execute( - "SELECT id, concept_group_uid FROM concept_group WHERE id=?", - (group_id,), - ) - row = cur.fetchone() - if not row: - conn.close() - raise HTTPException(404, "Group not found") + row = _fetch_group_row(cur, group_id, require_custom=True) uid = row[1] cur.execute("DELETE FROM concept_group_concept WHERE concept_group_uid=?", (uid,)) cur.execute("PRAGMA table_info(activity_concept)") @@ -631,12 +649,7 @@ def ui_add_concept_to_group( raise HTTPException(400, "concept_code required") conn = _connect() cur = conn.cursor() - cur.execute("SELECT concept_group_uid FROM concept_group WHERE id=?", (group_id,)) - row = cur.fetchone() - if not row: - conn.close() - raise HTTPException(404, "Group not found") - uid = row[0] + uid = _fetch_custom_group_uid(cur, group_id) from ..app import fetch_biomedical_concepts as _fetch_concepts lookup = {c["code"]: c["title"] for c in _fetch_concepts()} @@ -662,12 +675,7 @@ def ui_remove_concept_from_group( ): conn = _connect() cur = conn.cursor() - cur.execute("SELECT concept_group_uid FROM concept_group WHERE id=?", (group_id,)) - row = cur.fetchone() - if not row: - conn.close() - raise HTTPException(404, "Group not found") - uid = row[0] + uid = _fetch_custom_group_uid(cur, group_id) cur.execute( "DELETE FROM concept_group_concept " "WHERE concept_group_uid=? AND concept_code=?", @@ -689,12 +697,7 @@ def ui_add_category_to_group( ): conn = _connect() cur = conn.cursor() - cur.execute("SELECT concept_group_uid FROM concept_group WHERE id=?", (group_id,)) - row = cur.fetchone() - if not row: - conn.close() - raise HTTPException(404, "Group not found") - uid = row[0] + uid = _fetch_custom_group_uid(cur, group_id) from ..app import ( fetch_biomedical_concepts_by_category as _fetch_by_cat, ) @@ -726,12 +729,7 @@ def ui_add_surrogate_to_group( ): conn = _connect() cur = conn.cursor() - cur.execute("SELECT concept_group_uid FROM concept_group WHERE id=?", (group_id,)) - row = cur.fetchone() - if not row: - conn.close() - raise HTTPException(404, "Group not found") - group_uid = row[0] + group_uid = _fetch_custom_group_uid(cur, group_id) cur.execute( "UPDATE biomedical_concept_surrogate SET concept_group_uid=? WHERE id=?", (group_uid, surrogate_id), @@ -962,6 +960,134 @@ def fetch_bc_grouping_data(force: bool = False) -> dict: return result +_NCIT_CODE_RE = re.compile(r"^C\d+$") + + +def sync_cdisc_concept_groups(force: bool = False) -> dict: + """Materialize CDISC classification values as `concept_group` / + `concept_group_concept` rows tagged source='cdisc', so the whole + existing group add/remove/display pipeline works for them + unchanged. Full idempotent replace-sync scoped strictly to + source='cdisc' rows — never touches source='custom' rows. + + Never raises. If the bc-grouping service is unavailable, logs a + warning and returns without touching the database — previously + synced groups must keep working through a transient outage. + """ + result = fetch_bc_grouping_data(force=force) + if not result["available"]: + logger.warning( + "sync_cdisc_concept_groups: service unavailable (%s), skipping sync", + result["detail"], + ) + return {"synced": False, "detail": result["detail"]} + + data = result["data"] + bcs_by_id = {bc["bc_id"]: bc for bc in data["bcs"]} + schemes_by_id = {s["scheme_id"]: s for s in data["schemes"]} + assignments_by_value = {} + for a in data["assignments"]: + assignments_by_value.setdefault(a["value_id"], []).append(a) + + conn = _connect() + cur = conn.cursor() + try: + current_uids = set() + groups_synced = 0 + members_synced = 0 + + for value in data["values"]: + scheme = schemes_by_id.get(value["scheme_id"]) + if not scheme: + continue + uid = f"cdisc:{value['scheme_id']}:{value['value_id']}" + current_uids.add(uid) + cur.execute( + """INSERT INTO concept_group + (concept_group_uid, name, label, description, source, + cdisc_scheme_id, cdisc_scheme_name, cdisc_value_id) + VALUES (?,?,?,?,'cdisc',?,?,?) + ON CONFLICT(concept_group_uid) DO UPDATE SET + name=excluded.name, + description=excluded.description, + source='cdisc', + cdisc_scheme_id=excluded.cdisc_scheme_id, + cdisc_scheme_name=excluded.cdisc_scheme_name, + cdisc_value_id=excluded.cdisc_value_id""", + ( + uid, + value["label"], + None, + value.get("description"), + value["scheme_id"], + scheme["name"], + value["value_id"], + ), + ) + groups_synced += 1 + + desired_codes = set() + for a in assignments_by_value.get(value["value_id"], []): + bc = bcs_by_id.get(a["bc_id"]) + if not bc: + continue + ncit_code = bc.get("ncit_code") or "" + code = ncit_code if _NCIT_CODE_RE.match(ncit_code) else bc["bc_id"] + desired_codes.add(code) + cur.execute( + """INSERT INTO concept_group_concept + (concept_group_uid, concept_code, concept_title) + VALUES (?,?,?) + ON CONFLICT(concept_group_uid, concept_code) DO UPDATE SET + concept_title=excluded.concept_title""", + (uid, code, bc["short_name"]), + ) + members_synced += 1 + + # Remove members no longer assigned to this value. + if desired_codes: + placeholders = ",".join("?" for _ in desired_codes) + cur.execute( + "DELETE FROM concept_group_concept " + f"WHERE concept_group_uid=? AND concept_code NOT IN ({placeholders})", + (uid, *desired_codes), + ) + else: + cur.execute( + "DELETE FROM concept_group_concept WHERE concept_group_uid=?", + (uid,), + ) + + # Remove CDISC-sourced groups no longer present upstream. + cur.execute("SELECT concept_group_uid FROM concept_group WHERE source='cdisc'") + existing_cdisc_uids = {r[0] for r in cur.fetchall()} + stale_uids = existing_cdisc_uids - current_uids + for uid in stale_uids: + cur.execute( + "DELETE FROM concept_group_concept WHERE concept_group_uid=?", (uid,) + ) + cur.execute( + "DELETE FROM concept_group WHERE concept_group_uid=? AND source='cdisc'", + (uid,), + ) + + conn.commit() + summary = { + "synced": True, + "groups": groups_synced, + "members": members_synced, + "removed": len(stale_uids), + } + logger.info("sync_cdisc_concept_groups: %s", summary) + return summary + except Exception as exc: + conn.rollback() + logger.warning("sync_cdisc_concept_groups failed: %s", exc) + return {"synced": False, "detail": str(exc)} + finally: + conn.close() + + @ui_router.get("/ui/concept-groups/bc-status", response_class=HTMLResponse) def ui_bc_grouping_status(request: Request): """Return HTML partial indicating BC Grouping service availability.""" @@ -1018,6 +1144,7 @@ def ui_bc_explorer(request: Request): def ui_bc_explorer_refresh(request: Request): """Force refresh of the BC Grouping cache and redirect back to the list.""" fetch_bc_grouping_data(force=True) + sync_cdisc_concept_groups(force=True) if request.headers.get("HX-Request") == "true": return HTMLResponse("", headers={"HX-Redirect": "/ui/concept-groups"}) return HTMLResponse("") diff --git a/src/soa_builder/web/templates/concepts_cell.html b/src/soa_builder/web/templates/concepts_cell.html index afc48b9..7a8d2e9 100644 --- a/src/soa_builder/web/templates/concepts_cell.html +++ b/src/soa_builder/web/templates/concepts_cell.html @@ -94,7 +94,7 @@ {% if ac.concept_group_uid not in _seen_group_uids %} {% set _ = _seen_group_uids.append(ac.concept_group_uid) %}
- [G] {{ ac.group_name or ac.concept_group_uid }} + [G] {% if ac.cdisc_scheme_name %}{{ ac.cdisc_scheme_name }}: {% endif %}{{ ac.group_name or ac.concept_group_uid }} {% if not readonly %}
- [G] {{ s.group_name or s.concept_group_uid }} + [G] {% if s.cdisc_scheme_name %}{{ s.cdisc_scheme_name }}: {% endif %}{{ s.group_name or s.concept_group_uid }} {% if not readonly %} diff --git a/tests/test_cdisc_concept_group_sync.py b/tests/test_cdisc_concept_group_sync.py new file mode 100644 index 0000000..9250699 --- /dev/null +++ b/tests/test_cdisc_concept_group_sync.py @@ -0,0 +1,396 @@ +"""Tests for materializing CDISC classification groups (from the +cdisc-biomedical-concept-groupings service) into the concept_group / +concept_group_concept tables, so they appear alongside Custom Concept +Groups in the "Add group" dropdown — while Custom Concept Groups +behavior stays completely unaffected. +""" + +import pytest +import requests +from fastapi.testclient import TestClient + +from soa_builder.web.app import _get_concept_group_sections +from soa_builder.web.db import _connect +from soa_builder.web.app import app +from soa_builder.web.routers.concept_groups import ( + _bc_grouping_cache, + sync_cdisc_concept_groups, +) + +client = TestClient(app) + + +@pytest.fixture(autouse=True) +def clean_concept_group_tables(): + _bc_grouping_cache["data"] = None + _bc_grouping_cache["fetched_at"] = 0 + conn = _connect() + cur = conn.cursor() + cur.execute("DELETE FROM concept_group_concept") + cur.execute("DELETE FROM concept_group") + conn.commit() + conn.close() + yield + conn = _connect() + cur = conn.cursor() + cur.execute("DELETE FROM concept_group_concept") + cur.execute("DELETE FROM concept_group") + conn.commit() + conn.close() + + +SCHEMES = [ + { + "scheme_id": "coa_type", + "name": "COA Type", + "description": "", + "purpose": "", + "intended_use": "", + }, + { + "scheme_id": "concept_group", + "name": "Concept Group", + "description": "", + "purpose": "", + "intended_use": "", + }, +] +BCS = [ + {"bc_id": "C1", "short_name": "Weight", "ncit_code": "C1"}, + {"bc_id": "NEW_1", "short_name": "Retired Thing [RETIRED]", "ncit_code": "nan"}, +] + + +def _values_and_assignments(include_cg_value=True, include_new1_assignment=True): + values = [ + { + "value_id": "coa_v1", + "scheme_id": "coa_type", + "label": "Clinician Reported", + "description": "", + }, + ] + assignments = [ + { + "assignment_id": "a1", + "bc_id": "C1", + "scheme_id": "coa_type", + "value_id": "coa_v1", + }, + ] + if include_cg_value: + values.append( + { + "value_id": "cg_v1", + "scheme_id": "concept_group", + "label": "Vital Signs", + "description": "", + } + ) + assignments.append( + { + "assignment_id": "a2", + "bc_id": "C1", + "scheme_id": "concept_group", + "value_id": "cg_v1", + } + ) + if include_new1_assignment: + assignments.append( + { + "assignment_id": "a3", + "bc_id": "NEW_1", + "scheme_id": "concept_group", + "value_id": "cg_v1", + } + ) + return values, assignments + + +class DummyResponse: + def __init__(self, payload, status_code=200): + self._payload = payload + self.status_code = status_code + + def json(self): + return self._payload + + def raise_for_status(self): + if self.status_code >= 400: + raise requests.exceptions.HTTPError(f"HTTP {self.status_code}") + + +def _fake_get(schemes, values, assignments, bcs): + def fake_get(url, params=None, timeout=None): + if url.endswith("/biomedical-concepts"): + return DummyResponse({"items": bcs, "total": len(bcs)}) + if url.endswith("/classification-schemes"): + return DummyResponse({"items": schemes, "total": len(schemes)}) + if url.endswith("/classification-values"): + return DummyResponse({"items": values, "total": len(values)}) + if url.endswith("/classification-assignments"): + return DummyResponse({"items": assignments, "total": len(assignments)}) + raise AssertionError(f"Unexpected URL: {url}") + + return fake_get + + +def _row_for_uid(uid): + conn = _connect() + cur = conn.cursor() + cur.execute( + "SELECT id, name, source, cdisc_scheme_id, cdisc_scheme_name, cdisc_value_id " + "FROM concept_group WHERE concept_group_uid=?", + (uid,), + ) + row = cur.fetchone() + conn.close() + return row + + +def _members_for_uid(uid): + conn = _connect() + cur = conn.cursor() + cur.execute( + "SELECT concept_code FROM concept_group_concept WHERE concept_group_uid=?", + (uid,), + ) + codes = {r[0] for r in cur.fetchall()} + conn.close() + return codes + + +def test_sync_materializes_groups_and_prefers_ncit_code(monkeypatch): + values, assignments = _values_and_assignments() + monkeypatch.setattr("requests.get", _fake_get(SCHEMES, values, assignments, BCS)) + + summary = sync_cdisc_concept_groups(force=True) + assert summary["synced"] is True + assert summary["groups"] == 2 + + coa_row = _row_for_uid("cdisc:coa_type:coa_v1") + assert coa_row is not None + assert coa_row[1] == "Clinician Reported" + assert coa_row[2] == "cdisc" + assert coa_row[4] == "COA Type" + + cg_row = _row_for_uid("cdisc:concept_group:cg_v1") + assert cg_row is not None + assert cg_row[1] == "Vital Signs" + + # C1's ncit_code ("C1") is used directly; NEW_1's ncit_code ("nan") + # doesn't match ^C\d+$ so it falls back to bc_id ("NEW_1"). + assert _members_for_uid("cdisc:concept_group:cg_v1") == {"C1", "NEW_1"} + assert _members_for_uid("cdisc:coa_type:coa_v1") == {"C1"} + + +def test_sync_idempotent_and_preserves_custom_groups(monkeypatch): + # Seed a custom group first — must survive untouched across syncs. + resp = client.post("/concept-groups", json={"name": "My Custom Group"}) + assert resp.status_code == 200 + custom_id = resp.json()["id"] + + values, assignments = _values_and_assignments() + monkeypatch.setattr("requests.get", _fake_get(SCHEMES, values, assignments, BCS)) + + sync_cdisc_concept_groups(force=True) + row1 = _row_for_uid("cdisc:concept_group:cg_v1") + id_after_first_sync = row1[0] + + sync_cdisc_concept_groups(force=True) + row2 = _row_for_uid("cdisc:concept_group:cg_v1") + assert row2[0] == id_after_first_sync # stable id: real upsert, not delete+reinsert + + # Custom group untouched. + resp = client.get("/concept-groups") + assert resp.status_code == 200 + custom_groups = [g for g in resp.json() if g["id"] == custom_id] + assert len(custom_groups) == 1 + assert custom_groups[0]["name"] == "My Custom Group" + + +def test_sync_bidirectional_stale_cleanup(monkeypatch): + values, assignments = _values_and_assignments() + monkeypatch.setattr("requests.get", _fake_get(SCHEMES, values, assignments, BCS)) + sync_cdisc_concept_groups(force=True) + assert _row_for_uid("cdisc:concept_group:cg_v1") is not None + + # Re-sync with the concept_group value removed entirely upstream. + values2, assignments2 = _values_and_assignments(include_cg_value=False) + monkeypatch.setattr("requests.get", _fake_get(SCHEMES, values2, assignments2, BCS)) + sync_cdisc_concept_groups(force=True) + assert _row_for_uid("cdisc:concept_group:cg_v1") is None + assert _members_for_uid("cdisc:concept_group:cg_v1") == set() + # The still-current coa_type group is untouched. + assert _row_for_uid("cdisc:coa_type:coa_v1") is not None + + +def test_sync_stale_member_cleanup(monkeypatch): + values, assignments = _values_and_assignments() + monkeypatch.setattr("requests.get", _fake_get(SCHEMES, values, assignments, BCS)) + sync_cdisc_concept_groups(force=True) + assert _members_for_uid("cdisc:concept_group:cg_v1") == {"C1", "NEW_1"} + + # Re-sync with NEW_1's assignment to cg_v1 removed. + values2, assignments2 = _values_and_assignments(include_new1_assignment=False) + monkeypatch.setattr("requests.get", _fake_get(SCHEMES, values2, assignments2, BCS)) + sync_cdisc_concept_groups(force=True) + assert _members_for_uid("cdisc:concept_group:cg_v1") == {"C1"} + + +def test_sync_resilience_on_service_unavailable(monkeypatch): + values, assignments = _values_and_assignments() + monkeypatch.setattr("requests.get", _fake_get(SCHEMES, values, assignments, BCS)) + sync_cdisc_concept_groups(force=True) + assert _row_for_uid("cdisc:concept_group:cg_v1") is not None + + def raising_get(url, params=None, timeout=None): + raise requests.exceptions.ConnectionError("boom") + + monkeypatch.setattr("requests.get", raising_get) + summary = sync_cdisc_concept_groups(force=True) + assert summary["synced"] is False + + # Previously-synced rows survive the outage untouched. + assert _row_for_uid("cdisc:concept_group:cg_v1") is not None + assert _members_for_uid("cdisc:concept_group:cg_v1") == {"C1", "NEW_1"} + + +def test_migration_idempotent(): + from soa_builder.web.migrate_database import ( + _migrate_concept_group_add_cdisc_source_columns, + ) + + _migrate_concept_group_add_cdisc_source_columns() + _migrate_concept_group_add_cdisc_source_columns() + + conn = _connect() + cur = conn.cursor() + cur.execute("PRAGMA table_info(concept_group)") + cols = [r[1] for r in cur.fetchall()] + conn.close() + for expected in ( + "source", + "cdisc_scheme_id", + "cdisc_scheme_name", + "cdisc_value_id", + ): + assert cols.count(expected) == 1 + + +def test_get_concept_group_sections_ordering_and_filtering(monkeypatch): + resp = client.post("/concept-groups", json={"name": "My Custom Group"}) + assert resp.status_code == 200 + + values, assignments = _values_and_assignments() + monkeypatch.setattr("requests.get", _fake_get(SCHEMES, values, assignments, BCS)) + sync_cdisc_concept_groups(force=True) + + sections = _get_concept_group_sections() + headings = [s["heading"] for s in sections] + + # COA Type appears before Concept Group (fixed order), schemes with + # no values (Collection Method, etc.) are omitted, and Custom + # Concept Groups comes last. + assert headings == ["COA Type", "Concept Group", "Custom Concept Groups"] + + coa_section = sections[0] + assert [g["name"] for g in coa_section["groups"]] == ["Clinician Reported"] + + custom_section = sections[-1] + assert any(g["name"] == "My Custom Group" for g in custom_section["groups"]) + + +def test_admin_page_excludes_cdisc_groups(monkeypatch): + resp = client.post("/concept-groups", json={"name": "My Custom Group"}) + assert resp.status_code == 200 + + values, assignments = _values_and_assignments() + monkeypatch.setattr("requests.get", _fake_get(SCHEMES, values, assignments, BCS)) + sync_cdisc_concept_groups(force=True) + + resp = client.get("/ui/concept-groups") + assert resp.status_code == 200 + assert "Vital Signs" not in resp.text + assert "Clinician Reported" not in resp.text + assert "My Custom Group" in resp.text + + # The plain JSON listing API is likewise scoped to custom groups. + resp = client.get("/concept-groups") + assert resp.status_code == 200 + names = [g["name"] for g in resp.json()] + assert "Vital Signs" not in names + assert "My Custom Group" in names + + +def test_admin_crud_guard_rejects_cdisc_group(monkeypatch): + values, assignments = _values_and_assignments() + monkeypatch.setattr("requests.get", _fake_get(SCHEMES, values, assignments, BCS)) + sync_cdisc_concept_groups(force=True) + cdisc_id = _row_for_uid("cdisc:concept_group:cg_v1")[0] + + resp = client.patch(f"/concept-groups/{cdisc_id}", json={"name": "Hacked"}) + assert resp.status_code == 400 + + resp = client.delete(f"/concept-groups/{cdisc_id}") + assert resp.status_code == 400 + + resp = client.post( + f"/ui/concept-groups/{cdisc_id}/update", + data={"name": "Hacked"}, + ) + assert resp.status_code == 400 + + resp = client.post(f"/ui/concept-groups/{cdisc_id}/delete") + assert resp.status_code == 400 + + # The group survives all of the above untouched. + assert _row_for_uid("cdisc:concept_group:cg_v1")[1] == "Vital Signs" + + +def test_end_to_end_assign_cdisc_group_to_activity(monkeypatch): + values, assignments = _values_and_assignments() + monkeypatch.setattr("requests.get", _fake_get(SCHEMES, values, assignments, BCS)) + sync_cdisc_concept_groups(force=True) + + soa_resp = client.post("/soa", json={"name": "CDISC Group E2E Test"}) + soa_id = soa_resp.json()["id"] + act_resp = client.post(f"/soa/{soa_id}/activities", json={"name": "Vitals"}) + activity_id = act_resp.json()["activity_id"] + + resp = client.post( + f"/ui/soa/{soa_id}/activity/{activity_id}/concept-groups/add", + data={"concept_group_uid": "cdisc:concept_group:cg_v1"}, + ) + assert resp.status_code == 200 + assert "Concept Group: Vital Signs" in resp.text + + conn = _connect() + cur = conn.cursor() + cur.execute( + "SELECT concept_code, concept_group_uid FROM activity_concept " + "WHERE activity_id=? AND soa_id=?", + (activity_id, soa_id), + ) + rows = {r[0]: r[1] for r in cur.fetchall()} + conn.close() + assert rows == { + "C1": "cdisc:concept_group:cg_v1", + "NEW_1": "cdisc:concept_group:cg_v1", + } + + # Removal (×all) works unchanged too. + resp = client.post( + f"/ui/soa/{soa_id}/activity/{activity_id}/concept-groups/remove", + data={"concept_group_uid": "cdisc:concept_group:cg_v1"}, + ) + assert resp.status_code == 200 + conn = _connect() + cur = conn.cursor() + cur.execute( + "SELECT COUNT(*) FROM activity_concept WHERE activity_id=? AND soa_id=?", + (activity_id, soa_id), + ) + count = cur.fetchone()[0] + conn.close() + assert count == 0 From 3d6d0a078713869e0f4f01f5540d16f79e123a70 Mon Sep 17 00:00:00 2001 From: pendingintent <3921919+pendingintent@users.noreply.github.com> Date: Thu, 30 Jul 2026 12:28:28 -0400 Subject: [PATCH 09/20] Add CDISC BC Groupings browser submodule and fix orphaned BC surrogate export Bumps the cdisc-biomedical-concept-groupings submodule to 854d5fc (black reformat + BC explorer prototype) and fixes build_usdm_bc_surrogates to exclude BiomedicalConceptSurrogate entries no longer linked to any activity. --- cdisc-biomedical-concept-groupings | 2 +- src/usdm/generate_bc_surrogates.py | 9 +++++++-- tests/test_routers_bc_surrogates.py | 23 +++++++++++++++++++++++ 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/cdisc-biomedical-concept-groupings b/cdisc-biomedical-concept-groupings index 0dfa838..854d5fc 160000 --- a/cdisc-biomedical-concept-groupings +++ b/cdisc-biomedical-concept-groupings @@ -1 +1 @@ -Subproject commit 0dfa838501ce910305086d1b223be64ba07b6db7 +Subproject commit 854d5fc18d5d1a3bee7063a5f6408dc10ebc2a8c diff --git a/src/usdm/generate_bc_surrogates.py b/src/usdm/generate_bc_surrogates.py index fb3319c..84524fd 100644 --- a/src/usdm/generate_bc_surrogates.py +++ b/src/usdm/generate_bc_surrogates.py @@ -27,8 +27,13 @@ def build_usdm_bc_surrogates(soa_id: int) -> List[Dict[str, Any]]: conn = _connect() cur = conn.cursor() cur.execute( - "SELECT surrogate_uid, name, label, description, reference " - "FROM biomedical_concept_surrogate WHERE soa_id=? ORDER BY id", + "SELECT DISTINCT bcs.surrogate_uid, bcs.name, bcs.label, " + "bcs.description, bcs.reference " + "FROM biomedical_concept_surrogate bcs " + "INNER JOIN activity_surrogate asr " + "ON bcs.surrogate_uid = asr.surrogate_uid " + "AND bcs.soa_id = asr.soa_id " + "WHERE bcs.soa_id=? ORDER BY bcs.id", (soa_id,), ) rows = cur.fetchall() diff --git a/tests/test_routers_bc_surrogates.py b/tests/test_routers_bc_surrogates.py index 9292907..899d0b5 100644 --- a/tests/test_routers_bc_surrogates.py +++ b/tests/test_routers_bc_surrogates.py @@ -220,3 +220,26 @@ def test_surrogate_appears_in_usdm_output(): matching = next(s for s in surrogates if s["id"] == sur_uid) assert matching["name"] == "PupilDilation" assert matching["instanceType"] == "BiomedicalConceptSurrogate" + + +def test_unlinked_surrogate_excluded_from_usdm_output(): + soa_id = _make_soa() + act_id = _make_activity(soa_id, "SoA Activity") + + create_r = client.post( + f"/soa/{soa_id}/bc-surrogates", json={"name": "OrphanSurrogate"} + ) + sur_id = create_r.json()["id"] + sur_uid = create_r.json()["surrogate_uid"] + + from usdm.generate_bc_surrogates import build_usdm_bc_surrogates + + # Never linked to an activity — must not appear in the USDM export. + surrogates = build_usdm_bc_surrogates(soa_id) + assert not any(s["id"] == sur_uid for s in surrogates) + + # Link then unlink — still must not appear. + client.post(f"/soa/{soa_id}/activities/{act_id}/bc-surrogates/{sur_id}") + client.delete(f"/soa/{soa_id}/activities/{act_id}/bc-surrogates/{sur_id}") + surrogates = build_usdm_bc_surrogates(soa_id) + assert not any(s["id"] == sur_uid for s in surrogates) From 48e177dc9b92d062536d8fab517d66cf8c130f52 Mon Sep 17 00:00:00 2001 From: pendingintent <3921919+pendingintent@users.noreply.github.com> Date: Mon, 3 Aug 2026 07:40:31 -0400 Subject: [PATCH 10/20] Moved CSS styles to single static file. --- src/soa_builder/web/static/style.css | 841 ++++++++++++++++++ .../_condition_assignments_section.html | 2 +- .../_decision_instances_section.html | 2 +- .../web/templates/_instances_section.html | 2 +- .../_schedule_timelines_section.html | 2 +- .../web/templates/_timings_section.html | 2 +- src/soa_builder/web/templates/activities.html | 8 +- .../templates/amendment_changes_partial.html | 32 +- .../web/templates/amendment_edit.html | 2 +- .../amendment_enrollments_partial.html | 12 +- .../amendment_geo_scopes_partial.html | 10 +- .../amendment_gov_dates_partial.html | 26 +- .../templates/amendment_impacts_partial.html | 16 +- .../templates/amendment_reasons_partial.html | 18 +- src/soa_builder/web/templates/arms.html | 2 +- src/soa_builder/web/templates/audits.html | 276 +++--- src/soa_builder/web/templates/base.html | 2 +- .../web/templates/bc_unassigned_concepts.html | 7 +- .../web/templates/cdash_terminology.html | 12 +- .../web/templates/concept_categories.html | 12 +- .../templates/concept_category_detail.html | 10 +- .../web/templates/concept_detail.html | 54 +- .../web/templates/concept_groups.html | 67 +- .../web/templates/concepts_cell.html | 100 +-- .../web/templates/concepts_list.html | 10 +- src/soa_builder/web/templates/crf_cell.html | 28 +- .../templates/crf_specialization_detail.html | 31 +- .../web/templates/crf_specializations.html | 18 +- src/soa_builder/web/templates/dair.html | 20 +- .../templates/ddf_controlled_terminology.html | 12 +- .../web/templates/define_json.html | 10 +- .../web/templates/define_xml_terminology.html | 12 +- src/soa_builder/web/templates/dss_cell.html | 28 +- src/soa_builder/web/templates/edit.html | 103 +-- .../web/templates/element_audit_section.html | 30 +- src/soa_builder/web/templates/elements.html | 6 +- src/soa_builder/web/templates/encounters.html | 2 +- src/soa_builder/web/templates/epochs.html | 2 +- src/soa_builder/web/templates/estimands.html | 25 +- .../web/templates/estimands_partial.html | 64 +- .../web/templates/freeze_modal.html | 148 +-- src/soa_builder/web/templates/freezes.html | 2 +- src/soa_builder/web/templates/index.html | 27 +- .../web/templates/indications_partial.html | 37 +- src/soa_builder/web/templates/objectives.html | 4 +- .../web/templates/organizations_partial.html | 27 +- .../web/templates/orgs_roles_persons.html | 8 +- .../web/templates/persons_partial.html | 22 +- .../protocol_controlled_terminology.html | 12 +- .../web/templates/reorder_audit_modal.html | 44 +- .../web/templates/roles_partial.html | 26 +- .../web/templates/rollback_audit_modal.html | 44 +- src/soa_builder/web/templates/rules.html | 2 +- .../templates/sdtm_specialization_detail.html | 76 +- .../web/templates/sdtm_specializations.html | 18 +- .../web/templates/sdtm_terminology.html | 12 +- .../web/templates/soa_matrix_export.html | 73 +- .../web/templates/study_cells.html | 2 +- .../templates/study_identifiers_partial.html | 41 +- .../web/templates/study_interventions.html | 14 +- .../study_interventions_partial.html | 36 +- .../web/templates/study_timing.html | 2 +- .../web/templates/study_titles_partial.html | 32 +- src/soa_builder/web/templates/tdd.html | 10 +- .../web/templates/tdd_view_partial.html | 17 +- .../web/templates/transition_rules_list.html | 16 +- src/soa_builder/web/templates/usdm_json.html | 8 +- 67 files changed, 1722 insertions(+), 956 deletions(-) diff --git a/src/soa_builder/web/static/style.css b/src/soa_builder/web/static/style.css index 33f5111..28a254f 100644 --- a/src/soa_builder/web/static/style.css +++ b/src/soa_builder/web/static/style.css @@ -144,6 +144,7 @@ details.collapsible > *:not(summary) { padding: 0 14px 12px; } .drag-item form { margin-left:0; } .visit-actions { display:inline-flex; align-items:center; gap:8px; margin-left:auto; } .activity-actions { display:inline-flex; align-items:center; gap:8px; margin-left:auto; } +.transition-rule-actions { display:inline-flex; align-items:center; gap:8px; margin-left:auto; } .hint { font-weight:400; font-size:0.7em; color:#666; } @media screen and (max-height: 450px) { @@ -1011,4 +1012,844 @@ details.collapsible > *:not(summary) { padding: 0 14px 12px; } .am-change-form-grid .am-form-actions { grid-column: 2; padding-top: 2px; +} + +/* ===== Utilities: spacing, truncation, display toggles, widths ===== */ +/* Prefer an existing am-/fz- component class over these when one + fits; these exist only to eliminate one-off inline styles. */ +.am-mt-4 { margin-top: 4px; } +.am-mt-6 { margin-top: 6px; } +.am-mt-8 { margin-top: 8px; } +.am-mt-10 { margin-top: 10px; } +.am-mb-8 { margin-bottom: 8px; } +.am-mb-12 { margin-bottom: 12px; } +.am-m-0 { margin: 0; } +.am-truncate { + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.am-tl-visible { display: block; } +.am-tl-hidden { display: none; } +.am-meta-line { font-size: 0.82em; color: var(--am-text-mid); } +.am-w-55 { width: 55px; } +.am-w-80 { width: 80px; } +.am-w-90 { width: 90px; } +.am-w-100 { width: 100px; } +.am-w-110 { width: 110px; } +.am-w-160 { width: 160px; } +.am-w-200 { width: 200px; } + +/* ===== Legacy audit-log table pattern ===== */ +.am-audit-table { + width: 100%; + font-size: 0.75em; + border-collapse: collapse; +} +.am-audit-thead-row { background: #eee; } +.am-audit-th { text-align: left; padding: 4px; } +.am-audit-td { padding: 4px; } +.am-audit-td-json { + padding: 4px; + white-space: pre-wrap; + max-width: 320px; +} +.am-empty-note { font-size: 0.75em; color: #777; } + +/* ===== Matrix header row labels (edit / edit-column-collapse) ===== */ +.am-matrix-label-th { text-align: right; font-size: 0.50em; } +.am-matrix-value-th { text-align: center; font-size: 0.50em; } +.am-td-shrink { width: 1%; white-space: nowrap; } + +/* ===== Notice banner variants (legacy, kept pixel-for-pixel to + avoid a visual change vs. am-api-notice's card treatment) ===== */ +.am-legacy-error-notice { + padding: 8px 12px; + margin-bottom: 12px; + border: 1px solid #c33; + background: #fee; + color: #900; + font-size: 0.85em; + border-radius: 4px; +} +.am-legacy-warn-notice { + padding: 8px 12px; + margin-bottom: 12px; + border: 1px solid #cc9; + background: #ffd; + color: #660; + font-size: 0.85em; + border-radius: 4px; +} + +/* ---- Edit page: rules moved from edit-column-collapse.html's + embedded - {% endblock %} \ No newline at end of file diff --git a/src/soa_builder/web/templates/base.html b/src/soa_builder/web/templates/base.html index dc756db..67faa80 100644 --- a/src/soa_builder/web/templates/base.html +++ b/src/soa_builder/web/templates/base.html @@ -3,7 +3,7 @@ SoA Workbench - + diff --git a/src/soa_builder/web/templates/bc_unassigned_concepts.html b/src/soa_builder/web/templates/bc_unassigned_concepts.html index bfa690c..d406621 100644 --- a/src/soa_builder/web/templates/bc_unassigned_concepts.html +++ b/src/soa_builder/web/templates/bc_unassigned_concepts.html @@ -2,7 +2,7 @@ {% block content %}

Unassigned Biomedical Concepts

-
+
@@ -19,7 +19,7 @@

About This Report

-
+
diff --git a/src/soa_builder/web/templates/cdash_terminology.html b/src/soa_builder/web/templates/cdash_terminology.html index 1937258..5a9cad0 100644 --- a/src/soa_builder/web/templates/cdash_terminology.html +++ b/src/soa_builder/web/templates/cdash_terminology.html @@ -2,12 +2,12 @@ {% block content %}

CDASH Controlled Terminology{% if slug %} — {{ slug }}{% else %} — (unavailable){% endif %}

-
+ {% if error %} -
+
Error: {{ error }}
{% endif %} @@ -35,12 +35,12 @@

Filter

- +
-
+
@@ -48,7 +48,7 @@

Filter

-

+

Total: {{ total_count }} | Matched: {{ matched_count }} | Showing limit {{ limit }} offset {{ offset }}

@@ -68,7 +68,7 @@

Filter

{% if matched_count > limit %} {% set next_offset = offset + limit %} {% if next_offset < matched_count %} -
+
diff --git a/src/soa_builder/web/templates/concept_categories.html b/src/soa_builder/web/templates/concept_categories.html index c06f75d..e89ad25 100644 --- a/src/soa_builder/web/templates/concept_categories.html +++ b/src/soa_builder/web/templates/concept_categories.html @@ -1,25 +1,25 @@ {% extends 'base.html' %} {% block content %}

Biomedical Concept Categories ({{ count }})

-

+

Derived from the CDISC Library API. Each link lists biomedical concepts in that category.

-
+
← Home ↻ Refresh - {% if force %}Cache refreshed{% endif %} + {% if force %}Cache refreshed{% endif %}

-
+
+ class="fz-version-input am-w-280" oninput="filterCategories()" />
- +
{% if rows %} diff --git a/src/soa_builder/web/templates/concept_category_detail.html b/src/soa_builder/web/templates/concept_category_detail.html index df02857..74edfd7 100644 --- a/src/soa_builder/web/templates/concept_category_detail.html +++ b/src/soa_builder/web/templates/concept_category_detail.html @@ -3,7 +3,7 @@

Biomedical Concepts in Category: {{ category }}

Refresh (bypass cache) - {% if force %}Cache bypassed{% endif %} + {% if force %}Cache bypassed{% endif %} | Back to Categories

Total concepts: {{ count }}

@@ -12,15 +12,15 @@

Biomedical Concepts in Category: {{ category }}

- - + + {% for r in rows %} - @@ -52,19 +52,17 @@ {# ── Variables of Interest (Endpoints) subsection ── #} - - -
TitleBiomedical Concept CodeTitleBiomedical Concept Code
{{ r.title }} + {% if r.code %} {{ r.code }} {% else %}n/a{% endif %} @@ -34,4 +34,4 @@

Biomedical Concepts in Category: {{ category }}

{% endif %}

← Back to Categories

-{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/src/soa_builder/web/templates/concept_detail.html b/src/soa_builder/web/templates/concept_detail.html index 4f4d71e..fc094a4 100644 --- a/src/soa_builder/web/templates/concept_detail.html +++ b/src/soa_builder/web/templates/concept_detail.html @@ -6,7 +6,7 @@

Concept: {{ code }}

Directly opening this URL in your browser omits required headers and may return 401. Use this internal page or an API client with headers: Ocp-Apim-Subscription-Key: <key>{% if not missing_key %}, Authorization: Bearer <key>{% endif %}. {% if missing_key %} -
+
Notice: No API key detected; set CDISC_SUBSCRIPTION_KEY or CDISC_API_KEY to retrieve live JSON.
{% endif %} @@ -14,18 +14,18 @@

Concept: {{ code }}

{% if status %}

Upstream Status: {{ status }}

{% endif %} {% if summary or parent_bc_href or parent_pkg_href %} -

Summary

- +

Summary

+
{% for key, val in summary.items() %} - - + + {% endfor %} {% if parent_bc_href %} - - + @@ -33,8 +33,8 @@

Summary

{% endif %} {% if parent_pkg_href %} - - + @@ -45,26 +45,26 @@

Summary

{% if data_element_concepts %}

Data Element Concepts

-
{{ key }}{{ val }}{{ key }}{{ val }}
parentBiomedicalConcept + parentBiomedicalConcept {% if parent_bc_title %}{{ parent_bc_title }} — {% endif %} {{ parent_bc_href }}
parentPackage + parentPackage {% if parent_pkg_name %}{{ parent_pkg_name }} — {% endif %} {{ parent_pkg_href }}
+
- - - - - - - + + + + + + + {% for d in data_element_concepts %} - - - - - - + + + + + diff --git a/src/soa_builder/web/templates/crf_specialization_detail.html b/src/soa_builder/web/templates/crf_specialization_detail.html index 7e5d735..c90e980 100644 --- a/src/soa_builder/web/templates/crf_specialization_detail.html +++ b/src/soa_builder/web/templates/crf_specialization_detail.html @@ -2,29 +2,29 @@ {% block content %}

CRF Specialization Detail

-
+ -

+

Title: {{ title }}
{% if href %} API HREF: {{ href }} + class="am-lib-href-wrap">{{ href }} {% else %} No href available {% endif %}

{% if missing_key %} -
+
Notice: No API key detected; set CDISC_SUBSCRIPTION_KEY or CDISC_API_KEY to retrieve live JSON.
{% endif %} {% if error %} -
+
Error: {{ error }}
{% endif %} @@ -43,14 +43,14 @@

CRF Specialization Detail

{% if scalar_items %}

Summary

-
Concept IDShort NameData TypeExample SetSynonymsHref
Concept IDShort NameData TypeExample SetSynonymsHref
{{ d.conceptId or '' }}{{ d.shortName or '' }}{{ d.dataType or '' }}{{ (d.exampleSet or []) | join(', ') }}{{ (d.synonyms or []) | join(', ') }} + {{ d.conceptId or '' }}{{ d.shortName or '' }}{{ d.dataType or '' }}{{ (d.exampleSet or []) | join(', ') }}{{ (d.synonyms or []) | join(', ') }} {%- if d.href -%} link {%- endif -%} @@ -76,13 +76,13 @@

Data Element Concepts

{% endif %} {% if pretty_json %} -
+
- Raw JSON -
{{ pretty_json }}
+ Raw JSON +
{{ pretty_json }}
{% endif %} -

← Back to concepts list

+

← Back to concepts list

{% endblock %} diff --git a/src/soa_builder/web/templates/concept_groups.html b/src/soa_builder/web/templates/concept_groups.html index 91fc7cf..c2c1466 100644 --- a/src/soa_builder/web/templates/concept_groups.html +++ b/src/soa_builder/web/templates/concept_groups.html @@ -1,7 +1,7 @@ {% extends "base.html" %} {% block content %} -
+ @@ -25,7 +25,7 @@

CDISC Concept Groups


Custom Concept Groups

-

+

Custom Groups are global (not SOA-specific) and can be assigned to activities in any SoA. Biomedical Concepts added to a Custom Group via an activity assignment can be individually removed from that activity without affecting the group definition. @@ -70,19 +70,18 @@

Groups ({{ groups|length }})

{% endif %} {% for g in groups %} -
+
-
+
{{ g.concept_group_uid }} - - {{ g.name }} - {% if g.label %} — {{ g.label }}{% endif %} + {{ g.name }} + {% if g.label %} — {{ g.label }}{% endif %} - {{ g.concepts|length }} concept(s) - + {{ g.concepts|length }} concept(s) + @@ -91,14 +90,14 @@

Groups ({{ groups|length }})

-
+ {% if edit %} - -
+ +
-
+ +
@@ -39,8 +39,8 @@ })(); {% else %} -
- +
+
@@ -52,7 +52,7 @@
-
+ {% set crf_concepts = activity_concepts.get(activity_id, []) %} {% if crf_concepts %} {% set ns = namespace(total=0) %} @@ -17,51 +17,47 @@ -
+
- + {% for item in scalar_items %} - + {% endfor %} @@ -83,8 +83,8 @@

Summary

{% endif %}

{{ items_key | title }}

-
-
FieldField Value
{{ item.key }}{{ item.key }} {{ item.val }}
+
+
{% for col in col_keys %} @@ -115,16 +115,13 @@

{{ items_key | title }}

{% endif %} {# ── Raw JSON dropdown ───────────────────────────────────────────────────── #} -
- Raw JSON -
{{ spec_json }}
+
+ Raw JSON +
{{ spec_json }}
{% elif not error %} -

No data available for this CRF specialization.

+

No data available for this CRF specialization.

{% endif %} {% endblock %} diff --git a/src/soa_builder/web/templates/crf_specializations.html b/src/soa_builder/web/templates/crf_specializations.html index 55f62c1..14b931e 100644 --- a/src/soa_builder/web/templates/crf_specializations.html +++ b/src/soa_builder/web/templates/crf_specializations.html @@ -1,36 +1,36 @@ {% extends 'base.html' %} {% block content %}

CRF Specializations ({{ count }})

-

+

Data sourced from CDISC Library {{ spec_path }}.

-
+ {% if last_error %} -
+
Fetch diagnostics: Status {{ last_status }}{% if last_url %} from {{ last_url }}{% endif %}.
Error: {{ last_error }}
{% if missing_key %}No API key detected — set CDISC_SUBSCRIPTION_KEY or CDISC_API_KEY.{% endif %}
{% elif missing_key %} -
+
Notice: No API key provided; response may be empty or unauthorized. Set CDISC_SUBSCRIPTION_KEY or CDISC_API_KEY.
{% endif %}
-
+
+ class="fz-version-input am-w-300" oninput="filterSpecs()" />
- -
+ +
@@ -55,7 +55,7 @@

CRF Specializations ({{ count }}<

{{ col }}
{% else %}

No CRF specializations available.

-
    +
    • Verify API key env (CDISC_SUBSCRIPTION_KEY or CDISC_API_KEY).
    • If testing offline, export CDISC_CRF_SPECIALIZATIONS_JSON with sample JSON.
    • Confirm network access to the CDISC Library domain.
    • diff --git a/src/soa_builder/web/templates/dair.html b/src/soa_builder/web/templates/dair.html index 3dbe0cf..eeb763f 100644 --- a/src/soa_builder/web/templates/dair.html +++ b/src/soa_builder/web/templates/dair.html @@ -4,36 +4,36 @@

      Generate Digital Amendment Impact Report (DAIR) {% if study_label %}— {{ study_label }}{% elif study_name %}— {{ study_name }}{% endif %}

      -
      + {% if study_id_value %} -

      Study ID: {{ study_id_value }}

      +

      Study ID: {{ study_id_value }}

      {% endif %}
      -

      +

      A DAIR compares two snapshots of your study and surfaces every structural change to the protocol model — study design, endpoints, Schedule of Activities, and Biomedical Concept linkages — along with inferred downstream impact signals for eCRF, SDTM, ADaM, and TLFs. Select a base version and a revised version below.

      -
      +
      Note: This is a machine-generated change intelligence artifact. It is not a regulatory submission document. Study team review is required before acting on inferred impacts.
      {% if freezes | length < 2 %} -
      +
      No comparison available.
      You need at least two snapshots to generate a DAIR. Create snapshots via Snapshots and Amendments.
      {% else %} -
      +

      Select Versions to Compare

      @@ -66,7 +66,7 @@

      Select Versions to Compare

      -
      +
      @@ -74,9 +74,9 @@

      Select Versions to Compare

      -
      -

      Available Snapshots

      - +
      +

      Available Snapshots

      +
      diff --git a/src/soa_builder/web/templates/ddf_controlled_terminology.html b/src/soa_builder/web/templates/ddf_controlled_terminology.html index 8db2d8b..20da344 100644 --- a/src/soa_builder/web/templates/ddf_controlled_terminology.html +++ b/src/soa_builder/web/templates/ddf_controlled_terminology.html @@ -2,12 +2,12 @@ {% block content %}

      DDF Controlled Terminology{% if slug %} — {{ slug }}{% else %} — (unavailable){% endif %}

      -
      + {% if error %} -
      +
      Error: {{ error }}
      {% endif %} @@ -35,12 +35,12 @@

      Filter

      - +
      -
      +
      @@ -48,7 +48,7 @@

      Filter

      -

      +

      Total: {{ total_count }} | Matched: {{ matched_count }} | Showing limit {{ limit }} offset {{ offset }}

      @@ -68,7 +68,7 @@

      Filter

      {% if matched_count > limit %} {% set next_offset = offset + limit %} {% if next_offset < matched_count %} -
      +
      diff --git a/src/soa_builder/web/templates/define_json.html b/src/soa_builder/web/templates/define_json.html index 6629b43..18fb0f2 100644 --- a/src/soa_builder/web/templates/define_json.html +++ b/src/soa_builder/web/templates/define_json.html @@ -1,6 +1,6 @@ {% extends 'base.html' %} {% block content %} -
      + @@ -9,20 +9,20 @@

      Generate Data Definition Specification for Study: {% if study_id_value %} -

      Study ID: {{ study_id_value }}

      +

      Study ID: {{ study_id_value }}

      {% endif %}
      EXPERIMENTAL -

      +

      The Data Definition Specification (DDS) JSON is a metadata contract that describes which datasets and variables this study produces. It complements USDM and is suitable for inclusion in a regulatory submission package alongside Dataset-JSON.

      -
      +

      Download Parameters

      @@ -42,7 +42,7 @@

      Download Parameters

      -
      +
      diff --git a/src/soa_builder/web/templates/define_xml_terminology.html b/src/soa_builder/web/templates/define_xml_terminology.html index f6d70a1..665f098 100644 --- a/src/soa_builder/web/templates/define_xml_terminology.html +++ b/src/soa_builder/web/templates/define_xml_terminology.html @@ -2,12 +2,12 @@ {% block content %}

      Define-XML Controlled Terminology{% if slug %} — {{ slug }}{% else %} — (unavailable){% endif %}

      -
      + {% if error %} -
      +
      Error: {{ error }}
      {% endif %} @@ -35,12 +35,12 @@

      Filter

      - +
      -
      +
      @@ -48,7 +48,7 @@

      Filter

      -

      +

      Total: {{ total_count }} | Matched: {{ matched_count }} | Showing limit {{ limit }} offset {{ offset }}

      @@ -68,7 +68,7 @@

      Filter

      {% if matched_count > limit %} {% set next_offset = offset + limit %} {% if next_offset < matched_count %} -
      +
      diff --git a/src/soa_builder/web/templates/dss_cell.html b/src/soa_builder/web/templates/dss_cell.html index 074f1b1..c159b1b 100644 --- a/src/soa_builder/web/templates/dss_cell.html +++ b/src/soa_builder/web/templates/dss_cell.html @@ -1,5 +1,5 @@ {# Partial for DSS assignment cell — lazy-loaded options per concept #} -

      diff --git a/src/soa_builder/web/templates/edit.html b/src/soa_builder/web/templates/edit.html index 02ba7a4..b8362c6 100644 --- a/src/soa_builder/web/templates/edit.html +++ b/src/soa_builder/web/templates/edit.html @@ -20,17 +20,17 @@

      Study Metadata

      -
      +
      - Study ID must be unique and cannot be cleared once set. + Study ID must be unique and cannot be cleared once set.
      -
      +
      {% include "study_identifiers_partial.html" %} -
      +
      @@ -38,11 +38,11 @@

      Study Metadata

      -
      +
      -
      +
      Last fetch: {% if concepts_last_fetch_relative %} {{ concepts_last_fetch_relative }} @@ -50,7 +50,7 @@

      Study Metadata

      n/a {% endif %}
      - (forces remote re-fetch & cache reset) + (forces remote re-fetch & cache reset)
      @@ -69,11 +69,11 @@

      Study Metadata

    • {{ a.order_index }}. {{ a.name }} -
      + - - - + + +
      @@ -84,7 +84,7 @@

      Study Metadata

    • {% endfor %} - +
      @@ -98,24 +98,6 @@

      Study Metadata


      - {% if timelines and timelines|length > 0 %}
      Select Timeline: @@ -132,25 +114,24 @@

      Study Metadata

      {% endif %} {% macro epoch_th(soa_id, epoch_id, value, colspan, superscript) %} -
      + {% endmacro %} {% for timeline_uid, timeline_instances in instances_by_timeline.items() %} -
      +

      Matrix: {% if timeline_instances and timeline_instances[0].timeline_name %}{{ timeline_instances[0].timeline_name }}{% else %}{{ timeline_uid }}{% endif %}

      {% if timeline_instances|length == 0 %} -

      No scheduled activity instances for this timeline.

      +

      No scheduled activity instances for this timeline.

      {% else %}
      ID + {% set dss_concepts = activity_concepts.get(activity_id, []) %} {% if dss_concepts %} {% set ns = namespace(total=0) %} @@ -17,51 +17,47 @@ - {{ value }}{% if superscript %}{{ superscript }}{% endif %}{% if epoch_id %}{% endif %}{{ value }}{% if superscript %}{{ superscript }}{% endif %}{% if epoch_id %}{% endif %}
      - + {% set prev_epoch = namespace(value=None, count=0, id=None, superscript=None) %} {% for inst in timeline_instances %} {% set current_epoch = inst.epoch_label if inst.epoch_label else inst.epoch_name %} @@ -177,9 +158,9 @@

      Matrix: {% if timeline_instances and timeline_instances[0].timeline_name %}{

      - + {% for inst in timeline_instances %} - {% endfor %} @@ -187,19 +168,19 @@

      Matrix: {% if timeline_instances and timeline_instances[0].timeline_name %}{

      - + {% for inst in timeline_instances %} - {% endfor %} - + {% for inst in timeline_instances %} - {% endfor %} @@ -207,9 +188,9 @@

      Matrix: {% if timeline_instances and timeline_instances[0].timeline_name %}{

      - + {% for inst in timeline_instances %} - {% endfor %} @@ -217,19 +198,19 @@

      Matrix: {% if timeline_instances and timeline_instances[0].timeline_name %}{

      - + {% for inst in timeline_instances %} - {% endfor %} - + {% for inst in timeline_instances %} - + {% endfor %} {% for a in activities_by_timeline.get(timeline_uid, []) %} @@ -265,9 +246,9 @@

      Matrix: {% if timeline_instances and timeline_instances[0].timeline_name %}{ {% endfor %} {% if footnotes %} -
      +
      {% for fn in footnotes %} -
      +
      {{ fn.name }}: {{ fn.text | safe }}
      @@ -275,12 +256,12 @@

      Matrix: {% if timeline_instances and timeline_instances[0].timeline_name %}{

      {% endif %} -
      +
      Manage Footnotes ({{ footnotes|length }}) {% for fn in footnotes %} -
      +
      + class="fz-form-2row am-flex-1">
      {{ fn.footnote_uid }} @@ -299,17 +280,17 @@

      Matrix: {% if timeline_instances and timeline_instances[0].timeline_name %}{

      - +
      - +
      + onsubmit="return confirm('Delete this footnote?');" class="fz-inline-form am-pt-22">
      {% endfor %} -
      +
      @@ -325,14 +306,14 @@

      Matrix: {% if timeline_instances and timeline_instances[0].timeline_name %}{

      - +
      - +
      -

      Epoch:->Epoch:->
      Encounter:->Encounter:-> + {% if inst.encounter_label %}{{ inst.encounter_label }}{% else %}{{ inst.encounter_name }}{% endif %}{% if inst.encounter_superscript %}{{ inst.encounter_superscript }}{% endif %}{% if inst.encounter_id %}{% endif %}
      Instance:->Instance:-> -
      {% if inst.label %}{{ inst.label }}{% else %}{{ inst.name }}{% endif %}
      +
      +
      {% if inst.label %}{{ inst.label }}{% else %}{{ inst.name }}{% endif %}
      Study Day:->Study Day:-> + {% if inst.study_day %}{{ inst.study_day }}{% endif %}
      Timing:->Timing:-> + {% if inst.timing_label %}{{ inst.timing_label }}{% else %}{{ inst.timing_name }}{% endif %}
      Visit Window:->Visit Window:-> + {% if inst.window_label %}{{ inst.window_label }}{% endif %}
      ActivityConceptsConcepts
      - - - - - - - +
      IDElementActionPerformedBeforeAfter
      + + + + + + + {% for au in element_audits %} - - - - - - + + + + + + {% endfor %}
      IDElementActionPerformedBeforeAfter
      {{ au.id }}{{ au.element_id }}{{ au.action }}{{ au.performed_at }}{{ au.before_json or '' }}{{ au.after_json or '' }}{{ au.id }}{{ au.element_id }}{{ au.action }}{{ au.performed_at }}{{ au.before_json or '' }}{{ au.after_json or '' }}
      {% else %} -
      No element audit entries yet.
      +
      No element audit entries yet.
      {% endif %} diff --git a/src/soa_builder/web/templates/elements.html b/src/soa_builder/web/templates/elements.html index b21419f..8a6bfc0 100644 --- a/src/soa_builder/web/templates/elements.html +++ b/src/soa_builder/web/templates/elements.html @@ -2,7 +2,7 @@ {% block content %}

      Elements for Study: {% if study_label %}{{ study_label }}{% else %}{{ study_name }}{% endif %}

      -
      + @@ -44,7 +44,7 @@

      Create Element

      {% if interventions %}
      - {% for iv in interventions %} {% endfor %} @@ -93,7 +93,7 @@

      Elements ({{ elements|length }})

- {% for iv in (interventions or []) %} {{ est.estimand_uid }} {{ est.name }} - {% if est.label %}
{{ est.label }}
{% endif %} + {% if est.label %}
{{ est.label }}
{% endif %}
{{ est.population_summary or '—' }} {% if est.variable_names %} {{ est.variable_names | join(', ') }} {% else %} - + {% endif %} {% if est.intervention_names %} {{ est.intervention_names | join(', ') }} {% else %} - + {% endif %}
+ class="am-inline-form">
-
- Variables of Interest +
+
+ Variables of Interest {% for uid in est.variable_uids %} - + {{ est.variable_names[loop.index0] }}
+ class="am-inline-form"> + class="am-chip-remove-btn">×
{% endfor %} @@ -79,8 +77,8 @@ {% if unlinked_eps %}
- {% for ep in unlinked_eps %} @@ -95,19 +93,17 @@ {# ── Linked Interventions subsection ── #}
-
- Linked Interventions +
+
+ Linked Interventions {% for uid in est.intervention_uids %} - + {{ est.intervention_names[loop.index0] }} + class="am-inline-form"> + class="am-chip-remove-btn">× {% endfor %} @@ -121,8 +117,8 @@ {% if unlinked_ints %}
- {% for av in unlinked_ints %} @@ -137,14 +133,14 @@ {# ── Intercurrent Events subsection ── #}
- + + Intercurrent Events ({{ est.intercurrent_events | length }}) + class="am-grid-2 am-mt-6">
-
+
{% if est.intercurrent_events %} - +
{% for ice in est.intercurrent_events %} - + - - + + diff --git a/src/soa_builder/web/templates/freeze_modal.html b/src/soa_builder/web/templates/freeze_modal.html index 3a01f6e..e669ce1 100644 --- a/src/soa_builder/web/templates/freeze_modal.html +++ b/src/soa_builder/web/templates/freeze_modal.html @@ -27,45 +27,45 @@ {% endif %} {% if axis_type == 'instance' %}Inst {{ axis_value or '?' }}{% else %}Visit {{ axis_value or '?' }}{% endif %} {%- endmacro %} - - @@ -95,30 +95,27 @@

Existing Studies ({{ soas|length }})

- - @@ -85,7 +85,7 @@ {% endfor %}
UIDNameTextStrategy
{{ ice.event_uid }}{{ ice.event_uid }} {{ ice.name }} {% if ice.label %} -
{{ ice.label }}
+
{{ ice.label }}
{% endif %}
{{ ice.text or '—' }}{{ ice.strategy or '—' }}{{ ice.text or '—' }}{{ ice.strategy or '—' }}
+ class="am-inline-form">
{{ s.name }} {{ s.study_id or '' }} {{ s.study_label or '' }}{{ s.study_description or '' }} {{ s.created_at }} Edit + {% if ind.is_rare_disease %} - + {% else %} - + {% endif %} {% if ind.codes %} {{ ind.codes | length }} code{{ 's' if ind.codes|length != 1 else '' }} {% else %} - + {% endif %} + class="am-inline-form"> @@ -60,15 +60,14 @@ {# ── Codes subsection ── #}
- + + Codes ({{ ind.codes | length }}) + class="am-grid-2 am-mt-6">
-
+
@@ -97,7 +96,7 @@ {% if ind.codes %} - +
@@ -109,17 +108,17 @@ {% for c in ind.codes %} - - - - + + + + - @@ -76,7 +76,7 @@ {% endfor %}
UID Code
- {{ c.code_uid }} + {{ c.code_uid }} {{ c.code or '—' }}{{ c.code_system or '—' }}{{ c.code_system_version or '—' }}{{ c.decode or '—' }}{{ c.code or '—' }}{{ c.code_system or '—' }}{{ c.code_system_version or '—' }}{{ c.decode or '—' }}
+ class="am-inline-form">
diff --git a/src/soa_builder/web/templates/objectives.html b/src/soa_builder/web/templates/objectives.html index 45749f3..4d315a6 100644 --- a/src/soa_builder/web/templates/objectives.html +++ b/src/soa_builder/web/templates/objectives.html @@ -2,7 +2,7 @@ {% block content %}

Objectives & Endpoints for Study: {% if study_label %}{{ study_label }}{% else %}{{ study_name }}{% endif %}

-
+ @@ -135,7 +135,7 @@

Create Endpoint

{% endif %}
-

Endpoints ({{ endpoints_by_objective.values()|map('length')|sum }})

+

Endpoints ({{ endpoints_by_objective.values()|map('length')|sum }})

diff --git a/src/soa_builder/web/templates/organizations_partial.html b/src/soa_builder/web/templates/organizations_partial.html index 0ec2a76..5eb902f 100644 --- a/src/soa_builder/web/templates/organizations_partial.html +++ b/src/soa_builder/web/templates/organizations_partial.html @@ -18,11 +18,11 @@ - @@ -91,7 +91,7 @@ {% endfor %}
{{ o.organization_uid }} + class="am-input-compact am-w-120" /> + class="am-input-compact am-w-80" /> + placeholder="Scheme" class="am-input-compact am-w-55" /> + placeholder="ID" class="am-input-compact am-w-80" /> + placeholder="City" class="am-input-compact am-w-80" /> + placeholder="State" class="am-input-compact am-w-55" /> + placeholder="ZIP" class="am-input-compact am-w-55" /> +
-
+
-
- +
+ Legal Address
@@ -182,7 +181,7 @@ id="org-country-name-{{ soa_id }}" value="" />
-
+
diff --git a/src/soa_builder/web/templates/orgs_roles_persons.html b/src/soa_builder/web/templates/orgs_roles_persons.html index 73948c8..b3281bb 100644 --- a/src/soa_builder/web/templates/orgs_roles_persons.html +++ b/src/soa_builder/web/templates/orgs_roles_persons.html @@ -3,10 +3,10 @@

Organizations, Roles & Persons

{% if study_label %} -

{{ study_label }}

+

{{ study_label }}

{% endif %} -
+ @@ -17,12 +17,12 @@

Organizations

{% include "organizations_partial.html" %}
-
+

Roles

{% include "roles_partial.html" %}
-
+

Persons

{% include "persons_partial.html" %}
diff --git a/src/soa_builder/web/templates/persons_partial.html b/src/soa_builder/web/templates/persons_partial.html index e97bbf2..296fae0 100644 --- a/src/soa_builder/web/templates/persons_partial.html +++ b/src/soa_builder/web/templates/persons_partial.html @@ -17,34 +17,34 @@
{{ p.person_name_uid }} + class="am-input-compact am-w-110" /> + placeholder="Job title" class="am-input-compact am-w-120" /> + class="am-input-compact am-w-120" /> + placeholder="Family name" class="am-input-compact am-w-90" /> + placeholder="Given names" class="am-input-compact am-w-90" /> + placeholder="e.g. Dr" class="am-input-compact am-w-55" /> + placeholder="e.g. MD" class="am-input-compact am-w-55" /> +
-
+
-
+
diff --git a/src/soa_builder/web/templates/protocol_controlled_terminology.html b/src/soa_builder/web/templates/protocol_controlled_terminology.html index c82013c..e3f1b5e 100644 --- a/src/soa_builder/web/templates/protocol_controlled_terminology.html +++ b/src/soa_builder/web/templates/protocol_controlled_terminology.html @@ -2,12 +2,12 @@ {% block content %}

Protocol Controlled Terminology{% if slug %} — {{ slug }}{% else %} — (unavailable){% endif %}

-
+ {% if error %} -
+
Error: {{ error }}
{% endif %} @@ -35,12 +35,12 @@

Filter

- +
-
+
@@ -48,7 +48,7 @@

Filter

-

+

Total: {{ total_count }} | Matched: {{ matched_count }} | Showing limit {{ limit }} offset {{ offset }}

@@ -68,7 +68,7 @@

Filter

{% if matched_count > limit %} {% set next_offset = offset + limit %} {% if next_offset < matched_count %} -
+
diff --git a/src/soa_builder/web/templates/reorder_audit_modal.html b/src/soa_builder/web/templates/reorder_audit_modal.html index 7207852..d98e788 100644 --- a/src/soa_builder/web/templates/reorder_audit_modal.html +++ b/src/soa_builder/web/templates/reorder_audit_modal.html @@ -1,20 +1,20 @@ -
{{ r.role_uid }} + class="am-input-compact am-w-110" /> + class="am-input-compact am-w-80" /> + placeholder="Description" class="am-input-compact am-w-140" /> +
-
+
{% endfor %} - Hold Ctrl / Cmd to select multiple + Hold Ctrl / Cmd to select multiple
@@ -140,19 +140,19 @@ {% endfor %} - Hold Ctrl / Cmd to select multiple + Hold Ctrl / Cmd to select multiple
-
-
+
diff --git a/src/soa_builder/web/templates/rollback_audit_modal.html b/src/soa_builder/web/templates/rollback_audit_modal.html index e638ef8..b225f82 100644 --- a/src/soa_builder/web/templates/rollback_audit_modal.html +++ b/src/soa_builder/web/templates/rollback_audit_modal.html @@ -1,38 +1,38 @@ -
{% else %}

No SDTM dataset specializations available.

-
    +
    • Verify API key env (CDISC_SUBSCRIPTION_KEY or CDISC_API_KEY).
    • If testing offline, export CDISC_SDTM_SPECIALIZATIONS_JSON with sample JSON.
    • Confirm network access to the CDISC Library domain.
    • diff --git a/src/soa_builder/web/templates/sdtm_terminology.html b/src/soa_builder/web/templates/sdtm_terminology.html index 2d36675..6ecbe2d 100644 --- a/src/soa_builder/web/templates/sdtm_terminology.html +++ b/src/soa_builder/web/templates/sdtm_terminology.html @@ -2,12 +2,12 @@ {% block content %}

      SDTM Controlled Terminology{% if slug %} — {{ slug }}{% else %} — (unavailable){% endif %}

      -
      + {% if error %} -
      +
      Error: {{ error }}
      {% endif %} @@ -35,12 +35,12 @@

      Filter

      - +
      -
      +
      @@ -48,7 +48,7 @@

      Filter

      -

      +

      Total: {{ total_count }} | Matched: {{ matched_count }} | Showing limit {{ limit }} offset {{ offset }}

      @@ -68,7 +68,7 @@

      Filter

      {% if matched_count > limit %} {% set next_offset = offset + limit %} {% if next_offset < matched_count %} -
      +
      diff --git a/src/soa_builder/web/templates/soa_matrix_export.html b/src/soa_builder/web/templates/soa_matrix_export.html index 0d4b12f..16b8c0d 100644 --- a/src/soa_builder/web/templates/soa_matrix_export.html +++ b/src/soa_builder/web/templates/soa_matrix_export.html @@ -9,6 +9,7 @@ /* Export-only overrides */ body { font-size: 0.82em; padding: 18px; } .matrix td.cell { cursor: default; } + .matrix { font-size: 0.78em; } details > summary { cursor: pointer; } .matrix-container { margin-bottom: 32px; } @media print { @@ -18,16 +19,16 @@ -

      +

      SoA Matrix: {{ study.study_label or study.name or ("SoA " ~ soa_id) }}

      {% if study.study_id %} -

      +

      Study ID: {{ study.study_id }}

      {% endif %} -

      +

      Generated {{ generated_at }}

      @@ -36,18 +37,18 @@

      {% set tl_instances = instances_by_tl.get(tl_uid, []) %} {% if tl_instances %}
      -

      +

      {{ tl.name }}{% if tl.main_timeline %} - + (main timeline) {% endif %}

      -
      - +
      +
      - + {% set prev_epoch = namespace(value=None, count=0, superscript=None) %} {% for inst in tl_instances %} {% set cur_epoch = inst.epoch_label if inst.epoch_label else inst.epoch_name %} @@ -55,7 +56,7 @@

      {% set prev_epoch.count = prev_epoch.count + 1 %} {% else %} {% if prev_epoch.value is not none %} -

      {% endif %} {% set prev_epoch.value = cur_epoch %} @@ -63,7 +64,7 @@

      {% set prev_epoch.superscript = inst.epoch_superscript %} {% endif %} {% if loop.last %} -

      {% endif %} {% endfor %} @@ -71,9 +72,9 @@

      - + {% for inst in tl_instances %} - {% endfor %} @@ -81,19 +82,19 @@

      - + {% for inst in tl_instances %} - {% endfor %} - + {% for inst in tl_instances %} - {% endfor %} @@ -101,9 +102,9 @@

      - + {% for inst in tl_instances %} - {% endfor %} @@ -111,9 +112,9 @@

      - + {% for inst in tl_instances %} - {% endfor %} @@ -121,9 +122,9 @@

      - + {% for inst in tl_instances %} - + {% endfor %} @@ -135,26 +136,22 @@

      {% set act_surrogates = surrogates_map.get(act.id, []) %} {% if act_concepts or act_surrogates %}
      - + {{ act_concepts | length + act_surrogates | length }} concept(s) ▸ -
        +
          {% for c in act_concepts %} -
        • {{ c.title }} - ({{ c.code }}) + ({{ c.code }})
        • {% endfor %} {% for s in act_surrogates %} -
        • +
        • [S] {{ s.label or s.name }} - + ({{ s.surrogate_uid }})
        • @@ -162,13 +159,13 @@

      {% else %} - + {% endif %} {% for inst in tl_instances %} {% set status = cell_map.get((inst.id, act.id), '') %} {% set sup = superscript_map.get((inst.id, act.id)) %} -

      {% endfor %} @@ -181,12 +178,10 @@

      {% endfor %} {% if footnotes %} -
      +
      Footnotes {% for fn in footnotes %} -
      +
      {{ fn.name }}: {{ fn.text | safe }}
      {% endfor %} diff --git a/src/soa_builder/web/templates/study_cells.html b/src/soa_builder/web/templates/study_cells.html index 0a9884f..93d2a70 100644 --- a/src/soa_builder/web/templates/study_cells.html +++ b/src/soa_builder/web/templates/study_cells.html @@ -2,7 +2,7 @@ {% block content %}

      Study Cells for Study: {% if study_label %}{{ study_label }}{% else %}{{ study_name }}{% endif %}

      -
      + diff --git a/src/soa_builder/web/templates/study_identifiers_partial.html b/src/soa_builder/web/templates/study_identifiers_partial.html index a14aef5..a3521a5 100644 --- a/src/soa_builder/web/templates/study_identifiers_partial.html +++ b/src/soa_builder/web/templates/study_identifiers_partial.html @@ -1,15 +1,13 @@
      {% if study_identifiers %} -
        +
          {% for si in study_identifiers %} -
        • -
          - {{ si.study_identifier_uid }} - {{ si.text }} +
        • +
          + {{ si.study_identifier_uid }} + {{ si.text }} {% if si.org_name %} - + ({{ si.org_name }}) {% endif %} @@ -17,7 +15,7 @@ + class="am-flex-shrink-0">
          diff --git a/src/soa_builder/web/templates/study_interventions_partial.html b/src/soa_builder/web/templates/study_interventions_partial.html index 68ba7d5..71ae773 100644 --- a/src/soa_builder/web/templates/study_interventions_partial.html +++ b/src/soa_builder/web/templates/study_interventions_partial.html @@ -15,10 +15,10 @@

      @@ -34,7 +34,7 @@ + class="am-inline-form"> @@ -44,14 +44,14 @@ {# Codes subsection — renders below each intervention row #} -
      Epoch:->Epoch:->{{ prev_epoch.value }}{% if prev_epoch.superscript %}{{ prev_epoch.superscript }}{% endif %}{{ prev_epoch.value }}{% if prev_epoch.superscript %}{{ prev_epoch.superscript }}{% endif %}
      Encounter:->Encounter:-> + {{ inst.encounter_label or inst.encounter_name or '' }}{% if inst.encounter_superscript %}{{ inst.encounter_superscript }}{% endif %}
      Instance:->Instance:-> -
      {{ inst.label or inst.name }}
      +
      +
      {{ inst.label or inst.name }}
      Study Day:->Study Day:-> + {{ inst.study_day or '' }}
      Timing:->Timing:-> + {{ inst.timing_label or inst.timing_name or '' }}
      Visit Window:->Visit Window:-> + {{ inst.window_label or '' }}
      ActivityConceptsConcepts
      + {{ status or '' }}{% if sup %}{{ sup }}{% endif %} {{ si.name }} {% if si.label %} - ({{ si.label }}) + ({{ si.label }}) {% endif %} {% if si.description %} -
      {{ si.description }} +
      {{ si.description }} {% endif %}
      {{ si.role_decode or '—' }}
      -
      -

      +

      +
      +

      Codes ({{ si.codes|length }})

      {% if si.codes %} - +
      @@ -71,7 +71,7 @@ + class="am-inline-form"> @@ -83,25 +83,25 @@ -
      - + class="fz-form-row" style="gap:6px;"> +
      +
      -
      - +
      +
      -
      - +
      +
      -
      - +
      +
      -
      +
      diff --git a/src/soa_builder/web/templates/study_timing.html b/src/soa_builder/web/templates/study_timing.html index 0389ed8..6d96165 100644 --- a/src/soa_builder/web/templates/study_timing.html +++ b/src/soa_builder/web/templates/study_timing.html @@ -2,7 +2,7 @@ {% block content %}

      Study Timing for Study: {% if study_label %}{{ study_label }}{% else %}{{ study_name }}{% endif %}

      -
      + diff --git a/src/soa_builder/web/templates/study_titles_partial.html b/src/soa_builder/web/templates/study_titles_partial.html index 1aaebde..f64ef98 100644 --- a/src/soa_builder/web/templates/study_titles_partial.html +++ b/src/soa_builder/web/templates/study_titles_partial.html @@ -1,14 +1,12 @@
      {% if study_titles %} -
        +
          {% for t in study_titles %} -
        • -
          - {{ t.text }} +
        • +
          + {{ t.text }} {% if t.type_decode %} - + ({{ t.type_decode }}) {% endif %} @@ -16,7 +14,7 @@
          + class="am-flex-shrink-0">
      UID Code
      +
      - - - + + + {% for key, label, json_file, csv_file in domains %} diff --git a/src/soa_builder/web/templates/tdd_view_partial.html b/src/soa_builder/web/templates/tdd_view_partial.html index 00f1300..9067c5e 100644 --- a/src/soa_builder/web/templates/tdd_view_partial.html +++ b/src/soa_builder/web/templates/tdd_view_partial.html @@ -1,21 +1,20 @@ -
      -
      -

      +
      +
      +

      {{ domain }} — {{ rows|length }} record(s)

      {% if rows %} -
      -

      DomainJSONCSVViewJSONCSVView
      +
      +
      {% for col in fieldnames %} - + {% endfor %} @@ -31,7 +30,7 @@

      {{ col }}{{ col }}
      {% else %} -

      +

      No records generated for this domain.

      {% endif %} diff --git a/src/soa_builder/web/templates/transition_rules_list.html b/src/soa_builder/web/templates/transition_rules_list.html index ebe217d..afb25e1 100644 --- a/src/soa_builder/web/templates/transition_rules_list.html +++ b/src/soa_builder/web/templates/transition_rules_list.html @@ -3,17 +3,17 @@
    • {{ rule.order_index }}. {% if rule.label %}{{ rule.label }}{% else %}{{ rule.name }}{% endif %} - + - - - - - + + + + + -
      + -
      diff --git a/src/soa_builder/web/templates/usdm_json.html b/src/soa_builder/web/templates/usdm_json.html index 9a6a32c..7d97fe6 100644 --- a/src/soa_builder/web/templates/usdm_json.html +++ b/src/soa_builder/web/templates/usdm_json.html @@ -2,20 +2,20 @@ {% block content %}

      Generate USDM JSON for Study: {% if study_label %}{{ study_label }}{% else %}{{ study_name }}{% endif %}

      -
      + {% if study_id_value %} -

      Study ID: {{ study_id_value }}

      +

      Study ID: {{ study_id_value }}

      {% endif %}
      - +
      - + {% for key, label, filename in components %} From 7ac63a92340891cc17426d925c9d5ab87ca6db8d Mon Sep 17 00:00:00 2001 From: pendingintent <3921919+pendingintent@users.noreply.github.com> Date: Mon, 3 Aug 2026 08:41:39 -0400 Subject: [PATCH 11/20] USDM data structure schema; the single source-of-truth for USDM 4.0 in the SOA Workbench. --- schema/dataStructure.yml | 8244 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 8244 insertions(+) create mode 100644 schema/dataStructure.yml diff --git a/schema/dataStructure.yml b/schema/dataStructure.yml new file mode 100644 index 0000000..9e074cf --- /dev/null +++ b/schema/dataStructure.yml @@ -0,0 +1,8244 @@ +Abbreviation: + NCI C-Code: C42610 + Preferred Term: Abbreviation + Definition: A set of letters that are drawn from a word or from a sequence of words + and that are used for brevity in place of the full word or phrase. (CDISC Glossary) + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + abbreviatedText: + Type: + - $ref: '#/string' + NCI C-Code: C215487 + Preferred Term: Text Abbreviation Value + Definition: The literal value of an instance of unstructured text that is used + as the abbreviation. + Cardinality: '1' + Relationship Type: Value + Model Name: abbreviatedText + Model Representation: Attribute + expandedText: + Type: + - $ref: '#/string' + NCI C-Code: C215569 + Preferred Term: Abbreviation Long Name + Definition: The full literal representation of the abbreviation. + Cardinality: '1' + Relationship Type: Value + Model Name: expandedText + Model Representation: Attribute + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215570 + Preferred Term: Abbreviation Notes + Definition: A brief written record relevant to the abbreviation. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +Activity: + NCI C-Code: C71473 + Preferred Term: Study Activity + Definition: An action, undertaking, or event, which is anticipated to be performed + or observed, or was performed or observed, according to the study protocol during + the execution of the study. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C188842 + Preferred Term: Study Activity Name + Definition: The literal identifier (i.e., distinctive designation) of the study + activity. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C207458 + Preferred Term: Study Activity Label + Definition: The short descriptive designation for the study activity. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C70960 + Preferred Term: Study Activity Description + Definition: A narrative representation of the study activity. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215519 + Preferred Term: Activity Notes + Definition: A brief written record relevant to the activity. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + definedProcedures: + Type: + - $ref: '#/Procedure' + Definition: A USDM relationship between the Activity and Procedure classes which + identifies the set of defined procedures associated with the activity. + Cardinality: 0..* + Relationship Type: Value + Model Name: definedProcedures + Model Representation: Relationship + biomedicalConceptIds: + Type: + - $ref: '#/BiomedicalConcept' + Definition: A USDM relationship between the Activity and BiomedicalConcept classes + which identifies the set of biomedical concepts associated with the activity. + Cardinality: 0..* + Relationship Type: Ref + Model Name: biomedicalConcepts + Model Representation: Relationship + nextId: + Type: + - $ref: '#/Activity' + Definition: A USDM relationship within the Activity class which identifies the + activity that follows the current activity in the display order. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: next + Model Representation: Relationship + timelineId: + Type: + - $ref: '#/ScheduleTimeline' + Definition: A USDM relationship between the Activity and ScheduleTimeline classes + which provides the details associated with an instance of the scheduled timeline + related to the activity. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: timeline + Model Representation: Relationship + childIds: + Type: + - $ref: '#/Activity' + Definition: A USDM relationship within the Activity class which identifies the + set of child activities associated with an activity. + Cardinality: 0..* + Relationship Type: Ref + Model Name: children + Model Representation: Relationship + previousId: + Type: + - $ref: '#/Activity' + Definition: A USDM relationship within the Activity class which identifies the + activity that precedes the current activity in the display order. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: previous + Model Representation: Relationship + bcSurrogateIds: + Type: + - $ref: '#/BiomedicalConceptSurrogate' + Definition: A USDM relationship between the Activity and BiomedicalConceptSurrogate + classes which identifies the set of biomedical concept surrogates associated + with the activity. + Cardinality: 0..* + Relationship Type: Ref + Model Name: bcSurrogates + Model Representation: Relationship + bcCategoryIds: + Type: + - $ref: '#/BiomedicalConceptCategory' + Definition: A USDM relationship between the Activity and BiomedicalConceptCategory + classes which identifies the set of biomedical concept categories associated + with the activity. + Cardinality: 0..* + Relationship Type: Ref + Model Name: bcCategories + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +Address: + NCI C-Code: C25407 + Preferred Term: Address + Definition: A standardized representation of the location of a person, business, + building, or organization. (NCI) + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + text: + Type: + - $ref: '#/string' + NCI C-Code: C201311 + Preferred Term: Address Full Text + Definition: A standardized representation of the complete set of components + denoting the physical address of the person, business, building, or organization. + Cardinality: 0..1 + Relationship Type: Value + Model Name: text + Model Representation: Attribute + lines: + Type: + - $ref: '#/string' + NCI C-Code: C25690 + Preferred Term: Address Line + Definition: The street name and number, building number, apartment or unit number, + or post office box number where an entity is physically located. + Cardinality: 0..* + Relationship Type: Value + Model Name: lines + Model Representation: Attribute + district: + Type: + - $ref: '#/string' + NCI C-Code: C176229 + Preferred Term: District + Definition: An administrative or territorial division of a city, town, county, + parish, state, country, or other locality based on a shared characteristic. + Cardinality: 0..1 + Relationship Type: Value + Model Name: district + Model Representation: Attribute + city: + Type: + - $ref: '#/string' + NCI C-Code: C25160 + Preferred Term: City + Definition: A relatively large and/or densely populated area of human habitation + with administrative or legal status that may be specified as a component of + a postal address. + Cardinality: 0..1 + Relationship Type: Value + Model Name: city + Model Representation: Attribute + postalCode: + Type: + - $ref: '#/string' + NCI C-Code: C25621 + Preferred Term: Postal Code + Definition: An alphanumeric code assigned to a mail delivery area. + Cardinality: 0..1 + Relationship Type: Value + Model Name: postalCode + Model Representation: Attribute + state: + Type: + - $ref: '#/string' + NCI C-Code: C87194 + Preferred Term: State + Definition: A sub-division of a country that forms part of a federal union. + States are usually, but not always, more autonomous than provinces and may + have different laws from the central government. + Cardinality: 0..1 + Relationship Type: Value + Model Name: state + Model Representation: Attribute + country: + Type: + - $ref: '#/Code' + NCI C-Code: C25464 + Preferred Term: Country + Definition: A sovereign nation occupying a distinct territory and ruled by an + autonomous government. + Cardinality: 0..1 + Relationship Type: Value + Model Name: country + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +AdministrableProduct: + NCI C-Code: C215492 + Preferred Term: Administrable Product + Definition: Any study product that is formulated and presented in the form that + is suitable for administration to a study participant. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C215573 + Preferred Term: Administrable Product Definition Name + Definition: The literal identifier (i.e., distinctive designation) of the administrable + product. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C215575 + Preferred Term: Administrable Product Definition Label + Definition: The short descriptive designation for the administrable product. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C215574 + Preferred Term: Administrable Product Definition Description + Definition: A narrative representation of the administrable product. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + administrableDoseForm: + Type: + - $ref: '#/AliasCode' + NCI C-Code: C215576 + Preferred Term: Administrable Product Dose Form + Definition: The physical form in which formulated ingredient(s) are presented + in the administrable product. + Cardinality: '1' + Relationship Type: Value + Model Name: administrableDoseForm + Model Representation: Attribute + sourcing: + Type: + - $ref: '#/Code' + NCI C-Code: C215578 + Preferred Term: Administrable Product Sourcing + Definition: An indication as to whether the administrable product is obtained + from a local or central source. + Cardinality: 0..1 + Relationship Type: Value + Model Name: sourcing + Model Representation: Attribute + productDesignation: + Type: + - $ref: '#/Code' + NCI C-Code: C215579 + Preferred Term: Administrable Product Product Designation + Definition: An indication as to whether the administrable product is an investigational + medicinal product or an auxiliary medicinal product. + Cardinality: '1' + Relationship Type: Value + Model Name: productDesignation + Model Representation: Attribute + pharmacologicClass: + Type: + - $ref: '#/Code' + NCI C-Code: C215577 + Preferred Term: Administrable Product Pharmacologic Class + Definition: The pharmacological class of the administrable product. + Cardinality: 0..1 + Relationship Type: Value + Model Name: pharmacologicClass + Model Representation: Attribute + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215580 + Preferred Term: Administrable Product Notes + Definition: A brief written record relevant to the administrable product. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + identifiers: + Type: + - $ref: '#/AdministrableProductIdentifier' + Definition: A USDM relationship between the AdministrableProduct and AdministrableProductIdentifier + classes which provides the set of identifiers related to the administrable + product. + Cardinality: 0..* + Relationship Type: Value + Model Name: identifiers + Model Representation: Relationship + properties: + Type: + - $ref: '#/AdministrableProductProperty' + Definition: A USDM relationship between the AdministrableProduct and AdministrableProductProperty + classes which provides the set of properties related to the administrable + product. + Cardinality: 0..* + Relationship Type: Value + Model Name: properties + Model Representation: Relationship + ingredients: + Type: + - $ref: '#/Ingredient' + Definition: A USDM relationship between the AdministrableProduct and Ingredient + classes which provides the set of ingredients related to the administrable + product. + Cardinality: 0..* + Relationship Type: Value + Model Name: ingredients + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +AdministrableProductIdentifier: + NCI C-Code: C215493 + Preferred Term: Administrable Product Identifier + Definition: A sequence of characters used to identify, name, or characterize the + administrable product. + Modifier: Concrete + Super Classes: + - $ref: '#/Identifier' + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + Inherited From: + - $ref: '#/Identifier' + text: + Type: + - $ref: '#/string' + NCI C-Code: C215581 + Preferred Term: Administrable Product Identifier Text + Definition: An instance of structured text that represents the administrable + product. + Cardinality: '1' + Relationship Type: Value + Model Name: text + Model Representation: Attribute + Inherited From: + - $ref: '#/Identifier' + scopeId: + Type: + - $ref: '#/Organization' + Definition: A USDM relationship between the AdministrableProductIdentifier and + Organization class which provides the details associated with which provides + the details associated with each organization that has assigned the administrable + product identifier. + Cardinality: '1' + Relationship Type: Ref + Model Name: scope + Model Representation: Relationship + Inherited From: + - $ref: '#/Identifier' + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +AdministrableProductProperty: + NCI C-Code: C215494 + Preferred Term: Administrable Product Property + Definition: A characteristic from a set of characteristics used to define an administrable + product. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C215582 + Preferred Term: Administrable Product Property Name + Definition: The literal identifier (i.e., distinctive designation) of the administrable + product property. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + type: + Type: + - $ref: '#/Code' + NCI C-Code: C215585 + Preferred Term: Administrable Product Property Type + Definition: A characterization or classification of the administrable product + property. + Cardinality: '1' + Relationship Type: Value + Model Name: type + Model Representation: Attribute + text: + Type: + - $ref: '#/string' + NCI C-Code: C215583 + Preferred Term: Administrable Product Property Text + Definition: An instance of structured text that represents the administrable + product property. + Cardinality: '1' + Relationship Type: Value + Model Name: text + Model Representation: Attribute + quantity: + Type: + - $ref: '#/Quantity' + NCI C-Code: C215584 + Preferred Term: Administrable Product Property Quantity Value + Definition: The numeric value associated with an administrable product property. + Cardinality: 0..1 + Relationship Type: Value + Model Name: quantity + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +Administration: + NCI C-Code: C25409 + Preferred Term: Administration + Definition: The act of dispensing, applying, or tendering a product, agent, or therapy. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C207465 + Preferred Term: Administration Name + Definition: The literal identifier (i.e., distinctive designation) for the administration + of a product, agent, or therapy. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C207464 + Preferred Term: Administration Label + Definition: The short descriptive designation for the administration of a product, + agent, or therapy. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C207463 + Preferred Term: Administration Description + Definition: A narrative representation for the administration of a product, + agent, or therapy. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + dose: + Type: + - $ref: '#/Quantity' + NCI C-Code: C167190 + Preferred Term: Administration Dose + Definition: The value representing the amount of an agent given to an individual + at one time. + Cardinality: 0..1 + Relationship Type: Value + Model Name: dose + Model Representation: Attribute + frequency: + Type: + - $ref: '#/AliasCode' + NCI C-Code: C89081 + Preferred Term: Dosing Frequency + Definition: The number of doses administered per a specific interval. + Cardinality: 0..1 + Relationship Type: Value + Model Name: frequency + Model Representation: Attribute + route: + Type: + - $ref: '#/AliasCode' + NCI C-Code: C38114 + Preferred Term: Route of Administration + Definition: The pathway by which a substance is administered in order to reach + the site of action in the body. + Cardinality: 0..1 + Relationship Type: Value + Model Name: route + Model Representation: Attribute + duration: + Type: + - $ref: '#/Duration' + NCI C-Code: C69282 + Preferred Term: Administration Duration + Definition: The amount of time elapsed during the administration of an agent. + Cardinality: '1' + Relationship Type: Value + Model Name: duration + Model Representation: Attribute + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215544 + Preferred Term: Administration Notes + Definition: A brief written record relevant to the administration of the product, + agent, or therapy. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + administrableProductId: + Type: + - $ref: '#/AdministrableProduct' + Definition: A USDM relationship between the Administration and AdministrableProductDefinition + classes which identifies the administrable product associated with the administration + of the product, agent, or therapy. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: administrableProduct + Model Representation: Relationship + medicalDeviceId: + Type: + - $ref: '#/MedicalDevice' + Definition: A USDM relationship between the Administration and MedicalDevice + classes which identifies the medical device associated with an instance of + product, agent, or therapy administration. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: medicalDevice + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +AliasCode: + NCI C-Code: C201344 + Preferred Term: Alias Code + Definition: An alternative symbol or combination of symbols which is assigned to + the members of a collection. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + standardCode: + Type: + - $ref: '#/Code' + NCI C-Code: C215528 + Preferred Term: Standard Code + Definition: A combination of symbols that is used to represent the standard + code. + Cardinality: '1' + Relationship Type: Value + Model Name: standardCode + Model Representation: Attribute + standardCodeAliases: + Type: + - $ref: '#/Code' + NCI C-Code: C215529 + Preferred Term: Standard Code Aliases + Definition: Alternative combinations of symbols used to represent aliases or + alternatives to the standard code. + Cardinality: 0..* + Relationship Type: Value + Model Name: standardCodeAliases + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +AnalysisPopulation: + NCI C-Code: C188814 + Preferred Term: Analysis Population + Definition: A target study population on which an analysis is performed. These may + be represented by the entire study population, a subgroup defined by a particular + characteristic measured at baseline, or a principal stratum defined by the occurrence + (or non-occurrence, depending on context) of a specific intercurrent event. (ICH + E9 R1 Addendum) + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + text: + Type: + - $ref: '#/string' + NCI C-Code: C207468 + Preferred Term: Analysis Population Text + Definition: An instance of unstructured text that represents the analysis population. + Cardinality: '1' + Relationship Type: Value + Model Name: text + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C207467 + Preferred Term: Analysis Population Name + Definition: The literal identifier (i.e., distinctive designation) of the analysis + population. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C207466 + Preferred Term: Analysis Population Label + Definition: The short descriptive designation for the analysis population. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C188854 + Preferred Term: Analysis Population Description + Definition: A narrative representation of the analysis population. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215525 + Preferred Term: Analysis Population Notes + Definition: A brief written record relevant to the analysis population. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + subsetOfIds: + Type: + - $ref: '#/PopulationDefinition' + Definition: A USDM relationship between the AnalysisPopulation and PopulationDefinition + classes which identifies the population definition of which the analysis population + is a subset. + Cardinality: 0..* + Relationship Type: Ref + Model Name: subsetOf + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +AssignedPerson: + NCI C-Code: C215496 + Preferred Term: Assigned Person + Definition: An individual person who is allotted or appointed to a particular role, + function, or other entity. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C215596 + Preferred Term: Assigned Person Name + Definition: The literal identifier (i.e., distinctive designation) of the assigned + person. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C215598 + Preferred Term: Assigned Person Label + Definition: The short descriptive designation for the assigned person. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C215597 + Preferred Term: Assigned Person Description + Definition: A narrative representation of the assigned person. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + personName: + Type: + - $ref: '#/PersonName' + NCI C-Code: C216993 + Preferred Term: Assigned Person Person Name + Definition: A word or group of words indicating the identity of an assigned + person usually consisting of a first (personal) name and a last (family) name + with an optional middle name. In some cultural traditions the family name + comes first. + Cardinality: '1' + Relationship Type: Value + Model Name: personName + Model Representation: Attribute + jobTitle: + Type: + - $ref: '#/string' + NCI C-Code: C215599 + Preferred Term: Assigned Person Job Title + Definition: An identifying designation related to the assigned person's occupation. + Cardinality: '1' + Relationship Type: Value + Model Name: jobTitle + Model Representation: Attribute + organizationId: + Type: + - $ref: '#/Organization' + Definition: A USDM relationship between the AssignedPerson and Organization + classes that identifies that organization to which the assigned person belongs. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: organization + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +BiomedicalConcept: + NCI C-Code: C201345 + Preferred Term: Biomedical Concept + Definition: A unit of biomedical knowledge created from a unique combination of + characteristics that include implementation details like variables and terminologies, + used as building blocks for standardized, hierarchically structured clinical research + information. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C201312 + Preferred Term: Biomedical Concept Name + Definition: The literal identifier (i.e., distinctive designation) of the biomedical + concept. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C207470 + Preferred Term: Biomedical Concept Label + Definition: The short descriptive designation for the biomedical concept. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + synonyms: + Type: + - $ref: '#/string' + NCI C-Code: C201314 + Preferred Term: Biomedical Concept Synonym + Definition: A word or an expression that serves as a figurative, symbolic, or + exact substitute for a biomedical concept, and which has the same meaning. + Cardinality: 0..* + Relationship Type: Value + Model Name: synonyms + Model Representation: Attribute + reference: + Type: + - $ref: '#/string' + NCI C-Code: C201313 + Preferred Term: Biomedical Concept Reference + Definition: A citation to an authoritative source for a biomedical concept. + Cardinality: '1' + Relationship Type: Value + Model Name: reference + Model Representation: Attribute + code: + Type: + - $ref: '#/AliasCode' + NCI C-Code: C207469 + Preferred Term: Biomedical Concept Concept Code + Definition: A concept unique identifier assigned to a biomedical concept that + points to the meaning of that biomedical concept. + Cardinality: '1' + Relationship Type: Value + Model Name: code + Model Representation: Attribute + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215530 + Preferred Term: Biomedical Concept Notes + Definition: A brief written record relevant to the biomedical concept. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + properties: + Type: + - $ref: '#/BiomedicalConceptProperty' + Definition: A USDM relationship between the BiomedicalConcept and BiomedicalConceptProperty + classes which identifies the set of properties associated with the biomedical + concept. + Cardinality: 0..* + Relationship Type: Value + Model Name: properties + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +BiomedicalConceptCategory: + NCI C-Code: C201346 + Preferred Term: Biomedical Concept Category + Definition: A grouping of biomedical concepts based on some commonality or by user + defined characteristics. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C201317 + Preferred Term: Biomedical Concept Category Name + Definition: The literal identifier (i.e., distinctive designation) of the biomedical + concept category. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C207471 + Preferred Term: Biomedical Concept Category Label + Definition: The short descriptive designation for the biomedical concept category. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C201316 + Preferred Term: Biomedical Concept Category Description + Definition: A narrative representation of the biomedical concept category. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + code: + Type: + - $ref: '#/AliasCode' + NCI C-Code: C201315 + Preferred Term: Biomedical Concept Category Code + Definition: A symbol or combination of symbols which is assigned to the biomedical + concept category. + Cardinality: 0..1 + Relationship Type: Value + Model Name: code + Model Representation: Attribute + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215533 + Preferred Term: Biomedical Concept Category Notes + Definition: A brief written record relevant to the biomedical concept category. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + memberIds: + Type: + - $ref: '#/BiomedicalConcept' + Definition: A USDM relationship between the BiomedicalConceptCategory and BiomedicalConcept + classes which identifies the set of biomedical concept members associated + with the biomedical concept category. + Cardinality: 0..* + Relationship Type: Ref + Model Name: members + Model Representation: Relationship + childIds: + Type: + - $ref: '#/BiomedicalConceptCategory' + Definition: A USDM relationship within the BiomedicalConceptCategory class which + identifies the set of child categories of a biomedical concept. + Cardinality: 0..* + Relationship Type: Ref + Model Name: children + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +BiomedicalConceptProperty: + NCI C-Code: C202493 + Preferred Term: Biomedical Concept Property + Definition: A characteristic from a set of characteristics used to define a biomedical + concept. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C202494 + Preferred Term: Biomedical Concept Property Name + Definition: The literal identifier (i.e., distinctive designation) of the biomedical + concept property. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C207472 + Preferred Term: Biomedical Concept Property Label + Definition: The short descriptive designation for the biomedical concept property. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + isRequired: + Type: + - $ref: '#/boolean' + NCI C-Code: C202495 + Preferred Term: Biomedical Concept Property Required Indicator + Definition: An indication as to whether the biomedical concept property is required. + Cardinality: '1' + Relationship Type: Value + Model Name: isRequired + Model Representation: Attribute + isEnabled: + Type: + - $ref: '#/boolean' + NCI C-Code: C202496 + Preferred Term: Biomedical Concept Property Enabled Indicator + Definition: An indication as to whether the biomedical concept property is activated + for use within a given usage context for a biomedical concept. + Cardinality: '1' + Relationship Type: Value + Model Name: isEnabled + Model Representation: Attribute + datatype: + Type: + - $ref: '#/string' + NCI C-Code: C201319 + Preferred Term: Biomedical Concept Property Response Data Type + Definition: The structural format of the biomedical concept property response + value. The datatype is carried in the attribute and influences the set of + allowable values the attribute may assume. (After HL7) + Cardinality: '1' + Relationship Type: Value + Model Name: datatype + Model Representation: Attribute + code: + Type: + - $ref: '#/AliasCode' + NCI C-Code: C201318 + Preferred Term: Biomedical Concept Property Concept Code + Definition: A concept unique identifier assigned to a biomedical concept property + that points to the meaning of that biomedical concept property. + Cardinality: '1' + Relationship Type: Value + Model Name: code + Model Representation: Attribute + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215531 + Preferred Term: Biomedical Concept Property Notes + Definition: A brief written record relevant to the biomedical concept property. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + responseCodes: + Type: + - $ref: '#/ResponseCode' + Definition: A USDM relationship between the BiomedicalConceptProperty and ResponseCode + classes which identifies the set of response codes associated with the biomedical + concept property. + Cardinality: 0..* + Relationship Type: Value + Model Name: responseCodes + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +BiomedicalConceptSurrogate: + NCI C-Code: C207590 + Preferred Term: Biomedical Concept Surrogate + Definition: A concept that substitutes for a standard biomedical concept from the + designated source. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C207474 + Preferred Term: Biomedical Concept Surrogate Name + Definition: The literal identifier (i.e., distinctive designation) of the biomedical + concept surrogate. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C207473 + Preferred Term: Biomedical Concept Surrogate Label + Definition: The short descriptive designation for the biomedical concept surrogate. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C201320 + Preferred Term: Biomedical Concept Surrogate Description + Definition: A narrative representation of the biomedical concept surrogate. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + reference: + Type: + - $ref: '#/string' + NCI C-Code: C201321 + Preferred Term: Biomedical Concept Surrogate Reference + Definition: A citation to an authoritative source for a biomedical concept surrogate. + Cardinality: 0..1 + Relationship Type: Value + Model Name: reference + Model Representation: Attribute + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215532 + Preferred Term: Biomedical Concept Surrogate Notes + Definition: A brief written record relevant to the biomedical concept surrogate. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +BiospecimenRetention: + NCI C-Code: C215505 + Preferred Term: Biospecimen Retention + Definition: The continued possession, cataloging, and storage of collected biological + specimens beyond their initial use. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C215645 + Preferred Term: Biospecimen Retention Name + Definition: The literal identifier (i.e., distinctive designation) of the biospecimen + retention. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C215646 + Preferred Term: Biospecimen Retention Label + Definition: The short descriptive designation for the biospecimen retention. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C181231 + Preferred Term: Biospecimen Retention Description + Definition: A narrative representation of the biospecimen retention. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + isRetained: + Type: + - $ref: '#/boolean' + NCI C-Code: C164620 + Preferred Term: Biospecimen Retention Indicator + Definition: An indication as to whether biospecimens were retained. + Cardinality: '1' + Relationship Type: Value + Model Name: isRetained + Model Representation: Attribute + includesDNA: + Type: + - $ref: '#/boolean' + NCI C-Code: C127777 + Preferred Term: Biospecimen Retention Includes DNA Indicator + Definition: An indication as to whether retained biospecimens contain DNA. + Cardinality: 0..1 + Relationship Type: Value + Model Name: includesDNA + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +Characteristic: + NCI C-Code: C25447 + Preferred Term: Characteristic + Definition: The distinguishing qualities or prominent aspects of an entity. + Modifier: Concrete + Super Classes: + - $ref: '#/SyntaxTemplate' + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + name: + Type: + - $ref: '#/string' + NCI C-Code: C207477 + Preferred Term: Characteristic Name + Definition: The literal identifier (i.e., distinctive designation) of the characteristic. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + label: + Type: + - $ref: '#/string' + NCI C-Code: C207476 + Preferred Term: Characteristic Label + Definition: The short descriptive designation for the characteristic. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + description: + Type: + - $ref: '#/string' + NCI C-Code: C207475 + Preferred Term: Characteristic Description + Definition: A narrative representation of the characteristic. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + text: + Type: + - $ref: '#/string' + NCI C-Code: C207478 + Preferred Term: Characteristic Text + Definition: An instance of structured text that represents the characteristic. + Cardinality: '1' + Relationship Type: Value + Model Name: text + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215548 + Preferred Term: Characteristic Notes + Definition: A brief written record relevant to the characteristic. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + dictionaryId: + Type: + - $ref: '#/SyntaxTemplateDictionary' + Definition: A USDM relationship between the Characteristic and SyntaxTemplateDictionary + classes which provides the set of dictionary entries related to characteristics. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: dictionary + Model Representation: Relationship + Inherited From: + - $ref: '#/SyntaxTemplate' + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +Code: + NCI C-Code: C25162 + Preferred Term: Code + Definition: A symbol or combination of symbols which is assigned to the members + of a collection. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + code: + Type: + - $ref: '#/string' + NCI C-Code: C188858 + Preferred Term: Code Value + Definition: The literal value of a code. + Cardinality: '1' + Relationship Type: Value + Model Name: code + Model Representation: Attribute + codeSystem: + Type: + - $ref: '#/string' + NCI C-Code: C188859 + Preferred Term: Code System Name + Definition: The literal identifier (i.e., distinctive designation) of the system + used to assign and/or manage codes. + Cardinality: '1' + Relationship Type: Value + Model Name: codeSystem + Model Representation: Attribute + codeSystemVersion: + Type: + - $ref: '#/string' + NCI C-Code: C188868 + Preferred Term: Code System Version + Definition: The version of the code system. + Cardinality: '1' + Relationship Type: Value + Model Name: codeSystemVersion + Model Representation: Attribute + decode: + Type: + - $ref: '#/string' + NCI C-Code: C188861 + Preferred Term: Decode + Definition: Standardized or dictionary-derived human readable text associated + with a code. + Cardinality: '1' + Relationship Type: Value + Model Name: decode + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +CommentAnnotation: + NCI C-Code: C44272 + Preferred Term: Comment Annotation + Definition: An explanatory or critical comment, or other in-context information + (e.g., pattern, motif, link), that has been associated with data or other types + of information. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + text: + Type: + - $ref: '#/string' + NCI C-Code: C215555 + Preferred Term: Comment Annotation Text + Definition: An instance of unstructured text that represents the comment annotation. + Cardinality: '1' + Relationship Type: Value + Model Name: text + Model Representation: Attribute + codes: + Type: + - $ref: '#/Code' + NCI C-Code: C215556 + Preferred Term: Comment Annotation Code + Definition: A symbol or combination of symbols which is assigned to the comment + annotation. + Cardinality: 0..* + Relationship Type: Value + Model Name: codes + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +Condition: + NCI C-Code: C25457 + Preferred Term: Condition + Definition: A state of being. + Modifier: Concrete + Super Classes: + - $ref: '#/SyntaxTemplate' + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + name: + Type: + - $ref: '#/string' + NCI C-Code: C207483 + Preferred Term: Condition Name + Definition: The literal identifier (i.e., distinctive designation) of the condition. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + label: + Type: + - $ref: '#/string' + NCI C-Code: C207482 + Preferred Term: Condition Label + Definition: The short descriptive designation for the condition. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + description: + Type: + - $ref: '#/string' + NCI C-Code: C207481 + Preferred Term: Condition Description + Definition: A narrative representation of the condition. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + text: + Type: + - $ref: '#/string' + NCI C-Code: C207484 + Preferred Term: Condition Text + Definition: An instance of structured text that represents the condition. + Cardinality: '1' + Relationship Type: Value + Model Name: text + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215552 + Preferred Term: Condition Notes + Definition: A brief written record relevant to the condition. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + dictionaryId: + Type: + - $ref: '#/SyntaxTemplateDictionary' + Definition: A USDM relationship between the Condition and SyntaxTemplateDictionary + classes which provides the set of dictionary entries related to conditions. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: dictionary + Model Representation: Relationship + Inherited From: + - $ref: '#/SyntaxTemplate' + contextIds: + Type: + - $ref: '#/Activity' + - $ref: '#/ScheduledActivityInstance' + Definition: A USDM relationship between the Condition and the ScheduledActivityInstance + or Activity classes which identifies the scheduled activity instance or activity + to which the condition belongs. + Cardinality: 0..* + Relationship Type: Ref + Model Name: context + Model Representation: Relationship + appliesToIds: + Type: + - $ref: '#/BiomedicalConceptCategory' + - $ref: '#/Procedure' + - $ref: '#/Activity' + - $ref: '#/BiomedicalConcept' + - $ref: '#/BiomedicalConceptSurrogate' + Definition: A USDM relationship between the Condition and the Activity, Procedure, + BiomedicalConcept, BiomedicalConceptSurrogate, or BiomedicalConceptCategory + classes which identifies the procedure, activity, biomedical concept, biomedical + concept surrogate, or biomedical concept category that applies to the condition. + Cardinality: 0..* + Relationship Type: Ref + Model Name: appliesTo + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +ConditionAssignment: + NCI C-Code: C201335 + Preferred Term: Condition Assignment + Definition: An allotting or appointment to a condition or set of conditions that + are to be met in order to make a logical decision. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + condition: + Type: + - $ref: '#/string' + NCI C-Code: C47953 + Preferred Term: Logical Condition + Definition: An assumption on which rests the validity or effect of something + else. + Cardinality: '1' + Relationship Type: Value + Model Name: condition + Model Representation: Attribute + conditionTargetId: + Type: + - $ref: '#/ScheduledInstance' + Definition: A USDM relationship between the ConditionAssignment and ScheduledInstance + classes which identifies the scheduled instance associated with the condition + assignment. + Cardinality: '1' + Relationship Type: Ref + Model Name: conditionTarget + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +DocumentContentReference: + NCI C-Code: C215499 + Preferred Term: Document Content Reference + Definition: A citation pointing to the location of specific content within a document. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + sectionNumber: + Type: + - $ref: '#/string' + NCI C-Code: C215609 + Preferred Term: Document Content Reference Section Number + Definition: The numeric identifier of a particular section for the document + content reference. + Cardinality: '1' + Relationship Type: Value + Model Name: sectionNumber + Model Representation: Attribute + sectionTitle: + Type: + - $ref: '#/string' + NCI C-Code: C215610 + Preferred Term: Document Content Reference Section Title + Definition: An identifying designation for a particular section for the document + content reference. + Cardinality: '1' + Relationship Type: Value + Model Name: sectionTitle + Model Representation: Attribute + appliesToId: + Type: + - $ref: '#/StudyDefinitionDocument' + Definition: A USDM relationship between the DocumentContentReference and StudyDefinitionDocument + classes which identifies the study definition document to which the document + content reference applies. + Cardinality: '1' + Relationship Type: Ref + Model Name: appliesTo + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +Duration: + NCI C-Code: C25330 + Preferred Term: Duration + Definition: The length of time during which something continues. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + text: + Type: + - $ref: '#/string' + NCI C-Code: C217008 + Preferred Term: Duration Text + Definition: An instance of unstructured text that represents the event duration. + Cardinality: 0..1 + Relationship Type: Value + Model Name: text + Model Representation: Attribute + quantity: + Type: + - $ref: '#/QuantityRange' + NCI C-Code: C217011 + Preferred Term: Duration Quantity Value + Definition: The value representing the amount of time over which the event occurs. + Cardinality: 0..1 + Relationship Type: Value + Model Name: quantity + Model Representation: Attribute + durationWillVary: + Type: + - $ref: '#/boolean' + NCI C-Code: C217009 + Preferred Term: Duration Will Vary Indicator + Definition: An indication as to whether the event duration is planned to vary + within and/or across subjects. + Cardinality: '1' + Relationship Type: Value + Model Name: durationWillVary + Model Representation: Attribute + reasonDurationWillVary: + Type: + - $ref: '#/string' + NCI C-Code: C217010 + Preferred Term: Reason Duration Will Vary + Definition: The explanation for why the event duration will vary within and/or + across subjects. + Cardinality: 0..1 + Relationship Type: Value + Model Name: reasonDurationWillVary + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +EligibilityCriterion: + NCI C-Code: C16112 + Preferred Term: Study Eligibility Criterion + Definition: Characteristics which are necessary to allow a subject to participate + in a clinical study, as outlined in the study protocol. The concept covers inclusion + and exclusion criteria. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C207488 + Preferred Term: Study Eligibility Criterion Name + Definition: The literal identifier (i.e., distinctive designation) of the study + eligibility criterion. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C207487 + Preferred Term: Study Eligibility Criterion Label + Definition: The short descriptive designation for the study eligibility criterion. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C207486 + Preferred Term: Study Eligibility Criterion Description + Definition: A narrative representation of the study eligibility criterion. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + identifier: + Type: + - $ref: '#/string' + NCI C-Code: C207489 + Preferred Term: Study Eligibility Criterion Identifier + Definition: A sequence of characters used to identify, name, or characterize + the inclusion or exclusion criterion. + Cardinality: '1' + Relationship Type: Value + Model Name: identifier + Model Representation: Attribute + category: + Type: + - $ref: '#/Code' + NCI C-Code: C83016 + Preferred Term: Study Eligibility Criterion Category + Definition: A classification of the inclusion exclusion criterion. + Cardinality: '1' + Relationship Type: Value + Model Name: category + Model Representation: Attribute + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215537 + Preferred Term: Eligibility Criterion Notes + Definition: A brief written record relevant to the eligibility criterion. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + criterionItemId: + Type: + - $ref: '#/EligibilityCriterionItem' + Definition: A USDM relationship between the EligibilityCriterion and EligibilityCriterionItem + classes which identifies the item belonging to the eligibility criterion. + Cardinality: '1' + Relationship Type: Ref + Model Name: criterionItem + Model Representation: Relationship + nextId: + Type: + - $ref: '#/EligibilityCriterion' + Definition: A USDM relationship within the EligibilityCriterion class which + identifies the eligibility criterion that follows the current eligibility + criterion in the display order. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: next + Model Representation: Relationship + previousId: + Type: + - $ref: '#/EligibilityCriterion' + Definition: A USDM relationship within the EligibilityCriterion class which + identifies the eligibility criterion that precedes the current eligibility + criterion in the display order. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: previous + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +EligibilityCriterionItem: + NCI C-Code: C215506 + Preferred Term: Eligibility Criterion Item + Definition: An individual item within the container that holds an instance of an + eligibility criterion. + Modifier: Concrete + Super Classes: + - $ref: '#/SyntaxTemplate' + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + name: + Type: + - $ref: '#/string' + NCI C-Code: C215647 + Preferred Term: Eligibility Criterion Item Name + Definition: The literal identifier (i.e., distinctive designation) of the eligibility + criterion item. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + label: + Type: + - $ref: '#/string' + NCI C-Code: C215650 + Preferred Term: Eligibility Criterion Item Label + Definition: The short descriptive designation for the eligibility criterion + item. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + description: + Type: + - $ref: '#/string' + NCI C-Code: C215649 + Preferred Term: Eligibility Criterion Item Description + Definition: A narrative representation of the eligibility criterion item. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + text: + Type: + - $ref: '#/string' + NCI C-Code: C215648 + Preferred Term: Eligibility Criterion Item Text + Definition: An instance of structured text that represents the eligibility criterion + item. + Cardinality: '1' + Relationship Type: Value + Model Name: text + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215651 + Preferred Term: Eligibility Criterion Item Notes + Definition: A brief written record relevant to the eligibility criterion item. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + dictionaryId: + Type: + - $ref: '#/SyntaxTemplateDictionary' + Definition: 'A USDM relationship between the EligibilityCriterionItem and SyntaxTemplateDictionary + classes which provides the dictionary entry associated with a eligibility + criterion item. ' + Cardinality: 0..1 + Relationship Type: Ref + Model Name: dictionary + Model Representation: Relationship + Inherited From: + - $ref: '#/SyntaxTemplate' + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +Encounter: + NCI C-Code: C215488 + Preferred Term: Study Encounter + Definition: Any physical or virtual contact between two or more parties involved + in a study, at which an assessment or activity takes place. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C171010 + Preferred Term: Study Encounter Name + Definition: The literal identifier (i.e., distinctive designation) for a protocol-defined + study encounter. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C207490 + Preferred Term: Study Encounter Label + Definition: The short descriptive designation for the study encounter. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C188836 + Preferred Term: Study Encounter Description + Definition: A narrative representation of the protocol-defined study encounter. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + type: + Type: + - $ref: '#/Code' + NCI C-Code: C188839 + Preferred Term: Study Encounter Type + Definition: A characterization or classification of the study encounter. + Cardinality: '1' + Relationship Type: Value + Model Name: type + Model Representation: Attribute + environmentalSettings: + Type: + - $ref: '#/Code' + NCI C-Code: C188840 + Preferred Term: Environmental Setting + Definition: The environment/setting where the event, intervention, or finding + occurred. + Cardinality: 0..* + Relationship Type: Value + Model Name: environmentalSettings + Model Representation: Attribute + contactModes: + Type: + - $ref: '#/Code' + NCI C-Code: C188841 + Preferred Term: Contact Mode + Definition: The means by which an interaction occurs between the subject/participant + and person or entity (e.g., a device). + Cardinality: 0..* + Relationship Type: Value + Model Name: contactModes + Model Representation: Attribute + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215518 + Preferred Term: Encounter Notes + Definition: A brief written record relevant to the study encounter. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + transitionEndRule: + Type: + - $ref: '#/TransitionRule' + Definition: A USDM relationship between the Encounter and TransitionRule classes + which provides the details associated with a transition rule used to trigger + the end of an encounter. + Cardinality: 0..1 + Relationship Type: Value + Model Name: transitionEndRule + Model Representation: Relationship + nextId: + Type: + - $ref: '#/Encounter' + Definition: A USDM relationship within the Encounter class which identifies + the encounter that chronologically follows the current encounter. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: next + Model Representation: Relationship + transitionStartRule: + Type: + - $ref: '#/TransitionRule' + Definition: A USDM relationship between the Encounter and TransitionRule classes + which provides the details associated with a transition rule used to trigger + the start of an encounter. + Cardinality: 0..1 + Relationship Type: Value + Model Name: transitionStartRule + Model Representation: Relationship + scheduledAtId: + Type: + - $ref: '#/Timing' + Definition: A USDM relationship between the Encounter and Timing classes which + provides information related to the scheduled timing of an encounter. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: scheduledAt + Model Representation: Relationship + previousId: + Type: + - $ref: '#/Encounter' + Definition: A USDM relationship within the Encounter class which identifies + the encounter that chronologically precedes the current encounter. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: previous + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +Endpoint: + NCI C-Code: C25212 + Preferred Term: Study Endpoint + Definition: 'A defined variable intended to reflect an outcome of interest that + is statistically analyzed to address a particular research question. NOTE: A precise + definition of an endpoint typically specifies the type of assessments made, the + timing of those assessments, the assessment tools used, and possibly other details, + as applicable, such as how multiple assessments within an individual are to be + combined. [After BEST Resource] (CDISC Glossary)' + Modifier: Concrete + Super Classes: + - $ref: '#/SyntaxTemplate' + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + name: + Type: + - $ref: '#/string' + NCI C-Code: C207492 + Preferred Term: Study Endpoint Name + Definition: The literal identifier (i.e., distinctive designation) of the study + endpoint. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + label: + Type: + - $ref: '#/string' + NCI C-Code: C207491 + Preferred Term: Study Endpoint Label + Definition: The short descriptive designation for the study endpoint. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + description: + Type: + - $ref: '#/string' + NCI C-Code: C188824 + Preferred Term: Study Endpoint Description + Definition: A narrative representation of the study endpoint. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + text: + Type: + - $ref: '#/string' + NCI C-Code: C207493 + Preferred Term: Study Endpoint Text + Definition: An instance of structured text that represents the study endpoint. + Cardinality: '1' + Relationship Type: Value + Model Name: text + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215514 + Preferred Term: Endpoint Notes + Definition: A brief written record relevant to the study endpoint. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + dictionaryId: + Type: + - $ref: '#/SyntaxTemplateDictionary' + Definition: A USDM relationship between the Endpoint and SyntaxTemplateDictionary + classes which provides the set of dictionary entries related to study endpoints. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: dictionary + Model Representation: Relationship + Inherited From: + - $ref: '#/SyntaxTemplate' + level: + Type: + - $ref: '#/Code' + NCI C-Code: C188826 + Preferred Term: Study Endpoint Level + Definition: A characterization or classification of the study endpoint that + determines its category of importance relative to other study endpoints. + Cardinality: '1' + Relationship Type: Value + Model Name: level + Model Representation: Attribute + purpose: + Type: + - $ref: '#/string' + NCI C-Code: C188825 + Preferred Term: Study Endpoint Purpose Description + Definition: The textual representation of the study endpoint purpose. + Cardinality: '1' + Relationship Type: Value + Model Name: purpose + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +Estimand: + NCI C-Code: C188813 + Preferred Term: Estimand + Definition: A precise description of the treatment effect reflecting the clinical + question posed by a given clinical trial objective. It summarises at a population + level what the outcomes would be in the same patients under different treatment + conditions being compared. (ICH E9 R1 Addendum) + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + populationSummary: + Type: + - $ref: '#/string' + NCI C-Code: C188853 + Preferred Term: Population-Level Summary + Definition: A synopsis of the clinical endpoint of interest within the analysis + target study population. + Cardinality: '1' + Relationship Type: Value + Model Name: populationSummary + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C215522 + Preferred Term: Estimand Name + Definition: The literal identifier (i.e., distinctive designation) of the estimand. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C215524 + Preferred Term: Estimand Label + Definition: The short descriptive designation for the estimand. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C215523 + Preferred Term: Estimand Description + Definition: A narrative representation of the estimand. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215521 + Preferred Term: Estimand Notes + Definition: A brief written record relevant to the study estimand. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + analysisPopulationId: + Type: + - $ref: '#/AnalysisPopulation' + Definition: A USDM relationship between the Estimand and AnalysisPopulation + classes which provides the details associated with an instance of the analysis + population used to partially define a study estimand. + Cardinality: '1' + Relationship Type: Ref + Model Name: analysisPopulation + Model Representation: Relationship + variableOfInterestId: + Type: + - $ref: '#/Endpoint' + Definition: A USDM relationship between the Estimand and Endpoint classes which + provides the details associated with an instance of the variable of interest + within a study endpoint used to partially define a study estimand. + Cardinality: '1' + Relationship Type: Ref + Model Name: variableOfInterest + Model Representation: Relationship + intercurrentEvents: + Type: + - $ref: '#/IntercurrentEvent' + Definition: A USDM relationship between the Estimand and IntercurrentEvent classes + which identifies the set of intercurrent events associated with a study estimand. + Cardinality: 1..* + Relationship Type: Value + Model Name: intercurrentEvents + Model Representation: Relationship + interventionIds: + Type: + - $ref: '#/StudyIntervention' + Definition: A USDM relationship between the Estimand and StudyIntervention classes + which identifies the set of study interventions associated with the Estimand. + Cardinality: 1..* + Relationship Type: Ref + Model Name: interventions + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +ExtensionAttribute: + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + url: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + valueString: + Type: + - $ref: '#/string' + Cardinality: 0..1 + Relationship Type: Value + valueBoolean: + Type: + - $ref: '#/boolean' + Cardinality: 0..1 + Relationship Type: Value + valueInteger: + Type: + - $ref: '#/integer' + Cardinality: 0..1 + Relationship Type: Value + valueId: + Type: + - $ref: '#/string' + Cardinality: 0..1 + Relationship Type: Value + valueQuantity: + Type: + - $ref: '#/Quantity' + Cardinality: 0..1 + Relationship Type: Value + valueRange: + Type: + - $ref: '#/Range' + Cardinality: 0..1 + Relationship Type: Value + valueCode: + Type: + - $ref: '#/Code' + Cardinality: 0..1 + Relationship Type: Value + valueAliasCode: + Type: + - $ref: '#/AliasCode' + Cardinality: 0..1 + Relationship Type: Value + valueExtensionClass: + Type: + - $ref: '#/ExtensionClass' + Cardinality: 0..1 + Relationship Type: Value + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +ExtensionClass: + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + url: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 1..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +GeographicScope: + NCI C-Code: C207591 + Preferred Term: Geographic Scope + Definition: The extent or range related to the physical location of an entity. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + type: + Type: + - $ref: '#/Code' + NCI C-Code: C207495 + Preferred Term: Geographic Scope Type + Definition: A characterization or classification of the geographic scope. + Cardinality: '1' + Relationship Type: Value + Model Name: type + Model Representation: Attribute + code: + Type: + - $ref: '#/AliasCode' + NCI C-Code: C207494 + Preferred Term: Geographic Scope Code + Definition: A symbol or combination of symbols which is assigned to the geographic + scope. + Cardinality: 0..1 + Relationship Type: Value + Model Name: code + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +GovernanceDate: + NCI C-Code: C207595 + Preferred Term: Study Governance Date + Definition: Any of the dates associated with event milestones within a clinical + study's oversight and management framework. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C207499 + Preferred Term: Study Governance Date Name + Definition: The literal identifier (i.e., distinctive designation) of the study + governance date + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C207498 + Preferred Term: Study Governance Date Label + Definition: The short descriptive designation for the study governance date. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C207497 + Preferred Term: Study Governance Date Description + Definition: A narrative representation of the study governance date. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + type: + Type: + - $ref: '#/Code' + NCI C-Code: C207496 + Preferred Term: Study Governance Date Type + Definition: A characterization or classification of the study governance date. + Cardinality: '1' + Relationship Type: Value + Model Name: type + Model Representation: Attribute + dateValue: + Type: + - $ref: '#/date' + NCI C-Code: C207500 + Preferred Term: Study Governance Date Value + Definition: The information contained in the date field. + Cardinality: '1' + Relationship Type: Value + Model Name: dateValue + Model Representation: Attribute + geographicScopes: + Type: + - $ref: '#/GeographicScope' + Definition: A USDM relationship between the GovernanceDate and GeographicScope + classes which identifies the set of geographic scopes associated with the + governance date. + Cardinality: 1..* + Relationship Type: Value + Model Name: geographicScopes + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +Identifier: + NCI C-Code: C25364 + Preferred Term: Identifier + Definition: One or more characters used to identify, name, or characterize the nature, + properties, or contents of a thing. + Modifier: Abstract + Sub Classes: + - $ref: '#/AdministrableProductIdentifier' + - $ref: '#/MedicalDeviceIdentifier' + - $ref: '#/ReferenceIdentifier' + - $ref: '#/StudyIdentifier' + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + text: + Type: + - $ref: '#/string' + NCI C-Code: C215581 + Preferred Term: Administrable Product Identifier Text + Definition: An instance of structured text that represents the administrable + product. + Cardinality: '1' + Relationship Type: Value + Model Name: text + Model Representation: Attribute + scopeId: + Type: + - $ref: '#/Organization' + Definition: A USDM relationship between the AdministrableProductIdentifier and + Organization class which provides the details associated with which provides + the details associated with each organization that has assigned the administrable + product identifier. + Cardinality: '1' + Relationship Type: Ref + Model Name: scope + Model Representation: Relationship +Indication: + NCI C-Code: C41184 + Preferred Term: Disease/Condition Indication + Definition: The disease or condition the intervention will diagnose, treat, prevent, + cure, or mitigate. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C207503 + Preferred Term: Disease/Condition Indication Name + Definition: The literal identifier (i.e., distinctive designation) of the disease/condition + indication. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C207502 + Preferred Term: Disease/Condition Indication Label + Definition: The short descriptive designation for the disease/condition indication. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C112038 + Preferred Term: Disease/Condition Indication Description + Definition: A narrative representation of the condition, disease or disorder + that the clinical trial is intended to investigate or address. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + isRareDisease: + Type: + - $ref: '#/boolean' + NCI C-Code: C207501 + Preferred Term: Disease/Condition Indication Is Rare Disease Indicator + Definition: An indication as to whether the disease/condition indication under + study is considered a rare disease. + Cardinality: '1' + Relationship Type: Value + Model Name: isRareDisease + Model Representation: Attribute + codes: + Type: + - $ref: '#/Code' + NCI C-Code: C188822 + Preferred Term: Disease/Condition Indication Code + Definition: A short sequence of characters that represents the disease/condition + indication. + Cardinality: 0..* + Relationship Type: Value + Model Name: codes + Model Representation: Attribute + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215509 + Preferred Term: Indication Notes + Definition: A brief written record relevant to the disease/condition indication. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +Ingredient: + NCI C-Code: C51981 + Preferred Term: Ingredient + Definition: Any component that constitutes a part of a compounded substance or mixture. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + role: + Type: + - $ref: '#/Code' + NCI C-Code: C215595 + Preferred Term: Ingredient Role + Definition: The intended use of the ingredient within the context of the compounded + substance or mixture. + Cardinality: '1' + Relationship Type: Value + Model Name: role + Model Representation: Attribute + substance: + Type: + - $ref: '#/Substance' + Definition: A USDM relationship between the Ingredient and Substance classes + that identifies the substance associated with the ingredient. + Cardinality: '1' + Relationship Type: Value + Model Name: substance + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +IntercurrentEvent: + NCI C-Code: C188815 + Preferred Term: Intercurrent Event + Definition: An event(s) occurring after treatment initiation that affects either + the interpretation or the existence of the measurements associated with the clinical + question of interest. (ICH E9 Addendum on Estimands) + Modifier: Concrete + Super Classes: + - $ref: '#/SyntaxTemplate' + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + name: + Type: + - $ref: '#/string' + NCI C-Code: C188855 + Preferred Term: Intercurrent Event Name + Definition: The literal identifier (i.e., distinctive designation) of the intercurrent + event. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + label: + Type: + - $ref: '#/string' + NCI C-Code: C207504 + Preferred Term: Intercurrent Event Label + Definition: The short descriptive designation for the intercurrent event. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + description: + Type: + - $ref: '#/string' + NCI C-Code: C188856 + Preferred Term: Intercurrent Event Description + Definition: A narrative representation of the intercurrent event. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + text: + Type: + - $ref: '#/string' + NCI C-Code: C215526 + Preferred Term: Intercurrent Event Text + Definition: An instance of structured text that represents the intercurrent + event. + Cardinality: '1' + Relationship Type: Value + Model Name: text + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215527 + Preferred Term: Intercurrent Event Notes + Definition: A brief written record relevant to the intercurrent event. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + dictionaryId: + Type: + - $ref: '#/SyntaxTemplateDictionary' + Definition: 'A USDM relationship between the IntercurrentEvent and SyntaxTemplateDictionary + classes which provides the set of dictionary entries related to the intercurrent + event. ' + Cardinality: 0..1 + Relationship Type: Ref + Model Name: dictionary + Model Representation: Relationship + Inherited From: + - $ref: '#/SyntaxTemplate' + strategy: + Type: + - $ref: '#/string' + NCI C-Code: C188857 + Preferred Term: Intercurrent Event Strategy + Definition: A textual description of the planned strategy to manage and/or mitigate + intercurrent events. + Cardinality: '1' + Relationship Type: Value + Model Name: strategy + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +InterventionalStudyDesign: + NCI C-Code: C215503 + Preferred Term: Interventional Study Design + Definition: The strategy that specifies the structure of an interventional trial + in terms of the planned activities (including timing) and statistical analysis + approach intended to meet the objectives of the study. + Modifier: Concrete + Super Classes: + - $ref: '#/StudyDesign' + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + Inherited From: + - $ref: '#/StudyDesign' + name: + Type: + - $ref: '#/string' + NCI C-Code: C215626 + Preferred Term: Interventional Study Design Name + Definition: The literal identifier (i.e., distinctive designation) of the interventional + study design. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + Inherited From: + - $ref: '#/StudyDesign' + label: + Type: + - $ref: '#/string' + NCI C-Code: C215628 + Preferred Term: Interventional Study Design Label + Definition: The short descriptive designation for the interventional study design. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + Inherited From: + - $ref: '#/StudyDesign' + description: + Type: + - $ref: '#/string' + NCI C-Code: C215627 + Preferred Term: Interventional Study Design Description + Definition: A narrative representation of the interventional study design. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + Inherited From: + - $ref: '#/StudyDesign' + rationale: + Type: + - $ref: '#/string' + NCI C-Code: C215629 + Preferred Term: Interventional Study Design Rationale + Definition: Reason(s) for choosing the interventional study design. This may + include reasons for the choice of control or comparator, as well as the scientific + rationale for the study design. + Cardinality: '1' + Relationship Type: Value + Model Name: rationale + Model Representation: Attribute + Inherited From: + - $ref: '#/StudyDesign' + therapeuticAreas: + Type: + - $ref: '#/Code' + NCI C-Code: C215633 + Preferred Term: Interventional Study Design Therapeutic Areas + Definition: A categorization of a disease, disorder, or other condition based + on common characteristics and often associated with a medical specialty focusing + on research and development of specific therapeutic interventions for the + purpose of treatment and prevention, which is associated with the interventional + study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: therapeuticAreas + Model Representation: Attribute + Inherited From: + - $ref: '#/StudyDesign' + studyType: + Type: + - $ref: '#/Code' + NCI C-Code: C215631 + Preferred Term: Interventional Study Design Study Type + Definition: The study type associated with the interventional study design. + Cardinality: 0..1 + Relationship Type: Value + Model Name: studyType + Model Representation: Attribute + Inherited From: + - $ref: '#/StudyDesign' + characteristics: + Type: + - $ref: '#/Code' + NCI C-Code: C215632 + Preferred Term: Interventional Study Design Characteristics + Definition: The distinguishing qualities or prominent aspects of an interventional + study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: characteristics + Model Representation: Attribute + Inherited From: + - $ref: '#/StudyDesign' + studyPhase: + Type: + - $ref: '#/AliasCode' + NCI C-Code: C215630 + Preferred Term: Interventional Study Design Study Phase + Definition: The study phase associated with the interventional study design. + Cardinality: 0..1 + Relationship Type: Value + Model Name: studyPhase + Model Representation: Attribute + Inherited From: + - $ref: '#/StudyDesign' + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215634 + Preferred Term: Interventional Study Design Notes + Definition: A brief written record relevant to the interventional study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + Inherited From: + - $ref: '#/StudyDesign' + activities: + Type: + - $ref: '#/Activity' + Definition: A USDM relationship between the InterventionalStudyDesign and Activity + classes which identifies the set of activities associated with the interventional + study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: activities + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + biospecimenRetentions: + Type: + - $ref: '#/BiospecimenRetention' + Definition: A USDM relationship between the InterventionalStudyDesign and BiospecimenRetention + classes which identifies the status of biospecimen retentions related to the + interventional study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: biospecimenRetentions + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + eligibilityCriteria: + Type: + - $ref: '#/EligibilityCriterion' + Definition: A USDM relationship between the InterventionalStudyDesign and EligibilityCriterion + classes which identifies the set of eligibility criterion associated with + the interventional study design. + Cardinality: 1..* + Relationship Type: Value + Model Name: eligibilityCriteria + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + encounters: + Type: + - $ref: '#/Encounter' + Definition: A USDM relationship between the InterventionalStudyDesign and Encounter + classes which identifies the set of encounters associated with the interventional + study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: encounters + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + estimands: + Type: + - $ref: '#/Estimand' + Definition: A USDM relationship between the InterventionalStudyDesign and Estimand + classes which identifies the set of estimands associated with the interventional + study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: estimands + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + indications: + Type: + - $ref: '#/Indication' + Definition: A USDM relationship between the InterventionalStudyDesign and Indication + classes which identifies the set of indications associated with the interventional + study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: indications + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + objectives: + Type: + - $ref: '#/Objective' + Definition: A USDM relationship between the InterventionalStudyDesign and Objective + classes which identifies the set of objectives associated with the interventional + study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: objectives + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + scheduleTimelines: + Type: + - $ref: '#/ScheduleTimeline' + Definition: A USDM relationship between the InterventionalStudyDesign and ScheduleTimeline + classes which identifies the set of scheduled timelines associated with the + interventional study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: scheduleTimelines + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + arms: + Type: + - $ref: '#/StudyArm' + Definition: A USDM relationship between the InterventionalStudyDesign and StudyArm + classes which identifies the set of study arms associated with the interventional + study design. + Cardinality: 1..* + Relationship Type: Value + Model Name: arms + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + studyCells: + Type: + - $ref: '#/StudyCell' + Definition: 'A USDM relationship between the InterventionalStudyDesign and StudyCell + classes which identifies the set of study cells associated with the interventional + study design. ' + Cardinality: 1..* + Relationship Type: Value + Model Name: studyCells + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + documentVersionIds: + Type: + - $ref: '#/StudyDefinitionDocumentVersion' + Definition: A USDM relationship between the InterventionalStudyDesign and StudyDefinitionDocumentVersion + classes which identifies the version of the study definition documents associated + with the interventional study design. + Cardinality: 0..* + Relationship Type: Ref + Model Name: documentVersions + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + elements: + Type: + - $ref: '#/StudyElement' + Definition: A USDM relationship between the InterventionalStudyDesign and StudyElement + classes which identifies the set of study elements associated with the interventional + study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: elements + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + studyInterventionIds: + Type: + - $ref: '#/StudyIntervention' + Definition: A USDM relationship between the InterventionalStudyDesign and StudyIntervention + classes which identifies the set of study interventions associated with interventional + study design. + Cardinality: 0..* + Relationship Type: Ref + Model Name: studyInterventions + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + epochs: + Type: + - $ref: '#/StudyEpoch' + Definition: A USDM relationship between the InterventionalStudyDesign and StudyEpoch + classes which identifies the set of study epochs associated with the interventional + study design. + Cardinality: 1..* + Relationship Type: Value + Model Name: epochs + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + population: + Type: + - $ref: '#/StudyDesignPopulation' + Definition: A USDM relationship between the InterventionalStudyDesign and StudyDesignPopulation + classes which identifies the population associated with the interventional + study design. + Cardinality: '1' + Relationship Type: Value + Model Name: population + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + model: + Type: + - $ref: '#/Code' + NCI C-Code: C98746 + Preferred Term: Intervention Model Type + Definition: The general design of the strategy for assigning interventions to + subjects in a clinical study. (clinicaltrials.gov) + Cardinality: '1' + Relationship Type: Value + Model Name: model + Model Representation: Attribute + subTypes: + Type: + - $ref: '#/Code' + NCI C-Code: C49660 + Preferred Term: Trial Type + Definition: The nature of the interventional study for which information is + being collected. + Cardinality: 0..* + Relationship Type: Value + Model Name: subTypes + Model Representation: Attribute + blindingSchema: + Type: + - $ref: '#/AliasCode' + NCI C-Code: C49658 + Preferred Term: Trial Blinding Schema + Definition: The type of experimental design used to describe the level of awareness + of the study subjects and/ or study personnel as it relates to the respective + intervention(s) or assessments being observed, received or administered. + Cardinality: 0..1 + Relationship Type: Value + Model Name: blindingSchema + Model Representation: Attribute + intentTypes: + Type: + - $ref: '#/Code' + NCI C-Code: C49652 + Preferred Term: Trial Intent Type + Definition: The planned purpose of the therapy, device, or agent under study + in the clinical trial. + Cardinality: 0..* + Relationship Type: Value + Model Name: intentTypes + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + analysisPopulations: + Type: + - $ref: '#/AnalysisPopulation' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +Masking: + NCI C-Code: C191278 + Preferred Term: Masking + Definition: The mechanism used to obscure the distinctive characteristics of the + study intervention or procedure to make it indistinguishable from a comparator. + (CDISC Glossary) + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + text: + Type: + - $ref: '#/string' + NCI C-Code: C215553 + Preferred Term: Masking Text + Definition: An instance of unstructured text that represents how the masking + is performed and maintained. + Cardinality: '1' + Relationship Type: Value + Model Name: text + Model Representation: Attribute + isMasked: + Type: + - $ref: '#/boolean' + NCI C-Code: C215554 + Preferred Term: Masked Indicator + Definition: An indication as to whether the study role is masked. + Cardinality: '1' + Relationship Type: Value + Model Name: isMasked + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +MedicalDevice: + NCI C-Code: C16830 + Preferred Term: Medical Device + Definition: Any instrument, apparatus, implement, machine, appliance, implant, reagent + for in vitro use, software, material or other similar or related article, intended + by the manufacturer to be used, alone or in combination for, one or more specific + medical purpose(s). [After REGULATION (EU) 2017/745 OF THE EUROPEAN PARLIAMENT + AND OF THE COUNCIL of 5 April 2017 on medical devices] + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C215614 + Preferred Term: Medical Device Name + Definition: The literal identifier (i.e., distinctive designation) of the medical + device. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C215616 + Preferred Term: Medical Device Label + Definition: The short descriptive designation for the medical device. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C215615 + Preferred Term: Medical Device Description + Definition: A narrative representation of the medical device. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + hardwareVersion: + Type: + - $ref: '#/string' + NCI C-Code: C215617 + Preferred Term: Hardware Version + Definition: A form or variant of hardware; one of a sequence of copies of the + physical components from which a computer is constructed, each incorporating + new modifications. + Cardinality: 0..1 + Relationship Type: Value + Model Name: hardwareVersion + Model Representation: Attribute + softwareVersion: + Type: + - $ref: '#/string' + NCI C-Code: C111093 + Preferred Term: Software Version + Definition: A form or variant of software; one of a sequence of copies of a + software program, each incorporating new modifications. (NCI) + Cardinality: 0..1 + Relationship Type: Value + Model Name: softwareVersion + Model Representation: Attribute + sourcing: + Type: + - $ref: '#/Code' + NCI C-Code: C215619 + Preferred Term: Medical Device Sourcing + Definition: An indication as to whether the medical device is obtained from + a local or central source. + Cardinality: 0..1 + Relationship Type: Value + Model Name: sourcing + Model Representation: Attribute + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215618 + Preferred Term: Medical Device Notes + Definition: A brief written record relevant to the medical device. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + embeddedProductId: + Type: + - $ref: '#/AdministrableProduct' + Definition: A USDM relationship between the MedicalDevice and AdministrableProduct + classes which identifies the administrable product that is an integral component + of the medical device. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: embeddedProduct + Model Representation: Relationship + identifiers: + Type: + - $ref: '#/MedicalDeviceIdentifier' + Definition: A USDM relationship between the MedicalDevice and MedicalDeviceIdentifier + classes which provides the set of identifiers related to the medical device. + Cardinality: 0..* + Relationship Type: Value + Model Name: identifiers + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +MedicalDeviceIdentifier: + NCI C-Code: C215501 + Preferred Term: Medical Device Identifier + Definition: A sequence of characters used to identify, name, or characterize the + medical device. + Modifier: Concrete + Super Classes: + - $ref: '#/Identifier' + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + Inherited From: + - $ref: '#/Identifier' + text: + Type: + - $ref: '#/string' + NCI C-Code: C215620 + Preferred Term: Medical Device Identifier Text + Definition: An instance of structured text that represents the medical device + identifier. + Cardinality: '1' + Relationship Type: Value + Model Name: text + Model Representation: Attribute + Inherited From: + - $ref: '#/Identifier' + scopeId: + Type: + - $ref: '#/Organization' + Definition: A USDM relationship between the MedicalDeviceIdentifier and Organization + classes which provides the details associated with each organization that + has assigned the identifier. + Cardinality: '1' + Relationship Type: Ref + Model Name: scope + Model Representation: Relationship + Inherited From: + - $ref: '#/Identifier' + type: + Type: + - $ref: '#/Code' + NCI C-Code: C215621 + Preferred Term: Medical Device Identifier Type + Definition: A characterization or classification of the medical device identifier. + Cardinality: '1' + Relationship Type: Value + Model Name: type + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +NarrativeContent: + NCI C-Code: C207592 + Preferred Term: Narrative Content + Definition: The container that holds an instance of unstructured text and which + may include objects such as tables, figures, and images. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C207507 + Preferred Term: Narrative Content Name + Definition: The literal identifier (i.e., distinctive designation) of the narrative + content. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + sectionNumber: + Type: + - $ref: '#/string' + NCI C-Code: C207509 + Preferred Term: Narrative Content Section Number + Definition: The numeric identifier assigned to a particular document section + containing narrative content. + Cardinality: 0..1 + Relationship Type: Value + Model Name: sectionNumber + Model Representation: Attribute + sectionTitle: + Type: + - $ref: '#/string' + NCI C-Code: C207510 + Preferred Term: Narrative Content Section Title + Definition: An identifying designation for the document section containing narrative + content. + Cardinality: 0..1 + Relationship Type: Value + Model Name: sectionTitle + Model Representation: Attribute + displaySectionTitle: + Type: + - $ref: '#/boolean' + NCI C-Code: C215534 + Preferred Term: Narrative Content Section Title Display Indicator + Definition: An indication as to whether the section title is to be displayed + in the document containing narrative content. + Cardinality: '1' + Relationship Type: Value + Model Name: displaySectionTitle + Model Representation: Attribute + displaySectionNumber: + Type: + - $ref: '#/boolean' + NCI C-Code: C215535 + Preferred Term: Narrative Content Section Number Display Indicator + Definition: An indication as to whether the section number is to be displayed + in the document containing narrative content. + Cardinality: '1' + Relationship Type: Value + Model Name: displaySectionNumber + Model Representation: Attribute + contentItemId: + Type: + - $ref: '#/NarrativeContentItem' + Definition: A USDM relationship between the NarrativeContent and NarrativeContentItem + classes which identifies the content item associated with the narrative content. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: contentItem + Model Representation: Relationship + previousId: + Type: + - $ref: '#/NarrativeContent' + Definition: A USDM relationship within the NarrativeContent class which identifies + the narrative content that precedes the current narrative content in the display + order. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: previous + Model Representation: Relationship + nextId: + Type: + - $ref: '#/NarrativeContent' + Definition: A USDM relationship within the NarrativeContent class which identifies + the narrative content that follows the current narrative content in the display + order. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: next + Model Representation: Relationship + childIds: + Type: + - $ref: '#/NarrativeContent' + Definition: A USDM relationship within the NarrativeContent class which identifies + the set of child content associated with an instance of narrative content. + Cardinality: 0..* + Relationship Type: Ref + Model Name: children + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +NarrativeContentItem: + NCI C-Code: C215489 + Preferred Term: Narrative Content Item + Definition: An individual item within the container that holds an instance of unstructured + text and which may include objects such as tables, figures, and images. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C215557 + Preferred Term: Narrative Content Item Name + Definition: The literal identifier (i.e., distinctive designation) of the narrative + content item. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + text: + Type: + - $ref: '#/string' + NCI C-Code: C215558 + Preferred Term: Narrative Content Item Text + Definition: An instance of unstructured text that represents the narrative content + item. + Cardinality: '1' + Relationship Type: Value + Model Name: text + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +Objective: + NCI C-Code: C142450 + Preferred Term: Study Objective + Definition: The reason for performing a study in terms of the scientific questions + to be answered by the analysis of data collected during the study. + Modifier: Concrete + Super Classes: + - $ref: '#/SyntaxTemplate' + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + name: + Type: + - $ref: '#/string' + NCI C-Code: C207512 + Preferred Term: Study Objective Name + Definition: The literal identifier (i.e., distinctive designation) of the study + objective. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + label: + Type: + - $ref: '#/string' + NCI C-Code: C207511 + Preferred Term: Study Objective Label + Definition: The short descriptive designation for the study objective. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + description: + Type: + - $ref: '#/string' + NCI C-Code: C94090 + Preferred Term: Study Objective Description + Definition: A narrative representation of the study objective. (BRIDG) + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + text: + Type: + - $ref: '#/string' + NCI C-Code: C207513 + Preferred Term: Study Objective Text + Definition: An instance of structured text that represents the study objective. + Cardinality: '1' + Relationship Type: Value + Model Name: text + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215513 + Preferred Term: Objective Notes + Definition: A brief written record relevant to the study objective. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + Inherited From: + - $ref: '#/SyntaxTemplate' + dictionaryId: + Type: + - $ref: '#/SyntaxTemplateDictionary' + Definition: A USDM relationship between the Objective and SyntaxTemplateDictionary + classes which provides the set of dictionary entries related to study objectives. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: dictionary + Model Representation: Relationship + Inherited From: + - $ref: '#/SyntaxTemplate' + level: + Type: + - $ref: '#/Code' + NCI C-Code: C188823 + Preferred Term: Study Objective Level + Definition: A characterization or classification of the study objective that + determines its category of importance relative to other study objectives. + Cardinality: '1' + Relationship Type: Value + Model Name: level + Model Representation: Attribute + endpoints: + Type: + - $ref: '#/Endpoint' + Definition: A USDM relationship between the Objective and Endpoint classes which + identifies the set of endpoints associated with the study objective. + Cardinality: 0..* + Relationship Type: Value + Model Name: endpoints + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +ObservationalStudyDesign: + NCI C-Code: C215504 + Preferred Term: Observational Study Design + Definition: The strategy that specifies the structure of an observational study + in terms of the planned activities (including timing) and statistical analysis + approach intended to meet the objectives of the study. + Modifier: Concrete + Super Classes: + - $ref: '#/StudyDesign' + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + Inherited From: + - $ref: '#/StudyDesign' + name: + Type: + - $ref: '#/string' + NCI C-Code: C215636 + Preferred Term: Observational Study Design Name + Definition: The literal identifier (i.e., distinctive designation) of the observational + study design. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + Inherited From: + - $ref: '#/StudyDesign' + label: + Type: + - $ref: '#/string' + NCI C-Code: C215638 + Preferred Term: Observational Study Design Label + Definition: The short descriptive designation for the observational study design. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + Inherited From: + - $ref: '#/StudyDesign' + description: + Type: + - $ref: '#/string' + NCI C-Code: C215637 + Preferred Term: Observational Study Design Description + Definition: A narrative representation of the observational study design. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + Inherited From: + - $ref: '#/StudyDesign' + rationale: + Type: + - $ref: '#/string' + NCI C-Code: C215639 + Preferred Term: Observational Study Design Rationale + Definition: Reason(s) for choosing the observational study design. This may + include reasons for the choice of control or comparator, as well as the scientific + rationale for the study design. + Cardinality: '1' + Relationship Type: Value + Model Name: rationale + Model Representation: Attribute + Inherited From: + - $ref: '#/StudyDesign' + therapeuticAreas: + Type: + - $ref: '#/Code' + NCI C-Code: C215643 + Preferred Term: Observational Study Design Therapeutic Areas + Definition: A categorization of a disease, disorder, or other condition based + on common characteristics and often associated with a medical specialty focusing + on research and development of specific therapeutic interventions for the + purpose of treatment and prevention, which is associated with the observational + study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: therapeuticAreas + Model Representation: Attribute + Inherited From: + - $ref: '#/StudyDesign' + studyType: + Type: + - $ref: '#/Code' + NCI C-Code: C215641 + Preferred Term: Observational Study Design Study Type + Definition: The study type associated with the observational study design. + Cardinality: 0..1 + Relationship Type: Value + Model Name: studyType + Model Representation: Attribute + Inherited From: + - $ref: '#/StudyDesign' + characteristics: + Type: + - $ref: '#/Code' + NCI C-Code: C215642 + Preferred Term: Observational Study Design Characteristics + Definition: The distinguishing qualities or prominent aspects of an observational + study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: characteristics + Model Representation: Attribute + Inherited From: + - $ref: '#/StudyDesign' + studyPhase: + Type: + - $ref: '#/AliasCode' + NCI C-Code: C215640 + Preferred Term: Observational Study Design Study Phase + Definition: The study phase associated with the observational study design. + Cardinality: 0..1 + Relationship Type: Value + Model Name: studyPhase + Model Representation: Attribute + Inherited From: + - $ref: '#/StudyDesign' + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215644 + Preferred Term: Observational Study Design Notes + Definition: A brief written record relevant to the observational study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + Inherited From: + - $ref: '#/StudyDesign' + activities: + Type: + - $ref: '#/Activity' + Definition: A USDM relationship between the ObservationalStudyDesign and Activity + classes which identifies the set of activities associated with the observational + study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: activities + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + biospecimenRetentions: + Type: + - $ref: '#/BiospecimenRetention' + Definition: A USDM relationship between the ObservationalStudyDesign and BiospecimenRetention + classes which identifies the status of biospecimen retentions related to the + observational study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: biospecimenRetentions + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + eligibilityCriteria: + Type: + - $ref: '#/EligibilityCriterion' + Definition: A USDM relationship between the ObservationalStudyDesign and EligibilityCriterion + classes which identifies the set of eligibility criterion associated with + the observational study design. + Cardinality: 1..* + Relationship Type: Value + Model Name: eligibilityCriteria + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + encounters: + Type: + - $ref: '#/Encounter' + Definition: A USDM relationship between the ObservationalStudyDesign and Encounter + classes which identifies the set of encounters associated with the observational + study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: encounters + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + estimands: + Type: + - $ref: '#/Estimand' + Definition: A USDM relationship between the ObservationalStudyDesign and Estimand + classes which identifies the set of estimands associated with the observational + study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: estimands + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + indications: + Type: + - $ref: '#/Indication' + Definition: A USDM relationship between the ObservationalStudyDesign and Indication + classes which identifies the set of indications associated with the observational + study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: indications + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + objectives: + Type: + - $ref: '#/Objective' + Definition: A USDM relationship between the ObservationalStudyDesign and Objective + classes which identifies the set of objectives associated with the observational + study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: objectives + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + scheduleTimelines: + Type: + - $ref: '#/ScheduleTimeline' + Definition: A USDM relationship between the ObservationalStudyDesign and ScheduleTimeline + classes which identifies the set of scheduled timelines associated with the + observational study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: scheduleTimelines + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + arms: + Type: + - $ref: '#/StudyArm' + Definition: A USDM relationship between the ObservationalStudyDesign and StudyArm + classes which identifies the set of study arms associated with the observational + study design. + Cardinality: 1..* + Relationship Type: Value + Model Name: arms + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + studyCells: + Type: + - $ref: '#/StudyCell' + Definition: 'A USDM relationship between the ObservationalStudyDesign and StudyCell + classes which identifies the set of study cells associated with the observational + study design. ' + Cardinality: 1..* + Relationship Type: Value + Model Name: studyCells + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + documentVersionIds: + Type: + - $ref: '#/StudyDefinitionDocumentVersion' + Definition: A USDM relationship between the ObservationalStudyDesign and StudyDefinitionDocumentVersion + classes which identifies the version of the study definition documents associated + with the observational study design. + Cardinality: 0..* + Relationship Type: Ref + Model Name: documentVersions + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + elements: + Type: + - $ref: '#/StudyElement' + Definition: A USDM relationship between the ObservationalStudyDesign and StudyElement + classes which identifies the set of study elements associated with the observational + study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: elements + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + studyInterventionIds: + Type: + - $ref: '#/StudyIntervention' + Definition: A USDM relationship between the ObservationalStudyDesign and StudyIntervention + classes which identifies the set of study interventions associated with observational + study design. + Cardinality: 0..* + Relationship Type: Ref + Model Name: studyInterventions + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + epochs: + Type: + - $ref: '#/StudyEpoch' + Definition: A USDM relationship between the ObservationalStudyDesign and StudyEpoch + classes which identifies the set of study epochs associated with the observational + study design. + Cardinality: 1..* + Relationship Type: Value + Model Name: epochs + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + population: + Type: + - $ref: '#/StudyDesignPopulation' + Definition: A USDM relationship between the ObservationalStudyDesign and StudyDesignPopulation + classes which identifies the population associated with the observational + study design. + Cardinality: '1' + Relationship Type: Value + Model Name: population + Model Representation: Relationship + Inherited From: + - $ref: '#/StudyDesign' + model: + Type: + - $ref: '#/Code' + NCI C-Code: C147138 + Preferred Term: Observation Study Design Model Type + Definition: The general design of the strategy for identifying and following + up with participants during observational studies. (clinicaltrials.gov) + Cardinality: '1' + Relationship Type: Value + Model Name: model + Model Representation: Attribute + subTypes: + Type: + - $ref: '#/Code' + NCI C-Code: C215635 + Preferred Term: Observational Study Type + Definition: The nature of the observational study for which information is being + collected. + Cardinality: 0..* + Relationship Type: Value + Model Name: subTypes + Model Representation: Attribute + timePerspective: + Type: + - $ref: '#/Code' + NCI C-Code: C126065 + Preferred Term: Observational Time Perspective + Definition: The temporal relationship between the observation period and time + of subject enrollment. (ClinicalTrials.gov) + Cardinality: '1' + Relationship Type: Value + Model Name: timePerspective + Model Representation: Attribute + samplingMethod: + Type: + - $ref: '#/Code' + NCI C-Code: C126067 + Preferred Term: Observational Study Sampling Method + Definition: The sampling method used to assign study participants into groups + or cohorts within an observational study. + Cardinality: 0..1 + Relationship Type: Value + Model Name: samplingMethod + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + analysisPopulations: + Type: + - $ref: '#/AnalysisPopulation' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +Organization: + NCI C-Code: C19711 + Preferred Term: Organization + Definition: A formalized group of persons or other organizations collected together + for a common purpose (such as administrative, legal, political) and the infrastructure + to carry out that purpose. (BRIDG) + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C93874 + Preferred Term: Organization Name + Definition: The literal identifier (i.e., distinctive designation) of the organization. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C207514 + Preferred Term: Organization Label + Definition: The short descriptive designation for the organization. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + identifier: + Type: + - $ref: '#/string' + NCI C-Code: C93401 + Preferred Term: Organization Identifier + Definition: A unique symbol that establishes identity of the organization. (BRIDG) + Cardinality: '1' + Relationship Type: Value + Model Name: identifier + Model Representation: Attribute + identifierScheme: + Type: + - $ref: '#/string' + NCI C-Code: C188819 + Preferred Term: Identifier Provider Organization Name + Definition: The name of the organization that provides the identifier for the + entity. + Cardinality: '1' + Relationship Type: Value + Model Name: identifierScheme + Model Representation: Attribute + type: + Type: + - $ref: '#/Code' + NCI C-Code: C188820 + Preferred Term: Organization Type + Definition: A characterization or classification of the formalized group of + persons or other organizations collected together for a common purpose (such + as administrative, legal, political) and the infrastructure to carry out that + purpose. + Cardinality: '1' + Relationship Type: Value + Model Name: type + Model Representation: Attribute + legalAddress: + Type: + - $ref: '#/Address' + Definition: A USDM relationship between the Organization and Address classes + which provides the legal address for an organization. + Cardinality: 0..1 + Relationship Type: Value + Model Name: legalAddress + Model Representation: Relationship + managedSites: + Type: + - $ref: '#/StudySite' + Definition: A USDM relationship between the Organization and StudySite classes + which identifies the set of study sites managed by the organization. + Cardinality: 0..* + Relationship Type: Value + Model Name: managedSites + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +ParameterMap: + NCI C-Code: C207456 + Preferred Term: Parameter Map + Definition: The paired name and value for a given parameter. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + tag: + Type: + - $ref: '#/string' + NCI C-Code: C207515 + Preferred Term: Programming Tag + Definition: Character strings bounded by angle brackets that act as containers + for programming language elements. + Cardinality: '1' + Relationship Type: Value + Model Name: tag + Model Representation: Attribute + reference: + Type: + - $ref: '#/string' + NCI C-Code: C207516 + Preferred Term: Programming Tag Reference + Definition: The reference for a tag used in programming languages, such as a + markup language (e.g., HTML, XML), to store attributes and elements. + Cardinality: '1' + Relationship Type: Value + Model Name: reference + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +PersonName: + NCI C-Code: C25191 + Preferred Term: Person Name + Definition: A word or group of words indicating the identity of a person usually + consisting of a first (personal) name and a last (family) name with an optional + middle name. In some cultural traditions the family name comes first. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + text: + Type: + - $ref: '#/string' + NCI C-Code: C217001 + Preferred Term: Person Name Text + Definition: An instance of structured text that represents the person's full + name. + Cardinality: 0..1 + Relationship Type: Value + Model Name: text + Model Representation: Attribute + familyName: + Type: + - $ref: '#/string' + NCI C-Code: C40975 + Preferred Term: Person Family Name + Definition: A word or group of words indicating a person's last (family) name. + Cardinality: 0..1 + Relationship Type: Value + Model Name: familyName + Model Representation: Attribute + givenNames: + Type: + - $ref: '#/string' + NCI C-Code: C40974 + Preferred Term: Person Given Name + Definition: A word or group of words indicating a person's first (personal or + given) name; the name that precedes the surname. + Cardinality: 0..* + Relationship Type: Value + Model Name: givenNames + Model Representation: Attribute + prefixes: + Type: + - $ref: '#/string' + NCI C-Code: C217002 + Preferred Term: Person Name Prefix + Definition: An affix occurring at the start of the person name string, usually + denoting a title or honorific. + Cardinality: 0..* + Relationship Type: Value + Model Name: prefixes + Model Representation: Attribute + suffixes: + Type: + - $ref: '#/string' + NCI C-Code: C217003 + Preferred Term: Person Name Suffix + Definition: An affix occurring at the end of the person name, usually denoting + educational or professional degrees and certifications, and/or filial rank. + Cardinality: 0..* + Relationship Type: Value + Model Name: suffixes + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +PopulationDefinition: + NCI C-Code: C207593 + Preferred Term: Population Definition + Definition: A concise explanation of the meaning of a population. + Modifier: Abstract + Sub Classes: + - $ref: '#/StudyCohort' + - $ref: '#/StudyDesignPopulation' + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C207544 + Preferred Term: Study Cohort Name + Definition: The literal identifier (i.e., distinctive designation) of the study + cohort. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C207543 + Preferred Term: Study Cohort Label + Definition: The short descriptive designation for the study cohort. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C207542 + Preferred Term: Study Cohort Description + Definition: A narrative representation of the study cohort. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + plannedSex: + Type: + - $ref: '#/Code' + NCI C-Code: C207541 + Preferred Term: Study Cohort Planned Sex + Definition: The protocol-defined sex within the study cohort. + Cardinality: 0..2 + Relationship Type: Value + Model Name: plannedSex + Model Representation: Attribute + includesHealthySubjects: + Type: + - $ref: '#/boolean' + NCI C-Code: C207480 + Preferred Term: Study Cohort Includes Healthy Subjects Indicator + Definition: An indication as to whether the study cohort includes healthy subjects, + that is, subjects without the disease or condition under study. + Cardinality: '1' + Relationship Type: Value + Model Name: includesHealthySubjects + Model Representation: Attribute + plannedAge: + Type: + - $ref: '#/Range' + NCI C-Code: C207545 + Preferred Term: Study Cohort Planned Age + Definition: The anticipated age of subjects within the study cohort. + Cardinality: 0..1 + Relationship Type: Value + Model Name: plannedAge + Model Representation: Attribute + plannedCompletionNumber: + Type: + - $ref: '#/QuantityRange' + NCI C-Code: C207546 + Preferred Term: Study Cohort Planned Completion Number + Definition: The value representing the planned number of subjects that must + complete the study in order to meet the objectives and endpoints of the study, + within the study cohort. + Cardinality: 0..1 + Relationship Type: Value + Model Name: plannedCompletionNumber + Model Representation: Attribute + plannedEnrollmentNumber: + Type: + - $ref: '#/QuantityRange' + NCI C-Code: C207702 + Preferred Term: Study Cohort Planned Enrollment Number + Definition: The value representing the planned number of subjects to be entered + in a clinical trial, within the study cohort. + Cardinality: 0..1 + Relationship Type: Value + Model Name: plannedEnrollmentNumber + Model Representation: Attribute + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215547 + Preferred Term: Study Cohort Notes + Definition: A brief written record relevant to the study cohort. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + criterionIds: + Type: + - $ref: '#/EligibilityCriterion' + Definition: A USDM relationship between the StudyCohort and EligibilityCriterion + classes which identifies the set of eligibility criteria associated with the + study cohort. + Cardinality: 0..* + Relationship Type: Ref + Model Name: criteria + Model Representation: Relationship +Procedure: + NCI C-Code: C98769 + Preferred Term: Procedure + Definition: Any activity performed by manual and/or instrumental means for the purpose + of diagnosis, assessment, therapy, prevention, or palliative care. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C201325 + Preferred Term: Procedure Name + Definition: The literal identifier (i.e., distinctive designation) of the procedure. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C207524 + Preferred Term: Procedure Label + Definition: The short descriptive designation for the procedure. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C201324 + Preferred Term: Procedure Description + Definition: A narrative representation of the procedure. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + procedureType: + Type: + - $ref: '#/string' + NCI C-Code: C188848 + Preferred Term: Procedure Type + Definition: A characterization or classification of the study procedure. + Cardinality: '1' + Relationship Type: Value + Model Name: procedureType + Model Representation: Attribute + code: + Type: + - $ref: '#/Code' + NCI C-Code: C154626 + Preferred Term: Procedure Code + Definition: A symbol or combination of symbols which is assigned to medical + procedure. + Cardinality: '1' + Relationship Type: Value + Model Name: code + Model Representation: Attribute + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215520 + Preferred Term: Procedure Notes + Definition: A brief written record relevant to the procedure. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + studyInterventionId: + Type: + - $ref: '#/StudyIntervention' + Definition: A USDM relationship between the Procedure and StudyInterventionclasses + which provides the details associated with an instance of an intervention + performed during the conduct of a procedure. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: studyIntervention + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +ProductOrganizationRole: + NCI C-Code: C215502 + Preferred Term: Product Organization Role + Definition: A designation that identifies the function of an organization within + the context of the product. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C215622 + Preferred Term: Product Organization Role Name + Definition: The literal identifier (i.e., distinctive designation) of the product + organization role. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C215624 + Preferred Term: Product Organization Role Label + Definition: The short descriptive designation for the product organization role. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C215623 + Preferred Term: Product Organization Role Description + Definition: A narrative representation of the product organization role. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + code: + Type: + - $ref: '#/Code' + NCI C-Code: C215625 + Preferred Term: Product Organization Role Code + Definition: A symbol or combination of symbols which is assigned to the product + organization role. + Cardinality: '1' + Relationship Type: Value + Model Name: code + Model Representation: Attribute + appliesToIds: + Type: + - $ref: '#/AdministrableProduct' + - $ref: '#/MedicalDevice' + Definition: A USDM relationship between the ProductOrganizationRole and either + the AdministrableProduct or MedicalDevice class that identifies the administrable + product or medical device to which the product organization role applies. + Cardinality: 0..* + Relationship Type: Ref + Model Name: appliesTo + Model Representation: Relationship + organizationId: + Type: + - $ref: '#/Organization' + Definition: A USDM relationship between the ProductOrganizationRole and Organization + classes which identifies the organization associated with the product organization + role. + Cardinality: '1' + Relationship Type: Ref + Model Name: organization + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +Quantity: + NCI C-Code: C25256 + Preferred Term: Quantity + Definition: How much there is of something that can be measured; the total amount + or number. + Modifier: Concrete + Super Classes: + - $ref: '#/QuantityRange' + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + Inherited From: + - $ref: '#/QuantityRange' + value: + Type: + - $ref: '#/float' + NCI C-Code: C25712 + Preferred Term: Quantity Value + Definition: A numerical quantity measured or assigned or computed. + Cardinality: '1' + Relationship Type: Value + Model Name: value + Model Representation: Attribute + unit: + Type: + - $ref: '#/AliasCode' + NCI C-Code: C44258 + Preferred Term: Quantity Unit + Definition: The type of unit of measure being used to express a quantity. + Cardinality: 0..1 + Relationship Type: Value + Model Name: unit + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +QuantityRange: + NCI C-Code: C217000 + Preferred Term: Quantity or Range + Definition: The total amount (number), or the limits (minimum and maximum) of a + variation. + Modifier: Abstract + Sub Classes: + - $ref: '#/Quantity' + - $ref: '#/Range' + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute +Range: + NCI C-Code: C38013 + Preferred Term: Range + Definition: An expression that defines the lower and upper limits of a variation. + Modifier: Concrete + Super Classes: + - $ref: '#/QuantityRange' + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + Inherited From: + - $ref: '#/QuantityRange' + minValue: + Type: + - $ref: '#/Quantity' + NCI C-Code: C25570 + Preferred Term: Minimum Value + Definition: The smallest value in quantity or degree in a set of values. + Cardinality: '1' + Relationship Type: Value + Model Name: minValue + Model Representation: Attribute + maxValue: + Type: + - $ref: '#/Quantity' + NCI C-Code: C25564 + Preferred Term: Maximum Value + Definition: The largest value in quantity or degree in a set of values. + Cardinality: '1' + Relationship Type: Value + Model Name: maxValue + Model Representation: Attribute + isApproximate: + Type: + - $ref: '#/boolean' + NCI C-Code: C207525 + Preferred Term: Value Range is Approximate Indicator + Definition: An indication as to whether the value range is almost, but not quite, + exact. + Cardinality: '1' + Relationship Type: Value + Model Name: isApproximate + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +ReferenceIdentifier: + NCI C-Code: C82531 + Preferred Term: Reference Identifier + Definition: A sequence of characters used to identify, name, or characterize the + reference. + Modifier: Concrete + Super Classes: + - $ref: '#/Identifier' + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + Inherited From: + - $ref: '#/Identifier' + text: + Type: + - $ref: '#/string' + NCI C-Code: C215572 + Preferred Term: Reference Identifier Text + Definition: An instance of structured text that represents the reference identifier. + Cardinality: '1' + Relationship Type: Value + Model Name: text + Model Representation: Attribute + Inherited From: + - $ref: '#/Identifier' + scopeId: + Type: + - $ref: '#/Organization' + Definition: A USDM relationship between the ReferenceIdentifier and Organization + classes which provides the details associated with each organization that + has assigned the reference identifier. + Cardinality: '1' + Relationship Type: Ref + Model Name: scope + Model Representation: Relationship + Inherited From: + - $ref: '#/Identifier' + type: + Type: + - $ref: '#/Code' + NCI C-Code: C215571 + Preferred Term: Reference Identifier Type + Definition: A characterization or classification of the reference identifier. + Cardinality: '1' + Relationship Type: Value + Model Name: type + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +ResponseCode: + NCI C-Code: C201347 + Preferred Term: Response Code + Definition: A symbol or combination of symbols representing the response to the + question. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C216998 + Preferred Term: Response Code Name + Definition: The literal identifier (i.e., distinctive designation) of the response + code. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C216999 + Preferred Term: Response Code Label + Definition: The short descriptive designation for the response code. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + isEnabled: + Type: + - $ref: '#/boolean' + NCI C-Code: C201330 + Preferred Term: Response Code Enabled Indicator + Definition: An indication as to whether the response code is activated for use + within a given usage context. + Cardinality: '1' + Relationship Type: Value + Model Name: isEnabled + Model Representation: Attribute + code: + Type: + - $ref: '#/Code' + NCI C-Code: C217013 + Preferred Term: Response Code Value + Definition: The literal value of a response code. + Cardinality: '1' + Relationship Type: Value + Model Name: code + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +ScheduleTimeline: + NCI C-Code: C201348 + Preferred Term: Schedule Timeline + Definition: A chronological schedule of planned temporal events. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C201334 + Preferred Term: Schedule Timeline Name + Definition: The literal identifier (i.e., distinctive designation) of the schedule + timeline. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C207530 + Preferred Term: Schedule Timeline Label + Definition: The short descriptive designation for the schedule timeline. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C201332 + Preferred Term: Schedule Timeline Description + Definition: A narrative representation of the schedule timeline. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + entryCondition: + Type: + - $ref: '#/string' + NCI C-Code: C201333 + Preferred Term: Schedule Timeline Entry Condition + Definition: A logical evaluation on which rests the validity of entry into a + schedule timeline. + Cardinality: '1' + Relationship Type: Value + Model Name: entryCondition + Model Representation: Attribute + mainTimeline: + Type: + - $ref: '#/boolean' + NCI C-Code: C201331 + Preferred Term: Main Timeline Indicator + Definition: An indication as to whether the timeline or timeline component is + part of the central or principal timeline. + Cardinality: '1' + Relationship Type: Value + Model Name: mainTimeline + Model Representation: Attribute + plannedDuration: + Type: + - $ref: '#/Duration' + NCI C-Code: C217012 + Preferred Term: Schedule Timeline Planned Duration + Definition: The period of time over which the scheduled timeline is intended + to take place. + Cardinality: 0..1 + Relationship Type: Value + Model Name: plannedDuration + Model Representation: Attribute + instances: + Type: + - $ref: '#/ScheduledInstance' + Definition: A USDM relationship between the ScheduleTimeline and ScheduledInstance + classes which identifies the set of scheduled instances (e.g., scheduled activity + instances or scheduled decision instances) associated with the scheduled timeline. + Cardinality: 0..* + Relationship Type: Value + Model Name: instances + Model Representation: Relationship + entryId: + Type: + - $ref: '#/ScheduledInstance' + Definition: A USDM relationship between the ScheduleTimeline and ScheduledInstance + classes which defines the entry into a scheduled instance (e.g., scheduled + activity instances or scheduled decision instances) for a timeline. + Cardinality: '1' + Relationship Type: Ref + Model Name: entry + Model Representation: Relationship + exits: + Type: + - $ref: '#/ScheduleTimelineExit' + Definition: A USDM relationship between the ScheduleTimeline and ScheduleTimelineExit + classes which identifies the set of exits from the scheduled timeline. + Cardinality: 0..* + Relationship Type: Value + Model Name: exits + Model Representation: Relationship + timings: + Type: + - $ref: '#/Timing' + Definition: A USDM relationship between the ScheduleTimeline and Timing classes + which identifies the set of timings associated with the scheduled timeline. + Cardinality: 0..* + Relationship Type: Value + Model Name: timings + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +ScheduleTimelineExit: + NCI C-Code: C201349 + Preferred Term: Schedule Timeline Exit + Definition: To go out of or leave the schedule timeline. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +ScheduledActivityInstance: + NCI C-Code: C201350 + Preferred Term: Scheduled Activity Instance + Definition: A scheduled occurrence of an activity event. + Modifier: Concrete + Super Classes: + - $ref: '#/ScheduledInstance' + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + Inherited From: + - $ref: '#/ScheduledInstance' + name: + Type: + - $ref: '#/string' + NCI C-Code: C207533 + Preferred Term: Scheduled Activity Instance Name + Definition: The literal identifier (i.e., distinctive designation) of the scheduled + activity instance. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + Inherited From: + - $ref: '#/ScheduledInstance' + label: + Type: + - $ref: '#/string' + NCI C-Code: C207532 + Preferred Term: Scheduled Activity Instance Label + Definition: The short descriptive designation for the scheduled activity instance. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + Inherited From: + - $ref: '#/ScheduledInstance' + description: + Type: + - $ref: '#/string' + NCI C-Code: C207531 + Preferred Term: Scheduled Activity Instance Description + Definition: A narrative representation of the scheduled activity instance. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + Inherited From: + - $ref: '#/ScheduledInstance' + defaultConditionId: + Type: + - $ref: '#/ScheduledInstance' + Definition: A USDM relationship within the ScheduledActivityInstance class which + identifies the default condition within a scheduled activity instance. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: defaultCondition + Model Representation: Relationship + Inherited From: + - $ref: '#/ScheduledInstance' + epochId: + Type: + - $ref: '#/StudyEpoch' + Definition: A USDM relationship between the ScheduledActivityInstance and StudyEpoch + classes which identifies the study epoch associated with a scheduled activity + instance. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: epoch + Model Representation: Relationship + Inherited From: + - $ref: '#/ScheduledInstance' + activityIds: + Type: + - $ref: '#/Activity' + Definition: A USDM relationship between the ScheduledActivityInstance and Activity + classes which identifies the set of activities associated with a scheduled + activity instance. + Cardinality: 0..* + Relationship Type: Ref + Model Name: activities + Model Representation: Relationship + encounterId: + Type: + - $ref: '#/Encounter' + Definition: A USDM relationship between the ScheduledActivityInstance and Encounter + classes which defines the subject encounter associated with the ScheduleActivityInstance. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: encounter + Model Representation: Relationship + timelineId: + Type: + - $ref: '#/ScheduleTimeline' + Definition: A USDM relationship between the ScheduledActivityInstance and ScheduleTimeline + classes which provides the details associated with an instance of a scheduled + timeline related to a scheduled activity instance. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: timeline + Model Representation: Relationship + timelineExitId: + Type: + - $ref: '#/ScheduleTimelineExit' + Definition: A USDM relationship between the ScheduledActivityInstance and ScheduleTimelineExit + classes which provides the details associated with the exit from a timeline + related to a scheduled activity instance. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: timelineExit + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +ScheduledDecisionInstance: + NCI C-Code: C201351 + Preferred Term: Scheduled Decision Instance + Definition: A scheduled occurrence of a decision event. + Modifier: Concrete + Super Classes: + - $ref: '#/ScheduledInstance' + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + Inherited From: + - $ref: '#/ScheduledInstance' + name: + Type: + - $ref: '#/string' + NCI C-Code: C207536 + Preferred Term: Scheduled Decision Instance Name + Definition: The literal identifier (i.e., distinctive designation) of the scheduled + Decision instance. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + Inherited From: + - $ref: '#/ScheduledInstance' + label: + Type: + - $ref: '#/string' + NCI C-Code: C207535 + Preferred Term: Scheduled Decision Instance Label + Definition: The short descriptive designation for the scheduled Decision instance. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + Inherited From: + - $ref: '#/ScheduledInstance' + description: + Type: + - $ref: '#/string' + NCI C-Code: C207534 + Preferred Term: Scheduled Decision Instance Description + Definition: A narrative representation of the scheduled Decision instance. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + Inherited From: + - $ref: '#/ScheduledInstance' + defaultConditionId: + Type: + - $ref: '#/ScheduledInstance' + Definition: A USDM relationship within the ScheduledDecisionInstance class which + identifies the default condition within a scheduled decision instance. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: defaultCondition + Model Representation: Relationship + Inherited From: + - $ref: '#/ScheduledInstance' + epochId: + Type: + - $ref: '#/StudyEpoch' + Definition: A USDM relationship between the ScheduledDecisionInstance and StudyEpoch + classes which identifies the study epoch associated with a scheduled decision + instance. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: epoch + Model Representation: Relationship + Inherited From: + - $ref: '#/ScheduledInstance' + conditionAssignments: + Type: + - $ref: '#/ConditionAssignment' + Definition: A USDM relationship between the ScheduledDecisionInstance and ConditionAssignment + classes which identifies the set of condition assignments associated with + a scheduled decision instance. + Cardinality: 1..* + Relationship Type: Value + Model Name: conditionAssignments + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +ScheduledInstance: + NCI C-Code: C201299 + Preferred Term: Scheduled Instance + Definition: A scheduled occurrence of a temporal event. + Modifier: Abstract + Sub Classes: + - $ref: '#/ScheduledActivityInstance' + - $ref: '#/ScheduledDecisionInstance' + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C207533 + Preferred Term: Scheduled Activity Instance Name + Definition: The literal identifier (i.e., distinctive designation) of the scheduled + activity instance. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C207532 + Preferred Term: Scheduled Activity Instance Label + Definition: The short descriptive designation for the scheduled activity instance. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C207531 + Preferred Term: Scheduled Activity Instance Description + Definition: A narrative representation of the scheduled activity instance. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + defaultConditionId: + Type: + - $ref: '#/ScheduledInstance' + Definition: A USDM relationship within the ScheduledActivityInstance class which + identifies the default condition within a scheduled activity instance. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: defaultCondition + Model Representation: Relationship + epochId: + Type: + - $ref: '#/StudyEpoch' + Definition: A USDM relationship between the ScheduledActivityInstance and StudyEpoch + classes which identifies the study epoch associated with a scheduled activity + instance. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: epoch + Model Representation: Relationship +Strength: + NCI C-Code: C215495 + Preferred Term: Substance Strength + Definition: The content of an substance expressed quantitatively per dosage unit, + per unit of volume, or per unit of weight, according to the pharmaceutical dose + form of the product. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C215590 + Preferred Term: Substance Strength Name + Definition: The literal identifier (i.e., distinctive designation) of the substance + strength. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C215592 + Preferred Term: Substance Strength Label + Definition: The short descriptive designation for the substance strength. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C215591 + Preferred Term: Substance Strength Description + Definition: A narrative representation of the substance strength. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + numerator: + Type: + - $ref: '#/QuantityRange' + NCI C-Code: C80490 + Preferred Term: Numerator + Definition: The dividend of a fraction. + Cardinality: '1' + Relationship Type: Value + Model Name: numerator + Model Representation: Attribute + denominator: + Type: + - $ref: '#/Quantity' + NCI C-Code: C80489 + Preferred Term: Denominator + Definition: The divisor of a fraction. + Cardinality: 0..1 + Relationship Type: Value + Model Name: denominator + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +Study: + NCI C-Code: C15206 + Preferred Term: Clinical Study + Definition: 'A clinical study involves research using human volunteers (also called + participants) that is intended to add to medical knowledge. There are two main + types of clinical studies: clinical trials (also called interventional studies) + and observational studies. (CDISC Glossary)' + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C68631 + Preferred Term: Clinical Study Name + Definition: The literal identifier (i.e., distinctive designation) of the clinical + study. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C207479 + Preferred Term: Clinical Study Label + Definition: The short descriptive designation for the clinical study. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C142704 + Preferred Term: Clinical Study Description + Definition: A narrative representation of the clinical study. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + versions: + Type: + - $ref: '#/StudyVersion' + Definition: A USDM relationship between the Study and StudyVersion classes which + identifies the set of versions associated with the study. + Cardinality: 0..* + Relationship Type: Value + Model Name: versions + Model Representation: Relationship + documentedBy: + Type: + - $ref: '#/StudyDefinitionDocument' + Definition: A USDM relationship between the Study and StudyDefinitionDocument + classes signifying that the study is documented in a study definition document. + Cardinality: 0..* + Relationship Type: Value + Model Name: documentedBy + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +StudyAmendment: + NCI C-Code: C207594 + Preferred Term: Study Amendment + Definition: A written description of a change(s) to, or formal clarification of, + a study. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C216995 + Preferred Term: Study Amendment Name + Definition: The literal identifier (i.e., distinctive designation) of the study + amendment. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C216997 + Preferred Term: Study Amendment Label + Definition: The short descriptive designation for the study amendment. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C216996 + Preferred Term: Study Amendment Description + Definition: A narrative representation of the study amendment. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + number: + Type: + - $ref: '#/string' + NCI C-Code: C207537 + Preferred Term: Study Amendment Number + Definition: A string of numerals that uniquely identifies a protocol amendment. + Cardinality: '1' + Relationship Type: Value + Model Name: number + Model Representation: Attribute + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215538 + Preferred Term: Study Amendment Notes + Definition: A brief written record relevant to the study amendment. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + summary: + Type: + - $ref: '#/string' + NCI C-Code: C115627 + Preferred Term: Study Amendment Summary + Definition: A short narrative representation describing the changes introduced + in the current version of the protocol. + Cardinality: '1' + Relationship Type: Value + Model Name: summary + Model Representation: Attribute + geographicScopes: + Type: + - $ref: '#/GeographicScope' + Definition: A USDM relationship between the StudyAmendment and GeographicScope + classes which identifies the set of geographic scopes associated with the + study amendment. + Cardinality: 1..* + Relationship Type: Value + Model Name: geographicScopes + Model Representation: Relationship + dateValues: + Type: + - $ref: '#/GovernanceDate' + Definition: A USDM relationship between the StudyAmendment and GovernanceDate + classes which provides the set of governance dates associated with the study + amendment. + Cardinality: 0..* + Relationship Type: Value + Model Name: dateValues + Model Representation: Relationship + impacts: + Type: + - $ref: '#/StudyAmendmentImpact' + Definition: A USDM relationship between the StudyAmendment and StudyAmendmentImpact + classes which identifies the set of impacts that the study amendment has on + the study or study subjects. + Cardinality: 0..* + Relationship Type: Value + Model Name: impacts + Model Representation: Relationship + enrollments: + Type: + - $ref: '#/SubjectEnrollment' + Definition: A USDM relationship between the StudyAmendment and SubjectEnrollment + classes which provides the set of subject enrollments associated with the + study amendment. + Cardinality: 0..* + Relationship Type: Value + Model Name: enrollments + Model Representation: Relationship + secondaryReasons: + Type: + - $ref: '#/StudyAmendmentReason' + Definition: A USDM relationship between the StudyAmendment and StudyAmendmentReason + classes which identifies the set of secondary reasons for issuing the study + amendment. + Cardinality: 0..* + Relationship Type: Value + Model Name: secondaryReasons + Model Representation: Relationship + changes: + Type: + - $ref: '#/StudyChange' + Definition: A USDM relationship between the StudyAmendment and StudyChange + classes which identifies the set of changes associated with the study amendment. + Cardinality: 1..* + Relationship Type: Value + Model Name: changes + Model Representation: Relationship + previousId: + Type: + - $ref: '#/StudyAmendment' + Definition: A USDM relationship within the StudyAmendment class which identifies + the study amendment that chronologically precedes the current study amendment. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: previous + Model Representation: Relationship + primaryReason: + Type: + - $ref: '#/StudyAmendmentReason' + Definition: A USDM relationship between the StudyAmendment and StudyAmendmentReason + classes which identifies the primary reason for issuing the study amendment. + Cardinality: '1' + Relationship Type: Value + Model Name: primaryReason + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +StudyAmendmentImpact: + NCI C-Code: C215500 + Preferred Term: Study Amendment Impact + Definition: The effect or consequence of an amendment on some aspect of the study. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + text: + Type: + - $ref: '#/string' + NCI C-Code: C215611 + Preferred Term: Study Amendment Impact Text + Definition: An instance of unstructured text that represents the study amendment + impact. + Cardinality: '1' + Relationship Type: Value + Model Name: text + Model Representation: Attribute + isSubstantial: + Type: + - $ref: '#/boolean' + NCI C-Code: C207538 + Preferred Term: Study Amendment Impact Substantial Indicator + Definition: An indication as to whether the study amendment's impact on the + study is substantial. + Cardinality: '1' + Relationship Type: Value + Model Name: isSubstantial + Model Representation: Attribute + type: + Type: + - $ref: '#/Code' + NCI C-Code: C215612 + Preferred Term: Study Amendment Impact Type + Definition: A characterization or classification of the study amendment impact. + Cardinality: '1' + Relationship Type: Value + Model Name: type + Model Representation: Attribute + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215613 + Preferred Term: Study Amendment Impact Notes + Definition: A brief written record relevant to the study amendment impact. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +StudyAmendmentReason: + NCI C-Code: C207457 + Preferred Term: Study Amendment Reason + Definition: The rationale for the change(s) to, or formal clarification of, a protocol. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + otherReason: + Type: + - $ref: '#/string' + NCI C-Code: C207539 + Preferred Term: Other Reason for Study Amendment + Definition: The rationale for the change(s) to, or formal clarification of, + a protocol that is not otherwise specified. + Cardinality: 0..1 + Relationship Type: Value + Model Name: otherReason + Model Representation: Attribute + code: + Type: + - $ref: '#/Code' + NCI C-Code: C207540 + Preferred Term: Study Amendment Reason Code + Definition: A symbol or combination of symbols which is assigned to the study + amendment reason. + Cardinality: '1' + Relationship Type: Value + Model Name: code + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +StudyArm: + NCI C-Code: C174447 + Preferred Term: Study Arm + Definition: A planned pathway assigned to the subject as they progress through the + study, usually referred to by a name that reflects one or more treatments, exposures, + and/or controls included in the path. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C170984 + Preferred Term: Study Arm Name + Definition: The literal identifier (i.e., distinctive designation) of the study + arm. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C172456 + Preferred Term: Study Arm Label + Definition: The short descriptive designation for the study arm. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C93728 + Preferred Term: Study Arm Description + Definition: A narrative representation of the study arm. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + type: + Type: + - $ref: '#/Code' + NCI C-Code: C172457 + Preferred Term: Study Arm Type + Definition: A characterization or classification of the study arm. + Cardinality: '1' + Relationship Type: Value + Model Name: type + Model Representation: Attribute + dataOriginType: + Type: + - $ref: '#/Code' + NCI C-Code: C188829 + Preferred Term: Study Arm Data Origin Type + Definition: A characterization or classification of the study arm with respect + to where the study arm data originates. + Cardinality: '1' + Relationship Type: Value + Model Name: dataOriginType + Model Representation: Attribute + dataOriginDescription: + Type: + - $ref: '#/string' + NCI C-Code: C188828 + Preferred Term: Study Arm Data Origin Description + Definition: The textual representation of the study arm data origin. + Cardinality: '1' + Relationship Type: Value + Model Name: dataOriginDescription + Model Representation: Attribute + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215515 + Preferred Term: Study Arm Notes + Definition: A brief written record relevant to the study arm. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + populationIds: + Type: + - $ref: '#/PopulationDefinition' + Definition: A USDM relationship between the StudyArm and PopulationDefinition + classes which identifies the set of populations associated with the study + arm. + Cardinality: 0..* + Relationship Type: Ref + Model Name: populations + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +StudyCell: + NCI C-Code: C188810 + Preferred Term: Study Design Cell + Definition: A partitioning of a study arm into individual pieces, which are associated + with an epoch and any number of sequential elements within that epoch. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + armId: + Type: + - $ref: '#/StudyArm' + Definition: A USDM relationship between the StudyCell and StudyArm classes which + identifies the study arm associated with a study cell. + Cardinality: '1' + Relationship Type: Ref + Model Name: arm + Model Representation: Relationship + epochId: + Type: + - $ref: '#/StudyEpoch' + Definition: A USDM relationship between the StudyCell and StudyEpoch classes + which identifies the study epoch associated with a study cell. + Cardinality: '1' + Relationship Type: Ref + Model Name: epoch + Model Representation: Relationship + elementIds: + Type: + - $ref: '#/StudyElement' + Definition: A USDM relationship between the StudyCell and StudyElement classes + which identifies the set of study elements associated with the study cell. + Cardinality: 1..* + Relationship Type: Ref + Model Name: elements + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +StudyChange: + NCI C-Code: C215498 + Preferred Term: Study Change + Definition: The act of alteration or modification to a study. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C215604 + Preferred Term: Study Change Name + Definition: The literal identifier (i.e., distinctive designation) of the study + change. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C215606 + Preferred Term: Study Change Label + Definition: The short descriptive designation for the study change. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C215605 + Preferred Term: Study Change Description + Definition: A narrative representation of the study change. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + rationale: + Type: + - $ref: '#/string' + NCI C-Code: C215608 + Preferred Term: Study Change Rationale + Definition: An explanation as to the logical reasons for why a study change + has occurred. + Cardinality: '1' + Relationship Type: Value + Model Name: rationale + Model Representation: Attribute + summary: + Type: + - $ref: '#/string' + NCI C-Code: C215607 + Preferred Term: Study Change Summary + Definition: A short narrative representation describing the changes introduced + in the current version of the study. + Cardinality: '1' + Relationship Type: Value + Model Name: summary + Model Representation: Attribute + changedSections: + Type: + - $ref: '#/DocumentContentReference' + Definition: A USDM relationship between the StudyChange and DocumentContentReference + class which provides the set of changed document sections related to the study + change. + Cardinality: 1..* + Relationship Type: Value + Model Name: changedSections + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +StudyCohort: + NCI C-Code: C61512 + Preferred Term: Study Cohort + Definition: A group of individuals who share a set of characteristics (e.g., exposures, + experiences, attributes), which logically defines a population under study. + Modifier: Concrete + Super Classes: + - $ref: '#/PopulationDefinition' + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + Inherited From: + - $ref: '#/PopulationDefinition' + name: + Type: + - $ref: '#/string' + NCI C-Code: C207544 + Preferred Term: Study Cohort Name + Definition: The literal identifier (i.e., distinctive designation) of the study + cohort. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + Inherited From: + - $ref: '#/PopulationDefinition' + label: + Type: + - $ref: '#/string' + NCI C-Code: C207543 + Preferred Term: Study Cohort Label + Definition: The short descriptive designation for the study cohort. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + Inherited From: + - $ref: '#/PopulationDefinition' + description: + Type: + - $ref: '#/string' + NCI C-Code: C207542 + Preferred Term: Study Cohort Description + Definition: A narrative representation of the study cohort. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + Inherited From: + - $ref: '#/PopulationDefinition' + plannedSex: + Type: + - $ref: '#/Code' + NCI C-Code: C207541 + Preferred Term: Study Cohort Planned Sex + Definition: The protocol-defined sex within the study cohort. + Cardinality: 0..2 + Relationship Type: Value + Model Name: plannedSex + Model Representation: Attribute + Inherited From: + - $ref: '#/PopulationDefinition' + includesHealthySubjects: + Type: + - $ref: '#/boolean' + NCI C-Code: C207480 + Preferred Term: Study Cohort Includes Healthy Subjects Indicator + Definition: An indication as to whether the study cohort includes healthy subjects, + that is, subjects without the disease or condition under study. + Cardinality: '1' + Relationship Type: Value + Model Name: includesHealthySubjects + Model Representation: Attribute + Inherited From: + - $ref: '#/PopulationDefinition' + plannedAge: + Type: + - $ref: '#/Range' + NCI C-Code: C207545 + Preferred Term: Study Cohort Planned Age + Definition: The anticipated age of subjects within the study cohort. + Cardinality: 0..1 + Relationship Type: Value + Model Name: plannedAge + Model Representation: Attribute + Inherited From: + - $ref: '#/PopulationDefinition' + plannedCompletionNumber: + Type: + - $ref: '#/QuantityRange' + NCI C-Code: C207546 + Preferred Term: Study Cohort Planned Completion Number + Definition: The value representing the planned number of subjects that must + complete the study in order to meet the objectives and endpoints of the study, + within the study cohort. + Cardinality: 0..1 + Relationship Type: Value + Model Name: plannedCompletionNumber + Model Representation: Attribute + Inherited From: + - $ref: '#/PopulationDefinition' + plannedEnrollmentNumber: + Type: + - $ref: '#/QuantityRange' + NCI C-Code: C207702 + Preferred Term: Study Cohort Planned Enrollment Number + Definition: The value representing the planned number of subjects to be entered + in a clinical trial, within the study cohort. + Cardinality: 0..1 + Relationship Type: Value + Model Name: plannedEnrollmentNumber + Model Representation: Attribute + Inherited From: + - $ref: '#/PopulationDefinition' + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215547 + Preferred Term: Study Cohort Notes + Definition: A brief written record relevant to the study cohort. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + Inherited From: + - $ref: '#/PopulationDefinition' + criterionIds: + Type: + - $ref: '#/EligibilityCriterion' + Definition: A USDM relationship between the StudyCohort and EligibilityCriterion + classes which identifies the set of eligibility criteria associated with the + study cohort. + Cardinality: 0..* + Relationship Type: Ref + Model Name: criteria + Model Representation: Relationship + Inherited From: + - $ref: '#/PopulationDefinition' + characteristics: + Type: + - $ref: '#/Characteristic' + Definition: A USDM relationship between the StudyCohort and Characteristic classes + which identifies the set of subject characteristics associated with the study + cohort. + Cardinality: 0..* + Relationship Type: Value + Model Name: characteristics + Model Representation: Relationship + indicationIds: + Type: + - $ref: '#/Indication' + Definition: A USDM relationship between the StudyCohort and Indication classes + which identifies the set of indications associated with the study cohort. + Cardinality: 0..* + Relationship Type: Ref + Model Name: indications + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +StudyDefinitionDocument: + NCI C-Code: C215490 + Preferred Term: Study Definition Document + Definition: Any physical or electronic document that is related to defining a study + or part of a study. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C215559 + Preferred Term: Study Definition Document Name + Definition: The literal identifier (i.e., distinctive designation) of the study + definition document. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C215561 + Preferred Term: Study Definition Document Label + Definition: The short descriptive designation for the study definition document. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C215560 + Preferred Term: Study Definition Document Description + Definition: A narrative representation of the study definition document. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + type: + Type: + - $ref: '#/Code' + NCI C-Code: C215564 + Preferred Term: Study Definition Document Type + Definition: A characterization or classification of the study definition document. + Cardinality: '1' + Relationship Type: Value + Model Name: type + Model Representation: Attribute + templateName: + Type: + - $ref: '#/string' + NCI C-Code: C215562 + Preferred Term: Study Definition Document Template Name + Definition: The literal identifier (i.e., distinctive designation) of the study + definition document template. + Cardinality: '1' + Relationship Type: Value + Model Name: templateName + Model Representation: Attribute + language: + Type: + - $ref: '#/Code' + NCI C-Code: C215563 + Preferred Term: Study Definition Document Language + Definition: The language in which the study definition document is written. + Cardinality: '1' + Relationship Type: Value + Model Name: language + Model Representation: Attribute + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215565 + Preferred Term: Study Definition Document Notes + Definition: A brief written record relevant to the study definition document. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + childIds: + Type: + - $ref: '#/StudyDefinitionDocument' + Definition: A USDM relationship within the StudyDefinitionDocument class which + identifies the set of child documents of a study definition document. + Cardinality: 0..* + Relationship Type: Ref + Model Name: children + Model Representation: Relationship + versions: + Type: + - $ref: '#/StudyDefinitionDocumentVersion' + Definition: A USDM relationship between the StudyDefinitionDocument and StudyDefinitionDocumentVersion + classes which identifies the set of versions associated with the study definition + document. + Cardinality: 0..* + Relationship Type: Value + Model Name: versions + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +StudyDefinitionDocumentVersion: + NCI C-Code: C215491 + Preferred Term: Study Definition Document Version + Definition: A representation of a particular edition or snapshot of the study definition + document as it exists at a particular point in time. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + status: + Type: + - $ref: '#/Code' + NCI C-Code: C215567 + Preferred Term: Study Definition Document Status + Definition: A condition of the study definition document at a point in time + with respect to its state of readiness for implementation. + Cardinality: '1' + Relationship Type: Value + Model Name: status + Model Representation: Attribute + version: + Type: + - $ref: '#/string' + NCI C-Code: C215566 + Preferred Term: Study Definition Document Version Identifier + Definition: A sequence of characters used to identify the version of the study + definition document. + Cardinality: '1' + Relationship Type: Value + Model Name: version + Model Representation: Attribute + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215568 + Preferred Term: Study Definition Document Version Notes + Definition: A brief written record relevant to the study definition document + version. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + dateValues: + Type: + - $ref: '#/GovernanceDate' + Definition: A USDM relationship between the StudyDefinitionDocumentVersion and + GovernanceDate classes which provides the set of governance dates associated + with the study definition document version. + Cardinality: 0..* + Relationship Type: Value + Model Name: dateValues + Model Representation: Relationship + contents: + Type: + - $ref: '#/NarrativeContent' + Definition: A USDM relationship between the StudyDefinitionDocumentVersion and + NarrativeContent classes which identifies the set of narrative content associated + with the version of the study definition document. + Cardinality: 0..* + Relationship Type: Value + Model Name: contents + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +StudyDesign: + NCI C-Code: C15320 + Preferred Term: Study Design + Definition: A plan detailing how a study will be performed in order to represent + the phenomenon under examination, to answer the research questions that have been + asked, and informing the statistical approach. + Modifier: Abstract + Sub Classes: + - $ref: '#/InterventionalStudyDesign' + - $ref: '#/ObservationalStudyDesign' + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C215626 + Preferred Term: Interventional Study Design Name + Definition: The literal identifier (i.e., distinctive designation) of the interventional + study design. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C215628 + Preferred Term: Interventional Study Design Label + Definition: The short descriptive designation for the interventional study design. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C215627 + Preferred Term: Interventional Study Design Description + Definition: A narrative representation of the interventional study design. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + rationale: + Type: + - $ref: '#/string' + NCI C-Code: C215629 + Preferred Term: Interventional Study Design Rationale + Definition: Reason(s) for choosing the interventional study design. This may + include reasons for the choice of control or comparator, as well as the scientific + rationale for the study design. + Cardinality: '1' + Relationship Type: Value + Model Name: rationale + Model Representation: Attribute + therapeuticAreas: + Type: + - $ref: '#/Code' + NCI C-Code: C215633 + Preferred Term: Interventional Study Design Therapeutic Areas + Definition: A categorization of a disease, disorder, or other condition based + on common characteristics and often associated with a medical specialty focusing + on research and development of specific therapeutic interventions for the + purpose of treatment and prevention, which is associated with the interventional + study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: therapeuticAreas + Model Representation: Attribute + studyType: + Type: + - $ref: '#/Code' + NCI C-Code: C215631 + Preferred Term: Interventional Study Design Study Type + Definition: The study type associated with the interventional study design. + Cardinality: 0..1 + Relationship Type: Value + Model Name: studyType + Model Representation: Attribute + characteristics: + Type: + - $ref: '#/Code' + NCI C-Code: C215632 + Preferred Term: Interventional Study Design Characteristics + Definition: The distinguishing qualities or prominent aspects of an interventional + study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: characteristics + Model Representation: Attribute + studyPhase: + Type: + - $ref: '#/AliasCode' + NCI C-Code: C215630 + Preferred Term: Interventional Study Design Study Phase + Definition: The study phase associated with the interventional study design. + Cardinality: 0..1 + Relationship Type: Value + Model Name: studyPhase + Model Representation: Attribute + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215634 + Preferred Term: Interventional Study Design Notes + Definition: A brief written record relevant to the interventional study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + activities: + Type: + - $ref: '#/Activity' + Definition: A USDM relationship between the InterventionalStudyDesign and Activity + classes which identifies the set of activities associated with the interventional + study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: activities + Model Representation: Relationship + biospecimenRetentions: + Type: + - $ref: '#/BiospecimenRetention' + Definition: A USDM relationship between the InterventionalStudyDesign and BiospecimenRetention + classes which identifies the status of biospecimen retentions related to the + interventional study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: biospecimenRetentions + Model Representation: Relationship + eligibilityCriteria: + Type: + - $ref: '#/EligibilityCriterion' + Definition: A USDM relationship between the InterventionalStudyDesign and EligibilityCriterion + classes which identifies the set of eligibility criterion associated with + the interventional study design. + Cardinality: 1..* + Relationship Type: Value + Model Name: eligibilityCriteria + Model Representation: Relationship + encounters: + Type: + - $ref: '#/Encounter' + Definition: A USDM relationship between the InterventionalStudyDesign and Encounter + classes which identifies the set of encounters associated with the interventional + study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: encounters + Model Representation: Relationship + estimands: + Type: + - $ref: '#/Estimand' + Definition: A USDM relationship between the InterventionalStudyDesign and Estimand + classes which identifies the set of estimands associated with the interventional + study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: estimands + Model Representation: Relationship + indications: + Type: + - $ref: '#/Indication' + Definition: A USDM relationship between the InterventionalStudyDesign and Indication + classes which identifies the set of indications associated with the interventional + study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: indications + Model Representation: Relationship + objectives: + Type: + - $ref: '#/Objective' + Definition: A USDM relationship between the InterventionalStudyDesign and Objective + classes which identifies the set of objectives associated with the interventional + study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: objectives + Model Representation: Relationship + scheduleTimelines: + Type: + - $ref: '#/ScheduleTimeline' + Definition: A USDM relationship between the InterventionalStudyDesign and ScheduleTimeline + classes which identifies the set of scheduled timelines associated with the + interventional study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: scheduleTimelines + Model Representation: Relationship + arms: + Type: + - $ref: '#/StudyArm' + Definition: A USDM relationship between the InterventionalStudyDesign and StudyArm + classes which identifies the set of study arms associated with the interventional + study design. + Cardinality: 1..* + Relationship Type: Value + Model Name: arms + Model Representation: Relationship + studyCells: + Type: + - $ref: '#/StudyCell' + Definition: 'A USDM relationship between the InterventionalStudyDesign and StudyCell + classes which identifies the set of study cells associated with the interventional + study design. ' + Cardinality: 1..* + Relationship Type: Value + Model Name: studyCells + Model Representation: Relationship + documentVersionIds: + Type: + - $ref: '#/StudyDefinitionDocumentVersion' + Definition: A USDM relationship between the InterventionalStudyDesign and StudyDefinitionDocumentVersion + classes which identifies the version of the study definition documents associated + with the interventional study design. + Cardinality: 0..* + Relationship Type: Ref + Model Name: documentVersions + Model Representation: Relationship + elements: + Type: + - $ref: '#/StudyElement' + Definition: A USDM relationship between the InterventionalStudyDesign and StudyElement + classes which identifies the set of study elements associated with the interventional + study design. + Cardinality: 0..* + Relationship Type: Value + Model Name: elements + Model Representation: Relationship + studyInterventionIds: + Type: + - $ref: '#/StudyIntervention' + Definition: A USDM relationship between the InterventionalStudyDesign and StudyIntervention + classes which identifies the set of study interventions associated with interventional + study design. + Cardinality: 0..* + Relationship Type: Ref + Model Name: studyInterventions + Model Representation: Relationship + epochs: + Type: + - $ref: '#/StudyEpoch' + Definition: A USDM relationship between the InterventionalStudyDesign and StudyEpoch + classes which identifies the set of study epochs associated with the interventional + study design. + Cardinality: 1..* + Relationship Type: Value + Model Name: epochs + Model Representation: Relationship + population: + Type: + - $ref: '#/StudyDesignPopulation' + Definition: A USDM relationship between the InterventionalStudyDesign and StudyDesignPopulation + classes which identifies the population associated with the interventional + study design. + Cardinality: '1' + Relationship Type: Value + Model Name: population + Model Representation: Relationship + analysisPopulations: + Type: + - $ref: '#/AnalysisPopulation' + Cardinality: 0..* + Relationship Type: Value +StudyDesignPopulation: + NCI C-Code: C142728 + Preferred Term: Study Design Population + Definition: The population within the general population to which the study results + can be generalized. + Modifier: Concrete + Super Classes: + - $ref: '#/PopulationDefinition' + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + Inherited From: + - $ref: '#/PopulationDefinition' + name: + Type: + - $ref: '#/string' + NCI C-Code: C207553 + Preferred Term: Study Design Population Name + Definition: The literal identifier (i.e., distinctive designation) of the study + design population. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + Inherited From: + - $ref: '#/PopulationDefinition' + label: + Type: + - $ref: '#/string' + NCI C-Code: C207550 + Preferred Term: Study Design Population Label + Definition: The short descriptive designation for the study design population. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + Inherited From: + - $ref: '#/PopulationDefinition' + description: + Type: + - $ref: '#/string' + NCI C-Code: C70834 + Preferred Term: Study Design Population Description + Definition: A narrative representation of the study design population. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + Inherited From: + - $ref: '#/PopulationDefinition' + plannedSex: + Type: + - $ref: '#/Code' + NCI C-Code: C207551 + Preferred Term: Study Design Population Planned Sex + Definition: The protocol-defined sex within the study design population. + Cardinality: 0..2 + Relationship Type: Value + Model Name: plannedSex + Model Representation: Attribute + Inherited From: + - $ref: '#/PopulationDefinition' + includesHealthySubjects: + Type: + - $ref: '#/boolean' + NCI C-Code: C207549 + Preferred Term: Study Design Population Includes Healthy Subjects Indicator + Definition: An indication as to whether the study design population includes + healthy subjects, that is, subjects without the disease or condition under + study. + Cardinality: '1' + Relationship Type: Value + Model Name: includesHealthySubjects + Model Representation: Attribute + Inherited From: + - $ref: '#/PopulationDefinition' + plannedAge: + Type: + - $ref: '#/Range' + NCI C-Code: C207450 + Preferred Term: Study Design Population Planned Age + Definition: The anticipated age of subjects within the study design population. + Cardinality: 0..1 + Relationship Type: Value + Model Name: plannedAge + Model Representation: Attribute + Inherited From: + - $ref: '#/PopulationDefinition' + plannedCompletionNumber: + Type: + - $ref: '#/QuantityRange' + NCI C-Code: C207451 + Preferred Term: Study Design Population Planned Completion Number + Definition: The value representing the planned number of subjects that must + complete the study in order to meet the objectives and endpoints of the study, + within the study design population. + Cardinality: 0..1 + Relationship Type: Value + Model Name: plannedCompletionNumber + Model Representation: Attribute + Inherited From: + - $ref: '#/PopulationDefinition' + plannedEnrollmentNumber: + Type: + - $ref: '#/QuantityRange' + NCI C-Code: C207452 + Preferred Term: Study Design Population Planned Enrollment Number + Definition: The value representing the planned number of subjects to be entered + in a clinical trial, within the study design population. + Cardinality: 0..1 + Relationship Type: Value + Model Name: plannedEnrollmentNumber + Model Representation: Attribute + Inherited From: + - $ref: '#/PopulationDefinition' + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215512 + Preferred Term: Study Design Population Notes + Definition: A brief written record relevant to the study design population. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + Inherited From: + - $ref: '#/PopulationDefinition' + criterionIds: + Type: + - $ref: '#/EligibilityCriterion' + Definition: A USDM relationship between the StudyDesignPopulation and EligibilityCriterion + classes which identifies the set of eligibility criteria associated with the + study design population. + Cardinality: 0..* + Relationship Type: Ref + Model Name: criteria + Model Representation: Relationship + Inherited From: + - $ref: '#/PopulationDefinition' + cohorts: + Type: + - $ref: '#/StudyCohort' + Definition: A USDM relationship between the StudyDesignPopulation and StudyCohort + classes which identifies the set of study cohorts associated with the study + design population. + Cardinality: 0..* + Relationship Type: Value + Model Name: cohorts + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +StudyElement: + NCI C-Code: C142735 + Preferred Term: Study Design Element + Definition: 'A basic building block for time within a clinical study comprising + the following characteristics: a description of what happens to the subject during + the element; a definition of the start of the element; a rule for ending the element.' + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C188833 + Preferred Term: Study Design Element Name + Definition: The literal identifier (i.e., distinctive designation) of the study + design element. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C207554 + Preferred Term: Study Design Element Label + Definition: The short descriptive designation for the study design element. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C188834 + Preferred Term: Study Design Element Description + Definition: A narrative representation of the study design element. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215517 + Preferred Term: Study Element Notes + Definition: A brief written record relevant to the study element. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + transitionEndRule: + Type: + - $ref: '#/TransitionRule' + Definition: A USDM relationship between the StudyElement and TransitionRule + classes which provides the details associated with a transition rule used + to trigger the end of a study element. + Cardinality: 0..1 + Relationship Type: Value + Model Name: transitionEndRule + Model Representation: Relationship + studyInterventionIds: + Type: + - $ref: '#/StudyIntervention' + Definition: A USDM relationship between the StudyElement and StudyIntervention + classes which identifies the set of study interventions associated with the + study element. + Cardinality: 0..* + Relationship Type: Ref + Model Name: studyInterventions + Model Representation: Relationship + transitionStartRule: + Type: + - $ref: '#/TransitionRule' + Definition: A USDM relationship between the StudyElement and TransitionRule + classes which provides the details associated with a transition rule used + to trigger the start of a study element. + Cardinality: 0..1 + Relationship Type: Value + Model Name: transitionStartRule + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +StudyEpoch: + NCI C-Code: C71738 + Preferred Term: Study Epoch + Definition: A named time period defined in the protocol, wherein a study activity + is specified and unchanging throughout the interval, to support a study-specific + purpose. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C93825 + Preferred Term: Study Epoch Name + Definition: The literal identifier (i.e., distinctive designation) of the study + epoch, i.e., the named time period defined in the protocol, wherein a study + activity is specified and unchanging throughout the interval, to support a + study-specific purpose. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C207555 + Preferred Term: Study Epoch Label + Definition: The short descriptive designation for the study epoch. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C93824 + Preferred Term: Study Epoch Description + Definition: A narrative representation of the study epoch. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + type: + Type: + - $ref: '#/Code' + NCI C-Code: C188830 + Preferred Term: Study Epoch Type + Definition: A characterization or classification of the study epoch, i.e., the + named time period defined in the protocol, wherein a study activity is specified + and unchanging throughout the interval, to support a study-specific purpose. + Cardinality: '1' + Relationship Type: Value + Model Name: type + Model Representation: Attribute + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215516 + Preferred Term: Study Epoch Notes + Definition: A brief written record relevant to the study epoch. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + previousId: + Type: + - $ref: '#/StudyEpoch' + Definition: A USDM relationship within the StudyEpoch class which identifies + the study epoch that chronologically precedes the current study epoch. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: previous + Model Representation: Relationship + nextId: + Type: + - $ref: '#/StudyEpoch' + Definition: A USDM relationship within the StudyEpoch class which identifies + the study epoch that chronologically follows the current study epoch. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: next + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +StudyIdentifier: + NCI C-Code: C83082 + Preferred Term: Study Identifier + Definition: A sequence of characters used to identify, name, or characterize the + study. + Modifier: Concrete + Super Classes: + - $ref: '#/Identifier' + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + Inherited From: + - $ref: '#/Identifier' + text: + Type: + - $ref: '#/string' + NCI C-Code: C215507 + Preferred Term: Study Identifier Text + Definition: An instance of structured text that represents the study identifier. + Cardinality: '1' + Relationship Type: Value + Model Name: text + Model Representation: Attribute + Inherited From: + - $ref: '#/Identifier' + scopeId: + Type: + - $ref: '#/Organization' + Definition: A USDM relationship between the StudyIdentifier and Organization + classes which provides the details associated with each organization that + has assigned the study identifier. + Cardinality: '1' + Relationship Type: Ref + Model Name: scope + Model Representation: Relationship + Inherited From: + - $ref: '#/Identifier' + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +StudyIntervention: + NCI C-Code: C207649 + Preferred Term: Study Intervention + Definition: Any agent, device, or procedure being tested or used as a reference + or comparator in the conduct of a clinical trial. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C207558 + Preferred Term: Study Intervention Name + Definition: The literal identifier (i.e., distinctive designation) of the study + intervention. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C207556 + Preferred Term: Study Intervention Label + Definition: The short descriptive designation for the study intervention. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C207647 + Preferred Term: Study Intervention Description + Definition: A narrative representation of the study intervention. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + role: + Type: + - $ref: '#/Code' + NCI C-Code: C207560 + Preferred Term: Study Intervention Role + Definition: The intended use of the trial intervention within the context of + the study design. + Cardinality: '1' + Relationship Type: Value + Model Name: role + Model Representation: Attribute + type: + Type: + - $ref: '#/Code' + NCI C-Code: C98747 + Preferred Term: Study Intervention Type + Definition: The kind of product or procedure studied in a trial. + Cardinality: '1' + Relationship Type: Value + Model Name: type + Model Representation: Attribute + codes: + Type: + - $ref: '#/Code' + NCI C-Code: C207648 + Preferred Term: Study Intervention Code + Definition: A symbol or combination of symbols which is assigned to the study + intervention. + Cardinality: 0..* + Relationship Type: Value + Model Name: codes + Model Representation: Attribute + minimumResponseDuration: + Type: + - $ref: '#/Quantity' + NCI C-Code: C207557 + Preferred Term: Study Intervention Minimum Response Duration + Definition: The value representing the minimum amount of time required to meet + the criteria for response to study intervention. + Cardinality: 0..1 + Relationship Type: Value + Model Name: minimumResponseDuration + Model Representation: Attribute + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215543 + Preferred Term: Study Intervention Notes + Definition: A brief written record relevant to the study intervention. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + administrations: + Type: + - $ref: '#/Administration' + Definition: A USDM relationship between the StudyIntervention and AgentAdministration + classes which identifies the set of agent administrations associated with + the study intervention. + Cardinality: 0..* + Relationship Type: Value + Model Name: administrations + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +StudyRole: + NCI C-Code: C215497 + Preferred Term: Study Role + Definition: A designation that identifies the function of study personnel or an + organization within the context of the study. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C215600 + Preferred Term: Study Role Name + Definition: The literal identifier (i.e., distinctive designation) of the study + role. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C215602 + Preferred Term: Study Role Label + Definition: The short descriptive designation for the study role. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C215601 + Preferred Term: Study Role Description + Definition: A narrative representation of the study role. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + code: + Type: + - $ref: '#/Code' + NCI C-Code: C215603 + Preferred Term: Study Role Code + Definition: A symbol or combination of symbols which is assigned to the study + role. + Cardinality: '1' + Relationship Type: Value + Model Name: code + Model Representation: Attribute + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C216994 + Preferred Term: Study Role Notes + Definition: A brief written record relevant to the study role. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + assignedPersons: + Type: + - $ref: '#/AssignedPerson' + Definition: A USDM relationship between the StudyRole and AssignedPerson classes + that identifies the set of individuals that are assigned to fill a particular + role within the study. + Cardinality: 0..* + Relationship Type: Value + Model Name: assignedPersons + Model Representation: Relationship + masking: + Type: + - $ref: '#/Masking' + Definition: A USDM relationship between the StudyRole and Masking classes which + describes the masking associated with the study role. + Cardinality: 0..1 + Relationship Type: Value + Model Name: masking + Model Representation: Relationship + organizationIds: + Type: + - $ref: '#/Organization' + Definition: A USDM relationship between the StudyRole and Organization classes + which identifies the set of organizations associated with the study role. + Cardinality: 0..* + Relationship Type: Ref + Model Name: organizations + Model Representation: Relationship + appliesToIds: + Type: + - $ref: '#/StudyVersion' + - $ref: '#/StudyDesign' + Definition: A USDM relationship between the StudyRole and either StudyVersion + or StudyDesign classes that identifies the study version or study design to + which the study role applies. + Cardinality: 0..* + Relationship Type: Ref + Model Name: appliesTo + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +StudySite: + NCI C-Code: C80403 + Preferred Term: Study Site + Definition: The location at which a study investigator conducts study activities. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C207566 + Preferred Term: Study Site Name + Definition: The literal identifier (i.e., distinctive designation) of the study + site. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C207565 + Preferred Term: Study Site Label + Definition: The short descriptive designation for the study site. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C207564 + Preferred Term: Study Site Description + Definition: A narrative representation of the study site. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + country: + Type: + - $ref: '#/Code' + NCI C-Code: C170990 + Preferred Term: Country of Study Site + Definition: The country in which the study site is located. + Cardinality: '1' + Relationship Type: Value + Model Name: country + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +StudyTitle: + NCI C-Code: C49802 + Preferred Term: Study Title + Definition: The sponsor-defined name of the clinical study. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + type: + Type: + - $ref: '#/Code' + NCI C-Code: C207568 + Preferred Term: Study Title Type + Definition: A characterization or classification of the study title. + Cardinality: '1' + Relationship Type: Value + Model Name: type + Model Representation: Attribute + text: + Type: + - $ref: '#/string' + NCI C-Code: C207567 + Preferred Term: Study Title Text + Definition: An instance of unstructured text that represents the study title. + Cardinality: '1' + Relationship Type: Value + Model Name: text + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +StudyVersion: + NCI C-Code: C188816 + Preferred Term: Study Version + Definition: A plan at a particular point in time for a study. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + versionIdentifier: + Type: + - $ref: '#/string' + NCI C-Code: C207570 + Preferred Term: Study Version Identifier + Definition: A sequence of characters used to identify, name, or characterize + the study version. + Cardinality: '1' + Relationship Type: Value + Model Name: versionIdentifier + Model Representation: Attribute + businessTherapeuticAreas: + Type: + - $ref: '#/Code' + NCI C-Code: C201322 + Preferred Term: Business Therapeutic Areas + Definition: A therapeutic area classification based on the structure and operations + of the business unit. + Cardinality: 0..* + Relationship Type: Value + Model Name: businessTherapeuticAreas + Model Representation: Attribute + rationale: + Type: + - $ref: '#/string' + NCI C-Code: C94122 + Preferred Term: Study Rationale + Definition: A statement describing the overall rationale of the study. This + field describes the contribution of this study to product development, i.e., + what knowledge is being contributed from the conduct of this study. + Cardinality: '1' + Relationship Type: Value + Model Name: rationale + Model Representation: Attribute + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215539 + Preferred Term: Study Version Notes + Definition: A brief written record relevant to the study version. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + abbreviations: + Type: + - $ref: '#/Abbreviation' + Definition: A USDM relationship between the StudyVersion and Abbreviation classes + which provides the set of abbreviations associated with the study version. + Cardinality: 0..* + Relationship Type: Value + Model Name: abbreviations + Model Representation: Relationship + dateValues: + Type: + - $ref: '#/GovernanceDate' + Definition: A USDM relationship between the StudyVersion and GovernanceDate + classes which provides the set of governance dates associated with the study + version. + Cardinality: 0..* + Relationship Type: Value + Model Name: dateValues + Model Representation: Relationship + referenceIdentifiers: + Type: + - $ref: '#/ReferenceIdentifier' + Definition: A USDM relationship between the StudyVersion and ReferenceIdentifier + classes which identifies the set of reference identifiers associated with + the study version. + Cardinality: 0..* + Relationship Type: Value + Model Name: referenceIdentifiers + Model Representation: Relationship + amendments: + Type: + - $ref: '#/StudyAmendment' + Definition: A USDM relationship between the StudyVersion and StudyAmendment + classes which identifies the set of study amendments associated with the study + version. + Cardinality: 0..* + Relationship Type: Value + Model Name: amendments + Model Representation: Relationship + documentVersionIds: + Type: + - $ref: '#/StudyDefinitionDocumentVersion' + Definition: A USDM relationship between the StudyVersion and StudyDefinitionDocumentVersion + classes which identifies the version of the study definition document associated + with the study version. + Cardinality: 0..* + Relationship Type: Ref + Model Name: documentVersions + Model Representation: Relationship + studyDesigns: + Type: + - $ref: '#/StudyDesign' + Definition: A USDM relationship between the StudyVersion and StudyDesign classes + which identifies the set of study designs associated with the study version. + Cardinality: 0..* + Relationship Type: Value + Model Name: studyDesigns + Model Representation: Relationship + studyIdentifiers: + Type: + - $ref: '#/StudyIdentifier' + Definition: A USDM relationship between the StudyVersion and StudyIdentifier + classes which identifies the set of study identifiers associated with the + study version. + Cardinality: 1..* + Relationship Type: Value + Model Name: studyIdentifiers + Model Representation: Relationship + titles: + Type: + - $ref: '#/StudyTitle' + Definition: A USDM relationship between the StudyVersion and StudyTitle classes + which identifies the set of study titles associated with the study version. + Cardinality: 1..* + Relationship Type: Value + Model Name: titles + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + eligibilityCriterionItems: + Type: + - $ref: '#/EligibilityCriterionItem' + Cardinality: 0..* + Relationship Type: Value + narrativeContentItems: + Type: + - $ref: '#/NarrativeContentItem' + Cardinality: 0..* + Relationship Type: Value + roles: + Type: + - $ref: '#/StudyRole' + Cardinality: 0..* + Relationship Type: Value + organizations: + Type: + - $ref: '#/Organization' + Cardinality: 0..* + Relationship Type: Value + studyInterventions: + Type: + - $ref: '#/StudyIntervention' + Cardinality: 0..* + Relationship Type: Value + administrableProducts: + Type: + - $ref: '#/AdministrableProduct' + Cardinality: 0..* + Relationship Type: Value + medicalDevices: + Type: + - $ref: '#/MedicalDevice' + Cardinality: 0..* + Relationship Type: Value + productOrganizationRoles: + Type: + - $ref: '#/ProductOrganizationRole' + Cardinality: 0..* + Relationship Type: Value + biomedicalConcepts: + Type: + - $ref: '#/BiomedicalConcept' + Cardinality: 0..* + Relationship Type: Value + bcCategories: + Type: + - $ref: '#/BiomedicalConceptCategory' + Cardinality: 0..* + Relationship Type: Value + bcSurrogates: + Type: + - $ref: '#/BiomedicalConceptSurrogate' + Cardinality: 0..* + Relationship Type: Value + dictionaries: + Type: + - $ref: '#/SyntaxTemplateDictionary' + Cardinality: 0..* + Relationship Type: Value + conditions: + Type: + - $ref: '#/Condition' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +SubjectEnrollment: + NCI C-Code: C37948 + Preferred Term: Subject Enrollment + Definition: The act of enrolling subjects into a study. The subject will have met + the inclusion/exclusion criteria to participate in the trial and will have signed + an informed consent form. (CDISC Glossary) + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C215540 + Preferred Term: Subject Enrollment Name + Definition: The literal identifier (i.e., distinctive designation) of the subject + enrollment. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C215542 + Preferred Term: Subject Enrollment Label + Definition: The short descriptive designation for the subject enrollment.. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C215541 + Preferred Term: Subject Enrollment Description + Definition: A narrative representation of the subject enrollment. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + quantity: + Type: + - $ref: '#/Quantity' + NCI C-Code: C207573 + Preferred Term: Subject Enrollment Quantity Value + Definition: The value representing the number of individuals enrolled in a study. + Cardinality: '1' + Relationship Type: Value + Model Name: quantity + Model Representation: Attribute + forGeographicScope: + Type: + - $ref: '#/GeographicScope' + Definition: A USDM relationship between the SubjectEnrollment and GeographicScope + classes which identifies the geographic scope to which the subject enrollment + applies. + Cardinality: 0..1 + Relationship Type: Value + Model Name: forGeographicScope + Model Representation: Relationship + forStudyCohortId: + Type: + - $ref: '#/StudyCohort' + Definition: A USDM relationship between the SubjectEnrollment and StudyCohort + classes which identifies the study cohort to which the subject enrollment + applies. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: forStudyCohort + Model Representation: Relationship + forStudySiteId: + Type: + - $ref: '#/StudySite' + Definition: A USDM relationship between the SubjectEnrollment and StudySite + classes which identifies the study site to which the subject enrollment applies. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: forStudySite + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +Substance: + NCI C-Code: C45306 + Preferred Term: Substance + Definition: Any matter of defined composition that has discrete existence, whose + origin may be biological, mineral or chemical. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C215586 + Preferred Term: Substance Name + Definition: The literal identifier (i.e., distinctive designation) of the substance. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C215588 + Preferred Term: Substance Label + Definition: The short descriptive designation for the substance. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C215587 + Preferred Term: Substance Description + Definition: A narrative representation of the substance. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + codes: + Type: + - $ref: '#/Code' + NCI C-Code: C215589 + Preferred Term: Substance Code + Definition: A symbol or combination of symbols which is assigned to the substance. + Cardinality: 0..* + Relationship Type: Value + Model Name: codes + Model Representation: Attribute + strengths: + Type: + - $ref: '#/Strength' + Definition: A USDM relationship between the Substance and Strength class which + provides the values of the strengths of the substance. + Cardinality: 1..* + Relationship Type: Value + Model Name: strengths + Model Representation: Relationship + referenceSubstance: + Type: + - $ref: '#/Substance' + Definition: A USDM relationship within the Substance class that identifies the + association between two substances, one of which is used as a reference for + the other. + Cardinality: 0..1 + Relationship Type: Value + Model Name: referenceSubstance + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +SyntaxTemplate: + NCI C-Code: C207596 + Preferred Term: Syntax Template + Definition: A standardized pattern used for the arrangement of words and phrases + to create well-formed, structured sentences. + Modifier: Abstract + Sub Classes: + - $ref: '#/Characteristic' + - $ref: '#/Condition' + - $ref: '#/EligibilityCriterionItem' + - $ref: '#/Endpoint' + - $ref: '#/IntercurrentEvent' + - $ref: '#/Objective' + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C207477 + Preferred Term: Characteristic Name + Definition: The literal identifier (i.e., distinctive designation) of the characteristic. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C207476 + Preferred Term: Characteristic Label + Definition: The short descriptive designation for the characteristic. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C207475 + Preferred Term: Characteristic Description + Definition: A narrative representation of the characteristic. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + text: + Type: + - $ref: '#/string' + NCI C-Code: C207478 + Preferred Term: Characteristic Text + Definition: An instance of structured text that represents the characteristic. + Cardinality: '1' + Relationship Type: Value + Model Name: text + Model Representation: Attribute + notes: + Type: + - $ref: '#/CommentAnnotation' + NCI C-Code: C215548 + Preferred Term: Characteristic Notes + Definition: A brief written record relevant to the characteristic. + Cardinality: 0..* + Relationship Type: Value + Model Name: notes + Model Representation: Attribute + dictionaryId: + Type: + - $ref: '#/SyntaxTemplateDictionary' + Definition: A USDM relationship between the Characteristic and SyntaxTemplateDictionary + classes which provides the set of dictionary entries related to characteristics. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: dictionary + Model Representation: Relationship +SyntaxTemplateDictionary: + NCI C-Code: C207597 + Preferred Term: Syntax Template Dictionary + Definition: A reference source that provides a listing of valid parameter names + and values used in syntax template text strings. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C207581 + Preferred Term: Syntax Template Dictionary Name + Definition: The literal identifier (i.e., distinctive designation) of the syntax + template dictionary. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C207580 + Preferred Term: Syntax Template Dictionary Label + Definition: The short descriptive designation for the syntax template dictionary. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C207579 + Preferred Term: Syntax Template Dictionary Description + Definition: A narrative representation of the syntax template dictionary. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + parameterMaps: + Type: + - $ref: '#/ParameterMap' + Definition: A USDM relationship between the SyntaxTemplateDictionary and ParameterMap + classes which identifies the set of parameter maps (parameter map entries) + associated with a syntax template dictionary. + Cardinality: 1..* + Relationship Type: Value + Model Name: parameterMaps + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +Timing: + NCI C-Code: C80484 + Preferred Term: Timing + Definition: The chronological relationship between temporal events. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C207584 + Preferred Term: Timing Name + Definition: The literal identifier (i.e., distinctive designation) of the timing. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C207583 + Preferred Term: Timing Label + Definition: The short descriptive designation for the timing. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C164648 + Preferred Term: Timing Description + Definition: A narrative representation of the chronological relationship between + temporal events. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + type: + Type: + - $ref: '#/Code' + NCI C-Code: C201298 + Preferred Term: Timing Type + Definition: A characterization or classification of the chronological relationship + between temporal events. + Cardinality: '1' + Relationship Type: Value + Model Name: type + Model Representation: Attribute + relativeToFrom: + Type: + - $ref: '#/Code' + NCI C-Code: C201297 + Preferred Term: Timing Relative To From + Definition: The name of the reference event used to define the temporal relationship + with another event. + Cardinality: '1' + Relationship Type: Value + Model Name: relativeToFrom + Model Representation: Attribute + value: + Type: + - $ref: '#/string' + NCI C-Code: C201341 + Preferred Term: Timing Value + Definition: The temporal value of the chronological relationship between temporal + events. + Cardinality: '1' + Relationship Type: Value + Model Name: value + Model Representation: Attribute + valueLabel: + Type: + - $ref: '#/string' + NCI C-Code: C207585 + Preferred Term: Timing Value Label + Definition: The short descriptive designation for the timing value. + Cardinality: '1' + Relationship Type: Value + Model Name: valueLabel + Model Representation: Attribute + windowLabel: + Type: + - $ref: '#/string' + NCI C-Code: C207586 + Preferred Term: Timing Window Label + Definition: The short descriptive designation for a time period, or other type + of interval, during which a temporal event may be achieved, obtained, or observed. + Cardinality: 0..1 + Relationship Type: Value + Model Name: windowLabel + Model Representation: Attribute + windowLower: + Type: + - $ref: '#/string' + NCI C-Code: C201342 + Preferred Term: Timing Window, Lower + Definition: The earliest chronological value of an allowable period of time + during which a temporal event takes place. + Cardinality: 0..1 + Relationship Type: Value + Model Name: windowLower + Model Representation: Attribute + windowUpper: + Type: + - $ref: '#/string' + NCI C-Code: C201343 + Preferred Term: Timing Window, Upper + Definition: The latest chronological value of an allowable period of time during + which a temporal event takes place. + Cardinality: 0..1 + Relationship Type: Value + Model Name: windowUpper + Model Representation: Attribute + relativeToScheduledInstanceId: + Type: + - $ref: '#/ScheduledInstance' + Definition: A USDM relationship between the Timing and ScheduledInstance classes + which identifies the scheduled instance (e.g., scheduled activity instances + or scheduled decision instances) to which the timing is relative to. + Cardinality: 0..1 + Relationship Type: Ref + Model Name: relativeToScheduledInstance + Model Representation: Relationship + relativeFromScheduledInstanceId: + Type: + - $ref: '#/ScheduledInstance' + Definition: A USDM relationship between the Timing and ScheduledInstance classes + which identifies the scheduled instance (e.g., scheduled activity instances + or scheduled decision instances) to which the timing applies. + Cardinality: '1' + Relationship Type: Ref + Model Name: relativeFromScheduledInstance + Model Representation: Relationship + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value +TransitionRule: + NCI C-Code: C82567 + Preferred Term: Transition Rule + Definition: A guide that governs the allocation of subjects to operational options + at a discrete decision point or branch (e.g., assignment to a particular arm, + discontinuation) within a clinical trial plan. + Modifier: Concrete + Attributes: + id: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value + Model Name: id + Model Representation: Attribute + name: + Type: + - $ref: '#/string' + NCI C-Code: C207588 + Preferred Term: Transition Rule Name + Definition: The literal identifier (i.e., distinctive designation) of the transition + rule. + Cardinality: '1' + Relationship Type: Value + Model Name: name + Model Representation: Attribute + label: + Type: + - $ref: '#/string' + NCI C-Code: C207587 + Preferred Term: Transition Rule Label + Definition: The short descriptive designation for the transition rule. + Cardinality: 0..1 + Relationship Type: Value + Model Name: label + Model Representation: Attribute + description: + Type: + - $ref: '#/string' + NCI C-Code: C188835 + Preferred Term: Transition Rule Description + Definition: A narrative representation of the transition rule. + Cardinality: 0..1 + Relationship Type: Value + Model Name: description + Model Representation: Attribute + text: + Type: + - $ref: '#/string' + NCI C-Code: C207589 + Preferred Term: Transition Rule Text + Definition: An instance of unstructured text that represents the transition + rule. + Cardinality: '1' + Relationship Type: Value + Model Name: text + Model Representation: Attribute + extensionAttributes: + Type: + - $ref: '#/ExtensionAttribute' + Cardinality: 0..* + Relationship Type: Value + instanceType: + Type: + - $ref: '#/string' + Cardinality: '1' + Relationship Type: Value From 0314c4a651f465d6184b0c02232c219ea3668c3c Mon Sep 17 00:00:00 2001 From: pendingintent <3921919+pendingintent@users.noreply.github.com> Date: Mon, 3 Aug 2026 11:42:45 -0400 Subject: [PATCH 12/20] CDISC rebranding applied to style.css. --- src/soa_builder/web/static/style.css | 155 +++++++++++------- src/soa_builder/web/templates/base.html | 6 +- .../web/templates/bc_explorer.html | 19 +-- .../web/templates/freeze_modal.html | 8 +- 4 files changed, 115 insertions(+), 73 deletions(-) diff --git a/src/soa_builder/web/static/style.css b/src/soa_builder/web/static/style.css index 28a254f..6857a71 100644 --- a/src/soa_builder/web/static/style.css +++ b/src/soa_builder/web/static/style.css @@ -5,22 +5,34 @@ z-index: 1; top: 0; left: 0; - background-color: #111; + background-color: var(--cdisc-navy); overflow-x: hidden; padding-top: 20px; } +.am-sidenav-brand { + padding: 0 16px 16px; + text-align: center; +} + +.am-sidenav-logo { + max-width: 120px; + height: auto; + display: block; + margin: 0 auto; +} + .sidenav a { padding: 6px 8px 6px 16px; text-decoration: none; font-size: 20px; - color: #818181; + color: var(--am-sidenav-link); display: block; } .sidenav a:hover { - color: #f1f1f1; - background-color: #575757; + color: var(--cdisc-white); + background-color: var(--cdisc-blue-700); } /* Reset list styles */ @@ -40,12 +52,12 @@ padding: 6px 8px 6px 16px; text-decoration: none; font-size: 20px; - color: #818181; + color: var(--am-sidenav-link); } .sidenav ul > li > a:hover { - color: #f1f1f1; - background-color: #575757; + color: var(--cdisc-white); + background-color: var(--cdisc-blue-700); } /* Submenu hidden by default */ @@ -64,28 +76,29 @@ } .sidenav ul > li.open > a { - color: #f1f1f1; + color: var(--cdisc-white); } /* Submenu item styling */ .sidenav ul li ul li a { display: block; padding-left: 30px; - background-color: #444; + background-color: var(--am-sidenav-submenu-bg); font-size: 18px; text-decoration: none; - color: #818181; + color: var(--am-sidenav-link); } .sidenav ul li ul li a:hover { - background-color: #575757; - color: #f1f1f1; + background-color: var(--cdisc-blue-700); + color: var(--cdisc-white); } body { margin: 0; - font-family: Arial, Helvetica, sans-serif + font-family: Arial, Helvetica, "Segoe UI", system-ui, sans-serif; } +button, input, select, textarea { font-family: inherit; } .main { margin-left: 220px; @@ -98,20 +111,20 @@ body { } .table, table { border-collapse: collapse; } -th, td { border: 1px solid #ccc; padding: 4px 8px; font-size: 0.9rem; } -th { background: #f2f2f2; } +th, td { border: 1px solid var(--am-border-med); padding: 4px 8px; font-size: 0.9rem; } +th { background: var(--am-surface); } .flex { display: flex; gap: 2rem; } .matrix td.cell { cursor: pointer; min-width: 40px; text-align: center; } .matrix td.cell:hover { background: #ffe; } form input { margin-right: 0.5rem; } button { cursor: pointer; } -.delete-btn { background:#c62828; color:#fff; border:none; padding:0 6px; cursor:pointer; } -.delete-btn:hover { background:#b71c1c; } +.delete-btn { background: var(--am-danger); color:#fff; border:none; padding:0 6px; cursor:pointer; } +.delete-btn:hover { background: var(--am-danger-hover); } .export-buttons { margin-top:8px; } -.export-buttons .btn { display:inline-block; margin-right:10px; background:#1976d2; color:#fff; padding:4px 10px; text-decoration:none; border-radius:3px; font-size:0.9em; } -.export-buttons .btn:hover { background:#125aa0; } -.small-btn { background:#2e7d32; color:#fff; border:none; padding:2px 8px; margin-top:4px; cursor:pointer; font-size:0.75em; } -.small-btn:hover { background:#1b5e20; } +.export-buttons .btn { display:inline-block; margin-right:10px; background: var(--am-slate); color:#fff; padding:4px 10px; text-decoration:none; border-radius:3px; font-size:0.9em; } +.export-buttons .btn:hover { background: var(--am-slate-dark); } +.small-btn { background: var(--am-success); color:#fff; border:none; padding:2px 8px; margin-top:4px; cursor:pointer; font-size:0.75em; } +.small-btn:hover { background: var(--am-success-hover); } details.collapsible { border: 1px solid var(--am-border); border-radius: var(--am-radius); @@ -158,29 +171,55 @@ details.collapsible > *:not(summary) { padding: 0 14px 12px; } ================================================================ */ :root { - --am-purple: #6a1b9a; - --am-purple-hover: #5a1580; - --am-purple-light: #f5eeff; - --am-purple-border: #d8b4fe; - --am-slate: #455a64; - --am-slate-dark: #37474f; - --am-danger: #c62828; - --am-danger-hover: #a91e1e; - --am-success: #2e7d32; - --am-warn: #e65100; - --am-info: #1565c0; - --am-border: #e2e8f0; - --am-border-med: #cbd5e1; - --am-surface: #f8fafc; - --am-surface-purple:#faf5ff; - --am-text: #1e293b; - --am-text-mid: #475569; - --am-text-muted: #94a3b8; - --am-radius: 6px; - --am-radius-sm: 3px; - --am-shadow-sm: 0 1px 3px rgba(0,0,0,0.06); - --am-shadow: 0 2px 8px rgba(0,0,0,0.08); - --am-mono: 'SF Mono','Consolas','Liberation Mono',monospace; + /* CDISC official brand palette — source of truth, do not use directly + in selectors; reference via the semantic --am-* names below. */ + --cdisc-blue: #134678; + --cdisc-purple: #553278; + --cdisc-orange: #D57E00; + --cdisc-green: #286040; + --cdisc-light-blue: #40B4E5; + --cdisc-teal: #A1D0CA; + --cdisc-red: #C94543; + --cdisc-dark-gray: #525349; + --cdisc-yellow-green: #AAAD00; + --cdisc-yellow: #FFCE00; + --cdisc-gold: #EDAA00; + --cdisc-light-gray: #929288; + --cdisc-bg: #F5F5F5; + --cdisc-white: #FFFFFF; + --cdisc-navy: #0E2841; + --cdisc-blue-700: #0f3a63; + + --am-primary: var(--cdisc-blue); + --am-primary-hover: var(--cdisc-blue-700); + --am-purple: var(--cdisc-purple); + --am-purple-hover: #452868; + --am-purple-light: #f3eef8; + --am-purple-border: #c9b8dc; + --am-slate: #455a64; + --am-slate-dark: #37474f; + --am-danger: var(--cdisc-red); + --am-danger-hover: #a73938; + --am-success: var(--cdisc-green); + --am-success-hover: #1e4830; + --am-warn: #e65100; + --am-info: var(--cdisc-purple); + --am-info-hover: #452868; + --am-sidenav-link: #B9C6D4; + --am-sidenav-submenu-bg: #163a5c; + --am-border: #e2e8f0; + --am-border-med: #cbd5e1; + --am-surface: #f8fafc; + --am-surface-purple: #faf5ff; + --am-text: #1e293b; + --am-text-mid: #475569; + --am-text-muted: #94a3b8; + --am-white: var(--cdisc-white); + --am-radius: 6px; + --am-radius-sm: 3px; + --am-shadow-sm: 0 1px 3px rgba(0,0,0,0.06); + --am-shadow: 0 2px 8px rgba(0,0,0,0.08); + --am-mono: 'SF Mono','Consolas','Liberation Mono',monospace; } /* ---- Back / nav links ---------------------------------------- */ @@ -333,8 +372,8 @@ details.collapsible > *:not(summary) { padding: 0 14px 12px; } .am-textarea:focus, .am-select:focus { outline: none; - border-color: var(--am-purple); - box-shadow: 0 0 0 3px rgba(106,27,154,0.1); + border-color: var(--am-primary); + box-shadow: 0 0 0 3px rgba(19,70,120,0.1); } .am-textarea { resize: vertical; min-height: 54px; } @@ -350,8 +389,8 @@ details.collapsible > *:not(summary) { padding: 0 14px 12px; } } .am-input-sm:focus { outline: none; - border-color: var(--am-purple); - box-shadow: 0 0 0 2px rgba(106,27,154,0.1); + border-color: var(--am-primary); + box-shadow: 0 0 0 2px rgba(19,70,120,0.1); } .am-input-xs-w { width: 70px; } .am-input-flex { flex: 1; min-width: 120px; } @@ -376,8 +415,8 @@ details.collapsible > *:not(summary) { padding: 0 14px 12px; } } .am-btn:active { transform: translateY(1px); } -.am-btn-primary { background: var(--am-purple); color: #fff; } -.am-btn-primary:hover { background: var(--am-purple-hover); color: #fff; } +.am-btn-primary { background: var(--am-primary); color: #fff; } +.am-btn-primary:hover { background: var(--am-primary-hover); color: #fff; } .am-btn-slate { background: var(--am-slate); color: #fff; } .am-btn-slate:hover { background: var(--am-slate-dark); color: #fff; } @@ -386,10 +425,10 @@ details.collapsible > *:not(summary) { padding: 0 14px 12px; } .am-btn-danger:hover { background: var(--am-danger-hover); color: #fff; } .am-btn-success { background: var(--am-success); color: #fff; } -.am-btn-success:hover { background: #1b5e20; color: #fff; } +.am-btn-success:hover { background: var(--am-success-hover); color: #fff; } .am-btn-info { background: var(--am-info); color: #fff; } -.am-btn-info:hover { background: #0d47a1; color: #fff; } +.am-btn-info:hover { background: var(--am-info-hover); color: #fff; } .am-btn-sm { padding: 3px 10px; font-size: 0.80em; } .am-btn-xs { padding: 1px 7px; font-size: 0.76em; } @@ -607,8 +646,8 @@ details.collapsible > *:not(summary) { padding: 0 14px 12px; } } .fz-version-input:focus { outline: none; - border-color: var(--am-purple); - box-shadow: 0 0 0 3px rgba(106,27,154,0.1); + border-color: var(--am-primary); + box-shadow: 0 0 0 3px rgba(19,70,120,0.1); } .fz-feedback { font-size: 0.78em; @@ -713,8 +752,8 @@ details.collapsible > *:not(summary) { padding: 0 14px 12px; } } .fz-table .am-input-compact:focus { outline: none; - border-color: var(--am-purple); - box-shadow: 0 0 0 2px rgba(106,27,154,0.1); + border-color: var(--am-primary); + box-shadow: 0 0 0 2px rgba(19,70,120,0.1); } .fz-table .am-select-compact { width: 100%; @@ -767,7 +806,7 @@ details.collapsible > *:not(summary) { padding: 0 14px 12px; } margin: 0 0 10px; font-size: 0.78em; font-weight: 700; - color: #1565c0; + color: var(--am-info); text-transform: uppercase; letter-spacing: 0.07em; } @@ -1369,7 +1408,7 @@ details.collapsible > *:not(summary) { padding: 0 14px 12px; } .am-modal-btn-md { padding: 4px 8px; border-radius: 4px; } .am-modal-btn-lg { padding: 4px 10px; border-radius: 4px; } .am-modal-btn-info { background: var(--am-info); } -.am-modal-btn-purple { background: var(--am-purple); } +.am-modal-btn-primary { background: var(--am-primary); } .am-modal-btn-slate { background: var(--am-slate); } .am-modal-color-success { color: var(--am-success); } .am-modal-color-danger-text { color: var(--am-danger); } diff --git a/src/soa_builder/web/templates/base.html b/src/soa_builder/web/templates/base.html index 67faa80..be95ec6 100644 --- a/src/soa_builder/web/templates/base.html +++ b/src/soa_builder/web/templates/base.html @@ -3,11 +3,15 @@ SoA Workbench - + +
      +
      + +
      🏠 Home diff --git a/src/soa_builder/web/templates/bc_explorer.html b/src/soa_builder/web/templates/bc_explorer.html index 016e703..9874262 100644 --- a/src/soa_builder/web/templates/bc_explorer.html +++ b/src/soa_builder/web/templates/bc_explorer.html @@ -12,18 +12,17 @@ {% else %}
      ComponentDownloadDownload