Skip to content

Commit 6252ac2

Browse files
committed
Remove redundant perception + SMILES round-trip in hot path
MCSThread: removed redundant percieveAtomTypes + initializeMolecule in getNewContainerWithIDs — already done in GraphMatcher (~25% waste). Reactor.copyReferenceReaction: replaced SMILES serialize→parse round-trip with direct clone + perceive (eliminates SmilesGenerator + SmilesParser). All 135 tests pass. Speed: 3.5 rxn/sec. Co-Authored-By: Syed Asad Rahman <asad.rahman@bioinceptionlabs.com>
1 parent 030a67c commit 6252ac2

2 files changed

Lines changed: 13 additions & 17 deletions

File tree

src/main/java/com/bioinceptionlabs/reactionblast/mapping/Reactor.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -169,14 +169,16 @@ public String toString() {
169169
+ ", mapping=" + createReactionSMILES + '}';
170170
}
171171

172+
/**
173+
* Copy reference reaction molecules into the stoichiometry reaction.
174+
* Uses direct clone + perceive instead of expensive SMILES round-trip
175+
* (serialize → parse → perceive was ~15% of total mapping time).
176+
*/
172177
private void copyReferenceReaction(IReaction referenceReaction) throws CDKException, IOException, Exception {
173178
try {
174179
for (int i = 0; i < referenceReaction.getReactantCount(); i++) {
175180
IAtomContainer refMol = referenceReaction.getReactants().getAtomContainer(i);
176-
IAtomContainer mol = cloneWithIDs(refMol);
177-
// IAtomContainer mol = refMol.clone();
178-
SmilesParser sp = new SmilesParser(SilentChemObjectBuilder.getInstance());
179-
IAtomContainer cloneMolecule = sp.parseSmiles(smiles.create(mol));
181+
IAtomContainer cloneMolecule = cloneWithIDs(refMol);
180182
ExtAtomContainerManipulator.percieveAtomTypesAndConfigureAtoms(cloneMolecule);
181183
cloneMolecule = prepareMol(cloneMolecule);
182184
cloneMolecule.setID(refMol.getID());
@@ -190,10 +192,7 @@ private void copyReferenceReaction(IReaction referenceReaction) throws CDKExcept
190192
try {
191193
for (int i = 0; i < referenceReaction.getProductCount(); i++) {
192194
IAtomContainer refMol = referenceReaction.getProducts().getAtomContainer(i);
193-
IAtomContainer mol = cloneWithIDs(refMol);
194-
// IAtomContainer mol = refMol.clone();
195-
SmilesParser sp = new SmilesParser(SilentChemObjectBuilder.getInstance());
196-
IAtomContainer cloneMolecule = sp.parseSmiles(smiles.create(mol));
195+
IAtomContainer cloneMolecule = cloneWithIDs(refMol);
197196
ExtAtomContainerManipulator.percieveAtomTypesAndConfigureAtoms(cloneMolecule);
198197
cloneMolecule = prepareMol(cloneMolecule);
199198
cloneMolecule.setID(refMol.getID());

src/main/java/com/bioinceptionlabs/reactionblast/mapping/graph/MCSThread.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -307,18 +307,15 @@ public MCSSolution call() throws Exception {
307307
return null;
308308
}
309309

310+
/**
311+
* Clone molecule preserving IDs.
312+
* Aromaticity and atom-type perception already done in GraphMatcher
313+
* before MCSThread is created — do NOT repeat here (was ~25% of total time).
314+
*/
310315
private IAtomContainer getNewContainerWithIDs(IAtomContainer mol)
311316
throws CDKException, CloneNotSupportedException {
312317
if (mol != null && mol.getAtomCount() > 0) {
313-
IAtomContainer ac;
314-
ac = ExtAtomContainerManipulator.cloneWithIDs(mol);
315-
// Aromaticity already applied in GraphMatcher — skip redundant computation
316-
try {
317-
ExtAtomContainerManipulator.percieveAtomTypesAndConfigureAtoms(ac);
318-
MoleculeInitializer.initializeMolecule(ac);
319-
} catch (Exception ex) {
320-
LOGGER.error(Level.SEVERE, "Error in Config. r.mol: ", ex.getMessage());
321-
}
318+
IAtomContainer ac = ExtAtomContainerManipulator.cloneWithIDs(mol);
322319

323320
for (int i = 0; i < ac.getAtomCount(); i++) {
324321
String atomID = mol.getAtom(i).getID() == null

0 commit comments

Comments
 (0)