From: <mig...@us...> - 2007-11-30 22:56:02
|
Revision: 9537 http://cdk.svn.sourceforge.net/cdk/?rev=9537&view=rev Author: miguelrojasch Date: 2007-11-30 14:55:59 -0800 (Fri, 30 Nov 2007) Log Message: ----------- added new rule to validate MolecularFormula. Occurrence of the elements. Added Paths: ----------- branches/miguelrojasch/mf/src/org/openscience/cdk/formula/rules/ElementRule.java branches/miguelrojasch/mf/src/org/openscience/cdk/test/formula/rules/ElementRuleTest.java Added: branches/miguelrojasch/mf/src/org/openscience/cdk/formula/rules/ElementRule.java =================================================================== --- branches/miguelrojasch/mf/src/org/openscience/cdk/formula/rules/ElementRule.java (rev 0) +++ branches/miguelrojasch/mf/src/org/openscience/cdk/formula/rules/ElementRule.java 2007-11-30 22:55:59 UTC (rev 9537) @@ -0,0 +1,191 @@ +/* $RCSfile$ + * $Author: egonw $ + * $Date: 2007-09-03 12:53:05 +0200 (Mon, 03 Sep 2007) $ + * $Revision: 8848 $ + * + * Copyright (C) 2007 Miguel Rojasch <mig...@us...> + * + * Contact: cdk...@li... + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ +package org.openscience.cdk.formula.rules; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Iterator; + +import org.openscience.cdk.exception.CDKException; +import org.openscience.cdk.formula.IMolecularFormula; +import org.openscience.cdk.formula.MolecularFormulaManipulator; +import org.openscience.cdk.interfaces.IElement; +import org.openscience.cdk.tools.LoggingTool; +/** + * This class validate if the occurrence of the IElements in the IMolecularFormula + * are into a limits. As default defines all elements of the periodic table with + * a occurrence of zero to 100. + * + * + * <p>This rule uses these parameters: + * <table border="1"> + * <tr> + * <td>Name</td> + * <td>Default</td> + * <td>Description</td> + * </tr> + * <tr> + * <td>elements</td> + * <td>C,H,N,O</td> + * <td>The IELements to be analyzed</td> + * </tr> + * </table> + * + * @author rojasm + * + * @cdk.module formula + */ +public class ElementRule implements IRule{ + + + private LoggingTool logger; + + private String[] elements; + + private HashMap<String, Integer> hashMapMin; + + private HashMap<String, Integer> hashMapMax; + + /** + * Constructor for the ElementRule object. + * + * @throws IOException If an error occurs when reading atom type information + * @throws ClassNotFoundException If an error occurs during tom typing + */ + public ElementRule() throws IOException, ClassNotFoundException { + logger = new LoggingTool(this); + initiateDefaultElements(); + } + + /** + * Sets the parameters attribute of the ElementRule object. + * + * @param params The new parameters value + * @throws CDKException Description of the Exception + * + * @see #getParameters + */ + public void setParameters(Object[] params) throws CDKException { + if (params.length != 2) + throw new CDKException("ElementRule expects two parameters"); + + if(!(params[0] instanceof HashMap)) + throw new CDKException("The parameter must be of type HashMap<String,Integer>"); + + if(!(params[1] instanceof HashMap)) + throw new CDKException("The parameter must be of type HashMap<String,Integer>"); + + if(((HashMap)params[0]).size() != ((HashMap)params[1]).size()) + throw new CDKException("The two HashMap parameter must have the size"); + + //prove if all elements from hashMapMin are in hashMapMax and the contrary + HashMap<String, Integer> elementMin = (HashMap<String, Integer>) params[0]; + HashMap<String, Integer> elementMax = (HashMap<String, Integer>) params[1]; + Iterator<String> keysMin = elementMin.keySet().iterator(); + while(keysMin.hasNext()){ + if(!elementMax.containsKey(keysMin.next())){ + throw new CDKException("The two HashMap parameter must contain the same symbols." + + "One of the symbol in params[0] is not implemented in params[1]"); + } + + } + Iterator<String> keysMax = elementMax.keySet().iterator(); + while(keysMax.hasNext()){ + if(!elementMin.containsKey(keysMax.next())){ + throw new CDKException("The two HashMap parameter must contain the same symbols." + + "One of the symbol in params[1] is not implemented in params[0]"); + } + + } + + hashMapMin = elementMin; + hashMapMax = elementMax; + + } + + /** + * Gets the parameters attribute of the ElementRule object. + * + * @return The parameters value + * @see #setParameters + */ + public Object[] getParameters() { + // return the parameters as used for the rule validation + Object[] params = new Object[2]; + params[0] = hashMapMin; + params[1] = hashMapMax; + return params; + } + + + /** + * Validate the occurrence of this IMolecularFormula. + * + * @param formula Parameter is the IMolecularFormula + * @return An ArrayList containing 9 elements in the order described above + */ + + 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 < hashMapMin.get(element.getSymbol())) || (occur > hashMapMax.get(element.getSymbol()))){ + isValid = 0.0; + break; + } + } + + return isValid; + } + + /** + * Initiate the hashMap with the maximum and minimum occurrence of the Elements. + * In this case all elements of the periodic table are loaded. + */ + private void initiateDefaultElements(){ + elements = new String[]{ + "C", "H", "O", "N", "Si", "P", "S", "F", "Cl", + "Br", "I", "Sn", "B", "Pb", "Tl", "Ba", "In", "Pd", + "Pt", "Os", "Ag", "Zr", "Se", "Zn", "Cu", "Ni", "Co", + "Fe", "Cr", "Ti", "Ca", "K", "Al", "Mg", "Na", "Ce", + "Hg", "Au", "Ir", "Re", "W", "Ta", "Hf", "Lu", "Yb", + "Tm", "Er", "Ho", "Dy", "Tb", "Gd", "Eu", "Sm", "Pm", + "Nd", "Pr", "La", "Cs", "Xe", "Te", "Sb", "Cd", "Rh", + "Ru", "Tc", "Mo", "Nb", "Y", "Sr", "Rb", "Kr", "As", + "Ge", "Ga", "Mn", "V", "Sc", "Ar", "Ne", "Be", "Li", + "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", + "Th", "Pa", "U", "Np", "Pu"}; + + hashMapMin = new HashMap<String, Integer>(); + hashMapMax = new HashMap<String, Integer>(); + for(int i = 0; i < elements.length ; i++){ + hashMapMin.put(elements[i], 0); + hashMapMax.put(elements[i], 100); + } + + } +} Added: branches/miguelrojasch/mf/src/org/openscience/cdk/test/formula/rules/ElementRuleTest.java =================================================================== --- branches/miguelrojasch/mf/src/org/openscience/cdk/test/formula/rules/ElementRuleTest.java (rev 0) +++ branches/miguelrojasch/mf/src/org/openscience/cdk/test/formula/rules/ElementRuleTest.java 2007-11-30 22:55:59 UTC (rev 9537) @@ -0,0 +1,185 @@ +/* $RCSfile$ + * $Author: miguelrojasch $ + * $Date: 2006-05-11 14:25:07 +0200 (Do, 11 Mai 2006) $ + * $Revision: 6221 $ + * + * Copyright (C) 2007 Miguel Rojasch <mig...@us...> + * + * Contact: cdk...@li... + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ +package org.openscience.cdk.test.formula.rules; + +import java.util.HashMap; + +import junit.framework.Test; +import junit.framework.TestSuite; + +import org.openscience.cdk.DefaultChemObjectBuilder; +import org.openscience.cdk.exception.CDKException; +import org.openscience.cdk.formula.IMolecularFormula; +import org.openscience.cdk.formula.MolecularFormula; +import org.openscience.cdk.formula.rules.ElementRule; +import org.openscience.cdk.formula.rules.IRule; +import org.openscience.cdk.test.CDKTestCase; + +/** + * @cdk.module test-formula + */ +public class ElementRuleTest extends CDKTestCase { + + private DefaultChemObjectBuilder builder; + /** + * Constructor for the ElementRuleTest object + * + */ + public ElementRuleTest(String name){ + + super(name); + } + + /** + * The JUnit setup method + */ + public void setUp() throws Exception { + builder = DefaultChemObjectBuilder.getInstance(); + } + + /** + * A unit test suite for JUnit. + * + *@return The test suite + */ + public static Test suite() { + return new TestSuite(ElementRuleTest.class); + } + + /** + * A unit test suite for JUnit. + * + * @return The test suite + */ + public void testDefault() throws ClassNotFoundException, CDKException, Exception { + + IRule rule = new ElementRule(); + Object[] objects = rule.getParameters(); + assertEquals(2, objects.length); + + HashMap<String, Integer> elementMin = (HashMap<String, Integer>) objects[0]; + assertEquals(93, elementMin.size()); + assertEquals(0, elementMin.get("C").intValue()); + assertEquals(100, ((HashMap<String, Integer>) objects[1]).get("C").intValue()); + + + } + + /** + * A unit test suite for JUnit. + * + * @return The test suite + */ + public void testSetParameters() throws ClassNotFoundException, CDKException, Exception { + + IRule rule = new ElementRule(); + + Object[] params = new Object[2]; + + HashMap<String, Integer> hashMapMin = new HashMap<String, Integer>(); + hashMapMin.put("C",1); + hashMapMin.put("H",1); + params[0] = hashMapMin; + + HashMap<String, Integer> hashMapMax = new HashMap<String, Integer>(); + hashMapMax.put("C",10); + hashMapMax.put("H",10); + params[1] = hashMapMax; + + + rule.setParameters(params); + + Object[] objects = rule.getParameters(); + assertEquals(2, objects.length); + + HashMap<String, Integer> elementMin = (HashMap<String, Integer>) objects[0]; + assertEquals(2, elementMin.size()); + assertEquals(1, elementMin.get("C").intValue()); + assertEquals(10, ((HashMap<String, Integer>) objects[1]).get("C").intValue()); + + } + /** + * A unit test suite for JUnit. + * + * @return The test suite + */ + public void testDefaultValidFalse() throws ClassNotFoundException, CDKException, Exception { + + IRule rule = new ElementRule(); + + IMolecularFormula formula = new MolecularFormula(); + formula.addIsotope(builder.newIsotope("C"),2); + formula.addIsotope(builder.newIsotope("H"),200); + + assertEquals(0.0, rule.validate(formula),0.0001); + } + + /** + * A unit test suite for JUnit. + * + * @return The test suite + */ + public void testDefaultValidFalse_SetParam() throws ClassNotFoundException, CDKException, Exception { + + IRule rule = new ElementRule(); + + Object[] params = new Object[2]; + + IMolecularFormula formula = new MolecularFormula(); + formula.addIsotope(builder.newIsotope("C"),2); + formula.addIsotope(builder.newIsotope("H"),6); + + + HashMap<String, Integer> hashMapMin = new HashMap<String, Integer>(); + hashMapMin.put("C",1); + hashMapMin.put("H",1); + params[0] = hashMapMin; + + HashMap<String, Integer> hashMapMax = new HashMap<String, Integer>(); + hashMapMax.put("C",2); + hashMapMax.put("H",2); + params[1] = hashMapMax; + + rule.setParameters(params); + + assertEquals(0.0, rule.validate(formula),0.0001); + } + + /** + * A unit test suite for JUnit. + * + * @return The test suite + */ + public void testDefaultValidTrue() throws ClassNotFoundException, CDKException, Exception { + + IRule rule = new ElementRule(); + + IMolecularFormula formula = new MolecularFormula(); + formula.addIsotope(builder.newIsotope("C"),2); + formula.addIsotope(builder.newIsotope("H"),6); + + assertEquals(1.0, rule.validate(formula),0.0001); + } + +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |