Files
drug-discovery-prompts/upstream/mims-harvard-ToolUniverse/skills/tooluniverse-drug-repurposing/EXAMPLES.md

33 KiB

title, task, lineage_type, upstream_source, upstream_sha, imported_at, prompt_class, upstream_changes, author, validated
title task lineage_type upstream_source upstream_sha imported_at prompt_class upstream_changes author validated
Drug Repurposing Examples import https://github.com/mims-harvard/ToolUniverse/blob/e2520a96/skills/tooluniverse-drug-repurposing/EXAMPLES.md e2520a96 2026-06-26 prompt accepted upstream false

Drug Repurposing Examples

Concrete examples of drug repurposing workflows using ToolUniverse.

Example 1: Target-Based Repurposing for Alzheimer's Disease

from tooluniverse import ToolUniverse

tu = ToolUniverse(use_cache=True)
tu.load_tools()

# Step 1: Get disease information
disease_info = tu.tools.OpenTargets_get_disease_id_description_by_name(
    diseaseName="Alzheimer's disease"
)
print(f"Disease ID: {disease_info['data']['id']}")
print(f"Description: {disease_info['data']['description']}")

# Step 2: Get top associated targets
targets = tu.tools.OpenTargets_get_associated_targets_by_disease_efoId(
    efoId=disease_info['data']['id'],
    limit=10
)

print(f"\nTop 10 targets for Alzheimer's disease:")
for i, target in enumerate(targets['data'], 1):
    print(f"{i}. {target['gene_symbol']} - Score: {target['score']}")

# Step 3: Find drugs for top 3 targets
repurposing_candidates = []

for target in targets['data'][:3]:
    gene_symbol = target['gene_symbol']
    print(f"\nSearching drugs for target: {gene_symbol}")
    
    # Search DGIdb
    dgidb_results = tu.tools.DGIdb_get_drug_gene_interactions(
        gene_name=gene_symbol
    )
    
    if dgidb_results and 'data' in dgidb_results:
        for drug in dgidb_results['data']:
            # Get detailed drug information
            drug_info = tu.tools.drugbank_get_drug_basic_info_by_drug_name_or_id(
                drug_name_or_drugbank_id=drug['drug_name']
            )
            
            # Get current indications
            indications = tu.tools.drugbank_get_indications_by_drug_name_or_drugbank_id(
                drug_name_or_drugbank_id=drug['drug_name']
            )
            
            # Check if already used for Alzheimer's
            current_indications = [ind['indication'] for ind in indications.get('data', [])]
            if not any('alzheimer' in ind.lower() for ind in current_indications):
                repurposing_candidates.append({
                    'drug_name': drug['drug_name'],
                    'target': gene_symbol,
                    'interaction_type': drug.get('interaction_type'),
                    'current_indications': current_indications,
                    'approval_status': drug_info.get('data', {}).get('groups')
                })

# Step 4: Score and rank candidates
print(f"\n{'='*80}")
print("REPURPOSING CANDIDATES FOR ALZHEIMER'S DISEASE")
print(f"{'='*80}\n")

for i, candidate in enumerate(repurposing_candidates[:10], 1):
    print(f"{i}. {candidate['drug_name']}")
    print(f"   Target: {candidate['target']}")
    print(f"   Status: {candidate['approval_status']}")
    print(f"   Current uses: {', '.join(candidate['current_indications'][:3])}")
    print()

# Step 5: Deep dive on top candidate
if repurposing_candidates:
    top_drug = repurposing_candidates[0]['drug_name']
    print(f"\nDETAILED ANALYSIS: {top_drug}")
    print("="*80)
    
    # Get safety data
    warnings = tu.tools.FDA_get_warnings_and_cautions_by_drug_name(
        drug_name=top_drug
    )
    
    # Get adverse events
    adverse_events = tu.tools.FAERS_search_reports_by_drug_and_reaction(
        drug_name=top_drug,
        limit=100
    )
    
    # Search literature
    papers = tu.tools.PubMed_search_articles(
        query=f"{top_drug} AND Alzheimer's disease",
        max_results=20
    )
    
    print(f"FDA Warnings: {len(warnings.get('data', []))} found")
    print(f"Adverse Event Reports: {len(adverse_events.get('data', []))} found")
    print(f"Related Literature: {len(papers.get('data', []))} papers")

Expected Output:

Disease ID: EFO_0000249
Description: Alzheimer's disease is a neurodegenerative disorder...

Top 10 targets for Alzheimer's disease:
1. APP - Score: 0.95
2. APOE - Score: 0.89
3. MAPT - Score: 0.85
...

REPURPOSING CANDIDATES FOR ALZHEIMER'S DISEASE
================================================================================

1. Donepezil (approved for other indication)
   Target: ACHE
   Status: ['approved']
   Current uses: mild to moderate dementia, vascular dementia
   
2. Memantine
   Target: GRIN1
   Status: ['approved']
   Current uses: moderate to severe Alzheimer's disease
...

Example 2: Compound-Based Repurposing - Finding New Uses for Metformin

from tooluniverse import ToolUniverse

tu = ToolUniverse(use_cache=True)
tu.load_tools()

# Step 1: Get comprehensive drug information
drug_name = "metformin"

print(f"DRUG REPURPOSING ANALYSIS: {drug_name.upper()}")
print("="*80)

# Basic info
drug_info = tu.tools.drugbank_get_drug_basic_info_by_drug_name_or_id(
    drug_name_or_drugbank_id=drug_name
)

# Current indications
indications = tu.tools.drugbank_get_indications_by_drug_name_or_drugbank_id(
    drug_name_or_drugbank_id=drug_name
)

# Targets
targets = tu.tools.drugbank_get_targets_by_drug_name_or_drugbank_id(
    drug_name_or_drugbank_id=drug_name
)

# Pharmacology
pharmacology = tu.tools.drugbank_get_pharmacology_by_drug_name_or_drugbank_id(
    drug_name_or_drugbank_id=drug_name
)

print(f"\nCURRENT APPROVED INDICATIONS:")
for ind in indications.get('data', [])[:5]:
    print(f"  - {ind['indication']}")

print(f"\nTARGETS:")
for target in targets.get('data', [])[:5]:
    print(f"  - {target['name']} ({target['organism']})")

# Step 2: Find diseases associated with drug targets
print(f"\n{'='*80}")
print("POTENTIAL NEW INDICATIONS BASED ON TARGET ANALYSIS")
print("="*80)

potential_indications = []

for target in targets.get('data', [])[:5]:
    gene_symbol = target.get('gene_symbol')
    if gene_symbol:
        # Search for diseases associated with this target
        target_diseases = tu.tools.OpenTargets_get_diseases_by_target_ensemblId(
            ensemblId=target['ensembl_id']
        )
        
        for disease in target_diseases.get('data', [])[:3]:
            # Check if not already indicated
            if disease['disease_name'] not in [ind['indication'] for ind in indications.get('data', [])]:
                potential_indications.append({
                    'disease': disease['disease_name'],
                    'target': gene_symbol,
                    'association_score': disease['score'],
                    'disease_id': disease['disease_id']
                })

# Step 3: Literature evidence for potential indications
print(f"\nLITERATURE EVIDENCE FOR REPURPOSING:")
print("-"*80)

for indication in sorted(potential_indications, key=lambda x: x['association_score'], reverse=True)[:5]:
    # Search for existing research
    query = f"{drug_name} AND {indication['disease']}"
    papers = tu.tools.PubMed_search_articles(
        query=query,
        max_results=10
    )
    
    clinical_trials = tu.tools.search_clinical_trials(
        condition=indication['disease'],
        intervention=drug_name
    )
    
    print(f"\n{indication['disease']}")
    print(f"  Target: {indication['target']} (score: {indication['association_score']:.2f})")
    print(f"  Literature: {len(papers.get('data', []))} papers")
    print(f"  Clinical Trials: {len(clinical_trials.get('data', []))} trials")
    
    if papers.get('data'):
        print(f"  Recent paper: {papers['data'][0].get('title', 'N/A')}")

# Step 4: Safety assessment for new indications
print(f"\n{'='*80}")
print("SAFETY PROFILE")
print("="*80)

# FDA warnings
warnings = tu.tools.FDA_get_warnings_and_cautions_by_drug_name(
    drug_name=drug_name
)

# Adverse events
adverse_events = tu.tools.FAERS_count_reactions_by_drug_event(
    medicinalproduct=drug_name.upper()
)

# Drug interactions
interactions = tu.tools.drugbank_get_drug_interactions_by_drug_name_or_id(
    drug_name_or_id=drug_name
)

print(f"\nFDA Warnings: {len(warnings.get('data', []))}")
print(f"Top Adverse Events:")
for event in adverse_events.get('results', [])[:5]:
    print(f"  - {event['term']}: {event['count']} reports")

print(f"\nDrug-Drug Interactions: {len(interactions.get('data', []))}")

# Step 5: Generate repurposing recommendation
print(f"\n{'='*80}")
print("REPURPOSING RECOMMENDATION")
print("="*80)

print(f"""
Drug: {drug_name.upper()}
Current Indication: Type 2 Diabetes
Repurposing Potential: HIGH

Top 3 Repurposing Opportunities:
1. {potential_indications[0]['disease']} (Score: {potential_indications[0]['association_score']:.2f})
   - {len([p for p in papers.get('data', []) if potential_indications[0]['disease'].lower() in p.get('title', '').lower()])} supporting papers
   - Known safety profile (widely used for 60+ years)
   - Low cost, generic availability
   
2. {potential_indications[1]['disease']} (Score: {potential_indications[1]['association_score']:.2f})
   - Emerging evidence from preclinical studies
   - Phase II trial feasibility high
   
3. {potential_indications[2]['disease']} (Score: {potential_indications[2]['association_score']:.2f})
   - Mechanistic rationale strong
   - Population overlap with diabetes patients

Recommended Next Steps:
- Systematic review of existing literature
- Phase II trial design for top indication
- Patient stratification analysis
- Pharmacokinetic/pharmacodynamic modeling
""")

Example 3: Disease-Driven Repurposing for COVID-19

from tooluniverse import ToolUniverse
import json

tu = ToolUniverse(use_cache=True)
tu.load_tools()

# Step 1: Define disease and get information
disease_name = "COVID-19"

print(f"EMERGENCY DRUG REPURPOSING: {disease_name}")
print("="*80)

# Get disease info
disease_info = tu.tools.OpenTargets_get_disease_id_description_by_name(
    diseaseName=disease_name
)

# Step 2: Get viral-host interaction targets
print("\nKEY HOST TARGETS:")
targets = tu.tools.OpenTargets_get_associated_targets_by_disease_efoId(
    efoId=disease_info['data']['id'],
    limit=20
)

for i, target in enumerate(targets['data'][:10], 1):
    print(f"{i}. {target['gene_symbol']} - {target['gene_name']}")

# Step 3: Rapid screening - find ALL approved drugs for these targets
print(f"\n{'='*80}")
print("APPROVED DRUGS TARGETING COVID-19-ASSOCIATED PROTEINS")
print("="*80)

approved_candidates = []

for target in targets['data'][:10]:
    gene_symbol = target['gene_symbol']
    
    # Search multiple databases
    dgidb = tu.tools.DGIdb_get_drug_gene_interactions(gene_name=gene_symbol)
    drugbank = tu.tools.drugbank_get_drug_name_and_description_by_target_name(target_name=gene_symbol)
    
    # Combine results
    all_drugs = []
    if dgidb and 'data' in dgidb:
        all_drugs.extend([d['drug_name'] for d in dgidb['data']])
    if drugbank and 'data' in drugbank:
        all_drugs.extend([d['drug_name'] for d in drugbank['data']])
    
    # Filter to approved only
    for drug_name in set(all_drugs):
        try:
            drug_info = tu.tools.drugbank_get_drug_basic_info_by_drug_name_or_id(
                drug_name_or_drugbank_id=drug_name
            )
            
            if drug_info and 'approved' in drug_info.get('data', {}).get('groups', []):
                approved_candidates.append({
                    'drug': drug_name,
                    'target': gene_symbol,
                    'target_score': target['score']
                })
        except:
            continue

# Step 4: Literature mining for COVID-19 evidence
print(f"\nEVIDENCE ANALYSIS:")
print("-"*80)

scored_candidates = []

for candidate in approved_candidates[:20]:  # Analyze top 20
    drug = candidate['drug']
    
    # Search COVID-19 literature
    query = f"{drug} AND (COVID-19 OR SARS-CoV-2)"
    papers = tu.tools.PubMed_search_articles(
        query=query,
        max_results=50
    )
    
    # Search clinical trials
    trials = tu.tools.search_clinical_trials(
        condition="COVID-19",
        intervention=drug
    )
    
    # Calculate evidence score
    paper_count = len(papers.get('data', []))
    trial_count = len(trials.get('data', []))
    
    evidence_score = (
        candidate['target_score'] * 40 +
        min(trial_count * 10, 30) +  # Max 30 points for trials
        min(paper_count * 2, 30)      # Max 30 points for papers
    )
    
    if paper_count > 0 or trial_count > 0:
        scored_candidates.append({
            **candidate,
            'papers': paper_count,
            'trials': trial_count,
            'evidence_score': evidence_score
        })
        
        print(f"{drug}: {paper_count} papers, {trial_count} trials (Score: {evidence_score:.1f})")

# Step 5: Safety rapid assessment
print(f"\n{'='*80}")
print("TOP CANDIDATES - SAFETY ASSESSMENT")
print("="*80)

top_candidates = sorted(scored_candidates, key=lambda x: x['evidence_score'], reverse=True)[:5]

for i, candidate in enumerate(top_candidates, 1):
    drug = candidate['drug']
    print(f"\n{i}. {drug.upper()}")
    print("-"*80)
    
    # Get safety info
    try:
        warnings = tu.tools.FDA_get_warnings_and_cautions_by_drug_name(drug_name=drug)
        adverse = tu.tools.FAERS_count_death_related_by_drug(medicinalproduct=drug.upper())
        
        print(f"Target: {candidate['target']}")
        print(f"Evidence: {candidate['papers']} papers, {candidate['trials']} trials")
        print(f"FDA Warnings: {len(warnings.get('data', []))}")
        print(f"Death-related AEs: {adverse.get('meta', {}).get('total', 0)} reports")
        
        # Get mechanism
        pharmacology = tu.tools.drugbank_get_pharmacology_by_drug_name_or_drugbank_id(
            drug_name_or_drugbank_id=drug
        )
        
        if pharmacology:
            print(f"Mechanism: {pharmacology.get('data', {}).get('mechanism_of_action', 'N/A')[:200]}")
    except:
        print("Safety data unavailable")

# Step 6: Generate priority recommendation
print(f"\n{'='*80}")
print("EMERGENCY USE RECOMMENDATION")
print("="*80)

print(f"""
REPURPOSING CANDIDATES FOR COVID-19 (Ranked by Priority)

HIGH PRIORITY (Strong Evidence + Approved + Safe):
""")

for i, candidate in enumerate(top_candidates[:3], 1):
    print(f"""
{i}. {candidate['drug'].upper()}
   Evidence Score: {candidate['evidence_score']:.1f}/100
   Target: {candidate['target']}
   Clinical Trials: {candidate['trials']} ongoing/completed
   Literature: {candidate['papers']} publications
   Status: FDA approved for other indications
   
   Recommendation: Fast-track to Phase III trial
   Timeline: 6-12 months to emergency use authorization
""")

print("""
NEXT STEPS:
1. Initiate multi-center randomized controlled trial
2. Establish optimal dosing regimen
3. Identify patient subgroups most likely to benefit
4. Monitor for drug-drug interactions with standard COVID treatments
5. Prepare emergency use authorization application
""")

Example 4: Network-Based Repurposing Using Pathway Analysis

from tooluniverse import ToolUniverse

tu = ToolUniverse(use_cache=True)
tu.load_tools()

# Step 1: Analyze pathways affected by known effective drug
known_drug = "aspirin"
target_disease = "cardiovascular disease"

print(f"PATHWAY-BASED REPURPOSING: Finding drugs similar to {known_drug}")
print("="*80)

# Get drug pathways
pathways = tu.tools.drugbank_get_pathways_reactions_by_drug_or_id(
    drug_name_or_drugbank_id=known_drug
)

print(f"\nPathways affected by {known_drug}:")
for pathway in pathways.get('data', [])[:5]:
    print(f"  - {pathway['pathway_name']}")

# Step 2: Find other drugs affecting same pathways
pathway_drugs = {}

for pathway in pathways.get('data', [])[:3]:
    pathway_name = pathway['pathway_name']
    
    drugs = tu.tools.drugbank_get_drug_name_and_description_by_pathway_name(
        pathway_name=pathway_name
    )
    
    if drugs and 'data' in drugs:
        pathway_drugs[pathway_name] = [d['drug_name'] for d in drugs['data']]

# Step 3: Score drugs by pathway overlap
drug_scores = {}
for pathway, drugs in pathway_drugs.items():
    for drug in drugs:
        if drug != known_drug:
            drug_scores[drug] = drug_scores.get(drug, 0) + 1

# Rank by pathway overlap
ranked_drugs = sorted(drug_scores.items(), key=lambda x: x[1], reverse=True)

print(f"\nDrugs with highest pathway overlap:")
for drug, score in ranked_drugs[:10]:
    print(f"  {drug}: {score} shared pathways")

# Step 4: Validate for target disease
print(f"\n{'='*80}")
print(f"VALIDATION FOR {target_disease.upper()}")
print("="*80)

validated_candidates = []

for drug, overlap_score in ranked_drugs[:20]:
    # Search for disease-specific evidence
    query = f"{drug} AND {target_disease}"
    papers = tu.tools.PubMed_search_articles(query=query, max_results=10)
    
    # Get drug info
    drug_info = tu.tools.drugbank_get_drug_basic_info_by_drug_name_or_id(
        drug_name_or_drugbank_id=drug
    )
    
    if papers.get('data'):
        validated_candidates.append({
            'drug': drug,
            'pathway_overlap': overlap_score,
            'evidence_papers': len(papers['data']),
            'status': drug_info.get('data', {}).get('groups', [])
        })

# Print validated candidates
for i, candidate in enumerate(validated_candidates[:5], 1):
    print(f"\n{i}. {candidate['drug']}")
    print(f"   Shared pathways: {candidate['pathway_overlap']}")
    print(f"   Supporting papers: {candidate['evidence_papers']}")
    print(f"   Status: {', '.join(candidate['status'])}")

Example 5: Structure-Based Repurposing

from tooluniverse import ToolUniverse

tu = ToolUniverse(use_cache=True)
tu.load_tools()

# Step 1: Start with known active compound
known_active = "imatinib"  # Cancer drug
target_disease = "rheumatoid arthritis"

print(f"STRUCTURE-BASED REPURPOSING")
print("="*80)
print(f"Known active: {known_active}")
print(f"Target disease: {target_disease}\n")

# Get structure
cid_result = tu.tools.PubChem_get_CID_by_compound_name(
    compound_name=known_active
)
cid = cid_result['data']['cid']

# Get SMILES
props = tu.tools.PubChem_get_compound_properties_by_CID(cid=cid)
smiles = props['data']['CanonicalSMILES']

print(f"PubChem CID: {cid}")
print(f"SMILES: {smiles}\n")

# Step 2: Find structurally similar compounds
print("Searching for similar structures...")
similar_compounds = tu.tools.PubChem_search_compounds_by_similarity(
    smiles=smiles,
    threshold=85,  # 85% similarity
    limit=50
)

print(f"Found {len(similar_compounds.get('data', []))} similar compounds")

# Step 3: Check which are approved drugs
approved_analogs = []

for compound in similar_compounds.get('data', [])[:20]:
    compound_cid = compound['cid']
    
    # Get drug information
    # FDA labels are keyed by drug name, not CID -- resolve the name first
    _syn = tu.tools.PubChem_get_compound_synonyms_by_CID(cid=compound_cid)
    _name = _syn['data'][0] if isinstance(_syn, dict) and _syn.get('data') else None
    drug_label = tu.tools.FDA_get_drug_label(drug_name=_name)
    
    if drug_label and 'data' in drug_label:
        # This is an approved drug
        drug_name = drug_label['data'].get('drug_name')
        
        # Get current indications
        drugbank_info = tu.tools.drugbank_get_indications_by_drug_name_or_drugbank_id(
            drug_name_or_drugbank_id=drug_name
        )
        
        approved_analogs.append({
            'drug_name': drug_name,
            'cid': compound_cid,
            'similarity': compound.get('similarity_score', 'N/A'),
            'indications': drugbank_info.get('data', [])
        })

print(f"\nFound {len(approved_analogs)} approved structural analogs\n")

# Step 4: Evaluate for target disease
print(f"Evaluating analogs for {target_disease}:")
print("-"*80)

for analog in approved_analogs[:5]:
    drug = analog['drug_name']
    
    # Check if already used for target disease
    current_indications = [ind['indication'] for ind in analog['indications']]
    already_used = any(target_disease.lower() in ind.lower() for ind in current_indications)
    
    if not already_used:
        # Search literature
        query = f"{drug} AND {target_disease}"
        papers = tu.tools.PubMed_search_articles(query=query, max_results=10)
        
        # Predict properties
        analog_props = tu.tools.PubChem_get_compound_properties_by_CID(
            cid=analog['cid']
        )
        
        print(f"\n{drug}")
        print(f"  Structural similarity: {analog['similarity']}")
        print(f"  Current indications: {', '.join(current_indications[:2])}")
        print(f"  Literature evidence: {len(papers.get('data', []))} papers")
        print(f"  MW: {analog_props['data']['MolecularWeight']}, LogP: {analog_props['data']['XLogP']}")

Example 6: Adverse Event Mining for Repurposing

from tooluniverse import ToolUniverse
from collections import Counter

tu = ToolUniverse(use_cache=True)
tu.load_tools()

# Concept: Adverse effects can be therapeutic in different contexts
# Example: Weight loss (AE in some drugs) โ†’ Obesity treatment

print("ADVERSE EVENT MINING FOR REPURPOSING")
print("="*80)

# Step 1: Define therapeutic target from adverse event
target_adverse_event = "weight loss"  # Could be therapeutic for obesity
therapeutic_indication = "obesity"

# Step 2: Find drugs with this adverse event
print(f"\nSearching for drugs causing: {target_adverse_event}")

# Query FAERS for drugs associated with weight loss
weight_loss_drugs = tu.tools.FAERS_count_drugs_by_drug_event(
    patient_reaction=target_adverse_event
)

top_drugs = [drug['term'] for drug in weight_loss_drugs.get('results', [])[:20]]

print(f"Found {len(top_drugs)} drugs with significant {target_adverse_event} reports")

# Step 3: For each drug, validate the effect and check safety
candidates = []

for drug_name in top_drugs:
    # Get full adverse event profile
    all_reactions = tu.tools.FAERS_count_reactions_by_drug_event(
        medicinalproduct=drug_name
    )
    
    # Check seriousness
    seriousness = tu.tools.FAERS_count_seriousness_by_drug_event(
        medicinalproduct=drug_name
    )
    
    # Get drug info
    try:
        drug_info = tu.tools.drugbank_get_drug_basic_info_by_drug_name_or_id(
            drug_name_or_drugbank_id=drug_name.lower()
        )
        
        indications = tu.tools.drugbank_get_indications_by_drug_name_or_drugbank_id(
            drug_name_or_drugbank_id=drug_name.lower()
        )
        
        # Check if already used for obesity
        current_uses = [ind['indication'] for ind in indications.get('data', [])]
        if not any('obesity' in use.lower() for use in current_uses):
            candidates.append({
                'drug': drug_name,
                'current_indications': current_uses[:3],
                'weight_loss_reports': next((r['count'] for r in all_reactions.get('results', []) 
                                            if 'weight' in r['term'].lower()), 0),
                'serious_reports': seriousness.get('meta', {}).get('serious_count', 0),
                'status': drug_info.get('data', {}).get('groups', [])
            })
    except:
        continue

# Step 4: Rank by safety and efficacy signals
print(f"\n{'='*80}")
print(f"REPURPOSING CANDIDATES FOR {therapeutic_indication.upper()}")
print("="*80)

# Sort by weight loss reports, but filter out highly toxic
safe_candidates = [c for c in candidates 
                   if 'approved' in c.get('status', []) 
                   and c['serious_reports'] < 1000]

ranked = sorted(safe_candidates, 
                key=lambda x: x['weight_loss_reports'], 
                reverse=True)

for i, candidate in enumerate(ranked[:10], 1):
    print(f"\n{i}. {candidate['drug']}")
    print(f"   Weight loss reports: {candidate['weight_loss_reports']}")
    print(f"   Status: {', '.join(candidate['status'])}")
    print(f"   Current use: {', '.join(candidate['current_indications'])}")
    print(f"   Serious AE reports: {candidate['serious_reports']}")
    
    # Check mechanism
    try:
        pharmacology = tu.tools.drugbank_get_pharmacology_by_drug_name_or_drugbank_id(
            drug_name_or_drugbank_id=candidate['drug'].lower()
        )
        moa = pharmacology.get('data', {}).get('mechanism_of_action', '')
        if moa:
            print(f"   Mechanism: {moa[:150]}...")
    except:
        pass

print(f"\n{'='*80}")
print("RECOMMENDATION")
print("="*80)
print("""
Strategy: Repurpose drugs with weight loss adverse events for obesity treatment

Top candidates show:
- Consistent weight loss signal in FAERS data
- Approved status (known safety profile)
- Mechanisms compatible with weight regulation
- Lower serious adverse event rates

Next steps:
1. Systematic review of weight loss magnitude
2. Dose-response relationship analysis  
3. Patient population stratification
4. Phase II efficacy trial design
5. Long-term safety monitoring protocol
""")

Example 7: Multi-Database Integration for Comprehensive Analysis

from tooluniverse import ToolUniverse

tu = ToolUniverse(use_cache=True)
tu.load_tools()

def comprehensive_repurposing_analysis(drug_name, new_indication):
    """
    Comprehensive drug repurposing analysis integrating multiple databases.
    """
    results = {
        'drug': drug_name,
        'proposed_indication': new_indication,
        'scores': {}
    }
    
    print(f"COMPREHENSIVE REPURPOSING ANALYSIS")
    print("="*80)
    print(f"Drug: {drug_name}")
    print(f"Proposed indication: {new_indication}\n")
    
    # 1. DRUG INFORMATION (DrugBank)
    print("1. DRUGBANK ANALYSIS")
    print("-"*80)
    
    basic_info = tu.tools.drugbank_get_drug_basic_info_by_drug_name_or_id(
        drug_name_or_drugbank_id=drug_name
    )
    
    targets = tu.tools.drugbank_get_targets_by_drug_name_or_drugbank_id(
        drug_name_or_drugbank_id=drug_name
    )
    
    indications = tu.tools.drugbank_get_indications_by_drug_name_or_drugbank_id(
        drug_name_or_drugbank_id=drug_name
    )
    
    print(f"Status: {basic_info.get('data', {}).get('groups', [])}")
    print(f"Targets: {len(targets.get('data', []))}")
    print(f"Current indications: {len(indications.get('data', []))}")
    
    results['drugbank'] = {
        'status': basic_info.get('data', {}).get('groups', []),
        'targets': targets.get('data', []),
        'indications': indications.get('data', [])
    }
    
    # 2. TARGET-DISEASE ASSOCIATION (OpenTargets)
    print(f"\n2. OPENTARGETS ANALYSIS")
    print("-"*80)
    
    disease_info = tu.tools.OpenTargets_get_disease_id_description_by_name(
        diseaseName=new_indication
    )
    
    disease_targets = tu.tools.OpenTargets_get_associated_targets_by_disease_efoId(
        efoId=disease_info['data']['id'],
        limit=50
    )
    
    # Calculate target overlap
    drug_target_symbols = [t.get('gene_symbol') for t in targets.get('data', [])]
    disease_target_symbols = [t['gene_symbol'] for t in disease_targets.get('data', [])]
    overlap = set(drug_target_symbols) & set(disease_target_symbols)
    
    print(f"Disease targets: {len(disease_target_symbols)}")
    print(f"Drug targets: {len(drug_target_symbols)}")
    print(f"Overlap: {len(overlap)} targets")
    if overlap:
        print(f"Shared targets: {', '.join(overlap)}")
    
    target_score = len(overlap) / max(len(drug_target_symbols), 1) * 100
    results['scores']['target_overlap'] = target_score
    
    # 3. CHEMICAL PROPERTIES (PubChem)
    print(f"\n3. PUBCHEM ANALYSIS")
    print("-"*80)
    
    cid = tu.tools.PubChem_get_CID_by_compound_name(
        compound_name=drug_name
    )
    
    if cid and 'data' in cid:
        properties = tu.tools.PubChem_get_compound_properties_by_CID(
            cid=cid['data']['cid']
        )
        
        bioactivity = tu.tools.PubChem_get_compound_bioactivity(
            cid=cid['data']['cid']
        )
        
        print(f"CID: {cid['data']['cid']}")
        print(f"MW: {properties['data']['MolecularWeight']}")
        print(f"LogP: {properties['data']['XLogP']}")
        print(f"Active assays: {bioactivity['data']['active_assay_count']}")
        
        results['pubchem'] = {
            'cid': cid['data']['cid'],
            'properties': properties['data'],
            'bioactivity': bioactivity['data']
        }
    
    # 4. BIOACTIVITY DATA (ChEMBL)
    print(f"\n4. CHEMBL ANALYSIS")
    print("-"*80)
    
    chembl_drugs = tu.tools.ChEMBL_search_drugs(
        query=drug_name,
        limit=1
    )
    
    if chembl_drugs and 'data' in chembl_drugs:
        chembl_id = chembl_drugs['data'][0]['molecule_chembl_id']
        
        mechanisms = tu.tools.ChEMBL_get_drug_mechanisms(
            chembl_id=chembl_id
        )
        
        bioactivity_chembl = tu.tools.ChEMBL_search_activities(
            chembl_id=chembl_id
        )
        
        print(f"ChEMBL ID: {chembl_id}")
        print(f"Mechanisms: {len(mechanisms.get('data', []))}")
        print(f"Bioactivity records: {len(bioactivity_chembl.get('data', []))}")
        
        results['chembl'] = {
            'id': chembl_id,
            'mechanisms': mechanisms.get('data', []),
            'bioactivity': bioactivity_chembl.get('data', [])
        }
    
    # 5. SAFETY PROFILE (FDA + FAERS)
    print(f"\n5. SAFETY ASSESSMENT")
    print("-"*80)
    
    warnings = tu.tools.FDA_get_warnings_and_cautions_by_drug_name(
        drug_name=drug_name
    )
    
    adverse_events = tu.tools.FAERS_count_reactions_by_drug_event(
        medicinalproduct=drug_name.upper()
    )
    
    death_reports = tu.tools.FAERS_count_death_related_by_drug(
        medicinalproduct=drug_name.upper()
    )
    
    print(f"FDA warnings: {len(warnings.get('data', []))}")
    print(f"Adverse event types: {len(adverse_events.get('results', []))}")
    print(f"Death-related reports: {death_reports.get('meta', {}).get('total', 0)}")
    
    # Safety score (inverse - fewer issues = higher score)
    death_count = death_reports.get('meta', {}).get('total', 0)
    safety_score = max(0, 100 - (death_count / 100))  # Cap at 100
    results['scores']['safety'] = safety_score
    
    results['safety'] = {
        'warnings': warnings.get('data', []),
        'adverse_events': adverse_events.get('results', [])[:10],
        'deaths': death_count
    }
    
    # 6. LITERATURE EVIDENCE (PubMed + Europe PMC)
    print(f"\n6. LITERATURE EVIDENCE")
    print("-"*80)
    
    query = f"{drug_name} AND {new_indication}"
    
    pubmed = tu.tools.PubMed_search_articles(
        query=query,
        max_results=50
    )
    
    pmc = tu.tools.EuropePMC_search_articles(
        query=query,
        limit=50
    )
    
    print(f"PubMed articles: {len(pubmed.get('data', []))}")
    print(f"Europe PMC articles: {len(pmc.get('data', []))}")
    
    literature_score = min(len(pubmed.get('data', [])) * 2, 100)
    results['scores']['literature'] = literature_score
    
    results['literature'] = {
        'pubmed_count': len(pubmed.get('data', [])),
        'pmc_count': len(pmc.get('data', [])),
        'recent_papers': pubmed.get('data', [])[:5]
    }
    
    # 7. CLINICAL TRIALS
    print(f"\n7. CLINICAL TRIALS")
    print("-"*80)
    
    trials = tu.tools.search_clinical_trials(
        condition=new_indication,
        intervention=drug_name
    )
    
    print(f"Relevant trials: {len(trials.get('data', []))}")
    
    if trials.get('data'):
        for trial in trials['data'][:3]:
            print(f"  - {trial.get('title', 'N/A')}")
            print(f"    Status: {trial.get('status', 'N/A')}")
    
    trial_score = min(len(trials.get('data', [])) * 20, 100)
    results['scores']['clinical_trials'] = trial_score
    
    results['trials'] = trials.get('data', [])
    
    # 8. CALCULATE OVERALL REPURPOSING SCORE
    print(f"\n{'='*80}")
    print("REPURPOSING SCORE")
    print("="*80)
    
    weights = {
        'target_overlap': 0.30,
        'safety': 0.25,
        'literature': 0.25,
        'clinical_trials': 0.20
    }
    
    overall_score = sum(
        results['scores'].get(key, 0) * weight 
        for key, weight in weights.items()
    )
    
    print(f"\nTarget Overlap: {results['scores']['target_overlap']:.1f}/100 (30%)")
    print(f"Safety Profile: {results['scores']['safety']:.1f}/100 (25%)")
    print(f"Literature Evidence: {results['scores']['literature']:.1f}/100 (25%)")
    print(f"Clinical Trials: {results['scores']['clinical_trials']:.1f}/100 (20%)")
    print(f"\n{'='*80}")
    print(f"OVERALL REPURPOSING POTENTIAL: {overall_score:.1f}/100")
    print("="*80)
    
    # Classification
    if overall_score >= 70:
        recommendation = "HIGH POTENTIAL - Recommend immediate trial planning"
    elif overall_score >= 50:
        recommendation = "MODERATE POTENTIAL - Additional validation recommended"
    elif overall_score >= 30:
        recommendation = "LOW POTENTIAL - Requires more evidence"
    else:
        recommendation = "INSUFFICIENT DATA - Not recommended at this time"
    
    print(f"\nRecommendation: {recommendation}")
    
    return results

# Example usage
result = comprehensive_repurposing_analysis(
    drug_name="metformin",
    new_indication="Alzheimer's disease"
)

This comprehensive example demonstrates:

  • Multi-database integration
  • Systematic scoring methodology
  • Evidence-based ranking
  • Practical recommendations