package hep.io.stdhep;

import hep.io.xdr.XDRDataInput;
import hep.io.xdr.XDRDataOutput;

import java.io.IOException;


/**
 * A stdhep event. This class does not attempt to provide
 * an OO interface to the event, but simply acts as a container
 * for the packed stdhep event record.
 * @author Tony Johnson (tonyj@slac.stanford.edu)
 * @version $Id:
 */
public class StdhepEvent extends StdhepRecord
{
   private int[] idhep;
   private int[] isthep;
   private int[] jdahep;
   private int[] jmohep;
   private double[] phep;
   private double[] vhep;
   private int nevhep;
   private int nhep;

   public StdhepEvent(int nevhep, int nhep, int[] isthep, int[] idhep, int[] jmohep, int[] jdahep, double[] phep, double[] vhep)
   {
      super(MCFIO_STDHEP);
      this.version = STDHEP_VERSION;
      this.length = 4 * (12 + (24 * nhep));
      this.nevhep = nevhep;
      this.nhep = nhep;
      this.isthep = isthep;
      this.idhep = idhep;
      this.jmohep = jmohep;
      this.jdahep = jdahep;
      this.phep = phep;
      this.vhep = vhep;
   }

   StdhepEvent()
   {
      super(MCFIO_STDHEP);
   }

   public int getIDHEP(int index)
   {
      return idhep[index];
   }

   public int getISTHEP(int index)
   {
      return isthep[index];
   }

   public int getJDAHEP(int index, int i)
   {
      return jdahep[(index * 2) + i];
   }

   public int getJMOHEP(int index, int i)
   {
      return jmohep[(index * 2) + i];
   }

   /**
* The event number
*/
   public int getNEVHEP()
   {
      return nevhep;
   }

   /**
* The number of particles
*/
   public int getNHEP()
   {
      return nhep;
   }

   public double getPHEP(int index, int i)
   {
      return phep[(index * 5) + i];
   }

   public double getVHEP(int index, int i)
   {
      return vhep[(index * 4) + i];
   }

   public void read(XDRDataInput xdr) throws IOException
   {
      super.read(xdr);
      nevhep = xdr.readInt();
      nhep = xdr.readInt();
      isthep = xdr.readIntArray(isthep);
      idhep = xdr.readIntArray(idhep);
      jmohep = xdr.readIntArray(jmohep);
      jdahep = xdr.readIntArray(jdahep);
      phep = xdr.readDoubleArray(phep);
      vhep = xdr.readDoubleArray(vhep);
   }

   public String toString()
   {
      return "Event " + nevhep + " particles=" + nhep;
   }

   public void write(XDRDataOutput xdr) throws IOException
   {
      super.write(xdr);
      xdr.writeInt(nevhep);
      xdr.writeInt(nhep);
      xdr.writeIntArray(isthep, 0, nhep);
      xdr.writeIntArray(idhep, 0, nhep);
      xdr.writeIntArray(jmohep, 0, 2 * nhep);
      xdr.writeIntArray(jdahep, 0, 2 * nhep);
      xdr.writeDoubleArray(phep, 0, 5 * nhep);
      xdr.writeDoubleArray(vhep, 0, 4 * nhep);
   }
}
