Class SmilesAromatic

java.lang.Object
org.jmol.smiles.SmilesAromatic

public class SmilesAromatic extends Object
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    private static final int[][]
    Index to inner array is covalent bond count (b) + valence (v) + charge (c, carbon only) - 4.
  • Constructor Summary

    Constructors
    Constructor
    Description
     
  • Method Summary

    Modifier and Type
    Method
    Description
    private 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.

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • OS_PI_COUNTS

      private static final int[][] OS_PI_COUNTS
      Index 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.
      bs - a bitset of atoms within the set of atoms, defining the ring
      bsSelected - must not be null
      cutoff - an arbitrary value to test the standard deviation against. 0.01 is appropriate here. Use Float.MAX_VALUE to just do bond connectivity check
      checkExplicit - check bonds that are explicit only - for XYZ and QM calcs
      allowSOxide - 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 < 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 size
      jmolAtoms - could also be constructed nodes from a SMILES string
      bsAromatic - at least nominally aromatic atoms
      bsRing - specific atoms of this ring
      strictness - 0 (not) 1 (OpenSMILES), 2 (MMFF94) standard organic chemist's Hueckel interpretation, not allowing c=O
      eCounts -
      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 test
      lstSP2 - all rings passing the sp2 test
      eCounts -
      isOpenNotStrict - /open/ option
      isStrict - 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