Skip to content

Commit

Permalink
feat: Add calculating Tanimoto similarity #117
Browse files Browse the repository at this point in the history
  • Loading branch information
Kohulan committed Apr 18, 2023
1 parent e402b54 commit c64f931
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 3 deletions.
34 changes: 34 additions & 0 deletions app/modules/cdkmodules.py
Original file line number Diff line number Diff line change
Expand Up @@ -237,3 +237,37 @@ def getCDKDescriptors(smiles: str):
float("{:.2f}".format(float(str(FractionalCSP3Descriptor)))),
int(NumRings),
)


def getTanimotoSimilarity(smiles1: str, smiles2: str):
"""
Take two SMILES strings and calculate
Tanimoto similarity index using Pubchem
Fingerprints.
Args (str,str): SMILES strings.
Returns (float): Tanimoto similarity.
"""
if any(char.isspace() for char in smiles1):
smiles1 = smiles1.replace(" ", "+")
if any(char.isspace() for char in smiles2):
smiles2 = smiles2.replace(" ", "+")

Tanimoto = JClass(cdk_base + ".similarity.Tanimoto")
SCOB = JClass(cdk_base + ".silent.SilentChemObjectBuilder")
SmilesParser = JClass(cdk_base + ".smiles.SmilesParser")(SCOB.getInstance())
PubchemFingerprinter = JClass(cdk_base + ".fingerprint.PubchemFingerprinter")(
SCOB.getInstance()
)

# parse molecules to get IAtomContainers
mol1 = SmilesParser.parseSmiles(smiles1)
mol2 = SmilesParser.parseSmiles(smiles2)

# Generate BitSets using PubChemFingerprinter
fingerprint1 = PubchemFingerprinter.getBitFingerprint(mol1).asBitSet()
fingerprint2 = PubchemFingerprinter.getBitFingerprint(mol2).asBitSet()

# Calculate Tanimoto similarity
Similarity = Tanimoto.calculate(fingerprint1, fingerprint2)

return "{:.5f}".format(float(str(Similarity)))
24 changes: 23 additions & 1 deletion app/modules/rdkitmodules.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from chembl_structure_pipeline import standardizer
from rdkit import Chem
from rdkit import Chem, DataStructs
from rdkit.Chem import AllChem, Descriptors, QED, Lipinski, rdMolDescriptors, rdmolops
from app.modules.cdkmodules import getCDKSDGMol

Expand Down Expand Up @@ -112,3 +112,25 @@ def get3Dconformers(smiles, depict=True):
return Chem.MolToMolBlock(mol)
else:
return "Error reading SMILES string, check again."


def getTanimoto(smiles1, smiles2):
"""
Take two SMILES strings and calculate
Tanimoto similarity index using Morgan
Fingerprints.
Args (str,str): SMILES strings.
Returns (float): Tanimoto similarity.
"""
# create two example molecules
mol1 = checkSMILES(smiles1)
mol2 = checkSMILES(smiles2)

# generate Morgan fingerprints for each molecule
fp1 = AllChem.GetMorganFingerprintAsBitVect(mol1, 2, nBits=1024)
fp2 = AllChem.GetMorganFingerprintAsBitVect(mol2, 2, nBits=1024)

# calculate the Tanimoto similarity between the fingerprints
similarity = DataStructs.TanimotoSimilarity(fp1, fp2)

return similarity
15 changes: 13 additions & 2 deletions app/routers/chem.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
from fastapi.responses import Response, HTMLResponse
from app.modules.npscorer import getNPScore
from app.modules.classyfire import classify, result
from app.modules.cdkmodules import getCDKSDGMol
from app.modules.cdkmodules import getCDKSDGMol, getTanimotoSimilarity
from app.modules.depict import getRDKitDepiction, getCDKDepiction
from app.modules.rdkitmodules import get3Dconformers
from app.modules.rdkitmodules import get3Dconformers, getTanimoto
from app.modules.coconutdescriptors import getCOCONUTDescriptors
import pandas as pd
from fastapi.templating import Jinja2Templates
Expand Down Expand Up @@ -139,6 +139,17 @@ async def CDK2D_coordinates(smiles: str):
return "Error reading SMILES string, check again."


@router.get("/tanimoto")
async def Tanimoto(smiles: str, toolkit: Optional[str] = "cdk"):
if smiles:
smiles1, smiles2 = smiles.split(",")
if toolkit == "rdkit":
Tanimoto = getTanimoto(smiles1, smiles2)
else:
Tanimoto = getTanimotoSimilarity(smiles1, smiles2)
return Tanimoto


@router.get("/depict")
async def depict_molecule(
smiles: str,
Expand Down

0 comments on commit c64f931

Please sign in to comment.