package hep.physics.vec; 

/**
 * BasicImplementation of a HepLorentzVector (4-vector)
 * @author Gary Bower (grb@slac.stanford.edu)
 */

public class BasicHepLorentzVector implements HepLorentzVector, java.io.Serializable
{
   private double t;
   private Hep3Vector v;
   private boolean vIsOwned = false;
   //
   public BasicHepLorentzVector()
   {
      this.t = 0.;
      this.v = new BasicHep3Vector();
      vIsOwned = true;
   }
   public BasicHepLorentzVector(double t, double x, double y, double z)
   {
      this.t = t;
      this.v = new BasicHep3Vector(x, y, z);
      vIsOwned = true;
   }
   public BasicHepLorentzVector(double t, double[] x)
   {
      this.t = t;
      this.v = new BasicHep3Vector(x);
      vIsOwned = true;
   }
   public BasicHepLorentzVector(double t, float[] x)
   {
      this.t = t;
      this.v = new BasicHep3Vector(x);
      vIsOwned = true;
   }
   public BasicHepLorentzVector(double t, Hep3Vector v)
   {
      this.t = t;
      this.v = v;
      vIsOwned = false;
   }
   public void setV3(double t, double x, double y, double z)
   {
      this.t = t;
      if (vIsOwned) ((BasicHep3Vector) v).setV(x, y, z);
      else
      {
         this.v = new BasicHep3Vector(x,y,z);
         vIsOwned = true;
      }
   }
   public void setV3(double t, Hep3Vector v)
   {
      this.t = t;
      this.v = v;
      vIsOwned = false;
   }
   public void setT(double t)
   {
      this.t = t;
   }
   public double t()
   {
      return t;
   }
   public Hep3Vector v3()
   {
      return v;
   }
   public double magnitude()
   {
      return Math.sqrt(VecOp.dot(this,this));
   }
   public double magnitudeSquared()
   {
      return VecOp.dot(this,this);
   }

   public boolean equals(Object obj)
   {
      if (obj instanceof HepLorentzVector)
      {
         HepLorentzVector that = (HepLorentzVector) obj;
         return v.equals(that.v3()) && that.t()==t;
      }
      else return false;
   }

   public int hashCode()
   {
      return v.hashCode() + (int) Double.doubleToRawLongBits(t);
   }

   public String toString()
   {
      return v.toString()+" t: "+t;
   }
}
