Loading...
Loading...
Cheminformatics provides computational chemistry workflows using RDKit for molecular property prediction, virtual screening, ADMET analysis, molecular docking preparation, and chemical space exploration.
npx skill4agent add itallstartedwithaidea/agent-skills cheminformaticsgraph TD
A[Molecular Input: SMILES/SDF] --> B[Parse + Validate Structures]
B --> C[Calculate Descriptors]
C --> D[Drug-likeness Filters]
D --> E{Passes Lipinski?}
E -->|No| F[Flag as Non-Drug-like]
E -->|Yes| G[ADMET Prediction]
G --> H[Virtual Screening Score]
H --> I[Docking Preparation]
I --> J[Ranked Candidate List]
F --> K[Report with Flags]
J --> Kfrom rdkit import Chem
from rdkit.Chem import Descriptors, AllChem, Draw, Lipinski, DataStructs
from rdkit.Chem import rdMolDescriptors
import pandas as pd
def molecular_properties(smiles: str) -> dict:
mol = Chem.MolFromSmiles(smiles)
if mol is None:
raise ValueError(f"Invalid SMILES: {smiles}")
return {
"smiles": smiles,
"mw": Descriptors.MolWt(mol),
"logp": Descriptors.MolLogP(mol),
"hbd": Descriptors.NumHDonors(mol),
"hba": Descriptors.NumHAcceptors(mol),
"tpsa": Descriptors.TPSA(mol),
"rotatable_bonds": Descriptors.NumRotatableBonds(mol),
"rings": Descriptors.RingCount(mol),
"lipinski_violations": sum([
Descriptors.MolWt(mol) > 500,
Descriptors.MolLogP(mol) > 5,
Descriptors.NumHDonors(mol) > 5,
Descriptors.NumHAcceptors(mol) > 10,
]),
}
def lipinski_filter(df: pd.DataFrame) -> pd.DataFrame:
return df[df["lipinski_violations"] <= 1].copy()
def similarity_search(query_smiles: str, library: list[str], threshold: float = 0.7) -> list[dict]:
query_mol = Chem.MolFromSmiles(query_smiles)
query_fp = AllChem.GetMorganFingerprintAsBitVect(query_mol, radius=2, nBits=2048)
results = []
for smi in library:
mol = Chem.MolFromSmiles(smi)
if mol is None:
continue
fp = AllChem.GetMorganFingerprintAsBitVect(mol, radius=2, nBits=2048)
tanimoto = DataStructs.TanimotoSimilarity(query_fp, fp)
if tanimoto >= threshold:
results.append({"smiles": smi, "tanimoto": tanimoto})
return sorted(results, key=lambda x: -x["tanimoto"])
def admet_flags(props: dict) -> list[str]:
flags = []
if props["logp"] > 5:
flags.append("High lipophilicity: poor aqueous solubility risk")
if props["tpsa"] > 140:
flags.append("High TPSA: poor membrane permeability risk")
if props["mw"] > 500:
flags.append("High MW: poor oral absorption risk")
if props["rotatable_bonds"] > 10:
flags.append("High flexibility: poor oral bioavailability risk")
return flags| Platform | Support | Notes |
|---|---|---|
| Cursor | Full | Python + RDKit environment |
| VS Code | Full | Jupyter + molecular viz |
| Windsurf | Full | Scientific Python |
| Claude Code | Full | Pipeline generation |
| Cline | Full | Cheminformatics workflows |
| aider | Partial | Code generation only |
cheminformaticsrdkitmolecular-propertiesvirtual-screeningadmetlipinskidrug-discoverymolecular-similarity