Print

Print


Commit in lcio on random_access_io_branch
src/java/hep/lcio/implementation/sio/RandomAccessBlock.java+160added 1.1.2.1
                                    /IndexBlock.java+174added 1.1.2.1
                                    /RunEvent.java+33added 1.1.2.1
                                    /SIOLCWriter.java+49-121.14 -> 1.14.10.1
                                    /SIOEvent.java+4-31.44 -> 1.44.10.1
                                    /SIOLCReader.java+61-41.16 -> 1.16.10.1
tools/freehep-xdr-2.0.4-SNAPSHOT.jar[binary]added 1.1.2.1
     /freehep-mcfio-2.0.2-SNAPSHOT.jar[binary]added 1.1.2.1
     /freehep-sio-2.1-SNAPSHOT.jar[binary]added 1.1.2.1
     /freehep-stdhep-2.0.3-SNAPSHOT.jar[binary]added 1.1.2.1
config/lcio.properties+3-31.69 -> 1.69.4.1
doc/lcio.xml+56-21.65 -> 1.65.2.1
bin/runSimJob.sh+1-11.3 -> 1.3.10.1
   /runAnalysisJob.sh+1-11.4 -> 1.4.10.1
   /runSIODump.sh+1-11.3 -> 1.3.10.1
+543-27
7 added + 8 modified, total 15 files
Interim checking for adding random access support

lcio/src/java/hep/lcio/implementation/sio
RandomAccessBlock.java added at 1.1.2.1
diff -N RandomAccessBlock.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ RandomAccessBlock.java	20 Oct 2009 23:18:21 -0000	1.1.2.1
@@ -0,0 +1,160 @@
+package hep.lcio.implementation.sio;
+
+import hep.io.sio.SIOBlock;
+import hep.io.sio.SIOInputStream;
+import hep.io.sio.SIOOutputStream;
+import hep.io.sio.SIORecord;
+import hep.io.sio.SIOWriter;
+import java.io.IOException;
+
+/**
+ * A rewritable block written into a RandomAccessRecord in LCIO files
+ * @author tonyj
+ */
+class RandomAccessBlock implements Comparable<RunEvent> {
+
+    private static final String LCIORANDOMACCESS = "LCIORandomAccess";
+    private static final int minorVersion = 0;
+    private static final int majorVersion = 1;
+    private static final RunEvent NOTSET = new RunEvent(0, 0);
+    private RunEvent minRunEvent = NOTSET;
+    private RunEvent maxRunEvent = NOTSET;
+    private int nRunHeaders;
+    private int nEvents;
+    private boolean recordsAreOrdered = true;
+    private long indexLocation;
+    private long previousAccessBlockLocation;
+    private long nextAccessBlockLocation;
+    private long myLocation;
+    private SIOWriter writer;
+
+    RandomAccessBlock() {
+    }
+
+    RandomAccessBlock(SIORecord record) throws IOException {
+        read(record);
+    }
+
+    void write(SIOWriter writer) throws IOException {
+        this.writer = writer;
+        myLocation = writer.createRecord(LCIORANDOMACCESS, false);
+        writeBlock(writer);
+    }
+
+    void flush() throws IOException {
+        writer.rewriteRecord(myLocation, false);
+        writeBlock(writer);
+    }
+
+    private void writeBlock(SIOWriter writer) throws IOException {
+        SIOOutputStream sio = writer.createBlock(LCIORANDOMACCESS, majorVersion, minorVersion);
+        sio.writeInt(minRunEvent.getRun());
+        sio.writeInt(minRunEvent.getEvent());
+        sio.writeInt(maxRunEvent.getRun());
+        sio.writeInt(maxRunEvent.getEvent());
+        sio.writeInt(nRunHeaders);
+        sio.writeInt(nEvents);
+        sio.writeInt(recordsAreOrdered ? 1 : 0);
+        sio.writeLong(indexLocation);
+        sio.writeLong(previousAccessBlockLocation);
+        sio.writeLong(nextAccessBlockLocation);
+        sio.close();
+    }
+
+    private void read(SIORecord record) throws IOException {
+        SIOBlock block = record.getBlock();
+        if (!block.getBlockName().equals(LCIORANDOMACCESS) ||
+                block.getMajorVersion() != majorVersion ||
+                block.getMinorVersion() != minorVersion) {
+            throw new IOException("Unexpected LCIORandomAccess block");
+        }
+        SIOInputStream sio = block.getData();
+        minRunEvent = new RunEvent(sio.readInt(), sio.readInt());
+        maxRunEvent = new RunEvent(sio.readInt(), sio.readInt());
+        nRunHeaders = sio.readInt();
+        nEvents = sio.readInt();
+        recordsAreOrdered = sio.readBoolean();
+        sio.pad();
+        indexLocation = sio.readLong();
+        previousAccessBlockLocation = sio.readLong();
+        nextAccessBlockLocation = sio.readLong();
+        sio.close();
+    }
+
+    long getIndexLocation() {
+        return indexLocation;
+    }
+
+    void setIndexBlock(IndexBlock indexBlock) {
+        minRunEvent = indexBlock.getMinEntry();
+        maxRunEvent = indexBlock.getMaxEntry();
+        recordsAreOrdered = indexBlock.areRecordsOrdered();
+        nEvents = indexBlock.getEventCount();
+        nRunHeaders = indexBlock.getRunHeaderCount();
+        indexLocation = indexBlock.getLocation();
+    }
+
+    /**
+     * Used to add a randomAccessBlock to the top level (file) random
+     * access block.
+     * @param randomAccessBlock
+     */
+    void add(RandomAccessBlock randomAccessBlock) {
+        if (previousAccessBlockLocation == 0) {
+            previousAccessBlockLocation = randomAccessBlock.myLocation;
+        }
+        nextAccessBlockLocation = randomAccessBlock.myLocation;
+        recordsAreOrdered &= randomAccessBlock.recordsAreOrdered;
+        if (minRunEvent == NOTSET) {
+            minRunEvent = randomAccessBlock.minRunEvent;
+            maxRunEvent = randomAccessBlock.maxRunEvent;
+        } else {
+            if (maxRunEvent.compareTo(randomAccessBlock.minRunEvent) > 0) {
+                recordsAreOrdered = false;
+            }
+            if (minRunEvent.compareTo(randomAccessBlock.minRunEvent) > 0) {
+                minRunEvent = randomAccessBlock.minRunEvent;
+            }
+            if (maxRunEvent.compareTo(randomAccessBlock.maxRunEvent) < 0) {
+                maxRunEvent = randomAccessBlock.maxRunEvent;
+            }
+        }
+        nEvents += randomAccessBlock.nEvents;
+        nRunHeaders += randomAccessBlock.nRunHeaders;
+    }
+
+    void setPrevious(RandomAccessBlock previous) {
+        this.previousAccessBlockLocation = previous.myLocation;
+    }
+
+    void setNext(RandomAccessBlock next) {
+        this.nextAccessBlockLocation = next.myLocation;
+    }
+
+    long getLocation() {
+        return myLocation;
+    }
+
+    boolean contains(RunEvent re) {
+        return compareTo(re) == 0;
+    }
+
+    public int compareTo(RunEvent o) {
+        RunEvent re = (RunEvent) o;
+        if (re.compareTo(minRunEvent) > 0) {
+            return -1;
+        } else if (re.compareTo(maxRunEvent) < 0) {
+            return 1;
+        } else {
+            return 0;
+        }
+    }
+
+    long getPreviousLocation() {
+        return previousAccessBlockLocation;
+    }
+
+    long getNextLocation() {
+        return nextAccessBlockLocation;
+    }
+}

lcio/src/java/hep/lcio/implementation/sio
IndexBlock.java added at 1.1.2.1
diff -N IndexBlock.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ IndexBlock.java	20 Oct 2009 23:18:21 -0000	1.1.2.1
@@ -0,0 +1,174 @@
+package hep.lcio.implementation.sio;
+
+import hep.io.sio.SIOBlock;
+import hep.io.sio.SIOInputStream;
+import hep.io.sio.SIOOutputStream;
+import hep.io.sio.SIORecord;
+import hep.io.sio.SIOWriter;
+import hep.lcio.event.LCEvent;
+import hep.lcio.event.LCRunHeader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * An index block written into LCIO files to support random access
+ * @author tonyj
+ */
+class IndexBlock {
+
+    private static final String LCIOINDEX = "LCIOIndex";
+    private static final int minorVersion = 0;
+    private static final int majorVersion = 1;
+    private boolean recordsAreInOrder = true;
+    private IndexEntry lastEntry;
+    private IndexEntry minEntry;
+    private IndexEntry maxEntry;
+    private List<IndexEntry> index;
+    private int maxEntries;
+    private int nEvents;
+    private int nRunHeaders;
+    private long myLocation;
+
+    IndexBlock(int size) {
+        index = new ArrayList<IndexEntry>(size);
+        maxEntries = size;
+    }
+
+    IndexBlock(SIORecord record) throws IOException {
+        read(record);
+    }
+
+    boolean add(long recordLocation, LCRunHeader runHeader) {
+        IndexEntry entry = new IndexEntry(recordLocation, runHeader);
+        index.add(entry);
+        checkOrder(entry);
+        nRunHeaders++;
+        return index.size() >= maxEntries;
+    }
+
+    boolean add(long recordLocation, LCEvent event) {
+        IndexEntry entry = new IndexEntry(recordLocation, event);
+        index.add(entry);
+        checkOrder(entry);
+        nEvents++;
+        return index.size() >= maxEntries;
+    }
+
+    private void checkOrder(IndexEntry entry) {
+        if (minEntry == null) {
+            minEntry = maxEntry = entry;
+        } else {
+            if (minEntry.compareTo(entry) > 0) {
+                minEntry = entry;
+            }
+            if (maxEntry.compareTo(entry) < 0) {
+                maxEntry = entry;
+            }
+            if (lastEntry.compareTo(entry) > 0) {
+                recordsAreInOrder = false;
+            }
+        }
+        lastEntry = entry;
+    }
+
+    boolean isEmpty() {
+        return index.isEmpty();
+    }
+
+    void clear() {
+        index.clear();
+        lastEntry = minEntry = maxEntry = null;
+        recordsAreInOrder = true;
+        nEvents = nRunHeaders = 0;
+        myLocation = 0;
+    }
+
+    void write(SIOWriter writer) throws IOException {
+        myLocation = writer.createRecord(LCIOINDEX,true);
+        SIOOutputStream sio = writer.createBlock(LCIOINDEX,majorVersion,minorVersion);
+        boolean oneRun = minEntry.getRun() == maxEntry.getRun();
+        long firstLocation = index.get(0).recordLocation;
+        boolean longOffset = lastEntry.recordLocation - firstLocation > Integer.MAX_VALUE;
+        int controlWord = 0;
+        if (oneRun) controlWord |= 1;
+        if (longOffset) controlWord |= 2;
+        sio.writeInt(controlWord);
+        sio.writeInt(minEntry.getRun());
+        sio.writeLong(firstLocation);
+        sio.writeInt(index.size());
+        for (IndexEntry entry : index) {
+            if (!oneRun) sio.writeInt(entry.getRun()-minEntry.getRun());
+            sio.writeInt(entry.getEvent());
+            if (longOffset) sio.writeLong(entry.recordLocation-firstLocation);
+            else sio.writeInt((int) (entry.recordLocation-firstLocation));
+        }
+        sio.close();
+    }
+
+    private void read(SIORecord record) throws IOException {
+        SIOBlock block = record.getBlock();
+        if (!block.getBlockName().equals(LCIOINDEX) || block.getMajorVersion()!=1 || block.getMinorVersion()!=0)
+            throw new IOException("Unexpected block in LCIOIndex record");
+        SIOInputStream sio = block.getData();
+        int controlWord = sio.readInt();
+        boolean oneRun = (controlWord & 1) == 1;
+        boolean longOffset = (controlWord & 2) == 1;
+        int minRun = sio.readInt();
+        long firstLocation = sio.readLong();
+        int size = sio.readInt();
+        index = new ArrayList<IndexEntry>(size);
+        maxEntries = size;
+        for (int i=0; i<size; i++) {
+            int run = oneRun ? minRun : minRun + sio.readInt();
+            int event = sio.readInt();
+            long location = firstLocation + (longOffset ? sio.readLong() : sio.readInt());
+            index.add(new IndexEntry(run,event,location));
+        }
+        sio.close();
+    }
+
+    RunEvent getMinEntry() {
+        return minEntry;
+    }
+
+    RunEvent getMaxEntry() {
+        return maxEntry;
+    }
+
+    long getLocation() {
+        return myLocation;
+    }
+
+    boolean areRecordsOrdered() {
+        return recordsAreInOrder;
+    }
+
+    int getEventCount() {
+        return nEvents;
+    }
+
+    int getRunHeaderCount() {
+        return nRunHeaders;
+    }
+
+    private static class IndexEntry extends RunEvent {
+
+        private long recordLocation;
+
+        private IndexEntry(long recordLocation, LCRunHeader runHeader) {
+            super(runHeader.getRunNumber(),-1);
+            this.recordLocation = recordLocation;
+        }
+
+        private IndexEntry(long recordLocation, LCEvent eventHeader) {
+            super(eventHeader.getRunNumber(),eventHeader.getEventNumber());
+            this.recordLocation = recordLocation;
+        }
+
+        private IndexEntry(int run, int event, long location) {
+            super(run,event);
+            this.recordLocation = location;
+        }
+    }
+}

lcio/src/java/hep/lcio/implementation/sio
RunEvent.java added at 1.1.2.1
diff -N RunEvent.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ RunEvent.java	20 Oct 2009 23:18:21 -0000	1.1.2.1
@@ -0,0 +1,33 @@
+package hep.lcio.implementation.sio;
+
+/**
+ *
+ * @author tonyj
+ */
+class RunEvent implements Comparable<RunEvent> {
+
+    private int run;
+    private int event;
+
+    RunEvent(int run, int event) {
+        this.run = run;
+        this.event = event;
+    }
+
+    public int compareTo(RunEvent other) {
+        if (this.run != other.run) {
+            return this.run - other.run;
+        } else {
+            return this.event - other.event;
+        }
+    }
+
+    int getEvent() {
+        return event;
+    }
+
+    int getRun() {
+        return run;
+    }
+
+}

lcio/src/java/hep/lcio/implementation/sio
SIOLCWriter.java 1.14 -> 1.14.10.1
diff -u -r1.14 -r1.14.10.1
--- SIOLCWriter.java	9 Nov 2007 20:21:10 -0000	1.14
+++ SIOLCWriter.java	20 Oct 2009 23:18:20 -0000	1.14.10.1
@@ -2,31 +2,28 @@
 
 import hep.io.sio.SIOOutputStream;
 import hep.io.sio.SIOWriter;
-
 import hep.lcio.event.LCEvent;
 import hep.lcio.event.LCRunHeader;
-
-//import hep.lcio.event.LCEvent;
 import hep.lcio.event.LCIO;
-
-//import hep.lcio.event.LCRunHeader;
 import hep.lcio.io.LCWriter;
-
-import java.io.FileOutputStream;
 import java.io.IOException;
 
-
 /**
  *
  * @author Tony Johnson
- * @version $Id: SIOLCWriter.java,v 1.14 2007/11/09 20:21:10 gaede Exp $
+ * @version $Id: SIOLCWriter.java,v 1.14.10.1 2009/10/20 23:18:20 tonyj Exp $
  */
 class SIOLCWriter implements LCWriter
 {
    private SIOWriter writer;
+   private boolean randomAccess = true;
+   private RandomAccessBlock fileRandomAccessBlock;
+   private IndexBlock indexBlock;
+   private RandomAccessBlock previousRandomAccessBlock;
 
    public void close() throws IOException
    {
+      flush();
       writer.close();
    }
 
@@ -39,7 +36,16 @@
    {
       boolean append = writeMode == LCIO.WRITE_APPEND;
       if (!filename.endsWith(".slcio")) filename += ".slcio";
-      writer = new SIOWriter(new FileOutputStream(filename,append));
+      writer = new SIOWriter(filename);
+
+      //FIXME: Deal with append option
+      if (randomAccess)
+      {
+         fileRandomAccessBlock = new RandomAccessBlock();
+         fileRandomAccessBlock.write(writer);
+         //FIXME: Set more sensible limit
+         indexBlock = new IndexBlock(50);
+      }
    }
 
    public void setCompressionLevel(int level) {
@@ -48,19 +54,50 @@
 
    public void writeEvent(LCEvent evt) throws IOException
    {
-      SIOEvent.write(evt, writer);
+      long recordLocation = SIOEvent.write(evt, writer);
+      if (randomAccess)
+      {
+         boolean isFull = indexBlock.add(recordLocation,evt);
+         if (isFull) flush();
+      }
    }
 
    public void writeRunHeader(LCRunHeader hdr) throws IOException
    {
-      writer.createRecord(SIOFactory.runRecordName, SIOFactory.compressionMode);
+      long recordLocation = writer.createRecord(SIOFactory.runRecordName, SIOFactory.compressionMode);
 
       SIOOutputStream out = writer.createBlock(SIOFactory.runBlockName, LCIO.MAJORVERSION, LCIO.MINORVERSION);
       SIORunHeader.write(hdr, out);
+      if (randomAccess) {
+         boolean isFull = indexBlock.add(recordLocation,hdr);
+         if (isFull) flush();
+      }
    }
 
    public void flush() throws IOException
    {
+      if (randomAccess)
+      {
+         if (!indexBlock.isEmpty())
+         {
+            indexBlock.write(writer);
+            RandomAccessBlock randomAccessBlock = new RandomAccessBlock();
+            randomAccessBlock.setIndexBlock(indexBlock);
+            if (previousRandomAccessBlock != null) randomAccessBlock.setPrevious(previousRandomAccessBlock);
+            randomAccessBlock.write(writer);
+
+            if (previousRandomAccessBlock != null) {
+               previousRandomAccessBlock.setNext(randomAccessBlock);
+               previousRandomAccessBlock.flush();
+            }
+            previousRandomAccessBlock = randomAccessBlock;
+            
+            fileRandomAccessBlock.add(randomAccessBlock);
+            fileRandomAccessBlock.flush();
+
+            indexBlock.clear();
+         }
+      }
       writer.flush();
    }
 }

lcio/src/java/hep/lcio/implementation/sio
SIOEvent.java 1.44 -> 1.44.10.1
diff -u -r1.44 -r1.44.10.1
--- SIOEvent.java	7 Nov 2007 20:46:22 -0000	1.44
+++ SIOEvent.java	20 Oct 2009 23:18:20 -0000	1.44.10.1
@@ -17,7 +17,7 @@
 /**
  *
  * @author Tony Johnson
- * @version $Id: SIOEvent.java,v 1.44 2007/11/07 20:46:22 jeremy Exp $
+ * @version $Id: SIOEvent.java,v 1.44.10.1 2009/10/20 23:18:20 tonyj Exp $
  */
 class SIOEvent extends ILCEvent
 {
@@ -595,11 +595,12 @@
       }
    }
    
-   static void write(LCEvent event, SIOWriter writer) throws IOException
+   static long write(LCEvent event, SIOWriter writer) throws IOException
    {
-      writer.createRecord(SIOFactory.eventHeaderRecordName, SIOFactory.compressionMode);
+      long recordLocation = writer.createRecord(SIOFactory.eventHeaderRecordName, SIOFactory.compressionMode);
       SIOEvent.writeData(event, writer, true);
       writer.createRecord(SIOFactory.eventRecordName, SIOFactory.compressionMode);
       SIOEvent.writeData(event, writer, false);
+      return recordLocation;
    }
 }

lcio/src/java/hep/lcio/implementation/sio
SIOLCReader.java 1.16 -> 1.16.10.1
diff -u -r1.16 -r1.16.10.1
--- SIOLCReader.java	9 Nov 2007 08:18:32 -0000	1.16
+++ SIOLCReader.java	20 Oct 2009 23:18:21 -0000	1.16.10.1
@@ -13,22 +13,25 @@
 import hep.lcio.io.LCRunListener;
 
 import java.io.EOFException;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 
 /**
  *
  * @author Tony Johnson
- * @version $Id: SIOLCReader.java,v 1.16 2007/11/09 08:18:32 gaede Exp $
+ * @version $Id: SIOLCReader.java,v 1.16.10.1 2009/10/20 23:18:21 tonyj Exp $
  */
 class SIOLCReader implements LCReader
 {
    private List eventListeners = new ArrayList();
    private List runListeners = new ArrayList();
+   private RandomAccessBlock fileRandomAccessBlock;
+   private List<RandomAccessBlock> indexRandomAccessBlocks = new ArrayList<RandomAccessBlock>();
    private SIOReader reader;
+   private boolean indexBlocksRead;
 
    private String[] _filenames ;
    private int _currentIndex ;
@@ -40,7 +43,7 @@
 
    public void open(String filename) throws IOException
    {
-      reader = new SIOReader(new FileInputStream(filename));
+      reader = new SIOReader(filename);
    }
 
     /** Opens a list of files for reading (read-only). All subsequent
@@ -95,6 +98,7 @@
          {
             SIORecord record = reader.readRecord();
             String name = record.getRecordName();
+            if (name.equals("LCIORandomAccess")) addRandomAccessRecord(record);
             if (!name.equals(SIOFactory.eventHeaderRecordName))
                continue;
 
@@ -237,7 +241,6 @@
             throw x;
       }
    }
-
    public void registerLCEventListener(LCEventListener ls)
    {
       eventListeners.add(ls);
@@ -258,4 +261,58 @@
       runListeners.remove(ls);
    }
 
+   private void addRandomAccessRecord(SIORecord record) throws IOException
+   {
+      RandomAccessBlock ra = new RandomAccessBlock(record);
+      System.out.println("Found ra="+ra);
+      if (ra.getIndexLocation() == 0) fileRandomAccessBlock = ra;
+      else indexRandomAccessBlocks.add(ra);
+   }
+
+   private long findNextRunHeader() throws IOException {
+      RandomAccessBlock fab = findFileRandomAccessBlock();
+      for (RandomAccessBlock rab : findIndexRandomAccessBlocks()) {
+          
+      }
+   }
+
+   private long findEvent(int run, int event) throws IOException {
+      if (!indexBlocksRead) readIndexBlocks();
+      // FIXME: Assumes records are ordered
+      RunEvent re = new RunEvent(run,event);
+      if (!fileRandomAccessBlock.contains(re)) return -1;
+
+      int location = Collections.binarySearch(indexRandomAccessBlocks,re);
+      return 0;
+   }
+
+    private void readIndexBlocks() throws IOException {
+       RandomAccessBlock fab = findFileRandomAccessBlock();
+
+       if (indexRandomAccessBlocks.isEmpty()) {
+           SIORecord record = reader.readRecord(fab.getPreviousLocation());
+           RandomAccessBlock rab = new RandomAccessBlock(record);
+           indexRandomAccessBlocks.add(rab);
+           indexBlocksRead =  rab.getNextLocation() == 0;
+       }
+       while (!indexBlocksRead) {
+           long nextLocation = indexRandomAccessBlocks.get(indexRandomAccessBlocks.size()-1).getNextLocation();
+           SIORecord record = reader.readRecord(nextLocation);
+           RandomAccessBlock rab = new RandomAccessBlock(record);
+           indexRandomAccessBlocks.add(rab);
+           indexBlocksRead =  rab.getNextLocation() == 0;
+       }
+    }
+
+    private RandomAccessBlock findFileRandomAccessBlock() throws IOException {
+        if (fileRandomAccessBlock == null) {
+           SIORecord record = reader.readRecord(0);
+           fileRandomAccessBlock = new RandomAccessBlock(record);
+        }
+        return fileRandomAccessBlock;
+    }
+
+    private Iterable<RandomAccessBlock> findIndexRandomAccessBlocks() {
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
 }

lcio/config
lcio.properties 1.69 -> 1.69.4.1
diff -u -r1.69 -r1.69.4.1
--- lcio.properties	22 May 2009 20:18:59 -0000	1.69
+++ lcio.properties	20 Oct 2009 23:18:22 -0000	1.69.4.1
@@ -1,7 +1,7 @@
 # ANT property file for LCIO
 #
 # Author: Mark Donszelmann
-# Version: $Id: lcio.properties,v 1.69 2009/05/22 20:18:59 cassell Exp $
+# Version: $Id: lcio.properties,v 1.69.4.1 2009/10/20 23:18:22 tonyj Exp $
 #
 debug=true
 
@@ -22,10 +22,10 @@
 # test properties --JM
 test.output=./reports
 test.html=./reports/html
-test.classpath=lib/lcio.jar;tools/sio.jar;tools/commons-cli-1.0.jar;tools/commons-lang-2.1.jar;tools/commons-math-1.2.jar
+test.classpath=lib/lcio.jar;tools/sio.jar;tools/commons-cli-1.0.jar;tools/commons-lang-2.1.jar
 test.format=frames
 
-classpath=src/java;tools/saxpath.jar;tools/jel.jar;tools/jdom.jar;tools/jaxen-core.jar;tools/jaxen-jdom.jar;tools/commons-cli-1.0.jar;tools/commons-lang-2.1.jar;tools/freehep-physics-2.1.jar;tools/freehep-mcfio-2.0.1.jar;tools/freehep-sio-2.0.jar;tools/freehep-stdhep-2.0.2.jar;tools/freehep-xdr-2.0.3.jar;tools/commons-math-1.2.jar
+classpath=src/java;tools/saxpath.jar;tools/jel.jar;tools/jdom.jar;tools/jaxen-core.jar;tools/jaxen-jdom.jar;tools/commons-cli-1.0.jar;tools/commons-lang-2.1.jar;tools/freehep-physics-2.1.jar;tools/freehep-mcfio-2.0.2-SNAPSHOT.jar;tools/freehep-sio-2.1-SNAPSHOT.jar;tools/freehep-stdhep-2.0.3-SNAPSHOT.jar;tools/freehep-xdr-2.0.4-SNAPSHOT.jar
 
 srcpath=src/java
 exp.srcpath=

lcio/doc
lcio.xml 1.65 -> 1.65.2.1
diff -u -r1.65 -r1.65.2.1
--- lcio.xml	22 Jul 2009 16:03:35 -0000	1.65
+++ lcio.xml	20 Oct 2009 23:18:22 -0000	1.65.2.1
@@ -12,6 +12,61 @@
 	length: mm, energy: GeV and time ns
 -->
 <sio>
+  <record name="LCIORandomAccess">
+     There are two types of LCIORandomAccess records
+       file record -- one per file, always first record on file
+       index record -- one or more per file, points to associated LCIOIndex record
+     <block name="LCIORandomAccess" major="1" minor="0">
+         <data type="int" name="runMin"/>
+         <data type="int" name="eventMin"/>
+         <data type="int" name="runMax"/>
+         <data type="int" name="eventMax"/>
+         <data type="int" name="nRunHeaders"/>
+         <data type="int" name="nEvents"/>
+         <data type="int" name="recordsAreInOrder"/>
+         <data type="long" name="indexLocation">
+            Location in file off associated index. Always null for file record.
+         </data>
+         <data type="long" name="prevLocation">
+            For file record location of first index record in file
+            For index record location of previous index record (or null if first)
+         </data>
+         <data type="long" name="nextLocation">
+            For file record location of last index record in file
+            For index record location of next index record (or null if last)
+         </data>
+     </block>
+  </record>
+  <record name="LCIOIndex">
+     <block name="LCIOIndex" major="1" minor="0">
+         <data type="int" name="controlWord">
+            Bit 0 = single Run
+            Bit 1 = long offset required
+         </data>
+         <data type="int" name="runMin"/>
+         <data type="long" name="baseOffset"/>
+         <data type="int" name="size"/>
+         <repeat count="size">
+             <if condition="(controlWord&amp;1)==0">
+                <data type="int" name="runOffset">
+                    Relative to runMin
+                </data>
+             </if>
+             <data type="int" name="eventNumber">
+                Event number, or -1 for run header records
+             </data>
+             <if condition="(controlWord&amp;2)==1">
+                <data type="long" name="locationOffset">
+                    Relative to baseOffset
+                </data>
+             <else/>
+                <data type="int" name="locationOffset">
+                    Relative to baseOffset
+                </data>
+             </if>
+         </repeat>
+     </block>
+  </record>
   <record name="LCRunHeader">
      <block name="RunHeader" major="1" minor="11">
         <data type="int" name="runNumber"></data>
@@ -38,7 +93,7 @@
         <include subroutine="namedParameters"/>
      </block>
   </record>  
-  <record name="LCEvent">
+  <record name="LCEvent">Insert one or more special "index" records into the LCIO file. This contains pointers to the location of the events and other records within the file. The record can optionally also contain additional event tags, which allow events which satisfy certain criteria to be located.
       <block name="MCParticle" major="1" minor="11">
          <data type="int" name="flags"> not yet used, Bits 0-15 user/application dependent</data>
          <include subroutine="namedParameters"/>
@@ -245,7 +300,6 @@
             <data type="float[6]" name="covariance">Covariance Matrix of position (x,y,z)</data>
             <data type="float" name="dedx"></data>
             <data type="float" name="time"></data>
-            <data type="int" name="quality">quality flag word</data>
             <if condition="1000*major+minor&gt;1002">
               <data type="int" name="nRawHits">number of raw hits</data>
               <repeat count="nRawHits">

lcio/bin
runSimJob.sh 1.3 -> 1.3.10.1
diff -u -r1.3 -r1.3.10.1
--- runSimJob.sh	8 Nov 2007 17:37:29 -0000	1.3
+++ runSimJob.sh	20 Oct 2009 23:18:22 -0000	1.3.10.1
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 LOCALCLASSPATH=$LCIO/lib/lcio.jar:$LCIO/tools/sio.jar
-LOCALCLASSPATH=$LOCALCLASSPATH:$LCIO/tools/freehep-sio-2.0.jar:$LCIO/tools/freehep-xdr-2.0.3.jar
+LOCALCLASSPATH=$LOCALCLASSPATH:$LCIO/tools/freehep-sio-2.1-SNAPSHOT.jar:$LCIO/tools/freehep-xdr-2.0.4-SNAPSHOT.jar
 
 # OS specific support for Cygwin 
 cygwin=false;

lcio/bin
runAnalysisJob.sh 1.4 -> 1.4.10.1
diff -u -r1.4 -r1.4.10.1
--- runAnalysisJob.sh	8 Nov 2007 17:37:29 -0000	1.4
+++ runAnalysisJob.sh	20 Oct 2009 23:18:22 -0000	1.4.10.1
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 LOCALCLASSPATH=$LCIO/lib/lcio.jar:$LCIO/tools/sio.jar
-LOCALCLASSPATH=$LOCALCLASSPATH:$LCIO/tools/freehep-sio-2.0.jar:$LCIO/tools/freehep-xdr-2.0.3.jar
+LOCALCLASSPATH=$LOCALCLASSPATH:$LCIO/tools/freehep-sio-2.1-SNAPSHOT.jar:$LCIO/tools/freehep-xdr-2.0.4-SNAPSHOT.jar
 
 # OS specific support for Cygwin 
 cygwin=false;

lcio/bin
runSIODump.sh 1.3 -> 1.3.10.1
diff -u -r1.3 -r1.3.10.1
--- runSIODump.sh	8 Nov 2007 17:37:29 -0000	1.3
+++ runSIODump.sh	20 Oct 2009 23:18:22 -0000	1.3.10.1
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 LOCALCLASSPATH=$LCIO/lib/lcio.jar:$LCIO/tools/sio.jar:$LCIO/tools/jdom.jar:$LCIO/tools/saxpath.jar
-LOCALCLASSPATH=$LOCALCLASSPATH:$LCIO/tools/freehep-sio-2.0.jar:$LCIO/tools/freehep-xdr-2.0.3.jar
+LOCALCLASSPATH=$LOCALCLASSPATH:$LCIO/tools/freehep-sio-2.1-SNAPSHOT.jar:$LCIO/tools/freehep-xdr-2.0.4-SNAPSHOT.jar
 LOCALCLASSPATH=$LOCALCLASSPATH:$LCIO/tools/jaxen-jdom.jar:$LCIO/tools/jaxen-core.jar:$LCIO/tools/jel.jar
 
 # OS specific support for Cygwin 
CVSspam 0.2.8