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()); }
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; } }
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()); } }
/** * 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); }
@Test public void unknownSymbol() throws Exception { IAtom a = new PseudoAtom("ALA"); a.setImplicitHydrogenCount(0); assertThat(new CDKToBeam().toBeamAtom(a).element(), is(Element.Unknown)); }
@Test public void unknownSymbol_Pseudo() throws Exception { IAtom a = new PseudoAtom("R1"); a.setImplicitHydrogenCount(0); assertThat(new CDKToBeam().toBeamAtom(a).element(), is(Element.Unknown)); }
@Test public void water_Atom() throws Exception { IAtom a = new Atom("O"); a.setImplicitHydrogenCount(2); assertThat(new CDKToBeam().toBeamAtom(a).element(), is(Element.Oxygen)); assertThat(new CDKToBeam().toBeamAtom(a).hydrogens(), is(2)); }
@Test public void methane_Atom() throws Exception { IAtom a = new Atom("C"); a.setImplicitHydrogenCount(4); assertThat(new CDKToBeam().toBeamAtom(a).element(), is(Element.Carbon)); assertThat(new CDKToBeam().toBeamAtom(a).hydrogens(), is(4)); }