Skip to content

Commit d970c0f

Browse files
chore(training): modernize fingerprints to MorganGenerator
Shared rdFingerprintGenerator.GetMorganGenerator across train/predict/app; identical bits, AUROCs unchanged; clears the deprecation warning.
1 parent 2748c25 commit d970c0f

3 files changed

Lines changed: 10 additions & 7 deletions

File tree

training/app.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,14 @@
2828
from fastapi.responses import HTMLResponse
2929
from pydantic import BaseModel
3030
from rdkit import Chem
31-
from rdkit.Chem import AllChem, DataStructs
31+
from rdkit.Chem import DataStructs, rdFingerprintGenerator
3232

3333
import predict as P # reuse the unified flavor read
3434

3535
app = FastAPI(title="Flavor Workbench (demo)")
3636

3737
_FPS, _SMI, _KNOWN = [], [], []
38+
_MORGAN = rdFingerprintGenerator.GetMorganGenerator(radius=2, fpSize=2048)
3839

3940

4041
def _build_index():
@@ -48,7 +49,7 @@ def _build_index():
4849
mol = Chem.MolFromSmiles(r["smiles"])
4950
if mol is None:
5051
continue
51-
_FPS.append(AllChem.GetMorganFingerprintAsBitVect(mol, 2, nBits=2048))
52+
_FPS.append(_MORGAN.GetFingerprint(mol))
5253
_SMI.append(r["smiles"])
5354
_KNOWN.append([t for t in basic if r[t] == 1])
5455
print(f"substitution index built: {len(_FPS)} molecules")
@@ -92,7 +93,7 @@ def api_neighbors(q: Query):
9293
if not smi or not _FPS:
9394
return {"neighbors": []}
9495
mol = Chem.MolFromSmiles(smi)
95-
fp = AllChem.GetMorganFingerprintAsBitVect(mol, 2, nBits=2048)
96+
fp = _MORGAN.GetFingerprint(mol)
9697
sims = DataStructs.BulkTanimotoSimilarity(fp, _FPS)
9798
self_smi = Chem.MolToSmiles(mol)
9899
ranked = sorted(range(len(sims)), key=lambda i: sims[i], reverse=True)

training/predict.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,10 @@
4848
import joblib
4949
import numpy as np
5050
from rdkit import Chem
51-
from rdkit.Chem import AllChem, Crippen, DataStructs, Descriptors, rdMolDescriptors
51+
from rdkit.Chem import Crippen, DataStructs, Descriptors, rdFingerprintGenerator, rdMolDescriptors
5252

5353
FP_BITS, FP_RADIUS = 2048, 2
54+
_MORGAN = rdFingerprintGenerator.GetMorganGenerator(radius=FP_RADIUS, fpSize=FP_BITS)
5455
TASTE = Path("taste_models")
5556

5657
ACID_SMARTS = {
@@ -234,7 +235,7 @@ def _measured(mol):
234235

235236

236237
def _fp(mol):
237-
bv = AllChem.GetMorganFingerprintAsBitVect(mol, FP_RADIUS, nBits=FP_BITS)
238+
bv = _MORGAN.GetFingerprint(mol)
238239
arr = np.zeros((FP_BITS,), dtype=np.int8)
239240
DataStructs.ConvertToNumpyArray(bv, arr)
240241
return arr.reshape(1, -1)

training/train_taste.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import numpy as np
2222
import pandas as pd
2323
from rdkit import Chem
24-
from rdkit.Chem import AllChem, DataStructs
24+
from rdkit.Chem import DataStructs, rdFingerprintGenerator
2525
from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor
2626
from sklearn.model_selection import train_test_split
2727
from sklearn.metrics import roc_auc_score, r2_score
@@ -31,6 +31,7 @@
3131
# handled in predict.py and never trained — regardless of how much data accrues.
3232
RULE_TASTES = {"sour", "salty"}
3333
FP_BITS, FP_RADIUS = 2048, 2
34+
_MORGAN = rdFingerprintGenerator.GetMorganGenerator(radius=FP_RADIUS, fpSize=FP_BITS)
3435
# Below this, a taste is too thin for an HONEST head, so it's skipped and
3536
# handled by rule/flag instead. It's not a hard exclusion: add more data (more
3637
# sources) and the taste crosses the line and trains itself on the next run.
@@ -55,7 +56,7 @@ def fp(smiles):
5556
mol = Chem.MolFromSmiles(smiles)
5657
if mol is None:
5758
return None
58-
bv = AllChem.GetMorganFingerprintAsBitVect(mol, FP_RADIUS, nBits=FP_BITS)
59+
bv = _MORGAN.GetFingerprint(mol)
5960
arr = np.zeros((FP_BITS,), dtype=np.int8)
6061
DataStructs.ConvertToNumpyArray(bv, arr)
6162
return arr

0 commit comments

Comments
 (0)