1620 lines
57 KiB
Markdown
1620 lines
57 KiB
Markdown
---
|
||
title: "Clinical Trial Design Feasibility Examples"
|
||
task: ""
|
||
lineage_type: import
|
||
upstream_source: https://github.com/mims-harvard/ToolUniverse/blob/e2520a96/skills/tooluniverse-clinical-trial-design/EXAMPLES.md
|
||
upstream_sha: e2520a96
|
||
imported_at: 2026-06-26
|
||
prompt_class: prompt
|
||
upstream_changes: accepted
|
||
author: upstream
|
||
validated: false
|
||
---
|
||
|
||
# Clinical Trial Design Feasibility Examples
|
||
|
||
Concrete examples of trial feasibility assessments using ToolUniverse.
|
||
|
||
---
|
||
|
||
## Example 1: Biomarker-Selected Oncology Trial (EGFR+ NSCLC)
|
||
|
||
**Scenario**: Assess feasibility of Phase 1/2 trial for novel EGFR inhibitor in EGFR L858R+ NSCLC patients who progressed on osimertinib.
|
||
|
||
### Setup
|
||
|
||
```python
|
||
from tooluniverse import ToolUniverse
|
||
|
||
tu = ToolUniverse(use_cache=True)
|
||
tu.load_tools()
|
||
|
||
# Trial parameters
|
||
indication = "EGFR L858R+ non-small cell lung cancer, osimertinib-resistant"
|
||
phase = "Phase 1/2"
|
||
primary_endpoint = "Objective Response Rate (ORR)"
|
||
biomarker = "EGFR L858R"
|
||
```
|
||
|
||
### Step 1: Patient Population Sizing
|
||
|
||
```python
|
||
# 1.1: Get disease prevalence
|
||
disease_info = tu.tools.OpenTargets_get_disease_id_description_by_name(
|
||
diseaseName="non-small cell lung cancer"
|
||
)
|
||
|
||
print(f"Disease: {disease_info['data']['name']}")
|
||
print(f"EFO ID: {disease_info['data']['id']}")
|
||
|
||
# Get phenotype/prevalence data
|
||
phenotypes = tu.tools.OpenTargets_get_diseases_phenotypes(
|
||
efoId=disease_info['data']['id']
|
||
)
|
||
|
||
# 1.2: Get biomarker prevalence from ClinVar
|
||
egfr_variants = tu.tools.ClinVar_search_variants(
|
||
gene="EGFR",
|
||
significance="pathogenic,likely_pathogenic"
|
||
)
|
||
|
||
# Filter to L858R
|
||
l858r_variants = [v for v in egfr_variants['data']
|
||
if 'L858R' in v.get('name', '')]
|
||
|
||
print(f"\nEGFR L858R variants found: {len(l858r_variants)}")
|
||
|
||
# 1.3: Cross-reference with population genetics
|
||
gnomad_egfr = tu.tools.gnomad_search_variants(
|
||
gene="EGFR"
|
||
)
|
||
|
||
# Filter to L858R (c.2573T>G)
|
||
l858r_gnomad = [v for v in gnomad_egfr['data']
|
||
if v.get('hgvs_c', '').startswith('c.2573T>G')]
|
||
|
||
# 1.4: Search literature for epidemiology
|
||
epi_papers = tu.tools.PubMed_search_articles(
|
||
query="EGFR L858R prevalence NSCLC epidemiology United States Asia",
|
||
max_results=30
|
||
)
|
||
|
||
print(f"\nEpidemiology papers found: {len(epi_papers['data'])}")
|
||
|
||
# Extract key papers
|
||
key_epi_papers = []
|
||
for paper in epi_papers['data'][:5]:
|
||
key_epi_papers.append({
|
||
'title': paper.get('title'),
|
||
'pmid': paper.get('pmid'),
|
||
'year': paper.get('pub_year')
|
||
})
|
||
|
||
# 1.5: Calculate patient availability
|
||
# From literature: NSCLC ~200K/year US, EGFR+ 15%, L858R 45% of EGFR+
|
||
us_nsclc_annual = 200000
|
||
egfr_positive_rate = 0.15
|
||
l858r_within_egfr = 0.45
|
||
|
||
l858r_annual = us_nsclc_annual * egfr_positive_rate * l858r_within_egfr
|
||
print(f"\nEstimated L858R+ NSCLC patients/year (US): {l858r_annual:.0f}")
|
||
|
||
# For osimertinib-resistant: assume ~80% progress on osimertinib
|
||
osimertinib_resistant = l858r_annual * 0.80
|
||
print(f"Osimertinib-resistant L858R+ patients/year: {osimertinib_resistant:.0f}")
|
||
|
||
# Apply eligibility criteria
|
||
eligibility_factors = {
|
||
'age_18_75': 0.85,
|
||
'ecog_0_1': 0.70,
|
||
'adequate_organ': 0.90,
|
||
'measurable_disease': 0.75,
|
||
'no_brain_mets': 0.60
|
||
}
|
||
|
||
eligible_pool = osimertinib_resistant
|
||
for criterion, factor in eligibility_factors.items():
|
||
eligible_pool *= factor
|
||
print(f" After {criterion}: {eligible_pool:.0f} ({factor*100:.0f}%)")
|
||
|
||
print(f"\nFinal eligible pool: {eligible_pool:.0f} patients/year")
|
||
|
||
# Enrollment projection for N=50
|
||
target_n = 50
|
||
sites = 15
|
||
capture_rate = 0.03 # 3% of eligible patients
|
||
monthly_enrollment = (eligible_pool * capture_rate) / 12 / sites
|
||
|
||
print(f"\nTarget enrollment: {target_n}")
|
||
print(f"Sites: {sites}")
|
||
print(f"Patients per site per month: {monthly_enrollment:.2f}")
|
||
print(f"Enrollment timeline: {target_n / (monthly_enrollment * sites):.1f} months")
|
||
```
|
||
|
||
**Expected Output**:
|
||
```
|
||
Disease: non-small cell lung cancer
|
||
EFO ID: EFO_0003060
|
||
|
||
EGFR L858R variants found: 12
|
||
|
||
Epidemiology papers found: 28
|
||
|
||
Estimated L858R+ NSCLC patients/year (US): 13500
|
||
Osimertinib-resistant L858R+ patients/year: 10800
|
||
|
||
After age_18_75: 9180 (85%)
|
||
After ecog_0_1: 6426 (70%)
|
||
After adequate_organ: 5783 (90%)
|
||
After measurable_disease: 4338 (75%)
|
||
After no_brain_mets: 2603 (60%)
|
||
|
||
Final eligible pool: 2603 patients/year
|
||
|
||
Target enrollment: 50
|
||
Sites: 15
|
||
Patients per site per month: 0.43
|
||
Enrollment timeline: 7.7 months
|
||
```
|
||
|
||
### Step 2: Biomarker Testing Strategy
|
||
|
||
```python
|
||
# 2.1: Search for FDA-approved companion diagnostics
|
||
cdx_papers = tu.tools.PubMed_search_articles(
|
||
query="FDA approved companion diagnostic EGFR L858R liquid biopsy",
|
||
max_results=20
|
||
)
|
||
|
||
print("FDA-approved CDx landscape:")
|
||
for paper in cdx_papers['data'][:5]:
|
||
print(f" - {paper.get('title')} (PMID: {paper.get('pmid')})")
|
||
|
||
# 2.2: Literature on testing turnaround time
|
||
tat_papers = tu.tools.PubMed_search_articles(
|
||
query="EGFR mutation testing turnaround time NGS liquid biopsy",
|
||
max_results=15
|
||
)
|
||
|
||
# From literature: NGS turnaround 7-14 days, liquid biopsy 7-10 days
|
||
testing_strategy = {
|
||
'primary_method': 'NGS (tissue)',
|
||
'turnaround': '10-14 days',
|
||
'cost': '$500-800',
|
||
'alternative': 'Liquid biopsy (ctDNA)',
|
||
'alternative_tat': '7-10 days',
|
||
'alternative_cost': '$300-500'
|
||
}
|
||
|
||
print(f"\nRecommended biomarker testing:")
|
||
for key, value in testing_strategy.items():
|
||
print(f" {key}: {value}")
|
||
```
|
||
|
||
### Step 3: Comparator Selection
|
||
|
||
```python
|
||
# 3.1: Get standard of care info (osimertinib)
|
||
comparator = "osimertinib"
|
||
|
||
comparator_info = tu.tools.drugbank_get_drug_basic_info_by_drug_name_or_id(
|
||
drug_name_or_drugbank_id=comparator
|
||
)
|
||
|
||
comparator_indications = tu.tools.drugbank_get_indications_by_drug_name_or_drugbank_id(
|
||
drug_name_or_drugbank_id=comparator
|
||
)
|
||
|
||
print(f"\nComparator: {comparator}")
|
||
print(f"Status: {comparator_info['data']['groups']}")
|
||
print(f"Indications: {len(comparator_indications['data'])}")
|
||
|
||
# 3.2: Get FDA approval details
|
||
fda_approval = tu.tools.OpenFDA_get_approval_history(
|
||
drug_name=comparator
|
||
)
|
||
|
||
if fda_approval and 'data' in fda_approval:
|
||
for approval in fda_approval['data'][:3]:
|
||
print(f"\n Approval: {approval.get('date', 'N/A')}")
|
||
print(f" Indication: {approval.get('indication', 'N/A')}")
|
||
|
||
# 3.3: Find historical control data from clinical trials
|
||
historical_trials = tu.tools.search_clinical_trials(
|
||
condition="EGFR positive non-small cell lung cancer",
|
||
intervention=comparator,
|
||
status="completed",
|
||
phase="2|3"
|
||
)
|
||
|
||
print(f"\n{comparator} trials found: {len(historical_trials['data'])}")
|
||
|
||
# Extract ORR data from key trials
|
||
for trial in historical_trials['data'][:3]:
|
||
print(f"\n NCT: {trial.get('nct_number')}")
|
||
print(f" Title: {trial.get('title')}")
|
||
print(f" Status: {trial.get('status')}")
|
||
# Note: Would parse results for ORR in real analysis
|
||
|
||
# 3.4: Single-arm vs. randomized design decision
|
||
print("\n" + "="*80)
|
||
print("COMPARATOR ANALYSIS SUMMARY")
|
||
print("="*80)
|
||
print(f"Standard of Care: {comparator} (FDA approved)")
|
||
print(f"Historical ORR: ~50-60% in osimertinib-naive, ~30% in T790M-resistant")
|
||
print(f"Comparator availability: Commercial supply available")
|
||
print(f"\nDesign recommendation: SINGLE-ARM PHASE 2")
|
||
print(f"Rationale:")
|
||
print(f" - Robust historical control data available (multiple trials)")
|
||
print(f" - Patient population narrowly defined (L858R, osimertinib-resistant)")
|
||
print(f" - Faster enrollment (no randomization)")
|
||
print(f" - Lower cost")
|
||
print(f" - Acceptable for Phase 2; randomized Phase 3 if successful")
|
||
```
|
||
|
||
### Step 4: Endpoint Selection
|
||
|
||
```python
|
||
# 4.1: Search for precedent trials using ORR
|
||
orr_precedent = tu.tools.search_clinical_trials(
|
||
condition="EGFR positive non-small cell lung cancer",
|
||
phase="2",
|
||
status="completed"
|
||
)
|
||
|
||
orr_trials_count = 0
|
||
pfs_trials_count = 0
|
||
|
||
for trial in orr_precedent['data']:
|
||
primary_outcome = trial.get('primary_outcome', '').lower()
|
||
if 'response rate' in primary_outcome or 'orr' in primary_outcome:
|
||
orr_trials_count += 1
|
||
if 'progression' in primary_outcome or 'pfs' in primary_outcome:
|
||
pfs_trials_count += 1
|
||
|
||
print("PRIMARY ENDPOINT ANALYSIS")
|
||
print("="*80)
|
||
print(f"Phase 2 trials in EGFR+ NSCLC: {len(orr_precedent['data'])}")
|
||
print(f" - Using ORR as primary: {orr_trials_count}")
|
||
print(f" - Using PFS as primary: {pfs_trials_count}")
|
||
|
||
# 4.2: FDA approval precedents using ORR
|
||
orr_approval_papers = tu.tools.PubMed_search_articles(
|
||
query="FDA approval objective response rate NSCLC EGFR inhibitor accelerated",
|
||
max_results=25
|
||
)
|
||
|
||
print(f"\nFDA approval papers with ORR: {len(orr_approval_papers['data'])}")
|
||
|
||
# Sample key approvals (from literature/knowledge):
|
||
fda_orr_approvals = [
|
||
{'drug': 'osimertinib', 'year': 2015, 'orr': '57%', 'n': 411, 'indication': 'T790M+'},
|
||
{'drug': 'dacomitinib', 'year': 2018, 'orr': '75%', 'n': 452, 'indication': '1L EGFR+'},
|
||
{'drug': 'mobocertinib', 'year': 2021, 'orr': '28%', 'n': 114, 'indication': 'exon20ins'}
|
||
]
|
||
|
||
print("\nFDA Approvals Using ORR (EGFR+ NSCLC):")
|
||
for approval in fda_orr_approvals:
|
||
print(f" {approval['drug']} ({approval['year']}): ORR {approval['orr']}, n={approval['n']}")
|
||
|
||
# 4.3: Statistical design for ORR
|
||
print("\n" + "="*80)
|
||
print("RECOMMENDED PRIMARY ENDPOINT: Objective Response Rate (ORR)")
|
||
print("="*80)
|
||
print("Evidence Grade: ★★★ (Regulatory precedent, multiple approvals)")
|
||
print("\nJustification:")
|
||
print(" 1. FDA-accepted for accelerated approval in EGFR+ NSCLC")
|
||
print(" 2. Feasible in Phase 2 (rapid readout, smaller N)")
|
||
print(" 3. Clinically meaningful (patient benefit)")
|
||
print(" 4. Standard assessment (RECIST 1.1, CT imaging)")
|
||
print("\nStatistical Design (Simon 2-stage):")
|
||
print(" - Null hypothesis (H0): ORR ≤ 15% (below clinically meaningful)")
|
||
print(" - Target ORR (H1): ORR ≥ 35% (clinically significant improvement)")
|
||
print(" - Alpha: 0.05 (one-sided), Beta: 0.20 (80% power)")
|
||
print(" - Stage 1: Enroll 13 patients")
|
||
print(" → If ≥ 2 responses, proceed to Stage 2")
|
||
print(" → If < 2 responses, stop for futility")
|
||
print(" - Stage 2: Enroll 30 additional patients (N=43 total)")
|
||
print(" → Declare success if ≥ 11 responses overall (ORR ≥ 25.6%)")
|
||
print("\nSecondary Endpoints:")
|
||
print(" - Duration of Response (DoR)")
|
||
print(" - Progression-Free Survival (PFS)")
|
||
print(" - Overall Survival (OS, with long-term follow-up)")
|
||
print(" - Safety (AEs per CTCAE v5.0)")
|
||
print("\nExploratory Endpoints:")
|
||
print(" - ctDNA clearance (liquid biopsy)")
|
||
print(" - Biomarkers of resistance (T790M acquisition, C797S)")
|
||
print(" - Quality of life (EORTC QLQ-C30)")
|
||
```
|
||
|
||
### Step 5: Safety Monitoring
|
||
|
||
```python
|
||
# 5.1: Get class effect toxicities from similar EGFR inhibitors
|
||
reference_drug = "erlotinib" # Earlier-generation EGFR TKI
|
||
|
||
reference_pharmacology = tu.tools.drugbank_get_pharmacology_by_drug_name_or_drugbank_id(
|
||
drug_name_or_drugbank_id=reference_drug
|
||
)
|
||
|
||
reference_warnings = tu.tools.FDA_get_warnings_and_cautions_by_drug_name(
|
||
drug_name=reference_drug
|
||
)
|
||
|
||
print("SAFETY MONITORING PLAN")
|
||
print("="*80)
|
||
print(f"Reference drug for class effects: {reference_drug}")
|
||
print(f"FDA warnings: {len(reference_warnings.get('data', []))}")
|
||
|
||
# 5.2: FAERS data for real-world AEs
|
||
faers_egfr = tu.tools.FAERS_search_reports_by_drug_and_reaction(
|
||
drug_name=reference_drug,
|
||
limit=1000
|
||
)
|
||
|
||
ae_counts = tu.tools.FAERS_count_reactions_by_drug_event(
|
||
medicinalproduct=reference_drug.upper()
|
||
)
|
||
|
||
print(f"\nFAERS reports for {reference_drug}: {len(faers_egfr.get('data', []))}")
|
||
print("\nTop 10 Adverse Events (FAERS):")
|
||
for i, ae in enumerate(ae_counts.get('results', [])[:10], 1):
|
||
print(f" {i}. {ae['term']}: {ae['count']} reports")
|
||
|
||
# 5.3: Define mechanism-based toxicity monitoring
|
||
print("\n" + "="*80)
|
||
print("MECHANISM-BASED TOXICITY MONITORING")
|
||
print("="*80)
|
||
|
||
toxicity_monitoring = {
|
||
'Dermatologic': {
|
||
'toxicities': ['Rash (acneiform)', 'Dry skin', 'Paronychia'],
|
||
'incidence': '60-80% (any grade), 10-15% (Grade 3+)',
|
||
'monitoring': 'Dermatology assessment q cycle, patient diary',
|
||
'management': 'Topical steroids, doxycycline, dose modification'
|
||
},
|
||
'Gastrointestinal': {
|
||
'toxicities': ['Diarrhea', 'Nausea', 'Decreased appetite'],
|
||
'incidence': '50-60% (any grade), 5-10% (Grade 3+)',
|
||
'monitoring': 'Symptom diary, electrolytes if Grade 2+',
|
||
'management': 'Loperamide, hydration, dose hold if Grade 3+'
|
||
},
|
||
'Hepatic': {
|
||
'toxicities': ['ALT/AST elevation', 'Hyperbilirubinemia'],
|
||
'incidence': '20-30% (any grade), 3-5% (Grade 3+)',
|
||
'monitoring': 'LFTs weekly (Cycle 1), then q3 weeks',
|
||
'management': 'Dose hold if ALT >5× ULN, discontinue if Hy\'s Law'
|
||
},
|
||
'Pulmonary': {
|
||
'toxicities': ['Interstitial lung disease (ILD)', 'Pneumonitis'],
|
||
'incidence': '1-3% (any grade), 0.5-1% (Grade 3+)',
|
||
'monitoring': 'CT chest at baseline, q12 weeks; symptoms q visit',
|
||
'management': 'Discontinue if ILD, systemic steroids'
|
||
}
|
||
}
|
||
|
||
for organ, details in toxicity_monitoring.items():
|
||
print(f"\n{organ}:")
|
||
for key, value in details.items():
|
||
if key == 'toxicities':
|
||
print(f" {key}: {', '.join(value)}")
|
||
else:
|
||
print(f" {key}: {value}")
|
||
|
||
# 5.4: DLT definition (Phase 1 component)
|
||
print("\n" + "="*80)
|
||
print("DOSE-LIMITING TOXICITY (DLT) DEFINITION - PHASE 1")
|
||
print("="*80)
|
||
print("Assessment Period: Cycle 1 (28 days)")
|
||
print("\nDLTs include:")
|
||
print(" - Grade ≥3 non-hematologic toxicity (except manageable with Rx)")
|
||
print(" - Grade 4 hematologic toxicity >7 days")
|
||
print(" - Any toxicity causing >2 week dose delay in Cycle 1")
|
||
print(" - Any Grade 5 (death) related to study drug")
|
||
print("\nExceptions (NOT considered DLTs):")
|
||
print(" - Grade 3 rash if resolves to ≤Grade 1 within 7 days with treatment")
|
||
print(" - Grade 3 diarrhea if resolves within 2 days with loperamide")
|
||
print(" - Grade 3 nausea/vomiting if controlled with antiemetics")
|
||
print("\nDose Escalation Design: 3+3")
|
||
print(" Starting dose: [X] mg QD (10% predicted human efficacious dose)")
|
||
print(" Dose levels: [X], [1.5X], [2X], [3X] mg QD")
|
||
print(" Rule: ≥2 DLTs at a level → MTD exceeded; previous level is MTD")
|
||
```
|
||
|
||
### Step 6: Regulatory Pathway
|
||
|
||
```python
|
||
# 6.1: Search for breakthrough therapy designations
|
||
bt_papers = tu.tools.PubMed_search_articles(
|
||
query="FDA breakthrough therapy designation NSCLC EGFR inhibitor",
|
||
max_results=20
|
||
)
|
||
|
||
print("REGULATORY PATHWAY ANALYSIS")
|
||
print("="*80)
|
||
print(f"Breakthrough therapy papers: {len(bt_papers['data'])}")
|
||
|
||
# 6.2: Check orphan drug eligibility
|
||
us_prevalence = osimertinib_resistant # From Step 1: ~10,800/year
|
||
print(f"\nOrphan Drug Designation Eligibility:")
|
||
print(f" Indication: EGFR L858R+ NSCLC, osimertinib-resistant")
|
||
print(f" Estimated US patients: {us_prevalence:.0f}/year")
|
||
print(f" Orphan threshold: <200,000 total prevalence")
|
||
print(f" Assessment: LIKELY NOT ELIGIBLE (too prevalent)")
|
||
|
||
# 6.3: FDA guidance documents
|
||
guidance_papers = tu.tools.PubMed_search_articles(
|
||
query="FDA guidance clinical trial endpoints NSCLC oncology",
|
||
max_results=15
|
||
)
|
||
|
||
print(f"\nFDA guidance documents: {len(guidance_papers['data'])} papers")
|
||
|
||
# 6.4: Regulatory recommendations
|
||
print("\n" + "="*80)
|
||
print("RECOMMENDED REGULATORY STRATEGY")
|
||
print("="*80)
|
||
print("\nPathway: 505(b)(1) (New Drug Application)")
|
||
print(" - Novel molecular entity")
|
||
print(" - No published safety data to rely on")
|
||
print("\nPotential Designations:")
|
||
print(" 1. Breakthrough Therapy [POSSIBLE]")
|
||
print(" Criteria: Preliminary evidence of substantial improvement")
|
||
print(" Threshold: ORR >50% in osimertinib-resistant (vs. ~10-15% SOC)")
|
||
print(" Benefit: Rolling NDA submission, frequent FDA meetings")
|
||
print(" Timing: Apply after Phase 1/2a data (n≥20, ORR clear)")
|
||
print("\n 2. Fast Track [LIKELY]")
|
||
print(" Criteria: Treats serious condition, addresses unmet need")
|
||
print(" Benefit: Rolling review, more frequent FDA interaction")
|
||
print(" Timing: Apply at IND or early Phase 1")
|
||
print("\n 3. Accelerated Approval [TARGET]")
|
||
print(" Endpoint: ORR (surrogate for OS)")
|
||
print(" Requirement: Confirmatory Phase 3 trial (OS primary)")
|
||
print(" Timing: After positive Phase 2 (ORR ≥35%, n=43)")
|
||
print("\nRegulatory Milestones:")
|
||
print(" Month -4: Pre-IND meeting request")
|
||
print(" Month -3: Pre-IND meeting (discuss endpoint, design)")
|
||
print(" Month 0: IND submission")
|
||
print(" Month 1: First patient dosed (if no clinical hold)")
|
||
print(" Month 9: Phase 1 complete, RP2D determined")
|
||
print(" Month 16: Phase 2 interim (Simon Stage 1, n=13)")
|
||
print(" Month 24: Phase 2 complete (n=43)")
|
||
print(" Month 27: End-of-Phase 2 meeting, Phase 3 design discussion")
|
||
```
|
||
|
||
### Final Feasibility Report Generation
|
||
|
||
```python
|
||
# Compile all data into feasibility score
|
||
print("\n" + "="*80)
|
||
print("FEASIBILITY SCORECARD")
|
||
print("="*80)
|
||
|
||
dimensions = {
|
||
'Patient Availability': {
|
||
'weight': 0.30,
|
||
'raw_score': 8, # 8/10
|
||
'evidence': '★★★',
|
||
'rationale': '~2,600 eligible/year, 7.7-month enrollment for n=50'
|
||
},
|
||
'Endpoint Precedent': {
|
||
'weight': 0.25,
|
||
'raw_score': 9, # 9/10
|
||
'evidence': '★★★',
|
||
'rationale': 'ORR accepted for accelerated approval, 10+ precedents'
|
||
},
|
||
'Regulatory Clarity': {
|
||
'weight': 0.20,
|
||
'raw_score': 8, # 8/10
|
||
'evidence': '★★☆',
|
||
'rationale': 'Clear 505(b)(1) path, breakthrough potential, pre-IND advised'
|
||
},
|
||
'Comparator Feasibility': {
|
||
'weight': 0.15,
|
||
'raw_score': 9, # 9/10
|
||
'evidence': '★★★',
|
||
'rationale': 'Robust historical data (osimertinib ORR 30-60%), single-arm viable'
|
||
},
|
||
'Safety Monitoring': {
|
||
'weight': 0.10,
|
||
'raw_score': 8, # 8/10
|
||
'evidence': '★★☆',
|
||
'rationale': 'EGFR TKI class effects well-characterized, manageable'
|
||
}
|
||
}
|
||
|
||
feasibility_score = 0
|
||
print(f"{'Dimension':<30} {'Weight':<10} {'Score':<10} {'Weighted':<10} {'Evidence':<10}")
|
||
print("-" * 80)
|
||
|
||
for dimension, data in dimensions.items():
|
||
weighted = data['weight'] * data['raw_score'] * 10
|
||
feasibility_score += weighted
|
||
print(f"{dimension:<30} {data['weight']*100:.0f}%{'':<7} "
|
||
f"{data['raw_score']}/10{'':<5} "
|
||
f"{weighted:.1f}{'':<7} "
|
||
f"{data['evidence']:<10}")
|
||
print(f" Rationale: {data['rationale']}")
|
||
|
||
print("-" * 80)
|
||
print(f"{'TOTAL FEASIBILITY SCORE':<30} {'100%':<10} {'':<10} "
|
||
f"{feasibility_score:.0f}/100{'':<7} {'HIGH':<10}")
|
||
|
||
print("\n" + "="*80)
|
||
print("FINAL RECOMMENDATION: RECOMMEND PROCEED")
|
||
print("="*80)
|
||
print("""
|
||
This Phase 1/2 trial demonstrates HIGH feasibility (Score: 82/100).
|
||
|
||
Key Strengths:
|
||
1. Patient availability is strong with ~2,600 eligible patients/year
|
||
2. ORR is FDA-accepted with robust regulatory precedent
|
||
3. Single-arm design is defensible with strong historical control data
|
||
4. Safety monitoring is well-established for EGFR TKI class
|
||
|
||
Critical Path:
|
||
1. Pre-IND meeting (Month -3) to confirm single-arm design acceptability
|
||
2. Secure CDx partnership for EGFR testing (liquid biopsy preferred)
|
||
3. IND submission (Month 0)
|
||
4. First patient dosed (Month 1)
|
||
5. Phase 2 interim analysis (Month 16, Simon Stage 1)
|
||
6. Phase 2 completion (Month 24, n=43)
|
||
|
||
Key Risk: Screen failure rate may be higher if liquid biopsy false-negative
|
||
Mitigation: Tissue re-biopsy for liquid biopsy-negative but clinically suspected
|
||
|
||
Budget Estimate: $3.5-5.0M (Phase 1/2 combined, 15 sites)
|
||
Timeline: 24 months (first patient to primary analysis)
|
||
""")
|
||
```
|
||
|
||
---
|
||
|
||
## Example 2: Rare Disease Trial (Niemann-Pick Type C)
|
||
|
||
**Scenario**: Assess feasibility of Phase 2 trial for novel cholesterol transport modifier in Niemann-Pick Type C (NPC), a lysosomal storage disorder with prevalence ~1:120,000.
|
||
|
||
### Setup
|
||
|
||
```python
|
||
from tooluniverse import ToolUniverse
|
||
|
||
tu = ToolUniverse(use_cache=True)
|
||
tu.load_tools()
|
||
|
||
indication = "Niemann-Pick Type C"
|
||
phase = "Phase 2"
|
||
primary_endpoint = "Change in NPC Clinical Severity Score"
|
||
```
|
||
|
||
### Step 1: Ultra-Rare Disease Population Sizing
|
||
|
||
```python
|
||
# 1.1: Search OpenTargets
|
||
disease_info = tu.tools.OpenTargets_get_disease_id_description_by_name(
|
||
diseaseName="Niemann-Pick disease type C"
|
||
)
|
||
|
||
print(f"Disease: {disease_info['data']['name']}")
|
||
print(f"Description: {disease_info['data']['description'][:200]}...")
|
||
|
||
# 1.2: Literature for prevalence
|
||
prevalence_papers = tu.tools.PubMed_search_articles(
|
||
query="Niemann-Pick type C prevalence incidence epidemiology",
|
||
max_results=30
|
||
)
|
||
|
||
print(f"\nPrevalence papers: {len(prevalence_papers['data'])}")
|
||
|
||
# From literature: 1:120,000 births
|
||
us_population = 330000000
|
||
npc_prevalence = us_population / 120000
|
||
annual_births_us = 3700000
|
||
annual_incidence = annual_births_us / 120000
|
||
|
||
print(f"\nEstimated US Prevalence:")
|
||
print(f" Total NPC patients: {npc_prevalence:.0f}")
|
||
print(f" Annual incidence: {annual_incidence:.0f} new cases/year")
|
||
|
||
# 1.3: Get genetic basis
|
||
npc_genes = ["NPC1", "NPC2"]
|
||
|
||
for gene in npc_genes:
|
||
variants = tu.tools.ClinVar_search_variants(
|
||
gene=gene,
|
||
significance="pathogenic,likely_pathogenic"
|
||
)
|
||
print(f"\n{gene} pathogenic variants: {len(variants['data'])}")
|
||
|
||
# 1.4: Eligibility criteria impact (stricter for rare disease)
|
||
eligibility_factors = {
|
||
'confirmed_genetic_diagnosis': 0.90, # Molecular diagnosis required
|
||
'age_5_50': 0.60, # Exclude infantile and very late-onset
|
||
'ambulatory': 0.40, # Neurologic impairment common
|
||
'no_liver_transplant': 0.85,
|
||
'willing_travel': 0.30 # Only specialized centers
|
||
}
|
||
|
||
eligible_pool = npc_prevalence
|
||
print(f"\nEligibility Funnel:")
|
||
for criterion, factor in eligibility_factors.items():
|
||
eligible_pool *= factor
|
||
print(f" After {criterion}: {eligible_pool:.0f} ({factor*100:.0f}%)")
|
||
|
||
print(f"\nFinal eligible pool (US): {eligible_pool:.0f} patients")
|
||
print(f" Percentage of total NPC population: {(eligible_pool/npc_prevalence)*100:.1f}%")
|
||
|
||
# 1.5: Enrollment projection
|
||
target_n = 30 # Small N for rare disease
|
||
us_sites = 5 # Only specialized centers (NIH, Mayo, etc.)
|
||
international_sites = 10 # Need EU sites
|
||
|
||
total_eligible_global = eligible_pool * 3 # Assume 3× for US+EU+other
|
||
months_to_enroll = target_n / (total_eligible_global * 0.20 / 12) # 20% capture
|
||
|
||
print(f"\nEnrollment Projection:")
|
||
print(f" Target N: {target_n}")
|
||
print(f" US sites: {us_sites}")
|
||
print(f" International sites: {international_sites}")
|
||
print(f" Global eligible pool: ~{total_eligible_global:.0f}")
|
||
print(f" Estimated enrollment: {months_to_enroll:.1f} months ({months_to_enroll/12:.1f} years)")
|
||
print(f" ⚠ CHALLENGE: Multi-year enrollment for small study")
|
||
```
|
||
|
||
**Key Finding**: Enrollment is a MAJOR challenge (36+ months for n=30)
|
||
|
||
### Step 2: Natural History & Endpoint Selection
|
||
|
||
```python
|
||
# 2.1: Search for natural history studies
|
||
nh_papers = tu.tools.PubMed_search_articles(
|
||
query="Niemann-Pick type C natural history clinical severity progression",
|
||
max_results=40
|
||
)
|
||
|
||
print("ENDPOINT SELECTION FOR RARE DISEASE")
|
||
print("="*80)
|
||
print(f"Natural history papers: {len(nh_papers['data'])}")
|
||
|
||
# 2.2: Search for existing clinical trials (learn from precedents)
|
||
npc_trials = tu.tools.search_clinical_trials(
|
||
condition="Niemann-Pick Disease Type C",
|
||
status="completed|active"
|
||
)
|
||
|
||
print(f"\nNPC clinical trials: {len(npc_trials['data'])}")
|
||
|
||
endpoints_used = {}
|
||
for trial in npc_trials['data']:
|
||
primary = trial.get('primary_outcome', '')
|
||
if primary:
|
||
key = primary[:50] # Truncate for grouping
|
||
endpoints_used[key] = endpoints_used.get(key, 0) + 1
|
||
|
||
print("\nEndpoints used in prior NPC trials:")
|
||
for endpoint, count in sorted(endpoints_used.items(), key=lambda x: x[1], reverse=True)[:5]:
|
||
print(f" - {endpoint}... (n={count} trials)")
|
||
|
||
# 2.3: Endpoint analysis
|
||
print("\n" + "="*80)
|
||
print("PRIMARY ENDPOINT ASSESSMENT")
|
||
print("="*80)
|
||
|
||
endpoint_options = [
|
||
{
|
||
'name': 'NPC Clinical Severity Score (17-domain)',
|
||
'evidence_grade': '★★☆',
|
||
'pros': 'Validated, used in prior trials, captures multi-organ impact',
|
||
'cons': 'Slow progression (need 18-24 month trial), subjective components',
|
||
'sample_size': 'n=30 per arm for 2-point change (90% power)',
|
||
'feasibility': 'MODERATE (long trial duration)'
|
||
},
|
||
{
|
||
'name': 'Swallowing function (videofluoroscopy)',
|
||
'evidence_grade': '★☆☆',
|
||
'pros': 'Objective, sensitive to change, clinically meaningful',
|
||
'cons': 'Not validated as primary, specialized equipment',
|
||
'sample_size': 'n=20 per arm (if validated)',
|
||
'feasibility': 'LOW (needs prospective validation)'
|
||
},
|
||
{
|
||
'name': 'Biomarker: plasma oxysterol (7-KC, cholestane-triol)',
|
||
'evidence_grade': '★★☆',
|
||
'pros': 'Mechanistic, rapid readout, validated in NPC',
|
||
'cons': 'Surrogate (not clinical benefit), FDA may not accept for approval',
|
||
'sample_size': 'n=15 per arm for 50% reduction',
|
||
'feasibility': 'HIGH (short trial, small N)'
|
||
}
|
||
]
|
||
|
||
for i, endpoint in enumerate(endpoint_options, 1):
|
||
print(f"\nOption {i}: {endpoint['name']} {endpoint['evidence_grade']}")
|
||
print(f" Pros: {endpoint['pros']}")
|
||
print(f" Cons: {endpoint['cons']}")
|
||
print(f" Sample size: {endpoint['sample_size']}")
|
||
print(f" Feasibility: {endpoint['feasibility']}")
|
||
|
||
print("\n" + "="*80)
|
||
print("RECOMMENDED ENDPOINT STRATEGY")
|
||
print("="*80)
|
||
print("Primary: NPC Clinical Severity Score (17-domain)")
|
||
print(" - Evidence grade: ★★☆ (used in prior trials)")
|
||
print(" - Design: Change from baseline to Month 18")
|
||
print(" - Sample size: n=30 (single-arm, vs. natural history)")
|
||
print("\nKey Secondary:")
|
||
print(" - Biomarker: Plasma oxysterols (7-KC, cholestane-triol)")
|
||
print(" - Swallowing function (videofluoroscopy)")
|
||
print(" - Ambulation index")
|
||
print(" - Quality of life (caregiver-rated)")
|
||
print("\n⚠ Challenge: 18-24 month trial duration compounds enrollment challenge")
|
||
```
|
||
|
||
### Step 3: Regulatory Pathway (Orphan Drug)
|
||
|
||
```python
|
||
# 3.1: Orphan drug designation
|
||
print("REGULATORY PATHWAY: ORPHAN DRUG")
|
||
print("="*80)
|
||
print(f"Disease Prevalence: {npc_prevalence:.0f} patients in US")
|
||
print(f"Orphan Threshold: <200,000 affected individuals")
|
||
print(f"Status: ✓ QUALIFIES for Orphan Drug Designation")
|
||
|
||
print("\nOrphan Drug Benefits:")
|
||
print(" 1. 7-year market exclusivity")
|
||
print(" 2. Tax credits for clinical trial costs (25%)")
|
||
print(" 3. Waiver of PDUFA fees (~$3M)")
|
||
print(" 4. Protocol assistance from FDA")
|
||
print(" 5. Expedited review")
|
||
|
||
# 3.2: Search for orphan drug approvals in similar indications
|
||
orphan_papers = tu.tools.PubMed_search_articles(
|
||
query="FDA orphan drug approval lysosomal storage disease",
|
||
max_results=30
|
||
)
|
||
|
||
print(f"\nOrphan approvals in lysosomal storage: {len(orphan_papers['data'])} papers")
|
||
|
||
# 3.3: Regulatory precedents
|
||
print("\n" + "="*80)
|
||
print("REGULATORY PRECEDENTS (Similar Rare Diseases)")
|
||
print("="*80)
|
||
|
||
precedents = [
|
||
{
|
||
'drug': 'Miglustat (Zavesca)',
|
||
'disease': 'Gaucher disease type 1',
|
||
'year': 2003,
|
||
'endpoint': 'Organ volume reduction',
|
||
'design': 'Single-arm (n=28)',
|
||
'approval': 'Regular approval (not accelerated)'
|
||
},
|
||
{
|
||
'drug': 'Cerliponase alfa (Brineura)',
|
||
'disease': 'CLN2 Batten disease',
|
||
'year': 2017,
|
||
'endpoint': 'Motor-language score',
|
||
'design': 'Single-arm vs. natural history (n=24)',
|
||
'approval': 'Regular approval'
|
||
}
|
||
]
|
||
|
||
for p in precedents:
|
||
print(f"\n{p['drug']} ({p['year']}):")
|
||
print(f" Disease: {p['disease']}")
|
||
print(f" Endpoint: {p['endpoint']}")
|
||
print(f" Design: {p['design']}")
|
||
print(f" Approval: {p['approval']}")
|
||
|
||
print("\n" + "="*80)
|
||
print("RECOMMENDATION: Orphan Drug Designation + Natural History Control")
|
||
print("="*80)
|
||
print("Design: Single-arm Phase 2, n=30")
|
||
print("Comparator: Natural history cohort (published data + registry)")
|
||
print("Rationale:")
|
||
print(" - Ethical concerns with placebo in rare, progressive disease")
|
||
print(" - Well-characterized natural history available")
|
||
print(" - Regulatory precedent (Cerliponase alfa approved with NH control)")
|
||
print("\nKey Risk: FDA may still prefer randomized placebo-controlled")
|
||
print("Mitigation: Pre-IND meeting to discuss and gain alignment")
|
||
```
|
||
|
||
### Final Feasibility Assessment
|
||
|
||
```python
|
||
print("\n" + "="*80)
|
||
print("FEASIBILITY SCORECARD: NIEMANN-PICK TYPE C TRIAL")
|
||
print("="*80)
|
||
|
||
dimensions = {
|
||
'Patient Availability': {
|
||
'weight': 0.30,
|
||
'raw_score': 3, # 3/10 - MAJOR CHALLENGE
|
||
'evidence': '★★★',
|
||
'rationale': 'Only ~500 eligible in US, 36+ months enrollment for n=30'
|
||
},
|
||
'Endpoint Precedent': {
|
||
'weight': 0.25,
|
||
'raw_score': 6, # 6/10
|
||
'evidence': '★★☆',
|
||
'rationale': 'Severity score used in trials, but slow progression'
|
||
},
|
||
'Regulatory Clarity': {
|
||
'weight': 0.20,
|
||
'raw_score': 8, # 8/10
|
||
'evidence': '★★★',
|
||
'rationale': 'Clear orphan path, precedents for NH control, FDA supportive'
|
||
},
|
||
'Comparator Feasibility': {
|
||
'weight': 0.15,
|
||
'raw_score': 7, # 7/10
|
||
'evidence': '★★☆',
|
||
'rationale': 'Natural history data available, registries exist'
|
||
},
|
||
'Safety Monitoring': {
|
||
'weight': 0.10,
|
||
'raw_score': 7, # 7/10
|
||
'evidence': '★☆☆',
|
||
'rationale': 'Novel mechanism, some preclinical safety data'
|
||
}
|
||
}
|
||
|
||
feasibility_score = sum(d['weight'] * d['raw_score'] * 10 for d in dimensions.values())
|
||
|
||
print(f"{'Dimension':<30} {'Weight':<10} {'Score':<10} {'Weighted':<10}")
|
||
print("-" * 70)
|
||
for dimension, data in dimensions.items():
|
||
weighted = data['weight'] * data['raw_score'] * 10
|
||
print(f"{dimension:<30} {data['weight']*100:.0f}%{'':<7} {data['raw_score']}/10{'':<5} {weighted:.1f}")
|
||
print(f" {data['rationale']}")
|
||
|
||
print("-" * 70)
|
||
print(f"TOTAL FEASIBILITY SCORE: {feasibility_score:.0f}/100 - MODERATE-LOW")
|
||
|
||
print("\n" + "="*80)
|
||
print("FINAL RECOMMENDATION: CONDITIONAL GO")
|
||
print("="*80)
|
||
print("""
|
||
This Phase 2 trial demonstrates MODERATE-LOW feasibility (Score: 58/100).
|
||
|
||
CRITICAL CHALLENGE: Patient recruitment
|
||
- Only ~500 eligible patients in US (after eligibility criteria)
|
||
- 36-48 months to enroll n=30, even with international sites
|
||
- Competing trials and natural history studies reduce available pool
|
||
|
||
STRENGTHS:
|
||
- Clear regulatory path (orphan drug, natural history control accepted)
|
||
- Significant unmet need (no approved therapies)
|
||
- Supportive patient advocacy and registry infrastructure
|
||
|
||
REQUIRED DE-RISKING STEPS:
|
||
1. Partnership with NPC patient registry (pre-identify patients)
|
||
2. Investigator consortium (NIH, Mayo, International NPC Consortium)
|
||
3. Pre-IND meeting to confirm natural history comparator acceptability
|
||
4. Biomarker enrichment (e.g., focus on NPC1 variants, exclude NPC2)
|
||
5. Adaptive design (allow enrollment extension if slow)
|
||
|
||
ALTERNATIVE DESIGN:
|
||
- If enrollment remains infeasible: Expanded Access Protocol
|
||
- Collect real-world data for future regulatory submission
|
||
- Smaller n=15-20 with biomarker primary endpoint (faster readout)
|
||
|
||
BUDGET: $5-8M (higher per-patient costs, longer duration)
|
||
TIMELINE: 48-60 months (enrollment + follow-up)
|
||
""")
|
||
```
|
||
|
||
---
|
||
|
||
## Example 3: Superiority Trial vs. Standard of Care (Checkpoint Inhibitor)
|
||
|
||
**Scenario**: Design Phase 2b randomized trial for novel PD-1 inhibitor vs. pembrolizumab in PD-L1 high (TPS ≥50%) NSCLC, first-line.
|
||
|
||
### Setup
|
||
|
||
```python
|
||
from tooluniverse import ToolUniverse
|
||
|
||
tu = ToolUniverse(use_cache=True)
|
||
tu.load_tools()
|
||
|
||
indication = "PD-L1 high (TPS ≥50%) non-small cell lung cancer, first-line"
|
||
design = "Phase 2b, randomized 1:1"
|
||
primary_endpoint = "Objective Response Rate (ORR)"
|
||
comparator = "pembrolizumab"
|
||
```
|
||
|
||
### Step 1: Patient Population (Biomarker-Selected)
|
||
|
||
```python
|
||
# 1.1: Disease prevalence
|
||
disease_info = tu.tools.OpenTargets_get_disease_id_description_by_name(
|
||
diseaseName="non-small cell lung cancer"
|
||
)
|
||
|
||
# From literature: ~40% of NSCLC is PD-L1 TPS ≥50%
|
||
us_nsclc_annual = 200000
|
||
pdl1_high_rate = 0.40
|
||
pdl1_high_annual = us_nsclc_annual * pdl1_high_rate
|
||
|
||
print("PATIENT POPULATION SIZING: PD-L1 HIGH NSCLC")
|
||
print("="*80)
|
||
print(f"US NSCLC incidence: {us_nsclc_annual:,}/year")
|
||
print(f"PD-L1 TPS ≥50%: {pdl1_high_rate*100:.0f}% = {pdl1_high_annual:,}/year")
|
||
|
||
# 1.2: Eligibility criteria (first-line, no EGFR/ALK)
|
||
eligibility_factors = {
|
||
'no_egfr_alk': 0.80, # Exclude oncogene-driven
|
||
'age_18_plus': 0.98,
|
||
'ecog_0_1': 0.75,
|
||
'adequate_organ': 0.90,
|
||
'no_autoimmune': 0.85,
|
||
'no_prior_io': 1.00 # First-line
|
||
}
|
||
|
||
eligible_pool = pdl1_high_annual
|
||
print(f"\nEligibility Funnel:")
|
||
for criterion, factor in eligibility_factors.items():
|
||
eligible_pool *= factor
|
||
print(f" After {criterion}: {eligible_pool:,.0f} ({factor*100:.0f}%)")
|
||
|
||
print(f"\nFinal eligible pool: {eligible_pool:,.0f} patients/year (US)")
|
||
|
||
# 1.3: Enrollment projection for randomized trial
|
||
target_n = 120 # 60 per arm
|
||
sites = 30 # Large Phase 2b
|
||
capture_rate = 0.05 # 5% of eligible
|
||
monthly_enrollment = (eligible_pool * capture_rate) / 12 / sites
|
||
|
||
print(f"\nEnrollment Projection (Randomized 1:1):")
|
||
print(f" Target N: {target_n} ({target_n//2} per arm)")
|
||
print(f" Sites: {sites}")
|
||
print(f" Patients per site per month: {monthly_enrollment:.2f}")
|
||
print(f" Enrollment timeline: {target_n / (monthly_enrollment * sites):.1f} months")
|
||
```
|
||
|
||
### Step 2: Comparator Analysis (Pembrolizumab SOC)
|
||
|
||
```python
|
||
# 2.1: Get pembrolizumab info
|
||
pembro_info = tu.tools.drugbank_get_drug_basic_info_by_drug_name_or_id(
|
||
drug_name_or_drugbank_id=comparator
|
||
)
|
||
|
||
pembro_indications = tu.tools.drugbank_get_indications_by_drug_name_or_drugbank_id(
|
||
drug_name_or_drugbank_id=comparator
|
||
)
|
||
|
||
print("\nCOMPARATOR DRUG: PEMBROLIZUMAB")
|
||
print("="*80)
|
||
print(f"Status: {pembro_info['data']['groups']}")
|
||
print(f"Indications: {len(pembro_indications['data'])}")
|
||
|
||
# 2.2: Get FDA approval history
|
||
pembro_approval = tu.tools.OpenFDA_get_approval_history(
|
||
drug_name=comparator
|
||
)
|
||
|
||
# 2.3: Get pivotal trial data
|
||
keynote_trials = tu.tools.search_clinical_trials(
|
||
intervention="pembrolizumab",
|
||
condition="non-small cell lung cancer",
|
||
phase="3",
|
||
status="completed"
|
||
)
|
||
|
||
print(f"\nPembrolizumab Phase 3 trials in NSCLC: {len(keynote_trials['data'])}")
|
||
|
||
# Key trial: KEYNOTE-024 (1L, PD-L1 ≥50%)
|
||
print("\n" + "="*80)
|
||
print("KEYNOTE-024: Pembrolizumab vs. Chemotherapy (PD-L1 ≥50%)")
|
||
print("="*80)
|
||
print("Design: Randomized 1:1, N=305")
|
||
print("Population: 1L NSCLC, PD-L1 TPS ≥50%")
|
||
print("Primary: PFS")
|
||
print("\nResults:")
|
||
print(" Pembrolizumab:")
|
||
print(" - ORR: 44.8%")
|
||
print(" - Median PFS: 10.3 months")
|
||
print(" - Median OS: 30.0 months (30-month landmark)")
|
||
print(" Chemotherapy:")
|
||
print(" - ORR: 27.8%")
|
||
print(" - Median PFS: 6.0 months")
|
||
print(" - Median OS: 14.2 months")
|
||
print("\nConclusion: Pembrolizumab is SOC for PD-L1 ≥50% NSCLC")
|
||
|
||
# 2.4: Comparator drug sourcing
|
||
print("\n" + "="*80)
|
||
print("COMPARATOR SOURCING")
|
||
print("="*80)
|
||
print("Drug: Pembrolizumab (Keytruda)")
|
||
print("Availability: Commercial supply")
|
||
print("Cost: ~$150-180K/year per patient")
|
||
print("Dosing: 200 mg IV q3w")
|
||
print("Stability: Refrigerated, 24-hour room temp after reconstitution")
|
||
print("Sourcing: Purchase from Merck or specialty pharmacy")
|
||
print("IRB Consideration: Standard of care, no IND required for comparator arm")
|
||
```
|
||
|
||
### Step 3: Sample Size Calculation (Superiority Design)
|
||
|
||
```python
|
||
print("\n" + "="*80)
|
||
print("SAMPLE SIZE CALCULATION: SUPERIORITY TRIAL (ORR)")
|
||
print("="*80)
|
||
|
||
# Assumptions
|
||
pembro_orr = 0.45 # 45% from KEYNOTE-024
|
||
target_orr = 0.60 # 60% for novel drug (15% absolute improvement)
|
||
alpha = 0.05 # Two-sided
|
||
power = 0.80
|
||
dropout = 0.10
|
||
|
||
# Calculate (using normal approximation for proportions)
|
||
import math
|
||
|
||
def sample_size_two_proportions(p1, p2, alpha=0.05, power=0.80):
|
||
"""Calculate sample size for comparing two proportions"""
|
||
z_alpha = 1.96 # Two-sided alpha=0.05
|
||
z_beta = 0.84 # Power=0.80
|
||
|
||
p_avg = (p1 + p2) / 2
|
||
n = ((z_alpha * math.sqrt(2 * p_avg * (1 - p_avg)) +
|
||
z_beta * math.sqrt(p1 * (1 - p1) + p2 * (1 - p2)))**2 /
|
||
(p1 - p2)**2)
|
||
|
||
return math.ceil(n)
|
||
|
||
n_per_arm = sample_size_two_proportions(target_orr, pembro_orr)
|
||
n_total = n_per_arm * 2
|
||
n_with_dropout = math.ceil(n_total / (1 - dropout))
|
||
|
||
print(f"Null Hypothesis (H0): ORR_novel = ORR_pembro = {pembro_orr*100:.0f}%")
|
||
print(f"Alternative (H1): ORR_novel = {target_orr*100:.0f}% (15% absolute improvement)")
|
||
print(f"Alpha: {alpha} (two-sided)")
|
||
print(f"Power: {power*100:.0f}%")
|
||
print(f"\nSample Size:")
|
||
print(f" Per arm: {n_per_arm}")
|
||
print(f" Total: {n_total}")
|
||
print(f" With {dropout*100:.0f}% dropout: {n_with_dropout} ({n_with_dropout//2}/arm)")
|
||
|
||
print(f"\n⚠ NOTE: This is Phase 2b, not pivotal")
|
||
print(f" - Powering for hypothesis generation, not definitive proof")
|
||
print(f" - N={n_with_dropout} reasonable for Phase 2b go/no-go decision")
|
||
print(f" - Successful Phase 2b → Phase 3 with PFS/OS primary (N=400-600)")
|
||
|
||
# 2.5: Alternative: Non-inferiority design (if aiming for better safety)
|
||
print("\n" + "="*80)
|
||
print("ALTERNATIVE DESIGN: NON-INFERIORITY (If Better Safety)")
|
||
print("="*80)
|
||
print("Rationale: If novel drug has lower toxicity (e.g., no pneumonitis)")
|
||
print("Non-inferiority margin: Δ = -10% (ORR novel ≥ 35% if pembro 45%)")
|
||
print("Sample size: ~200/arm (larger N for non-inferiority)")
|
||
print("Conclusion: STICK WITH SUPERIORITY for Phase 2b (smaller N)")
|
||
```
|
||
|
||
### Step 4: Safety Comparison
|
||
|
||
```python
|
||
# 4.1: Pembrolizumab safety profile
|
||
pembro_warnings = tu.tools.FDA_get_warnings_and_cautions_by_drug_name(
|
||
drug_name=comparator
|
||
)
|
||
|
||
pembro_faers = tu.tools.FAERS_count_reactions_by_drug_event(
|
||
medicinalproduct="PEMBROLIZUMAB"
|
||
)
|
||
|
||
print("\n" + "="*80)
|
||
print("SAFETY PROFILE: PEMBROLIZUMAB (COMPARATOR)")
|
||
print("="*80)
|
||
print(f"FDA warnings: {len(pembro_warnings.get('data', []))}")
|
||
|
||
print("\nTop 10 Adverse Events (FAERS):")
|
||
for i, ae in enumerate(pembro_faers.get('results', [])[:10], 1):
|
||
print(f" {i}. {ae['term']}: {ae['count']} reports")
|
||
|
||
print("\nKey Immune-Related AEs (irAEs) from Label:")
|
||
irAEs = [
|
||
{'event': 'Pneumonitis', 'incidence': '3.4%', 'grade_3_4': '0.8%', 'fatal': '0.1%'},
|
||
{'event': 'Colitis', 'incidence': '1.7%', 'grade_3_4': '0.4%', 'fatal': '0%'},
|
||
{'event': 'Hepatitis', 'incidence': '0.7%', 'grade_3_4': '0.2%', 'fatal': '0.1%'},
|
||
{'event': 'Endocrinopathies (all)', 'incidence': '8.0%', 'grade_3_4': '0.8%', 'fatal': '0%'},
|
||
{'event': 'Nephritis', 'incidence': '0.7%', 'grade_3_4': '0.2%', 'fatal': '0%'}
|
||
]
|
||
|
||
print("\n" + "="*80)
|
||
print("IMMUNE-RELATED ADVERSE EVENTS (irAEs)")
|
||
print("="*80)
|
||
print(f"{'Event':<25} {'Any Grade':<12} {'Grade 3-4':<12} {'Fatal':<10}")
|
||
print("-" * 60)
|
||
for ae in irAEs:
|
||
print(f"{ae['event']:<25} {ae['incidence']:<12} {ae['grade_3_4']:<12} {ae['fatal']:<10}")
|
||
|
||
print("\n" + "="*80)
|
||
print("SAFETY MONITORING PLAN (Both Arms)")
|
||
print("="*80)
|
||
print("Standard immune-related AE monitoring:")
|
||
print(" - Baseline: CXR, PFTs (if smoker), TSH, LFTs, Cr")
|
||
print(" - Every cycle: CBC, CMP, LFTs, TSH")
|
||
print(" - PRN: CT chest for respiratory symptoms, cortisol/ACTH for fatigue")
|
||
print("\nStopping rules for irAEs:")
|
||
print(" - Grade 2 pneumonitis: Hold drug, imaging, pulmonology")
|
||
print(" - Grade 3-4 irAE: Discontinue drug, high-dose steroids (1-2 mg/kg)")
|
||
print(" - Grade 4 or fatal irAE: Report to FDA ASAP (IND safety report)")
|
||
```
|
||
|
||
### Final Feasibility & Design Recommendation
|
||
|
||
```python
|
||
print("\n" + "="*80)
|
||
print("FEASIBILITY SCORECARD: PEMBROLIZUMAB SUPERIORITY TRIAL")
|
||
print("="*80)
|
||
|
||
dimensions = {
|
||
'Patient Availability': {
|
||
'weight': 0.30,
|
||
'raw_score': 9,
|
||
'evidence': '★★★',
|
||
'rationale': '~40,000 eligible/year, rapid enrollment (6-8 months for N=120)'
|
||
},
|
||
'Endpoint Precedent': {
|
||
'weight': 0.25,
|
||
'raw_score': 9,
|
||
'evidence': '★★★',
|
||
'rationale': 'ORR standard for Phase 2, precedent in KEYNOTE trials'
|
||
},
|
||
'Regulatory Clarity': {
|
||
'weight': 0.20,
|
||
'raw_score': 8,
|
||
'evidence': '★★☆',
|
||
'rationale': 'Active control acceptable, Phase 3 will need PFS/OS'
|
||
},
|
||
'Comparator Feasibility': {
|
||
'weight': 0.15,
|
||
'raw_score': 9,
|
||
'evidence': '★★★',
|
||
'rationale': 'Pembrolizumab commercial supply, known efficacy (ORR 45%)'
|
||
},
|
||
'Safety Monitoring': {
|
||
'weight': 0.10,
|
||
'raw_score': 8,
|
||
'evidence': '★★★',
|
||
'rationale': 'PD-1 class effects well-known, irAE protocols established'
|
||
}
|
||
}
|
||
|
||
feasibility_score = sum(d['weight'] * d['raw_score'] * 10 for d in dimensions.values())
|
||
|
||
print(f"{'Dimension':<30} {'Weight':<10} {'Score':<10} {'Weighted':<10}")
|
||
print("-" * 70)
|
||
for dimension, data in dimensions.items():
|
||
weighted = data['weight'] * data['raw_score'] * 10
|
||
print(f"{dimension:<30} {data['weight']*100:.0f}%{'':<7} {data['raw_score']}/10{'':<5} {weighted:.1f}")
|
||
|
||
print("-" * 70)
|
||
print(f"TOTAL FEASIBILITY SCORE: {feasibility_score:.0f}/100 - HIGH")
|
||
|
||
print("\n" + "="*80)
|
||
print("FINAL RECOMMENDATION: RECOMMEND PROCEED")
|
||
print("="*80)
|
||
print(f"""
|
||
This Phase 2b randomized trial demonstrates HIGH feasibility (Score: {feasibility_score:.0f}/100).
|
||
|
||
RECOMMENDED DESIGN:
|
||
- Phase 2b, randomized 1:1, open-label
|
||
- N=120 (60 per arm) with 10% dropout buffer → Total N=132
|
||
- Population: 1L NSCLC, PD-L1 TPS ≥50%, no EGFR/ALK
|
||
- Treatment:
|
||
* Arm A: Novel PD-1 inhibitor [dose] IV q3w
|
||
* Arm B: Pembrolizumab 200 mg IV q3w
|
||
- Primary endpoint: ORR (RECIST 1.1, iRECIST for pseudoprogression)
|
||
- Secondary: PFS, OS (long-term FU), DoR, safety
|
||
- Duration: Until progression, toxicity, or 24 months
|
||
|
||
STATISTICAL PLAN:
|
||
- Power: 80% to detect 15% absolute ORR improvement (60% vs 45%)
|
||
- Analysis: Chi-square test, two-sided alpha=0.05
|
||
- Interim: 50% information (n=60), futility only (no early efficacy stop)
|
||
|
||
SUCCESS CRITERIA (Advance to Phase 3):
|
||
- ORR ≥ 55% (vs. pembro 45%, p<0.05)
|
||
- Safety profile non-inferior (no new safety signals)
|
||
- PFS trend favorable (HR <0.85)
|
||
- Duration of response ≥12 months (median)
|
||
|
||
ENROLLMENT:
|
||
- Timeline: 6-8 months (30 sites, ~0.5 patients/site/month)
|
||
- Primary analysis: Month 14 (6-month follow-up for ORR assessment)
|
||
|
||
BUDGET: $6-9M (higher cost due to comparator drug purchase + 2× monitoring)
|
||
""")
|
||
```
|
||
|
||
---
|
||
|
||
## Example 4: Non-Inferiority Trial (Oral Anticoagulant)
|
||
|
||
**Scenario**: Design Phase 3 non-inferiority trial for novel oral Factor XIa inhibitor vs. apixaban in atrial fibrillation, aiming for lower bleeding risk.
|
||
|
||
```python
|
||
from tooluniverse import ToolUniverse
|
||
|
||
tu = ToolUniverse(use_cache=True)
|
||
tu.load_tools()
|
||
|
||
indication = "Atrial fibrillation, stroke prevention"
|
||
design = "Phase 3, randomized, double-blind, non-inferiority"
|
||
primary_endpoint = "Stroke or systemic embolism (composite)"
|
||
comparator = "apixaban"
|
||
|
||
# Step 1: Patient Population (Very Large)
|
||
print("PATIENT POPULATION: ATRIAL FIBRILLATION")
|
||
print("="*80)
|
||
|
||
# AFib prevalence: ~6M in US, ~33% on oral anticoagulation
|
||
us_afib_prevalence = 6000000
|
||
on_anticoagulation = us_afib_prevalence * 0.33
|
||
|
||
print(f"US AFib prevalence: {us_afib_prevalence:,}")
|
||
print(f"On oral anticoagulation: {on_anticoagulation:,}")
|
||
print(f"Eligible for trial: ~50% = {on_anticoagulation * 0.5:,.0f}")
|
||
|
||
# Step 2: Comparator (Apixaban - Standard of Care)
|
||
apixaban_info = tu.tools.drugbank_get_drug_basic_info_by_drug_name_or_id(
|
||
drug_name_or_drugbank_id=comparator
|
||
)
|
||
|
||
print(f"\nComparator: {comparator}")
|
||
print(f"Status: {apixaban_info['data']['groups']}")
|
||
|
||
# From ARISTOTLE trial: Apixaban vs. warfarin
|
||
print("\nARISTOTLE Trial (Apixaban Pivotal):")
|
||
print(" N=18,201")
|
||
print(" Stroke/SE rate: 1.27%/year (apixaban) vs. 1.60%/year (warfarin)")
|
||
print(" Major bleeding: 2.13%/year (apixaban) vs. 3.09%/year (warfarin)")
|
||
|
||
# Step 3: Non-Inferiority Margin
|
||
print("\n" + "="*80)
|
||
print("NON-INFERIORITY MARGIN DETERMINATION")
|
||
print("="*80)
|
||
print("Regulatory Guidance (FDA/EMA):")
|
||
print(" - NI margin = Fraction of comparator effect vs. placebo")
|
||
print(" - Apixaban vs. warfarin: 21% relative risk reduction in stroke")
|
||
print(" - Acceptable to preserve ≥50% of effect → NI margin = HR <1.38")
|
||
print("\nProposed NI Margin: HR <1.44 (upper bound of 95% CI)")
|
||
print("Rationale: Conservative, if novel drug has 50% lower bleeding")
|
||
|
||
# Step 4: Sample Size (LARGE)
|
||
print("\n" + "="*80)
|
||
print("SAMPLE SIZE CALCULATION: NON-INFERIORITY (TIME-TO-EVENT)")
|
||
print("="*80)
|
||
|
||
# Assumptions
|
||
stroke_rate_annual = 0.0127 # 1.27%/year from ARISTOTLE
|
||
ni_margin_hr = 1.44
|
||
alpha = 0.025 # One-sided for NI
|
||
power = 0.90
|
||
enrollment_period = 24 # months
|
||
follow_up = 36 # months
|
||
|
||
# Events needed (conservative estimate)
|
||
events_needed = 450 # Assuming HR=1.0, NI margin 1.44, 90% power
|
||
|
||
# Sample size (based on event rate)
|
||
n_per_arm = events_needed / (2 * stroke_rate_annual * (enrollment_period + follow_up) / 12)
|
||
n_total = n_per_arm * 2
|
||
|
||
print(f"Assumptions:")
|
||
print(f" Annual event rate: {stroke_rate_annual*100:.2f}%")
|
||
print(f" NI margin: HR <{ni_margin_hr}")
|
||
print(f" Power: {power*100:.0f}%")
|
||
print(f" Alpha: {alpha} (one-sided)")
|
||
print(f"\nRequired events: {events_needed}")
|
||
print(f"Sample size: {n_total:,.0f} ({n_per_arm:,.0f} per arm)")
|
||
print(f"Duration: {enrollment_period} months enrollment + {follow_up} months follow-up = {enrollment_period + follow_up} months")
|
||
|
||
print(f"\n⚠ CHALLENGE: VERY LARGE TRIAL (N={n_total:,.0f})")
|
||
print(f" - Phase 3 only (skip Phase 2 or run small Phase 2 for dose)")
|
||
print(f" - Multi-national (US, EU, Asia, LatAm)")
|
||
print(f" - Budget: $150-250M")
|
||
|
||
# Step 5: Regulatory Considerations
|
||
print("\n" + "="*80)
|
||
print("REGULATORY PATHWAY: CARDIOVASCULAR OUTCOMES TRIAL")
|
||
print("="*80)
|
||
print("FDA Requirements:")
|
||
print(" - Pre-IND: Type C meeting for NI margin discussion")
|
||
print(" - Phase 3 design: Randomized, double-blind, event-driven")
|
||
print(" - Primary: Stroke/SE (non-inferiority)")
|
||
print(" - Key secondary: Major bleeding (superiority)")
|
||
print(" - DSMB: Independent, frequent reviews (every 200 events)")
|
||
print(" - Interim: 1-2 analyses (efficacy + futility)")
|
||
print("\nApproval Pathway: Regular NDA (not accelerated)")
|
||
|
||
# Feasibility Score
|
||
print("\n" + "="*80)
|
||
print("FEASIBILITY SCORE: NON-INFERIORITY TRIAL")
|
||
print("="*80)
|
||
|
||
dimensions = {
|
||
'Patient Availability': {'weight': 0.30, 'raw_score': 10, 'rationale': 'Huge population (>1M eligible)'},
|
||
'Endpoint Precedent': {'weight': 0.25, 'raw_score': 10, 'rationale': 'Stroke/SE standard, regulatory accepted'},
|
||
'Regulatory Clarity': {'weight': 0.20, 'raw_score': 7, 'rationale': 'NI margin needs FDA agreement, precedent exists'},
|
||
'Comparator Feasibility': {'weight': 0.15, 'raw_score': 9, 'rationale': 'Apixaban generic, widely used'},
|
||
'Safety Monitoring': {'weight': 0.10, 'raw_score': 9, 'rationale': 'Bleeding monitoring standard, established'}
|
||
}
|
||
|
||
feasibility_score = sum(d['weight'] * d['raw_score'] * 10 for d in dimensions.values())
|
||
print(f"TOTAL FEASIBILITY SCORE: {feasibility_score:.0f}/100 - HIGH (but expensive)")
|
||
|
||
print(f"\nRECOMMENDATION: CONDITIONAL GO (if funded)")
|
||
print(f" - Feasibility: HIGH for patient access, endpoints, regulatory")
|
||
print(f" - Challenge: $150-250M budget, 5-year duration")
|
||
print(f" - Strategy: Partner with large pharma or seek CV outcomes specialist CRO")
|
||
```
|
||
|
||
---
|
||
|
||
## Example 5: Basket Trial (Multiple Cancers, One Biomarker)
|
||
|
||
**Scenario**: Design basket trial for NTRK fusion-positive solid tumors (tissue-agnostic), following larotrectinib precedent.
|
||
|
||
```python
|
||
from tooluniverse import ToolUniverse
|
||
|
||
tu = ToolUniverse(use_cache=True)
|
||
tu.load_tools()
|
||
|
||
indication = "NTRK fusion-positive solid tumors (basket trial)"
|
||
design = "Phase 2, single-arm, basket (multiple histologies)"
|
||
primary_endpoint = "Objective Response Rate (ORR) by histology"
|
||
biomarker = "NTRK1/2/3 gene fusion"
|
||
|
||
# Step 1: Biomarker Prevalence (Rare but Pan-Cancer)
|
||
print("BIOMARKER PREVALENCE: NTRK FUSIONS")
|
||
print("="*80)
|
||
|
||
# NTRK fusions: rare (<1% most cancers, enriched in pediatric/rare tumors)
|
||
ntrk_prevalence_by_cancer = [
|
||
{'cancer': 'Secretory breast carcinoma', 'prevalence': 0.90, 'annual_us': 100},
|
||
{'cancer': 'Mammary analogue secretory carcinoma', 'prevalence': 0.95, 'annual_us': 50},
|
||
{'cancer': 'Infantile fibrosarcoma', 'prevalence': 0.90, 'annual_us': 30},
|
||
{'cancer': 'NSCLC', 'prevalence': 0.01, 'annual_us': 2000}, # 1% of 200K
|
||
{'cancer': 'Colorectal cancer', 'prevalence': 0.005, 'annual_us': 700}, # 0.5% of 140K
|
||
{'cancer': 'Thyroid cancer', 'prevalence': 0.05, 'annual_us': 250},
|
||
{'cancer': 'Glioblastoma', 'prevalence': 0.01, 'annual_us': 130},
|
||
{'cancer': 'Salivary gland', 'prevalence': 0.03, 'annual_us': 10},
|
||
{'cancer': 'Sarcoma (other)', 'prevalence': 0.02, 'annual_us': 250},
|
||
{'cancer': 'Melanoma', 'prevalence': 0.001, 'annual_us': 90}
|
||
]
|
||
|
||
print(f"{'Cancer Type':<40} {'NTRK+ Rate':<15} {'Annual US Cases':<20}")
|
||
print("-" * 80)
|
||
total_ntrk_patients = 0
|
||
for cancer in ntrk_prevalence_by_cancer:
|
||
print(f"{cancer['cancer']:<40} {cancer['prevalence']*100:>6.1f}% {cancer['annual_us']:>15,}")
|
||
total_ntrk_patients += cancer['annual_us']
|
||
|
||
print("-" * 80)
|
||
print(f"{'TOTAL NTRK+ PATIENTS/YEAR (US)':<40} {'':<15} {total_ntrk_patients:>15,}")
|
||
|
||
print(f"\nKey Insight: NTRK fusions are RARE (~{total_ntrk_patients:,}/year across all cancers)")
|
||
print(f" → Basket trial required to aggregate sufficient patients")
|
||
|
||
# Step 2: Basket Trial Design
|
||
print("\n" + "="*80)
|
||
print("BASKET TRIAL DESIGN")
|
||
print("="*80)
|
||
print("Concept: Enroll patients across MULTIPLE tumor types with NTRK fusions")
|
||
print("Rationale: NTRK inhibitor mechanism is tumor-agnostic")
|
||
print("\nDesign:")
|
||
print(" - Single-arm, open-label")
|
||
print(" - Primary endpoint: ORR per histology (≥15 patients/basket)")
|
||
print(" - Secondary: DoR, PFS, OS, safety (across all baskets)")
|
||
print(" - Enrollment: ~80-120 patients across 8-12 tumor types")
|
||
print("\nInclusion Criteria:")
|
||
print(" - NTRK1/2/3 fusion confirmed (NGS, FISH, IHC→FISH)")
|
||
print(" - Locally advanced or metastatic disease")
|
||
print(" - Measurable disease (RECIST 1.1)")
|
||
print(" - No effective standard therapy OR progressed on SOC")
|
||
print(" - Age ≥12 years (include pediatric)")
|
||
|
||
# Step 3: Biomarker Testing Strategy
|
||
print("\n" + "="*80)
|
||
print("BIOMARKER TESTING STRATEGY")
|
||
print("="*80)
|
||
|
||
# Search for NGS panels
|
||
print("NGS-based comprehensive genomic profiling (CGP):")
|
||
print(" - FoundationOne CDx (FDA-approved CDx for larotrectinib)")
|
||
print(" - Guardant360 (liquid biopsy, ctDNA)")
|
||
print(" - Institutional NGS (CLIA-certified)")
|
||
print("\nTesting Algorithm:")
|
||
print(" 1. IHC screening (pan-TRK antibody) - Fast, cheap")
|
||
print(" → If positive: Confirm with NGS or FISH")
|
||
print(" 2. NGS (if tumor profiling already done)")
|
||
print(" 3. FISH (if NGS unavailable or IHC+)")
|
||
print("\nTurnaround: 10-14 days (NGS), 5-7 days (FISH)")
|
||
print("Cost: $500-800 (IHC), $3,000-5,000 (NGS)")
|
||
|
||
# Search for testing guidelines
|
||
testing_papers = tu.tools.PubMed_search_articles(
|
||
query="NTRK fusion testing guidelines NCCN NGS",
|
||
max_results=20
|
||
)
|
||
print(f"\nNTRK testing guideline papers: {len(testing_papers['data'])}")
|
||
|
||
# Step 4: Regulatory Precedent (Larotrectinib)
|
||
print("\n" + "="*80)
|
||
print("REGULATORY PRECEDENT: LAROTRECTINIB (Vitrakvi)")
|
||
print("="*80)
|
||
|
||
# Search for larotrectinib approval
|
||
laro_papers = tu.tools.PubMed_search_articles(
|
||
query="larotrectinib FDA approval NTRK fusion basket trial",
|
||
max_results=25
|
||
)
|
||
|
||
print(f"Larotrectinib papers: {len(laro_papers['data'])}")
|
||
print("\nLarotrectinib FDA Approval (2018):")
|
||
print(" Indication: NTRK fusion-positive solid tumors (TISSUE-AGNOSTIC)")
|
||
print(" Trial Design: Basket trial, single-arm, n=55")
|
||
print(" Primary Endpoint: ORR")
|
||
print(" Results:")
|
||
print(" - Overall ORR: 75% (95% CI: 61-85%)")
|
||
print(" - Complete response: 13%")
|
||
print(" - Partial response: 62%")
|
||
print(" - Median DoR: NOT REACHED (73% at 12 months)")
|
||
print(" Histologies enrolled: 17 different tumor types")
|
||
print(" Approval: ACCELERATED (tissue-agnostic, first of its kind)")
|
||
print("\nKey Regulatory Insights:")
|
||
print(" ✓ Single-arm acceptable (no SOC for NTRK+ tumors)")
|
||
print(" ✓ ORR primary endpoint sufficient")
|
||
print(" ✓ Small N (n=55) acceptable given tumor rarity")
|
||
print(" ✓ Tissue-agnostic approval precedent SET")
|
||
|
||
# Step 5: Enrollment Feasibility
|
||
print("\n" + "="*80)
|
||
print("ENROLLMENT STRATEGY")
|
||
print("="*80)
|
||
|
||
print(f"Total NTRK+ patients/year (US): ~{total_ntrk_patients:,}")
|
||
print(f"Target enrollment: 100 patients")
|
||
print(f"Capture rate needed: {100/total_ntrk_patients*100:.1f}%")
|
||
print("\nChallenges:")
|
||
print(" 1. BROAD SCREENING: Need to test 10,000+ patients to find 100 NTRK+")
|
||
print(" 2. Competing trials: Larotrectinib, entrectinib already approved")
|
||
print(" 3. Limited testing: Not all centers do NGS routinely")
|
||
print("\nMitigation Strategies:")
|
||
print(" 1. PARTNER WITH CGP COMPANIES:")
|
||
print(" - Foundation Medicine, Guardant, Tempus")
|
||
print(" - Flag NTRK+ patients in CGP reports → refer to trial")
|
||
print(" 2. NATIONAL SCREENING PROGRAM:")
|
||
print(" - Provide free NGS testing for suspected rare fusions")
|
||
print(" 3. PATIENT ADVOCACY:")
|
||
print(" - Partner with LUNGevity, CRC Alliance, sarcoma foundations")
|
||
print(" 4. PEDIATRIC SITES:")
|
||
print(" - Children's hospitals (infantile fibrosarcoma enriched)")
|
||
print(" 5. INTERNATIONAL EXPANSION:")
|
||
print(" - EU, Asia sites (3× enrollment pool)")
|
||
print("\nProjected Enrollment Timeline:")
|
||
print(" - US sites: 25-30 (comprehensive cancer centers)")
|
||
print(" - International: 20-30")
|
||
print(" - Monthly enrollment: 2-3 patients (across all sites)")
|
||
print(" - Duration: 36-48 months to reach n=100")
|
||
|
||
# Step 6: Statistical Design
|
||
print("\n" + "="*80)
|
||
print("STATISTICAL DESIGN (BASKET TRIAL)")
|
||
print("="*80)
|
||
print("Primary Analysis: ORR per tumor type")
|
||
print(" - Minimum 15 patients per basket for analysis")
|
||
print(" - Success threshold: ORR ≥40% (vs. null ≤10%)")
|
||
print(" - If 6/15 respond (40%), 95% CI: 16-68% → Clinically meaningful")
|
||
print("\nOverall Analysis (All Tumor Types Combined):")
|
||
print(" - Secondary analysis")
|
||
print(" - Target overall ORR: ≥60% (following larotrectinib)")
|
||
print("\nInterim Analysis:")
|
||
print(" - After 30 patients: Assess safety, futility")
|
||
print(" - If ORR <20%, consider stopping")
|
||
|
||
# Feasibility Score
|
||
print("\n" + "="*80)
|
||
print("FEASIBILITY SCORECARD: NTRK BASKET TRIAL")
|
||
print("="*80)
|
||
|
||
dimensions = {
|
||
'Patient Availability': {
|
||
'weight': 0.30,
|
||
'raw_score': 4,
|
||
'evidence': '★★★',
|
||
'rationale': 'VERY RARE (~3.6K/year US), need broad screening'
|
||
},
|
||
'Endpoint Precedent': {
|
||
'weight': 0.25,
|
||
'raw_score': 10,
|
||
'evidence': '★★★',
|
||
'rationale': 'ORR accepted, larotrectinib precedent (tissue-agnostic approval)'
|
||
},
|
||
'Regulatory Clarity': {
|
||
'weight': 0.20,
|
||
'raw_score': 9,
|
||
'evidence': '★★★',
|
||
'rationale': 'Clear path (larotrectinib precedent), accelerated approval'
|
||
},
|
||
'Comparator Feasibility': {
|
||
'weight': 0.15,
|
||
'raw_score': 8,
|
||
'evidence': '★★☆',
|
||
'rationale': 'Single-arm acceptable (no SOC for NTRK+), larotrectinib approved'
|
||
},
|
||
'Safety Monitoring': {
|
||
'weight': 0.10,
|
||
'raw_score': 8,
|
||
'evidence': '★★☆',
|
||
'rationale': 'TRK inhibitor class known, manageable AEs'
|
||
}
|
||
}
|
||
|
||
feasibility_score = sum(d['weight'] * d['raw_score'] * 10 for d in dimensions.values())
|
||
|
||
print(f"{'Dimension':<30} {'Weight':<10} {'Score':<10} {'Weighted':<10}")
|
||
print("-" * 70)
|
||
for dimension, data in dimensions.items():
|
||
weighted = data['weight'] * data['raw_score'] * 10
|
||
print(f"{dimension:<30} {data['weight']*100:.0f}%{'':<7} {data['raw_score']}/10{'':<5} {weighted:.1f}")
|
||
|
||
print("-" * 70)
|
||
print(f"TOTAL FEASIBILITY SCORE: {feasibility_score:.0f}/100 - MODERATE")
|
||
|
||
print("\n" + "="*80)
|
||
print("FINAL RECOMMENDATION: CONDITIONAL GO")
|
||
print("="*80)
|
||
print("""
|
||
This basket trial demonstrates MODERATE feasibility (Score: 68/100).
|
||
|
||
CRITICAL SUCCESS FACTOR: Screening Partnership
|
||
- NTRK fusions are ultra-rare (<0.5% across cancers)
|
||
- MUST partner with CGP companies (Foundation, Guardant) to identify patients
|
||
- Alternative: Provide sponsored NGS testing program
|
||
|
||
STRENGTHS:
|
||
- Clear regulatory path (larotrectinib precedent)
|
||
- ORR endpoint accepted for tissue-agnostic approval
|
||
- High unmet need (no effective SOC for NTRK+ tumors)
|
||
|
||
CHALLENGES:
|
||
- Slow enrollment (36-48 months for n=100)
|
||
- Competing drugs (larotrectinib, entrectinib already approved)
|
||
- High screening costs (need to test 10,000+ patients)
|
||
|
||
RECOMMENDED STRATEGY:
|
||
1. Phase 1 dose escalation (n=20-30, multiple tumor types)
|
||
2. Phase 2 basket expansion (n=80-100, ≥15 per histology)
|
||
3. Concurrent: Pediatric arm (infantile fibrosarcoma, few alternatives)
|
||
4. Regulatory: Breakthrough therapy designation (after Phase 1 signals)
|
||
5. Screening: Partner with 2-3 CGP companies, patient registries
|
||
|
||
BUDGET: $15-25M (high screening costs, slow enrollment)
|
||
TIMELINE: 48-60 months (enrollment) + 12-18 months (follow-up for DoR)
|
||
""")
|
||
```
|
||
|
||
---
|
||
|
||
## Summary Table: All 5 Examples
|
||
|
||
| Example | Phase | Design | Indication | Biomarker | Primary Endpoint | Feasibility Score | Recommendation | Key Challenge |
|
||
|---------|-------|--------|------------|-----------|------------------|-------------------|----------------|---------------|
|
||
| 1. EGFR+ NSCLC | 1/2 | Single-arm | Osimertinib-resistant NSCLC | EGFR L858R | ORR | 82/100 (HIGH) | PROCEED | None major |
|
||
| 2. Niemann-Pick C | 2 | Single-arm vs. NH | Rare lysosomal storage | Genetic (NPC1/2) | Clinical severity score | 58/100 (MOD-LOW) | CONDITIONAL GO | Slow enrollment (36+ mo) |
|
||
| 3. PD-L1 High NSCLC | 2b | Randomized 1:1 | First-line NSCLC | PD-L1 TPS ≥50% | ORR | 87/100 (HIGH) | PROCEED | Comparator cost |
|
||
| 4. Atrial Fibrillation | 3 | Non-inferiority | AFib stroke prevention | None | Stroke/SE | 90/100 (HIGH) | CONDITIONAL GO | Large N, expensive ($150-250M) |
|
||
| 5. NTRK Basket | 2 | Basket, single-arm | Pan-cancer | NTRK fusion | ORR by histology | 68/100 (MODERATE) | CONDITIONAL GO | Ultra-rare (broad screening) |
|
||
|
||
**Key Learnings**:
|
||
- Biomarker-selected oncology trials (Ex 1, 3) have HIGH feasibility
|
||
- Rare diseases (Ex 2) face enrollment challenges → need registries
|
||
- Non-inferiority trials (Ex 4) are feasible but expensive (large N)
|
||
- Basket trials (Ex 5) require broad screening partnerships
|