| name | bio-admet-prediction |
| description | Predicts ADMET properties using ADMETlab 3.0 API or DeepChem models. Estimates bioavailability, CYP inhibition, hERG liability, and 119 toxicity endpoints with uncertainty quantification. Filters for PAINS and other structural alerts. Use when filtering compounds for drug-likeness or prioritizing leads by predicted safety. |
| tool_type | python |
| primary_tool | ADMETlab |
ADMET Prediction
Predict absorption, distribution, metabolism, excretion, and toxicity properties.
ADMETlab 3.0 API
ADMETlab 3.0 provides 119 endpoints with uncertainty estimates.
import requests
import pandas as pd
def predict_admet_batch(smiles_list, api_url='https://admetlab3.scbdd.com/api/predict'):
'''
Predict ADMET properties using ADMETlab 3.0 API.
Note: SwissADME has NO API - it is web-only.
'''
payload = {
'smiles': smiles_list
}
response = requests.post(api_url, json=payload)
response.raise_for_status()
return pd.DataFrame(response.json())
Key ADMET Endpoints
| Category | Endpoints | Thresholds |
|---|
| Absorption | Caco-2, HIA, Pgp substrate | HIA > 30% |
| Distribution | BBB penetration, PPB, VDss | BBB+: penetrates |
| Metabolism | CYP inhibition (1A2, 2C9, 2C19, 2D6, 3A4) | Inhibitor threshold |
| Excretion | Clearance, Half-life | - |
| Toxicity | hERG, AMES, hepatotoxicity, carcinogenicity | hERG IC50 > 10 μM |
DeepChem Models
DeepChem supports both PyTorch and TensorFlow backends.
import deepchem as dc
tox21_tasks, tox21_datasets, transformers = dc.molnet.load_tox21()
train_dataset, valid_dataset, test_dataset = tox21_datasets
featurizer = dc.feat.CircularFingerprint(size=1024)
smiles = ['CCO', 'c1ccccc1']
features = featurizer.featurize(smiles)
model = dc.models.GraphConvModel(
n_tasks=12,
mode='classification',
model_dir='tox21_model'
)
PAINS Filter
from rdkit.Chem.FilterCatalog import FilterCatalog, FilterCatalogParams
def filter_pains(molecules):
'''
Filter out PAINS (pan-assay interference compounds).
These are promiscuous compounds that give false positives in assays.
'''
params = FilterCatalogParams()
params.AddCatalog(FilterCatalogParams.FilterCatalogs.PAINS)
catalog = FilterCatalog(params)
clean = []
flagged = []
for mol in molecules:
if mol is None:
continue
entry = catalog.GetFirstMatch(mol)
if entry is None:
clean.append(mol)
else:
flagged.append((mol, entry.GetDescription()))
print(f'Clean: {len(clean)}, PAINS flagged: {len(flagged)}')
return clean, flagged
Lipinski and Beyond
from rdkit import Chem
from rdkit.Chem import Descriptors, Lipinski, QED
def calculate_druglikeness(mol):
'''
Calculate multiple drug-likeness criteria.
'''
if mol is None:
return None
props = {
'MW': Descriptors.MolWt(mol),
'LogP': Descriptors.MolLogP(mol),
'HBD': Lipinski.NumHDonors(mol),
'HBA': Lipinski.NumHAcceptors(mol),
'TPSA': Descriptors.TPSA(mol),
'RotatableBonds': Lipinski.NumRotatableBonds(mol),
'AromaticRings': Lipinski.NumAromaticRings(mol),
'QED': QED.qed(mol)
}
violations = 0
if props['MW'] > 500: violations += 1
if props['LogP'] > 5: violations += 1
if props['HBD'] > 5: violations += 1
if props['HBA'] > 10: violations += 1
props['LipinskiViolations'] = violations
props[] = (props[] <= props[] <= )
props
Prioritization Pipeline
def prioritize_compounds(molecules):
'''
Multi-stage ADMET filtering pipeline.
'''
results = []
for mol in molecules:
if mol is None:
continue
props = calculate_druglikeness(mol)
if props is None:
continue
if props['LipinskiViolations'] > 1:
continue
if not props['VeberCompliant']:
continue
if props['QED'] < 0.5:
continue
results.append((mol, props))
return results
Related Skills
- molecular-descriptors - Calculate descriptors for ML
- substructure-search - Filter reactive groups
- virtual-screening - Screen after ADMET filtering