From: <eg...@us...> - 2007-10-31 16:33:29
|
Revision: 9288 http://cdk.svn.sourceforge.net/cdk/?rev=9288&view=rev Author: egonw Date: 2007-10-31 09:33:27 -0700 (Wed, 31 Oct 2007) Log Message: ----------- Added O.planar3 atom type as found in furan; added JUnit test for furan Modified Paths: -------------- trunk/cdk/src/org/openscience/cdk/atomtype/CDKAtomTypeMatcher.java trunk/cdk/src/org/openscience/cdk/config/data/cdk_atomtypes.xml trunk/cdk/src/org/openscience/cdk/test/atomtype/CDKAtomTypeMatcherTest.java Modified: trunk/cdk/src/org/openscience/cdk/atomtype/CDKAtomTypeMatcher.java =================================================================== --- trunk/cdk/src/org/openscience/cdk/atomtype/CDKAtomTypeMatcher.java 2007-10-31 16:33:08 UTC (rev 9287) +++ trunk/cdk/src/org/openscience/cdk/atomtype/CDKAtomTypeMatcher.java 2007-10-31 16:33:27 UTC (rev 9288) @@ -178,9 +178,17 @@ throws CDKException { if ("O".equals(atom.getSymbol())) { // if hybridization is given, use that - if (atom.getHybridization() != CDKConstants.UNSET) { + if (atom.getHybridization() != CDKConstants.UNSET && + (atom.getFormalCharge() == CDKConstants.UNSET || + atom.getFormalCharge() == 0)) { if (atom.getHybridization() == CDKConstants.HYBRIDIZATION_SP2) { - return factory.getAtomType("O.sp2"); + double maxBondOrder = atomContainer.getMaximumBondOrder(atom); + if (maxBondOrder == CDKConstants.BONDORDER_DOUBLE) { + return factory.getAtomType("O.sp2"); + } else if (maxBondOrder == CDKConstants.BONDORDER_SINGLE) { + return factory.getAtomType("O.planar3"); + } + } else if (atom.getHybridization() == CDKConstants.HYBRIDIZATION_SP3) { return factory.getAtomType("O.sp3"); } @@ -211,8 +219,30 @@ double maxBondOrder = atomContainer.getMaximumBondOrder(atom); if (maxBondOrder == CDKConstants.BONDORDER_DOUBLE) { return factory.getAtomType("O.sp2"); - } else { - return factory.getAtomType("O.sp3"); + } else if (maxBondOrder == CDKConstants.BONDORDER_SINGLE) { + int explicitHydrogens = countExplicitHydrogens(atom, atomContainer); + int connectedHeavyAtoms = atomContainer.getConnectedBondsCount(atom) - explicitHydrogens; + if (connectedHeavyAtoms == 2) { + // a O.sp3 which is expected to take part in an aromatic system + if (isRingAtom(atom, atomContainer)) { + boolean bothNeighborsSP2 = true; + Iterator<IAtom> atoms = atomContainer.getConnectedAtomsList(atom).iterator(); + while (atoms.hasNext() && bothNeighborsSP2) { + IAtom nextAtom = atoms.next(); + if (!nextAtom.getSymbol().equals("H")) { + if (nextAtom.getHybridization() != CDKConstants.UNSET && + nextAtom.getHybridization() != CDKConstants.HYBRIDIZATION_SP2 && + countAttachedDoubleBonds(atomContainer, nextAtom) > 0) { + bothNeighborsSP2 = false; + } + } + } + if (bothNeighborsSP2) return factory.getAtomType("O.planar3"); + } + return factory.getAtomType("O.sp3"); + } else { + return factory.getAtomType("O.sp3"); + } } } } Modified: trunk/cdk/src/org/openscience/cdk/config/data/cdk_atomtypes.xml =================================================================== --- trunk/cdk/src/org/openscience/cdk/config/data/cdk_atomtypes.xml 2007-10-31 16:33:08 UTC (rev 9287) +++ trunk/cdk/src/org/openscience/cdk/config/data/cdk_atomtypes.xml 2007-10-31 16:33:27 UTC (rev 9288) @@ -125,6 +125,15 @@ <scalar dataType="xsd:string" dictRef="cdk:hybridization">sp2</scalar> </atomType> + <atomType id="O.planar3"> + <atom elementType="O" formalCharge="0"> + <scalar dataType="xsd:integer" dictRef="cdk:formalNeighbourCount">2</scalar> + <scalar dataType="xsd:integer" dictRef="cdk:lonePairCount">2</scalar> + <scalar dataType="xsd:integer" dictRef="cdk:piBondCount">0</scalar> + </atom> + <scalar dataType="xsd:string" dictRef="cdk:hybridization">planar</scalar> + </atomType> + <atomType id="O.plus.sp2"> <atom elementType="O" formalCharge="1"> <scalar dataType="xsd:integer" dictRef="cdk:formalNeighbourCount">2</scalar> Modified: trunk/cdk/src/org/openscience/cdk/test/atomtype/CDKAtomTypeMatcherTest.java =================================================================== --- trunk/cdk/src/org/openscience/cdk/test/atomtype/CDKAtomTypeMatcherTest.java 2007-10-31 16:33:08 UTC (rev 9287) +++ trunk/cdk/src/org/openscience/cdk/test/atomtype/CDKAtomTypeMatcherTest.java 2007-10-31 16:33:27 UTC (rev 9288) @@ -853,6 +853,24 @@ ferrocene, ferrocene.getAtom(4)) ); } + + @Test public void testFuran() throws Exception { + IAtomContainer furan = new Molecule(); + furan.addAtom(new Atom("C")); + furan.addAtom(new Atom("C")); + furan.addAtom(new Atom("C")); + furan.addAtom(new Atom("C")); + furan.addAtom(new Atom("O")); + furan.addBond(0,1,CDKConstants.BONDORDER_DOUBLE); + furan.addBond(1,2,CDKConstants.BONDORDER_SINGLE); + furan.addBond(2,3,CDKConstants.BONDORDER_DOUBLE); + furan.addBond(3,4,CDKConstants.BONDORDER_SINGLE); + furan.addBond(4,0,CDKConstants.BONDORDER_SINGLE); + CDKAtomTypeMatcher atm = CDKAtomTypeMatcher.getInstance(furan.getBuilder()); + assertAtomType(testedAtomTypes, "O.planar3", atm.findMatchingAtomType( + furan, furan.getAtom(4)) + ); + } @Test public void testPerchlorate() throws Exception { IMolecule mol = new Molecule(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |