static Atom fromSubset(Atom a, int sum, int deg) { // atom is already a non-subset atom if (!a.subset()) return a; Element e = a.element(); if (a.aromatic() && deg <= sum) sum++; int hCount = a.aromatic() ? Element.implicitAromHydrogenCount(e, sum) : Element.implicitHydrogenCount(e, sum); // XXX: if there was an odd number of availableElectrons there was an odd number // or aromatic bonds (usually 1 or 3) - if there was one it was // only a single bond it's likely a spouting from a ring - otherwise // someones making our life difficult (e.g. c1=cc=cc=c1) in which we // 'give' back 2 free availableElectrons for use indeterminacy the hCount // int hCount = (electrons & 0x1) == 1 ? deg > 1 ? (electrons + 2) / 2 // : electrons / 2 // : electrons / 2; return new AtomImpl.BracketAtom(-1, a.element(), hCount, 0, 0, a.aromatic()); } }
static Atom toSubset(Atom a, Graph g, int u) { // atom is already a subset atom if (a.subset()) return a; // element is not organic and thus cannot be part of the subset if (!a.element().organic()) return a; // if any of these values are set the atom cannot be a subset atom if (a.charge() != 0 || a.atomClass() != 0 || a.isotope() >= 0) return a; Atom subset = a.aromatic() ? AtomImpl.AromaticSubset.ofElement(a.element()) : AtomImpl.AliphaticSubset.ofElement(a.element()); // does the implied availableElectrons from the bond order sum match that // which was stored - if aromatic we only check the lowest valence state int impliedHCount = subset.hydrogens(g, u); // mismatch in number of hydrogens we must write this as a bracket atom return impliedHCount != a.hydrogens() ? a : subset; } }
if (a.subset() && h.topologyOf(u) != Topology.unknown()) { h.addAtom(asBracketAtom(u, g)); } else {