Package org.jmol.smiles
Class SmilesAromatic
java.lang.Object
org.jmol.smiles.SmilesAromatic
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final int[][]
Index to inner array is covalent bond count (b) + valence (v) + charge (c, carbon only) - 4. -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprivate static final boolean
addNormal
(javajs.util.V3 vTemp, javajs.util.V3 vMean, float maxDev) adds a normal if similarity is within limits(package private) static void
checkAromaticDefined
(Node[] jmolAtoms, javajs.util.BS bsSelected, javajs.util.BS bsAromatic) Set aromatic atoms based on predefined BOND_AROMATIC definitions.private static void
checkBridges
(javajs.util.Lst<?> lst, javajs.util.BS bsBad, javajs.util.Lst<?> lst2, javajs.util.BS bsBad2, javajs.util.BS bs) private static void
checkFusedRings
(javajs.util.Lst<SmilesRing> rings, int[] eCounts, javajs.util.Lst<javajs.util.BS> lstAromatic) Add fused rings based on the Hueckel 4n+2 rule.private static int
checkHueckelAromatic
(int nAtoms, Node[] jmolAtoms, javajs.util.BS bsAromatic, javajs.util.BS bsRing, int strictness, int[] eCounts) For each atom in the ring, look up a unique combination of covalent bond count, valence, and charge for each atom and use that as a key into the PI_COUNTS array.private static final boolean
checkStandardDeviation
(javajs.util.V3[] vNorms, javajs.util.V3 vMean, int n, float cutoff) calculates a dot-product standard deviation and reports if it is below a cutoff(package private) static void
finalizeAromatic
(Node[] jmolAtoms, javajs.util.BS bsAromatic, javajs.util.Lst<javajs.util.BS> lstAromatic, javajs.util.Lst<SmilesRing> lstSP2, int[] eCounts, boolean isOpenNotStrict, boolean isStrict) Iteratively trims a set of aromatic atoms that may be initially assigned to be aromatic but because their double bonds extend to non-aromatic atoms must be removed.private static final boolean
isSp2Ring
(int n, Node[] atoms, javajs.util.BS bsSelected, javajs.util.BS bs, float cutoff, boolean checkExplicit, boolean allowSOxide) 3D-SEARCH aromaticity test.private static void
removeBridgingRings
(javajs.util.Lst<javajs.util.BS> lstAromatic, javajs.util.Lst<SmilesRing> lstSP2) check for any two rings with more than two common atoms and remove them from the pool(package private) static void
setAromatic
(int n, Node[] jmolAtoms, javajs.util.BS bsSelected, javajs.util.Lst<Object> vR, javajs.util.BS bsAromatic, int strictness, boolean isOpenSMILES, boolean justCheckBonding, boolean checkExplicit, VTemp v, javajs.util.Lst<javajs.util.BS> vOK, javajs.util.Lst<SmilesRing> lstSP2, int[] eCounts, boolean doTestAromatic) Main entry point.
-
Field Details
-
OS_PI_COUNTS
private static final int[][] OS_PI_COUNTSIndex to inner array is covalent bond count (b) + valence (v) + charge (c, carbon only) - 4. Special cases are listed here as -1. -2 indicates not considered aromatic (probably not possible). Many thanks to John May for the excellent visual guide that I have condensed here.
-
-
Constructor Details
-
SmilesAromatic
public SmilesAromatic()
-
-
Method Details
-
setAromatic
static void setAromatic(int n, Node[] jmolAtoms, javajs.util.BS bsSelected, javajs.util.Lst<Object> vR, javajs.util.BS bsAromatic, int strictness, boolean isOpenSMILES, boolean justCheckBonding, boolean checkExplicit, VTemp v, javajs.util.Lst<javajs.util.BS> vOK, javajs.util.Lst<SmilesRing> lstSP2, int[] eCounts, boolean doTestAromatic) Main entry point. Note that unless bonds are pre-defined as aromatic, Jmol will first check for a flat ring configuration. This is 3D, after all.- Parameters:
n
-jmolAtoms
-bsSelected
-vR
-bsAromatic
-strictness
-isOpenSMILES
-justCheckBonding
-checkExplicit
-v
-vOK
-lstSP2
-eCounts
-doTestAromatic
-
-
checkAromaticDefined
static void checkAromaticDefined(Node[] jmolAtoms, javajs.util.BS bsSelected, javajs.util.BS bsAromatic) Set aromatic atoms based on predefined BOND_AROMATIC definitions. Allows for totally customized creation of aromatic SMILES.- Parameters:
jmolAtoms
-bsSelected
-bsAromatic
-
-
isSp2Ring
private static final boolean isSp2Ring(int n, Node[] atoms, javajs.util.BS bsSelected, javajs.util.BS bs, float cutoff, boolean checkExplicit, boolean allowSOxide) 3D-SEARCH aromaticity test. A simple and unambiguous test for aromaticity based on 3D geometry and connectivity only, not Hueckel theory.- Parameters:
n
-atoms
- a set of atoms with coordinate positions and associated bonds.bsSelected
- must not be nullbs
- a bitset of atoms within the set of atoms, defining the ringcutoff
- an arbitrary value to test the standard deviation against. 0.01 is appropriate here. Use Float.MAX_VALUE to just do bond connectivity checkcheckExplicit
- check bonds that are explicit only - for XYZ and QM calcsallowSOxide
- set TRUE to skip S atoms- Returns:
- true if standard deviation of vNorm.dot.vMean is less than cutoff
-
addNormal
private static final boolean addNormal(javajs.util.V3 vTemp, javajs.util.V3 vMean, float maxDev) adds a normal if similarity is within limits- Parameters:
vTemp
-vMean
-maxDev
-- Returns:
- true if successful
-
checkStandardDeviation
private static final boolean checkStandardDeviation(javajs.util.V3[] vNorms, javajs.util.V3 vMean, int n, float cutoff) calculates a dot-product standard deviation and reports if it is below a cutoff- Parameters:
vNorms
-vMean
-n
-cutoff
-- Returns:
- true if stddev invalid input: '<' cutoff
-
checkHueckelAromatic
private static int checkHueckelAromatic(int nAtoms, Node[] jmolAtoms, javajs.util.BS bsAromatic, javajs.util.BS bsRing, int strictness, int[] eCounts) For each atom in the ring, look up a unique combination of covalent bond count, valence, and charge for each atom and use that as a key into the PI_COUNTS array. c=X is the only special case. Final trimming will be necesseary if isStrict == true.- Parameters:
nAtoms
- this ring's sizejmolAtoms
- could also be constructed nodes from a SMILES stringbsAromatic
- at least nominally aromatic atomsbsRing
- specific atoms of this ringstrictness
- 0 (not) 1 (OpenSMILES), 2 (MMFF94) standard organic chemist's Hueckel interpretation, not allowing c=OeCounts
-- Returns:
- -1 if absolutely not possible, 0 if possible but not 4n+2, 1 if 4n+2
-
finalizeAromatic
static void finalizeAromatic(Node[] jmolAtoms, javajs.util.BS bsAromatic, javajs.util.Lst<javajs.util.BS> lstAromatic, javajs.util.Lst<SmilesRing> lstSP2, int[] eCounts, boolean isOpenNotStrict, boolean isStrict) Iteratively trims a set of aromatic atoms that may be initially assigned to be aromatic but because their double bonds extend to non-aromatic atoms must be removed. Checks to see that these atoms really have two adjacent aromatic atoms and are not connected to any nonaromatic atom by a double bond. Could be entered with one of /open/, /open strict/, or /strict/- Parameters:
jmolAtoms
-bsAromatic
-lstAromatic
- all rings passing the sp2 test and (if strict) the Hueckel strict testlstSP2
- all rings passing the sp2 testeCounts
-isOpenNotStrict
- /open/ optionisStrict
- remove noncyclic double bonds and do not allow bridging aromatic ring systems (/strict/ option)
-
removeBridgingRings
private static void removeBridgingRings(javajs.util.Lst<javajs.util.BS> lstAromatic, javajs.util.Lst<SmilesRing> lstSP2) check for any two rings with more than two common atoms and remove them from the pool- Parameters:
lstAromatic
-lstSP2
-
-
checkBridges
private static void checkBridges(javajs.util.Lst<?> lst, javajs.util.BS bsBad, javajs.util.Lst<?> lst2, javajs.util.BS bsBad2, javajs.util.BS bs) -
checkFusedRings
private static void checkFusedRings(javajs.util.Lst<SmilesRing> rings, int[] eCounts, javajs.util.Lst<javajs.util.BS> lstAromatic) Add fused rings based on the Hueckel 4n+2 rule. Note that this may be reverted later if in a STRICT setting, because in at this point in some cases we will have double bonds to exocyclic nonaromatic atoms. We are being careful here to only group FUSED rings -- that is rings that have only one bond in common.- Parameters:
rings
-eCounts
-lstAromatic
- list to be appended to
-