From a952eada136830d4c5da0d895bc7425aaba883bd Mon Sep 17 00:00:00 2001 From: John May Date: Tue, 15 Jul 2014 18:20:25 +0100 Subject: [PATCH] Special handling of atom type 'X', leave hydrogens alone unless the value is null and we then set it to 0. Note this conditional was only added recently to ensure pseudo atoms don't have an unset hydrogen count. Signed-off-by: Egon Willighagen --- .../cdk/tools/CDKHydrogenAdderTest.java | 29 +++++++++++++++++++ .../cdk/tools/CDKHydrogenAdder.java | 3 +- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/base/test-valencycheck/src/test/java/org/openscience/cdk/tools/CDKHydrogenAdderTest.java b/base/test-valencycheck/src/test/java/org/openscience/cdk/tools/CDKHydrogenAdderTest.java index 9fde90c67e8..f1a4f199a30 100644 --- a/base/test-valencycheck/src/test/java/org/openscience/cdk/tools/CDKHydrogenAdderTest.java +++ b/base/test-valencycheck/src/test/java/org/openscience/cdk/tools/CDKHydrogenAdderTest.java @@ -36,11 +36,13 @@ import org.openscience.cdk.PseudoAtom; import org.openscience.cdk.atomtype.CDKAtomTypeMatcher; import org.openscience.cdk.config.Elements; +import org.openscience.cdk.exception.CDKException; 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.IChemFile; +import org.openscience.cdk.interfaces.IChemObjectBuilder; import org.openscience.cdk.interfaces.IElement; import org.openscience.cdk.interfaces.IMolecularFormula; import org.openscience.cdk.io.MDLV2000Reader; @@ -51,6 +53,9 @@ import org.openscience.cdk.tools.manipulator.ChemFileManipulator; import org.openscience.cdk.tools.manipulator.MolecularFormulaManipulator; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; + /** * Tests CDK's hydrogen adding capabilities in terms of * example molecules. @@ -781,6 +786,30 @@ public void testPseudoAtom() throws Exception { } Assert.assertEquals(1, hCount); } + + @Test public void unknownAtomTypeLeavesHydrogenCountAlone() throws Exception { + IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance(); + CDKHydrogenAdder hydrogenAdder = CDKHydrogenAdder.getInstance(bldr); + IAtomContainer container = bldr.newInstance(IAtomContainer.class); + IAtom atom = bldr.newInstance(IAtom.class, "C"); + atom.setImplicitHydrogenCount(3); + atom.setAtomTypeName("X"); + container.addAtom(atom); + hydrogenAdder.addImplicitHydrogens(container); + assertThat(atom.getImplicitHydrogenCount(), is(3)); + } + + @Test public void unknownAtomTypeLeavesHydrogenCountAloneUnlessNull() throws Exception { + IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance(); + CDKHydrogenAdder hydrogenAdder = CDKHydrogenAdder.getInstance(bldr); + IAtomContainer container = bldr.newInstance(IAtomContainer.class); + IAtom atom = bldr.newInstance(IAtom.class, "C"); + atom.setImplicitHydrogenCount(null); + atom.setAtomTypeName("X"); + container.addAtom(atom); + hydrogenAdder.addImplicitHydrogens(container); + assertThat(atom.getImplicitHydrogenCount(), is(0)); + } private void findAndConfigureAtomTypesForAllAtoms(IAtomContainer container) throws Exception { Iterator atoms = container.atoms().iterator(); diff --git a/base/valencycheck/src/main/java/org/openscience/cdk/tools/CDKHydrogenAdder.java b/base/valencycheck/src/main/java/org/openscience/cdk/tools/CDKHydrogenAdder.java index b43b782d9ad..216e7869c8d 100644 --- a/base/valencycheck/src/main/java/org/openscience/cdk/tools/CDKHydrogenAdder.java +++ b/base/valencycheck/src/main/java/org/openscience/cdk/tools/CDKHydrogenAdder.java @@ -125,7 +125,8 @@ public void addImplicitHydrogens(IAtomContainer container, IAtom atom) throws CD throw new CDKException("IAtom is not typed! " + atom.getSymbol()); if ("X".equals(atom.getAtomTypeName())) { - atom.setImplicitHydrogenCount(0); + if (atom.getImplicitHydrogenCount() == null) + atom.setImplicitHydrogenCount(0); return; }