Pydantic models for validating OHDSI/Circe cohort definition schemas
Project description
OHDSI Cohort Schemas
Pydantic models for validating OHDSI/Circe cohort definition schemas. This library provides comprehensive type-safe validation for OHDSI cohort expressions, enabling:
- IDE Support: Full autocompletion and type checking for cohort definitions
- Schema Validation: Catch errors before sending to WebAPI
- Documentation: Living documentation via Pydantic models
- Interoperability: Consistent schema validation across tools
Attribution: This library is based on the cohort expression schema from the OHDSI Circe project. Test data and schema structures are derived from the official Circe backend test suite to ensure compatibility with OHDSI standards.
Installation
pip install ohdsi-cohort-schemas
Quick Start
from ohdsi_cohort_schemas import CohortExpression, validate_schema_only, validate_with_warnings
# Quick schema validation (fast, Pydantic-only)
try:
cohort = validate_schema_only(cohort_json)
print("✅ Valid schema!")
except ValidationError as e:
print(f"❌ Schema errors: {e}")
# Full validation with business logic checks (comprehensive)
result = validate_with_warnings(cohort_json)
if result.is_valid:
print("✅ Valid cohort definition!")
if result.warnings:
print("⚠️ Warnings:")
for warning in result.warnings:
print(f" - {warning}")
else:
print("❌ Validation failed:")
for error in result.errors:
print(f" - {error}")
Building Cohorts Programmatically
from ohdsi_cohort_schemas import CohortExpression, ConceptSet, ConceptSetItem, Concept
# Define a concept set
concept = Concept(
concept_id=201826,
concept_name="Type 2 diabetes mellitus",
standard_concept="S",
concept_code="44054006",
concept_class_id="Clinical Finding",
vocabulary_id="SNOMED",
domain_id="Condition"
)
concept_set_item = ConceptSetItem(
concept=concept,
include_descendants=True,
include_mapped=False,
is_excluded=False
)
concept_set = ConceptSet(
id=0,
name="Type 2 Diabetes",
expression=ConceptSetExpression(items=[concept_set_item])
)
# Build a complete cohort expression
cohort_expression = CohortExpression(
concept_sets=[concept_set],
primary_criteria=..., # Define primary criteria
inclusion_rules=[], # Optional inclusion rules
censoring_criteria=[] # Optional censoring criteria
)
Features
Complete Schema Coverage
- ✅ ConceptSets - Medical concept definitions with descendants
- ✅ PrimaryCriteria - Index event definitions
- ✅ InclusionRules - Additional filtering criteria
- ✅ CensoringCriteria - Observation period requirements
- ✅ All Criteria Types - Conditions, drugs, procedures, measurements, etc.
- ✅ Time Windows - Complex temporal relationships
- ✅ Demographics - Age, gender, race, ethnicity filters
Validation Features
- Dual Validation Modes: Fast schema-only validation or comprehensive business logic validation
- Schema Validation: Pure Pydantic validation for structure and types
- Business Logic Validation: Semantic checks for logical consistency and OHDSI best practices
- Type Safety: Full static type checking with mypy
- Runtime Validation: Comprehensive Pydantic validation
- Custom Validators: Domain-specific validation rules
- Error Messages: Clear, actionable validation errors
- JSON Schema: Generate JSON schemas for other tools
Documentation
Core Models
CohortExpression
The root model representing a complete cohort definition:
class CohortExpression(BaseModel):
concept_sets: List[ConceptSet]
primary_criteria: PrimaryCriteria
qualified_limit: Optional[Limit] = None
expression_limit: Optional[Limit] = None
inclusion_rules: List[InclusionRule] = []
end_strategy: Optional[EndStrategy] = None
censoring_criteria: List[CensoringCriteria] = []
collapse_settings: Optional[CollapseSettings] = None
censor_window: Optional[CensorWindow] = None
ConceptSet
Defines reusable groups of medical concepts:
class ConceptSet(BaseModel):
id: int
name: str
expression: ConceptSetExpression
class ConceptSetExpression(BaseModel):
items: List[ConceptSetItem]
class ConceptSetItem(BaseModel):
concept: Concept
include_descendants: bool = True
include_mapped: bool = False
is_excluded: bool = False
Criteria Types
Support for all OMOP domain criteria:
ConditionOccurrence- Medical conditionsDrugExposure- Medication exposuresDrugEra- Continuous drug exposure periodsProcedureOccurrence- Medical proceduresMeasurement- Lab values and vital signsObservation- Clinical observationsDeviceExposure- Medical device usageDeath- Death eventsVisitOccurrence- Healthcare encountersVisitDetail- Detailed visit informationObservationPeriod- Data availability periodsSpecimen- Biological specimen collection
Validation Examples
Schema-Only Validation (Fast)
from ohdsi_cohort_schemas import validate_schema_only
from pydantic import ValidationError
# Fast schema validation - structure and types only
try:
cohort = validate_schema_only(cohort_json)
print("✅ Valid schema!")
except ValidationError as e:
print(f"❌ Schema errors: {e}")
Business Logic Validation (Comprehensive)
from ohdsi_cohort_schemas import validate_with_warnings, validate_strict
# Validation with warnings for best practices
result = validate_with_warnings(cohort_json)
if result.is_valid:
print("✅ Valid cohort definition!")
if result.warnings:
print("⚠️ Warnings:")
for warning in result.warnings:
print(f" - {warning}")
else:
print("❌ Validation failed:")
for error in result.errors:
print(f" - {error}")
# Strict validation - warnings treated as errors
try:
cohort = validate_strict(cohort_json)
print("✅ Perfect cohort definition!")
except ValidationError as e:
print(f"❌ Validation failed: {e}")
Advanced Business Logic Validation
from ohdsi_cohort_schemas import BusinessLogicValidator
# Custom validation with specific rules
validator = BusinessLogicValidator()
issues = validator.validate(cohort_json)
errors = [issue for issue in issues if issue.severity == 'error']
warnings = [issue for issue in issues if issue.severity == 'warning']
print(f"Found {len(errors)} errors and {len(warnings)} warnings")
for issue in errors:
print(f"❌ {issue.rule}: {issue.message}")
for issue in warnings:
print(f"⚠️ {issue.rule}: {issue.message}")
Legacy Validation API
from ohdsi_cohort_schemas import CohortExpression
from pydantic import ValidationError
# Direct Pydantic validation (legacy approach)
try:
cohort = CohortExpression.model_validate(cohort_json)
print("✅ Valid schema!")
except ValidationError as e:
print(f"❌ Schema errors:")
for error in e.errors():
print(f" - {error['loc']}: {error['msg']}")
JSON Schema Generation
from ohdsi_cohort_schemas import CohortExpression
# Generate JSON schema for other tools
schema = CohortExpression.model_json_schema()
# Save for use in other languages/tools
import json
with open("cohort_schema.json", "w") as f:
json.dump(schema, f, indent=2)
Test Data & Validation
Test Data Structure
Our comprehensive test suite uses official JSON examples from the OHDSI Circe project to ensure compatibility with real-world cohort definitions:
tests/resources/
├── checkers/ # Business logic validation test cases
│ ├── *Correct.json # Valid cohorts (should pass validation)
│ └── *Incorrect.json # Invalid cohorts (should fail validation)
├── conceptset/ # Standalone concept set expressions
└── cohortgeneration/ # Complete cohort definitions
Test Categories
- Schema Validation Tests: All JSON files are validated against our Pydantic models
- Business Logic Tests: Files ending with
Correct.jsonshould pass all validation rules - Negative Tests: Files ending with
Incorrect.jsonshould fail business logic validation - Concept Set Tests: Standalone concept set expressions for testing concept-related logic
Data Source Attribution
The test data originates from the official Circe test resources, ensuring our validation logic handles the same edge cases and patterns that the official OHDSI tools encounter.
Note: We've removed
_PREP.jsonand_VERIFY.jsonfiles from the original Circe test suite as these are used for database-level testing of SQL generation, not JSON schema validation. Our library focuses on validating cohort definition structure and business logic before database execution.
Contributing
We welcome contributions! Please see our Contributing Guide for details.
Attribution & License
Schema Source
This library implements Pydantic models for the cohort expression schema defined by the OHDSI Circe project. The schema structures, field definitions, and validation logic are derived from the official Circe backend to ensure full compatibility with OHDSI standards.
Test Data
The validation test suite uses official JSON examples from the Circe test resources to ensure our implementation correctly handles real-world cohort definitions.
OHDSI Ecosystem Compatibility
- License: Apache 2.0 (matching OHDSI ecosystem standards)
- Standards: Fully compatible with OHDSI WebAPI and ATLAS
- OMOP CDM: Supports the OMOP Common Data Model vocabulary standards
- Interoperability: Designed for seamless integration with other OHDSI tools
Acknowledgments
We gratefully acknowledge:
- OHDSI Collaborative for developing and maintaining the Circe cohort expression standards
- Pydantic for providing the validation framework
- OHDSI Community for the open-source ecosystem that makes this work possible
License
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ohdsi_cohort_schemas-0.1.0.tar.gz.
File metadata
- Download URL: ohdsi_cohort_schemas-0.1.0.tar.gz
- Upload date:
- Size: 19.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.1 CPython/3.13.1 Darwin/24.6.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f680f366268df87f3c2811852f91193f735952f695b1909136baf9694e3b25f2
|
|
| MD5 |
41e3e62ed2d462191f001a6deb9b17ef
|
|
| BLAKE2b-256 |
e3de18f4b4f32da37bbc50ae5106f3443b2c59f18624c430d22821a4faa6ea96
|
File details
Details for the file ohdsi_cohort_schemas-0.1.0-py3-none-any.whl.
File metadata
- Download URL: ohdsi_cohort_schemas-0.1.0-py3-none-any.whl
- Upload date:
- Size: 19.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.1 CPython/3.13.1 Darwin/24.6.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
40f6b27391e960ccbe8c54a35c5ec4fea201c0c67e564f424e6d148461efadce
|
|
| MD5 |
7a7d4badf91b2a867fb8679078d089e3
|
|
| BLAKE2b-256 |
3443f3c486de5234cd8a649ab6c8cbb6eff1c5bfb720121a1903d3efdf88e572
|