
Tooluniverse Binder Discovery
- 345 installs
- 1.6k repo stars
- Updated August 4, 2026
- mims-harvard/tooluniverse
tooluniverse-binder-discovery is an agent tooling skill that discovers and maps ToolUniverse binders and their attached tools so developers and coding agents can locate the right capability without manually scanning the
About
tooluniverse-binder-discovery is a MIMS Harvard ToolUniverse skill for navigating the ToolUniverse binder architecture. It helps developers and AI agents enumerate binders, understand which tools each binder exposes, and select the correct capability path instead of reading the entire tooluniverse repository by hand. Teams reach for it when wiring scientific, bioinformatics, or general utility tools into agent pipelines and need a structured discovery pass first. The skill emphasizes capability mapping and binder-to-tool relationships that downstream agent configurations depend on. Use it during build-phase agent-tooling setup before invoking specialized analysis skills such as proteomics workflows elsewhere in the same ecosystem.
- Maps ToolUniverse binder catalog
- Surfaces attached tool capabilities
- Speeds capability reuse
- Reduces duplicate tool authoring
- Improves agent tool selection
Tooluniverse Binder Discovery by the numbers
- 345 all-time installs (skills.sh)
- +5 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #2,134 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/mims-harvard/tooluniverse --skill tooluniverse-binder-discoveryAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 345 |
|---|---|
| repo stars | ★ 1.6k |
| Last updated | August 4, 2026 |
| Repository | mims-harvard/tooluniverse ↗ |
How do you discover ToolUniverse binders and tools?
Discover and map available ToolUniverse binders and their attached tools so agents and developers can locate the right capability without manually scanning the full repository.
Who is it for?
Developers configuring ToolUniverse-powered agents who need a structured map of binders and attached tools before integration.
Skip if: Skip tooluniverse-binder-discovery when you already know the exact ToolUniverse tool ID and only need to execute a single analysis workflow.
When should I use this skill?
Trigger when exploring ToolUniverse capabilities, mapping binders to tools, or selecting the right ToolUniverse module for an agent pipeline.
What you get
Binder inventory maps, tool attachment listings, and capability routing notes for ToolUniverse agent configuration.
Files
Small Molecule Binder Discovery Strategy
Systematic discovery of novel small molecule binders using 60+ ToolUniverse tools across druggability assessment, known ligand mining, similarity expansion, ADMET filtering, and synthesis feasibility.
LOOK UP DON'T GUESS - Always retrieve actual data from tools before drawing conclusions. Do not assume druggability, binding sites, or compound properties based on target class alone.
KEY PRINCIPLES: 1. Report-first approach - Create report file FIRST, then populate progressively 2. Target validation FIRST - Confirm druggability before compound searching 3. Multi-strategy approach - Combine structure-based and ligand-based methods 4. ADMET-aware filtering - Eliminate poor compounds early 5. Evidence grading - Grade candidates by supporting evidence 6. Actionable output - Provide prioritized candidates with rationale 7. English-first queries - Always use English terms in tool calls. Respond in the user's language
---
Binding Site Reasoning (Start Here)
Before any tool call, reason about the target's structural biology:
Is the binding site a well-defined pocket (small molecule accessible) or a flat protein-protein interface (needs peptide/macrocycle)? This determines your screening strategy.
- Enzymes with active sites (proteases, kinases, ATPases): deep, well-defined pockets. Classic small molecule territory. Prioritize co-crystal structure search and known inhibitor scaffold analysis.
- GPCRs and ion channels: transmembrane pockets. Structure often available; start with GPCRdb and GtoPdb for known pharmacology.
- Nuclear receptors: deep hydrophobic pockets. Excellent small molecule tractability; ligand-based methods are well-powered.
- Protein-protein interfaces: flat, large contact surface. Small molecules rarely compete effectively unless there is a "hot spot" cavity. Check whether any allosteric pockets exist before committing to small molecule strategy. Warn the user if no pocket is found.
- Intrinsically disordered regions: essentially no small molecule approach. Redirect to peptide or degrader strategies.
- Scaffolding / adaptor proteins: assess co-crystal structures for unexpected pockets before declaring undruggable.
Use this reasoning to select phases and warn the user about challenges before executing a full workflow.
---
Critical Workflow Requirements
1. Report-First Approach (MANDATORY)
DO NOT show search process or tool outputs to the user. Instead:
1. Create the report file FIRST - Before any data collection:
- File name:
[TARGET]_binder_discovery_report.md - Initialize with all section headers from the template (see REPORT_TEMPLATE.md)
- Add placeholder text:
[Researching...]in each section
2. Progressively update the report - As you gather data, update each section immediately.
3. Output separate data files:
[TARGET]_candidate_compounds.csv- Prioritized compounds with SMILES, scores[TARGET]_bibliography.json- Literature references (optional)
2. Citation Requirements (MANDATORY)
Every piece of information MUST include its source:
Example: *Source: ChEMBL via ChEMBL_get_target_activities (CHEMBL203)*
---
Workflow Overview
Phases in order:
- Phase 0: Tool verification (check parameter names with
get_tool_info) - Phase 1: Target validation — resolve IDs, assess druggability, identify binding sites, predict structure if needed
- Phase 2: Known ligand mining — ChEMBL, BindingDB, GtoPdb, PubChem BioAssay, chemical probes; SAR analysis
- Phase 3: Structure analysis — PDB co-crystals, EMDB (membrane targets), binding pocket characterization
- Phase 3.5: Docking validation — dock reference inhibitor to validate pocket geometry
- Phase 4: Compound expansion — similarity/substructure search (seeds: 3-5 diverse actives) + de novo generation
- Phase 5: ADMET filtering — physicochemical, bioavailability, toxicity, CYP, structural alerts
- Phase 6: Candidate docking and prioritization — score and rank top 20
- Phase 6.5: Literature evidence — PubMed, EuropePMC, OpenAlex
- Phase 7: Report synthesis and delivery
---
Phase 0: Tool Verification
CRITICAL: Verify tool parameters before calling unfamiliar tools.
tool_info = tu.tools.get_tool_info(tool_name="ChEMBL_get_target_activities")Common parameter corrections (verify with get_tool_info if uncertain):
OpenTargets_*:ensemblId(camelCase);ADMETAI_*:smilesmust be a listNvidiaNIM_alphafold2(requires NVIDIA_API_KEY env var; free key at build.nvidia.com):sequencenotseq;NvidiaNIM_genmol(requires NVIDIA_API_KEY env var; free key at build.nvidia.com): SMILES must contain[*{min-max}]NvidiaNIM_boltz2(requires NVIDIA_API_KEY env var; free key at build.nvidia.com):polymers=[{"molecule_type": "protein", "sequence": "..."}]
---
Phase 1: Target Validation
1.1 Identifier Resolution
Resolve all IDs upfront and store for downstream queries:
1. UniProt_search(query=target_name, organism="human") -> UniProt accession
2. MyGene_query_genes(q=gene_symbol, species="human") -> Ensembl gene ID
3. ChEMBL_search_targets(query=target_name, organism="Homo sapiens") -> ChEMBL target ID
4. GtoPdb_search_targets(query=target_name) -> GtoPdb ID (if GPCR/channel/enzyme)1.2 Druggability Assessment
Use multi-source triangulation:
OpenTargets_get_target_tractability_by_ensemblID(ensemblId)- tractability bucketDGIdb_get_gene_druggability(genes=[gene_symbol])- druggability categoriesOpenTargets_get_target_classes_by_ensemblID(ensemblId)- target class- For GPCRs:
GPCRdb_get_protein+GPCRdb_get_ligands+GPCRdb_get_structures - For antibody landscape:
TheraSAbDab_search_by_target(target=target_name)
Decision Point: If no tractability data and binding site reasoning suggests PPI or disordered region, explicitly warn the user before proceeding.
1.3 Binding Site Analysis
ChEMBL_search_binding_sites(target_chembl_id)get_binding_affinity_by_pdb_id(pdb_id)for co-crystallized ligandsInterPro_get_protein_domains(accession)for domain architecture
1.4 Structure Prediction (NVIDIA NIM)
Requires NVIDIA_API_KEY. Two options:
- AlphaFold2:
NvidiaNIM_alphafold2(sequence, algorithm="mmseqs2")- high accuracy, 5-15 min - ESMFold:
ESMFold_predict_structure(sequence)- fast (~30s), max 1024 AA
pLDDT guidance: >=90 very high confidence, 70-90 confident, <70 use with caution. Low pLDDT in the putative binding region undermines docking reliability.
---
Phase 2: Known Ligand Mining
Priority order for bioactivity data: 1. ChEMBL_get_target_activities - curated, SAR-ready 2. BindingDB_get_ligands_by_uniprot - direct Ki/Kd with literature links 3. GtoPdb_search_ligands - pharmacology focus (GPCRs, channels) 4. PubChem_search_assays_by_target_gene - HTS screens, novel scaffolds 5. OpenTargets_get_chemical_probes_by_target_ensemblID - validated probes
Key steps: 1. Filter to IC50/Ki/Kd < 10 uM; retrieve molecule details for top actives 2. Identify chemical probes and approved drugs 3. Analyze SAR: common scaffolds, key modifications 4. Check off-target selectivity: BindingDB_get_targets_by_compound
---
Phase 3: Structure Analysis
Tools:
PDB_search_similar_structures(query=uniprot, type="sequence")- find PDB entriesget_protein_metadata_by_pdb_id(pdb_id)- resolution, methodget_binding_affinity_by_pdb_id(pdb_id)- co-crystal ligand affinitiesget_ligand_smiles_by_chem_comp_id(chem_comp_id)- ligand SMILES from PDBEMDB_search_structures(query)- cryo-EM structures (prefer for GPCRs, ion channels)alphafold_get_prediction(qualifier)- AlphaFold DB fallback
Phase 3.5: Docking Validation (NVIDIA NIM)
If PDB + SDF available: use get_diffdock_info(protein=PDB, ligand=SDF, num_poses=10). If only sequence + SMILES: use NvidiaNIM_boltz2(polymers=[...], ligands=[...]).
Dock a known reference inhibitor first to validate the binding pocket geometry before running candidates.
---
Phase 4: Compound Expansion
4.1-4.3 Search-Based Expansion
Use 3-5 diverse actives as seeds, similarity threshold 70-85%:
ChEMBL_search_similar_molecules(molecule=SMILES, similarity=70)PubChem_search_compounds_by_similarity(smiles, threshold=0.7)ChEMBL_search_substructure(smiles=core_scaffold)STITCH_get_chemical_protein_interactions(identifier=gene, species=9606)
4.4 De Novo Generation (NVIDIA NIM)
GenMol - scaffold hopping with masked regions:
NvidiaNIM_genmol(smiles="...core...[*{3-8}]...tail...[*{1-3}]...", num_molecules=100, temperature=2.0, scoring="QED")MolMIM - controlled analog generation:
NvidiaNIM_molmim(smi=reference_smiles, num_molecules=50, algorithm="CMA-ES")---
Phase 5: ADMET Filtering
Apply sequentially (all tools accept smiles=[list]):
1. Physicochemical: ADMETAI_predict_physicochemical_properties - Lipinski violations <= 1, QED > 0.3, MW 200-600 2. Bioavailability: ADMETAI_predict_bioavailability - oral bioavailability > 0.3 3. Toxicity: ADMETAI_predict_toxicity - AMES < 0.5, hERG < 0.5, DILI < 0.5 4. CYP: ADMETAI_predict_CYP_interactions - flag CYP3A4 inhibitors 5. Alerts: ChEMBL_search_compound_structural_alerts - no PAINS
Include a filter funnel summary in the report showing pass/fail counts at each stage.
---
Phase 6: Candidate Docking & Prioritization
Composite score: docking confidence (40%) + ADMET score (30%) + similarity to known active (20%) + novelty (10%, not in ChEMBL + novel scaffold bonus).
Evidence tiers for candidates:
- T1 (3 stars): Experimental IC50/Ki < 100 nM
- T2 (2 stars): Docking within 5% of reference OR IC50 100-1000 nM
- T3 (1 star): >80% similarity to T1 compound
- T4 (0 stars): 70-80% similarity, scaffold match only
- T5 (no stars): Generated molecule, ADMET-passed, no docking
Deliver top 20 candidates with: Rank, ID, SMILES, docking score, ADMET score, overall score, source, evidence tier.
---
Phase 6.5: Literature Evidence
PubMed_search_articles(query="[TARGET] inhibitor SAR")- peer-reviewedEuropePMC_search_articles(query, source="PPR")- preprints (not peer-reviewed)openalex_search_works(query)- citation analysis
---
Fallback Chains
Target ID: ChEMBL_search_targets -> GtoPdb_search_targets -> "Not in databases"
Druggability: OpenTargets tractability -> DGIdb druggability -> target class proxy
Bioactivity: ChEMBL -> BindingDB -> GtoPdb -> PubChem BioAssay -> "No data"
Structure: PDB -> EMDB (membrane) -> alphafold_get_prediction -> NvidiaNIM_esmfold -> AlphaFold DB -> "None"
Similarity: ChEMBL similar -> PubChem similar -> "Search failed"
Docking: get_diffdock_info -> NvidiaNIM_boltz2 -> similarity-based scoring
Generation: NvidiaNIM_genmol -> NvidiaNIM_molmim -> similarity search only
Literature: PubMed -> EuropePMC (preprints) -> OpenAlex
GPCR data: GPCRdb_get_protein -> GtoPdb_search_targets---
Programmatic Access (Beyond Tools)
When ToolUniverse tools return limited compound sets, access chemical databases directly:
import requests, pandas as pd
# PubChem batch property retrieval (up to 100 CIDs per call)
cids = "2244,5988,3672"
url = f"https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid/{cids}/property/MolecularWeight,XLogP,TPSA,HBondDonorCount,HBondAcceptorCount/JSON"
props = pd.DataFrame(requests.get(url).json()["PropertyTable"]["Properties"])
# ChEMBL bioactivity bulk download for a target
target_id = "CHEMBL203" # EGFR
url = f"https://www.ebi.ac.uk/chembl/api/data/activity.json?target_chembl_id={target_id}&pchembl_value__gte=5&limit=1000"
activities = requests.get(url).json()["activities"]
df = pd.DataFrame(activities)[["molecule_chembl_id", "canonical_smiles", "pchembl_value", "standard_type"]]
# Lipinski Rule of 5 filtering (no RDKit needed)
lipinski = props[(props["MolecularWeight"] <= 500) & (props["XLogP"] <= 5) &
(props["HBondDonorCount"] <= 5) & (props["HBondAcceptorCount"] <= 10)]
# SDF download from PubChem (for docking input)
sdf_url = f"https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid/{cids}/SDF"
sdf_content = requests.get(sdf_url).textSee tooluniverse-data-wrangling skill for format cookbook and pagination patterns.
---
NVIDIA NIM Runtime Notes
AlphaFold2: 5-15 min (async, max ~2000 AA). ESMFold: ~30 sec (max 1024 AA). DiffDock: ~1-2 min/ligand. Boltz2: ~2-5 min. GenMol/MolMIM: ~1-3 min.
Always check: import os; nvidia_available = bool(os.environ.get("NVIDIA_API_KEY"))
For large expansions (>500 compounds): batch in chunks of 100, prioritize top candidates for docking.
---
Reference Files
- WORKFLOW_DETAILS.md - Phase-by-phase procedures, code patterns, screening protocols
- TOOLS_REFERENCE.md - Complete tool reference with parameters and fallback chains
- REPORT_TEMPLATE.md - Report file template and evidence grading system
- EXAMPLES.md - End-to-end workflow examples (EGFR, novel target, lead optimization)
- CHECKLIST.md - Pre-delivery verification checklist
Small Molecule Binder Discovery Checklist
Pre-delivery verification checklist for binder discovery reports.
Report Quality Checklist
Structure & Format
- [ ] Report file created with correct naming:
[TARGET]_binder_discovery_report.md - [ ] All 9 main sections present
- [ ] Executive summary completed (not
[Researching...]) - [ ] Data sources section populated
Phase 1: Target Validation
- [ ] UniProt accession documented
- [ ] ChEMBL target ID obtained (or "Not in ChEMBL" noted)
- [ ] Ensembl gene ID resolved
- [ ] Druggability assessed from ≥2 sources
- [ ] Druggability scorecard included
- [ ] Binding site information present (or "No structural data available")
- [ ] Target class identified (kinase, GPCR, enzyme, etc.)
Phase 1.4: Structure Prediction (NVIDIA NIM)
- [ ] NVIDIA_API_KEY availability checked and documented
- [ ] Structure prediction method stated (AlphaFold2/ESMFold/PDB)
- [ ] pLDDT confidence scores reported (if NvidiaNIM_alphafold2 used)
- [ ] Confidence breakdown table included (Very High/Confident/Low/Very Low)
- [ ] Key binding residue pLDDT values documented
- [ ] Mean pLDDT interpretation provided
- [ ] Structure source attributed (NvidiaNIM_alphafold2, NvidiaNIM_esmfold, or PDB)
Phase 2: Known Ligands
- [ ] ChEMBL bioactivity data queried
- [ ] Activity statistics table included (count, potency distribution)
- [ ] Top 10 most potent compounds listed with IC50/Ki values
- [ ] Chemical probes identified (or "None available" stated)
- [ ] SAR insights summarized (scaffolds, key modifications)
- [ ] Approved drugs for target listed (or "None approved")
Phase 3: Structure
- [ ] PDB structures listed with resolution (or "No experimental structure")
- [ ] Best structure for docking identified and justified
- [ ] Binding pocket described (residues, volume, character)
- [ ] Key interaction points documented
- [ ] AlphaFold structure noted if no experimental
Phase 3.5: Docking Validation (NVIDIA NIM)
- [ ] Reference compound selected for docking validation
- [ ] Reference compound docked (NvidiaNIM_diffdock or NvidiaNIM_boltz2)
- [ ] Docking method documented (DiffDock vs Boltz2)
- [ ] Best pose confidence score reported
- [ ] Steric clash assessment included
- [ ] Validation status stated (✓ binding pocket captured or ✗ issues)
- [ ] Docking tool source attributed
Phase 4: Compound Expansion
- [ ] ≥3 diverse seed compounds used for similarity search
- [ ] Similarity threshold documented (typically 70-85%)
- [ ] Total compounds from similarity search reported
- [ ] Substructure search completed (if scaffolds identified)
- [ ] Cross-database mining results included
- [ ] Deduplication performed and counts reported
- [ ] Source attribution for each search
Phase 4.4: De Novo Generation (NVIDIA NIM) - Optional
- [ ] Seed scaffolds identified from top actives
- [ ] Masked SMILES designed (if NvidiaNIM_genmol used)
- [ ] Mask positions and purpose documented
- [ ] Number of molecules generated reported
- [ ] Lipinski pass rate documented
- [ ] Mean QED score reported
- [ ] Unique scaffolds count noted
- [ ] Top generated compounds listed with SMILES, QED, LogP
- [ ] Generation tool attributed (NvidiaNIM_genmol or NvidiaNIM_molmim)
- [ ] Generated compounds passed to ADMET filtering
Phase 5: ADMET Filtering
- [ ] Physicochemical filters applied (Lipinski, QED)
- [ ] Filter thresholds documented
- [ ] Bioavailability predictions included
- [ ] Toxicity predictions included (AMES, hERG, DILI minimum)
- [ ] CYP interaction flags noted
- [ ] Structural alert check completed
- [ ] Filter funnel table with pass/fail counts at each stage
- [ ] Common failure reasons documented
Phase 6: Candidate Docking & Prioritization
- [ ] All candidates docked (NvidiaNIM_diffdock or NvidiaNIM_boltz2)
- [ ] Docking scores compared to reference compound
- [ ] Scoring methodology explained (docking + ADMET + novelty)
- [ ] All scoring dimensions documented with weights
- [ ] ≥20 candidates ranked (or all available if fewer)
- [ ] Top 20 table includes: ID, SMILES, Docking vs Ref, ADMET score, overall score
- [ ] Synthesis feasibility assessed (SA score or commercial availability)
- [ ] Scaffold diversity noted (number of distinct scaffolds)
- [ ] Evidence tier assigned to each candidate (T0-T5 scale)
Phase 7: Recommendations
- [ ] ≥3 immediate actions listed
- [ ] Experimental validation plan outlined
- [ ] Backup strategies identified
- [ ] Timeline/priority suggestions included
Phase 8: Data Gaps
- [ ] All data gaps aggregated in one section
- [ ] Reason for each gap documented
- [ ] Alternative approaches suggested for gaps
Phase 10: Methods Summary
- [ ] Methods summary table included
- [ ] All tools used listed with purpose
- [ ] Key tools documented:
- [ ] Sequence retrieval (UniProt_search)
- [ ] Structure prediction (NvidiaNIM_alphafold2/esmfold if used)
- [ ] Docking validation (NvidiaNIM_diffdock/boltz2 if used)
- [ ] Known ligands (ChEMBL_get_target_activities)
- [ ] Similarity search (ChEMBL_search_similar_molecules)
- [ ] De novo generation (NvidiaNIM_genmol/molmim if used)
- [ ] ADMET filtering (ADMETAI_predict_*)
- [ ] Candidate docking (NvidiaNIM_diffdock/boltz2 if used)
Data Output Files
- [ ]
[TARGET]_candidate_compounds.csvcreated with prioritized list - [ ] CSV includes: Rank, ID, SMILES, Similarity, ADMET_Score, Overall_Score, Source
- [ ] All candidates have valid SMILES
Citation Requirements
Every Section Must Include
- [ ] Source attribution for data (database name + tool used)
- [ ] Specific identifiers used (ChEMBL ID, PDB ID, etc.)
- [ ] Date of data retrieval (for dynamic databases)
Format Examples
*Source: ChEMBL via `ChEMBL_get_target_activities` (CHEMBL203)*
*Source: PDB via `get_protein_metadata_by_pdb_id` (1M17)*
*Source: ADMET-AI via `ADMETAI_predict_toxicity`*
*Source: NVIDIA NIM via `NvidiaNIM_alphafold2` (pLDDT: 90.94)*
*Source: NVIDIA NIM via `NvidiaNIM_diffdock` (confidence: 0.906)*
*Source: NVIDIA NIM via `NvidiaNIM_genmol` (100 molecules)*Evidence Grading
All Candidates Must Have
- [ ] Evidence tier assigned (★★★★ to ○○○)
- [ ] Rationale for tier documented
- [ ] Docking comparison to reference (if docking performed)
Tier Definitions Applied
| Tier | Symbol | Criteria |
|---|---|---|
| T0 | ★★★★ | Docking score > reference inhibitor |
| T1 | ★★★ | Experimental IC50/Ki < 100 nM from ChEMBL |
| T2 | ★★☆ | Docking within 5% of reference OR IC50 100-1000 nM |
| T3 | ★☆☆ | >80% similarity to T1 compound |
| T4 | ☆☆☆ | 70-80% similarity, scaffold match only |
| T5 | ○○○ | Generated molecule, ADMET-passed, no docking |
Docking-Enhanced Grading
- [ ] If docking performed, apply upgrade/downgrade rules
- [ ] Docking > reference → T0 (★★★★)
- [ ] Docking within 5% → T2 (★★☆)
- [ ] Docking >20% worse → downgrade one tier
Quantified Minimums
| Section | Minimum Requirement |
|---|---|
| Known actives | Top 10 listed with potency |
| Structures | All available listed (≥1 or explicit "none") |
| Structure prediction | pLDDT reported if NvidiaNIM used |
| Expansion seeds | ≥3 diverse compounds |
| Similarity results | ≥100 compounds or exhausted |
| De novo generation | ≥50 molecules if GenMol/MolMIM used |
| Docked candidates | All top 20 docked if NvidiaNIM available |
| Final candidates | ≥20 ranked (or all if fewer) |
| Methods summary | All tools listed with purpose |
| Immediate actions | ≥3 specific recommendations |
Final Review
Before Delivery
- [ ] No
[Researching...]placeholders remaining - [ ] All tables properly formatted
- [ ] No empty sections (use "Not available" with explanation)
- [ ] Executive summary synthesizes key findings
- [ ] Recommendations are actionable and specific
- [ ] Report is self-contained (user doesn't need external context)
Common Issues to Avoid
- [ ] Missing evidence tiers on candidates
- [ ] Unattributed data (no source citation)
- [ ] Empty ADMET predictions (tool may have failed silently)
- [ ] Inconsistent compound identifiers
- [ ] Missing SMILES in candidate list
- [ ] Recommendations without supporting data
Small Molecule Binder Discovery Examples
Detailed workflow examples for common discovery scenarios.
Example 1: Well-Characterized Target (EGFR)
User Query: "Find novel small molecule binders for EGFR"
Phase 1: Target Validation
# Step 1.1: Resolve identifiers
uniprot_result = tu.tools.UniProt_search(query="EGFR human", organism="human", limit=5)
# → P00533 (EGFR_HUMAN)
gene_result = tu.tools.MyGene_query_genes(q="EGFR", species="human")
# → ENSG00000146648, NCBI: 1956
chembl_result = tu.tools.ChEMBL_search_targets(query="EGFR", organism="Homo sapiens")
# → CHEMBL203
# Step 1.2: Assess druggability
tractability = tu.tools.OpenTargets_get_target_tractability_by_ensemblID(
ensemblId="ENSG00000146648"
)
# → Small molecule: bucket 1 (approved drugs exist)
druggability = tu.tools.DGIdb_get_gene_druggability(genes=["EGFR"])
# → Categories: Kinase, Clinically Actionable, 45 drugsReport Section 1.2:
### 1.2 Druggability Assessment
| Factor | Assessment | Score | Source |
|--------|------------|-------|--------|
| Target class | Receptor tyrosine kinase | ★★★ | ChEMBL |
| Tractability bucket | 1 (approved drugs) | ★★★ | Open Targets |
| Known drugs | 15 approved | ★★★ | DGIdb |
| Binding site | ATP pocket (well-characterized) | ★★★ | PDB |
**Overall Druggability**: ★★★ Highly druggable
*Sources: Open Targets, DGIdb, ChEMBL*Phase 2: Known Ligand Mining
# Step 2.1: Get all bioactivity data
activities = tu.tools.ChEMBL_get_target_activities(
target_chembl_id="CHEMBL203",
limit=500
)
# → 4,847 activity records
# Step 2.2: Filter to potent compounds
potent = [a for a in activities['activities']
if a['standard_type'] in ['IC50', 'Ki']
and a['standard_value'] and float(a['standard_value']) < 100]
# → 312 compounds with IC50/Ki < 100 nM
# Step 2.3: Get molecule details for top actives
top_actives = []
for activity in potent[:20]:
mol = tu.tools.ChEMBL_get_molecule(
molecule_chembl_id=activity['molecule_chembl_id']
)
top_actives.append({
'chembl_id': activity['molecule_chembl_id'],
'ic50': activity['standard_value'],
'smiles': mol['molecule_structures']['canonical_smiles'],
'max_phase': mol['max_phase']
})
# Step 2.4: Get chemical probes
probes = tu.tools.OpenTargets_get_chemical_probes_by_target_ensemblID(
ensemblId="ENSG00000146648"
)Report Section 2:
### 2.1 ChEMBL Bioactivity Summary
**Total Activity Records**: 4,847
- IC50: 2,345 | Ki: 1,234 | Kd: 456 | EC50: 812
**Potency Distribution**:
| Potency Range | Count | % |
|---------------|-------|---|
| < 10 nM | 89 | 1.8% |
| 10-100 nM | 223 | 4.6% |
| 100-1000 nM | 567 | 11.7% |
| > 1000 nM | 3,968 | 81.9% |
### 2.2 Top 10 Most Potent Compounds
| Rank | Compound | ChEMBL ID | IC50 (nM) | Phase | Scaffold |
|------|----------|-----------|-----------|-------|----------|
| 1 | Osimertinib | CHEMBL3353410 | 0.5 | 4 | Pyrimidine-amine |
| 2 | Dacomitinib | CHEMBL2110732 | 0.8 | 4 | Quinazoline |
| 3 | Afatinib | CHEMBL1173655 | 1.2 | 4 | Quinazoline |
| 4 | Erlotinib | CHEMBL553 | 2.0 | 4 | Quinazoline |
| 5 | Gefitinib | CHEMBL939 | 5.0 | 4 | Quinazoline |
| ... | ... | ... | ... | ... | ... |
*Source: ChEMBL via `ChEMBL_get_target_activities` (CHEMBL203)*Phase 3: Structure Analysis
# Step 3.1: Find PDB structures
pdb_list = tu.tools.PDB_search_similar_structures(
query="P00533",
type="sequence"
)
# → 156 structures
# Step 3.2: Get metadata for key structures
key_pdbs = ["1M17", "4HJO", "5UG9", "6JX4"]
for pdb_id in key_pdbs:
metadata = tu.tools.get_protein_metadata_by_pdb_id(pdb_id=pdb_id)
affinity = tu.tools.get_binding_affinity_by_pdb_id(pdb_id=pdb_id)Report Section 3:
### 3.1 Available Structures
**Total PDB Structures**: 156
- With small molecule ligand: 89
- Apo structures: 34
- With peptide/protein: 33
| PDB ID | Resolution | Ligand | Affinity | Conformation |
|--------|------------|--------|----------|--------------|
| 1M17 | 2.6 Å | Erlotinib | Ki=0.4 nM | Active |
| 4HJO | 2.1 Å | Lapatinib | Ki=3 nM | Inactive |
| 5UG9 | 1.9 Å | Osimertinib | Ki=0.5 nM | Active/C797S |
| 6JX4 | 2.2 Å | Compound X | IC50=12 nM | Active |
**Best Structure for Novel Binder Design**: 5UG9 (highest resolution, relevant mutation)Phase 4: Compound Expansion
# Step 4.1: Select diverse seeds
seeds = [
("CHEMBL553", "COc1cc2ncnc(Nc3ccc(C#C)c(c3)C#C)c2cc1OCCOCCOC"), # Erlotinib scaffold
("CHEMBL3353410", "COc1cc(N2CCC(CC2)n2cc(nc2c2ccc(NC(=O)C=C)c(Nc3nc(ccn3)c3cccnc3)c2)C)ccc1NC(=O)C=C"), # Osimertinib
("CHEMBL1779", "Fc1ccc(Nc2ncnc3cc(OCCCN4CCOCC4)c(OC)cc23)cc1Cl"), # Gefitinib-like
]
# Step 4.2: Similarity search
all_similar = []
for seed_id, seed_smiles in seeds:
similar = tu.tools.ChEMBL_search_similar_molecules(
molecule=seed_smiles,
similarity=75
)
all_similar.extend(similar['molecules'])
# → 892 similar compounds
# Step 4.3: PubChem expansion
pubchem_similar = tu.tools.PubChem_search_compounds_by_similarity(
smiles=seeds[0][1],
threshold=0.75
)
# → 456 additional compounds
# Step 4.4: Substructure search for quinazoline
substructure = tu.tools.ChEMBL_search_substructure(
smiles="c1ccc2ncncc2c1" # Quinazoline core
)
# → 234 quinazoline-containing compounds
# Step 4.5: Deduplicate
unique_candidates = deduplicate_by_smiles(all_similar + pubchem_similar + substructure)
# → 1,247 unique candidatesPhase 5: ADMET Filtering
# Step 5.1: Batch ADMET prediction
smiles_list = [c['smiles'] for c in unique_candidates]
# Physicochemical
physchem = tu.tools.ADMETAI_predict_physicochemical_properties(smiles=smiles_list)
# Filter: Lipinski ≤ 1, QED > 0.3
passed_physchem = [c for c in physchem if c['Lipinski_violations'] <= 1 and c['QED'] > 0.3]
# → 987 pass
# Bioavailability
bioavail = tu.tools.ADMETAI_predict_bioavailability(smiles=[c['smiles'] for c in passed_physchem])
# Filter: Oral bioavailability > 0.3
passed_bioavail = [c for c in bioavail if c['Bioavailability_Ma'] > 0.3]
# → 834 pass
# Toxicity
toxicity = tu.tools.ADMETAI_predict_toxicity(smiles=[c['smiles'] for c in passed_bioavail])
# Filter: AMES < 0.5, hERG < 0.5
passed_tox = [c for c in toxicity if c['AMES'] < 0.5 and c['hERG'] < 0.5]
# → 723 pass
# Structural alerts
final_candidates = []
for c in passed_tox:
alerts = tu.tools.ChEMBL_search_compound_structural_alerts(smiles=c['smiles'])
if not alerts.get('pains', []):
final_candidates.append(c)
# → 678 pass all filtersReport Section 5:
### 5.4 Filter Summary
| Filter Stage | Input | Passed | Failed | Pass Rate |
|--------------|-------|--------|--------|-----------|
| Initial candidates | 1,247 | - | - | - |
| Physicochemical | 1,247 | 987 | 260 | 79% |
| Drug-likeness (QED) | 987 | 892 | 95 | 90% |
| Bioavailability | 892 | 834 | 58 | 93% |
| Toxicity (AMES/hERG) | 834 | 723 | 111 | 87% |
| Structural alerts | 723 | 678 | 45 | 94% |
| **Final Candidates** | **1,247** | **678** | **569** | **54%** |
**Top Failure Reasons**:
1. MW > 600 Da: 156 compounds (12.5%)
2. hERG liability (>0.5): 78 compounds (6.3%)
3. Low bioavailability (<0.3): 58 compounds (4.7%)
4. PAINS alerts: 32 compounds (2.6%)Phase 6: Final Prioritization
Report Section 6.3:
### 6.3 Top 20 Candidate Compounds
| Rank | ID | Evidence | Sim. | ADMET | Novelty | Score | Rationale |
|------|-----|----------|------|-------|---------|-------|-----------|
| 1 | CPD-001 | ★★★ | 0.87 | 4.6 | Novel R-group | 4.5 | 87% to osimertinib, clean ADMET |
| 2 | CPD-002 | ★★☆ | 0.82 | 4.4 | Untested | 4.3 | Quinazoline analog, available |
| 3 | CPD-003 | ★★☆ | 0.79 | 4.5 | Novel core | 4.2 | Pyridine replacement |
| 4 | CPD-004 | ★★☆ | 0.81 | 4.2 | Untested | 4.1 | Improved solubility |
| 5 | CPD-005 | ★☆☆ | 0.76 | 4.3 | Novel scaffold | 4.0 | New chemotype |
| ... | ... | ... | ... | ... | ... | ... | ... |
**Scaffold Diversity**: 8 distinct scaffolds in top 20
**Commercial Availability**: 14/20 available (Enamine, MolPort)
**Estimated Hit Rate**: 20-35% based on similarity to approved drugs
*Scoring: Evidence (25%) + Similarity (25%) + ADMET (25%) + Novelty (15%) + Availability (10%)*---
Example 2: Novel Target (Limited Data)
User Query: "Find small molecules for SLC7A11 (xCT transporter)"
Key Differences for Novel Targets
1. Phase 2 will yield limited data - Few or no known ligands 2. Rely more on structure-based - AlphaFold if no experimental structure 3. Consider similar targets - Related transporters may have ligands 4. Lower evidence tiers - Most candidates will be ★☆☆ or ☆☆☆
Modified Workflow
# Phase 1: Target validation
# SLC7A11: P60880 (UniProt), ENSG00000151012, limited ChEMBL data
# Phase 2: Known ligands - limited
activities = tu.tools.ChEMBL_get_target_activities(target_chembl_id="CHEMBL4523582")
# → Only 23 activity records, best IC50 = 2.5 µM
# Phase 2b: Check related targets (SLC7 family)
related_targets = ["SLC7A1", "SLC7A5", "SLC7A8"] # Similar transporters
for target in related_targets:
activities = tu.tools.ChEMBL_search_targets(query=target)
# Look for ligands that might cross-react
# Phase 3: Structure - AlphaFold only
structure = tu.tools.alphafold_get_prediction(accession="P60880")
# → AF-P60880-F1 (predicted, pLDDT varies)
# Phase 4: Expand from weak actives AND related target ligands
# Use lower similarity threshold (60-70%) to find more chemotypes
# Phase 5-6: Same ADMET filtering and prioritizationReport Note for Novel Targets:
### Data Gaps & Limitations
| Gap | Impact | Mitigation |
|-----|--------|------------|
| Limited bioactivity data (23 records) | Low confidence in actives | Used related SLC7 family ligands |
| No experimental structure | Binding site uncertain | AlphaFold structure (moderate confidence) |
| Best known IC50 = 2.5 µM | Weak starting point | Prioritize diverse chemotypes |
**Recommended Strategy**: Broader screening campaign with multiple scaffolds
**Estimated Hit Rate**: 5-10% (lower confidence than well-characterized targets)---
Example 3: Lead Optimization
User Query: "Find analogs of compound X (CHEMBL12345) for target Y with improved ADMET"
Focus on Narrow Expansion
# Step 1: Get reference compound
ref_compound = tu.tools.ChEMBL_get_molecule(molecule_chembl_id="CHEMBL12345")
ref_smiles = ref_compound['molecule_structures']['canonical_smiles']
ref_admet = tu.tools.ADMETAI_predict_toxicity(smiles=[ref_smiles])
# Known issue: hERG = 0.72 (liability)
# Step 2: Tight similarity search (85-95%)
similar = tu.tools.ChEMBL_search_similar_molecules(molecule=ref_smiles, similarity=85)
# → 156 close analogs
# Step 3: Predict ADMET for all
all_smiles = [m['smiles'] for m in similar['molecules']]
admet_results = tu.tools.ADMETAI_predict_toxicity(smiles=all_smiles)
# Step 4: Filter for improved hERG
improved = [m for m, a in zip(similar['molecules'], admet_results)
if a['hERG'] < 0.5] # Improved from 0.72
# → 34 analogs with improved hERG
# Step 5: Check if activity maintained
# Query ChEMBL for any existing bioactivity on these compoundsReport Focus:
### Lead Optimization Summary
**Reference Compound**: CHEMBL12345
- IC50 = 45 nM (target Y)
- hERG liability = 0.72 (CONCERN)
- CYP3A4 inhibitor = 0.65 (moderate)
**Optimization Goal**: Reduce hERG while maintaining potency
### Improved Analogs
| Analog | Sim. | hERG | CYP3A4 | Modification | Activity Status |
|--------|------|------|--------|--------------|-----------------|
| CPD-A | 0.91 | 0.34 | 0.42 | N-methyl→N-H | Untested |
| CPD-B | 0.88 | 0.28 | 0.51 | Remove basic N | Untested |
| CPD-C | 0.92 | 0.41 | 0.38 | Add hydroxyl | IC50=67 nM (similar) |
**Recommended**: CPD-C (proven activity retention, improved hERG)---
Example 4: NVIDIA NIM-Enhanced Workflow (CDK4 Kinase)
User Query: "Discover novel CDK4 inhibitors using all available structure prediction and docking"
Check NVIDIA NIM Availability
import os
nvidia_available = bool(os.environ.get("NVIDIA_API_KEY"))
print(f"NVIDIA NIM tools: {'Available' if nvidia_available else 'Unavailable'}")Phase 1: Target Validation + Structure Prediction
# Step 1.1: Standard identifier resolution
uniprot_result = tu.tools.UniProt_search(query="CDK4 human", organism="human", limit=5)
# → P11802 (CDK4_HUMAN)
gene_result = tu.tools.MyGene_query_genes(q="CDK4", species="human")
# → ENSG00000135446
chembl_result = tu.tools.ChEMBL_search_targets(query="CDK4", organism="Homo sapiens")
# → CHEMBL3116
# Step 1.2: Get protein sequence
uniprot_details = tu.tools.UniProt_get_entry(accession="P11802")
cdk4_sequence = uniprot_details['sequence']
# Step 1.3: Check for existing PDB structures
pdb_structures = tu.tools.PDB_search_similar_structures(query="P11802", type="sequence")
# → 25 structures, best: 2W9Z (2.0 Å, with palbociclib)
# Step 1.4: Predict structure with NVIDIA NIM for comparison
if nvidia_available:
predicted_structure = tu.tools.NvidiaNIM_alphafold2(
sequence=cdk4_sequence,
algorithm="mmseqs2",
relax_prediction=False
)
# → PDB content with pLDDT scores
# Mean pLDDT: 88.5 (high confidence)Report Section 1.4:
### 1.4 Structure Prediction Quality
**Method**: AlphaFold2 via NVIDIA NIM
**Mean pLDDT**: 88.5 (high confidence)
| Confidence Level | Range | Fraction | Interpretation |
|------------------|-------|----------|----------------|
| Very High | ≥90 | 65.2% | Highly reliable |
| Confident | 70-90 | 28.1% | Reliable |
| Low | 50-70 | 5.8% | Use caution |
| Very Low | <50 | 0.9% | Unreliable |
**Key Binding Residue Confidence** (ATP pocket):
| Residue | Function | pLDDT |
|---------|----------|-------|
| K35 | ATP binding | 92.4 |
| E51 | Salt bridge | 89.1 |
| D99 | Catalytic | 94.2 |
| D158 | DFG motif | 91.8 |
**Recommendation**: Use experimental structure 2W9Z (2.0 Å) for docking,
predicted structure validates binding pocket geometry.
*Source: NVIDIA NIM via `NvidiaNIM_alphafold2`*Phase 3.5: Docking Validation
# Step 3.5.1: Get reference compound (palbociclib) for validation
ref_compound = tu.tools.ChEMBL_get_molecule(molecule_chembl_id="CHEMBL1906")
palbociclib_smiles = ref_compound['molecule_structures']['canonical_smiles']
# Step 3.5.2: Get PDB structure content
pdb_content = tu.tools.get_pdb_structure_file(pdb_id="2W9Z", format="pdb")
# Step 3.5.3: Dock reference compound to validate binding pocket
if nvidia_available:
# Option A: DiffDock (with PDB + SDF)
validation_result = tu.tools.NvidiaNIM_diffdock(
protein=pdb_content,
ligand=palbociclib_sdf, # SDF content
num_poses=10
)
reference_confidence = validation_result['poses'][0]['confidence']
# → 0.92 (excellent)
# Option B: Boltz2 (from sequence + SMILES)
boltz_result = tu.tools.NvidiaNIM_boltz2(
polymers=[{"molecule_type": "protein", "sequence": cdk4_sequence}],
ligands=[{"smiles": palbociclib_smiles}],
sampling_steps=50,
diffusion_samples=1
)
# → Complex structure with pTM=0.85, ipTM=0.78Report Section 3.5:
### 3.5 Docking Validation Results
**Reference Compound**: Palbociclib (CHEMBL1906)
**Known IC50**: 11 nM
**DiffDock Validation**:
| Metric | Value | Interpretation |
|--------|-------|----------------|
| Best Pose Confidence | 0.92 | Excellent |
| Poses in ATP pocket | 10/10 | Correct binding mode |
| RMSD to crystal pose | 1.2 Å | Good agreement |
**Boltz2 Validation**:
| Metric | Value | Interpretation |
|--------|-------|----------------|
| pTM | 0.85 | High structure confidence |
| ipTM | 0.78 | Good interface prediction |
| Aggregate Score | 0.81 | Reliable complex |
**Validation Status**: ✓ Binding pocket correctly captured by both methods
*Source: NVIDIA NIM via `NvidiaNIM_diffdock`, `NvidiaNIM_boltz2`*Phase 4.4: De Novo Molecule Generation
# Step 4.4.1: Identify seed scaffolds from top actives
# Palbociclib scaffold: pyrido[2,3-d]pyrimidin-7-one core
seed_smiles = "CC(=O)c1c(C)c2cnc(Nc3ccc(N4CCNCC4)cn3)nc2n(C2CCCC2)c1=O"
# Step 4.4.2: Design masked SMILES for scaffold hopping
# Vary the piperazine tail and add positions on pyridine
masked_smiles = "CC(=O)c1c(C)c2cnc(Nc3ccc([*{4-10}])c([*{1-3}])n3)nc2n(C2CCCC2)c1=O"
# Step 4.4.3: Generate with GenMol
if nvidia_available:
genmol_result = tu.tools.NvidiaNIM_genmol(
smiles=masked_smiles,
num_molecules=100,
temperature=2.0,
scoring="QED"
)
# → 100 generated molecules with QED scores
generated_mols = genmol_result['molecules']
# Filter by basic criteria
good_qed = [m for m in generated_mols if m['QED'] > 0.5]
# → 78 pass QED filter
# Step 4.4.4: Alternative with MolMIM (close analogs)
if nvidia_available:
molmim_result = tu.tools.NvidiaNIM_molmim(
smi=seed_smiles,
num_molecules=50,
algorithm="CMA-ES"
)
# → 50 optimized analogsReport Section 4.4:
### 4.4 De Novo Generation Results
**Seed Scaffold**: Pyrido[2,3-d]pyrimidin-7-one (from palbociclib)
**Method**: GenMol via NVIDIA NIM
**Masked Positions**:
- Position 1: Piperazine tail region `[*{4-10}]`
- Position 2: Pyridine substituent `[*{1-3}]`
| Metric | GenMol | MolMIM |
|--------|--------|--------|
| Molecules Generated | 100 | 50 |
| Passing QED > 0.5 | 78 (78%) | 42 (84%) |
| Mean QED Score | 0.62 | 0.68 |
| Unique Scaffolds | 8 | 3 |
| Mean LogP | 3.8 | 4.1 |
**Top Generated Compounds (GenMol)**:
| ID | SMILES (abbreviated) | QED | LogP | Modification |
|----|---------------------|-----|------|--------------|
| GEN-001 | ...Nc3ccc(N4CCN(C)CC4)c(F)n3... | 0.74 | 3.2 | Methyl-piperazine + F |
| GEN-002 | ...Nc3ccc(N4CCOCC4)c(Cl)n3... | 0.71 | 3.5 | Morpholine + Cl |
| GEN-003 | ...Nc3ccc(NC4CCNCC4)cn3... | 0.69 | 2.9 | Piperidine amine |
**Next Step**: Pass all 120 generated molecules to Phase 5 (ADMET filtering)
*Source: NVIDIA NIM via `NvidiaNIM_genmol`, `NvidiaNIM_molmim`*Phase 6: Candidate Docking
# After ADMET filtering (Phase 5), dock all candidates
admet_passed = 67 # Compounds passing all ADMET filters
if nvidia_available:
# Get reference score
reference_confidence = 0.92 # From Phase 3.5
# Dock all candidates
docking_results = []
for compound in admet_passed_compounds:
result = tu.tools.NvidiaNIM_diffdock(
protein=pdb_content,
ligand=compound['sdf'],
num_poses=5
)
best_confidence = result['poses'][0]['confidence']
vs_reference = (best_confidence / reference_confidence - 1) * 100
docking_results.append({
'id': compound['id'],
'smiles': compound['smiles'],
'confidence': best_confidence,
'vs_reference_pct': vs_reference,
'evidence_tier': assign_tier(best_confidence, reference_confidence)
})
# Sort by confidence
ranked = sorted(docking_results, key=lambda x: x['confidence'], reverse=True)Report Section 6 (Final):
### 6. Final Candidate Ranking
**Scoring Method**: Docking (40%) + ADMET (30%) + Similarity (20%) + Novelty (10%)
**Reference**: Palbociclib (confidence: 0.92)
| Rank | ID | Evidence | Docking | vs Ref | ADMET | Score | Source |
|------|-----|----------|---------|--------|-------|-------|--------|
| 1 | GEN-001 | ★★★★ | 0.95 | +3.3% | 4.5 | 4.7 | GenMol |
| 2 | CPD-042 | ★★★ | 0.91 | -1.1% | 4.6 | 4.5 | ChEMBL (IC50=18nM) |
| 3 | GEN-002 | ★★★★ | 0.94 | +2.2% | 4.2 | 4.4 | GenMol |
| 4 | CPD-108 | ★★☆ | 0.89 | -3.3% | 4.4 | 4.2 | PubChem |
| 5 | GEN-015 | ★★☆ | 0.90 | -2.2% | 4.3 | 4.1 | MolMIM |
**Key Findings**:
- 2 de novo generated compounds outperform reference (★★★★)
- 3/5 top candidates from AI generation
- GEN-001 shows novel modification with improved docking score
**Methods Summary**:
| Step | Tool | Purpose |
|------|------|---------|
| Sequence retrieval | UniProt_search | Get CDK4 sequence |
| Structure prediction | NvidiaNIM_alphafold2 | Validate binding pocket |
| Docking validation | NvidiaNIM_diffdock | Confirm pose accuracy |
| Known ligands | ChEMBL_get_target_activities | Mining actives |
| De novo generation | NvidiaNIM_genmol | Novel scaffold exploration |
| ADMET filtering | ADMETAI_predict_* | Drug-likeness |
| Candidate docking | NvidiaNIM_diffdock | Final scoring |
*Full methods and parameters available in appendix*---
Common Pitfalls and Solutions
Pitfall 1: Silent Tool Failures
Problem: ChEMBL returns empty for wrong parameter name
# WRONG - returns empty
tu.tools.ChEMBL_get_target_activities(chembl_target_id="CHEMBL203")
# CORRECT
tu.tools.ChEMBL_get_target_activities(target_chembl_id="CHEMBL203")Solution: Always verify tool parameters before first use.
Pitfall 2: ADMET Batch Size
Problem: Sending 1000+ SMILES crashes or times out
# WRONG - too many at once
tu.tools.ADMETAI_predict_toxicity(smiles=all_1000_smiles)
# CORRECT - batch in chunks
for i in range(0, len(all_smiles), 100):
batch = all_smiles[i:i+100]
results = tu.tools.ADMETAI_predict_toxicity(smiles=batch)
process_results(results)Pitfall 3: Missing Deduplication
Problem: Same compound from multiple sources counted multiple times
# Track by canonical SMILES or InChIKey
seen_inchikeys = set()
unique_candidates = []
for compound in all_candidates:
inchikey = get_inchikey(compound['smiles']) # Or use canonical SMILES
if inchikey not in seen_inchikeys:
seen_inchikeys.add(inchikey)
unique_candidates.append(compound)Pitfall 4: Not Checking Existing Data
Problem: Recommending "novel" compounds that are already tested
# Check if compound already has bioactivity for target
for candidate in candidates:
existing = tu.tools.ChEMBL_search_activities(
molecule_chembl_id=candidate['chembl_id'],
target_chembl_id=target_id
)
if existing['activities']:
candidate['status'] = 'ALREADY_TESTED'
candidate['known_ic50'] = existing['activities'][0]['standard_value']
else:
candidate['status'] = 'NOVEL'Pitfall 5: NVIDIA NIM API Key Not Set
Problem: Tools fail silently or return errors
# WRONG - No fallback when NIM unavailable
result = tu.tools.NvidiaNIM_alphafold2(sequence=seq)
# → Error: NVIDIA_API_KEY not set
# CORRECT - Check availability first
import os
nvidia_available = bool(os.environ.get("NVIDIA_API_KEY"))
if nvidia_available:
result = tu.tools.NvidiaNIM_alphafold2(sequence=seq)
else:
print("NVIDIA NIM unavailable, using AlphaFold DB")
result = tu.tools.alphafold_get_prediction(accession=uniprot_id)Pitfall 6: GenMol Mask Syntax Errors
Problem: Invalid mask syntax causes generation failure
# WRONG - Missing mask or wrong syntax
tu.tools.NvidiaNIM_genmol(smiles="CCCc1ccc(O)cc1") # No mask
tu.tools.NvidiaNIM_genmol(smiles="CCCc1ccc([*])cc1") # No size range
tu.tools.NvidiaNIM_genmol(smiles="CCCc1ccc([*{1,3}])cc1") # Wrong separator
# CORRECT - Proper mask syntax with dash separator
tu.tools.NvidiaNIM_genmol(
smiles="CCCc1ccc([*{1-3}])cc1", # [*{min-max}] format
num_molecules=50,
temperature=2.0
)Pitfall 7: Boltz2 Polymer Format Errors
Problem: Wrong input format for protein-ligand complex
# WRONG - Direct sequence input
tu.tools.NvidiaNIM_boltz2(sequence="MKTAYIAK...", smiles="CCO")
# CORRECT - Use polymers and ligands lists
tu.tools.NvidiaNIM_boltz2(
polymers=[{"molecule_type": "protein", "sequence": "MKTAYIAK..."}],
ligands=[{"smiles": "CCO"}],
sampling_steps=50,
diffusion_samples=1
)Pitfall 8: Over-relying on Docking Scores
Problem: Ranking by docking alone ignores ADMET and novelty
# WRONG - Rank by docking only
ranked = sorted(candidates, key=lambda x: x['docking_score'], reverse=True)
# CORRECT - Multi-factor scoring
def calculate_score(c):
return (
c['docking_score'] * 0.40 + # Docking
c['admet_score'] * 0.30 + # ADMET
c['similarity_score'] * 0.20 + # Evidence
c['novelty_score'] * 0.10 # Novelty
)
ranked = sorted(candidates, key=calculate_score, reverse=True)Pitfall 9: Not Reporting pLDDT for Predicted Structures
Problem: Using predicted structure without confidence assessment
# WRONG - Use structure without quality check
structure = tu.tools.NvidiaNIM_alphafold2(sequence=seq)
# Immediately use for docking...
# CORRECT - Parse and report confidence
structure = tu.tools.NvidiaNIM_alphafold2(sequence=seq)
plddt_scores = parse_plddt_from_pdb(structure['pdb_content'])
mean_plddt = sum(plddt_scores) / len(plddt_scores)
# Report in output
print(f"Mean pLDDT: {mean_plddt:.1f}")
if mean_plddt < 70:
print("WARNING: Low confidence structure, binding site predictions may be unreliable")
# Check binding residue confidence specifically
binding_residues = [10, 15, 50, 80] # Known binding site residues
for res in binding_residues:
if plddt_scores[res-1] < 70:
print(f"WARNING: Binding residue {res} has low confidence ({plddt_scores[res-1]:.1f})")Report Template & Evidence Grading
Report template, evidence grading system, and report section formatting examples.
Report File Template
File: [TARGET]_binder_discovery_report.md
# Small Molecule Binder Discovery: [TARGET]
**Generated**: [Date] | **Query**: [Original query] | **Status**: In Progress
---
## Executive Summary
[Researching...]
---
## 1. Target Validation
### 1.1 Target Identifiers
[Researching...]
### 1.2 Druggability Assessment
[Researching...]
### 1.3 Binding Site Analysis
[Researching...]
---
## 2. Known Ligand Landscape
### 2.1 ChEMBL Bioactivity Summary
[Researching...]
### 2.2 Approved Drugs & Clinical Compounds
[Researching...]
### 2.3 Chemical Probes
[Researching...]
### 2.4 SAR Insights
[Researching...]
---
## 3. Structural Information
### 3.1 Available Structures
[Researching...]
### 3.2 Binding Pocket Analysis
[Researching...]
### 3.3 Key Interactions
[Researching...]
---
## 4. Compound Expansion
### 4.1 Similarity Search Results
[Researching...]
### 4.2 Substructure Search Results
[Researching...]
### 4.3 Cross-Database Mining
[Researching...]
---
## 5. ADMET Filtering
### 5.1 Physicochemical Filters
[Researching...]
### 5.2 ADMET Predictions
[Researching...]
### 5.3 Structural Alerts
[Researching...]
### 5.4 Filter Summary
[Researching...]
---
## 6. Candidate Prioritization
### 6.1 Scoring Methodology
[Researching...]
### 6.2 Synthesis Feasibility
[Researching...]
### 6.3 Top 20 Candidates
[Researching...]
---
## 7. Recommendations
### 7.1 Immediate Actions
[Researching...]
### 7.2 Experimental Validation Plan
[Researching...]
### 7.3 Backup Strategies
[Researching...]
---
## 8. Data Gaps & Limitations
[Researching...]
---
## 9. Data Sources
[Will be populated as research progresses...]
---
## 10. Methods Summary
| Step | Tool | Purpose |
|------|------|---------|
| Sequence retrieval | UniProt_search | Get protein sequence |
| Structure prediction | NvidiaNIM_alphafold2 / NvidiaNIM_esmfold | 3D structure with pLDDT |
| Docking validation | NvidiaNIM_diffdock / NvidiaNIM_boltz2 | Validate binding pocket |
| Known ligands | ChEMBL_get_target_activities | Bioactivity data |
| Similarity search | ChEMBL_search_similar_molecules | Expand chemical space |
| De novo generation | NvidiaNIM_genmol / NvidiaNIM_molmim | Novel molecule design |
| ADMET filtering | ADMETAI_predict_* | Drug-likeness assessment |
| Candidate docking | NvidiaNIM_diffdock / NvidiaNIM_boltz2 | Final scoring |---
Evidence Grading System
| Tier | Symbol | Description | Example |
|---|---|---|---|
| T0 | (4 stars) | Docking score > reference inhibitor | Better than erlotinib |
| T1 | (3 stars) | Experimental IC50/Ki < 100 nM | ChEMBL bioactivity |
| T2 | (2 stars) | Docking within 5% of reference OR IC50 100-1000 nM | High priority |
| T3 | (1 star) | Structural similarity > 80% to T1 | Predicted active |
| T4 | (0 stars) | Similarity 70-80%, scaffold match | Lower confidence |
| T5 | (empty) | Generated molecule, ADMET-passed, no docking | Speculative |
Docking-Enhanced Grading
When NVIDIA NIM docking is available:
- Docking > reference -> upgrade to T0
- Docking within 5% -> upgrade to T2
- Docking within 20% -> maintain current tier
- Docking >20% worse -> downgrade one tier
---
Report Section Formatting Examples
Druggability Assessment Example
### 1.2 Druggability Assessment
| Factor | Assessment | Score | Source |
|--------|------------|-------|--------|
| Target class | Receptor tyrosine kinase | High | ChEMBL |
| Tractability bucket | 1 (approved drugs) | High | Open Targets |
| Known drugs | 15 approved | High | DGIdb |
| Binding site | ATP pocket (well-characterized) | High | PDB |
**Overall Druggability**: Highly druggable
*Sources: Open Targets, DGIdb, ChEMBL*Known Actives Example
### 2.1 Known Active Compounds (ChEMBL)
**Total Bioactivity Points**: 2,847 (IC50: 1,234 | Ki: 892 | Kd: 456 | EC50: 265)
**Compounds with IC50 < 100 nM**: 156
| Compound | ChEMBL ID | IC50 (nM) | Max Phase | SMILES (truncated) |
|----------|-----------|-----------|-----------|-------------------|
| Erlotinib | CHEMBL553 | 2 | 4 | COc1cc2ncnc(Nc3ccc... |
*Source: ChEMBL via `ChEMBL_get_target_activities` (CHEMBL203)*Binding Site Example
### 3.2 Binding Pocket Characterization
**Pocket Volume**: ~850 A3 (well-defined)
**Key Interaction Residues**:
- **Hinge region**: M793 (backbone H-bond donor/acceptor)
- **Gatekeeper**: T790 (small residue, allows access)
- **DFG motif**: D855 (active conformation)
**Druggability Assessment**: High (enclosed pocket, conserved interactions)ADMET Filter Summary Example
### 5.4 Filter Summary
| Filter Stage | Input | Passed | Failed | Pass Rate |
|--------------|-------|--------|--------|-----------|
| Physicochemical (Lipinski) | 568 | 456 | 112 | 80% |
| Drug-likeness (QED > 0.3) | 456 | 398 | 58 | 87% |
| Bioavailability (> 0.3) | 398 | 312 | 86 | 78% |
| Toxicity filters | 312 | 267 | 45 | 86% |
| Structural alerts | 267 | 234 | 33 | 88% |
| **Final Candidates** | **568** | **234** | **334** | **41%** |Top Candidates Example
### 6.3 Top 20 Candidate Compounds
| Rank | ID | SMILES | Sim. Score | ADMET | Novelty | Overall | Rationale |
|------|-----|--------|------------|-------|---------|---------|-----------|
| 1 | CPD-001 | Cc1ccc... | 0.82 | 4.5 | Novel scaffold | 4.2 | High similarity, clean ADMET |
**Scaffold Diversity**: 7 distinct scaffolds in top 20
**Commercial Availability**: 12/20 available for purchase
**Estimated Hit Rate**: 15-25% (based on similarity to actives)Therapeutic Antibody Landscape Example
### 1.2.5 Therapeutic Antibody Landscape
| Antibody (INN) | Target | Format | Phase | PDB |
|----------------|--------|--------|-------|-----|
| Pembrolizumab | PD-1 | IgG4 | Approved | 5DK3 |
**Competitive Landscape**: 3 approved antibodies target this protein
**Strategic Implication**: Small molecule approach offers differentiation (oral dosing, CNS penetration, cost)
*Source: Thera-SAbDab via `TheraSAbDab_search_by_target`*Structure Prediction Example
### 1.4 Structure Prediction Quality
**Method**: AlphaFold2 via NVIDIA NIM
**Mean pLDDT**: 90.94 (very high confidence)
| Confidence Level | Range | Fraction | Interpretation |
|------------------|-------|----------|----------------|
| Very High | >=90 | 74.3% | Highly reliable |
| Confident | 70-90 | 16.0% | Reliable |
| Low | 50-70 | 9.0% | Use caution |
| Very Low | <50 | 0.7% | Unreliable |
*Source: NVIDIA NIM via `NvidiaNIM_alphafold2`*---
Citation Format
Every section MUST include source attribution:
*Source: ChEMBL via `ChEMBL_get_target_activities` (CHEMBL203)*
*Source: PDB via `get_protein_metadata_by_pdb_id` (1M17)*
*Source: ADMET-AI via `ADMETAI_predict_toxicity`*
*Source: NVIDIA NIM via `NvidiaNIM_alphafold2` (pLDDT: 90.94)*
*Source: NVIDIA NIM via `NvidiaNIM_diffdock` (confidence: 0.906)*
*Source: NVIDIA NIM via `NvidiaNIM_genmol` (100 molecules)*---
Data Output Files
In addition to the report:
[TARGET]_candidate_compounds.csv- Prioritized compounds with: Rank, ID, SMILES, Similarity, ADMET_Score, Overall_Score, Source[TARGET]_bibliography.json- Literature references (optional)
Tools Reference for Small Molecule Binder Discovery
Complete tool reference with verified parameters and fallback chains.
Phase 1: Target Validation Tools
UniProt_search
Purpose: Resolve protein name to UniProt accession
result = tu.tools.UniProt_search(
query="EGFR human",
organism="human",
limit=10
)
# Returns: list of UniProt entries with accession, protein name, gene nameMyGene_query_genes
Purpose: Get Ensembl and NCBI gene IDs
result = tu.tools.MyGene_query_genes(
q="EGFR",
species="human",
fields="ensembl.gene,symbol,name"
)
# Returns: gene info with ensembl.gene, symbol, nameChEMBL_search_targets
Purpose: Get ChEMBL target ID
result = tu.tools.ChEMBL_search_targets(
query="EGFR",
organism="Homo sapiens",
limit=10
)
# Returns: targets with target_chembl_id, pref_name, target_typeOpenTargets_get_target_tractability_by_ensemblID
Purpose: Assess small molecule tractability
result = tu.tools.OpenTargets_get_target_tractability_by_ensemblID(
ensemblId="ENSG00000146648" # Note: camelCase
)
# Returns: tractability assessments by modality (small molecule, antibody, etc.)⚠️ Parameter: Use ensemblId (camelCase), NOT ensembl_id
DGIdb_get_gene_druggability
Purpose: Get druggability categories
result = tu.tools.DGIdb_get_gene_druggability(
genes=["EGFR"] # List of gene symbols
)
# Returns: druggability info, drug count, categoriesChEMBL_search_binding_sites
Purpose: Find known binding sites
result = tu.tools.ChEMBL_search_binding_sites(
target_chembl_id="CHEMBL203"
)
# Returns: binding site names, typesInterPro_get_protein_domains
Purpose: Get domain architecture
result = tu.tools.InterPro_get_protein_domains(
accession="P00533" # UniProt accession
)
# Returns: domains, families, sites with positions---
Thera-SAbDab Tools (NEW - Therapeutic Antibody Landscape)
Check therapeutic antibody competition for your target.
TheraSAbDab_search_by_target
Purpose: Find antibodies targeting specific antigen
result = tu.tools.TheraSAbDab_search_by_target(
target="PD-1" # Target antigen name
)
# Returns: list of therapeutic antibodies, phase, format, PDB IDsTheraSAbDab_search_therapeutics
Purpose: Search antibodies by name or keyword
result = tu.tools.TheraSAbDab_search_therapeutics(
query="pembrolizumab" # Antibody name or target
)
# Returns: matching therapeutics with target, phase, formatTheraSAbDab_get_all_therapeutics
Purpose: Get summary of all therapeutic antibodies
result = tu.tools.TheraSAbDab_get_all_therapeutics()
# Returns: total count, distribution by phase, distribution by formatWhy Use Thera-SAbDab:
- Competitive intelligence: See what antibodies already target your protein
- Target validation: Approved antibodies = validated target
- Structural data: Links to PDB structures of antibody-target complexes
- Strategic differentiation: Identify where small molecules offer advantages
Example Competitive Analysis:
def assess_antibody_competition(tu, target_name):
"""Assess therapeutic antibody competitive landscape."""
# Search by target
results = tu.tools.TheraSAbDab_search_by_target(target=target_name)
if results.get('status') == 'success':
antibodies = results['data'].get('therapeutics', [])
# Count by phase
phases = {}
for ab in antibodies:
phase = ab.get('phase', 'Unknown')
phases[phase] = phases.get(phase, 0) + 1
return {
'total': len(antibodies),
'by_phase': phases,
'has_approved': 'Approved' in phases,
'top_antibodies': antibodies[:5]
}
return None---
GPCRdb Tools (for GPCR Targets)
~35% of approved drugs target GPCRs. Use GPCRdb for specialized GPCR data.
GPCRdb_get_protein
Purpose: Get GPCR protein information
result = tu.tools.GPCRdb_get_protein(
operation="get_protein",
protein="adrb2_human" # Entry name format: {gene}_human
)
# Returns: GPCR family, class, species, sequence infoGPCRdb_list_proteins
Purpose: List GPCR families or proteins in a family
# List all GPCR families
families = tu.tools.GPCRdb_list_proteins(
operation="list_proteins"
)
# List proteins in specific family
proteins = tu.tools.GPCRdb_list_proteins(
operation="list_proteins",
family="001" # Class A
)GPCRdb_get_structures
Purpose: Get GPCR structures with receptor state (active/inactive)
result = tu.tools.GPCRdb_get_structures(
operation="get_structures",
protein="adrb2_human",
state="active" # Optional: "active", "inactive", "intermediate"
)
# Returns: PDB IDs with receptor state, resolution, ligand infoGPCRdb_get_ligands
Purpose: Get known GPCR ligands
result = tu.tools.GPCRdb_get_ligands(
operation="get_ligands",
protein="adrb2_human"
)
# Returns: Ligands with binding affinity, type (agonist/antagonist)GPCRdb_get_mutations
Purpose: Get experimental mutation data for GPCR
result = tu.tools.GPCRdb_get_mutations(
operation="get_mutations",
protein="adrb2_human"
)
# Returns: Mutations with effect on ligand binding/signalingWhy GPCRdb is Essential for GPCR Binder Discovery:
- Receptor state structures: Active vs. inactive conformations
- Ballesteros-Weinstein numbering: Standard residue numbering across GPCRs
- Curated ligand data: Agonists, antagonists, allosteric modulators
- Mutation effects: Direct effects on ligand binding
---
Phase 1.4: Structure Prediction (NVIDIA NIM)
Requires: NVIDIA_API_KEY environment variable
NvidiaNIM_alphafold2
Purpose: High-accuracy structure prediction with pLDDT confidence scores
result = tu.tools.NvidiaNIM_alphafold2(
sequence="MRPSGTAGAALLALL...", # Protein sequence
algorithm="mmseqs2", # MSA algorithm: "mmseqs2" or "jackhmmer"
relax_prediction=False # Optional: Run relaxation
)
# Returns: PDB structure string with pLDDT scores per residue
# pLDDT interpretation:
# ≥90: Very high confidence
# 70-90: Confident
# 50-70: Low confidence
# <50: Very low confidence⚠️ Note: Async operation, may take 5-15 minutes. Max sequence length ~2000 AA.
NvidiaNIM_esmfold
Purpose: Fast structure prediction (synchronous)
result = tu.tools.NvidiaNIM_esmfold(
sequence="MRPSGTAGAALLALL..." # Protein sequence (max 1024 AA)
)
# Returns: PDB structure string⚠️ Note: Fast (~30 sec) but limited to 1024 residues. No MSA, slightly lower accuracy.
NvidiaNIM_msa_search
Purpose: Generate multiple sequence alignment for structure prediction
result = tu.tools.NvidiaNIM_msa_search(
sequence="MRPSGTAGAALLALL...",
database="uniref90" # "uniref90", "bfd", etc.
)
# Returns: MSA in A3M formatUse: Pre-generate MSA for repeated AlphaFold2 predictions.
---
Phase 2: Known Ligand Mining Tools
ChEMBL_get_target_activities
Purpose: Get all bioactivity data for target
result = tu.tools.ChEMBL_get_target_activities(
target_chembl_id="CHEMBL203",
limit=500
)
# Returns: activities with molecule_chembl_id, standard_type, standard_value⚠️ Parameter: Use target_chembl_id, NOT chembl_target_id
ChEMBL_get_molecule
Purpose: Get detailed molecule information
result = tu.tools.ChEMBL_get_molecule(
molecule_chembl_id="CHEMBL553"
)
# Returns: molecule data including SMILES, max_phase, propertiesGtoPdb_get_interactions
Purpose: Get pharmacological interactions
result = tu.tools.GtoPdb_get_interactions(
target_id="1797" # GtoPdb target ID
)
# Returns: ligands with pKi, pIC50, action typeOpenTargets_get_chemical_probes_by_target_ensemblID
Purpose: Find validated chemical probes
result = tu.tools.OpenTargets_get_chemical_probes_by_target_ensemblID(
ensemblId="ENSG00000146648"
)
# Returns: probes with ratings, use recommendationsOpenTargets_get_associated_drugs_by_target_ensemblID
Purpose: Get approved/clinical drugs
result = tu.tools.OpenTargets_get_associated_drugs_by_target_ensemblID(
ensemblId="ENSG00000146648"
)
# Returns: drugs with phase, mechanism of actionBindingDB_get_ligands_by_uniprot (NEW)
Purpose: Get ligands with measured binding affinities
result = tu.tools.BindingDB_get_ligands_by_uniprot(
uniprot="P00533", # UniProt accession
affinity_cutoff=10000 # Max affinity in nM
)
# Returns: SMILES, affinity_type (Ki/IC50/Kd), affinity value, PMIDAdvantages: Direct affinity measurements, literature links, compounds not in ChEMBL
BindingDB_get_ligands_by_pdb (NEW)
Purpose: Get ligands for a PDB structure
result = tu.tools.BindingDB_get_ligands_by_pdb(
pdb_ids="1M17", # PDB ID
affinity_cutoff=10000,
sequence_identity=100
)
# Returns: ligands binding to the structure's proteinBindingDB_get_targets_by_compound (NEW)
Purpose: Find off-targets for selectivity analysis
result = tu.tools.BindingDB_get_targets_by_compound(
smiles="CC(=O)Nc1ccc(cc1)O", # Compound SMILES
similarity_cutoff=0.85
)
# Returns: other proteins binding similar compoundsPubChem_search_assays_by_target_gene (NEW)
Purpose: Find HTS screening data for target
result = tu.tools.PubChem_search_assays_by_target_gene(
gene_symbol="EGFR"
)
# Returns: list of AIDs (assay IDs) for this targetPubChem_get_assay_summary (NEW)
Purpose: Get assay statistics
result = tu.tools.PubChem_get_assay_summary(aid=504526)
# Returns: active/inactive counts, target info, assay metadataPubChem_get_assay_active_compounds (NEW)
Purpose: Get hits from HTS screen
result = tu.tools.PubChem_get_assay_active_compounds(aid=504526)
# Returns: CIDs of active compoundsPubChem_get_assay_dose_response (NEW)
Purpose: Get IC50/EC50 curves
result = tu.tools.PubChem_get_assay_dose_response(aid=1053104)
# Returns: concentration-response dataPubChem_get_compound_bioactivity (NEW)
Purpose: Get all bioactivity for a compound
result = tu.tools.PubChem_get_compound_bioactivity(cid=2244)
# Returns: all assays, targets, activity outcomesWhen to Use Each Source:
| Source | Strengths | Primary Use |
|---|---|---|
| ChEMBL | Curated, SAR-ready | Main ligand source |
| GtoPdb | Pharmacology focus | GPCRs, channels |
| BindingDB | Direct Ki/Kd values | Affinity data |
| PubChem BioAssay | HTS screens | Novel scaffolds |
---
Phase 3: Structure Analysis Tools
PDB_search_similar_structures
Purpose: Find PDB structures by sequence
result = tu.tools.PDB_search_similar_structures(
query="P00533", # UniProt or PDB ID
type="sequence" # or "structure"
)
# Returns: PDB IDs with similarity scoresget_protein_metadata_by_pdb_id
Purpose: Get structure metadata
result = tu.tools.get_protein_metadata_by_pdb_id(
pdb_id="1M17"
)
# Returns: resolution, method, deposition date, titleget_binding_affinity_by_pdb_id
Purpose: Get co-crystallized ligand affinities
result = tu.tools.get_binding_affinity_by_pdb_id(
pdb_id="1M17"
)
# Returns: ligand codes with Kd, Ki, IC50 valuesalphafold_get_prediction
Purpose: Get AlphaFold predicted structure
result = tu.tools.alphafold_get_prediction(
accession="P00533" # UniProt accession
)
# Returns: structure prediction with pLDDT scores⚠️ Parameter: Use accession, NOT uniprot
get_ligand_smiles_by_chem_comp_id
Purpose: Get ligand structure from PDB
result = tu.tools.get_ligand_smiles_by_chem_comp_id(
chem_comp_id="AQ4" # 3-letter ligand code from PDB
)
# Returns: SMILES, name, formulaEMDB_search_structures (NEW)
Purpose: Search EMDB for cryo-EM structures
result = tu.tools.EMDB_search_structures(
query="EGFR membrane receptor"
)
# Returns: EMDB entries with emdb_id, resolution, titleWhen to use: Membrane proteins (GPCRs, ion channels), large complexes, targets where conformational states matter.
EMDB_get_structure (NEW)
Purpose: Get details for EMDB entry including associated PDB models
result = tu.tools.EMDB_get_structure(
entry_id="EMD-12345"
)
# Returns: entry details including pdb_ids (associated atomic models)Cryo-EM vs X-ray Decision:
| Target Type | Prefer | Reason |
|---|---|---|
| GPCR | Cryo-EM | Native membrane conformation |
| Ion channel | Cryo-EM | Multiple functional states |
| Kinase | X-ray | Higher resolution typically |
| Large complex | Cryo-EM | Better for macromolecular assembly |
---
Phase 3.5: Docking Validation (NVIDIA NIM)
Requires: NVIDIA_API_KEY environment variable
NvidiaNIM_diffdock
Purpose: Blind molecular docking (no predefined binding site needed)
result = tu.tools.NvidiaNIM_diffdock(
protein=pdb_content, # PDB file content as string
ligand=ligand_sdf, # Ligand in SDF or MOL2 format
num_poses=10 # Number of poses to generate
)
# Returns: Docked poses with confidence scores
# Confidence interpretation:
# >0.9: Excellent, high-confidence pose
# 0.7-0.9: Good, reliable binding mode
# 0.5-0.7: Moderate, consider alternatives
# <0.5: Low confidence, may not bindUse: When you have PDB structure and ligand SDF file.
NvidiaNIM_boltz2
Purpose: Protein-ligand complex from sequence + SMILES
result = tu.tools.NvidiaNIM_boltz2(
polymers=[{
"molecule_type": "protein",
"sequence": "MRPSGTAGAALLALL..."
}],
ligands=[{
"smiles": "COc1cc2ncnc(Nc3ccc(C#C)cc3)c2cc1OCCOC"
}],
sampling_steps=50, # Default: 50, higher = better quality
diffusion_samples=1 # Number of complex samples
)
# Returns: Protein-ligand complex structure
# Metrics: aggregate_score, pTM, ipTM
# pTM: Protein structure confidence
# ipTM: Interface prediction confidence (protein-ligand contact)Use: When starting from SMILES only, no SDF file needed.
Docking Method Selection
| Situation | Use | Reason |
|---|---|---|
| Have PDB + SDF file | NvidiaNIM_diffdock | Faster, validated inputs |
| Have sequence + SMILES only | NvidiaNIM_boltz2 | End-to-end prediction |
| Quick screening many compounds | NvidiaNIM_diffdock | Faster per ligand |
| Need high-confidence complex | NvidiaNIM_boltz2 | Better at interface prediction |
---
Phase 4: Compound Expansion Tools
ChEMBL_search_similar_molecules
Purpose: Similarity search in ChEMBL
result = tu.tools.ChEMBL_search_similar_molecules(
molecule="CC(C)Cc1ccc(cc1)C(C)C(O)=O", # SMILES, ChEMBL ID, or name
similarity=70 # Tanimoto threshold (0-100)
)
# Returns: similar molecules with similarity score⚠️ Parameter: Use molecule, NOT smiles
PubChem_search_compounds_by_similarity
Purpose: Similarity search in PubChem
result = tu.tools.PubChem_search_compounds_by_similarity(
smiles="CC(C)Cc1ccc(cc1)C(C)C(O)=O",
threshold=0.7 # Tanimoto (0-1)
)
# Returns: CIDs with similarity scoresChEMBL_search_substructure
Purpose: Substructure search in ChEMBL
result = tu.tools.ChEMBL_search_substructure(
smiles="c1ccc2ncncc2c1" # Quinazoline core
)
# Returns: molecules containing substructurePubChem_search_compounds_by_substructure
Purpose: Substructure search in PubChem
result = tu.tools.PubChem_search_compounds_by_substructure(
smiles="c1ccc2ncncc2c1"
)
# Returns: CIDs containing substructureSTITCH_get_chemical_protein_interactions
Purpose: Cross-database chemical-protein links
result = tu.tools.STITCH_get_chemical_protein_interactions(
identifier="EGFR",
species=9606 # Human
)
# Returns: chemicals with confidence scores---
Phase 4.4: De Novo Molecule Generation (NVIDIA NIM)
Requires: NVIDIA_API_KEY environment variable
NvidiaNIM_genmol
Purpose: Scaffold hopping with masked regions
result = tu.tools.NvidiaNIM_genmol(
smiles="COc1cc2ncnc(Nc3ccc([*{3-8}])c([*{1-3}])c3)c2cc1OCCCN1CCOCC1",
num_molecules=100, # Number to generate
temperature=2.0, # Diversity: 0.5=conservative, 2.0=diverse
scoring="QED" # "QED" or "logP"
)
# Returns: Generated molecules with QED/LogP scores
# Mask syntax: [*{min-max}] specifies atom count rangeMask Design Guidelines:
| Position Type | Mask Example | Typical Use |
|---|---|---|
| Small substituent | [*{1-3}] | Halogen, methyl, hydroxyl |
| Medium group | [*{3-6}] | Linkers, small rings |
| Solubilizing tail | [*{5-12}] | Morpholine, piperazine |
| Core modification | [*{6-10}] | Ring replacements |
Temperature Selection:
| Temperature | Effect | When to Use |
|---|---|---|
| 0.5-1.0 | Conservative, close analogs | Early optimization |
| 1.5-2.0 | Balanced diversity | General exploration |
| 2.5-3.0 | High diversity, more novelty | Scaffold hopping |
NvidiaNIM_molmim
Purpose: Controlled generation from reference molecule
result = tu.tools.NvidiaNIM_molmim(
smi="COc1cc2ncnc(Nc3ccc(Cl)cc3)c2cc1OCCN1CCOCC1",
num_molecules=50, # Number to generate
algorithm="CMA-ES" # Optimization algorithm
)
# Returns: Optimized analogs with property scores
# Generates molecules similar to reference but with optimized propertiesUse: Generate close analogs of top actives with improved properties.
Generation Strategy
1. Identify seeds: Top 3-5 actives from Phase 2
↓
2. Design approach:
├─ Know specific positions to vary? → NvidiaNIM_genmol (with masks)
└─ Want general optimization? → NvidiaNIM_molmim
↓
3. Generate: 50-100 molecules per seed
↓
4. Filter: Pass to Phase 5 (ADMET)
↓
5. Dock: Score survivors in Phase 6---
Phase 5: ADMET Tools
ADMETAI_predict_physicochemical_properties
Purpose: Drug-likeness assessment
result = tu.tools.ADMETAI_predict_physicochemical_properties(
smiles=["CC(C)Cc1ccc(cc1)C(C)C(O)=O"] # List of SMILES
)
# Returns: MW, logP, HBD, HBA, Lipinski violations, QED, TPSA⚠️ Parameter: smiles must be a LIST, even for single compound
ADMETAI_predict_bioavailability
Purpose: Oral absorption prediction
result = tu.tools.ADMETAI_predict_bioavailability(
smiles=["CC(C)Cc1ccc(cc1)C(C)C(O)=O"]
)
# Returns: Bioavailability_Ma, HIA_Hou, PAMPA, Caco2, Pgp_substrateADMETAI_predict_toxicity
Purpose: Toxicity endpoint predictions
result = tu.tools.ADMETAI_predict_toxicity(
smiles=["CC(C)Cc1ccc(cc1)C(C)C(O)=O"]
)
# Returns: AMES, hERG, DILI, ClinTox, LD50, CarcinogensADMETAI_predict_CYP_interactions
Purpose: CYP enzyme interactions
result = tu.tools.ADMETAI_predict_CYP_interactions(
smiles=["CC(C)Cc1ccc(cc1)C(C)C(O)=O"]
)
# Returns: CYP1A2, CYP2C9, CYP2C19, CYP2D6, CYP3A4 substrate/inhibitorADMETAI_predict_clearance_distribution
Purpose: PK predictions
result = tu.tools.ADMETAI_predict_clearance_distribution(
smiles=["CC(C)Cc1ccc(cc1)C(C)C(O)=O"]
)
# Returns: Clearance, Half_Life, VDss, PPBChEMBL_search_compound_structural_alerts
Purpose: PAINS and toxicophore detection
result = tu.tools.ChEMBL_search_compound_structural_alerts(
smiles="CC(C)Cc1ccc(cc1)C(C)C(O)=O"
)
# Returns: structural alerts, PAINS flags---
Phase 6: Candidate Docking (NVIDIA NIM)
Requires: NVIDIA_API_KEY environment variable
Batch Docking Strategy
After ADMET filtering, dock all candidates against the target structure.
# Batch docking workflow
candidates = admet_passed_compounds # From Phase 5
# Get reference score first
reference_result = tu.tools.NvidiaNIM_diffdock(
protein=pdb_content,
ligand=reference_ligand_sdf,
num_poses=10
)
reference_confidence = reference_result['best_pose_confidence']
# Dock all candidates
docking_results = []
for compound in candidates:
result = tu.tools.NvidiaNIM_diffdock(
protein=pdb_content,
ligand=compound['sdf'],
num_poses=5
)
docking_results.append({
'id': compound['id'],
'confidence': result['best_pose_confidence'],
'vs_reference': (result['best_pose_confidence'] / reference_confidence - 1) * 100
})
# Sort by confidence
ranked = sorted(docking_results, key=lambda x: x['confidence'], reverse=True)Scoring Integration
| Score Component | Weight | Source |
|---|---|---|
| Docking confidence | 40% | NvidiaNIM_diffdock |
| ADMET score | 30% | ADMETAI_predict_* |
| Similarity to known active | 20% | ChEMBL_search_similar_molecules |
| Novelty bonus | 10% | Structural uniqueness |
---
Phase 6.5: Literature Evidence (NEW)
PubMed_search_articles
Purpose: Search published SAR studies
result = tu.tools.PubMed_search_articles(
query="EGFR inhibitor SAR structure-activity",
limit=30
)
# Returns: articles with pmid, title, abstract, publication dateEuropePMC_search_articles (for Preprints)
Purpose: Search preprints from bioRxiv, medRxiv, and other sources (latest findings, not peer-reviewed)
# Search preprints using EuropePMC (bioRxiv/medRxiv don't have search APIs)
result = tu.tools.EuropePMC_search_articles(
query="EGFR small molecule discovery",
source="PPR", # PPR = Preprints only
pageSize=15
)
# If you have a DOI, get full bioRxiv metadata:
full_metadata = tu.tools.BioRxiv_get_preprint(doi="10.1101/2023.12.01.569554")
# Returns: preprints with doi, title, posted date⚠️ Note: Preprints NOT peer-reviewed. Use for emerging compounds/methods.
MedRxiv_get_preprint
Purpose: Get medRxiv preprint by DOI (for search, use EuropePMC with source='PPR')
# Get preprint by DOI
result = tu.tools.MedRxiv_get_preprint(doi="10.1101/2021.04.29.21256344")
# For searching clinical preprints, use EuropePMC:
search = tu.tools.EuropePMC_search_articles(
query="EGFR inhibitor clinical trial",
source="PPR",
pageSize=10
)
# Returns: preprints with doi, title, abstract, etc.openalex_search_works
Purpose: Search with citation analysis
result = tu.tools.openalex_search_works(
query="EGFR kinase inhibitor structure",
limit=20
)
# Returns: works with cited_by_count, publication_yearUse: Identify high-impact papers and validate compound importance.
SemanticScholar_search_papers
Purpose: AI-ranked paper search
result = tu.tools.SemanticScholar_search_papers(
query="EGFR small molecule binder",
limit=20
)
# Returns: papers with relevance ranking, citations---
Fallback Chains
Target ID Resolution
Primary: ChEMBL_search_targets
├─ Success → Use target_chembl_id
└─ Fail → GtoPdb_search_targets (for GPCR/ion channel/enzyme)
└─ Fail → Document "Target not in databases"GPCR-Specific Data (NEW)
If target is GPCR:
Primary: GPCRdb_get_protein
├─ Success → Get GPCR family, class
│ ├─ GPCRdb_get_structures → Active/inactive state structures
│ ├─ GPCRdb_get_ligands → Known agonists/antagonists
│ └─ GPCRdb_get_mutations → Mutation effects on binding
└─ Fail (not in GPCRdb) → Use GtoPdb_search_targetsDruggability Assessment
Primary: OpenTargets_get_target_tractability_by_ensemblID
├─ Success → Use tractability data
└─ Fail → DGIdb_get_gene_druggability
└─ Fail → Use target class as proxyBioactivity Data
Primary: ChEMBL_get_target_activities
├─ Success → Use ChEMBL data
└─ Fail → BindingDB_get_ligands_by_uniprot (NEW)
├─ Success → Use BindingDB data
└─ Fail → GtoPdb_get_interactions
├─ Success → Use GtoPdb data
└─ Fail → PubChem_search_assays_by_target_gene (NEW)
└─ Fail → Document "No bioactivity data"Similarity Search
Primary: ChEMBL_search_similar_molecules
├─ Success → Process results
└─ Fail → PubChem_search_compounds_by_similarity
└─ Fail → Document "Similarity search failed"Structure Retrieval
Primary: get_protein_metadata_by_pdb_id (for each PDB)
├─ Success → Use experimental structure
└─ Fail (no PDB) → EMDB_search_structures (for membrane proteins)
├─ Success → Get PDB model via EMDB_get_structure
└─ Fail → NvidiaNIM_alphafold2
└─ Fail (API error) → NvidiaNIM_esmfold
└─ Fail → alphafold_get_prediction (AlphaFold DB)
└─ Fail → Document "No structural information"Literature Search (NEW)
Primary: PubMed_search_articles (peer-reviewed)
├─ Success → Use published literature
└─ Supplement with:
├─ EuropePMC_search_articles (source='PPR' for preprints)
└─ openalex_search_works (citation analysis)Docking
Primary: NvidiaNIM_diffdock (have PDB + SDF)
├─ Success → Use docking scores
└─ Fail → NvidiaNIM_boltz2 (from sequence + SMILES)
└─ Fail → Skip docking, use similarity-based scoringDe Novo Generation
Primary: NvidiaNIM_genmol (specific position variation)
├─ Success → Process generated molecules
└─ Fail → NvidiaNIM_molmim (general analog generation)
└─ Fail → Use similarity search only (no generation)ADMET Prediction
Primary: ADMETAI_predict_* (all endpoints)
├─ Success → Use predictions
└─ Fail (invalid SMILES) → Skip compound, document reason
└─ Fail (API error) → Document "ADMET unavailable"---
Common Parameter Errors
| Tool | Wrong | Correct | Notes |
|---|---|---|---|
OpenTargets_* | ensembl_id | ensemblId | CamelCase for OpenTargets |
ChEMBL_get_target_activities | chembl_target_id | target_chembl_id | Underscore style |
ChEMBL_search_similar_molecules | smiles | molecule | Accepts SMILES, ID, or name |
alphafold_get_prediction | uniprot | accession | Just the accession |
ADMETAI_* | smiles="..." | smiles=["..."] | Must be list |
NvidiaNIM_alphafold2 | seq | sequence | Full parameter name |
NvidiaNIM_genmol | smiles="C..." | smiles="C...[*{1-3}]..." | Must have mask regions |
NvidiaNIM_boltz2 | sequence="..." | polymers=[{"molecule_type": "protein", "sequence": "..."}] | Use polymers list |
---
Batch Processing Pattern
For efficiency, batch similar operations:
# Define calls
calls = [
{"name": "ChEMBL_get_molecule", "arguments": {"molecule_chembl_id": id}}
for id in chembl_ids[:50] # Batch of 50
]
# Execute in parallel
results = tu.run_batch(calls)
# Process results
for result in results:
if result and 'molecule_structures' in result:
process_molecule(result)---
Rate Limiting Awareness
| Database | Rate Limit | Recommendation |
|---|---|---|
| ChEMBL | ~10 req/sec | Batch queries when possible |
| PubChem | ~5 req/sec | Use batch endpoints |
| ADMET-AI | No strict limit | Batch SMILES in lists |
| OpenTargets | GraphQL, lenient | Single complex queries preferred |
| UniProt | ~10 req/sec | Batch search preferred |
| NVIDIA NIM | API key quota | Check quota, cache results |
NVIDIA NIM Specific Notes
| Tool | Typical Runtime | Notes |
|---|---|---|
NvidiaNIM_alphafold2 | 5-15 min | Async, check status |
NvidiaNIM_esmfold | ~30 sec | Fast, max 1024 AA |
NvidiaNIM_diffdock | ~1-2 min | Per ligand |
NvidiaNIM_boltz2 | ~2-5 min | Includes structure prediction |
NvidiaNIM_genmol | ~1-3 min | Depends on num_molecules |
NvidiaNIM_molmim | ~1-2 min | Fast analog generation |
API Key Check:
import os
if not os.environ.get("NVIDIA_API_KEY"):
print("Warning: NVIDIA_API_KEY not set. NvidiaNIM tools unavailable.")
# Fall back to non-NIM alternativesFor large expansions (>500 compounds): 1. Use batch endpoints 2. Add small delays between batches 3. Cache results for reuse 4. For docking: prioritize top 50-100 candidates only
Binder Discovery Workflow Details
Detailed procedures, code patterns, and screening protocols for each phase.
Phase 0: Tool Verification
CRITICAL: Verify tool parameters before calling unfamiliar tools.
# Check tool params to prevent silent failures
tool_info = tu.tools.get_tool_info(tool_name="ChEMBL_get_target_activities")Known Parameter Corrections
| Tool | WRONG Parameter | CORRECT Parameter |
|---|---|---|
OpenTargets_get_target_tractability_by_ensemblID | ensembl_id | ensemblId |
ChEMBL_get_target_activities | chembl_target_id | target_chembl_id |
ChEMBL_search_similar_molecules | smiles | molecule (accepts SMILES, ChEMBL ID, or name) |
alphafold_get_prediction | uniprot | accession |
ADMETAI_* | smiles="..." | smiles=["..."] (must be list) |
NvidiaNIM_alphafold2 | seq | sequence |
NvidiaNIM_genmol | smiles="C..." | smiles="C...[*{1-3}]..." (must have mask regions) |
NvidiaNIM_boltz2 | sequence="..." | polymers=[{"molecule_type": "protein", "sequence": "..."}] |
---
Phase 1: Target Validation Details
1.1 Identifier Resolution Chain
1. UniProt_search(query=target_name, organism="human")
-> Extract: UniProt accession, gene name, protein name
2. MyGene_query_genes(q=gene_symbol, species="human")
-> Extract: Ensembl gene ID, NCBI gene ID
3. ChEMBL_search_targets(query=target_name, organism="Homo sapiens")
-> Extract: ChEMBL target ID, target type
4. GtoPdb_search_targets(query=target_name)
-> Extract: GtoPdb target ID (if GPCR/ion channel/enzyme)Store all IDs for downstream queries:
ids = {
'uniprot': 'P00533',
'ensembl': 'ENSG00000146648',
'chembl_target': 'CHEMBL203',
'gene_symbol': 'EGFR',
'gtopdb': '1797' # if available
}1.2 Druggability Assessment
Multi-Source Triangulation:
1. OpenTargets_get_target_tractability_by_ensemblID(ensemblId)
-> Extract: Small molecule tractability score, bucket
2. DGIdb_get_gene_druggability(genes=[gene_symbol])
-> Extract: Druggability categories, known drug count
3. OpenTargets_get_target_classes_by_ensemblID(ensemblId)
-> Extract: Target class (kinase, GPCR, etc.)
4. GPCRdb_get_protein(protein=entry_name) # for GPCRs
-> Extract: GPCR family, receptor state, ligand binding data1.2a GPCRdb Integration (for GPCR Targets)
~35% of all approved drugs target GPCRs. For GPCR targets, use specialized data:
def check_if_gpcr_and_enrich(tu, target_name, uniprot_id):
"""Check if target is GPCR and get specialized data."""
entry_name = f"{target_name.lower()}_human"
gpcr_info = tu.tools.GPCRdb_get_protein(
operation="get_protein",
protein=entry_name
)
if gpcr_info.get('status') == 'success':
structures = tu.tools.GPCRdb_get_structures(
operation="get_structures",
protein=entry_name
)
ligands = tu.tools.GPCRdb_get_ligands(
operation="get_ligands",
protein=entry_name
)
mutations = tu.tools.GPCRdb_get_mutations(
operation="get_mutations",
protein=entry_name
)
return {
'is_gpcr': True,
'gpcr_family': gpcr_info['data'].get('family'),
'gpcr_class': gpcr_info['data'].get('receptor_class'),
'structures': structures['data'].get('structures', []),
'ligands': ligands['data'].get('ligands', []),
'mutation_data': mutations['data'].get('mutations', [])
}
return {'is_gpcr': False}1.2.5 Therapeutic Antibody Landscape
Check Thera-SAbDab for therapeutic antibodies against target:
def check_therapeutic_antibodies(tu, target_name):
results = tu.tools.TheraSAbDab_search_by_target(target=target_name)
if results.get('status') == 'success':
antibodies = results['data'].get('therapeutics', [])
by_phase = {'Approved': [], 'Phase 3': [], 'Phase 2': [], 'Phase 1': [], 'Preclinical': []}
for ab in antibodies:
phase = ab.get('phase', 'Unknown')
for key in by_phase.keys():
if key.lower() in phase.lower():
by_phase[key].append(ab)
break
return {
'total_antibodies': len(antibodies),
'by_phase': by_phase,
'antibodies': antibodies[:10],
'competitive_alert': len(by_phase.get('Approved', [])) > 0
}
return None1.3 Binding Site Analysis
1. ChEMBL_search_binding_sites(target_chembl_id)
-> Extract: Binding site names, types
2. get_binding_affinity_by_pdb_id(pdb_id) # For each PDB with ligand
-> Extract: Kd, Ki, IC50 values for co-crystallized ligands
3. InterPro_get_protein_domains(uniprot_accession)
-> Extract: Domain architecture, active sites1.4 Structure Prediction (NVIDIA NIM)
Requires: NVIDIA_API_KEY environment variable
Option A: AlphaFold2 (High accuracy, async)
NvidiaNIM_alphafold2(
sequence=kinase_domain_sequence,
algorithm="mmseqs2",
relax_prediction=False
)
-> Returns: PDB structure with pLDDT confidence scores
-> Use when: Accuracy is critical, time is available (~5-15 min)Option B: ESMFold (Fast, synchronous)
NvidiaNIM_esmfold(sequence=kinase_domain_sequence)
-> Returns: PDB structure (max 1024 AA)
-> Use when: Quick assessment needed (~30 sec)---
Phase 2: Known Ligand Mining Details
2.1 ChEMBL Bioactivity Data
1. ChEMBL_get_target_activities(target_chembl_id, limit=500)
-> Filter: standard_type in ["IC50", "Ki", "Kd", "EC50"]
-> Filter: standard_value < 10000 nM
-> Extract: ChEMBL molecule IDs, SMILES, potency values
2. ChEMBL_get_molecule(molecule_chembl_id) # For top actives
-> Extract: Full molecular data, max_phase, oral flag2.5 BindingDB Affinity Data
def get_bindingdb_ligands(tu, uniprot_id, affinity_cutoff=10000):
"""Get ligands from BindingDB with measured affinities."""
result = tu.tools.BindingDB_get_ligands_by_uniprot(
uniprot=uniprot_id,
affinity_cutoff=affinity_cutoff
)
if result:
ligands = []
for entry in result:
ligands.append({
'smiles': entry.get('smile'),
'affinity_type': entry.get('affinity_type'),
'affinity_nM': entry.get('affinity'),
'pmid': entry.get('pmid'),
'monomer_id': entry.get('monomerid')
})
ligands.sort(key=lambda x: float(x['affinity_nM']) if x['affinity_nM'] else 1e6)
return ligands[:50]
return []
def find_compound_polypharmacology(tu, smiles, similarity_cutoff=0.85):
"""Find off-target interactions for selectivity analysis."""
return tu.tools.BindingDB_get_targets_by_compound(
smiles=smiles,
similarity_cutoff=similarity_cutoff
)2.6 PubChem BioAssay Screening Data
def get_pubchem_assays_for_target(tu, gene_symbol):
"""Get bioassays and active compounds from PubChem."""
assays = tu.tools.PubChem_search_assays_by_target_gene(
gene_symbol=gene_symbol
)
results = {'assays': [], 'total_active_compounds': 0}
if assays.get('data', {}).get('aids'):
for aid in assays['data']['aids'][:10]:
summary = tu.tools.PubChem_get_assay_summary(aid=aid)
actives = tu.tools.PubChem_get_assay_active_compounds(aid=aid)
active_cids = actives.get('data', {}).get('cids', [])
results['assays'].append({
'aid': aid,
'summary': summary.get('data', {}),
'active_count': len(active_cids)
})
results['total_active_compounds'] += len(active_cids)
return resultsWhen to Use Each Source:
| Source | Strengths | Primary Use |
|---|---|---|
| ChEMBL | Curated, standardized, SAR data | Primary ligand source |
| BindingDB | Direct affinity measurements | Ki/Kd values, PMIDs |
| PubChem BioAssay | HTS data, NIH screens | Novel scaffolds, broad coverage |
---
Phase 3: Structure Analysis Details
3.1 PDB Structure Retrieval
1. PDB_search_similar_structures(query=uniprot_accession, type="sequence")
-> Extract: PDB IDs with ligands
2. get_protein_metadata_by_pdb_id(pdb_id)
-> Extract: Resolution, method, ligand codes
3. alphafold_get_prediction(accession=uniprot_accession)
-> Extract: Predicted structure (if no experimental)3.1b EMDB Cryo-EM Structures
Prioritize for: Membrane proteins (GPCRs, ion channels), large complexes.
def get_cryoem_structures(tu, target_name, uniprot_accession):
"""Get cryo-EM structures for membrane targets."""
emdb_results = tu.tools.EMDB_search_structures(
query=f"{target_name} membrane receptor"
)
structures = []
for entry in emdb_results[:5]:
details = tu.tools.EMDB_get_structure(entry_id=entry['emdb_id'])
pdb_models = details.get('pdb_ids', [])
structures.append({
'emdb_id': entry['emdb_id'],
'resolution': entry.get('resolution', 'N/A'),
'title': entry.get('title', 'N/A'),
'conformational_state': details.get('state', 'Unknown'),
'pdb_models': pdb_models
})
return structuresWhen to use cryo-EM over X-ray:
| Target Type | Prefer cryo-EM? | Reason |
|---|---|---|
| GPCR | Yes | Native membrane conformation |
| Ion channel | Yes | Multiple functional states |
| Receptor-ligand complex | Yes | Physiological state |
| Kinase | Usually X-ray | Higher resolution typically |
---
Phase 3.5: Docking Validation (NVIDIA NIM)
Requires: NVIDIA_API_KEY environment variable
Reference Compound Docking
Option A: DiffDock (Blind docking, PDB + SDF input)
NvidiaNIM_diffdock(
protein=pdb_content,
ligand=reference_sdf,
num_poses=10
)
-> Returns: Docking poses with confidence scores
-> Use: When you have PDB structure and ligand SDF fileOption B: Boltz2 (From sequence + SMILES)
NvidiaNIM_boltz2(
polymers=[{"molecule_type": "protein", "sequence": kinase_sequence}],
ligands=[{"smiles": "COc1cc2ncnc(Nc3ccc(C#C)cc3)c2cc1OCCOC"}],
sampling_steps=50,
diffusion_samples=1
)
-> Returns: Protein-ligand complex structure
-> Use: When starting from SMILES, no SDF neededDocking Score Interpretation
| Score vs Reference | Priority | Symbol |
|---|---|---|
| Higher than reference | Top priority | (T0) |
| Within 5% of reference | High priority | (T2) |
| Within 20% of reference | Moderate priority | (T3) |
| >20% lower | Low priority | (T4) |
---
Phase 4: Compound Expansion Details
4.1 Similarity Search
1. ChEMBL_search_similar_molecules(molecule=top_active_smiles, similarity=70)
-> Extract: Similar compounds not yet tested on target
2. PubChem_search_compounds_by_similarity(smiles, threshold=0.7)
-> Extract: PubChem CIDs with similar structuresStrategy:
- Use 3-5 diverse actives as seeds
- Similarity threshold: 70-85% (balance novelty vs. activity)
- Prioritize compounds NOT in ChEMBL bioactivity for target
4.2 Substructure Search
1. ChEMBL_search_substructure(smiles=core_scaffold)
2. PubChem_search_compounds_by_substructure(smiles=core_scaffold)4.3 Cross-Database Mining
1. STITCH_get_chemical_protein_interactions(identifier=target_gene)
2. DGIdb_get_drug_gene_interactions(genes=[gene_symbol])4.4 De Novo Molecule Generation (NVIDIA NIM)
Option A: GenMol (Scaffold Hopping with Masked Regions)
NvidiaNIM_genmol(
smiles="COc1cc2ncnc(Nc3ccc([*{3-8}])c([*{1-3}])c3)c2cc1OCCCN1CCOCC1",
num_molecules=100,
temperature=2.0,
scoring="QED"
)Mask Design Strategy:
| Position | Mask | Purpose |
|---|---|---|
| Small substituent | [*{1-3}] | Halogen, methyl, hydroxyl |
| Medium group | [*{3-6}] | Linkers, small rings |
| Solubilizing tail | [*{5-12}] | Morpholine, piperazine |
| Core modification | [*{6-10}] | Ring replacements |
Temperature Selection:
| Temperature | Effect | When to Use |
|---|---|---|
| 0.5-1.0 | Conservative, close analogs | Early optimization |
| 1.5-2.0 | Balanced diversity | General exploration |
| 2.5-3.0 | High diversity, more novelty | Scaffold hopping |
Option B: MolMIM (Controlled Generation from Reference)
NvidiaNIM_molmim(
smi="COc1cc2ncnc(Nc3ccc(Cl)cc3)c2cc1OCCN1CCOCC1",
num_molecules=50,
algorithm="CMA-ES"
)Generation Workflow: 1. Identify top 3-5 actives from Phase 2 2. Design masked SMILES for GenMol OR use as reference for MolMIM 3. Generate 50-100 molecules per seed 4. Pass generated molecules to Phase 5 (ADMET filtering) 5. Dock survivors in Phase 6 for final ranking
---
Phase 5: ADMET Filtering Details
5.1 Physicochemical Properties
ADMETAI_predict_physicochemical_properties(smiles=[compound_list])
-> Filter: Lipinski violations <= 1
-> Filter: QED > 0.3
-> Filter: MW 200-6005.2 ADMET Endpoints
1. ADMETAI_predict_bioavailability(smiles=[compound_list])
-> Filter: Oral bioavailability > 0.3
2. ADMETAI_predict_toxicity(smiles=[compound_list])
-> Filter: AMES < 0.5, hERG < 0.5, DILI < 0.5
3. ADMETAI_predict_CYP_interactions(smiles=[compound_list])
-> Flag: CYP3A4 inhibitors (drug interaction risk)5.3 Structural Alerts
ChEMBL_search_compound_structural_alerts(smiles=compound_smiles)
-> Flag: PAINS, reactive groups, toxicophores---
Phase 6: Candidate Docking & Prioritization Details
Batch Docking Workflow
candidates = admet_passed_compounds
# Get reference score first
reference_result = tu.tools.NvidiaNIM_diffdock(
protein=pdb_content,
ligand=reference_ligand_sdf,
num_poses=10
)
reference_confidence = reference_result['best_pose_confidence']
# Dock all candidates
docking_results = []
for compound in candidates:
result = tu.tools.NvidiaNIM_diffdock(
protein=pdb_content,
ligand=compound['sdf'],
num_poses=5
)
docking_results.append({
'id': compound['id'],
'confidence': result['best_pose_confidence'],
'vs_reference': (result['best_pose_confidence'] / reference_confidence - 1) * 100
})
ranked = sorted(docking_results, key=lambda x: x['confidence'], reverse=True)Scoring Framework
| Dimension | Weight | Scoring Criteria |
|---|---|---|
| Docking confidence (if available) | 40% | NvidiaNIM_diffdock score |
| Structural Similarity | 25% (or 25% without docking) | Tanimoto to actives (0.7-1.0 -> 1-5) |
| ADMET Score | 25% (or 30%) | Composite of property predictions |
| Novelty | 20% (or 15%) | Not in ChEMBL = +2; Novel scaffold = +3 |
| Synthesis Feasibility | 15% | SA score (1-10), commercial availability |
| Scaffold Diversity | 15% | Cluster representative bonus |
Synthesis Feasibility
SA Score Interpretation:
- 1-3: Easy synthesis
- 3-5: Moderate complexity
- 5-10: Challenging synthesis
---
Phase 6.5: Literature Evidence
Literature Search for Validation
def search_binder_literature(tu, target_name, compound_scaffolds):
"""Search literature for compound and target evidence."""
# PubMed: Published SAR studies
sar_papers = tu.tools.PubMed_search_articles(
query=f"{target_name} inhibitor SAR structure-activity",
limit=30
)
# EuropePMC: Preprints (bioRxiv/medRxiv)
preprints = tu.tools.EuropePMC_search_articles(
query=f"{target_name} small molecule discovery",
source="PPR",
pageSize=15
)
# Citation analysis
key_papers = sar_papers[:10]
for paper in key_papers:
citation = tu.tools.openalex_search_works(
query=paper['title'],
limit=1
)
paper['citations'] = citation[0].get('cited_by_count', 0) if citation else 0
return {
'published_sar': sar_papers,
'preprints': preprints,
'high_impact_papers': sorted(key_papers, key=lambda x: x.get('citations', 0), reverse=True)
}---
Fallback Chains
Target ID Resolution
Primary: ChEMBL_search_targets
-> Fail -> GtoPdb_search_targets (for GPCR/ion channel/enzyme)
-> Fail -> Document "Target not in databases"Druggability Assessment
Primary: OpenTargets_get_target_tractability_by_ensemblID
-> Fail -> DGIdb_get_gene_druggability
-> Fail -> Use target class as proxyBioactivity Data
Primary: ChEMBL_get_target_activities
-> Fail -> BindingDB_get_ligands_by_uniprot
-> Fail -> GtoPdb_get_interactions
-> Fail -> PubChem_search_assays_by_target_gene
-> Fail -> Document "No bioactivity data"Similarity Search
Primary: ChEMBL_search_similar_molecules
-> Fail -> PubChem_search_compounds_by_similarity
-> Fail -> Document "Similarity search failed"Structure Retrieval
Primary: get_protein_metadata_by_pdb_id
-> Fail (no PDB) -> EMDB_search_structures (for membrane proteins)
-> Fail -> NvidiaNIM_alphafold2
-> Fail -> NvidiaNIM_esmfold
-> Fail -> alphafold_get_prediction
-> Fail -> Document "No structural information"Docking
Primary: NvidiaNIM_diffdock (have PDB + SDF)
-> Fail -> NvidiaNIM_boltz2 (from sequence + SMILES)
-> Fail -> Skip docking, use similarity-based scoringDe Novo Generation
Primary: NvidiaNIM_genmol (specific position variation)
-> Fail -> NvidiaNIM_molmim (general analog generation)
-> Fail -> Use similarity search only (no generation)Literature Search
Primary: PubMed_search_articles (peer-reviewed)
-> Supplement: EuropePMC_search_articles (source='PPR' for preprints)
-> Supplement: openalex_search_works (citation analysis)---
Batch Processing Pattern
# Define calls
calls = [
{"name": "ChEMBL_get_molecule", "arguments": {"molecule_chembl_id": id}}
for id in chembl_ids[:50]
]
# Execute in parallel
results = tu.run_batch(calls)
# Process results
for result in results:
if result and 'molecule_structures' in result:
process_molecule(result)---
Rate Limiting Awareness
| Database | Rate Limit | Recommendation |
|---|---|---|
| ChEMBL | ~10 req/sec | Batch queries when possible |
| PubChem | ~5 req/sec | Use batch endpoints |
| ADMET-AI | No strict limit | Batch SMILES in lists |
| OpenTargets | GraphQL, lenient | Single complex queries preferred |
| UniProt | ~10 req/sec | Batch search preferred |
| NVIDIA NIM | API key quota | Check quota, cache results |
NVIDIA NIM Runtimes
| Tool | Typical Runtime | Notes |
|---|---|---|
NvidiaNIM_alphafold2 | 5-15 min | Async, check status |
NvidiaNIM_esmfold | ~30 sec | Fast, max 1024 AA |
NvidiaNIM_diffdock | ~1-2 min | Per ligand |
NvidiaNIM_boltz2 | ~2-5 min | Includes structure prediction |
NvidiaNIM_genmol | ~1-3 min | Depends on num_molecules |
NvidiaNIM_molmim | ~1-2 min | Fast analog generation |
API Key Check:
import os
if not os.environ.get("NVIDIA_API_KEY"):
print("Warning: NVIDIA_API_KEY not set. NvidiaNIM tools unavailable.")Related skills
How it compares
Use binder discovery to explore ToolUniverse layout; jump directly to domain skills like proteomics analysis when the target workflow is already known.
FAQ
What does tooluniverse-binder-discovery provide?
tooluniverse-binder-discovery maps available ToolUniverse binders and lists tools attached to each binder. Developers and agents use it to locate capabilities in mims-harvard/tooluniverse without scanning the entire repository manually.
When should agents run binder discovery first?
Agents should run tooluniverse-binder-discovery before configuring ToolUniverse pipelines when the correct binder or tool name is unknown. The skill produces an inventory that guides subsequent specialized workflow skills.