package hep.io.mcfio; import java.io.IOException; import hep.io.xdr.XDRDataInput; import hep.io.xdr.XDRDataOutput; import hep.io.xdr.XDRRandomAccessFile; /** * 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 9131 2006-10-13 04:55:11Z tonyj $ */ 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]; } }