org.openscience.cdk.hash.stereo.DoubleBond2DParity Maven / Gradle / Ivy
/*
* Copyright (c) 2013 John May
*
* Contact: [email protected]
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
* All we ask is that proper credit is given for our work, which includes
* - but is not limited to - adding the above copyright notice to the beginning
* of your source code files, and to any copyright notice that you may distribute
* with programs based on this work.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 U
*/
package org.openscience.cdk.hash.stereo;
import javax.vecmath.Point2d;
/**
* Calculate the geometric configuration of a double bond. The configuration is
* provided as a parity (+1,0,-1) where +1 indicates the substituents are on
* opposite sides (E or trans) and -1 indicates they are together
* on the same side (Z or cis). If one of the substituents is parallel to the
* double bond then the configuration is unspecified and 0 is returned.
*
* @author John May
* @cdk.module hash
* @cdk.githash
*/
final class DoubleBond2DParity extends GeometricParity {
// coordinates of the double bond atoms
// l1 r1
// \ /
// l = r
// / \
// l2 r2
private Point2d l, r, l1, r1, l2, r2;
/* the area below which we return unspecified parity */
private static final double THRESHOLD = 0.1;
/**
* Create a new double bond parity for the 2D coordinates of the atoms.
*
* @param left one atom of the double bond
* @param right the other atom of a double bond
* @param leftSubstituent the substituent atom connected to the left atom
* @param rightSubstituent the substituent atom connected to the right atom
*/
public DoubleBond2DParity(Point2d left, Point2d right, Point2d leftSubstituent, Point2d rightSubstituent) {
this.l = left;
this.r = right;
this.l1 = leftSubstituent;
this.r1 = rightSubstituent;
this.l2 = l;
this.r2 = r;
}
/**
* Create a new double bond parity for the 2D coordinates of the atoms. This
* method is required for cases where both substituents may lie on the same
* side of a bond. If one of the sides has two substituents and the other
* side has two then you can pass left/right atom of the double bond as
* the second substituent.
*
*
* l1 r1
* \ /
* l = r
* /
* l2
*
* should be passed as:
* new DoubleBond2DParity(l, r, l1, l2, r1, r);
*
*
* @param left one atom of the double bond
* @param right the other atom of a double bond
* @param leftSubstituent1 first substituent atom connected to the left atom
* @param leftSubstituent2 second substituent atom connected to the left atom
* @param rightSubstituent1 first substituent atom connected to the right atom
* @param rightSubstituent2 second substituent atom connected to the right atom
*/
public DoubleBond2DParity(Point2d left, Point2d right, Point2d leftSubstituent1, Point2d leftSubstituent2,
Point2d rightSubstituent1, Point2d rightSubstituent2) {
this.l = left;
this.r = right;
this.l1 = leftSubstituent1;
this.r1 = rightSubstituent1;
this.l2 = leftSubstituent2;
this.r2 = rightSubstituent2;
}
/**
* Calculate the configuration of the double bond as a parity.
*
* @return opposite (+1), together (-1) or unspecified (0)
*/
@Override
public int parity() {
return parity(l1, l2, r) * parity(r1, r2, l);
}
/**
* Determine the rotation parity of one side of the double bond. This parity
* is the sign of the area of a triangle.
*
*
* a
* \
* b = c
*
*
* @param a coordinates of the substituent atom
* @param b coordinates of the atom next to the substituent
* @param c coordinates of the atom double bonds to b
* @return clockwise (+1), anti-clockwise (-1) or unspecified (0)
*/
private static int parity(Point2d a, Point2d b, Point2d c) {
double det = (a.x - c.x) * (b.y - c.y) - (a.y - c.y) * (b.x - c.x);
return Math.abs(det) < THRESHOLD ? 0 : (int) Math.signum(det);
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy