ChemApi / main.py
ka1kuk's picture
Update main.py
127d226
raw
history blame
No virus
1.83 kB
from fastapi import FastAPI, HTTPException
from rdkit import Chem
from rdkit.Chem import Descriptors
from rdkit.Chem import rdMolDescriptors
import requests
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
# Add CORS middleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
def name_to_smiles(name: str) -> str:
url = f"https://cactus.nci.nih.gov/chemical/structure/{name}/smiles"
response = requests.get(url)
if response.status_code == 200:
return response.text
return None
def get_molecule_info(mol):
mol_weight = Descriptors.MolWt(mol)
num_atoms = mol.GetNumAtoms()
num_bonds = mol.GetNumBonds()
mol_formula = rdMolDescriptors.CalcMolFormula(mol)
tpsa = Descriptors.TPSA(mol)
mol_logp = Descriptors.MolLogP(mol)
num_rotatable_bonds = Descriptors.NumRotatableBonds(mol)
return {
'molecular_weight': mol_weight,
'number_of_atoms': num_atoms,
'number_of_bonds': num_bonds,
'molecular_formula': mol_formula,
'tpsa': tpsa,
'logP': mol_logp,
'number_of_rotatable_bonds': num_rotatable_bonds
}
@app.get("/molecule_info/")
async def read_molecule_info(name: str):
if not name:
raise HTTPException(status_code=400, detail="No molecule name provided")
smiles = name_to_smiles(name)
if not smiles:
raise HTTPException(status_code=400, detail="Could not fetch SMILES string for provided name")
mol = Chem.MolFromSmiles(smiles)
if not mol:
raise HTTPException(status_code=400, detail="Molecule not recognized")
info = get_molecule_info(mol)
return info
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)