From: <eg...@us...> - 2008-03-06 16:03:59
|
Revision: 10341 http://cdk.svn.sourceforge.net/cdk/?rev=10341&view=rev Author: egonw Date: 2008-03-06 08:03:34 -0800 (Thu, 06 Mar 2008) Log Message: ----------- Applied patch 9901: 'All class in the charges module now implement IPartialChargeCalculator; some other code clean up' Modified Paths: -------------- branches/miguelrojasch/charges/src/main/org/openscience/cdk/charges/GasteigerPEPEPartialCharges.java branches/miguelrojasch/charges/src/main/org/openscience/cdk/charges/InductivePartialCharges.java branches/miguelrojasch/charges/src/main/org/openscience/cdk/qsar/descriptors/atomic/PartialPiChargeDescriptor.java branches/miguelrojasch/charges/src/test/org/openscience/cdk/charges/InductivePartialChargesTest.java Modified: branches/miguelrojasch/charges/src/main/org/openscience/cdk/charges/GasteigerPEPEPartialCharges.java =================================================================== --- branches/miguelrojasch/charges/src/main/org/openscience/cdk/charges/GasteigerPEPEPartialCharges.java 2008-03-06 15:42:28 UTC (rev 10340) +++ branches/miguelrojasch/charges/src/main/org/openscience/cdk/charges/GasteigerPEPEPartialCharges.java 2008-03-06 16:03:34 UTC (rev 10341) @@ -28,6 +28,7 @@ import java.util.List; import org.openscience.cdk.CDKConstants; +import org.openscience.cdk.annotations.TestMethod; import org.openscience.cdk.aromaticity.CDKHueckelAromaticityDetector; import org.openscience.cdk.config.AtomTypeFactory; import org.openscience.cdk.exception.CDKException; @@ -65,7 +66,8 @@ * @cdk.keyword PEPE * @see GasteigerMarsiliPartialCharges */ -public class GasteigerPEPEPartialCharges { +public class GasteigerPEPEPartialCharges implements IPartialChargeCalculator { + /** max iterations */ private double MX_ITERATIONS = 8; /** max number of resonance structures to be searched*/ @@ -96,9 +98,11 @@ * *@param iters The new maxGasteigerIters value */ - public void setMaxGasteigerIters(double iters) { - MX_ITERATIONS = iters; + public GasteigerPEPEPartialCharges(double iters, int numbReson) { + MX_ITERATIONS = iters; + MX_RESON = numbReson; } + /** * Sets the maximum resonance structures to be searched * @@ -117,7 +121,7 @@ *@return AtomContainer with partial charges *@exception Exception Possible Exceptions */ - public IAtomContainer assignGasteigerPiPartialCharges(IAtomContainer ac, boolean setCharge) throws Exception { + public double[] calculatePartialCharges(IAtomContainer ac) throws Exception { // logger.debug("smiles1: "+(new SmilesGenerator()).createSMILES((IMolecule) ac)); IAtomContainerSet setHI = null; @@ -146,8 +150,10 @@ // logger.debug("isetTT: "+iSet.getAtomContainerCount()); } if(iSet.getAtomContainerCount() < 2) - return ac; + return new double[ac.getAtomCount()]; + double[] finalCharges = new double[ac.getAtomCount()]; + /*2: search whose atoms which don't keep their formal charge and set flags*/ double[][] sumCharges = new double[iSet.getAtomContainerCount()][ac.getAtomCount( )]; for(int i = 1; i < iSet.getAtomContainerCount() ; i++){ @@ -279,13 +285,14 @@ double chargeT = 0.0; chargeT = charge + gasteigerFactors[k][STEP_SIZE * i + i + 5]; // logger.debug("i<|"+chargeT+"=c:" +charge + "+g: "+gasteigerFactors[k][STEP_SIZE * i + i + 5]); - ac.getAtom(i).setCharge(chargeT); +// ac.getAtom(i).setCharge(chargeT); + finalCharges[i] = chargeT; } } }// iterations - return ac; + return finalCharges; } /** @@ -467,6 +474,7 @@ * *@return STEP_SIZE */ + @TestMethod("testGetStepSize") public int getStepSize(){ return STEP_SIZE; } Modified: branches/miguelrojasch/charges/src/main/org/openscience/cdk/charges/InductivePartialCharges.java =================================================================== --- branches/miguelrojasch/charges/src/main/org/openscience/cdk/charges/InductivePartialCharges.java 2008-03-06 15:42:28 UTC (rev 10340) +++ branches/miguelrojasch/charges/src/main/org/openscience/cdk/charges/InductivePartialCharges.java 2008-03-06 16:03:34 UTC (rev 10341) @@ -24,18 +24,24 @@ */ package org.openscience.cdk.charges; +import java.io.IOException; +import java.util.Iterator; + +import javax.vecmath.Point3d; + import org.openscience.cdk.annotations.TestClass; import org.openscience.cdk.annotations.TestMethod; import org.openscience.cdk.config.AtomTypeFactory; import org.openscience.cdk.config.IsotopeFactory; import org.openscience.cdk.exception.CDKException; -import org.openscience.cdk.interfaces.*; +import org.openscience.cdk.interfaces.IAtom; +import org.openscience.cdk.interfaces.IAtomContainer; +import org.openscience.cdk.interfaces.IAtomType; +import org.openscience.cdk.interfaces.IBond; +import org.openscience.cdk.interfaces.IElement; import org.openscience.cdk.tools.LoggingTool; import org.openscience.cdk.tools.manipulator.AtomContainerManipulator; -import javax.vecmath.Point3d; -import java.io.IOException; - /** * The calculation of the inductive partial atomic charges and equalization of * effective electronegativities is based on {@cdk.cite CHE03}. @@ -49,7 +55,7 @@ * @cdk.keyword electronegativity */ @TestClass("org.openscience.cdk.charges.InductivePartialChargesTest") -public class InductivePartialCharges { +public class InductivePartialCharges implements IPartialChargeCalculator { private static double[] pauling; private IsotopeFactory ifac = null; @@ -85,14 +91,17 @@ *@exception Exception Description of the Exception */ @TestMethod("testInductivePartialCharges") - public IAtomContainer assignInductivePartialCharges(IAtomContainer ac) throws Exception { + public double[] calculatePartialCharges(IAtomContainer ac) throws Exception { if (factory == null) { factory = AtomTypeFactory.getInstance("org/openscience/cdk/config/data/jmol_atomtypes.txt", ac.getBuilder()); } + if (ifac == null) { + ifac = IsotopeFactory.getInstance(ac.getBuilder()); + } int stepsLimit = 9; - org.openscience.cdk.interfaces.IAtom[] atoms = AtomContainerManipulator.getAtomArray(ac); + IAtom[] atoms = AtomContainerManipulator.getAtomArray(ac); double[] pChInch = new double[atoms.length * (stepsLimit + 1)]; double[] ElEn = new double[atoms.length * (stepsLimit + 1)]; double[] pCh = new double[atoms.length * (stepsLimit + 1)]; @@ -117,7 +126,13 @@ //logger.debug("DONE step " + s + ", atom " + atoms[a].getSymbol() + ", ch " + tmp1 + ", ee " + tmp2); } } - return ac; + double[] finalCharges = new double[atoms.length]; + double[] effectiveEnegs = new double[atoms.length]; + for (int a = 0; a < atoms.length; a++) { + finalCharges[a] = pCh[a + (9 * atoms.length)]; // 9, because that's the last s in above + effectiveEnegs[a] = ElEn[a + (9 * atoms.length)]; + } + return finalCharges; } @@ -131,64 +146,59 @@ *@exception Exception Description of the Exception */ @TestMethod("testGetPaulingElectronegativities") - public double[] getPaulingElectronegativities(IAtomContainer ac, boolean modified) throws CDKException { + public double[] getPaulingElectronegativities(IAtomContainer ac, boolean modified) throws Exception { + if (ifac == null) { + ifac = IsotopeFactory.getInstance(ac.getBuilder()); + } double[] paulingElectronegativities = new double[ac.getAtomCount()]; IElement element = null; String symbol = null; int atomicNumber = 0; - try { - ifac = IsotopeFactory.getInstance(ac.getBuilder()); - for (int i = 0; i < ac.getAtomCount(); i++) { - IAtom atom = ac.getAtom(i); - symbol = ac.getAtom(i).getSymbol(); - element = ifac.getElement(symbol); - atomicNumber = element.getAtomicNumber(); - if (modified) { - if (symbol.equals("Cl")) { - paulingElectronegativities[i] = 3.28; - } else if (symbol.equals("Br")) { - paulingElectronegativities[i] = 3.13; - } else if (symbol.equals("I")) { - paulingElectronegativities[i] = 2.93; - } else if (symbol.equals("H")) { - paulingElectronegativities[i] = 2.10; - } else if (symbol.equals("C")) { - if (ac.getMaximumBondOrder(atom) == IBond.Order.SINGLE) { - // Csp3 - paulingElectronegativities[i] = 2.20; - } else if (ac.getMaximumBondOrder(atom) == IBond.Order.DOUBLE) { - paulingElectronegativities[i] = 2.31; - } else { - paulingElectronegativities[i] = 3.15; - } - } else if (symbol.equals("O")) { - if (ac.getMaximumBondOrder(atom) == IBond.Order.SINGLE) { - // Osp3 - paulingElectronegativities[i] = 3.20; - } else if (ac.getMaximumBondOrder(atom) != IBond.Order.SINGLE) { - paulingElectronegativities[i] = 4.34; - } - } else if (symbol.equals("Si")) { - paulingElectronegativities[i] = 1.99; - } else if (symbol.equals("S")) { - paulingElectronegativities[i] = 2.74; - } else if (symbol.equals("N")) { - paulingElectronegativities[i] = 2.59; - } else { - paulingElectronegativities[i] = pauling[atomicNumber]; - } + for (int i = 0; i < ac.getAtomCount(); i++) { + IAtom atom = ac.getAtom(i); + symbol = ac.getAtom(i).getSymbol(); + element = ifac.getElement(symbol); + atomicNumber = element.getAtomicNumber(); + if (modified) { + if (symbol.equals("Cl")) { + paulingElectronegativities[i] = 3.28; + } else if (symbol.equals("Br")) { + paulingElectronegativities[i] = 3.13; + } else if (symbol.equals("I")) { + paulingElectronegativities[i] = 2.93; + } else if (symbol.equals("H")) { + paulingElectronegativities[i] = 2.10; + } else if (symbol.equals("C")) { + if (ac.getMaximumBondOrder(atom) == IBond.Order.SINGLE) { + // Csp3 + paulingElectronegativities[i] = 2.20; + } else if (ac.getMaximumBondOrder(atom) == IBond.Order.DOUBLE) { + paulingElectronegativities[i] = 2.31; } else { - paulingElectronegativities[i] = pauling[atomicNumber]; + paulingElectronegativities[i] = 3.15; } + } else if (symbol.equals("O")) { + if (ac.getMaximumBondOrder(atom) == IBond.Order.SINGLE) { + // Osp3 + paulingElectronegativities[i] = 3.20; + } else if (ac.getMaximumBondOrder(atom) != IBond.Order.SINGLE) { + paulingElectronegativities[i] = 4.34; + } + } else if (symbol.equals("Si")) { + paulingElectronegativities[i] = 1.99; + } else if (symbol.equals("S")) { + paulingElectronegativities[i] = 2.74; + } else if (symbol.equals("N")) { + paulingElectronegativities[i] = 2.59; + } else { + paulingElectronegativities[i] = pauling[atomicNumber]; } - return paulingElectronegativities; - } catch (Exception ex1) { - logger.debug(ex1); - throw new CDKException("Problems with IsotopeFactory due to " + ex1.toString(), ex1); + } else { + paulingElectronegativities[i] = pauling[atomicNumber]; + } } - } - - + return paulingElectronegativities; + } /** * Gets the atomicSoftnessCore attribute of the InductivePartialCharges object @@ -199,11 +209,16 @@ *@exception CDKException Description of the Exception */ // this method returns the result of the core of the equation of atomic softness - // that can be used for qsar descriptors and during the iterative calculation + // that can be used for QSAR descriptors and during the iterative calculation // of effective electronegativity @TestMethod("testGetAtomicSoftness") public double getAtomicSoftnessCore(IAtomContainer ac, int atomPosition) throws CDKException { - org.openscience.cdk.interfaces.IAtom target = null; + if (factory == null) { + factory = AtomTypeFactory.getInstance("org/openscience/cdk/config/data/jmol_atomtypes.txt", + ac.getBuilder()); + } + + IAtom target = null; double core = 0; double radiusTarget = 0; target = ac.getAtom(atomPosition); @@ -225,7 +240,7 @@ throw new CDKException("Problems with AtomTypeFactory due to " + ex1.toString()); } - java.util.Iterator atoms = ac.atoms(); + Iterator<IAtom> atoms = ac.atoms(); while (atoms.hasNext()) { IAtom atom = (IAtom)atoms.next(); if (!target.equals(atom)) { @@ -375,7 +390,7 @@ *@param atom2 second atom *@return squared distance between the 2 atoms */ - private double calculateSquaredDistanceBetweenTwoAtoms(org.openscience.cdk.interfaces.IAtom atom1, org.openscience.cdk.interfaces.IAtom atom2) { + private double calculateSquaredDistanceBetweenTwoAtoms(IAtom atom1, IAtom atom2) { double distance = 0; double tmp = 0; Point3d firstPoint = atom1.getPoint3d(); Modified: branches/miguelrojasch/charges/src/main/org/openscience/cdk/qsar/descriptors/atomic/PartialPiChargeDescriptor.java =================================================================== --- branches/miguelrojasch/charges/src/main/org/openscience/cdk/qsar/descriptors/atomic/PartialPiChargeDescriptor.java 2008-03-06 15:42:28 UTC (rev 10340) +++ branches/miguelrojasch/charges/src/main/org/openscience/cdk/qsar/descriptors/atomic/PartialPiChargeDescriptor.java 2008-03-06 16:03:34 UTC (rev 10341) @@ -128,9 +128,9 @@ throw new CDKException("The parameter must be of type Integer"); maxResonStruc = (Integer) params[2]; } + pepe = new GasteigerPEPEPartialCharges(maxIterations, maxResonStruc); } - /** * Gets the parameters attribute of the PartialPiChargeDescriptor object * @@ -164,14 +164,10 @@ lpcheck.saturate(ac); } if (!isCachedAtomContainer(ac)) { - if(maxIterations != -1) - pepe.setMaxGasteigerIters(maxIterations); - if(maxResonStruc != -1) - pepe.setMaxResoStruc(maxResonStruc); try { for (int i=0; i<ac.getAtomCount(); i++) ac.getAtom(i).setCharge(0.0); - pepe.assignGasteigerPiPartialCharges(ac, true); + pepe.calculatePartialCharges(ac); for (int i=0; i<ac.getAtomCount(); i++) { // assume same order, so mol.getAtom(i) == ac.getAtom(i) cacheDescriptorValue(ac.getAtom(i), ac, new DoubleResult(ac.getAtom(i).getCharge())); @@ -181,7 +177,13 @@ } } return getCachedDescriptorValue(atom) != null - ? new DescriptorValue(getSpecification(), getParameterNames(), getParameters(), getCachedDescriptorValue(atom)) + ? new DescriptorValue( + getSpecification(), + getParameterNames(), + getParameters(), + getCachedDescriptorValue(atom), + new String[] {"piCharge"} + ) : null; } Modified: branches/miguelrojasch/charges/src/test/org/openscience/cdk/charges/InductivePartialChargesTest.java =================================================================== --- branches/miguelrojasch/charges/src/test/org/openscience/cdk/charges/InductivePartialChargesTest.java 2008-03-06 15:42:28 UTC (rev 10340) +++ branches/miguelrojasch/charges/src/test/org/openscience/cdk/charges/InductivePartialChargesTest.java 2008-03-06 16:03:34 UTC (rev 10341) @@ -25,22 +25,20 @@ package org.openscience.cdk.charges; +import javax.vecmath.Point3d; + import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import org.openscience.cdk.Atom; import org.openscience.cdk.DefaultChemObjectBuilder; import org.openscience.cdk.Molecule; -import org.openscience.cdk.charges.InductivePartialCharges; +import org.openscience.cdk.NewCDKTestCase; import org.openscience.cdk.exception.CDKException; import org.openscience.cdk.interfaces.IAtom; import org.openscience.cdk.interfaces.IAtomContainer; import org.openscience.cdk.interfaces.IBond; -import org.openscience.cdk.NewCDKTestCase; -import javax.vecmath.Point3d; -import java.io.IOException; - /** * TestSuite that runs a test for the MMFF94PartialCharges. * @@ -89,7 +87,17 @@ */ @Test public void testInductivePartialCharges() throws java.lang.Exception { - double [] testResult={0.197,-0.492,0.051,0.099,0.099}; + double [] testResult={0.197,-0.492,0.051,0.099,0.099}; + Molecule mol = create3DMolecule(); + InductivePartialCharges ipc = new InductivePartialCharges(); + double[] charges = ipc.calculatePartialCharges(mol); + for (int i = 0; i < mol.getAtomCount(); i++) { + Assert.assertEquals(testResult[i], charges[i], 0.1); + //logger.debug("CHARGE AT " + ac.getAtomAt(i).getSymbol() + " " + ac.getAtomAt(i).getProperty("MMFF94charge")); + } + } + + private Molecule create3DMolecule() { Point3d c_coord=new Point3d(1.392, 0.0, 0.0); Point3d f_coord=new Point3d(0.0, 0.0, 0.0); Point3d h1_coord=new Point3d(1.7439615035767404, 1.0558845107302222, 0.0); @@ -122,19 +130,13 @@ mol.addBond(0, 2, IBond.Order.SINGLE); // 1 mol.addBond(0, 3, IBond.Order.SINGLE); // 1 mol.addBond(0, 4, IBond.Order.SINGLE); // 1 - InductivePartialCharges ipc = new InductivePartialCharges(); - ipc.assignInductivePartialCharges(mol); - for (int i = 0; i < mol.getAtomCount(); i++) { - Assert.assertEquals(testResult[i], ((Double)mol.getAtom(i).getProperty("InductivePartialCharge")).doubleValue(), 0.1); - //logger.debug("CHARGE AT " + ac.getAtomAt(i).getSymbol() + " " + ac.getAtomAt(i).getProperty("MMFF94charge")); - } + return mol; } @Test public void testGetPaulingElectronegativities() throws Exception, ClassNotFoundException { InductivePartialCharges ipc = new InductivePartialCharges(); double[] eneg = ipc.getPaulingElectronegativities(mol, true); - long[] expected = {}; Assert.assertEquals("Error in C electronegativity", 2.20, eneg[0], 0.01); Assert.assertEquals("Error in Cl electronegativity", 3.28, eneg[1], 0.01); Assert.assertEquals("Error in Br electronegativity", 3.13, eneg[2], 0.01); @@ -143,9 +145,10 @@ } @Test - public void testGetAtomicSoftness() throws IOException, ClassNotFoundException, CDKException { + public void testGetAtomicSoftness() throws Exception { InductivePartialCharges ipc = new InductivePartialCharges(); - double softness = ipc.getAtomicSoftnessCore(mol, 0); + Molecule mol = create3DMolecule(); + ipc.getAtomicSoftnessCore(mol, 0); Assert.fail("Not validated - need known values"); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |