Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Changed behaviour of has2DCoordinates to mirror has3DCoordinates
Two new methods were also introduced that allow determination of
whether the container has
all atoms with 2D/3D coordinates, some (partial) or none. These methods
replace the function of
has2DCoordinatesNew() which has been marked for deprecation.
GeometryToolsTest was also added to the standard test suite (MstandardTests)
Several unit tests for new GeometryTools functions

Change-Id: I92c84c106c3f2cec127786875c6185313521a3b5
Signed-off-by: Egon Willighagen <egonw@users.sourceforge.net>
  • Loading branch information
johnmay authored and egonw committed Jul 21, 2012
1 parent 6a7674c commit 19be6ca
Show file tree
Hide file tree
Showing 3 changed files with 294 additions and 23 deletions.
162 changes: 141 additions & 21 deletions src/main/org/openscience/cdk/geometry/GeometryTools.java
Expand Up @@ -62,7 +62,8 @@
* @author Ludovic Petain
* @author Christian Hoppe
* @author Niels Out
*
* @author John May
*
* @cdk.module standard
* @cdk.githash
*/
Expand All @@ -71,6 +72,31 @@ public class GeometryTools {
private static ILoggingTool logger =
LoggingToolFactory.createLoggingTool(GeometryTools.class);

/**
* Provides to coverage of coordinates for this molecule.
*
* @see GeometryTools#get2DCoordinateCoverage(org.openscience.cdk.interfaces.IAtomContainer)
* @see GeometryTools#get3DCoordinateCoverage(org.openscience.cdk.interfaces.IAtomContainer)
*/
public static enum CoordinateCoverage {

/**
* All atoms have coordinates.
*/
FULL,

/**
* At least one atom has coordinates but some are missing.
*/
PARTIAL,

/**
* No atoms have coordinates.
*/
NONE

};

/**
* Adds an automatically calculated offset to the coordinates of all atoms
* such that all coordinates are positive and the smallest x or y coordinate
Expand Down Expand Up @@ -943,26 +969,77 @@ public static double getLength2D(IBond bond) {


/**
* Determines if this AtomContainer contains 2D coordinates.
* See comment for center(IAtomContainer atomCon, Dimension areaDim, HashMap renderingCoordinates) for details on coordinate sets
* Determines if all this AtomContainer's atoms contain 2D coordinates. If any atom
* is null or has unset 2D coordinates this method will return false.
*
*@param container Description of the Parameter
*@return boolean indication that 2D coordinates are available
* @param container the atom container to examine
*
* @return indication that all 2D coordinates are available
*
* @see org.openscience.cdk.interfaces.IAtom#getPoint2d()
*
*/
public static boolean has2DCoordinates(IAtomContainer container) {
return has2DCoordinatesNew(container)>0;

if (container == null || container.getAtomCount() == 0)
return Boolean.FALSE;

for (IAtom atom : container.atoms()) {

if (atom == null || atom.getPoint2d() == null)
return Boolean.FALSE;

}

return Boolean.TRUE;

}

/**
* Determines the coverage of this containers 2D coordinates. If all atoms
* are non-null and have 2D coordinates this method will return 'FULL'. If
* one or more atoms does have 2D coordinates and any others atoms are null
* or are missing 2D coordinates this method will return PARTIAL. If all atoms
* are null or are all missing 2D coordinates this method will return NONE. If
* the provided container is null NONE is also returned.
*
* @param container the container to inspect
* @return FULL, PARTIAL or NONE depending on the number of 2D coordinates pressent
* @see CoordinateCoverage
* @see #has2DCoordinates(org.openscience.cdk.interfaces.IAtomContainer)
* @see #get3DCoordinateCoverage(org.openscience.cdk.interfaces.IAtomContainer)
* @see org.openscience.cdk.interfaces.IAtom#getPoint2d()
*/
public static CoordinateCoverage get2DCoordinateCoverage(IAtomContainer container) {

if (container == null || container.getAtomCount() == 0)
return CoordinateCoverage.NONE;

int count = 0;

for (IAtom atom : container.atoms()) {
count += atom != null && atom.getPoint2d() != null ? 1 : 0;
}

return count == 0 ? CoordinateCoverage.NONE :
count == container.getAtomCount() ? CoordinateCoverage.FULL
: CoordinateCoverage.PARTIAL;

}


/**
* Determines if this AtomContainer contains 2D coordinates for some or all molecules.
* See comment for center(IAtomContainer atomCon, Dimension areaDim, HashMap renderingCoordinates) for details on coordinate sets
*
*
*@param container the molecule to be considered
* @param container the molecule to be considered
* @return 0 no 2d, 1=some, 2= for each atom
* @deprecated use get2DCoordinateCoverage for determining partial coordinates
* @see #get2DCoordinateCoverage(org.openscience.cdk.interfaces.IAtomContainer)
*/
public static int has2DCoordinatesNew(IAtomContainer container) {
@Deprecated
public static int has2DCoordinatesNew(IAtomContainer container) {
if (container == null) return 0;

boolean no2d=false;
Expand Down Expand Up @@ -1013,21 +1090,64 @@ public static boolean has2DCoordinates(IBond bond) {
}


/**
* Determines if this model contains 3D coordinates
*
*@param container the molecule to consider
*@return boolean indication that 3D coordinates are available
*/
public static boolean has3DCoordinates(IAtomContainer container) {
boolean hasinfo = true;
/**
* Determines if all this AtomContainer's atoms contain 3D coordinates. If any atom
* is null or has unset 3D coordinates this method will return false. If the provided
* container is null false is returned.
*
* @param container the atom container to examine
*
* @return indication that all 3D coordinates are available
*
* @see org.openscience.cdk.interfaces.IAtom#getPoint3d()
*/
public static boolean has3DCoordinates(IAtomContainer container) {

if (container == null || container.getAtomCount() == 0)
return Boolean.FALSE;

for (IAtom atom : container.atoms()) {
if (atom.getPoint3d() == null) {
return false;
}

if (atom == null || atom.getPoint3d() == null)
return Boolean.FALSE;

}
return hasinfo;
}

return Boolean.TRUE;

}

/**
* Determines the coverage of this containers 3D coordinates. If all atoms
* are non-null and have 3D coordinates this method will return 'FULL'. If
* one or more atoms does have 3D coordinates and any others atoms are null
* or are missing 3D coordinates this method will return PARTIAL. If all atoms
* are null or are all missing 3D coordinates this method will return NONE. If
* the provided container is null NONE is also returned.
*
* @param container the container to inspect
* @return FULL, PARTIAL or NONE depending on the number of 3D coordinates pressent
* @see CoordinateCoverage
* @see #has3DCoordinates(org.openscience.cdk.interfaces.IAtomContainer)
* @see #get2DCoordinateCoverage(org.openscience.cdk.interfaces.IAtomContainer)
* @see org.openscience.cdk.interfaces.IAtom#getPoint3d()
*/
public static CoordinateCoverage get3DCoordinateCoverage(IAtomContainer container) {

if (container == null || container.getAtomCount() == 0)
return CoordinateCoverage.NONE;

int count = 0;

for(IAtom atom : container.atoms()){
count += atom != null && atom.getPoint3d() != null ? 1 : 0;
}

return count == 0 ? CoordinateCoverage.NONE :
count == container.getAtomCount() ? CoordinateCoverage.FULL
: CoordinateCoverage.PARTIAL;

}


/**
Expand Down
153 changes: 151 additions & 2 deletions src/test/org/openscience/cdk/geometry/GeometryToolsTest.java
Expand Up @@ -86,6 +86,17 @@ public class GeometryToolsTest extends CDKTestCase {
Assert.assertFalse(GeometryTools.has2DCoordinates((IAtomContainer)null));
}

@Test public void testHas2DCoordinates_Partial() {
IAtomContainer container = new AtomContainer();
Atom atom1 = new Atom("C");
Atom atom2 = new Atom("C");
atom1.setPoint2d(new Point2d(1,1));
container.addAtom(atom1);
Assert.assertTrue(GeometryTools.has2DCoordinates(container));
container.addAtom(atom2);
Assert.assertFalse(GeometryTools.has2DCoordinates(container));
}

/**
* @cdk.bug 2936440
*/
Expand All @@ -95,9 +106,74 @@ public class GeometryToolsTest extends CDKTestCase {
IAtomContainer molOne=null;
MDLV2000Reader reader = new MDLV2000Reader(ins, Mode.STRICT);
molOne = (IAtomContainer)reader.read(new AtomContainer());
Assert.assertEquals(2,GeometryTools.has2DCoordinatesNew(molOne));
Assert.assertTrue(GeometryTools.has2DCoordinates(molOne));
}


@Test public void get2DCoordinateCoverage_EmptyAtomContainer(){
IAtomContainer container = new AtomContainer();
Assert.assertEquals(GeometryTools.CoordinateCoverage.NONE, GeometryTools.get2DCoordinateCoverage(container));
Assert.assertEquals(GeometryTools.CoordinateCoverage.NONE, GeometryTools.get2DCoordinateCoverage((IAtomContainer) null));
}

@Test public void get2DCoordinateCoverage_Partial(){

IAtomContainer container = new AtomContainer();

IAtom atom1 = new Atom("C");
IAtom atom2 = new Atom("C");
IAtom atom3 = new Atom("C");

atom1.setPoint2d(new Point2d(1,1));
atom3.setPoint2d(new Point2d(1,1));

container.addAtom(atom1);
container.addAtom(atom2);
container.addAtom(atom3);

Assert.assertEquals(GeometryTools.CoordinateCoverage.PARTIAL, GeometryTools.get2DCoordinateCoverage(container));

}

@Test public void get2DCoordinateCoverage_Full(){

IAtomContainer container = new AtomContainer();

IAtom atom1 = new Atom("C");
IAtom atom2 = new Atom("C");
IAtom atom3 = new Atom("C");

atom1.setPoint2d(new Point2d(1,1));
atom2.setPoint2d(new Point2d(2,1));
atom3.setPoint2d(new Point2d(1,2));

container.addAtom(atom1);
container.addAtom(atom2);
container.addAtom(atom3);

Assert.assertEquals(GeometryTools.CoordinateCoverage.FULL, GeometryTools.get2DCoordinateCoverage(container));

}

@Test public void get2DCoordinateCoverage_None_3D(){

IAtomContainer container = new AtomContainer();

IAtom atom1 = new Atom("C");
IAtom atom2 = new Atom("C");
IAtom atom3 = new Atom("C");

atom1.setPoint3d(new Point3d(1,1,0));
atom2.setPoint3d(new Point3d(2,1,0));
atom3.setPoint3d(new Point3d(1,2,0));

container.addAtom(atom1);
container.addAtom(atom2);
container.addAtom(atom3);

Assert.assertEquals(GeometryTools.CoordinateCoverage.NONE, GeometryTools.get2DCoordinateCoverage(container));

}

@Test public void testTranslateAllPositive_IAtomContainer() {
IAtomContainer container = new AtomContainer();
IAtom atom = new Atom(Elements.CARBON);
Expand Down Expand Up @@ -376,6 +452,79 @@ public class GeometryToolsTest extends CDKTestCase {
container.addAtom(atom2);
Assert.assertTrue(GeometryTools.has3DCoordinates(container));
}

@Test public void testHas3DCoordinates_EmptyAtomContainer() {
IAtomContainer container = new AtomContainer();
Assert.assertFalse(GeometryTools.has3DCoordinates(container));
Assert.assertFalse(GeometryTools.has3DCoordinates((IAtomContainer) null));
}

@Test public void get3DCoordinateCoverage_EmptyAtomContainer(){
IAtomContainer container = new AtomContainer();
Assert.assertEquals(GeometryTools.CoordinateCoverage.NONE, GeometryTools.get3DCoordinateCoverage(container));
Assert.assertEquals(GeometryTools.CoordinateCoverage.NONE, GeometryTools.get3DCoordinateCoverage((IAtomContainer) null));
}

@Test public void get3DCoordinateCoverage_Partial(){

IAtomContainer container = new AtomContainer();

IAtom atom1 = new Atom("C");
IAtom atom2 = new Atom("C");
IAtom atom3 = new Atom("C");

atom1.setPoint3d(new Point3d(1,1,0));
atom3.setPoint3d(new Point3d(1,1,0));

container.addAtom(atom1);
container.addAtom(atom2);
container.addAtom(atom3);

Assert.assertEquals(GeometryTools.CoordinateCoverage.PARTIAL, GeometryTools.get3DCoordinateCoverage(container));

}

@Test public void get3DCoordinateCoverage_Full(){

IAtomContainer container = new AtomContainer();

IAtom atom1 = new Atom("C");
IAtom atom2 = new Atom("C");
IAtom atom3 = new Atom("C");

atom1.setPoint3d(new Point3d(1,1,0));
atom2.setPoint3d(new Point3d(2,1,0));
atom3.setPoint3d(new Point3d(1,2,0));

container.addAtom(atom1);
container.addAtom(atom2);
container.addAtom(atom3);

Assert.assertEquals(GeometryTools.CoordinateCoverage.FULL, GeometryTools.get3DCoordinateCoverage(container));

}

@Test public void get3DCoordinateCoverage_None_2D(){

IAtomContainer container = new AtomContainer();

IAtom atom1 = new Atom("C");
IAtom atom2 = new Atom("C");
IAtom atom3 = new Atom("C");

atom1.setPoint2d(new Point2d(1,1));
atom2.setPoint2d(new Point2d(2,1));
atom3.setPoint2d(new Point2d(1,2));

container.addAtom(atom1);
container.addAtom(atom2);
container.addAtom(atom3);

Assert.assertEquals(GeometryTools.CoordinateCoverage.NONE, GeometryTools.get2DCoordinateCoverage(container));

}



@Test public void testTranslateAllPositive_IAtomContainer_HashMap(){
Atom atom1=new Atom("C");
Expand Down
2 changes: 2 additions & 0 deletions src/test/org/openscience/cdk/modulesuites/MstandardTests.java
Expand Up @@ -36,6 +36,7 @@
import org.openscience.cdk.fingerprint.HybridizationFingerprinterTest;
import org.openscience.cdk.geometry.BondToolsTest;
import org.openscience.cdk.geometry.CrystalGeometryToolsTest;
import org.openscience.cdk.geometry.GeometryToolsTest;
import org.openscience.cdk.geometry.volume.VABCVolumeTest;
import org.openscience.cdk.graph.AtomContainerAtomPermutorTest;
import org.openscience.cdk.graph.AtomContainerBondPermutorTest;
Expand Down Expand Up @@ -116,6 +117,7 @@
AromaticityCalculatorTest.class,
DictRefTest.class,
CrystalGeometryToolsTest.class,
GeometryToolsTest.class,
MinimalPathIteratorTest.class,
ConnectivityCheckerTest.class,
UniversalIsomorphismTesterTest.class,
Expand Down

0 comments on commit 19be6ca

Please sign in to comment.