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.
65
78%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./scientific-skills/Evidence Insight/medchem/SKILL.mdmedchem (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.63c61d3
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.