chemoinformatics/admet-prediction/SKILL.md
Predicts ADMET properties using ADMETlab 3.0 (119 endpoints with uncertainty), ADMET-AI, DeepChem MolNet, and chemprop D-MPNN with explicit handling of OECD QSAR principles, applicability domain assessment, calibration, hERG/CYP/AMES gold-standard endpoints, and PAINS / Lipinski / Ro5 / Veber / BBB druglikeness filters. Use when filtering compounds for drug-likeness, prioritizing leads by predicted safety, or building an in-house ADMET QSAR model.
npx skillsauth add GPTomics/bioSkills bio-admet-predictionInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Reference examples tested with: RDKit 2024.09+, requests 2.31+, DeepChem 2.8+, chemprop 2.0+ (note major API change from 1.x), admet-ai 1.3+, pandas 2.2+.
Before using code patterns, verify installed versions match. If versions differ:
pip show <package> then help(module.function) to check signaturesIf code throws ImportError, AttributeError, or TypeError, introspect the installed package and adapt the example to match the actual API rather than retrying.
Predict absorption, distribution, metabolism, excretion, and toxicity properties of drug candidates. ADMET prediction underpins lead selection and de-risking; calibrated, applicability-domain-aware predictions distinguish a working filter from a costly false-confidence rejection. Modern best practice combines online services (ADMETlab 3.0 with uncertainty estimates), open-source models (chemprop D-MPNN), and rule-based filters (Lipinski / Veber / BBB heuristics) -- each with known failure modes.
For PAINS / Brenk / structural alerts, see chemoinformatics/substructure-search. For QSAR model building from in-house data, see chemoinformatics/qsar-modeling.
| Tool | Endpoints | Architecture | Uncertainty | Access | Fails when | |------|-----------|--------------|-------------|--------|------------| | ADMETlab 3.0 | 119 (A,D,M,E,T + physchem + medchem) | Multi-task DMPNN + descriptors | Per-prediction | REST API (free, no auth) | Outside training distribution; metals; macrocycles | | ADMET-AI (NVIDIA) | ~50 (focus on safety) | chemprop D-MPNN | Ensemble variance | Python package | Limited endpoints vs ADMETlab | | DeepChem MolNet | ~30 (tox21, ToxCast, ClinTox) | Various GCN/GAT | Per-task variance | Python package | Models trained on small datasets | | pkCSM | ~30 (absorption, distribution, toxicity) | Graph signatures + RF | None | Web service | Smaller training data | | SwissADME | ~30 (filters + physchem) | Hand-curated rules | None | Web service (NO API) | Cannot batch programmatically | | ProTox-3.0 | ~46 (toxicity end-points) | DT + descriptors | None | Web service | Toxicity only; LD50 categorical | | ADMETpredictor (Simulations Plus) | ~140 | Proprietary | Per-prediction | Commercial | License cost | | FAF-Drugs4 | filters | Rule-based | None | Web | Static rules | | chemprop (in-house) | User-defined | D-MPNN ± descriptors | Bayesian ensemble | Python package | Requires training data |
Decision: For batch screening of <10k compounds with no in-house data, ADMETlab 3.0 (free API, 119 endpoints, calibrated uncertainty) is the modern standard. For in-house QSAR on a specific endpoint with >500 measurements, train a chemprop D-MPNN + Morgan + MOE descriptors model (Liu et al. 2024 achieved AUC 0.956 on hERG with this combo).
| Scenario | Workflow | Reasoning | |----------|----------|-----------| | Library triage, no in-house data | ADMETlab 3.0 API batch | Calibrated 119 endpoints | | Single target, large in-house data (>500 datapoints) | chemprop D-MPNN ensemble | Beats generic models on target-specific data | | Need calibrated probabilities | chemprop with ensemble + Platt | Native deep learning rarely calibrated | | FDA / regulatory submission | OECD-compliant QSAR with AD | See OECD principles below | | Quick filter for VS | Lipinski + Veber + QED >= 0.5 | Rule-based, no model needed | | BBB penetration | TPSA <= 90, MW <= 500, HBD <= 3 (Pfizer CNS) | Wager 2010 | | Cardiotox liability | hERG model (ADMETlab + ProTox + literature lit-check) | Triangulate; hERG critical | | Drug-drug interaction (CYP) | CYP1A2/2C9/2C19/2D6/3A4 inhibitor + substrate | Standard set of 5 CYPs |
For regulatory-grade ADMET QSAR (REACH, ECHA, FDA submissions), models must satisfy:
For non-regulatory work, AD assessment is still critical. The OECD's applicability domain is the workhorse: predictions outside the AD are unreliable, but operational AD measures (leverage, kNN, conformal prediction) often disagree.
| Method | Definition | Flags out-of-AD when | |--------|-----------|----------------------| | kNN distance | Mean distance to k nearest neighbors in training set | > training-set distribution P95 | | Leverage (Williams) | Hat-matrix diagonal | > 3p/n (p = features, n = compounds) | | Density (KDE on PCA) | Density in feature space | < density of training set P5 | | Conformal prediction | Per-prediction confidence interval | Interval > tolerance | | Bayesian variance | Ensemble or MC-dropout variance | > training-set variance P95 |
For deep-learning ADMET, conformal prediction (Bostrom et al. 2024) is becoming the standard.
The current standard for free ADMET prediction. 119 endpoints across 6 categories; per-prediction uncertainty.
Goal: Predict 119 ADMET endpoints with uncertainty for a batch of SMILES using a hosted API.
Approach: POST batches of <=500 SMILES to ADMETlab 3.0 REST endpoint and parse the returned JSON into a per-compound endpoint DataFrame.
import requests
import pandas as pd
# ADMETlab 3.0 API base: https://admetlab3.scbdd.com
# Endpoints: /api/admet (full 119-endpoint batch), /api/wash (standardization),
# /api/single/admet (single SMILES), /api/render (visualization)
# See https://admetlab3.scbdd.com/apis/ for current API spec.
def admetlab_predict(smiles_list, endpoint='admet'):
url = f'https://admetlab3.scbdd.com/api/{endpoint}'
payload = {'smiles': smiles_list}
response = requests.post(url, json=payload, timeout=120)
response.raise_for_status()
return pd.DataFrame(response.json())
smiles = ['CCO', 'c1ccc(C(=O)O)cc1', 'CC(=O)Oc1ccccc1C(=O)O']
results = admetlab_predict(smiles) # POST batches of <=500 SMILES at a time
ADMETlab 3.0 endpoints (sample):
When in-house data is available, train a target-specific model. chemprop's D-MPNN architecture + atom/bond features + optional Morgan / MOE descriptors is the modern open-source SOTA.
Goal: Train a target-specific ADMET classifier or regressor on in-house bioassay data.
Approach: Use chemprop 2.x CLI with rdkit_2d_normalized descriptor features, 5-fold scaffold-balanced split, and 5-model ensemble for uncertainty estimation.
# chemprop 2.x CLI (current; 'chemprop train' with space + dashed args)
# chemprop train --data-path data.csv --task-type classification \
# --save-dir model_dir --molecule-featurizers rdkit_2d_normalized \
# --num-folds 5 --ensemble-size 5
# Or chemprop 2.x programmatic API (full programmatic API documented at chemprop.readthedocs.io)
# See chemoinformatics/qsar-modeling for the full chemprop 2.x training pipeline.
Key: 5-fold ensemble for calibrated uncertainty; D-MPNN + rdkit_2d_normalized typically outperforms either alone.
hERG (KCNH2) blockade causes QT prolongation, Torsades de Pointes, and is the #1 reason for late-stage drug attrition. ICH S7B and FDA require non-clinical assessment.
| Model | Architecture | Training data | AUC | Reference | |-------|--------------|---------------|-----|-----------| | Cai et al. D-MPNN + MOE | chemprop + 206 MOE descriptors | 7,889 compounds | 0.956 | Liu 2024 | | CardioTox-net | ECFP + RF stacking | ChEMBL hERG | 0.93 | Aniketh 2021 | | ADMETlab 3.0 hERG | DMPNN multi-task | Internal | 0.92 (reported) | Fu 2024 | | ProTox-3.0 | DT | ProTox training | 0.86 | Banerjee 2024 |
Postdoc-grade interpretation: A single-model probability > 0.5 is NOT a kill signal. Triangulate ADMETlab + ProTox + literature search for cardiotox liability. Consider the active concentration vs predicted hERG IC50 (10 uM threshold for "concern"); a hERG-positive compound at 100 nM active concentration may still be safe with sufficient hERG selectivity.
5 CYP isoforms cover most clinically relevant DDIs:
| CYP | Substrates (drugs) | Inhibitor flag if predicted prob | Action | |-----|--------------------|-----------------------------------|--------| | CYP3A4 | ~50% of drugs | > 0.5 | Often acceptable if substrate; flag if inhibitor | | CYP2D6 | beta-blockers, antidepressants | > 0.5 | Higher concern (polymorphism) | | CYP2C9 | warfarin, NSAIDs | > 0.5 | Caution if patient on warfarin | | CYP2C19 | PPIs, clopidogrel | > 0.5 | Variable (polymorphism) | | CYP1A2 | caffeine, theophylline | > 0.5 | Diet/smoking-influenced |
ADMET prediction is separate from structural alerts; combine. See chemoinformatics/substructure-search for PAINS/BRENK/REOS pattern catalogs.
from rdkit.Chem.FilterCatalog import FilterCatalog, FilterCatalogParams
def alerts(mol, catalogs=('PAINS_A', 'BRENK', 'ZINC')):
params = FilterCatalogParams()
for cat in catalogs:
params.AddCatalog(getattr(FilterCatalogParams.FilterCatalogs, cat))
catalog = FilterCatalog(params)
hits = catalog.GetMatches(mol)
return [h.GetDescription() for h in hits]
See chemoinformatics/molecular-descriptors for full physchem table. Quick filter:
from rdkit.Chem import Descriptors, Lipinski, QED
def druglike_score(mol):
mw = Descriptors.MolWt(mol)
logp = Descriptors.MolLogP(mol)
hbd = Lipinski.NumHDonors(mol)
hba = Lipinski.NumHAcceptors(mol)
tpsa = Descriptors.TPSA(mol)
rotbonds = Lipinski.NumRotatableBonds(mol)
qed = QED.qed(mol)
lipinski_violations = sum([mw > 500, logp > 5, hbd > 5, hba > 10])
veber_pass = rotbonds <= 10 and tpsa <= 140
bbb_pfizer = tpsa <= 90 and mw <= 500 and hbd <= 3
return {'MW': mw, 'LogP': logp, 'HBD': hbd, 'HBA': hba,
'TPSA': tpsa, 'RotBonds': rotbonds, 'QED': qed,
'Lipinski_violations': lipinski_violations,
'Veber_pass': veber_pass, 'BBB_pfizer': bbb_pfizer}
Trigger: Macrocycle, metal-coordinated, oligomer (peptide >5 AA), or PROTAC submitted.
Mechanism: ADMETlab training set is drug-like organic molecules. Predictions on PROTACs, macrocycles, peptides extrapolate.
Symptom: Uncertainty estimates near max; ambiguous probabilities (0.4-0.6).
Fix: Check uncertainty band; if interval is broad, do not trust point estimate. For PROTACs / macrocycles, prefer literature-derived experimental data.
Trigger: Compound is novel chemotype not in training set (drug-like but in unexplored region).
Mechanism: D-MPNN learns local chemical features; for genuinely new scaffolds, extrapolation is unreliable.
Symptom: Model predicts hERG- (false negative) for compound that experimentally inhibits.
Fix: Use ensemble + applicability-domain assessment (kNN distance, ensemble variance). If kNN distance to training set > P95, treat prediction as low-confidence.
Trigger: Model trained on either inhibitor OR substrate; predictions confused.
Mechanism: CYP3A4 inhibitors and substrates have similar SAR; many compounds are both.
Symptom: Both classes report > 0.5.
Fix: Two separate models (inhibitor model, substrate model); compounds that score high in both are flagged for in vitro confirmation.
Trigger: Wanting to batch programmatically.
Mechanism: SwissADME explicitly forbids automated access (TOS).
Symptom: No programmatic access; manual web upload only.
Fix: Use ADMETlab 3.0 API for programmatic batch (free, no TOS restrictions).
Trigger: Treating PAINS_A match as a categorical exclusion.
Mechanism: PAINS is calibrated against HTS assay-interference; matches do NOT predict failed drug development.
Symptom: Library purged of valid leads (curcumin analogs, polyphenol natural products).
Fix: Flag PAINS for orthogonal-assay confirmation; do not exclude pre-emptively. See substructure-search for details.
Trigger: Training/predicting AMES mutagenicity.
Mechanism: AMES public datasets have ~3:1 negative:positive imbalance; baseline F1 misleading.
Symptom: Model reports high accuracy but predicts negative for all.
Fix: Use AUC-ROC or balanced accuracy. Apply SMOTE / class-weighted loss in chemprop.
When ADMETlab, ProTox, and chemprop disagree on hERG:
| Symptom | Cause | Fix |
|---------|-------|-----|
| ADMETlab API 504 timeout | Batch too large | Submit <500 SMILES per request |
| chemprop training overfits | Random split | Use scaffold split (--split scaffold_balanced) |
| hERG prediction 50/50 | Out-of-distribution | Check applicability domain |
| QED returns nan | Stereo undefined or invalid | Standardize first |
| ProTox endpoints missing | Web scrape uses CSS selector | Use formal API |
| BBB+ true but TPSA > 90 | Different BBB model | Use Pfizer CNS heuristic for orthogonal check |
| Predictions inconsistent across runs | Random seed for chemprop ensemble | --seed 42 and reuse model |
| Calibration mismatch | DL native probabilities not calibrated | Apply Platt scaling on validation set |
tools
--- name: bio-phasing-imputation-foundations description: Frames the phasing/imputation pipeline before any tool runs: phasing and imputation are one Li-Stephens copying HMM (recombination is the transition, mutation the emission, the genetic map and Ne set the rates), imputation's honest output is a dosage with a self-estimated quality (INFO/R2/DR2) not a hard genotype, and the stages are ordered and each fails silently (QC, align build and strand to the panel, phase, impute per chromosome, fil
tools
Chooses the enrichment generation before any tool runs, mapping the input shape to a method class - a pre-selected gene list plus a background to over-representation analysis (ORA, hypergeometric), a ranked statistic for all genes to gene set enrichment (GSEA), a signed signaling topology to pathway-topology (SPIA) - then making the null explicit (competitive vs self-contained, gene vs subject sampling) and running a trustworthiness checklist (testable-gene universe, FDR, redundancy collapse, leading-edge check, version reporting). Covers why every clusterProfiler GSEA is the inter-gene-correlation-uncorrected competitive null, why the background not the gene list decides ORA significance, and why no method is universally best. Use when deciding ORA vs GSEA vs topology, which gene-set DB, whether a result is trustworthy, or which null a tool computes. For ORA see go-enrichment, GSEA see gsea, databases kegg-pathways/reactome-pathways/wikipathways; the ranking comes from differential-expression/de-results.
testing
End-to-end GWAS workflow from VCF to association results. Covers PLINK QC, population structure correction, and association testing for case-control or quantitative traits. Use when running genome-wide association studies.
development
Orchestrates the full path from differential expression results to redundancy-collapsed functional enrichment: choose ORA vs GSEA, convert gene IDs per method, run enrichGO/enrichKEGG/enrichPathway/enrichWP or gseGO/gseKEGG (clusterProfiler, ReactomePA, rWikiPathways), and visualize. Routes the ORA-vs-GSEA generation fork and the null/universe/reproducibility theory to pathway-analysis/enrichment-foundations. Use when a DESeq2/edgeR/limma result must become enriched GO terms, KEGG/Reactome/WikiPathways pathways, or a GSEA leading edge; when deciding whether a ranking exists for all genes (GSEA, named decreasing vector) or only a pre-selected list (ORA plus a defensible background universe); or when assembling DE-to-pathway end to end. The DE list and ranking statistic come from differential-expression/de-results; per-method nuance lives in the pathway-analysis skills.