package hep.io.mcfio;

import hep.io.xdr.*;

import java.io.*;


/**
 * The event table is written as the second block in each
 * file, and then at intervals throughout the file as the
 * previous event table becomes full. The event table allows
 * for a certain degree of random access to events.
 *
 * @author Tony Johnson (tonyj@slac.stanford.edu)
 * @version $Id: EventTable.java,v 1.3 2003/09/16 23:11:53 tonyj Exp $
 */
class EventTable extends MCFIOBlock implements MCFIOConstants
{
   private int[] evtnums;
   private int[] ptrEvents;
   private int[] runnums;
   private int[] storenums;
   private int[] trigMasks;
   private int location;
   private int nextLocator;
   private int numevts;

   EventTable() throws IOException
   {
      super(EVENTTABLE);
   }

   EventTable(int pos) throws IOException
   {
      super(EVENTTABLE);
      version = "1.00";
      location = pos;
      nextLocator = -2;
      numevts = 0;

      runnums = new int[MCF_DEFAULT_TABLE_SIZE];
      evtnums = new int[MCF_DEFAULT_TABLE_SIZE];
      storenums = new int[MCF_DEFAULT_TABLE_SIZE];
      trigMasks = new int[MCF_DEFAULT_TABLE_SIZE];
      ptrEvents = new int[MCF_DEFAULT_TABLE_SIZE];
   }

   public void read(XDRDataInput xdr) throws IOException
   {
      super.read(xdr);
      if (!version.equals("1.00"))
         throw new MCFIOException("Unsupported version " + version + " for EventTable");

      nextLocator = xdr.readInt();
      numevts = xdr.readInt();

      // Care is needed here, it appears that MCFIO writes arrays 
      // longer than numevts under some circumstances
      evtnums = xdr.readIntArray(evtnums);
      storenums = xdr.readIntArray(storenums);
      runnums = xdr.readIntArray(runnums);
      trigMasks = xdr.readIntArray(trigMasks);
      ptrEvents = xdr.readIntArray(ptrEvents);
   }

   public void write(XDRDataOutput xdr) throws IOException
   {
      super.write(xdr);
      xdr.writeInt(nextLocator);
      xdr.writeInt(numevts);
      xdr.writeIntArray(evtnums);
      xdr.writeIntArray(storenums);
      xdr.writeIntArray(runnums);
      xdr.writeIntArray(trigMasks);
      xdr.writeIntArray(ptrEvents);
   }

   protected int getLength()
   {
      return 4 * (11 + (evtnums.length * 5));
   }

   boolean isFull()
   {
      return numevts >= evtnums.length;
   }

   void setNextTable(int pos)
   {
      nextLocator = pos;
   }

   void add(MCFIOEvent event, int pos) throws IOException
   {
      runnums[numevts] = event.getRunNumber();
      evtnums[numevts] = event.getEventNumber();
      storenums[numevts] = event.getStoreNumber();
      trigMasks[numevts] = event.getTrigMask();
      ptrEvents[numevts] = pos;
      numevts++;
   }

   void commit(XDRRandomAccessFile xdr) throws IOException
   {
      long pos = xdr.getFilePointer();
      xdr.seek(location);
      write(xdr);
      xdr.seek(pos);
   }

   int evtnum(int index)
   {
      return evtnums[index];
   }

   int nextTable()
   {
      return nextLocator;
   }

   int numevts()
   {
      return numevts;
   }

   int ptrEvent(int index)
   {
      return ptrEvents[index];
   }

   int runnum(int index)
   {
      return runnums[index];
   }

   int storenum(int index)
   {
      return storenums[index];
   }

   int trigMask(int index)
   {
      return trigMasks[index];
   }
}
