/* $Revision$ $Author$ $Date$
*
* Copyright (C) 2000-2007 Christoph Steinbeck <steinbeck@users.sf.net>
*
* Contact: cdk-devel@lists.sourceforge.net
*
* 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 USA.
*/
package org.openscience.cdk;
import java.io.Serializable;
import javax.vecmath.Point2d;
import javax.vecmath.Point3d;
import org.openscience.cdk.interfaces.IAtom;
import org.openscience.cdk.interfaces.IElement;
/**
* Represents the idea of an chemical atom.
*
* <p>An Atom class is instantiated with at least the atom symbol:
* <pre>
* Atom a = new Atom("C");
* </pre>
*
* <p>Once instantiated all field not filled by passing parameters
* to the constructor are null. Atoms can be configured by using
* the IsotopeFactory.configure() method:
* <pre>
* IsotopeFactory if = IsotopeFactory.getInstance(a.getBuilder());
* if.configure(a);
* </pre>
*
* <p>More examples about using this class can be found in the
* Junit test for this class.
*
* @cdk.module data
* @cdk.githash
*
* @author steinbeck
* @cdk.created 2000-10-02
* @cdk.keyword atom
*
* @see org.openscience.cdk.config.IsotopeFactory#getInstance(org.openscience.cdk.interfaces.IChemObjectBuilder)
*/
public class Atom extends AtomType implements IAtom, Serializable, Cloneable {
/* Let's keep this exact specification
* of what kind of point2d we're talking of here,
* since there are so many around in the java standard api */
/**
* Determines if a de-serialized object is compatible with this class.
*
* This value must only be changed if and only if the new version
* of this class is incompatible with the old version. See Sun docs
* for <a href=http://java.sun.com/products/jdk/1.1/docs/guide
* /serialization/spec/version.doc.html>details</a>.
*/
private static final long serialVersionUID = -3137373012494608794L;
/**
* A 2D point specifying the location of this atom in a 2D coordinate
* space.
*/
protected javax.vecmath.Point2d point2d = (Point2d) CDKConstants.UNSET;
/**
* A 3 point specifying the location of this atom in a 3D coordinate
* space.
*/
protected javax.vecmath.Point3d point3d = (Point3d) CDKConstants.UNSET;
/**
* A 3 point specifying the location of this atom in a crystal unit cell.
*/
protected javax.vecmath.Point3d fractionalPoint3d = (Point3d) CDKConstants.UNSET;
/**
* The number of implicitly bound hydrogen atoms for this atom.
*/
protected Integer hydrogenCount = (Integer) CDKConstants.UNSET;
/**
* A stereo parity descriptor for the stereochemistry of this atom.
*/
protected Integer stereoParity = (Integer) CDKConstants.UNSET;
/**
* The partial charge of the atom.
*
* The default value is {@link CDKConstants#UNSET} and serves to provide a check whether the charge has been
* set or not
*/
protected Double charge = (Double) CDKConstants.UNSET;
/**
* Constructs an completely unset Atom.
*/
public Atom() {
super((String)null);
}
/**
* Constructs an Atom from a String containing an element symbol.
*
* @param elementSymbol The String describing the element for the Atom
*/
public Atom(String elementSymbol) {
super(elementSymbol);
}
/**
* Constructs an Atom from an Element and a Point3d.
*
* @param elementSymbol The symbol of the atom
* @param point3d The 3D coordinates of the atom
*/
public Atom(String elementSymbol, javax.vecmath.Point3d point3d)
{
this(elementSymbol);
this.point3d = point3d;
}
/**
* Constructs an Atom from an Element and a Point2d.
*
* @param elementSymbol The Element
* @param point2d The Point
*/
public Atom(String elementSymbol, javax.vecmath.Point2d point2d)
{
this(elementSymbol);
this.point2d = point2d;
}
/**
* Constructs an isotope by copying the symbol, atomic number,
* flags, identifier, exact mass, natural abundance, mass
* number, maximum bond order, bond order sum, van der Waals
* and covalent radii, formal charge, hybridization, electron
* valency, formal neighbour count and atom type name from the
* given IAtomType. It does not copy the listeners and
* properties. If the element is an instanceof
* IAtom, then the 2D, 3D and fractional coordinates, partial
* atomic charge, hydrogen count and stereo parity are copied
* too.
*
* @param element IAtomType to copy information from
*/
public Atom(IElement element) {
super(element);
if (element instanceof IAtom) {
if (((IAtom)element).getPoint2d() != null) {
this.point2d = new Point2d(((IAtom)element).getPoint2d());
} else {
this.point2d = null;
}
if (((IAtom)element).getPoint3d() != null) {
this.point3d = new Point3d(((IAtom)element).getPoint3d());
} else {
this.point3d = null;
}
if (((IAtom)element).getFractionalPoint3d() != null) {
this.fractionalPoint3d = new Point3d(((IAtom)element).getFractionalPoint3d());
} else {
this.fractionalPoint3d = null;
}
this.hydrogenCount = ((IAtom)element).getHydrogenCount();
this.charge = ((IAtom)element).getCharge();
this.stereoParity = ((IAtom)element).getStereoParity();
}
}
/**
* Sets the partial charge of this atom.
*
* @param charge The partial charge
*
* @see #getCharge
*/
public void setCharge(Double charge) {
this.charge = charge;
notifyChanged();
}
/**
* Returns the partial charge of this atom.
*
* If the charge has not been set the return value is Double.NaN
*
* @return the charge of this atom
*
* @see #setCharge
*/
public Double getCharge() {
return this.charge;
}
/**
* Sets the number of implicit hydrogen count of this atom.
*
* @param hydrogenCount The number of hydrogen atoms bonded to this atom.
*
* @see #getHydrogenCount
*/
public void setHydrogenCount(Integer hydrogenCount) {
this.hydrogenCount = hydrogenCount;
notifyChanged();
}
/**
* Returns the hydrogen count of this atom.
*
* @return The hydrogen count of this atom.
*
* @see #setHydrogenCount
*/
public Integer getHydrogenCount() {
return this.hydrogenCount;
}
/**
*
* Sets a point specifying the location of this
* atom in a 2D space.
*
* @param point2d A point in a 2D plane
*
* @see #getPoint2d
*/
public void setPoint2d(javax.vecmath.Point2d point2d) {
this.point2d = point2d;
notifyChanged();
}
/**
*
* Sets a point specifying the location of this
* atom in 3D space.
*
* @param point3d A point in a 3-dimensional space
*
* @see #getPoint3d
*/
public void setPoint3d(javax.vecmath.Point3d point3d) {
this.point3d = point3d;
notifyChanged();
}
/**
* Sets a point specifying the location of this
* atom in a Crystal unit cell.
*
* @param point3d A point in a 3d fractional unit cell space
*
* @see #getFractionalPoint3d
* @see org.openscience.cdk.Crystal
*/
public void setFractionalPoint3d(javax.vecmath.Point3d point3d) {
this.fractionalPoint3d = point3d;
notifyChanged();
}
/**
* Sets the stereo parity for this atom.
*
* @param stereoParity The stereo parity for this atom
*
* @see org.openscience.cdk.CDKConstants for predefined values.
* @see #getStereoParity
*/
public void setStereoParity(Integer stereoParity) {
this.stereoParity = stereoParity;
notifyChanged();
}
/**
* Returns a point specifying the location of this
* atom in a 2D space.
*
* @return A point in a 2D plane. Null if unset.
*
* @see #setPoint2d
*/
public javax.vecmath.Point2d getPoint2d() {
return this.point2d;
}
/**
* Returns a point specifying the location of this
* atom in a 3D space.
*
* @return A point in 3-dimensional space. Null if unset.
*
* @see #setPoint3d
*/
public javax.vecmath.Point3d getPoint3d() {
return this.point3d;
}
/**
* Returns a point specifying the location of this
* atom in a Crystal unit cell.
*
* @return A point in 3d fractional unit cell space. Null if unset.
*
* @see #setFractionalPoint3d
* @see org.openscience.cdk.CDKConstants for predefined values.
*/
public javax.vecmath.Point3d getFractionalPoint3d() {
return this.fractionalPoint3d;
}
/**
* Returns the stereo parity of this atom. It uses the predefined values
* found in CDKConstants.
*
* @return The stereo parity for this atom
*
* @see org.openscience.cdk.CDKConstants
* @see #setStereoParity
*/
public Integer getStereoParity() {
return this.stereoParity;
}
/**
* Compares a atom with this atom.
*
* @param object of type Atom
* @return true, if the atoms are equal
*/
public boolean compare(Object object)
{
if (!(object instanceof IAtom)) {
return false;
}
if (!super.compare(object)) {
return false;
}
Atom atom = (Atom) object;
if (((point2d==atom.point2d) || ((point2d!=null) && (point2d.equals(atom.point2d)))) &&
((point3d==atom.point3d) || ((point3d!=null) && (point3d.equals(atom.point3d)))) &&
(hydrogenCount==atom.hydrogenCount) &&
(stereoParity==atom.stereoParity) &&
(charge==atom.charge)) {
return true;
}
return false;
}
/**
* Returns a one line string representation of this Atom.
* Methods is conform RFC #9.
*
* @return The string representation of this Atom
*/
public String toString() {
StringBuffer stringContent = new StringBuffer(64);
stringContent.append("Atom(").append(hashCode());
if (getSymbol() != null) {
stringContent.append(", S:").append(getSymbol());
}
if (getHydrogenCount() != null) {
stringContent.append(", H:").append(getHydrogenCount());
}
if (getStereoParity() != null) {
stringContent.append(", SP:").append(getStereoParity());
}
if (getPoint2d() != null) {
stringContent.append(", 2D:[").append(getPoint2d()).append(']');
}
if (getPoint3d() != null) {
stringContent.append(", 3D:[").append(getPoint3d()).append(']');
}
if (getFractionalPoint3d() != null) {
stringContent.append(", F3D:[").append(getFractionalPoint3d());
}
if (getCharge() != null) {
stringContent.append(", C:").append(getCharge());
}
stringContent.append(", ").append(super.toString());
stringContent.append(')');
return stringContent.toString();
}
/**
* Clones this atom object and its content.
*
* @return The cloned object
*/
public Object clone() throws CloneNotSupportedException {
Object clone = super.clone();
if (point2d != null) {
((Atom)clone).setPoint2d(new Point2d(point2d.x, point2d.y));
}
if (point3d != null) {
((Atom)clone).setPoint3d(new Point3d(point3d.x, point3d.y, point3d.z));
}
if (fractionalPoint3d != null) {
((Atom)clone).setFractionalPoint3d(new Point3d(fractionalPoint3d.x, fractionalPoint3d.y, fractionalPoint3d.z));
}
return clone;
}
}