/*
 *                    BioJava development code
 *
 * This code may be freely distributed and modified under the
 * terms of the GNU Lesser General Public Licence.  This should
 * be distributed with the code.  If you do not have a copy,
 * see:
 *
 *      http://www.gnu.org/copyleft/lesser.html
 *
 * Copyright for this code is held jointly by the individual
 * authors.  These should be listed in @author doc comments.
 *
 * For more information on the BioJava project and its aims,
 * or to join the biojava-l mailing list, visit the home page
 * at:
 *
 *      http://www.biojava.org/
 *
 * Created on 28.04.2004
 * @author Andreas Prlic
 *
 */
package org.biojava.bio.structure;


/**
 * Implementation of an Atom of a PDB file.
 * currently the coordinates of an atom are represented by a double[3] array.
 * @author Andreas Prlic
 * @since 1.4
 * @version %I% %G%
 */
public class AtomImpl implements Atom {
    
    String name     ;
    String fullName ;
    double[] coords ;
    String pdbline  ;
    int pdbserial   ;
    
    double occupancy ;
    double tempfactor;
    
    Character altLoc ;
    Group parent;
    long id;
    
    public AtomImpl () {
        name     = null        ;
        fullName = null        ;
        coords   = new double[3];
        pdbline  = ""          ;  
        occupancy  = 0.0       ;
        tempfactor = 0.0       ;
        altLoc = new Character(' ');
        parent = null;
    }
    /** Get the Hibernate database ID.
     * 
     * @return the id
     * @see #setId(long)
     */
	public long getId() {
		return id;
	}

	/** Set the Hibernate database ID.
     * 
     * @param id the hibernate id
     * @see #getId()
     */
	public void setId(long id) {
		this.id = id;
	}
    
    /** trimmed version of atom name, e.g. "CA" 
     * @see #getName
     */
    public void   setName(String s) { name = s ;}
    
    /**
     * Gets this object's name.
     * @return a String representing the name value
     * @see #setName
     */
    public String getName()         { return name ;}
    
    /** set full name of atom e.g. " CA " .
     * @see #getFullName
     */
    public void   setFullName( String s ) { fullName =s ; }
    
    /** get full name of atom e.g. " CA ". 
     * @return a String representing the full name value
     * @see #setFullName
     */
    public String getFullName()           { return fullName; }
    
    /** set PDB atom number. 
     * @see #getPDBserial
     */
    public void setPDBserial(int i) { pdbserial = i    ; }
    
    /** get PDB atom number.
     * @see #setPDBserial
     */
    public int  getPDBserial()      { return pdbserial ; }
    
    /** the coordinates.
     * @see #getCoords 
     */    
    public void     setCoords( double[] c ) { coords = c   ; } 
    
    /** get the coordinates as a double[3] array .
     * @return an array of doubles representing the coords value
     * @see #setCoords     
     */
    public double[] getCoords()            { return coords ; }
    
    public void setX(double x) {
        coords[0] = x ;
    }
    public void setY(double y) {
        coords[1] = y ;
    }
    public void setZ(double z) {
        coords[2] = z ;
    }
    
    /** Get the X coordinate. 
     * @see #setX(double)
     * */
    public double getX() { return coords[0]; }
    
    /** Get the Y coordinate. 
     * @see #setY(double)
     * */
    public double getY() { return coords[1]; }
    
    /** Get the Z coordinate. 
     * @see #setZ(double)
     * 
     * */
    public double getZ() { return coords[2]; }
    
    /** set alternate Location. 
     * @see #getAltLoc
     */
    public void setAltLoc(Character c) {
        altLoc = c ;
    }
    /** get alternate Location.
     * @return a Character object representing the alt loc value
     * @see #setAltLoc
     */
    public Character getAltLoc() {
        return altLoc ;
    }
    
    
    /** store the whole line. 
     * @see #getPDBline
     */
    public void   setPDBline(String s) { pdbline = s;}
    
    /** get the whole line .
     * @return a String representing the PDBline value
     * @see #setPDBline
     */
    public String getPDBline() { return pdbline ;}
    
    /** string representation. */
    public String toString() {
        String str = name +" "+ pdbserial + " " + coords[0] + " " + coords[1] + " " + coords[2];
        return str ;
    }
    
    public void   setOccupancy(double occu){ occupancy = occu ;} ;
    public double getOccupancy(){ return occupancy; } ;
    
    public void   setTempFactor(double temp){ tempfactor = temp ;} ;
    public double getTempFactor(){ return tempfactor; } ;
    
    /** returns and identical copy of this  object .
     * @return  and identical copy of this  object 
     */
    public Object clone() {
        AtomImpl n = new AtomImpl();
        n.setOccupancy(getOccupancy());
        n.setTempFactor(getTempFactor());
        n.setAltLoc(getAltLoc());
        double[] coords = getCoords();     
        n.setX(coords[0]);
        n.setY(coords[1]);
        n.setZ(coords[2]);
        n.setPDBserial(getPDBserial());
        n.setFullName(getFullName());
        n.setName(getName());
        return n ;
    }
    
    public void setParent(Group parent) {
        
        this.parent = parent;
    }
  
    public Group getParent() {
        return parent;
       
    }   
    
    
}
