Skip to content

Commit

Permalink
Added output of ITetrahedralChirality to InChI
Browse files Browse the repository at this point in the history
Change-Id: Ie69b3b3e38790f2ab99f61c11738535dcc1b8cea
Signed-off-by: John May <john.wilkinsonmay@gmail.com>
  • Loading branch information
egonw committed Sep 24, 2012
1 parent 913c796 commit 3c0d36b
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 0 deletions.
29 changes: 29 additions & 0 deletions src/main/org/openscience/cdk/inchi/InChIGenerator.java
Expand Up @@ -54,6 +54,9 @@
import org.openscience.cdk.interfaces.IAtomContainer;
import org.openscience.cdk.interfaces.IAtomParity;
import org.openscience.cdk.interfaces.IBond;
import org.openscience.cdk.interfaces.IStereoElement;
import org.openscience.cdk.interfaces.ITetrahedralChirality;
import org.openscience.cdk.interfaces.ITetrahedralChirality.Stereo;
import org.openscience.cdk.tools.manipulator.AtomContainerManipulator;

/**
Expand Down Expand Up @@ -366,6 +369,32 @@ else if (stereo == CDKConstants.UNSET) {
INCHI_STEREOTYPE.TETRAHEDRAL, p));
}
}
// Process tetrahedral stereo elements
for (IStereoElement stereoElem : atomContainer.stereoElements()) {
if (stereoElem instanceof ITetrahedralChirality) {
ITetrahedralChirality chirality = (ITetrahedralChirality)stereoElem;
IAtom[] surroundingAtoms = chirality.getLigands();
Stereo stereoType = chirality.getStereo();

JniInchiAtom atC = (JniInchiAtom) atomMap.get(chirality.getChiralAtom());
JniInchiAtom at0 = (JniInchiAtom) atomMap.get(surroundingAtoms[0]);
JniInchiAtom at1 = (JniInchiAtom) atomMap.get(surroundingAtoms[1]);
JniInchiAtom at2 = (JniInchiAtom) atomMap.get(surroundingAtoms[2]);
JniInchiAtom at3 = (JniInchiAtom) atomMap.get(surroundingAtoms[3]);
INCHI_PARITY p = INCHI_PARITY.UNKNOWN;
if (stereoType == Stereo.ANTI_CLOCKWISE) {
p = INCHI_PARITY.ODD;
} else if (stereoType == Stereo.CLOCKWISE) {
p = INCHI_PARITY.EVEN;
} else {
throw new CDKException("Unknown tetrahedral chirality");
}

JniInchiStereo0D jniStereo = new JniInchiStereo0D(atC, at0, at1, at2, at3,
INCHI_STEREOTYPE.TETRAHEDRAL, p);
input.addStereo0D(jniStereo);
}
}

try {
output = JniInchiWrapper.getInchi(input);
Expand Down
51 changes: 51 additions & 0 deletions src/test/org/openscience/cdk/inchi/InChIGeneratorTest.java
Expand Up @@ -25,7 +25,10 @@
import org.openscience.cdk.*;
import org.openscience.cdk.interfaces.IAtom;
import org.openscience.cdk.interfaces.IAtomContainer;
import org.openscience.cdk.interfaces.ITetrahedralChirality;
import org.openscience.cdk.interfaces.IBond.Order;
import org.openscience.cdk.interfaces.ITetrahedralChirality.Stereo;
import org.openscience.cdk.stereo.TetrahedralChirality;

import javax.vecmath.Point2d;
import javax.vecmath.Point3d;
Expand Down Expand Up @@ -629,4 +632,52 @@ public void testGetStandardInchiFromLandDAlanine3D() throws Exception {
genD.getInchi()
);
}

@Test
public void testTetrahedralStereo() throws Exception {
// L-Alanine
IAtomContainer acL = new AtomContainer();
IAtom[] ligandAtoms = new IAtom[4];
IAtom a1 = new Atom("C");
IAtom a1H = new Atom("H");
ligandAtoms[0] = a1H;
IAtom a2 = new Atom("C");
ligandAtoms[1] = a2;
IAtom a3 = new Atom("N");
ligandAtoms[2] = a3;
IAtom a4 = new Atom("C");
ligandAtoms[3] = a4;
IAtom a5 = new Atom("O");
IAtom a6 = new Atom("O");
a1.setImplicitHydrogenCount(0);
a3.setImplicitHydrogenCount(2);
a4.setImplicitHydrogenCount(3);
a5.setImplicitHydrogenCount(1);
acL.addAtom(a1);
acL.addAtom(a1H);
acL.addAtom(a2);
acL.addAtom(a3);
acL.addAtom(a4);
acL.addAtom(a5);
acL.addAtom(a6);

acL.addBond(new Bond(a1, a1H, CDKConstants.BONDORDER_SINGLE));
acL.addBond(new Bond(a1, a2, CDKConstants.BONDORDER_SINGLE));
acL.addBond(new Bond(a1, a3, CDKConstants.BONDORDER_SINGLE));
acL.addBond(new Bond(a1, a4, CDKConstants.BONDORDER_SINGLE));
acL.addBond(new Bond(a2, a5, CDKConstants.BONDORDER_SINGLE));
acL.addBond(new Bond(a2, a6, CDKConstants.BONDORDER_DOUBLE));

ITetrahedralChirality chirality = new TetrahedralChirality(
a1, ligandAtoms, Stereo.ANTI_CLOCKWISE
);
acL.addStereoElement(chirality);

InChIGenerator genL = getFactory().getInChIGenerator(acL);
Assert.assertEquals(INCHI_RET.OKAY, genL.getReturnStatus());
Assert.assertEquals(
"InChI=1S/C3H7NO2/c1-2(4)3(5)6/h2H,4H2,1H3,(H,5,6)/t2-/m0/s1",
genL.getInchi()
);
}
}

0 comments on commit 3c0d36b

Please sign in to comment.