package hep.io.mcfio; import java.io.IOException; import java.util.Date; import hep.io.xdr.XDRDataInput; import hep.io.xdr.XDRDataOutput; import hep.io.xdr.XDRRandomAccessFile; /** * The FileHeader is at the beginning of each MCFIO file. * This is a package private class that represents the fileheader. * * @author Tony Johnson (tonyj@slac.stanford.edu) * @version $Id: FileHeader.java 9131 2006-10-13 04:55:11Z tonyj $ */ class FileHeader extends MCFIOBlock implements MCFIOConstants { private String closingDate; private String comment; private String date; private String title; private int[] blockIds; private String[] blockNames; private int firsttable; private int location; private int numevts; private int numevts_expect; FileHeader() throws IOException { super(FILEHEADER); } FileHeader(int pos, String title, String comment, int numevts, int[] blockIds, String[] blockNames) throws IOException { super(FILEHEADER); version = "1.00"; if (blockIds.length != blockNames.length) throw new IllegalArgumentException("Inconsistent length got blockIds,blockNames"); this.location = pos; this.title = title; this.comment = comment; this.numevts_expect = numevts; this.numevts = 0; this.date = (new Date()).toString(); this.blockIds = blockIds; this.blockNames = blockNames; } public void read(XDRDataInput xdr) throws IOException { super.read(xdr); if (fVersion > 2.01) throw new MCFIOException("Unsupported version " + version + " for FileHeader"); title = xdr.readString(); comment = xdr.readString(); date = xdr.readString(); if (fVersion <= 2.) closingDate = date; else closingDate = xdr.readString(); numevts_expect = xdr.readInt(); numevts = xdr.readInt(); firsttable = xdr.readInt(); int dimTable = xdr.readInt(); // MCFIO writes the blocks to appear in the file at the top // of the file. We do not use these blocks for anything. int nBlocks = xdr.readInt(); int nTuples = (fVersion >= 2) ? xdr.readInt() : 0; if (nTuples > 0) throw new IOException("NTuples not supported"); blockIds = xdr.readIntArray(blockIds); blockNames = new String[nBlocks]; for (int i = 0; i < nBlocks; i++) blockNames[i] = xdr.readString(); } public void write(XDRDataOutput xdr) throws IOException { super.write(xdr); xdr.writeString(title); xdr.writeString(comment); xdr.writeString(date); xdr.writeInt(numevts_expect); xdr.writeInt(numevts); xdr.writeInt(firsttable); xdr.writeInt(MCF_DEFAULT_TABLE_SIZE); // dimtable xdr.writeInt(blockIds.length); // nblocks xdr.writeIntArray(blockIds); for (int i = 0; i < blockIds.length; i++) xdr.writeString(blockNames[i]); } protected int getLength() { int l = 4 * (10 + blockIds.length); l += strlen(title); l += strlen(comment); l += strlen(date); for (int i = 0; i < blockNames.length; i++) l += strlen(blockNames[i]); return l; } String getComment() { return comment; } String getDate() { return date; } void setFirstTable(int pos) { firsttable = pos; } int getFirstTable() { return firsttable; } int getNumberOfEvents() { return numevts; } int getNumberOfEventsExpected() { return numevts_expect; } String getTitle() { return title; } /** * Write the block to disk. */ void commit(XDRRandomAccessFile xdr) throws IOException { long pos = xdr.getFilePointer(); xdr.seek(location); write(xdr); xdr.seek(pos); } void incrementNumEvents(int n) { numevts += n; } private int strlen(String s) { int l = s.length(); if ((l % 4) != 0) l += (4 - (l % 4)); return l + 4; } }