Clazz.declarePackage ("JS"); Clazz.load (["J.api.SmilesMatcherInterface"], "JS.SmilesMatcher", ["JU.AU", "$.BS", "$.PT", "JS.InvalidSmilesException", "$.SmilesAtom", "$.SmilesBond", "$.SmilesGenerator", "$.SmilesParser", "$.SmilesSearch", "JU.BSUtil", "$.Elements", "$.Logger", "$.Node", "$.Point3fi"], function () { c$ = Clazz.declareType (JS, "SmilesMatcher", null, J.api.SmilesMatcherInterface); Clazz.overrideMethod (c$, "getLastException", function () { return JS.InvalidSmilesException.getLastError (); }); Clazz.overrideMethod (c$, "getMolecularFormula", function (pattern, isSmarts) { JS.InvalidSmilesException.clear (); var search = JS.SmilesParser.newSearch ("/nostereo/" + pattern, isSmarts, true); search.createTopoMap (null); search.nodes = search.targetAtoms; return search.getMolecularFormula (!isSmarts, null, false); }, "~S,~B"); Clazz.overrideMethod (c$, "getSmiles", function (atoms, ac, bsSelected, bioComment, flags) { JS.InvalidSmilesException.clear (); return ( new JS.SmilesGenerator ()).getSmiles (this, atoms, ac, bsSelected, bioComment, flags); }, "~A,~N,JU.BS,~S,~N"); Clazz.overrideMethod (c$, "areEqual", function (smiles1, smiles2) { JS.InvalidSmilesException.clear (); var result = this.findPriv (smiles1, JS.SmilesParser.newSearch (smiles2, false, true), (smiles1.indexOf ("*") >= 0 ? 2 : 1) | 8, 2); return (result == null ? -1 : result.length); }, "~S,~S"); Clazz.defineMethod (c$, "areEqualTest", function (smiles, search) { var ret = this.findPriv (smiles, search, 9, 2); return (ret != null && ret.length == 1); }, "~S,JS.SmilesSearch"); Clazz.overrideMethod (c$, "find", function (pattern, target, flags) { JS.InvalidSmilesException.clear (); target = JS.SmilesParser.cleanPattern (target); pattern = JS.SmilesParser.cleanPattern (pattern); var search = JS.SmilesParser.newSearch (target, false, true); var array = this.findPriv (pattern, search, flags, 3); for (var i = array.length; --i >= 0; ) { var a = array[i]; for (var j = a.length; --j >= 0; ) a[j] = (search.targetAtoms[a[j]]).mapIndex; } return array; }, "~S,~S,~N"); Clazz.overrideMethod (c$, "getAtoms", function (target) { JS.InvalidSmilesException.clear (); target = JS.SmilesParser.cleanPattern (target); var search = JS.SmilesParser.newSearch (target, false, true); search.createTopoMap ( new JU.BS ()); return search.targetAtoms; }, "~S"); Clazz.overrideMethod (c$, "getRelationship", function (smiles1, smiles2) { if (smiles1 == null || smiles2 == null || smiles1.length == 0 || smiles2.length == 0) return ""; var mf1 = this.getMolecularFormula (smiles1, false); var mf2 = this.getMolecularFormula (smiles2, false); if (!mf1.equals (mf2)) return "none"; var check; var n1 = JU.PT.countChar (JU.PT.rep (smiles1, "@@", "@"), '@'); var n2 = JU.PT.countChar (JU.PT.rep (smiles2, "@@", "@"), '@'); check = (n1 == n2 && this.areEqual (smiles2, smiles1) > 0); if (!check) { var s = smiles1 + smiles2; if (s.indexOf ("/") >= 0 || s.indexOf ("\\") >= 0 || s.indexOf ("@") >= 0) { if (n1 == n2 && n1 > 0 && s.indexOf ("@SP") < 0) { check = (this.areEqual ("/invertstereo/" + smiles2, smiles1) > 0); if (check) return "enantiomers"; }check = (this.areEqual ("/nostereo/" + smiles2, smiles1) > 0); if (check) return (n1 == n2 ? "diastereomers" : "ambiguous stereochemistry!"); }return "constitutional isomers"; }return "identical"; }, "~S,~S"); Clazz.overrideMethod (c$, "reverseChirality", function (smiles) { smiles = JU.PT.rep (smiles, "@@", "!@"); smiles = JU.PT.rep (smiles, "@", "@@"); smiles = JU.PT.rep (smiles, "!@@", "@"); return smiles; }, "~S"); Clazz.overrideMethod (c$, "getSubstructureSet", function (pattern, atoms, ac, bsSelected, flags) { return this.matchPriv (pattern, atoms, ac, bsSelected, null, true, flags | JS.SmilesParser.getFlags (pattern), 1); }, "~S,~A,~N,JU.BS,~N"); Clazz.overrideMethod (c$, "getMMFF94AtomTypes", function (smarts, atoms, ac, bsSelected, ret, vRings) { JS.InvalidSmilesException.clear (); var sp = new JS.SmilesParser (true, true); var search = null; var flags = (770); search = sp.parse (""); search.exitFirstMatch = false; search.targetAtoms = atoms; search.targetAtomCount = Math.abs (ac); search.setSelected (bsSelected); search.flags = flags; search.getRingData (vRings, true, true); search.asVector = false; search.subSearches = new Array (1); search.getSelections (); var bsDone = new JU.BS (); for (var i = 0; i < smarts.length; i++) { if (smarts[i] == null || smarts[i].length == 0 || smarts[i].startsWith ("#")) { ret.addLast (null); continue; }search.clear (); search.subSearches[0] = sp.getSubsearch (search, JS.SmilesParser.cleanPattern (smarts[i]), flags); var bs = JU.BSUtil.copy (search.search ()); ret.addLast (bs); bsDone.or (bs); if (bsDone.cardinality () == ac) return; } }, "~A,~A,~N,JU.BS,JU.Lst,~A"); Clazz.overrideMethod (c$, "getSubstructureSetArray", function (pattern, atoms, ac, bsSelected, bsAromatic, flags) { return this.matchPriv (pattern, atoms, ac, bsSelected, bsAromatic, true, flags, 2); }, "~S,~A,~N,JU.BS,JU.BS,~N"); Clazz.defineMethod (c$, "getAtropisomerKeys", function (pattern, atoms, ac, bsSelected, bsAromatic, flags) { return this.matchPriv (pattern, atoms, ac, bsSelected, bsAromatic, false, flags, 4); }, "~S,~A,~N,JU.BS,JU.BS,~N"); Clazz.overrideMethod (c$, "polyhedronToSmiles", function (center, faces, atomCount, points, flags, details) { var atoms = new Array (atomCount); for (var i = 0; i < atomCount; i++) { atoms[i] = new JS.SmilesAtom (); var pt = (points == null ? null : points[i]); if (Clazz.instanceOf (pt, JU.Node)) { atoms[i].elementNumber = (pt).getElementNumber (); atoms[i].bioAtomName = (pt).getAtomName (); atoms[i].atomNumber = (pt).getAtomNumber (); atoms[i].setT (pt); } else { atoms[i].elementNumber = (Clazz.instanceOf (pt, JU.Point3fi) ? (pt).sD : -2); }atoms[i].index = i; } var nBonds = 0; for (var i = faces.length; --i >= 0; ) { var face = faces[i]; var n = face.length; var iatom; var iatom2; for (var j = n; --j >= 0; ) { if ((iatom = face[j]) >= atomCount || (iatom2 = face[(j + 1) % n]) >= atomCount) continue; if (atoms[iatom].getBondTo (atoms[iatom2]) == null) { var b = new JS.SmilesBond (atoms[iatom], atoms[iatom2], 1, false); b.index = nBonds++; }} } for (var i = 0; i < atomCount; i++) { var n = atoms[i].bondCount; if (n == 0 || n != atoms[i].bonds.length) atoms[i].bonds = JU.AU.arrayCopyObject (atoms[i].bonds, n); } var s = null; var g = new JS.SmilesGenerator (); if (points != null) g.polySmilesCenter = center; JS.InvalidSmilesException.clear (); s = g.getSmiles (this, atoms, atomCount, JU.BSUtil.newBitSet2 (0, atomCount), null, flags | 4096 | 16 | 32); if ((flags & 65536) == 65536) { s = "//* " + center + " *//\t[" + JU.Elements.elementSymbolFromNumber (center.getElementNumber ()) + "@PH" + atomCount + (details == null ? "" : "/" + details + "/") + "]." + s; }return s; }, "JU.Node,~A,~N,~A,~N,~S"); Clazz.overrideMethod (c$, "getCorrelationMaps", function (pattern, atoms, atomCount, bsSelected, flags) { return this.matchPriv (pattern, atoms, atomCount, bsSelected, null, true, flags, 3); }, "~S,~A,~N,JU.BS,~N"); Clazz.defineMethod (c$, "findPriv", function (pattern, search, flags, mode) { var bsAromatic = new JU.BS (); search.setFlags (search.flags | JS.SmilesParser.getFlags (pattern)); search.createTopoMap (bsAromatic); return this.matchPriv (pattern, search.targetAtoms, -search.targetAtoms.length, null, bsAromatic, bsAromatic.isEmpty (), flags, mode); }, "~S,JS.SmilesSearch,~N,~N"); Clazz.defineMethod (c$, "matchPriv", function (pattern, atoms, ac, bsSelected, bsAromatic, doTestAromatic, flags, mode) { JS.InvalidSmilesException.clear (); try { var isSmarts = ((flags & 2) == 2); var search = JS.SmilesParser.newSearch (pattern, isSmarts, false); if (!isSmarts && !search.patternAromatic) { if (bsAromatic == null) bsAromatic = new JU.BS (); JS.SmilesSearch.normalizeAromaticity (search.patternAtoms, bsAromatic, search.flags); search.isNormalized = true; }search.targetAtoms = atoms; search.targetAtomCount = Math.abs (ac); if (ac < 0) search.haveTopo = true; if (ac != 0 && (bsSelected == null || !bsSelected.isEmpty ())) { var is3D = !(Clazz.instanceOf (atoms[0], JS.SmilesAtom)); search.setSelected (bsSelected); search.getSelections (); if (!doTestAromatic) search.bsAromatic = bsAromatic; search.setRingData (null, null, is3D || doTestAromatic); search.exitFirstMatch = ((flags & 8) == 8); search.mapUnique = ((flags & 128) == 128); }switch (mode) { case 1: search.asVector = false; return search.search (); case 2: search.asVector = true; var vb = search.search (); return vb.toArray ( new Array (vb.size ())); case 4: search.exitFirstMatch = true; search.setAtropicity = true; search.search (); return search.atropKeys; case 3: search.getMaps = true; search.setFlags (flags | search.flags); var vl = search.search (); return vl.toArray (JU.AU.newInt2 (vl.size ())); } } catch (e) { if (Clazz.exceptionOf (e, Exception)) { if (JU.Logger.debugging) e.printStackTrace (); if (JS.InvalidSmilesException.getLastError () == null) JS.InvalidSmilesException.clear (); throw new JS.InvalidSmilesException (JS.InvalidSmilesException.getLastError ()); } else { throw e; } } return null; }, "~S,~A,~N,JU.BS,JU.BS,~B,~N,~N"); Clazz.overrideMethod (c$, "cleanSmiles", function (smiles) { return JS.SmilesParser.cleanPattern (smiles); }, "~S"); Clazz.overrideMethod (c$, "getMapForJME", function (jme, at, bsAtoms) { var molecule = new JS.SmilesSearch (); var tokens = JU.PT.getTokens (jme); var nAtoms = JU.PT.parseInt (tokens[0]); var nBonds = JU.PT.parseInt (tokens[1]); var pt = 2; for (var i = 0; i < nAtoms; i++, pt += 3) { var sa = tokens[pt]; var a = molecule.addAtom (); var ic = sa.indexOf ("+"); var charge = 0; if (ic >= 0) { charge = (ic == sa.length - 1 ? 1 : JU.PT.parseInt (sa.substring (ic + 1))); } else if ((ic = sa.indexOf ("-")) >= 0) { charge = JU.PT.parseInt (sa.substring (ic)); }a.setCharge (charge); a.setSymbol (ic < 0 ? sa : sa.substring (0, ic)); } for (var i = 0; i < nBonds; i++) { var ia = JU.PT.parseInt (tokens[pt++]) - 1; var ib = JU.PT.parseInt (tokens[pt++]) - 1; var iorder = JU.PT.parseInt (tokens[pt++]); var a1 = molecule.patternAtoms[ia]; var a2 = molecule.patternAtoms[ib]; var order = 1; switch (iorder) { default: case 1: break; case 2: order = 2; break; case 3: order = 3; break; } new JS.SmilesBond (a1, a2, order, false).index = i; } var s = ""; try { molecule.isSmarts = true; molecule.set (); var bs = JU.BSUtil.newBitSet2 (0, nAtoms); s = this.getSmiles (molecule.patternAtoms, molecule.ac, bs, null, 34); var map = this.getCorrelationMaps (s, molecule.patternAtoms, nAtoms, bs, 42); var map2 = this.getCorrelationMaps (s, at, bsAtoms.cardinality (), bsAtoms, 42); return Clazz.newArray (-1, [map[0], map2[0]]); } catch (e) { if (Clazz.exceptionOf (e, Exception)) { e.printStackTrace (); } else { throw e; } } return null; }, "~S,~A,JU.BS"); Clazz.defineStatics (c$, "MODE_BITSET", 0x01, "MODE_ARRAY", 0x02, "MODE_MAP", 0x03, "MODE_ATROP", 0x04); });