From: <mig...@us...> - 2007-11-13 22:26:15
|
Revision: 9428 http://cdk.svn.sourceforge.net/cdk/?rev=9428&view=rev Author: miguelrojasch Date: 2007-11-13 14:26:07 -0800 (Tue, 13 Nov 2007) Log Message: ----------- Modified calculation of the isotopes pattern. Modified Paths: -------------- branches/miguelrojasch/mf/src/org/openscience/cdk/test/tools/IsotopePatternGeneratorTest.java branches/miguelrojasch/mf/src/org/openscience/cdk/tools/IsotopePatternGenerator.java Modified: branches/miguelrojasch/mf/src/org/openscience/cdk/test/tools/IsotopePatternGeneratorTest.java =================================================================== --- branches/miguelrojasch/mf/src/org/openscience/cdk/test/tools/IsotopePatternGeneratorTest.java 2007-11-13 15:40:21 UTC (rev 9427) +++ branches/miguelrojasch/mf/src/org/openscience/cdk/test/tools/IsotopePatternGeneratorTest.java 2007-11-13 22:26:07 UTC (rev 9428) @@ -26,17 +26,13 @@ import junit.framework.Test; import junit.framework.TestSuite; -import org.openscience.cdk.Atom; -import org.openscience.cdk.AtomContainer; -import org.openscience.cdk.Bond; +import org.openscience.cdk.DefaultChemObjectBuilder; import org.openscience.cdk.exception.CDKException; -import org.openscience.cdk.interfaces.IAtom; -import org.openscience.cdk.interfaces.IAtomContainer; -import org.openscience.cdk.interfaces.IAtomContainerSet; +import org.openscience.cdk.interfaces.IMolecularFormula; import org.openscience.cdk.interfaces.IMolecularFormulaSet; import org.openscience.cdk.test.CDKTestCase; import org.openscience.cdk.tools.IsotopePatternGenerator; -import org.openscience.cdk.tools.manipulator.AtomContainerManipulator; +import org.openscience.cdk.tools.manipulator.MolecularFormulaManipulator; /** * @cdk.module test-extra @@ -48,6 +44,7 @@ { IsotopePatternGenerator isotopeG = null; + private DefaultChemObjectBuilder builder; public IsotopePatternGeneratorTest(String name){ super(name); @@ -58,6 +55,7 @@ */ public void setUp() throws Exception { isotopeG = new IsotopePatternGenerator(); + builder = DefaultChemObjectBuilder.getInstance(); } /** @@ -76,40 +74,35 @@ * @return Description of the Return Value */ public void testCalculateIsotopesAllBromine() throws CDKException { - IAtomContainer m = new AtomContainer(); - Atom b1 = new Atom("Br"); - Atom b2 = new Atom("Br"); - m.addAtom(b1); - m.addAtom(b2); - m.addBond(new Bond(b1, b2)); + IMolecularFormula molFor = builder.newMolecularFormula(); + molFor.addAtom(builder.newAtom("Br")); + molFor.addAtom(builder.newAtom("Br")); - IsotopePatternGenerator isotopeGe = new IsotopePatternGenerator(0.01); - IMolecularFormulaSet molecularFormulaSet = isotopeGe.getIsotopes(m); + IsotopePatternGenerator isotopeGe = new IsotopePatternGenerator(10.0); + IMolecularFormulaSet molFormSet = isotopeGe.getIsotopes(molFor); - assertEquals(4, molecularFormulaSet.getMolecularFormulaCount()); + assertEquals(3, molFormSet.getMolecularFormulaCount()); - double mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(0)); + double mm = MolecularFormulaManipulator.getTotalExactMass(molFormSet.getMolecularFormula(0)); assertEquals(157.8366742, mm, 0.0000001); - mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(1)); + mm = MolecularFormulaManipulator.getTotalExactMass(molFormSet.getMolecularFormula(1)); assertEquals(159.8346277, mm, 0.0000001); - mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(2)); - assertEquals(159.8346277, mm, 0.0000001); - mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(3)); + mm = MolecularFormulaManipulator.getTotalExactMass(molFormSet.getMolecularFormula(2)); assertEquals(161.8325812, mm, 0.0000001); double sum = 0.0; - double ab = AtomContainerManipulator.getTotalNaturalAbundance(containerSet.getAtomContainer(0)); + double occurrence = ((Double)molFormSet.getMolecularFormula(0).getProperties().get("occurrence")); + double ab = MolecularFormulaManipulator.getTotalNaturalAbundance(molFormSet.getMolecularFormula(0)); sum += ab; assertEquals(0.25694761, ab, 0.0000001); - ab = AtomContainerManipulator.getTotalNaturalAbundance(containerSet.getAtomContainer(1)); + occurrence = ((Double)molFormSet.getMolecularFormula(1).getProperties().get("occurrence")); + ab = MolecularFormulaManipulator.getTotalNaturalAbundance(molFormSet.getMolecularFormula(1))*occurrence; sum += ab; - assertEquals(0.24995239, ab, 0.0000001); - ab = AtomContainerManipulator.getTotalNaturalAbundance(containerSet.getAtomContainer(2)); + assertEquals(0.4999047, ab, 0.0000001); + occurrence = ((Double)molFormSet.getMolecularFormula(2).getProperties().get("occurrence")); + ab = MolecularFormulaManipulator.getTotalNaturalAbundance(molFormSet.getMolecularFormula(2)); sum += ab; - assertEquals(0.24995239, ab, 0.0000001); - ab = AtomContainerManipulator.getTotalNaturalAbundance(containerSet.getAtomContainer(3)); - sum += ab; assertEquals(0.24314761, ab, 0.0000001); @@ -117,303 +110,116 @@ } - /** - * A unit test for JUnit: Isotopes of the Bromine. - * - * @return Description of the Return Value - */ - public void testCalculateIsotopesBromine() throws CDKException { - IAtomContainer m = new AtomContainer(); - Atom b1 = new Atom("Br"); - Atom b2 = new Atom("Br"); - m.addAtom(b1); - m.addAtom(b2); - m.addBond(new Bond(b1, b2)); - - IsotopePatternGenerator isotopeGe = new IsotopePatternGenerator(0.01); - IAtomContainerSet containerSet = (IAtomContainerSet)isotopeGe.getIsotopes(m); - - assertEquals(3, containerSet.getAtomContainerCount()); - - double mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(0)); - assertEquals(157.8366742, mm, 0.0000001); - mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(1)); - assertEquals(159.8346277, mm, 0.0000001); - mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(2)); - assertEquals(161.8325812, mm, 0.0000001); - - double sum = 0.0; - double ab = ((Double)containerSet.getAtomContainer(0).getProperty("abundanceTotal")).doubleValue(); - sum += ab; - assertEquals(0.25694761, ab, 0.0000001); - ab = ((Double)containerSet.getAtomContainer(1).getProperty("abundanceTotal")).doubleValue(); - sum += ab; - assertEquals(0.4999047, ab, 0.0000001); - ab = ((Double)containerSet.getAtomContainer(2).getProperty("abundanceTotal")).doubleValue(); - sum += ab; - assertEquals(0.24314761, ab, 0.0000001); - - assertEquals(1.0, sum, 0.0000001); - } /** * A unit test for JUnit: Isotopes of the Iodemethylidyne. * * @return Description of the Return Value */ public void testCalculateIsotopesIodemethylidyne() throws CDKException { - IAtomContainer m = new AtomContainer(); - IAtom b1 = new Atom("C"); - IAtom b2 = new Atom("I"); - m.addAtom(b1); - m.addAtom(b2); - m.addBond(new Bond(b1, b2)); - IsotopePatternGenerator isotopeGe = new IsotopePatternGenerator(0.0000001); - IAtomContainerSet containerSet = (IAtomContainerSet)isotopeGe.getAllIsotopes(m); + IMolecularFormula molFor = builder.newMolecularFormula(); + molFor.addAtom(builder.newAtom("C")); + molFor.addAtom(builder.newAtom("I")); + + IsotopePatternGenerator isotopeGe = new IsotopePatternGenerator(0.10); - assertEquals(2, containerSet.getAtomContainerCount()); + IMolecularFormulaSet molFormSet = isotopeGe.getIsotopes(molFor); - double mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(0)); + assertEquals(2, molFormSet.getMolecularFormulaCount()); + + double mm = MolecularFormulaManipulator.getTotalExactMass(molFormSet.getMolecularFormula(0)); assertEquals(138.904473, mm, 0.0000001); - mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(1)); + mm = MolecularFormulaManipulator.getTotalExactMass(molFormSet.getMolecularFormula(1)); assertEquals(139.9078278399, mm, 0.0000001); double sum = 0.0; - double ab = AtomContainerManipulator.getTotalNaturalAbundance(containerSet.getAtomContainer(0)); + double occurrence = ((Double)molFormSet.getMolecularFormula(0).getProperties().get("occurrence")); + double ab = MolecularFormulaManipulator.getTotalNaturalAbundance(molFormSet.getMolecularFormula(0)); sum += ab; assertEquals(0.9893, ab, 0.0000001); - ab = AtomContainerManipulator.getTotalNaturalAbundance(containerSet.getAtomContainer(1)); + occurrence = ((Double)molFormSet.getMolecularFormula(1).getProperties().get("occurrence")); + ab = MolecularFormulaManipulator.getTotalNaturalAbundance(molFormSet.getMolecularFormula(1))*occurrence; sum += ab; assertEquals(0.01070, ab, 0.0000001); + assertEquals(1.0, sum, 0.0000001); } - - /** - * A unit test for JUnit: Isotopes of the DiBromomethylidyne. + * A unit test for JUnit: Isotopes of the n-Carbone * * @return Description of the Return Value */ - public void testCalculateIsotopesDibromomethylidyne() throws CDKException { - IAtomContainer m = new AtomContainer(); - IAtom b1 = new Atom("C"); - IAtom b2 = new Atom("Br"); - IAtom b3 = new Atom("Br"); - m.addAtom(b1); - m.addAtom(b2); - m.addAtom(b3); - m.addBond(new Bond(b1, b2)); - m.addBond(new Bond(b1, b3)); - IsotopePatternGenerator isotopeGe = new IsotopePatternGenerator(0.01); - IAtomContainerSet containerSet = (IAtomContainerSet)isotopeGe.getAllIsotopes(m); - - - assertEquals(8, containerSet.getAtomContainerCount()); - - double mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(0)); - assertEquals(169.8366742, mm, 0.0000001); - mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(1)); - assertEquals(171.8346277, mm, 0.0000001); - mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(2)); - assertEquals(171.8346277, mm, 0.0000001); - mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(3)); - assertEquals(173.8325812, mm, 0.0000001); - mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(4)); - assertEquals(170.84002904, mm, 0.0000001); - mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(5)); - assertEquals(172.837982539, mm, 0.0000001); - mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(6)); - assertEquals(172.8379825, mm, 0.0000001); - mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(7)); - assertEquals(174.8359360, mm, 0.0000001); - + public void testCalculateIsotopesnCarbono() throws CDKException { + IMolecularFormula molFor = builder.newMolecularFormula(); + for(int i = 0 ; i < 10 ; i++) + molFor.addAtom(builder.newAtom("C")); - double sum = 0.0; - double ab = AtomContainerManipulator.getTotalNaturalAbundance(containerSet.getAtomContainer(0)); - sum += ab; - assertEquals(0.254198270, ab, 0.0000001); - ab = AtomContainerManipulator.getTotalNaturalAbundance(containerSet.getAtomContainer(1)); - sum += ab; - assertEquals(0.2472778994, ab, 0.0000001); - ab = AtomContainerManipulator.getTotalNaturalAbundance(containerSet.getAtomContainer(2)); - sum += ab; - assertEquals(0.247277899427, ab, 0.0000001); - ab = AtomContainerManipulator.getTotalNaturalAbundance(containerSet.getAtomContainer(3)); - sum += ab; - assertEquals(0.240545930573, ab, 0.0000001); - ab = AtomContainerManipulator.getTotalNaturalAbundance(containerSet.getAtomContainer(4)); - sum += ab; - assertEquals(0.0027493394270, ab, 0.0000001); - ab = AtomContainerManipulator.getTotalNaturalAbundance(containerSet.getAtomContainer(5)); - sum += ab; - assertEquals(0.00267449057, ab, 0.0000001); - ab = AtomContainerManipulator.getTotalNaturalAbundance(containerSet.getAtomContainer(6)); - sum += ab; - assertEquals(0.00267449057, ab, 0.0000001); - ab = AtomContainerManipulator.getTotalNaturalAbundance(containerSet.getAtomContainer(7)); - sum += ab; - assertEquals(0.002601679427, ab, 0.0000001); - - assertEquals(1.0, sum, 0.0000001); - } - /** - * A unit test for JUnit: Isotopes of the Chloromethylidyne with a - * restriction for those istopes which their abundance is higher than 50%. - * - * @return Description of the Return Value - */ - public void testCalculateIsotopesChloromethylidyne2() throws CDKException { - IAtomContainer m = new AtomContainer(); - Atom b1 = new Atom("C"); - Atom b2 = new Atom("Cl"); - m.addAtom(b1); - m.addAtom(b2); - m.addBond(new Bond(b1, b2)); - - IsotopePatternGenerator isotopeG2 = new IsotopePatternGenerator(0.01); - IAtomContainerSet containerSet = (IAtomContainerSet)isotopeG2.getAllIsotopes(m); + IsotopePatternGenerator isotopeGe = new IsotopePatternGenerator(0.10); - assertEquals(4, containerSet.getAtomContainerCount()); + IMolecularFormulaSet molFormSet = isotopeGe.getIsotopes(molFor); - double mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(0)); - assertEquals(46.96885268, mm, 0.0000001); - mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(1)); - assertEquals(48.96590259, mm, 0.0000001); - mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(2)); - assertEquals(47.97220752, mm, 0.0000001); - mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(3)); - assertEquals(49.96925743, mm, 0.0000001); + assertEquals(11, molFormSet.getMolecularFormulaCount()); double sum = 0.0; - double ab = AtomContainerManipulator.getTotalNaturalAbundance(containerSet.getAtomContainer(0)); - sum += ab; - assertEquals(0.74969154, ab, 0.0000001); - ab = AtomContainerManipulator.getTotalNaturalAbundance(containerSet.getAtomContainer(1)); - sum += ab; - assertEquals(0.23960846, ab, 0.0000001); - ab = AtomContainerManipulator.getTotalNaturalAbundance(containerSet.getAtomContainer(2)); - sum += ab; - assertEquals(0.00810846, ab, 0.0000001); - ab = AtomContainerManipulator.getTotalNaturalAbundance(containerSet.getAtomContainer(3)); - sum += ab; - assertEquals(0.00259154, ab, 0.0000001); - + for(int i = 0; i < molFormSet.getMolecularFormulaCount();i++){ + double occurrence = ((Double)molFormSet.getMolecularFormula(i).getProperties().get("occurrence")); + double ab = MolecularFormulaManipulator.getTotalNaturalAbundance(molFormSet.getMolecularFormula(i)); + sum += ab*occurrence; + + } assertEquals(1.0, sum, 0.0000001); - } - - - /** - * A unit test for JUnit: Isotopes of the n-Carbone - * - * @return Description of the Return Value - */ - public void testCalculateIsotopesnCarbono() throws CDKException { - IAtomContainer m = new AtomContainer(); - Atom b1 = new Atom("C"); - Atom b2 = new Atom("C"); - Atom b3 = new Atom("C"); - Atom b4 = new Atom("C"); - Atom b5 = new Atom("C"); - Atom b6 = new Atom("C"); - m.addAtom(b1); - m.addAtom(b2); - m.addAtom(b3); - m.addAtom(b4); - m.addAtom(b5); - m.addAtom(b6); - m.addBond(new Bond(b1, b2)); - m.addBond(new Bond(b2, b3)); - m.addBond(new Bond(b3, b4)); - m.addBond(new Bond(b4, b5)); - m.addBond(new Bond(b5, b6)); - - IsotopePatternGenerator isotopeG2 = new IsotopePatternGenerator(0.01); - IAtomContainerSet containerSet = (IAtomContainerSet)isotopeG2.getAllIsotopes(m); - assertEquals(64, containerSet.getAtomContainerCount()); - - double sum = 0.0; - double mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(0)); - assertEquals(72.0, mm, 0.0000001); - mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(1)); - assertEquals(73.00335484, mm, 0.0000001); - mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(2)); - assertEquals(73.00335484, mm, 0.0000001); - mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(3)); - assertEquals(73.00335484, mm, 0.0000001); + double mm = MolecularFormulaManipulator.getTotalExactMass(molFormSet.getMolecularFormula(0)); + assertEquals(120.0, mm, 0.0000001); + mm = MolecularFormulaManipulator.getTotalExactMass(molFormSet.getMolecularFormula(1)); + assertEquals(121.00335484, mm, 0.0000001); - sum = 0.0; - double ab = AtomContainerManipulator.getTotalNaturalAbundance(containerSet.getAtomContainer(0)); - sum += ab; - assertEquals(0.937493044919, ab, 0.0000001); - ab = AtomContainerManipulator.getTotalNaturalAbundance(containerSet.getAtomContainer(1)); - sum += ab; - assertEquals(0.0101396700, ab, 0.0000001); - ab = AtomContainerManipulator.getTotalNaturalAbundance(containerSet.getAtomContainer(2)); - sum += ab; - assertEquals(0.0101396700, ab, 0.0000001); - ab = AtomContainerManipulator.getTotalNaturalAbundance(containerSet.getAtomContainer(3)); - sum += ab; - assertEquals(0.0101396700, ab, 0.0000001); - - /*it needs more containers*/ -// assertEquals(1.0, sum, 0.0000001); + double ab = MolecularFormulaManipulator.getTotalNaturalAbundance(molFormSet.getMolecularFormula(0)); + double occurrence = ((Double)molFormSet.getMolecularFormula(0).getProperties().get("occurrence")); + ab *= occurrence; + assertEquals(0.898007762480552, ab, 0.0000001); + ab = MolecularFormulaManipulator.getTotalNaturalAbundance(molFormSet.getMolecularFormula(1)); + occurrence = ((Double)molFormSet.getMolecularFormula(1).getProperties().get("occurrence")); + ab *= occurrence; + assertEquals(0.09712607963754075, ab, 0.0000001); } /** - * A unit test for JUnit: Isotopes of the n-Carbone + * A unit test for JUnit: Isotopes of the * * @return Description of the Return Value */ public void testCalculateIsotopesOrthinine() throws CDKException { - IAtomContainer m = new AtomContainer(); + IMolecularFormula molFor = builder.newMolecularFormula(); for(int i = 0 ; i < 5 ; i++) - m.addAtom(new Atom("C")); + molFor.addAtom(builder.newAtom("C")); for(int i = 0 ; i < 13 ; i++) - m.addAtom(new Atom("H")); + molFor.addAtom(builder.newAtom("H")); for(int i = 0 ; i < 2 ; i++) - m.addAtom(new Atom("N")); + molFor.addAtom(builder.newAtom("N")); for(int i = 0 ; i < 2 ; i++) - m.addAtom(new Atom("O")); + molFor.addAtom(builder.newAtom("O")); - IsotopePatternGenerator isotopeG2 = new IsotopePatternGenerator(0.01); - IAtomContainerSet containerSet = (IAtomContainerSet)isotopeG2.getIsotopes(m); + IsotopePatternGenerator isotopeGe = new IsotopePatternGenerator(0.10); + IMolecularFormulaSet molFormSet = isotopeGe.getIsotopes(molFor); -// assertEquals(64, containerSet.getAtomContainerCount()); -// -// double sum = 0.0; -// double mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(0)); -// assertEquals(72.0, mm, 0.0000001); -// mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(1)); -// assertEquals(73.00335484, mm, 0.0000001); -// mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(2)); -// assertEquals(73.00335484, mm, 0.0000001); -// mm = AtomContainerManipulator.getTotalExactMass(containerSet.getAtomContainer(3)); -// assertEquals(73.00335484, mm, 0.0000001); -// -// sum = 0.0; -// double ab = AtomContainerManipulator.getTotalNaturalAbundance(containerSet.getAtomContainer(0)); -// sum += ab; -// assertEquals(0.937493044919, ab, 0.0000001); -// ab = AtomContainerManipulator.getTotalNaturalAbundance(containerSet.getAtomContainer(1)); -// sum += ab; -// assertEquals(0.0101396700, ab, 0.0000001); -// ab = AtomContainerManipulator.getTotalNaturalAbundance(containerSet.getAtomContainer(2)); -// sum += ab; -// assertEquals(0.0101396700, ab, 0.0000001); -// ab = AtomContainerManipulator.getTotalNaturalAbundance(containerSet.getAtomContainer(3)); -// sum += ab; -// assertEquals(0.0101396700, ab, 0.0000001); -// -// /*it needs more containers*/ -//// assertEquals(1.0, sum, 0.0000001); + assertEquals(10, molFormSet.getMolecularFormulaCount()); + + double sum = 0.0; + for(int i = 0; i < molFormSet.getMolecularFormulaCount();i++){ + double occurrence = ((Double)molFormSet.getMolecularFormula(i).getProperties().get("occurrence")); + double ab = MolecularFormulaManipulator.getTotalNaturalAbundance(molFormSet.getMolecularFormula(i)); + sum += ab*occurrence; + + } + assertEquals(1.0, sum, 0.0000001); } Modified: branches/miguelrojasch/mf/src/org/openscience/cdk/tools/IsotopePatternGenerator.java =================================================================== --- branches/miguelrojasch/mf/src/org/openscience/cdk/tools/IsotopePatternGenerator.java 2007-11-13 15:40:21 UTC (rev 9427) +++ branches/miguelrojasch/mf/src/org/openscience/cdk/tools/IsotopePatternGenerator.java 2007-11-13 22:26:07 UTC (rev 9428) @@ -26,17 +26,17 @@ import java.io.IOException; import java.io.OptionalDataException; import java.util.ArrayList; +import java.util.Hashtable; import java.util.Iterator; +import java.util.List; -import org.openscience.cdk.Atom; -import org.openscience.cdk.AtomContainerSet; import org.openscience.cdk.ChemObject; import org.openscience.cdk.Isotope; import org.openscience.cdk.config.IsotopeFactory; import org.openscience.cdk.interfaces.IAtom; -import org.openscience.cdk.interfaces.IAtomContainer; -import org.openscience.cdk.interfaces.IAtomContainerSet; import org.openscience.cdk.interfaces.IIsotope; +import org.openscience.cdk.interfaces.IMolecularFormula; +import org.openscience.cdk.interfaces.IMolecularFormulaSet; /** @@ -54,7 +54,7 @@ private IsotopeFactory isotopeFactory; private static final long serialVersionUID = -5513399059175488001L; - /** Minimun abundance of the isotopo to be added in the combinatorial search.*/ + /** Minimal abundance of the isotopes to be added in the combinatorial search.*/ private double minAbundance = 10.0; /** * Constructor for the IsotopeGenerator @@ -65,8 +65,8 @@ /** * Constructor for the IsotopeGenerator * - * @param minAbundance Minimun abundance of the isotopo to be added - * in the combinatorial search + * @param minAb Minimal abundance of the isotopes to be added + * in the combinatorial search */ public IsotopePatternGenerator(double minAb){ minAbundance = minAb; @@ -82,24 +82,26 @@ } } /** - * get all combinatorial chemical isotopes given a structure. + * Get all combinatorial chemical isotopes given a structure. * - * @param container - * @return + * @param molFor The IMolecularFormula to start + * @return A IMolecularFormulaSet containing the different combinations */ - public IAtomContainerSet getIsotopes(IAtomContainer container){ - IAtomContainerSet containerSet = new AtomContainerSet(); + public IMolecularFormulaSet getIsotopes(IMolecularFormula molFor){ + + IMolecularFormulaSet molForSet = molFor.getBuilder().newMolecularFormulaSet(); /** all isotopes found*/ - ArrayList isotopicAtoms = new ArrayList(); + ArrayList<IIsotope> isotopicAtoms = new ArrayList<IIsotope>(); /** Atoms with isotopes*/ - ArrayList atomWithIsotopes = new ArrayList(); - /** value of the number of combinations*/ + ArrayList<IAtom> atomWithIsotopes = new ArrayList<IAtom>(); + + /*Number of permutations*/ int nC = 1; /*search atoms which have more than one isotope and they have the minimum abundance*/ - Iterator itA = container.atoms(); + Iterator<IAtom> itA = molFor.atoms(); while(itA.hasNext()){ - IAtom atom = (IAtom)itA.next(); + IAtom atom = itA.next(); IIsotope[] isotopes = isotopeFactory.getIsotopes(atom.getSymbol()); int count = 0; @@ -122,45 +124,62 @@ } } - if(isotopicAtoms.size() != 0) - containerSet = mixer(container, isotopicAtoms, atomWithIsotopes, nC); - else - containerSet.addAtomContainer(container); - - return containerSet; + if(isotopicAtoms.size() != 0) + molForSet = mixer(molFor, isotopicAtoms, atomWithIsotopes, nC); + else + molForSet.addMolecularFormula(molFor); + + return molForSet; } /** - * combine all possible isotopos + * Combine all possible isotopes * - * @param atomContainer IAtomContainer to analyze + * @param molFor IMolecularFormula to analyze * @param isotopicAtoms An arrayList containing all isotopes * @param atomWithIsotopes An arrayList containing atoms which have isotopes * @param nc Number of combinations * - * @return The IAtomContainerSet + * @return The IMolecularFormulaSet */ - private IAtomContainerSet mixer(IAtomContainer atomContainer, ArrayList isotopicAtoms, ArrayList atomWithIsotopes, int nC){ - IAtomContainerSet containerSet = new AtomContainerSet(); - - int[][] ordreComb = new int[nC][atomWithIsotopes.size()]; - IAtom[][] atomsComb = new Atom[nC][atomWithIsotopes.size()]; + private IMolecularFormulaSet mixer(IMolecularFormula molFor, ArrayList<IIsotope> isotopicAtoms, ArrayList<IAtom> atomWithIsotopes, int nC){ + IMolecularFormulaSet molForSet = molFor.getBuilder().newMolecularFormulaSet(); + + int[][] ordreComb = new int[100][atomWithIsotopes.size()]; + List<int[]> ordreCombList = new ArrayList<int[]>(); + List<IAtom[]> atomsCombList = new ArrayList<IAtom[]>(); + Hashtable<String, Integer> massV = new Hashtable<String, Integer>(); int column[] = new int[atomWithIsotopes.size()]; - for (int j = 0; j < atomWithIsotopes.size(); j++) - { + + for (int j = 0; j < atomWithIsotopes.size(); j++){ + column[j] = 1; } - // create a matrix with the necessary order for (int i = 0; i < nC; i++){ - // add the combnation + //+++++++++++++++++++++++++++++++++++++++++++++++++++ + //calculate if it exists + int[] ordreTmp = new int[column.length]; + IAtom[] atomsTmp = new IAtom[column.length]; for (int j = 0; j < atomWithIsotopes.size(); j++) - ordreComb[i][j] = column[j]; + ordreTmp[j] = column[j]; + + double massEx = calculateMass(molFor,ordreTmp,atomWithIsotopes,isotopicAtoms); + String massEx_String = Double.toString(massEx); + if(!massV.containsKey(massEx_String)){ - for (int j = 0; j < ordreComb[0].length; j++) - atomsComb[i][j] = (IAtom) atomWithIsotopes.get(j); + massV.put(massEx_String, 1); + ordreCombList.add(ordreTmp); + for (int j = 0; j < ordreComb[0].length; j++) + atomsTmp[j] = (IAtom) atomWithIsotopes.get(j); + atomsCombList.add(atomsTmp); + }else{ + int occurr = massV.get(massEx_String); + massV.put(massEx_String, occurr+1); + } column[atomWithIsotopes.size() - 1]++; + //+++++++++++++++++++++++++++++++++++++++++++++++++++ // control of the end of each column for (int k = atomWithIsotopes.size() - 1; k >= 0; k--){ @@ -174,26 +193,54 @@ } /*set the correct isotope for each structure*/ - for (int i = 0; i < nC; i++){ + for (int i = 0; i < ordreCombList.size(); i++){ try { - IAtomContainer containerClon = (IAtomContainer) atomContainer.clone(); - - for (int j = 0; j < ordreComb[i].length; j++){ + IMolecularFormula molForClon = (IMolecularFormula) molFor.clone(); + int[] ordreTmp = ordreCombList.get(i); + IAtom[] atomsTmp = atomsCombList.get(i); + for (int j = 0; j < ordreTmp.length; j++){ - int posAtom = atomContainer.getAtomNumber((IAtom) atomsComb[i][j]); - int or = ordreComb[i][j]-1; + int posAtom = molFor.getAtomNumber((IAtom) atomsTmp[j]); + int or = ordreTmp[j]-1; double mass = ((Isotope)isotopicAtoms.get(or)).getExactMass(); - containerClon.getAtom(posAtom).setExactMass(mass); - mass = containerClon.getAtom(posAtom).getExactMass(); + molForClon.getAtom(posAtom).setExactMass(mass); + double abund = ((Isotope)isotopicAtoms.get(or)).getNaturalAbundance(); + molForClon.getAtom(posAtom).setNaturalAbundance(abund); } - containerSet.addAtomContainer(containerClon); + double massEx = calculateMass(molFor,ordreTmp,atomWithIsotopes,isotopicAtoms); + String massEx_String = Double.toString(massEx); + double prob = massV.get(massEx_String); + Hashtable<String, Double> hash = new Hashtable<String, Double>(); + hash.put("occurrence", prob); + molForClon.setProperties(hash); + + molForSet.addMolecularFormula(molForClon); + } catch (CloneNotSupportedException e) { e.printStackTrace(); } } - return containerSet; + return molForSet; } + /** + * Calculate of the Mass + * + * @param molFor IMolecularFormula + * @param ordreTmp + * @param atomWithIsotopes + * @param isotopicAtoms + * @return The mass total + */ + private double calculateMass(IMolecularFormula molFor, int[] ordreTmp, ArrayList<IAtom> atomWithIsotopes,ArrayList<IIsotope> isotopicAtoms) { + double massTotal = 0; + for (int j = 0; j < ordreTmp.length; j++){ + int or = ordreTmp[j]-1; + double mass = ((Isotope)isotopicAtoms.get(or)).getExactMass(); + massTotal += mass; + } + return massTotal; + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |