double maxMass = 100.05; MolecularFormulaGenerator gen = new MolecularFormulaGenerator(builder, minMass, maxMass, mfRange); finishedPerc = gen.getFinishedPercentage(); Assert.assertEquals(0d, finishedPerc, 0.0001); while (gen.getNextFormula() != null) { finishedPerc = gen.getFinishedPercentage(); Assert.assertTrue(finishedPerc > lastFinishedPerc); lastFinishedPerc = finishedPerc; finishedPerc = gen.getFinishedPercentage(); Assert.assertEquals(1d, finishedPerc, 0.0001);
@Override public void run() { try { Thread.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } gen.cancel(); } };
/** * Initiate the MolecularFormulaGenerator. * * @param minMass * Lower boundary of the target mass range * @param maxMass * Upper boundary of the target mass range * @param mfRange * A range of elemental compositions defining the search space * @throws IllegalArgumentException * In case some of the isotopes in mfRange has undefined exact * mass or in case illegal parameters are provided (e.g., * negative mass values or empty MolecularFormulaRange) * @see MolecularFormulaRange */ public MolecularFormulaGenerator(final IChemObjectBuilder builder, final double minMass, final double maxMass, final MolecularFormulaRange mfRange) { checkInputParameters(builder,minMass,maxMass,mfRange); this.formulaGenerator = isIllPosed(minMass, maxMass, mfRange) ? new FullEnumerationFormulaGenerator(builder, minMass, maxMass, mfRange) : new RoundRobinFormulaGenerator(builder, minMass, maxMass, mfRange); }
/** * Test to find a single carbon. */ @Test public void testSingleCarbon() throws Exception { IsotopeFactory ifac = Isotopes.getInstance(); IIsotope c = ifac.getMajorIsotope("C"); MolecularFormulaRange mfRange = new MolecularFormulaRange(); mfRange.addIsotope(c, 0, 100); double minMass = 5; double maxMass = 15; MolecularFormulaGenerator gen = new MolecularFormulaGenerator(builder, minMass, maxMass, mfRange); IMolecularFormulaSet mfSet = gen.getAllFormulas(); Assert.assertNotNull(mfSet); Assert.assertEquals(1, mfSet.size()); Assert.assertEquals("C", MolecularFormulaManipulator.getString(mfSet .getMolecularFormula(0))); }
double maxMass = 100000.001; final MolecularFormulaGenerator gen = new MolecularFormulaGenerator( builder, minMass, maxMass, mfRange); gen.getAllFormulas(); IMolecularFormula f = gen.getNextFormula(); Assert.assertNull(f);
/** * Test empty molecular formula range * */ @Test(expected = IllegalArgumentException.class) public void testEmptyMFRange() throws Exception { new MolecularFormulaGenerator(builder, 0, 100, new MolecularFormulaRange()); }
/** * Test the getNextFormula() method */ @Test public void testGetNextFormula() throws Exception { IsotopeFactory ifac = Isotopes.getInstance(); IIsotope c = ifac.getMajorIsotope("C"); IIsotope h = ifac.getMajorIsotope("H"); IIsotope n = ifac.getMajorIsotope("N"); IIsotope o = ifac.getMajorIsotope("O"); MolecularFormulaRange mfRange = new MolecularFormulaRange(); mfRange.addIsotope(c, 0, 10); mfRange.addIsotope(h, 0, 10); mfRange.addIsotope(o, 0, 10); mfRange.addIsotope(n, 0, 10); double minMass = 100.0; double maxMass = 100.05; MolecularFormulaGenerator gen = new MolecularFormulaGenerator(builder, minMass, maxMass, mfRange); IMolecularFormula f = gen.getNextFormula(); Assert.assertNotNull(f); }
/** * Test to find MF=C10000, MW=120000.0 using only carbons. */ @Test public void testCarbons() throws Exception { IsotopeFactory ifac = Isotopes.getInstance(); IIsotope c = ifac.getMajorIsotope("C"); MolecularFormulaRange mfRange = new MolecularFormulaRange(); mfRange.addIsotope(c, 0, 100000); double minMass = 120000.0 - 1; double maxMass = 120000.0 + 1; MolecularFormulaGenerator gen = new MolecularFormulaGenerator(builder, minMass, maxMass, mfRange); IMolecularFormulaSet mfSet = gen.getAllFormulas(); Assert.assertNotNull(mfSet); Assert.assertEquals(1, mfSet.size()); Assert.assertEquals("C10000", MolecularFormulaManipulator .getString(mfSet.getMolecularFormula(0))); }
/** * Test negative mass */ @Test(expected = IllegalArgumentException.class) public void testNegativeMass() throws Exception { IsotopeFactory ifac = Isotopes.getInstance(); IIsotope c = ifac.getMajorIsotope("C"); MolecularFormulaRange mfRange = new MolecularFormulaRange(); mfRange.addIsotope(c, 0, 100); new MolecularFormulaGenerator(builder, -20, -10, new MolecularFormulaRange()); }
/** * Test if zero results are returned in case the target mass range is too * high */ @Test public void testMassRangeTooHigh() throws Exception { IsotopeFactory ifac = Isotopes.getInstance(); IIsotope c = ifac.getMajorIsotope("C"); IIsotope h = ifac.getMajorIsotope("H"); IIsotope n = ifac.getMajorIsotope("N"); IIsotope o = ifac.getMajorIsotope("O"); MolecularFormulaRange mfRange = new MolecularFormulaRange(); mfRange.addIsotope(c, 0, 10); mfRange.addIsotope(h, 0, 10); mfRange.addIsotope(o, 0, 10); mfRange.addIsotope(n, 0, 10); double massMin = 1000d; double massMax = 2000d; MolecularFormulaGenerator gen = new MolecularFormulaGenerator(builder, massMin, massMax, mfRange); IMolecularFormulaSet mfSet = gen.getAllFormulas(); Assert.assertNotNull(mfSet); Assert.assertEquals(0, mfSet.size()); }
/** * MolecularFormulaGenerator should use full enumeration method when smallest element has large weight */ @Test public void testUseFullEnumerationWhenNoHydrogen() throws Exception { IsotopeFactory ifac = Isotopes.getInstance(); IIsotope c = ifac.getMajorIsotope("C"); IIsotope n = ifac.getMajorIsotope("N"); IIsotope o = ifac.getMajorIsotope("O"); MolecularFormulaRange mfRange = new MolecularFormulaRange(); mfRange.addIsotope(c, 0, 50); mfRange.addIsotope(o, 0, 30); mfRange.addIsotope(n, 0, 10); MolecularFormulaGenerator generator = new MolecularFormulaGenerator(builder, 1023.000, 1023.002, mfRange); Assert.assertTrue("generator implementation should be instance of FullEnumerationFormulaGenerator", generator.formulaGenerator instanceof FullEnumerationFormulaGenerator); }
/** * Test the getAllFormulas() method */ @Test public void testGetAllFormulas() throws Exception { IsotopeFactory ifac = Isotopes.getInstance(); IIsotope c = ifac.getMajorIsotope("C"); IIsotope h = ifac.getMajorIsotope("H"); IIsotope n = ifac.getMajorIsotope("N"); IIsotope o = ifac.getMajorIsotope("O"); MolecularFormulaRange mfRange = new MolecularFormulaRange(); mfRange.addIsotope(c, 0, 10); mfRange.addIsotope(h, 0, 10); mfRange.addIsotope(o, 0, 10); mfRange.addIsotope(n, 0, 10); double minMass = 100.0; double maxMass = 100.05; MolecularFormulaGenerator gen = new MolecularFormulaGenerator(builder, minMass, maxMass, mfRange); IMolecularFormulaSet mfSet = gen.getAllFormulas(); Assert.assertNotNull(mfSet); Assert.assertNotEquals(0, mfSet.size()); }
/** * MolecularFormulaGenerator should use full enumeration method when mass to decompose is too large to encode * it as 32 bit integer with default blowup factor */ @Test public void testUseFullEnumerationWhenExceedIntegerSpace() throws Exception { IsotopeFactory ifac = Isotopes.getInstance(); IIsotope c = ifac.getMajorIsotope("C"); IIsotope h = ifac.getMajorIsotope("H"); IIsotope n = ifac.getMajorIsotope("N"); IIsotope o = ifac.getMajorIsotope("O"); MolecularFormulaRange mfRange = new MolecularFormulaRange(); mfRange.addIsotope(c, 0, 20); mfRange.addIsotope(h, 0, 30); mfRange.addIsotope(o, 0, 15); mfRange.addIsotope(n, 0, 10); MolecularFormulaGenerator generator = new MolecularFormulaGenerator(builder, 1300000, 1300000.1, mfRange); Assert.assertTrue("generator implementation should be instance of FullEnumerationFormulaGenerator", generator.formulaGenerator instanceof FullEnumerationFormulaGenerator); }
/** * Test if zero results are returned in case the target mass range is too * low */ @Test public void testMassRangeTooLow() throws Exception { IsotopeFactory ifac = Isotopes.getInstance(); IIsotope c = ifac.getMajorIsotope("C"); IIsotope h = ifac.getMajorIsotope("H"); IIsotope n = ifac.getMajorIsotope("N"); IIsotope o = ifac.getMajorIsotope("O"); MolecularFormulaRange mfRange = new MolecularFormulaRange(); mfRange.addIsotope(c, 100, 200); mfRange.addIsotope(h, 100, 200); mfRange.addIsotope(o, 100, 200); mfRange.addIsotope(n, 100, 200); double massMin = 50d; double massMax = 100d; MolecularFormulaGenerator gen = new MolecularFormulaGenerator(builder, massMin, massMax, mfRange); IMolecularFormulaSet mfSet = gen.getAllFormulas(); Assert.assertNotNull(mfSet); Assert.assertEquals(0, mfSet.size()); }
/** * MolecularFormulaGenerator should use Round Robin when using proper input */ @Test public void testUseRoundRobinWheneverPossible() throws Exception { IsotopeFactory ifac = Isotopes.getInstance(); IIsotope c = ifac.getMajorIsotope("C"); IIsotope h = ifac.getMajorIsotope("H"); IIsotope n = ifac.getMajorIsotope("N"); IIsotope o = ifac.getMajorIsotope("O"); MolecularFormulaRange mfRange = new MolecularFormulaRange(); mfRange.addIsotope(c, 0, 20); mfRange.addIsotope(h, 0, 30); mfRange.addIsotope(o, 0, 15); mfRange.addIsotope(n, 0, 10); MolecularFormulaGenerator generator = new MolecularFormulaGenerator(builder, 230.002, 230.004, mfRange); Assert.assertTrue("generator implementation should be instance of RoundRobinFormulaGenerator", generator.formulaGenerator instanceof RoundRobinFormulaGenerator); }
double maxMass = 189; MolecularFormulaGenerator gen = new MolecularFormulaGenerator(builder, minMass, maxMass, mfRange); IMolecularFormulaSet mfSet = gen.getAllFormulas();
/** * MolecularFormulaGenerator should use full enumeration method when the mass deviation is very large (i.e. as * large as the smallest weight) */ @Test public void testUseFullEnumerationWhenSuperLargeMassDeviation() throws Exception { IsotopeFactory ifac = Isotopes.getInstance(); IIsotope c = ifac.getMajorIsotope("C"); IIsotope h = ifac.getMajorIsotope("H"); IIsotope n = ifac.getMajorIsotope("N"); IIsotope o = ifac.getMajorIsotope("O"); MolecularFormulaRange mfRange = new MolecularFormulaRange(); mfRange.addIsotope(c, 0, 20); mfRange.addIsotope(h, 0, 30); mfRange.addIsotope(o, 0, 15); mfRange.addIsotope(n, 0, 10); MolecularFormulaGenerator generator = new MolecularFormulaGenerator(builder, 13, 14, mfRange); Assert.assertTrue("generator implementation should be instance of FullEnumerationFormulaGenerator", generator.formulaGenerator instanceof FullEnumerationFormulaGenerator); }
double maxMass = 137.2; MolecularFormulaGenerator gen = new MolecularFormulaGenerator(builder, minMass, maxMass, mfRange); IMolecularFormulaSet mfSet = gen.getAllFormulas();
/** * Test if the generator respects minimal element counts * */ @Test public void testMinCounts() throws Exception { IsotopeFactory ifac = Isotopes.getInstance(); IIsotope c = ifac.getMajorIsotope("C"); IIsotope h = ifac.getMajorIsotope("H"); IIsotope n = ifac.getMajorIsotope("N"); IIsotope o = ifac.getMajorIsotope("O"); MolecularFormulaRange mfRange = new MolecularFormulaRange(); mfRange.addIsotope(c, 5, 20); mfRange.addIsotope(h, 5, 20); mfRange.addIsotope(o, 5, 20); mfRange.addIsotope(n, 5, 20); // The minimal formula MF=C5H5O5N5 MW=215.0290682825 double minMass = 100; double maxMass = 250; MolecularFormulaGenerator gen = new MolecularFormulaGenerator(builder, minMass, maxMass, mfRange); IMolecularFormulaSet mfSet = gen.getAllFormulas(); // Check that all element counts in the formula are >= 5 for (IMolecularFormula f : mfSet.molecularFormulas()) { for (IIsotope i : f.isotopes()) { int count = f.getIsotopeCount(i); Assert.assertTrue(count >= 5); } } }
/** * Test if the generator respects maximal element counts * */ @Test public void testMaxCounts() throws Exception { IsotopeFactory ifac = Isotopes.getInstance(); IIsotope c = ifac.getMajorIsotope("C"); IIsotope h = ifac.getMajorIsotope("H"); IIsotope n = ifac.getMajorIsotope("N"); IIsotope o = ifac.getMajorIsotope("O"); MolecularFormulaRange mfRange = new MolecularFormulaRange(); mfRange.addIsotope(c, 3, 7); mfRange.addIsotope(h, 3, 7); mfRange.addIsotope(o, 3, 7); mfRange.addIsotope(n, 3, 7); // The maximal formula MF=C7H7O7N7 MW=301.0406955954 double minMass = 250; double maxMass = 400; MolecularFormulaGenerator gen = new MolecularFormulaGenerator(builder, minMass, maxMass, mfRange); IMolecularFormulaSet mfSet = gen.getAllFormulas(); // Check that all element counts in the formula are <= 7 for (IMolecularFormula f : mfSet.molecularFormulas()) { for (IIsotope i : f.isotopes()) { int count = f.getIsotopeCount(i); Assert.assertTrue(count <= 7); } } }