Medicinal chemistry screening filters for compound prioritization; use when you need to apply drug-likeness rules, PAINS/structural alerts, and complexity metrics to triage or optimize libraries.
medchem (latest)datamol (latest)pandas (latest, for tabular workflows)# End-to-end, runnable example:
# 1) load SMILES
# 2) apply Ro5 + Veber
# 3) apply common structural alerts
# 4) compute complexity and filter
# 5) export a CSV with decisions
import pandas as pd
import datamol as dm
import medchem as mc
smiles_list = [
"CC(=O)OC1=CC=CC=C1C(=O)O", # aspirin
"CN1C=NC2=C1C(=O)N(C(=O)N2C)C", # caffeine
"c1ccccc1", # benzene
]
df = pd.DataFrame({"smiles": smiles_list})
mols = [dm.to_mol(smi) for smi in df["smiles"]]
# 1) Drug-likeness rules
rule_filter = mc.rules.RuleFilters(rule_list=["rule_of_five", "rule_of_veber"])
rule_res = rule_filter(mols=mols, n_jobs=-1, progress=False)
df["passes_rules"] = rule_res["pass"]
# 2) Structural alerts
alerts = mc.structural.CommonAlertsFilters()
alert_res = alerts(mols=mols, n_jobs=-1, progress=False)
df["has_alerts"] = alert_res["has_alerts"]
# 3) Complexity (example threshold)
complex_filter = mc.complexity.ComplexityFilter(max_complexity=500)
complex_res = complex_filter(mols=mols, n_jobs=-1, progress=False)
df["passes_complexity"] = complex_res["pass"]
# 4) Final decision
df["keep"] = df["passes_rules"] & (~df["has_alerts"]) & df["passes_complexity"]
# 5) Save results
df.to_csv("medchem_screening_results.csv", index=False)
print(df)
Rule evaluation (medchem.rules)
datamol).RuleFilters(rule_list=[...]) applies multiple rules and returns a structured result (typically including an overall pass plus per-rule details).Structural alerts (medchem.structural)
CommonAlertsFilters, NIBRFilters, and LillyDemeritsFilters provide different philosophies:
Complexity (medchem.complexity)
ComplexityFilter(max_complexity=...) converts a numeric score into a pass/fail gate for library triage.Constraints (medchem.constraints)
Groups and catalogs (medchem.groups, medchem.catalogs)
Parallelization
n_jobs; set n_jobs=-1 to use all available CPU cores for large libraries.3a:["$","$L41",null,{"content":"$42","frontMatter":{"name":"medchem","description":"Medicinal chemistry screening filters for compound prioritization; use when you need to apply drug-likeness rules, PAINS/structural alerts, and complexity metrics to triage or optimize libraries.","license":"MIT","author":"aipoch","source":"aipoch","source_url":"https://github.com/aipoch/medical-research-skills"}}]