/** * Occurrences of a given element from an isotope in a molecular formula. * * @param formula the formula * @param isotope isotope of an element * @return number of the times the element occurs * @see #getElementCount(IMolecularFormula, IElement) */ public static int getElementCount(IMolecularFormula formula, IIsotope isotope) { return getElementCount(formula, formula.getBuilder().newInstance(IElement.class, isotope)); }
/** * Occurrences of a given element in a molecular formula. * * @param formula the formula * @param symbol element symbol (e.g. C for carbon) * @return number of the times the element occurs * @see #getElementCount(IMolecularFormula, IElement) */ public static int getElementCount(IMolecularFormula formula, String symbol) { return getElementCount(formula, formula.getBuilder().newInstance(IElement.class, symbol)); }
/** * Get the number of other elements which affect to the calculation of the nominal mass. * For example Fe, Co, Hg, Pt, As. * * @param formula The IMolecularFormula to analyze * @return Number of elements */ private int getOthers(IMolecularFormula formula) { int number = 0; String[] elements = {"Co", "Hg", "Pt", "As"}; for (int i = 0; i < elements.length; i++) number += MolecularFormulaManipulator.getElementCount(formula, formula.getBuilder().newInstance(IElement.class, elements[i])); return number; }
/** * Validate the occurrence of this IMolecularFormula. * * @param formula Parameter is the IMolecularFormula * @return An ArrayList containing 9 elements in the order described above */ @Override public double validate(IMolecularFormula formula) throws CDKException { logger.info("Start validation of ", formula); double isValid = 1.0; Iterator<IElement> itElem = MolecularFormulaManipulator.elements(formula).iterator(); while (itElem.hasNext()) { IElement element = itElem.next(); int occur = MolecularFormulaManipulator.getElementCount(formula, element); if (occur > hashMap.get(element.getSymbol())) { isValid = 0.0; break; } } return isValid; }
if (!showIsotopes) { sb.append(element.getSymbol()); int n = getElementCount(formula, element); if (n > 1) { sb.append("<sub>").append(n).append("</sub>");
int occur = MolecularFormulaManipulator.getElementCount(formula, element); int occurMax = MolecularFormulaManipulator.getElementCount(formulaMax, element); int occurMin = MolecularFormulaManipulator.getElementCount(formulaMin, element);
/** * Validate the occurrence of this IMolecularFormula. * * @param formula Parameter is the IMolecularFormula * @return An ArrayList containing 9 elements in the order described above */ @Override public double validate(IMolecularFormula formula) throws CDKException { logger.info("Start validation of ", formula); ensureDefaultOccurElements(formula.getBuilder()); double isValid = 1.0; Iterator<IElement> itElem = MolecularFormulaManipulator.elements(formula).iterator(); while (itElem.hasNext()) { IElement element = itElem.next(); int occur = MolecularFormulaManipulator.getElementCount(formula, element); IIsotope elemIsotope = formula.getBuilder().newInstance(IIsotope.class, element.getSymbol()); if ((occur < mfRange.getIsotopeCountMin(elemIsotope)) || (occur > mfRange.getIsotopeCountMax(elemIsotope))) { isValid = 0.0; break; } } return isValid; }
nV.add(valence[i]); nE += MolecularFormulaManipulator.getElementCount(formula, formula.getBuilder().newInstance(IElement.class, isotope.getSymbol()));
if (MolecularFormulaManipulator.getElementCount(formula, new Element("C")) == 6) { result = DeAromatizationTool.deAromatizeBenzene(ring); } else if (MolecularFormulaManipulator.getElementCount(formula, new Element("C")) == 5 && MolecularFormulaManipulator.getElementCount(formula, new Element("N")) == 1) { result = DeAromatizationTool.deAromatizePyridine(ring); if (MolecularFormulaManipulator.getElementCount(formula, new Element("C")) == 4 && MolecularFormulaManipulator.getElementCount(formula, new Element("N")) == 1) { result = deAromatizePyrolle(ring);
/** * Extract from a set of MolecularFormula the maximum occurrence of each element found and * put the element and occurrence in a new IMolecularFormula. * * @param mfSet The set of molecularFormules to inspect * @return A IMolecularFormula containing the maximum occurrence of the elements * @see #getMinOccurrenceElements(IMolecularFormulaSet) */ public static IMolecularFormula getMaxOccurrenceElements(IMolecularFormulaSet mfSet) { IMolecularFormula molecularFormula = mfSet.getBuilder().newInstance(IMolecularFormula.class); for (IMolecularFormula mf : mfSet.molecularFormulas()) { for (IIsotope isotope : mf.isotopes()) { IElement element = mfSet.getBuilder().newInstance(IElement.class, isotope); int occur_new = MolecularFormulaManipulator.getElementCount(mf, element); if (!MolecularFormulaManipulator.containsElement(molecularFormula, element)) { molecularFormula.addIsotope(mfSet.getBuilder().newInstance(IIsotope.class, element), occur_new); } else { int occur_old = MolecularFormulaManipulator.getElementCount(molecularFormula, element); if (occur_new > occur_old) { MolecularFormulaManipulator.removeElement(molecularFormula, element); molecularFormula.addIsotope(mfSet.getBuilder().newInstance(IIsotope.class, element), occur_new); } } } } return molecularFormula; }
/** * Extract from a set of MolecularFormula the minimal occurrence of each element found and * put the element and occurrence in a new IMolecularFormula. * * @param mfSet The set of molecularFormules to inspect * @return A IMolecularFormula containing the minimal occurrence of the elements * @see #getMaxOccurrenceElements(IMolecularFormulaSet) */ public static IMolecularFormula getMinOccurrenceElements(IMolecularFormulaSet mfSet) { IMolecularFormula molecularFormula = mfSet.getBuilder().newInstance(IMolecularFormula.class); for (IMolecularFormula mf : mfSet.molecularFormulas()) { for (IIsotope isotope : mf.isotopes()) { IElement element = mfSet.getBuilder().newInstance(IElement.class, isotope); int occur_new = MolecularFormulaManipulator.getElementCount(mf, element); if (!MolecularFormulaManipulator.containsElement(molecularFormula, element)) { molecularFormula.addIsotope(mfSet.getBuilder().newInstance(IIsotope.class, element), occur_new); } else { int occur_old = MolecularFormulaManipulator.getElementCount(molecularFormula, element); if (occur_new < occur_old) { MolecularFormulaManipulator.removeElement(molecularFormula, element); molecularFormula.addIsotope(mfSet.getBuilder().newInstance(IIsotope.class, element), occur_new); } } } } return molecularFormula; }
String symbol = element.getSymbol(); elemNames += symbol + " ".substring(symbol.length()); String countS = Integer.valueOf(MolecularFormulaManipulator.getElementCount(formula, element)).toString(); elemCounts += countS + " ".substring(countS.length());
/** * Validate the nitrogen rule of this IMolecularFormula. * * @param formula Parameter is the IMolecularFormula * @return A double value meaning 1.0 True, 0.0 False */ @Override public double validate(IMolecularFormula formula) throws CDKException { logger.info("Start validation of ", formula); double mass = MolecularFormulaManipulator.getTotalMassNumber(formula); if (mass == 0) return 0.0; int numberN = MolecularFormulaManipulator.getElementCount(formula, formula.getBuilder().newInstance(IElement.class, "N")); numberN += getOthers(formula); if (formula.getCharge() == null || formula.getCharge() == 0 || !isOdd(Math.abs(formula.getCharge()))) { if (isOdd(mass) && isOdd(numberN)) { return 1.0; } else if (!isOdd(mass) && (numberN == 0 || !isOdd(numberN))) { return 1.0; } else return 0.0; } else { if (!isOdd(mass) && isOdd(numberN)) { return 1.0; } else if (isOdd(mass) && (numberN == 0 || !isOdd(numberN))) { return 1.0; } else return 0.0; } }
/** * Test molecular formula's generated from IIsotopes, including hydrogen/deuterium handling. */ @Test public void testGetElementCount_IMolecularFormula_IElement() { IMolecularFormula formula = new MolecularFormula(); IIsotope carb = builder.newInstance(IIsotope.class, "C"); IIsotope flu = builder.newInstance(IIsotope.class, "F"); IIsotope h1 = builder.newInstance(IIsotope.class, "H"); IIsotope h2 = builder.newInstance(IIsotope.class, "H"); h2.setExactMass(2.014101778); formula.addIsotope(carb, 2); formula.addIsotope(flu); formula.addIsotope(h1, 3); formula.addIsotope(h2, 4); Assert.assertEquals(10, MolecularFormulaManipulator.getAtomCount(formula)); Assert.assertEquals(4, formula.getIsotopeCount()); Assert.assertEquals(3, formula.getIsotopeCount(h1)); Assert.assertEquals(4, formula.getIsotopeCount(h2)); Assert.assertEquals(2, MolecularFormulaManipulator.getElementCount(formula, builder.newInstance(IElement.class, carb))); Assert.assertEquals(1, MolecularFormulaManipulator.getElementCount(formula, builder.newInstance(IElement.class, flu))); Assert.assertEquals(7, MolecularFormulaManipulator.getElementCount(formula, builder.newInstance(IElement.class, h1))); }
@Test public void testGetMolecularFormula_IAtomContainer() { IAtomContainer ac = builder.newInstance(IAtomContainer.class); ac.addAtom(builder.newInstance(IAtom.class, "C")); ac.addAtom(builder.newInstance(IAtom.class, "C")); ac.addAtom(builder.newInstance(IAtom.class, "H")); ac.addAtom(builder.newInstance(IAtom.class, "H")); ac.addAtom(builder.newInstance(IAtom.class, "H")); ac.addAtom(builder.newInstance(IAtom.class, "H")); IMolecularFormula mf1 = MolecularFormulaManipulator.getMolecularFormula(ac); IMolecularFormula mf2 = new MolecularFormula(); mf2.addIsotope(builder.newInstance(IIsotope.class, "C"), 2); mf2.addIsotope(builder.newInstance(IIsotope.class, "H"), 4); Assert.assertEquals(MolecularFormulaManipulator.getAtomCount(mf2), MolecularFormulaManipulator.getAtomCount(mf1)); Assert.assertEquals(mf2.getIsotopeCount(), mf1.getIsotopeCount()); IElement elemC = builder.newInstance(IElement.class, "C"); IElement elemH = builder.newInstance(IElement.class, "H"); Assert.assertEquals(mf2.getIsotopeCount(builder.newInstance(IIsotope.class, elemC)), mf1.getIsotopeCount(builder.newInstance(IIsotope.class, elemC))); Assert.assertEquals(mf2.getIsotopeCount(builder.newInstance(IIsotope.class, elemH)), mf1.getIsotopeCount(builder.newInstance(IIsotope.class, elemH))); Assert.assertEquals(MolecularFormulaManipulator.getElementCount(mf2, elemC), MolecularFormulaManipulator.getElementCount(mf1, elemC)); Assert.assertEquals(MolecularFormulaManipulator.getElementCount(mf2, elemH), MolecularFormulaManipulator.getElementCount(mf1, elemH)); }
@Test public void testGetMolecularFormula_IAtomContainer_IMolecularFormula() { IAtomContainer ac = builder.newInstance(IAtomContainer.class); ac.addAtom(builder.newInstance(IAtom.class, "C")); ac.addAtom(builder.newInstance(IAtom.class, "C")); ac.addAtom(builder.newInstance(IAtom.class, "H")); ac.addAtom(builder.newInstance(IAtom.class, "H")); ac.addAtom(builder.newInstance(IAtom.class, "H")); ac.addAtom(builder.newInstance(IAtom.class, "H")); IMolecularFormula mf1 = MolecularFormulaManipulator.getMolecularFormula(ac, new MolecularFormula()); IMolecularFormula mf2 = new MolecularFormula(); mf2.addIsotope(builder.newInstance(IIsotope.class, "C"), 2); mf2.addIsotope(builder.newInstance(IIsotope.class, "H"), 4); Assert.assertEquals(MolecularFormulaManipulator.getAtomCount(mf2), MolecularFormulaManipulator.getAtomCount(mf1)); Assert.assertEquals(mf2.getIsotopeCount(), mf1.getIsotopeCount()); IElement elemC = builder.newInstance(IElement.class, "C"); IElement elemH = builder.newInstance(IElement.class, "H"); Assert.assertEquals(mf2.getIsotopeCount(builder.newInstance(IIsotope.class, elemC)), mf1.getIsotopeCount(builder.newInstance(IIsotope.class, elemC))); Assert.assertEquals(mf2.getIsotopeCount(builder.newInstance(IIsotope.class, elemH)), mf1.getIsotopeCount(builder.newInstance(IIsotope.class, elemH))); Assert.assertEquals(MolecularFormulaManipulator.getElementCount(mf2, elemC), MolecularFormulaManipulator.getElementCount(mf1, elemC)); Assert.assertEquals(MolecularFormulaManipulator.getElementCount(mf2, elemH), MolecularFormulaManipulator.getElementCount(mf1, elemH)); }
@Test public void testGetMolecularFormula_IAtomContainerIMolecularFormula_2() { IAtomContainer ac = builder.newInstance(IAtomContainer.class); ac.addAtom(builder.newInstance(IAtom.class, "C")); ac.addAtom(builder.newInstance(IAtom.class, "C")); ac.addAtom(builder.newInstance(IAtom.class, "H")); ac.addAtom(builder.newInstance(IAtom.class, "H")); ac.addAtom(builder.newInstance(IAtom.class, "H")); ac.addAtom(builder.newInstance(IAtom.class, "H")); IMolecularFormula mf0 = new MolecularFormula(); mf0.addIsotope(builder.newInstance(IIsotope.class, "C"), 2); mf0.addIsotope(builder.newInstance(IIsotope.class, "H"), 5); IMolecularFormula mf1 = MolecularFormulaManipulator.getMolecularFormula(ac, mf0); IMolecularFormula mf2 = new MolecularFormula(); mf2.addIsotope(builder.newInstance(IIsotope.class, "C"), 4); mf2.addIsotope(builder.newInstance(IIsotope.class, "H"), 9); Assert.assertEquals(MolecularFormulaManipulator.getAtomCount(mf2), MolecularFormulaManipulator.getAtomCount(mf1)); Assert.assertEquals(mf2.getIsotopeCount(), mf1.getIsotopeCount()); IElement elemC = builder.newInstance(IElement.class, "C"); IElement elemH = builder.newInstance(IElement.class, "H"); Assert.assertEquals(mf2.getIsotopeCount(builder.newInstance(IIsotope.class, elemC)), mf1.getIsotopeCount(builder.newInstance(IIsotope.class, elemC))); Assert.assertEquals(mf2.getIsotopeCount(builder.newInstance(IIsotope.class, elemH)), mf1.getIsotopeCount(builder.newInstance(IIsotope.class, elemH))); Assert.assertEquals(MolecularFormulaManipulator.getElementCount(mf2, elemC), MolecularFormulaManipulator.getElementCount(mf1, elemC)); Assert.assertEquals(MolecularFormulaManipulator.getElementCount(mf2, elemH), MolecularFormulaManipulator.getElementCount(mf1, elemH)); }
@Test public void testHydrogen() throws Exception { IAtomContainer mol = new AtomContainer(); Atom proton = new Atom("H"); mol.addAtom(proton); IAtomType type = matcher.findMatchingAtomType(mol, proton); Assert.assertNotNull(type); AtomTypeManipulator.configure(proton, type); adder.addImplicitHydrogens(mol); Assert.assertEquals(1, mol.getAtomCount()); IMolecularFormula formula = MolecularFormulaManipulator.getMolecularFormula(mol); Assert.assertEquals(2, MolecularFormulaManipulator.getElementCount(formula, mol.getBuilder().newInstance(IElement.class, "H"))); Assert.assertEquals(0, mol.getConnectedBondsCount(proton)); Assert.assertNotNull(proton.getImplicitHydrogenCount()); Assert.assertEquals(1, proton.getImplicitHydrogenCount().intValue()); }
@Test public void testProton() throws Exception { IAtomContainer mol = new AtomContainer(); Atom proton = new Atom("H"); proton.setFormalCharge(+1); mol.addAtom(proton); IAtomType type = matcher.findMatchingAtomType(mol, proton); Assert.assertNotNull(type); AtomTypeManipulator.configure(proton, type); adder.addImplicitHydrogens(mol); Assert.assertEquals(1, mol.getAtomCount()); IMolecularFormula formula = MolecularFormulaManipulator.getMolecularFormula(mol); Assert.assertEquals(1, MolecularFormulaManipulator.getElementCount(formula, mol.getBuilder().newInstance(IElement.class, "H"))); Assert.assertEquals(0, mol.getConnectedBondsCount(proton)); Assert.assertNotNull(proton.getImplicitHydrogenCount()); Assert.assertEquals(0, proton.getImplicitHydrogenCount().intValue()); }