/** * Create a new atom for the provided symbol. The atom is created by cloning * an existing 'template'. Unfortunately IChemObjectBuilders really show a * slow down when SMILES processing. * * @param element Beam element * @return new atom with configured symbol and atomic number */ private IAtom createAtom(Element element) { IAtom atom = builder.newAtom(); atom.setSymbol(element.symbol()); atom.setAtomicNumber(element.atomicNumber()); return atom; } }
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()); } }
private Atom asBracketAtom(int u, Graph g) { Atom a = g.atom(u); int sum = a.aromatic() ? 1 : 0; for (Edge e : g.edges(u)) { sum += e.bond().order(); } return new AtomImpl.BracketAtom(-1, a.element(), a.aromatic() ? a.element().aromaticImplicitHydrogens(sum) : a.element().implicitHydrogens(sum), 0, 0, a.aromatic()); }
private static Integer getMajorMassNumber(Element e) { try { switch (e) { case Hydrogen: return 1; case Boron: return 11; case Carbon: return 12; case Nitrogen: return 14; case Oxygen: return 16; case Fluorine: return 19; case Silicon: return 28; case Phosphorus: return 31; case Sulfur: return 32; case Chlorine: return 35; case Iodine: return 127; default: IsotopeFactory isotopes = Isotopes.getInstance(); IIsotope isotope = isotopes.getMajorIsotope(e.symbol()); if (isotope != null) return isotope.getMassNumber(); return null; } } catch (IOException ex) { throw new InternalError("Isotope factory wouldn't load: " + ex.getMessage()); } }
final String symbol = checkNotNull(a.getSymbol(), "An atom had an undefined symbol"); Element element = Element.ofSymbol(symbol); if (element == null) element = Element.Unknown;
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; } }
/** * Create a new CDK {@link IAtom} from the Beam Atom. If the element is * unknown (i.e. '*') then an pseudo atom is created. * * @param atom an Atom from the Beam Graph * @return the CDK atom to have it's properties set */ IAtom newCDKAtom(Atom atom) { Element element = atom.element(); boolean unknown = element == Element.Unknown; if (unknown) { IPseudoAtom pseudoAtom = builder.newInstance(IPseudoAtom.class, element.symbol()); pseudoAtom.setSymbol(element.symbol()); pseudoAtom.setLabel(atom.label()); return pseudoAtom; } return createAtom(element); }