Print

Print


Commit in hps-java on MAIN
src/main/java/org/lcsim/hps/evio/ECalHitWriter.java+440added 1.1
                                /SVTHitWriter.java+74added 1.1
                                /TestRunTriggeredReconToLcio.java+134added 1.1
                                /HitWriter.java+25added 1.1
                                /TestRunReconToEvio.java+4-41.8 -> 1.9
                                /TestRunTriggeredReconToEvio.java+9-111.13 -> 1.14
                                /ECalEvioWriter.java-4221.8 removed
                                /SVTEvioWriter.java-691.5 removed
                                /EvioWriter.java-221.1 removed
src/main/java/org/lcsim/hps/util/ClockSingleton.java+1-121.4 -> 1.5
src/main/resources/org/lcsim/hps/steering/HPSTestRunReconToLcio.lcsim+85added 1.1
                                         /HPSTestRunRecon.lcsim-741.2 removed
src/main/java/org/lcsim/hps/analysis/ecal/HPSEcalTriggerPlotsDriver.java+3-21.4 -> 1.5
                                         /HPSEcalPlotsDriver.java+5-41.14 -> 1.15
sandbox/HPSTestRunDriver.java+104added 1.1
       /HPSEcalFlashTrigger.java+411added 1.1
       /HPSTestRunRecon.lcsim+74added 1.1
src/main/java/org/lcsim/hps/users/omoreno/HPSEcalFlashTrigger.java-4111.1 removed
                                         /HPSTestRunDriver.java-1041.3 removed
src/main/java/org/lcsim/hps/users/meeg/FilterMCBunches.java+2-31.3 -> 1.4
src/main/java/org/lcsim/hps/recon/ecal/HPSTriggerDriver.java+19-171.10 -> 1.11
+1390-1155
8 added + 6 removed + 7 modified, total 21 files
first steps at making readout simulation output to LCIO

hps-java/src/main/java/org/lcsim/hps/evio
ECalHitWriter.java added at 1.1
diff -N ECalHitWriter.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ECalHitWriter.java	30 Jul 2012 23:31:45 -0000	1.1
@@ -0,0 +1,440 @@
+package org.lcsim.hps.evio;
+
+import org.lcsim.event.RawTrackerHit;
+import org.jlab.coda.jevio.CompositeData;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.jlab.coda.jevio.DataType;
+import org.jlab.coda.jevio.EventBuilder;
+import org.jlab.coda.jevio.EvioBank;
+import org.jlab.coda.jevio.EvioException;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.EventHeader.LCMetaData;
+import org.lcsim.event.RawCalorimeterHit;
+import org.lcsim.geometry.IDDecoder;
+import org.lcsim.hps.recon.ecal.HPSEcalConditions;
+
+import static org.lcsim.hps.evio.EventConstants.ECAL_BANK_NUMBER;
+import static org.lcsim.hps.evio.EventConstants.ECAL_BOTTOM_BANK_TAG;
+import static org.lcsim.hps.evio.EventConstants.ECAL_PULSE_INTEGRAL_FORMAT;
+import static org.lcsim.hps.evio.EventConstants.ECAL_PULSE_INTEGRAL_BANK_TAG;
+import static org.lcsim.hps.evio.EventConstants.ECAL_TOP_BANK_TAG;
+
+/**
+ *
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: ECalHitWriter.java,v 1.1 2012/07/30 23:31:45 meeg Exp $
+ */
+public class ECalHitWriter implements HitWriter {
+
+    private String hitCollectionName = "EcalReadoutHits";
+    private int mode = EventConstants.ECAL_PULSE_INTEGRAL_MODE;
+
+    public ECalHitWriter() {
+    }
+
+    public void setHitCollectionName(String hitCollectionName) {
+        this.hitCollectionName = hitCollectionName;
+    }
+
+    public void setMode(int mode) {
+        this.mode = mode;
+        if (mode != EventConstants.ECAL_WINDOW_MODE && mode != EventConstants.ECAL_PULSE_MODE && mode != EventConstants.ECAL_PULSE_INTEGRAL_MODE) {
+            throw new IllegalArgumentException("invalid mode " + mode);
+        }
+    }
+
+    @Override
+    public boolean hasData(EventHeader event) {
+        switch (mode) {
+            case EventConstants.ECAL_WINDOW_MODE:
+                return event.hasCollection(RawTrackerHit.class, hitCollectionName);
+            case EventConstants.ECAL_PULSE_MODE:
+                return event.hasCollection(RawTrackerHit.class, hitCollectionName);
+            case EventConstants.ECAL_PULSE_INTEGRAL_MODE:
+                return event.hasCollection(RawCalorimeterHit.class, hitCollectionName);
+            default:
+                return false;
+        }
+    }
+
+    @Override
+    public void writeData(EventHeader event, EventBuilder builder) {
+        LCMetaData meta;
+        List<RawCalorimeterHit> rawCalorimeterHits;
+        List<RawTrackerHit> rawTrackerHits;
+        switch (mode) {
+            case EventConstants.ECAL_WINDOW_MODE:
+                rawTrackerHits = event.get(RawTrackerHit.class, hitCollectionName);
+                meta = event.getMetaData(rawTrackerHits);
+                writeWindowHits(meta, rawTrackerHits, builder);
+                break;
+            case EventConstants.ECAL_PULSE_MODE:
+                rawTrackerHits = event.get(RawTrackerHit.class, hitCollectionName);
+                meta = event.getMetaData(rawTrackerHits);
+                writePulseHits(meta, rawTrackerHits, builder);
+                break;
+            case EventConstants.ECAL_PULSE_INTEGRAL_MODE:
+                rawCalorimeterHits = event.get(RawCalorimeterHit.class, hitCollectionName);
+                meta = event.getMetaData(rawCalorimeterHits);
+                writeIntegralHits(meta, rawCalorimeterHits, builder);
+                break;
+            default:
+                break;
+        }
+    }
+
+    private void writeIntegralHits(LCMetaData meta, List<RawCalorimeterHit> rawCalorimeterHits, EventBuilder builder) {
+        System.out.println("Writing " + rawCalorimeterHits.size() + " ECal hits in integral format");
+
+        // Make two lists containing the hits from top and bottom sections, which go into separate EVIO data banks.
+        List<RawCalorimeterHit> topHits = new ArrayList<RawCalorimeterHit>();
+        List<RawCalorimeterHit> bottomHits = new ArrayList<RawCalorimeterHit>();
+        for (RawCalorimeterHit hit : rawCalorimeterHits) {
+            Long daqID = HPSEcalConditions.physicalToDaqID(hit.getCellID());
+            int crate = HPSEcalConditions.getCrate(daqID);
+            if (crate == ECAL_BOTTOM_BANK_TAG) {
+                bottomHits.add(hit);
+            } else {
+                topHits.add(hit);
+            }
+        }
+
+        // Write the two collections for top and bottom hits to separate EVIO banks.
+        writeIntegralHitCollection(topHits, meta, ECAL_TOP_BANK_TAG, builder);
+        writeIntegralHitCollection(bottomHits, meta, ECAL_BOTTOM_BANK_TAG, builder);
+    }
+
+    private void writeIntegralHitCollection(List<RawCalorimeterHit> hits, LCMetaData meta, int bankTag, EventBuilder builder) {
+        if (hits.isEmpty()) {
+            return;
+        }
+
+        // Get the ID decoder.
+        IDDecoder dec = meta.getIDDecoder();
+
+        // Make a hit map; allow for multiple hits in a crystal.
+        Map<Long, List<RawCalorimeterHit>> hitMap = new HashMap<Long, List<RawCalorimeterHit>>();
+        for (RawCalorimeterHit hit : hits) {
+            if (hitMap.get(hit.getCellID()) == null) {
+                hitMap.put(hit.getCellID(), new ArrayList<RawCalorimeterHit>());
+            }
+            List<RawCalorimeterHit> channelHits = hitMap.get(hit.getCellID());
+            channelHits.add(hit);
+        }
+
+        // Make map of slot number to hit IDs.
+        Map<Integer, List<Long>> slotMap = new HashMap<Integer, List<Long>>();
+        for (Long id : hitMap.keySet()) {
+            dec.setID(id);
+//			System.out.println(dec.getIDDescription());
+//			System.out.printf("ix = %d, iy = %d\n", dec.getValue("ix"), dec.getValue("iy"));
+            Long daqID = HPSEcalConditions.physicalToDaqID(id);
+//			System.out.printf("physicalID %d, daqID %d\n", id, daqID);
+            int slot = HPSEcalConditions.getSlot(daqID);
+            if (slotMap.get(slot) == null) {
+                slotMap.put(slot, new ArrayList<Long>());
+            }
+            List<Long> slots = slotMap.get(slot);
+            slots.add(id);
+        }
+
+        // Make a new bank for this crate.
+        EvioBank crateBank = new EvioBank(bankTag, DataType.BANK, ECAL_BANK_NUMBER);
+
+//        // New bank for this slot.
+//        EvioBank slotBank = new EvioBank(EventConstants.ECAL_PULSE_INTEGRAL_BANK_TAG, DataType.COMPOSITE, 0);
+//
+//        List<CompositeData> slotDataList = new ArrayList<CompositeData>();
+//
+        // Loop over the slots in the map.
+        for (int slot : slotMap.keySet()) {
+
+            // New bank for this slot.
+            EvioBank slotBank = new EvioBank(ECAL_PULSE_INTEGRAL_BANK_TAG, DataType.COMPOSITE, slot);
+
+            // Create composite data for this slot and its channels.
+            CompositeData.Data data = new CompositeData.Data();
+            data.addUchar((byte) slot); // slot #
+            data.addUint(0); // trigger #
+            data.addUlong(0); // timestamp    		
+            List<Long> hitIDs = slotMap.get(slot);
+            int nhits = hitIDs.size();
+            data.addN(nhits); // number of channels
+            for (Long id : hitIDs) {
+                dec.setID(id);
+                int channel = HPSEcalConditions.getChannel(HPSEcalConditions.physicalToDaqID(id));
+                data.addUchar((byte) channel); // channel #
+                List<RawCalorimeterHit> channelHits = hitMap.get(id);
+                data.addN(channelHits.size()); // number of pulses
+                for (RawCalorimeterHit hit : channelHits) {
+                    data.addUshort((short) hit.getTimeStamp()); // pulse time
+                    data.addUint((int) hit.getAmplitude()); // pulse integral
+                }
+            }
+
+            // Add CompositeData to bank.
+            try {
+                CompositeData cdata = new CompositeData(ECAL_PULSE_INTEGRAL_FORMAT, 1, data, ECAL_PULSE_INTEGRAL_BANK_TAG, 0);
+//                slotDataList.add(cdata);
+                slotBank.appendCompositeData(cdata);
+            } catch (EvioException e) {
+                throw new RuntimeException(e);
+            }
+
+            // Add slot bank to crate bank.
+            try {
+                builder.addChild(crateBank, slotBank);
+            } catch (EvioException e) {
+                throw new RuntimeException(e);
+            }
+        }
+        try {
+//            slotBank.appendCompositeData(slotDataList.toArray(new CompositeData[slotDataList.size()]));
+//            builder.addChild(crateBank, slotBank);
+            builder.addChild(builder.getEvent(), crateBank);
+        } catch (EvioException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private void writePulseHits(LCMetaData meta, List<RawTrackerHit> rawCalorimeterHits, EventBuilder builder) {
+        System.out.println("Writing " + rawCalorimeterHits.size() + " ECal hits in pulse format");
+
+        // Make two lists containing the hits from top and bottom sections, which go into separate EVIO data banks.
+        List<RawTrackerHit> topHits = new ArrayList<RawTrackerHit>();
+        List<RawTrackerHit> bottomHits = new ArrayList<RawTrackerHit>();
+        for (RawTrackerHit hit : rawCalorimeterHits) {
+            Long daqID = HPSEcalConditions.physicalToDaqID(hit.getCellID());
+            int crate = HPSEcalConditions.getCrate(daqID);
+            if (crate == ECAL_BOTTOM_BANK_TAG) {
+                bottomHits.add(hit);
+            } else {
+                topHits.add(hit);
+            }
+        }
+
+        // Write the two collections for top and bottom hits to separate EVIO banks.
+        writePulseHitCollection(topHits, meta, ECAL_TOP_BANK_TAG, builder);
+        writePulseHitCollection(bottomHits, meta, ECAL_BOTTOM_BANK_TAG, builder);
+    }
+
+    private void writePulseHitCollection(List<RawTrackerHit> hits, LCMetaData meta, int bankTag, EventBuilder builder) {
+        if (hits.isEmpty()) {
+            return;
+        }
+
+        // Get the ID decoder.
+        IDDecoder dec = meta.getIDDecoder();
+
+        // Make a hit map; allow for multiple hits in a crystal.
+        Map<Long, List<RawTrackerHit>> hitMap = new HashMap<Long, List<RawTrackerHit>>();
+        for (RawTrackerHit hit : hits) {
+            if (hitMap.get(hit.getCellID()) == null) {
+                hitMap.put(hit.getCellID(), new ArrayList<RawTrackerHit>());
+            }
+            List<RawTrackerHit> channelHits = hitMap.get(hit.getCellID());
+            channelHits.add(hit);
+        }
+
+        // Make map of slot number to hit IDs.
+        Map<Integer, List<Long>> slotMap = new HashMap<Integer, List<Long>>();
+        for (Long id : hitMap.keySet()) {
+            dec.setID(id);
+//			System.out.println(dec.getIDDescription());
+//			System.out.printf("ix = %d, iy = %d\n", dec.getValue("ix"), dec.getValue("iy"));
+            Long daqID = HPSEcalConditions.physicalToDaqID(id);
+//			System.out.printf("physicalID %d, daqID %d\n", id, daqID);
+            int slot = HPSEcalConditions.getSlot(daqID);
+            if (slotMap.get(slot) == null) {
+                slotMap.put(slot, new ArrayList<Long>());
+            }
+            List<Long> slots = slotMap.get(slot);
+            slots.add(id);
+        }
+
+        // Make a new bank for this crate.
+        EvioBank crateBank = new EvioBank(bankTag, DataType.BANK, ECAL_BANK_NUMBER);
+
+//        // New bank for this slot.
+//        EvioBank slotBank = new EvioBank(EventConstants.ECAL_PULSE_BANK_TAG, DataType.COMPOSITE, 0);
+//
+//        List<CompositeData> slotDataList = new ArrayList<CompositeData>();
+//
+        // Loop over the slots in the map.
+        for (int slot : slotMap.keySet()) {
+
+            // New bank for this slot.
+            EvioBank slotBank = new EvioBank(EventConstants.ECAL_PULSE_BANK_TAG, DataType.COMPOSITE, slot);
+
+            // Create composite data for this slot and its channels.
+            CompositeData.Data data = new CompositeData.Data();
+            data.addUchar((byte) slot); // slot #
+            data.addUint(0); // trigger #
+            data.addUlong(0); // timestamp    		
+            List<Long> hitIDs = slotMap.get(slot);
+            int nhits = hitIDs.size();
+            data.addN(nhits); // number of channels
+            for (Long id : hitIDs) {
+                dec.setID(id);
+                int channel = HPSEcalConditions.getChannel(HPSEcalConditions.physicalToDaqID(id));
+                data.addUchar((byte) channel); // channel #
+                List<RawTrackerHit> channelHits = hitMap.get(id);
+                data.addN(channelHits.size()); // number of pulses
+                for (RawTrackerHit hit : channelHits) {
+                    data.addUchar((byte) channelHits.indexOf(hit)); // pulse number
+                    data.addN(hit.getADCValues().length); // number of samples
+                    for (short val : hit.getADCValues()) {
+                        data.addUshort(val); // sample
+                    }
+                }
+            }
+
+            // Add CompositeData to bank.
+            try {
+                CompositeData cdata = new CompositeData(EventConstants.ECAL_PULSE_FORMAT, 1, data, EventConstants.ECAL_PULSE_BANK_TAG, 0);
+//                slotDataList.add(cdata);
+                slotBank.appendCompositeData(cdata);
+            } catch (EvioException e) {
+                throw new RuntimeException(e);
+            }
+        }
+        try {
+//            slotBank.appendCompositeData(slotDataList.toArray(new CompositeData[slotDataList.size()]));
+//            builder.addChild(crateBank, slotBank);
+            builder.addChild(builder.getEvent(), crateBank);
+        } catch (EvioException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private void writeWindowHits(LCMetaData meta, List<RawTrackerHit> rawCalorimeterHits, EventBuilder builder) {
+        System.out.println("Writing " + rawCalorimeterHits.size() + " ECal hits in window format");
+
+        // Make two lists containing the hits from top and bottom sections, which go into separate EVIO data banks.
+        List<RawTrackerHit> topHits = new ArrayList<RawTrackerHit>();
+        List<RawTrackerHit> bottomHits = new ArrayList<RawTrackerHit>();
+        for (RawTrackerHit hit : rawCalorimeterHits) {
+            Long daqID = HPSEcalConditions.physicalToDaqID(hit.getCellID());
+            int crate = HPSEcalConditions.getCrate(daqID);
+            if (crate == ECAL_BOTTOM_BANK_TAG) {
+                bottomHits.add(hit);
+            } else {
+                topHits.add(hit);
+            }
+        }
+
+        // Write the two collections for top and bottom hits to separate EVIO banks.
+        writeWindowHitCollection(topHits, meta, ECAL_TOP_BANK_TAG, builder);
+        writeWindowHitCollection(bottomHits, meta, ECAL_BOTTOM_BANK_TAG, builder);
+    }
+
+    private void writeWindowHitCollection(List<RawTrackerHit> hits, LCMetaData meta, int bankTag, EventBuilder builder) {
+        if (hits.isEmpty()) {
+            return;
+        }
+
+        // Get the ID decoder.
+        IDDecoder dec = meta.getIDDecoder();
+
+        // Make a hit map; allow for multiple hits in a crystal.
+        Map<Long, RawTrackerHit> hitMap = new HashMap<Long, RawTrackerHit>();
+        for (RawTrackerHit hit : hits) {
+            hitMap.put(hit.getCellID(), hit);
+        }
+
+        // Make map of slot number to hit IDs.
+        Map<Integer, List<Long>> slotMap = new HashMap<Integer, List<Long>>();
+        for (Long id : hitMap.keySet()) {
+            dec.setID(id);
+//			System.out.println(dec.getIDDescription());
+//			System.out.printf("ix = %d, iy = %d\n", dec.getValue("ix"), dec.getValue("iy"));
+            Long daqID = HPSEcalConditions.physicalToDaqID(id);
+//			System.out.printf("physicalID %d, daqID %d\n", id, daqID);
+            int slot = HPSEcalConditions.getSlot(daqID);
+            if (slotMap.get(slot) == null) {
+                slotMap.put(slot, new ArrayList<Long>());
+            }
+            List<Long> slots = slotMap.get(slot);
+            slots.add(id);
+        }
+
+        // Make a new bank for this crate.
+        EvioBank crateBank = new EvioBank(bankTag, DataType.BANK, ECAL_BANK_NUMBER);
+
+//        // New bank for this slot.
+//        EvioBank slotBank = new EvioBank(EventConstants.ECAL_WINDOW_BANK_TAG, DataType.COMPOSITE, 0);
+//
+//        List<CompositeData> slotDataList = new ArrayList<CompositeData>();
+//
+        // Loop over the slots in the map.
+        for (int slot : slotMap.keySet()) {
+
+            // New bank for this slot.
+            EvioBank slotBank = new EvioBank(EventConstants.ECAL_WINDOW_BANK_TAG, DataType.COMPOSITE, slot);
+
+            // Create composite data for this slot and its channels.
+            CompositeData.Data data = new CompositeData.Data();
+            data.addUchar((byte) slot); // slot #
+            data.addUint(0); // trigger #
+            data.addUlong(0); // timestamp    		
+            List<Long> hitIDs = slotMap.get(slot);
+            int nhits = hitIDs.size();
+            data.addN(nhits); // number of channels
+            for (Long id : hitIDs) {
+                dec.setID(id);
+                int channel = HPSEcalConditions.getChannel(HPSEcalConditions.physicalToDaqID(id));
+                data.addUchar((byte) channel); // channel #
+                RawTrackerHit hit = hitMap.get(id);
+                data.addN(hit.getADCValues().length); // number of samples
+                for (short val : hit.getADCValues()) {
+                    data.addUshort(val); // sample
+                }
+            }
+
+            // Add CompositeData to bank.
+            try {
+                CompositeData cdata = new CompositeData(EventConstants.ECAL_WINDOW_FORMAT, 1, data, EventConstants.ECAL_WINDOW_BANK_TAG, 0);
+                //                slotDataList.add(cdata);
+                slotBank.appendCompositeData(cdata);
+            } catch (EvioException e) {
+                throw new RuntimeException(e);
+            }
+
+            // Add slot bank to crate bank.
+            slotBank.setAllHeaderLengths();
+            try {
+                builder.addChild(crateBank, slotBank);
+            } catch (EvioException e) {
+                throw new RuntimeException(e);
+            }
+        }
+        try {
+//            slotBank.appendCompositeData(slotDataList.toArray(new CompositeData[slotDataList.size()]));
+//            builder.addChild(crateBank, slotBank);
+            builder.addChild(builder.getEvent(), crateBank);
+        } catch (EvioException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public void writeData(EventHeader event, EventHeader toEvent) {
+        String readoutName = HPSEcalConditions.getSubdetector().getReadout().getName();
+        switch (mode) {
+            case EventConstants.ECAL_WINDOW_MODE:
+            case EventConstants.ECAL_PULSE_MODE:
+                List<RawTrackerHit> rawTrackerHits = event.get(RawTrackerHit.class, hitCollectionName);
+                toEvent.put(hitCollectionName, rawTrackerHits, RawTrackerHit.class, 0, readoutName);
+                break;
+            case EventConstants.ECAL_PULSE_INTEGRAL_MODE:
+                List<RawCalorimeterHit> rawCalorimeterHits = event.get(RawCalorimeterHit.class, hitCollectionName);
+                toEvent.put(hitCollectionName, rawCalorimeterHits, RawCalorimeterHit.class, 0, readoutName);
+                break;
+            default:
+                break;
+        }
+    }
+}

hps-java/src/main/java/org/lcsim/hps/evio
SVTHitWriter.java added at 1.1
diff -N SVTHitWriter.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SVTHitWriter.java	30 Jul 2012 23:31:45 -0000	1.1
@@ -0,0 +1,74 @@
+
+package org.lcsim.hps.evio;
+
+import static org.lcsim.hps.evio.EventConstants.SVT_BANK_NUMBER;
+import static org.lcsim.hps.evio.EventConstants.SVT_BANK_TAG;
+import static org.lcsim.hps.evio.EventConstants.SVT_TOTAL_NUMBER_FPGAS;
+
+import java.util.List;
+
+import org.jlab.coda.jevio.DataType;
+import org.jlab.coda.jevio.EventBuilder;
+import org.jlab.coda.jevio.EvioBank;
+import org.jlab.coda.jevio.EvioException;
+import org.lcsim.event.EventHeader;
+import org.lcsim.hps.recon.tracking.HPSSVTData;
+import org.lcsim.hps.recon.tracking.HPSSVTDataBuffer;
+
+/**
+ *
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: SVTHitWriter.java,v 1.1 2012/07/30 23:31:45 meeg Exp $
+ */
+public class SVTHitWriter implements HitWriter {
+	
+	boolean debug = false;
+
+	public SVTHitWriter() {}
+
+	public boolean hasData(EventHeader event) {
+		List<List<HPSSVTData>> svtDataList = event.get(HPSSVTData.class);
+		return (svtDataList != null && svtDataList.size() > 0 && svtDataList.get(0) != null);
+	}
+
+	public void writeData(EventHeader event, EventBuilder builder) {
+						
+		// SVT container bank.
+		EvioBank svtBank = new EvioBank(SVT_BANK_TAG, DataType.BANK, SVT_BANK_NUMBER);
+		
+		// Iterate over FPGA's 0 - 6
+		for(int fpgaNumber = 0; fpgaNumber < SVT_TOTAL_NUMBER_FPGAS; fpgaNumber++){
+			
+			// Skip FPGA 7 for now
+			if(fpgaNumber == 7) continue;
+			
+			// Get the raw int data buffer for this FPGA.
+			int[] dataBuffer = HPSSVTDataBuffer.readoutBuffer(fpgaNumber);
+					
+			if(debug) System.out.println(this.getClass().getSimpleName() + ": FPGA " + fpgaNumber + " : Data size: " + dataBuffer.length);
+			
+			// Bank for this FPGA's frame data.
+			EvioBank frameBank = new EvioBank(fpgaNumber, DataType.UINT32, fpgaNumber);
+			try {
+				// Add the SVT data to the FPGA bank
+				frameBank.appendIntData(dataBuffer);
+				// Add the FPGA bank to the SVT bank
+				builder.addChild(svtBank, frameBank);
+			} catch (EvioException e) {
+				throw new RuntimeException(e);
+			}
+		}
+		
+		// Add the SVT bank to the Main EVIO bank
+		try {
+			builder.addChild(builder.getEvent(), svtBank);
+		} catch (EvioException e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+    @Override
+    public void writeData(EventHeader event, EventHeader toEvent) {
+        System.out.println("Not supported yet.");
+    }
+}

hps-java/src/main/java/org/lcsim/hps/evio
TestRunTriggeredReconToLcio.java added at 1.1
diff -N TestRunTriggeredReconToLcio.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ TestRunTriggeredReconToLcio.java	30 Jul 2012 23:31:45 -0000	1.1
@@ -0,0 +1,134 @@
+package org.lcsim.hps.evio;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.LinkedList;
+
+import java.util.List;
+import java.util.Queue;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.base.BaseLCSimEvent;
+import org.lcsim.hps.recon.ecal.HPSTriggerDriver;
+import org.lcsim.hps.util.ClockSingleton;
+import org.lcsim.util.Driver;
+import org.lcsim.util.lcio.LCIOWriter;
+
+/**
+ * This class takes raw data generated from MC and converts it to EVIO. The goal
+ * is to make this look like data which will come off the actual ET ring during
+ * the test run.
+ *
+ * @author Jeremy McCormick <[log in to unmask]>
+ */
+public class TestRunTriggeredReconToLcio extends Driver {
+
+    String rawCalorimeterHitCollectionName = "EcalReadoutHits";
+    String outputFile = "TestRunData.slcio";
+    private int eventsWritten = 0;
+//    HPSEcalConditions ecalIDConverter = null;
+    ECalHitWriter ecalWriter = null;
+    SVTHitWriter svtWriter = null;
+    List<HitWriter> writers = null;
+    LCIOWriter lcioWriter = null;
+    Queue<EventHeader> events = null;
+    private int ecalMode = EventConstants.ECAL_PULSE_INTEGRAL_MODE;
+
+    public TestRunTriggeredReconToLcio() {
+    }
+
+    public void setEcalMode(int ecalMode) {
+        this.ecalMode = ecalMode;
+        if (ecalMode != EventConstants.ECAL_WINDOW_MODE && ecalMode != EventConstants.ECAL_PULSE_MODE && ecalMode != EventConstants.ECAL_PULSE_INTEGRAL_MODE) {
+            throw new IllegalArgumentException("invalid mode " + ecalMode);
+        }
+        if (ecalWriter != null) {
+            ecalWriter.setMode(ecalMode);
+        }
+    }
+
+    public void setOutputFile(String outputFile) {
+        this.outputFile = outputFile;
+    }
+
+    public void setRawCalorimeterHitCollectionName(String rawCalorimeterHitCollectionName) {
+        this.rawCalorimeterHitCollectionName = rawCalorimeterHitCollectionName;
+        if (ecalWriter != null) {
+            ecalWriter.setHitCollectionName(rawCalorimeterHitCollectionName);
+        }
+    }
+
+    protected void startOfData() {
+        writers = new ArrayList<HitWriter>();
+
+        ecalWriter = new ECalHitWriter();
+        ecalWriter.setMode(ecalMode);
+        ecalWriter.setHitCollectionName(rawCalorimeterHitCollectionName);
+        writers.add(ecalWriter);
+
+        svtWriter = new SVTHitWriter();
+        writers.add(svtWriter);
+
+        try {
+            lcioWriter = new LCIOWriter(new File(outputFile));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        events = new LinkedList<EventHeader>();
+    }
+
+    protected void endOfData() {
+        System.out.println(this.getClass().getSimpleName() + " - wrote " + eventsWritten + " events in job.");
+        try {
+            lcioWriter.close();
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    protected void process(EventHeader event) {
+        if (HPSTriggerDriver.triggerBit()) {
+                System.out.println(ClockSingleton.getClock());
+
+            EventHeader lcsimEvent = new BaseLCSimEvent(0, eventsWritten, event.getDetectorName());
+            events.add(lcsimEvent);
+        }
+
+        writerLoop:
+        for (HitWriter hitWriter : writers) {
+            if (hitWriter.hasData(event)) {
+                System.out.println(hitWriter.getClass().getSimpleName() + ": writing data, event " + event.getEventNumber());
+                System.out.println(ClockSingleton.getClock());
+
+                for (EventHeader queuedEvent : events) {
+                    if (!hitWriter.hasData(queuedEvent)) {
+                        // Write data.
+                        hitWriter.writeData(event, queuedEvent);
+                        continue writerLoop;
+                    }
+                }
+
+                throw new RuntimeException("no queued events waiting for an " + hitWriter.getClass().getSimpleName() + " bank");
+            }
+        }
+
+        eventLoop:
+        while (!events.isEmpty()) {
+            EventHeader queuedEvent = events.peek();
+            for (HitWriter hitWriter : writers) {
+                if (!hitWriter.hasData(queuedEvent)) {
+                    break eventLoop;
+                }
+            }
+            System.out.println("writing filled LCIO event, event " + queuedEvent.getEventNumber());
+            events.poll();
+            // Write this event.
+            try {
+                lcioWriter.write(queuedEvent);
+                ++eventsWritten;
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+}
\ No newline at end of file

hps-java/src/main/java/org/lcsim/hps/evio
HitWriter.java added at 1.1
diff -N HitWriter.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HitWriter.java	30 Jul 2012 23:31:45 -0000	1.1
@@ -0,0 +1,25 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.lcsim.hps.evio;
+
+import org.jlab.coda.jevio.EventBuilder;
+import org.lcsim.event.EventHeader;
+
+/**
+ * Interface to be implemented by classes that convert LCSim data to recon data formats.
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: HitWriter.java,v 1.1 2012/07/30 23:31:45 meeg Exp $
+ */
+public interface HitWriter {
+
+	//checks whether the event contains data readable by this writer
+	public boolean hasData(EventHeader event);
+
+	//writes data from the event to the EVIO builder
+	public void writeData(EventHeader event, EventBuilder builder);
+
+	//writes data from the event to the EVIO builder
+	public void writeData(EventHeader event, EventHeader toEvent);
+}

hps-java/src/main/java/org/lcsim/hps/evio
TestRunReconToEvio.java 1.8 -> 1.9
diff -u -r1.8 -r1.9
--- TestRunReconToEvio.java	31 May 2012 00:28:18 -0000	1.8
+++ TestRunReconToEvio.java	30 Jul 2012 23:31:45 -0000	1.9
@@ -20,8 +20,8 @@
 	String evioOutputFile = "TestRunData.evio";
 	EventBuilder builder = null;
 	private int eventsWritten = 0;
-	ECalEvioWriter ecalWriter = null;
-	SVTEvioWriter svtWriter = null;
+	ECalHitWriter ecalWriter = null;
+	SVTHitWriter svtWriter = null;
 
 	public TestRunReconToEvio() {
 	}
@@ -44,10 +44,10 @@
 			throw new RuntimeException(e);
 		}
 
-		ecalWriter = new ECalEvioWriter();
+		ecalWriter = new ECalHitWriter();
 		ecalWriter.setHitCollectionName(rawCalorimeterHitCollectionName);
 
-		svtWriter = new SVTEvioWriter();
+		svtWriter = new SVTHitWriter();
 	}
 
 	protected void endOfData() {

hps-java/src/main/java/org/lcsim/hps/evio
TestRunTriggeredReconToEvio.java 1.13 -> 1.14
diff -u -r1.13 -r1.14
--- TestRunTriggeredReconToEvio.java	11 Jun 2012 22:54:48 -0000	1.13
+++ TestRunTriggeredReconToEvio.java	30 Jul 2012 23:31:45 -0000	1.14
@@ -9,6 +9,7 @@
 import org.jlab.coda.jevio.*;
 import org.lcsim.event.EventHeader;
 import org.lcsim.hps.recon.ecal.HPSEcalConditions;
+import org.lcsim.hps.recon.ecal.HPSTriggerDriver;
 import org.lcsim.util.Driver;
 
 /**
@@ -25,11 +26,10 @@
     String evioOutputFile = "TestRunData.evio";
     Queue<QueuedEtEvent> builderQueue = null;
     private int eventsWritten = 0;
-    public static boolean triggerBit = false;
     HPSEcalConditions ecalIDConverter = null;
-    ECalEvioWriter ecalWriter = null;
-    SVTEvioWriter svtWriter = null;
-    List<EvioWriter> writers = null;
+    ECalHitWriter ecalWriter = null;
+    SVTHitWriter svtWriter = null;
+    List<HitWriter> writers = null;
     private int ecalMode = EventConstants.ECAL_PULSE_INTEGRAL_MODE;
 
     public TestRunTriggeredReconToEvio() {
@@ -65,14 +65,14 @@
         
         writePrestartEvent();
 
-        writers = new ArrayList<EvioWriter>();
+        writers = new ArrayList<HitWriter>();
 
-        ecalWriter = new ECalEvioWriter();
+        ecalWriter = new ECalHitWriter();
         ecalWriter.setMode(ecalMode);
         ecalWriter.setHitCollectionName(rawCalorimeterHitCollectionName);
         writers.add(ecalWriter);
 
-        svtWriter = new SVTEvioWriter();
+        svtWriter = new SVTHitWriter();
         writers.add(svtWriter);
 
         builderQueue = new LinkedList<QueuedEtEvent>();
@@ -90,7 +90,7 @@
     }
 
     protected void process(EventHeader event) {
-        if (triggerBit) {
+        if (HPSTriggerDriver.triggerBit()) {
             // Make a new EVIO event.
             EventBuilder builder = new EventBuilder(EventConstants.PHYSICS_EVENT_TAG, DataType.BANK, EventConstants.EVENT_BANK_NUM);
             builderQueue.add(new QueuedEtEvent(builder, writers.size()));
@@ -106,12 +106,10 @@
             } catch (EvioException e) {
                 throw new RuntimeException(e);
             }
-
-            triggerBit = false;
         }
 
         for (int i = 0; i < writers.size(); i++) {
-            EvioWriter evioWriter = writers.get(i);
+            HitWriter evioWriter = writers.get(i);
             if (evioWriter.hasData(event)) {
                 System.out.println(evioWriter.getClass().getSimpleName() + ": writing data, event " + event.getEventNumber());
                 EventBuilder builder = null;

hps-java/src/main/java/org/lcsim/hps/evio
ECalEvioWriter.java removed after 1.8
diff -N ECalEvioWriter.java
--- ECalEvioWriter.java	7 Jun 2012 00:47:30 -0000	1.8
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,422 +0,0 @@
-package org.lcsim.hps.evio;
-
-import org.lcsim.event.RawTrackerHit;
-import org.jlab.coda.jevio.CompositeData;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.jlab.coda.jevio.DataType;
-import org.jlab.coda.jevio.EventBuilder;
-import org.jlab.coda.jevio.EvioBank;
-import org.jlab.coda.jevio.EvioException;
-import org.lcsim.event.EventHeader;
-import org.lcsim.event.EventHeader.LCMetaData;
-import org.lcsim.event.RawCalorimeterHit;
-import org.lcsim.geometry.IDDecoder;
-import org.lcsim.hps.recon.ecal.HPSEcalConditions;
-
-import static org.lcsim.hps.evio.EventConstants.ECAL_BANK_NUMBER;
-import static org.lcsim.hps.evio.EventConstants.ECAL_BOTTOM_BANK_TAG;
-import static org.lcsim.hps.evio.EventConstants.ECAL_PULSE_INTEGRAL_FORMAT;
-import static org.lcsim.hps.evio.EventConstants.ECAL_PULSE_INTEGRAL_BANK_TAG;
-import static org.lcsim.hps.evio.EventConstants.ECAL_TOP_BANK_TAG;
-
-/**
- *
- * @author Sho Uemura <[log in to unmask]>
- * @version $Id: ECalEvioWriter.java,v 1.8 2012/06/07 00:47:30 meeg Exp $
- */
-public class ECalEvioWriter implements EvioWriter {
-
-    private String hitCollectionName = "EcalReadoutHits";
-    private int mode = EventConstants.ECAL_PULSE_INTEGRAL_MODE;
-
-    public ECalEvioWriter() {
-    }
-
-    public void setHitCollectionName(String hitCollectionName) {
-        this.hitCollectionName = hitCollectionName;
-    }
-
-    public void setMode(int mode) {
-        this.mode = mode;
-        if (mode != EventConstants.ECAL_WINDOW_MODE && mode != EventConstants.ECAL_PULSE_MODE && mode != EventConstants.ECAL_PULSE_INTEGRAL_MODE) {
-            throw new IllegalArgumentException("invalid mode " + mode);
-        }
-    }
-
-    @Override
-    public boolean hasData(EventHeader event) {
-        switch (mode) {
-            case EventConstants.ECAL_WINDOW_MODE:
-                return event.hasCollection(RawTrackerHit.class, hitCollectionName);
-            case EventConstants.ECAL_PULSE_MODE:
-                return event.hasCollection(RawTrackerHit.class, hitCollectionName);
-            case EventConstants.ECAL_PULSE_INTEGRAL_MODE:
-                return event.hasCollection(RawCalorimeterHit.class, hitCollectionName);
-            default:
-                return false;
-        }
-    }
-
-    @Override
-    public void writeData(EventHeader event, EventBuilder builder) {
-        LCMetaData meta;
-        List<RawCalorimeterHit> rawCalorimeterHits;
-        List<RawTrackerHit> rawTrackerHits;
-        switch (mode) {
-            case EventConstants.ECAL_WINDOW_MODE:
-                rawTrackerHits = event.get(RawTrackerHit.class, hitCollectionName);
-                meta = event.getMetaData(rawTrackerHits);
-                writeWindowHits(meta, rawTrackerHits, builder);
-                break;
-            case EventConstants.ECAL_PULSE_MODE:
-                rawTrackerHits = event.get(RawTrackerHit.class, hitCollectionName);
-                meta = event.getMetaData(rawTrackerHits);
-                writePulseHits(meta, rawTrackerHits, builder);
-                break;
-            case EventConstants.ECAL_PULSE_INTEGRAL_MODE:
-                rawCalorimeterHits = event.get(RawCalorimeterHit.class, hitCollectionName);
-                meta = event.getMetaData(rawCalorimeterHits);
-                writeIntegralHits(meta, rawCalorimeterHits, builder);
-                break;
-            default:
-                break;
-        }
-    }
-
-    private void writeIntegralHits(LCMetaData meta, List<RawCalorimeterHit> rawCalorimeterHits, EventBuilder builder) {
-        System.out.println("Writing " + rawCalorimeterHits.size() + " ECal hits in integral format");
-
-        // Make two lists containing the hits from top and bottom sections, which go into separate EVIO data banks.
-        List<RawCalorimeterHit> topHits = new ArrayList<RawCalorimeterHit>();
-        List<RawCalorimeterHit> bottomHits = new ArrayList<RawCalorimeterHit>();
-        for (RawCalorimeterHit hit : rawCalorimeterHits) {
-            Long daqID = HPSEcalConditions.physicalToDaqID(hit.getCellID());
-            int crate = HPSEcalConditions.getCrate(daqID);
-            if (crate == ECAL_BOTTOM_BANK_TAG) {
-                bottomHits.add(hit);
-            } else {
-                topHits.add(hit);
-            }
-        }
-
-        // Write the two collections for top and bottom hits to separate EVIO banks.
-        writeIntegralHitCollection(topHits, meta, ECAL_TOP_BANK_TAG, builder);
-        writeIntegralHitCollection(bottomHits, meta, ECAL_BOTTOM_BANK_TAG, builder);
-    }
-
-    private void writeIntegralHitCollection(List<RawCalorimeterHit> hits, LCMetaData meta, int bankTag, EventBuilder builder) {
-        if (hits.isEmpty()) {
-            return;
-        }
-
-        // Get the ID decoder.
-        IDDecoder dec = meta.getIDDecoder();
-
-        // Make a hit map; allow for multiple hits in a crystal.
-        Map<Long, List<RawCalorimeterHit>> hitMap = new HashMap<Long, List<RawCalorimeterHit>>();
-        for (RawCalorimeterHit hit : hits) {
-            if (hitMap.get(hit.getCellID()) == null) {
-                hitMap.put(hit.getCellID(), new ArrayList<RawCalorimeterHit>());
-            }
-            List<RawCalorimeterHit> channelHits = hitMap.get(hit.getCellID());
-            channelHits.add(hit);
-        }
-
-        // Make map of slot number to hit IDs.
-        Map<Integer, List<Long>> slotMap = new HashMap<Integer, List<Long>>();
-        for (Long id : hitMap.keySet()) {
-            dec.setID(id);
-//			System.out.println(dec.getIDDescription());
-//			System.out.printf("ix = %d, iy = %d\n", dec.getValue("ix"), dec.getValue("iy"));
-            Long daqID = HPSEcalConditions.physicalToDaqID(id);
-//			System.out.printf("physicalID %d, daqID %d\n", id, daqID);
-            int slot = HPSEcalConditions.getSlot(daqID);
-            if (slotMap.get(slot) == null) {
-                slotMap.put(slot, new ArrayList<Long>());
-            }
-            List<Long> slots = slotMap.get(slot);
-            slots.add(id);
-        }
-
-        // Make a new bank for this crate.
-        EvioBank crateBank = new EvioBank(bankTag, DataType.BANK, ECAL_BANK_NUMBER);
-
-//        // New bank for this slot.
-//        EvioBank slotBank = new EvioBank(EventConstants.ECAL_PULSE_INTEGRAL_BANK_TAG, DataType.COMPOSITE, 0);
-//
-//        List<CompositeData> slotDataList = new ArrayList<CompositeData>();
-//
-        // Loop over the slots in the map.
-        for (int slot : slotMap.keySet()) {
-
-            // New bank for this slot.
-            EvioBank slotBank = new EvioBank(ECAL_PULSE_INTEGRAL_BANK_TAG, DataType.COMPOSITE, slot);
-
-            // Create composite data for this slot and its channels.
-            CompositeData.Data data = new CompositeData.Data();
-            data.addUchar((byte) slot); // slot #
-            data.addUint(0); // trigger #
-            data.addUlong(0); // timestamp    		
-            List<Long> hitIDs = slotMap.get(slot);
-            int nhits = hitIDs.size();
-            data.addN(nhits); // number of channels
-            for (Long id : hitIDs) {
-                dec.setID(id);
-                int channel = HPSEcalConditions.getChannel(HPSEcalConditions.physicalToDaqID(id));
-                data.addUchar((byte) channel); // channel #
-                List<RawCalorimeterHit> channelHits = hitMap.get(id);
-                data.addN(channelHits.size()); // number of pulses
-                for (RawCalorimeterHit hit : channelHits) {
-                    data.addUshort((short) hit.getTimeStamp()); // pulse time
-                    data.addUint((int) hit.getAmplitude()); // pulse integral
-                }
-            }
-
-            // Add CompositeData to bank.
-            try {
-                CompositeData cdata = new CompositeData(ECAL_PULSE_INTEGRAL_FORMAT, 1, data, ECAL_PULSE_INTEGRAL_BANK_TAG, 0);
-//                slotDataList.add(cdata);
-                slotBank.appendCompositeData(cdata);
-            } catch (EvioException e) {
-                throw new RuntimeException(e);
-            }
-
-            // Add slot bank to crate bank.
-            try {
-                builder.addChild(crateBank, slotBank);
-            } catch (EvioException e) {
-                throw new RuntimeException(e);
-            }
-        }
-        try {
-//            slotBank.appendCompositeData(slotDataList.toArray(new CompositeData[slotDataList.size()]));
-//            builder.addChild(crateBank, slotBank);
-            builder.addChild(builder.getEvent(), crateBank);
-        } catch (EvioException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    private void writePulseHits(LCMetaData meta, List<RawTrackerHit> rawCalorimeterHits, EventBuilder builder) {
-        System.out.println("Writing " + rawCalorimeterHits.size() + " ECal hits in pulse format");
-
-        // Make two lists containing the hits from top and bottom sections, which go into separate EVIO data banks.
-        List<RawTrackerHit> topHits = new ArrayList<RawTrackerHit>();
-        List<RawTrackerHit> bottomHits = new ArrayList<RawTrackerHit>();
-        for (RawTrackerHit hit : rawCalorimeterHits) {
-            Long daqID = HPSEcalConditions.physicalToDaqID(hit.getCellID());
-            int crate = HPSEcalConditions.getCrate(daqID);
-            if (crate == ECAL_BOTTOM_BANK_TAG) {
-                bottomHits.add(hit);
-            } else {
-                topHits.add(hit);
-            }
-        }
-
-        // Write the two collections for top and bottom hits to separate EVIO banks.
-        writePulseHitCollection(topHits, meta, ECAL_TOP_BANK_TAG, builder);
-        writePulseHitCollection(bottomHits, meta, ECAL_BOTTOM_BANK_TAG, builder);
-    }
-
-    private void writePulseHitCollection(List<RawTrackerHit> hits, LCMetaData meta, int bankTag, EventBuilder builder) {
-        if (hits.isEmpty()) {
-            return;
-        }
-
-        // Get the ID decoder.
-        IDDecoder dec = meta.getIDDecoder();
-
-        // Make a hit map; allow for multiple hits in a crystal.
-        Map<Long, List<RawTrackerHit>> hitMap = new HashMap<Long, List<RawTrackerHit>>();
-        for (RawTrackerHit hit : hits) {
-            if (hitMap.get(hit.getCellID()) == null) {
-                hitMap.put(hit.getCellID(), new ArrayList<RawTrackerHit>());
-            }
-            List<RawTrackerHit> channelHits = hitMap.get(hit.getCellID());
-            channelHits.add(hit);
-        }
-
-        // Make map of slot number to hit IDs.
-        Map<Integer, List<Long>> slotMap = new HashMap<Integer, List<Long>>();
-        for (Long id : hitMap.keySet()) {
-            dec.setID(id);
-//			System.out.println(dec.getIDDescription());
-//			System.out.printf("ix = %d, iy = %d\n", dec.getValue("ix"), dec.getValue("iy"));
-            Long daqID = HPSEcalConditions.physicalToDaqID(id);
-//			System.out.printf("physicalID %d, daqID %d\n", id, daqID);
-            int slot = HPSEcalConditions.getSlot(daqID);
-            if (slotMap.get(slot) == null) {
-                slotMap.put(slot, new ArrayList<Long>());
-            }
-            List<Long> slots = slotMap.get(slot);
-            slots.add(id);
-        }
-
-        // Make a new bank for this crate.
-        EvioBank crateBank = new EvioBank(bankTag, DataType.BANK, ECAL_BANK_NUMBER);
-
-//        // New bank for this slot.
-//        EvioBank slotBank = new EvioBank(EventConstants.ECAL_PULSE_BANK_TAG, DataType.COMPOSITE, 0);
-//
-//        List<CompositeData> slotDataList = new ArrayList<CompositeData>();
-//
-        // Loop over the slots in the map.
-        for (int slot : slotMap.keySet()) {
-
-            // New bank for this slot.
-            EvioBank slotBank = new EvioBank(EventConstants.ECAL_PULSE_BANK_TAG, DataType.COMPOSITE, slot);
-
-            // Create composite data for this slot and its channels.
-            CompositeData.Data data = new CompositeData.Data();
-            data.addUchar((byte) slot); // slot #
-            data.addUint(0); // trigger #
-            data.addUlong(0); // timestamp    		
-            List<Long> hitIDs = slotMap.get(slot);
-            int nhits = hitIDs.size();
-            data.addN(nhits); // number of channels
-            for (Long id : hitIDs) {
-                dec.setID(id);
-                int channel = HPSEcalConditions.getChannel(HPSEcalConditions.physicalToDaqID(id));
-                data.addUchar((byte) channel); // channel #
-                List<RawTrackerHit> channelHits = hitMap.get(id);
-                data.addN(channelHits.size()); // number of pulses
-                for (RawTrackerHit hit : channelHits) {
-                    data.addUchar((byte) channelHits.indexOf(hit)); // pulse number
-                    data.addN(hit.getADCValues().length); // number of samples
-                    for (short val : hit.getADCValues()) {
-                        data.addUshort(val); // sample
-                    }
-                }
-            }
-
-            // Add CompositeData to bank.
-            try {
-                CompositeData cdata = new CompositeData(EventConstants.ECAL_PULSE_FORMAT, 1, data, EventConstants.ECAL_PULSE_BANK_TAG, 0);
-//                slotDataList.add(cdata);
-                slotBank.appendCompositeData(cdata);
-            } catch (EvioException e) {
-                throw new RuntimeException(e);
-            }
-        }
-        try {
-//            slotBank.appendCompositeData(slotDataList.toArray(new CompositeData[slotDataList.size()]));
-//            builder.addChild(crateBank, slotBank);
-            builder.addChild(builder.getEvent(), crateBank);
-        } catch (EvioException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    private void writeWindowHits(LCMetaData meta, List<RawTrackerHit> rawCalorimeterHits, EventBuilder builder) {
-        System.out.println("Writing " + rawCalorimeterHits.size() + " ECal hits in window format");
-
-        // Make two lists containing the hits from top and bottom sections, which go into separate EVIO data banks.
-        List<RawTrackerHit> topHits = new ArrayList<RawTrackerHit>();
-        List<RawTrackerHit> bottomHits = new ArrayList<RawTrackerHit>();
-        for (RawTrackerHit hit : rawCalorimeterHits) {
-            Long daqID = HPSEcalConditions.physicalToDaqID(hit.getCellID());
-            int crate = HPSEcalConditions.getCrate(daqID);
-            if (crate == ECAL_BOTTOM_BANK_TAG) {
-                bottomHits.add(hit);
-            } else {
-                topHits.add(hit);
-            }
-        }
-
-        // Write the two collections for top and bottom hits to separate EVIO banks.
-        writeWindowHitCollection(topHits, meta, ECAL_TOP_BANK_TAG, builder);
-        writeWindowHitCollection(bottomHits, meta, ECAL_BOTTOM_BANK_TAG, builder);
-    }
-
-    private void writeWindowHitCollection(List<RawTrackerHit> hits, LCMetaData meta, int bankTag, EventBuilder builder) {
-        if (hits.isEmpty()) {
-            return;
-        }
-
-        // Get the ID decoder.
-        IDDecoder dec = meta.getIDDecoder();
-
-        // Make a hit map; allow for multiple hits in a crystal.
-        Map<Long, RawTrackerHit> hitMap = new HashMap<Long, RawTrackerHit>();
-        for (RawTrackerHit hit : hits) {
-            hitMap.put(hit.getCellID(), hit);
-        }
-
-        // Make map of slot number to hit IDs.
-        Map<Integer, List<Long>> slotMap = new HashMap<Integer, List<Long>>();
-        for (Long id : hitMap.keySet()) {
-            dec.setID(id);
-//			System.out.println(dec.getIDDescription());
-//			System.out.printf("ix = %d, iy = %d\n", dec.getValue("ix"), dec.getValue("iy"));
-            Long daqID = HPSEcalConditions.physicalToDaqID(id);
-//			System.out.printf("physicalID %d, daqID %d\n", id, daqID);
-            int slot = HPSEcalConditions.getSlot(daqID);
-            if (slotMap.get(slot) == null) {
-                slotMap.put(slot, new ArrayList<Long>());
-            }
-            List<Long> slots = slotMap.get(slot);
-            slots.add(id);
-        }
-
-        // Make a new bank for this crate.
-        EvioBank crateBank = new EvioBank(bankTag, DataType.BANK, ECAL_BANK_NUMBER);
-
-//        // New bank for this slot.
-//        EvioBank slotBank = new EvioBank(EventConstants.ECAL_WINDOW_BANK_TAG, DataType.COMPOSITE, 0);
-//
-//        List<CompositeData> slotDataList = new ArrayList<CompositeData>();
-//
-        // Loop over the slots in the map.
-        for (int slot : slotMap.keySet()) {
-
-            // New bank for this slot.
-            EvioBank slotBank = new EvioBank(EventConstants.ECAL_WINDOW_BANK_TAG, DataType.COMPOSITE, slot);
-
-            // Create composite data for this slot and its channels.
-            CompositeData.Data data = new CompositeData.Data();
-            data.addUchar((byte) slot); // slot #
-            data.addUint(0); // trigger #
-            data.addUlong(0); // timestamp    		
-            List<Long> hitIDs = slotMap.get(slot);
-            int nhits = hitIDs.size();
-            data.addN(nhits); // number of channels
-            for (Long id : hitIDs) {
-                dec.setID(id);
-                int channel = HPSEcalConditions.getChannel(HPSEcalConditions.physicalToDaqID(id));
-                data.addUchar((byte) channel); // channel #
-                RawTrackerHit hit = hitMap.get(id);
-                data.addN(hit.getADCValues().length); // number of samples
-                for (short val : hit.getADCValues()) {
-                    data.addUshort(val); // sample
-                }
-            }
-
-            // Add CompositeData to bank.
-            try {
-                CompositeData cdata = new CompositeData(EventConstants.ECAL_WINDOW_FORMAT, 1, data, EventConstants.ECAL_WINDOW_BANK_TAG, 0);
-                //                slotDataList.add(cdata);
-                slotBank.appendCompositeData(cdata);
-            } catch (EvioException e) {
-                throw new RuntimeException(e);
-            }
-
-            // Add slot bank to crate bank.
-            slotBank.setAllHeaderLengths();
-            try {
-                builder.addChild(crateBank, slotBank);
-            } catch (EvioException e) {
-                throw new RuntimeException(e);
-            }
-        }
-        try {
-//            slotBank.appendCompositeData(slotDataList.toArray(new CompositeData[slotDataList.size()]));
-//            builder.addChild(crateBank, slotBank);
-            builder.addChild(builder.getEvent(), crateBank);
-        } catch (EvioException e) {
-            throw new RuntimeException(e);
-        }
-    }
-}

hps-java/src/main/java/org/lcsim/hps/evio
SVTEvioWriter.java removed after 1.5
diff -N SVTEvioWriter.java
--- SVTEvioWriter.java	29 Apr 2012 17:07:18 -0000	1.5
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,69 +0,0 @@
-
-package org.lcsim.hps.evio;
-
-import static org.lcsim.hps.evio.EventConstants.SVT_BANK_NUMBER;
-import static org.lcsim.hps.evio.EventConstants.SVT_BANK_TAG;
-import static org.lcsim.hps.evio.EventConstants.SVT_TOTAL_NUMBER_FPGAS;
-
-import java.util.List;
-
-import org.jlab.coda.jevio.DataType;
-import org.jlab.coda.jevio.EventBuilder;
-import org.jlab.coda.jevio.EvioBank;
-import org.jlab.coda.jevio.EvioException;
-import org.lcsim.event.EventHeader;
-import org.lcsim.hps.recon.tracking.HPSSVTData;
-import org.lcsim.hps.recon.tracking.HPSSVTDataBuffer;
-
-/**
- *
- * @author Sho Uemura <[log in to unmask]>
- * @version $Id: SVTEvioWriter.java,v 1.5 2012/04/29 17:07:18 omoreno Exp $
- */
-public class SVTEvioWriter implements EvioWriter {
-	
-	boolean debug = false;
-
-	public SVTEvioWriter() {}
-
-	public boolean hasData(EventHeader event) {
-		List<List<HPSSVTData>> svtDataList = event.get(HPSSVTData.class);
-		return (svtDataList != null && svtDataList.size() > 0 && svtDataList.get(0) != null);
-	}
-
-	public void writeData(EventHeader event, EventBuilder builder) {
-						
-		// SVT container bank.
-		EvioBank svtBank = new EvioBank(SVT_BANK_TAG, DataType.BANK, SVT_BANK_NUMBER);
-		
-		// Iterate over FPGA's 0 - 6
-		for(int fpgaNumber = 0; fpgaNumber < SVT_TOTAL_NUMBER_FPGAS; fpgaNumber++){
-			
-			// Skip FPGA 7 for now
-			if(fpgaNumber == 7) continue;
-			
-			// Get the raw int data buffer for this FPGA.
-			int[] dataBuffer = HPSSVTDataBuffer.readoutBuffer(fpgaNumber);
-					
-			if(debug) System.out.println(this.getClass().getSimpleName() + ": FPGA " + fpgaNumber + " : Data size: " + dataBuffer.length);
-			
-			// Bank for this FPGA's frame data.
-			EvioBank frameBank = new EvioBank(fpgaNumber, DataType.UINT32, fpgaNumber);
-			try {
-				// Add the SVT data to the FPGA bank
-				frameBank.appendIntData(dataBuffer);
-				// Add the FPGA bank to the SVT bank
-				builder.addChild(svtBank, frameBank);
-			} catch (EvioException e) {
-				throw new RuntimeException(e);
-			}
-		}
-		
-		// Add the SVT bank to the Main EVIO bank
-		try {
-			builder.addChild(builder.getEvent(), svtBank);
-		} catch (EvioException e) {
-			throw new RuntimeException(e);
-		}		
-	}
-}

hps-java/src/main/java/org/lcsim/hps/evio
EvioWriter.java removed after 1.1
diff -N EvioWriter.java
--- EvioWriter.java	5 Apr 2012 20:20:28 -0000	1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,22 +0,0 @@
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-package org.lcsim.hps.evio;
-
-import org.jlab.coda.jevio.EventBuilder;
-import org.lcsim.event.EventHeader;
-
-/**
- * Interface to be implemented by classes that convert LCSim data to EVIO.
- * @author Sho Uemura <[log in to unmask]>
- * @version $Id: EvioWriter.java,v 1.1 2012/04/05 20:20:28 meeg Exp $
- */
-public interface EvioWriter {
-
-	//checks whether the event contains data readable by this writer
-	public boolean hasData(EventHeader event);
-
-	//writes data from the event to the EVIO builder
-	public void writeData(EventHeader event, EventBuilder builder);
-}

hps-java/src/main/java/org/lcsim/hps/util
ClockSingleton.java 1.4 -> 1.5
diff -u -r1.4 -r1.5
--- ClockSingleton.java	12 Jan 2012 00:26:16 -0000	1.4
+++ ClockSingleton.java	30 Jul 2012 23:31:45 -0000	1.5
@@ -10,7 +10,7 @@
  * A better solution might be to store absolute time and triggers in the event.
  *
  * @author Sho Uemura <[log in to unmask]>
- * @version $Id: ClockSingleton.java,v 1.4 2012/01/12 00:26:16 meeg Exp $
+ * @version $Id: ClockSingleton.java,v 1.5 2012/07/30 23:31:45 meeg Exp $
  */
 public class ClockSingleton {
 
@@ -43,17 +43,6 @@
 		_instance.dt = dt;
 	}
 
-	public static boolean triggered() {
-		return _instance.trigger;
-	}
-
-//    public static void setTrigger(boolean trigger) {
-//        _instance.trigger = trigger;
-//    }
-	public static void setTrigger() {
-		_instance.trigger = true;
-	}
-
 	public static void step() {
 		_instance.clock++;
 		_instance.trigger = false;

hps-java/src/main/resources/org/lcsim/hps/steering
HPSTestRunReconToLcio.lcsim added at 1.1
diff -N HPSTestRunReconToLcio.lcsim
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HPSTestRunReconToLcio.lcsim	30 Jul 2012 23:31:45 -0000	1.1
@@ -0,0 +1,85 @@
+<!-- 
+  Execute test run full recon and write the results as an EVIO file.
+-->
+<lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
+       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">
+       
+    <inputFiles>
+        <file>${inputFile}</file>
+    </inputFiles>
+    
+    <control>
+        <numberOfEvents>-1</numberOfEvents>
+    </control>
+
+    <execute>
+        <driver name="LoadCalibrations"/>
+        <driver name="HPSCalibrationDriver"/>   
+        <driver name="EcalReadout"/>
+        <driver name="EcalConverter"/>
+        <driver name="EcalClusterer"/>
+        <driver name="EcalTrigger"/>
+        <driver name="SVTSensorSetup"/>
+        <driver name="SVTReadout"/>
+        <driver name="ClockDriver"/>
+        <driver name="TestRunReconToLcio"/>
+        <driver name="CleanupDriver"/>    
+    </execute> 
+
+    <drivers>
+        <driver name="LoadCalibrations" type="org.lcsim.hps.recon.tracking.LoadCalibrationsDriver" />
+        <driver name="HPSCalibrationDriver" type="org.lcsim.hps.monitoring.HPSCalibrationDriver"/>   
+        <driver name="TestRunReconToLcio" type="org.lcsim.hps.evio.TestRunTriggeredReconToLcio">
+            <outputFile>${outputFile}</outputFile>
+        </driver>
+			
+        <driver name="EcalReadout"
+                        type="org.lcsim.hps.recon.ecal.HPSEcalFADCReadoutDriver">
+            <readoutPeriod>4.0</readoutPeriod>
+            <coincidenceWindow>2</coincidenceWindow>
+            <ecalName>Ecal</ecalName>
+            <ecalCollectionName>EcalHits</ecalCollectionName>
+            <ecalRawCollectionName>EcalRawHits</ecalRawCollectionName>
+            <triggerThreshold>80</triggerThreshold>
+            <readoutThreshold>50</readoutThreshold>
+        </driver>
+
+        <driver name="EcalConverter"
+                        type="org.lcsim.hps.recon.ecal.HPSEcalConverterDriver">
+            <ecalName>Ecal</ecalName>
+            <rawCollectionName>EcalRawHits</rawCollectionName>
+            <ecalCollectionName>EcalCorrectedHits</ecalCollectionName>
+            <scale>1</scale>
+        </driver>	
+
+        <driver name="EcalClusterer"
+                        type="org.lcsim.hps.recon.ecal.HPSEcalCTPClusterer">
+            <ecalName>Ecal</ecalName>
+            <ecalCollectionName>EcalCorrectedHits</ecalCollectionName>
+        </driver>
+
+        <driver name="EcalTrigger"
+                        type="org.lcsim.hps.recon.ecal.TestRunTriggerDriver">
+            <clusterCollectionName>EcalClusters</clusterCollectionName>
+            <ecalName>Ecal</ecalName>
+            <deadTime>10</deadTime>
+        </driver>	
+
+        <driver name="SVTSensorSetup"
+                        type="org.lcsim.hps.recon.tracking.HPSSVTSensorSetup">
+        </driver>
+		
+        <driver name="SVTReadout"
+                        type="org.lcsim.hps.recon.tracking.apv25.HPSSiSensorReadout">
+                            <addNoise>true</addNoise>
+        </driver>
+
+        <driver name="ClockDriver"
+                        type="org.lcsim.hps.util.ClockDriver">
+        </driver>
+        <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver">
+            <collectionNames>TrackerHits</collectionNames>
+        </driver> 
+    </drivers>
+</lcsim>
+	

hps-java/src/main/resources/org/lcsim/hps/steering
HPSTestRunRecon.lcsim removed after 1.2
diff -N HPSTestRunRecon.lcsim
--- HPSTestRunRecon.lcsim	1 Jun 2012 22:17:10 -0000	1.2
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,74 +0,0 @@
-
-<!--
-	Steering file to run the full test run reconstruction.
-	author:  Omar Moreno <[log in to unmask]>
-	version: $Id: HPSTestRunRecon.lcsim,v 1.2 2012/06/01 22:17:10 omoreno Exp $
--->
-
-<lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
-       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">
-       
-    <inputFiles>
-        <file>${inputFile}.slcio</file>
-    </inputFiles>
-
-	<execute>
-		<driver name="EcalReadout"/>
-		<driver name="EcalConverter"/>
-		<driver name="EcalClusterer"/>
-		<driver name="EcalTrigger"/>
-		<driver name="SVTSensorSetup"/>
-		<driver name="SVTDAQMapCreation"/>
-		<driver name="SVTReadout"/>
-		<driver name="ClockDriver"/>
-	</execute> 
-
-	<drivers>
-			
-		<driver name="EcalReadout"
-                        type="org.lcsim.hps.recon.ecal.HPSEcalFADCReadoutDriver">
-                    <readoutPeriod>4.0</readoutPeriod>
-                    <coincidenceWindow>2</coincidenceWindow>
-                    <ecalName>Ecal</ecalName>
-                    <ecalCollectionName>EcalHits</ecalCollectionName>
-                    <ecalRawCollectionName>EcalRawHits</ecalRawCollectionName>
-                    <threshold>0.05</threshold>
-                    <scale>0.08</scale>
-		</driver>
-
-		<driver name="EcalConverter"
-                        type="org.lcsim.hps.recon.ecal.HPSEcalConverterDriver">
-                    <ecalName>Ecal</ecalName>
-                    <rawCollectionName>EcalRawHits</rawCollectionName>
-                    <ecalCollectionName>EcalCorrectedHits</ecalCollectionName>
-                    <scale>0.08</scale>
-		</driver>	
-
-		<driver name="EcalClusterer"
-                        type="org.lcsim.hps.recon.ecal.HPSEcalCTPClusterer">
-                    <ecalName>Ecal</ecalName>
-                    <ecalCollectionName>EcalCorrectedHits</ecalCollectionName>
-		</driver>
-
-		<driver name="EcalTrigger"
-                        type="org.lcsim.hps.recon.ecal.HPSFADCTriggerDriver">
-                    <clusterCollectionName>EcalClusters</clusterCollectionName>
-                    <ecalName>Ecal</ecalName>
-                    <deadTime>10</deadTime>
-		</driver>	
-
-		<driver name="SVTSensorSetup"
-                        type="org.lcsim.hps.recon.tracking.HPSSVTSensorSetup">
-		</driver>
-
-		<driver name="SVTReadout"
-                        type="org.lcsim.hps.recon.tracking.apv25.HPSSiSensorReadout">
-		</driver>
-
-                <driver name="ClockDriver"
-                        type="org.lcsim.hps.util.ClockDriver">
-		</driver>
-
-	</drivers>
-</lcsim>
-	

hps-java/src/main/java/org/lcsim/hps/analysis/ecal
HPSEcalTriggerPlotsDriver.java 1.4 -> 1.5
diff -u -r1.4 -r1.5
--- HPSEcalTriggerPlotsDriver.java	9 Jan 2012 22:39:08 -0000	1.4
+++ HPSEcalTriggerPlotsDriver.java	30 Jul 2012 23:31:45 -0000	1.5
@@ -11,6 +11,7 @@
 import org.lcsim.geometry.IDDecoder;
 import org.lcsim.hps.recon.ecal.HPSEcalCluster;
 import org.lcsim.hps.recon.ecal.HPSRawCalorimeterHit;
+import org.lcsim.hps.recon.ecal.HPSTriggerDriver;
 import org.lcsim.hps.util.ClockSingleton;
 import org.lcsim.util.Driver;
 import org.lcsim.util.aida.AIDA;
@@ -19,7 +20,7 @@
  * Diagnostic plots for HPS ECal.
  *
  * @author Sho Uemura <[log in to unmask]>
- * @version $Id: HPSEcalTriggerPlotsDriver.java,v 1.4 2012/01/09 22:39:08 meeg Exp $
+ * @version $Id: HPSEcalTriggerPlotsDriver.java,v 1.5 2012/07/30 23:31:45 meeg Exp $
  */
 public class HPSEcalTriggerPlotsDriver extends Driver {
 
@@ -101,7 +102,7 @@
 			}
 		}
 
-		if (ClockSingleton.triggered()) {
+		if (HPSTriggerDriver.triggerBit()) {
 			for (HPSEcalCluster clus : clusters) {
 				HPSRawCalorimeterHit seedHit = (HPSRawCalorimeterHit) clus.getSeedHit();
 				IIdentifier id = seedHit.getIdentifier();

hps-java/src/main/java/org/lcsim/hps/analysis/ecal
HPSEcalPlotsDriver.java 1.14 -> 1.15
diff -u -r1.14 -r1.15
--- HPSEcalPlotsDriver.java	9 Dec 2011 23:40:21 -0000	1.14
+++ HPSEcalPlotsDriver.java	30 Jul 2012 23:31:45 -0000	1.15
@@ -23,6 +23,7 @@
 import org.lcsim.event.MCParticle;
 import org.lcsim.hps.recon.ecal.HPSEcalCluster;
 import org.lcsim.hps.recon.ecal.HPSRawCalorimeterHit;
+import org.lcsim.hps.recon.ecal.HPSTriggerDriver;
 import org.lcsim.hps.util.ClockSingleton;
 import org.lcsim.units.SystemOfUnits;
 import org.lcsim.util.Driver;
@@ -32,7 +33,7 @@
  * Diagnostic plots for HPS ECal.
  *
  * @author Jeremy McCormick <[log in to unmask]>
- * @version $Id: HPSEcalPlotsDriver.java,v 1.14 2011/12/09 23:40:21 meeg Exp $
+ * @version $Id: HPSEcalPlotsDriver.java,v 1.15 2012/07/30 23:31:45 meeg Exp $
  */
 public class HPSEcalPlotsDriver extends Driver {
 
@@ -190,7 +191,7 @@
     }
 
     public void process(EventHeader event) {
-        if (ClockSingleton.triggered()) numTriggers++;
+        if (HPSTriggerDriver.triggerBit()) numTriggers++;
 
         // MCParticles
         List<MCParticle> mcparticles = event.get(MCParticle.class).get(0);
@@ -292,7 +293,7 @@
         int nhits100MeV = 0;
         int nhitsOver100MeV = 0;
 
-        if (ClockSingleton.triggered() && numTriggers <= 100) {
+        if (HPSTriggerDriver.triggerBit() && numTriggers <= 100) {
             hitXYPlot = aida.histogram2D(
                     ecalCollectionName + " : hit E, event " + String.format("%07d", ClockSingleton.getClock()),
                     47, -23.5, 23.5, 11, -5.5, 5.5);
@@ -346,7 +347,7 @@
             crystalXPlot.fill(ix);
             crystalYPlot.fill(iy);
             crystalXYPlot.fill(ix, iy);
-            if (ClockSingleton.triggered() && numTriggers <= 100)
+            if (HPSTriggerDriver.triggerBit() && numTriggers <= 100)
                 hitXYPlot.fill(ix, iy, eraw);
         }
 

hps-java/sandbox
HPSTestRunDriver.java added at 1.1
diff -N HPSTestRunDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HPSTestRunDriver.java	30 Jul 2012 23:31:45 -0000	1.1
@@ -0,0 +1,104 @@
+
+package org.lcsim.hps.users.omoreno;
+
+//--- Java ---//
+import org.lcsim.hps.util.HPSTrigger;
+import java.util.ArrayList;
+import java.util.List;
+
+
+//--- LCSim ---//
+import org.lcsim.event.EventHeader;
+import org.lcsim.util.Driver;
+
+//--- HPS Java ---//
+import org.lcsim.hps.recon.tracking.SiTrackerSpectrometerSensorSetup;
+//import org.lcsim.hps.users.omoreno.tracking.HPSTrackerHitDriverL3;
+//import org.lcsim.hps.recon.tracking.HPSAPV25.HPSSVTHitDriver;
+import org.lcsim.hps.util.ClockSingleton;
+
+/**
+ *
+ * @author Omar Moreno <[log in to unmask]>
+ * @version $Id: HPSTestRunDriver.java,v 1.1 2012/07/30 23:31:45 meeg Exp $
+ */
+public class HPSTestRunDriver extends Driver {
+
+    HPSEcalFlashTrigger ecal;
+    
+    List<int[]>   stereo_pairs = new ArrayList();    // List of stereo pairs
+    List<Integer> pass_layers  = new ArrayList();    // 
+
+    // Set up  some detector attributes 
+    int    nlayers = 10;      // Number of tracking layers
+    double b_field = 0.5;     // [Tesla] Magnetic field strength
+
+    // Strategy file prefix
+    String strategy_prefix 
+        = "/home/omoreno/workdir/hps/software/hps-java/src/main/resources/";
+   
+   // Tracking strategy
+   String strategy   = "HPS-Test-1pt3.xml";
+    
+   
+   /**
+     * Constructor
+     */
+    public HPSTestRunDriver( )
+    {
+        // Instantiate the ECal reconstruction
+        HPSEcalFlashTrigger ecalTrigger = new HPSEcalFlashTrigger();         
+
+        // Instantiate the HPS trigger
+        HPSTrigger hpsTrig = new HPSTrigger();
+
+        // Configure the tracker geometry
+        ConfigTracker( "HPS Test Run" );
+
+        //
+        //HPSSVTHitDriver hitDriver = new HPSSVTHitDriver();
+
+        //--- Add Drivers ---//
+        add(ecalTrigger);
+        add(hpsTrig);
+        // Configure the SVT sensors
+        add( new SiTrackerSpectrometerSensorSetup( "Tracker" ) );
+//        add(hitDriver);        
+
+//       HPSTrackerHitDriverL3 hps_thd = new HPSTrackerHitDriverL3();
+//       add( hps_thd );
+    }
+    
+    public void process( EventHeader event )
+    {
+        super.process(event);
+        ClockSingleton.step();
+    }
+    
+    /**
+     * Configure the SVT tracker geometry
+     */
+    private void ConfigTracker ( String detector ) {
+    
+        System.out.println("Configuring the HPS SVT geometry ... ");
+
+        if( detector.equals( "HPS Test Run" ) ) {
+
+            System.out.println( "Using HPS test run geometry" );
+      
+      	// Set the stereo pairs for the test tracker
+      	int[] pair1 = { 1, 2  };
+      	int[] pair2 = { 3, 4  };
+      	int[] pair3 = { 5, 6  };
+      	int[] pair4 = { 7, 8  };
+      	int[] pair5 = { 9, 10 };
+
+      	// Add the pairs to the stereo_pairs list  to be processed
+      	stereo_pairs.add( pair1 );
+      	stereo_pairs.add( pair2 );
+      	stereo_pairs.add( pair3 );
+      	stereo_pairs.add( pair4 );
+      	stereo_pairs.add( pair5 );      
+        }
+    }
+}

hps-java/sandbox
HPSEcalFlashTrigger.java added at 1.1
diff -N HPSEcalFlashTrigger.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HPSEcalFlashTrigger.java	30 Jul 2012 23:31:45 -0000	1.1
@@ -0,0 +1,411 @@
+package org.lcsim.hps.users.omoreno;
+
+//--- Java ---//
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+//--- org.lcsim ---//
+import org.lcsim.event.Cluster;
+import org.lcsim.event.EventHeader;
+import org.lcsim.hps.recon.ecal.HPSEcalClusterer;
+import org.lcsim.hps.util.ClockSingleton;
+import org.lcsim.util.Driver;
+
+
+/**
+ * Heavy Photon Search ECal Flash Trigger
+ *
+ * @author Omar Moreno <[log in to unmask]>
+ * @version $Id: HPSEcalFlashTrigger.java,v 1.1 2012/07/30 23:31:45 meeg Exp $
+ */
+public class HPSEcalFlashTrigger extends Driver
+{
+    // The HPS ECal Clusterer
+    HPSEcalClusterer ecalClusterer;
+
+    String ecalRawHitsCollectionName = "EcalHits";
+    String ecalClusterCollectionName = "EcalClusters";
+
+    // A list to contain all cluster pairs in an event
+    List<Cluster[]> clusterPairs;
+
+    int nTriggers;
+    int totalEvents;
+
+    private double clusterEnergyHigh = 1.85; // GeV
+    private double clusterEnergyLow = .1;    // GeV
+    private double energySumThreshold = 2;  // GeV
+    private double energyDifferenceThreshold = 1.5; // GeV
+    private double maxCoplanarityAngle = 35; // degrees
+
+
+    /**
+     * Constructor
+     */
+    public HPSEcalFlashTrigger( )
+    {
+        // Instantiate the HPS Clusterer
+        ecalClusterer = new HPSEcalClusterer();
+        ecalClusterer.setClusterCollectionName( ecalClusterCollectionName );
+        ecalClusterer.setEcalCollectionName( ecalRawHitsCollectionName );
+        ecalClusterer.setEcalName( "Ecal" );
+        add( ecalClusterer );
+
+        clusterPairs = new ArrayList<Cluster[]>();
+    }
+
+    @Override
+    public void process(EventHeader event)
+    {
+
+        super.process(event);
+        totalEvents +=1;
+
+        // Get a list of all clusters found by the clusterer in the event
+        List< Cluster > ecalClusters
+            = event.get(Cluster.class, ecalClusterCollectionName);
+
+        //--- Apply Trigger Cuts ---//
+
+        // Require that the event have at least two clusters in opposite
+        // quadrants
+        if ( !getClusterPairs( ecalClusters ) ) return;
+
+        // Iterate through all cluster pairs present in the event.  If at least
+        // one of the cluster pairs satisfies all of the trigger conditions,
+        // a trigger signal is sent to all other detectors.
+        for( Iterator it = clusterPairs.iterator(); it.hasNext(); ){
+
+            Cluster[] clusterPair = (Cluster[]) it.next();
+
+            // Require the componets of a cluster pair to have an energy in
+            // the range of 100 MeV to 1.85 GeV
+            if( !clusterECut( clusterPair ) )  continue;
+
+            // Require the sum of the energies of the components of the
+            // cluster pair to be less than the
+            // (Beam Energy)*(Sampling Fraction) ( 2 GeV for the Test Run )
+            if( !energySum( clusterPair ) )  continue;
+
+            // Require the difference in energy of the components of the
+            // cluster pair to be less than 1.5 GeV
+            if( !energyDifference( clusterPair ) ) continue;
+
+            // Apply a low energy cluster vs. distance cut of the form
+            // E_low + .0032 GeV/mm < .8 GeV
+            if( !energyDistanceCut( clusterPair ) ) continue;
+
+            // Require that the two clusters are coplanar with the beam within
+            // 35 degrees
+            if( !coplanarityCut( clusterPair ) ) continue;
+
+            // If all cuts are pased, send a trigger signal
+//            sendTrigger( );
+
+            // Increment number of triggers
+            nTriggers +=1;
+
+            // Only require that at least one cluster pair passes all the
+            // trigger cuts
+            break;
+        }
+    }
+
+    /**
+     * Run before any processes are called
+     */
+    @Override
+    public void startOfData()
+    {
+        nTriggers = 0;
+        totalEvents = 0;
+    }
+
+    /**
+     * Run after all data has been processed
+     */
+    @Override
+    public void endOfData( ) {
+
+        System.out.println( "Total Number of Triggers: " + nTriggers );
+        System.out.println( "The Trigger Rate: "
+            + ( (( double )nTriggers/( double )totalEvents))*100. +  "%" );
+    }
+
+    /**
+     * Get a list of all unique cluster pairs in the event
+     *
+     * @param ecalClusters : List of ECal clusters
+     * @return true if there are any cluster pairs
+     */
+    public boolean getClusterPairs(List<Cluster> ecalClusters)
+    {
+
+        // Check to see if there are at least two clusters
+        if (ecalClusters.size() < 2) return false;
+
+        // Create a list which will hold all neighboring cluster to the cluster
+        // of interest
+        List< Cluster> ecalClusterNeighbors = new ArrayList< Cluster >();
+        for (Cluster ecalCluster : ecalClusters) {
+            ecalClusterNeighbors.add(ecalCluster);
+        }
+
+        // Clear the list of cluster pairs
+        clusterPairs.clear();
+
+        for ( Cluster ecalCluster : ecalClusters ) {
+
+            // Get the quadrant which contains the ECal cluster of interest
+            int ecalClusterQuad = getECalQuadrant(ecalCluster);
+
+            // Create a list of neighbors to the cluster of interest
+            ecalClusterNeighbors.remove(ecalCluster);
+
+            // Loop over all neigboring clusters and check to see if there is
+            // any which lie in opposing quadrants to the cluster of interest.
+            // If so, add them to the list of cluster pairs
+            for (Cluster ecalClusterNeighbor : ecalClusterNeighbors ){
+
+                switch (ecalClusterQuad) {
+                    case 1:
+                        if ( getECalQuadrant( ecalClusterNeighbor ) == 3 ){
+                            Cluster[] clusterPair
+                                = { ecalCluster, ecalClusterNeighbor };
+                            clusterPairs.add( clusterPair );
+                        }
+                        break;
+                    case 2:
+                        if ( getECalQuadrant( ecalClusterNeighbor ) == 4 ){
+                            Cluster[] clusterPair
+                                = { ecalCluster, ecalClusterNeighbor };
+                            clusterPairs.add( clusterPair );
+                        }
+                        break;
+                    case 3:
+                        if ( getECalQuadrant( ecalClusterNeighbor ) == 1 ) {
+                            Cluster[] clusterPair
+                                = { ecalCluster, ecalClusterNeighbor };
+                            clusterPairs.add(clusterPair);
+                        }
+                        break;
+                    case 4:
+                        if ( getECalQuadrant( ecalClusterNeighbor ) == 2 ) {
+                            Cluster[] clusterPair
+                                = { ecalCluster, ecalClusterNeighbor };
+                            clusterPairs.add(clusterPair);
+                        }
+                        break;
+                }
+            }
+        }
+
+        return !clusterPairs.isEmpty();
+    }
+
+    /**
+     * Checks if the ECal clusters making up a cluster pair lie above the low
+     * energy threshold and below the high energy threshold
+     *
+     * @param clusterPair : pair of clusters
+     * @return  true if a pair is found, false otherwise
+     */
+    public boolean clusterECut( Cluster[] clusterPair )
+    {
+
+        if(           clusterPair[ 0 ].getEnergy( ) < clusterEnergyHigh
+                && clusterPair[ 1 ].getEnergy( ) < clusterEnergyHigh
+                && clusterPair[ 0 ].getEnergy( ) > clusterEnergyLow
+                && clusterPair[ 1 ].getEnergy( ) > clusterEnergyLow  )
+            return true;
+
+        return false;
+    }
+
+    /**
+     *  Returns the quadrant which contains the ECal cluster
+     *
+     * @param ecalCluster : ECal cluster
+     * @return Quadrant number
+     */
+    public int getECalQuadrant(Cluster ecalCluster)
+    {
+        double[] clusterPosition = ecalCluster.getPosition();
+
+        // Quadrant 1
+        if(( clusterPosition[0] > 0.0 ) && ( clusterPosition[1] > 0.0 ))
+            return 1;
+        //Quadrant 2
+        if(( clusterPosition[0] < 0.0 ) && ( clusterPosition[1] > 0.0 ))
+            return 2;
+        // Quadrant 3
+        if(( clusterPosition[0] < 0.0 ) && ( clusterPosition[1] < 0.0 ))
+            return 3;
+        // Quadrant 4
+        return 4;
+    }
+
+    /**
+     * Checks if the sum of the energies of ECal clusters making up a cluster
+     * pair is below an energy sum threshold
+     *
+     * @param clusterPair : pair of clusters
+     * @return true if a pair is found, false otherwise
+     */
+    public boolean energySum( Cluster[] clusterPair )
+    {
+        double clusterESum = clusterPair[ 0 ].getEnergy()
+               + clusterPair[ 1 ].getEnergy();
+            if( clusterESum < energySumThreshold  ) return true;
+
+            return false;
+    }
+
+    /**
+     * Checks if the energy difference between the ECal clusters making up
+     * a cluster pair is below an energy difference threshold
+     *
+     * @param clusterPair : pair of clusters
+     * @return  true if pair is found, false otherwise
+     */
+    public boolean energyDifference(  Cluster[] clusterPair )
+    {
+        double clusterEDifference
+               = Math.abs( clusterPair[ 0 ].getEnergy( )
+                    - clusterPair[ 1 ].getEnergy() );
+
+        if( clusterEDifference <  energyDifferenceThreshold )
+            return true;
+
+        return false;
+
+    }
+
+    /**
+     * Require that the distance from the beam of the lowest energy cluster
+     * in a cluster pair satisfies the following
+     * E_low + d_b*.0032 GeV/mm < .8 GeV
+     *
+     * @param clusterPiar : pair of clusters
+     * @return  true if pair is found, false otherwise
+     */
+    public boolean energyDistanceCut( Cluster[] clusterPair )
+    {
+        Cluster lowEnergyCluster;
+
+        // Obtain the lowest energy cluster
+        if( clusterPair[0].getEnergy() < clusterPair[1].getEnergy() )
+            lowEnergyCluster = clusterPair[0];
+       else lowEnergyCluster = clusterPair[1];
+
+        // Calculate its position
+        double lowEClusterPosition
+           = Math.sqrt( Math.pow( lowEnergyCluster.getPosition()[0], 2)
+                + Math.pow( lowEnergyCluster.getPosition()[1], 2) );
+
+        double clusterDistvsE
+                = lowEnergyCluster.getEnergy() + lowEClusterPosition*(0.0032);
+
+        if( clusterDistvsE > .8  /* GeV */ ) return true;
+
+        return false;
+    }
+
+    /**
+     * Checks if a cluster pair is coplanar to the beam within a given
+     * angle
+     *
+     * @param clusterPair : pair of clusters
+     * @return true if pair is found, false otherwise
+     */
+    public boolean coplanarityCut( Cluster[] clusterPair  )
+    {
+        // Find the distance of both clusters from the origin
+        double cluster1Dist
+               = Math.sqrt( Math.pow( clusterPair[0].getPosition()[0],2 )
+                    + Math.pow( clusterPair[0].getPosition()[1],2) );
+        double cluster2Dist
+               = Math.sqrt( Math.pow( clusterPair[1].getPosition()[0],2 )
+                    + Math.pow( clusterPair[1].getPosition()[1],2) );
+
+        // Calculate the dot product between the distance vectors of
+        // each cluster in the cluster pair
+        double clusterDot
+           = clusterPair[0].getPosition()[0]*clusterPair[1].getPosition()[0]
+              +clusterPair[0].getPosition()[1]*clusterPair[1].getPosition()[1];
+
+        // Find the angle between clusters in the pair
+        double cosphi = clusterDot/( cluster1Dist*cluster2Dist );
+        double phi = Math.toDegrees( Math.acos( cosphi ) );
+
+        if( (180 - phi ) < maxCoplanarityAngle ) return true;
+
+        return false;
+
+    }
+
+    /**
+     * Sends an ECal trigger signal
+     */
+    public void sendTrigger()
+    {
+        ClockSingleton.setTrigger();
+    }
+
+    /**
+     * Set the upper energy cluster threshold
+     *
+     * @param highThreshold : Threshold in GeV
+     */
+    public void setUpperETheshold( double highThreshold )
+    {
+
+        clusterEnergyHigh = highThreshold;
+    }
+
+    /**
+     * Set the lower energy cluster threshold
+     *
+     * @param lowThrehold : Threshold in GeV
+     */
+    public void setLowerEThreshold( double lowThreshold )
+    {
+
+        clusterEnergyLow = lowThreshold;
+    }
+
+    /**
+     * Set the threshold on the sum of the two cluster energies
+     *
+     * @param sumThreshold : Threshold in GeV
+     */
+    public void setESumThreshold( double sumThreshold )
+    {
+
+        energySumThreshold = sumThreshold;
+    }
+
+    /**
+     * Set the threshold on the energy difference between two cluster energies
+     *
+     * @param diffThreshold : Threshold in GeV
+     */
+    public void setEDiffThrehold( double diffThreshold )
+    {
+
+        energyDifferenceThreshold = diffThreshold;
+    }
+
+    /**
+     * Set the maximum angle required to achieve coplanarity between the
+     * clusters and the beam
+     *
+     * @param maxCoplanarity : Maximum angle in degrees
+     */
+    public void setMaxCoplanarityAngle( double maxCoplanarity )
+    {
+        maxCoplanarityAngle = maxCoplanarity;
+    }
+
+}

hps-java/sandbox
HPSTestRunRecon.lcsim added at 1.1
diff -N HPSTestRunRecon.lcsim
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HPSTestRunRecon.lcsim	30 Jul 2012 23:31:45 -0000	1.1
@@ -0,0 +1,74 @@
+
+<!--
+	Steering file to run the full test run reconstruction.
+	author:  Omar Moreno <[log in to unmask]>
+	version: $Id: HPSTestRunRecon.lcsim,v 1.1 2012/07/30 23:31:45 meeg Exp $
+-->
+
+<lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
+       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">
+       
+    <inputFiles>
+        <file>${inputFile}.slcio</file>
+    </inputFiles>
+
+	<execute>
+		<driver name="EcalReadout"/>
+		<driver name="EcalConverter"/>
+		<driver name="EcalClusterer"/>
+		<driver name="EcalTrigger"/>
+		<driver name="SVTSensorSetup"/>
+		<driver name="SVTDAQMapCreation"/>
+		<driver name="SVTReadout"/>
+		<driver name="ClockDriver"/>
+	</execute> 
+
+	<drivers>
+			
+		<driver name="EcalReadout"
+                        type="org.lcsim.hps.recon.ecal.HPSEcalFADCReadoutDriver">
+                    <readoutPeriod>4.0</readoutPeriod>
+                    <coincidenceWindow>2</coincidenceWindow>
+                    <ecalName>Ecal</ecalName>
+                    <ecalCollectionName>EcalHits</ecalCollectionName>
+                    <ecalRawCollectionName>EcalRawHits</ecalRawCollectionName>
+                    <threshold>0.05</threshold>
+                    <scale>0.08</scale>
+		</driver>
+
+		<driver name="EcalConverter"
+                        type="org.lcsim.hps.recon.ecal.HPSEcalConverterDriver">
+                    <ecalName>Ecal</ecalName>
+                    <rawCollectionName>EcalRawHits</rawCollectionName>
+                    <ecalCollectionName>EcalCorrectedHits</ecalCollectionName>
+                    <scale>0.08</scale>
+		</driver>	
+
+		<driver name="EcalClusterer"
+                        type="org.lcsim.hps.recon.ecal.HPSEcalCTPClusterer">
+                    <ecalName>Ecal</ecalName>
+                    <ecalCollectionName>EcalCorrectedHits</ecalCollectionName>
+		</driver>
+
+		<driver name="EcalTrigger"
+                        type="org.lcsim.hps.recon.ecal.HPSFADCTriggerDriver">
+                    <clusterCollectionName>EcalClusters</clusterCollectionName>
+                    <ecalName>Ecal</ecalName>
+                    <deadTime>10</deadTime>
+		</driver>	
+
+		<driver name="SVTSensorSetup"
+                        type="org.lcsim.hps.recon.tracking.HPSSVTSensorSetup">
+		</driver>
+
+		<driver name="SVTReadout"
+                        type="org.lcsim.hps.recon.tracking.apv25.HPSSiSensorReadout">
+		</driver>
+
+                <driver name="ClockDriver"
+                        type="org.lcsim.hps.util.ClockDriver">
+		</driver>
+
+	</drivers>
+</lcsim>
+	

hps-java/src/main/java/org/lcsim/hps/users/omoreno
HPSEcalFlashTrigger.java removed after 1.1
diff -N HPSEcalFlashTrigger.java
--- HPSEcalFlashTrigger.java	29 Apr 2012 02:10:05 -0000	1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,411 +0,0 @@
-package org.lcsim.hps.users.omoreno;
-
-//--- Java ---//
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-//--- org.lcsim ---//
-import org.lcsim.event.Cluster;
-import org.lcsim.event.EventHeader;
-import org.lcsim.hps.recon.ecal.HPSEcalClusterer;
-import org.lcsim.hps.util.ClockSingleton;
-import org.lcsim.util.Driver;
-
-
-/**
- * Heavy Photon Search ECal Flash Trigger
- *
- * @author Omar Moreno <[log in to unmask]>
- * @version $Id: HPSEcalFlashTrigger.java,v 1.1 2012/04/29 02:10:05 meeg Exp $
- */
-public class HPSEcalFlashTrigger extends Driver
-{
-    // The HPS ECal Clusterer
-    HPSEcalClusterer ecalClusterer;
-
-    String ecalRawHitsCollectionName = "EcalHits";
-    String ecalClusterCollectionName = "EcalClusters";
-
-    // A list to contain all cluster pairs in an event
-    List<Cluster[]> clusterPairs;
-
-    int nTriggers;
-    int totalEvents;
-
-    private double clusterEnergyHigh = 1.85; // GeV
-    private double clusterEnergyLow = .1;    // GeV
-    private double energySumThreshold = 2;  // GeV
-    private double energyDifferenceThreshold = 1.5; // GeV
-    private double maxCoplanarityAngle = 35; // degrees
-
-
-    /**
-     * Constructor
-     */
-    public HPSEcalFlashTrigger( )
-    {
-        // Instantiate the HPS Clusterer
-        ecalClusterer = new HPSEcalClusterer();
-        ecalClusterer.setClusterCollectionName( ecalClusterCollectionName );
-        ecalClusterer.setEcalCollectionName( ecalRawHitsCollectionName );
-        ecalClusterer.setEcalName( "Ecal" );
-        add( ecalClusterer );
-
-        clusterPairs = new ArrayList<Cluster[]>();
-    }
-
-    @Override
-    public void process(EventHeader event)
-    {
-
-        super.process(event);
-        totalEvents +=1;
-
-        // Get a list of all clusters found by the clusterer in the event
-        List< Cluster > ecalClusters
-            = event.get(Cluster.class, ecalClusterCollectionName);
-
-        //--- Apply Trigger Cuts ---//
-
-        // Require that the event have at least two clusters in opposite
-        // quadrants
-        if ( !getClusterPairs( ecalClusters ) ) return;
-
-        // Iterate through all cluster pairs present in the event.  If at least
-        // one of the cluster pairs satisfies all of the trigger conditions,
-        // a trigger signal is sent to all other detectors.
-        for( Iterator it = clusterPairs.iterator(); it.hasNext(); ){
-
-            Cluster[] clusterPair = (Cluster[]) it.next();
-
-            // Require the componets of a cluster pair to have an energy in
-            // the range of 100 MeV to 1.85 GeV
-            if( !clusterECut( clusterPair ) )  continue;
-
-            // Require the sum of the energies of the components of the
-            // cluster pair to be less than the
-            // (Beam Energy)*(Sampling Fraction) ( 2 GeV for the Test Run )
-            if( !energySum( clusterPair ) )  continue;
-
-            // Require the difference in energy of the components of the
-            // cluster pair to be less than 1.5 GeV
-            if( !energyDifference( clusterPair ) ) continue;
-
-            // Apply a low energy cluster vs. distance cut of the form
-            // E_low + .0032 GeV/mm < .8 GeV
-            if( !energyDistanceCut( clusterPair ) ) continue;
-
-            // Require that the two clusters are coplanar with the beam within
-            // 35 degrees
-            if( !coplanarityCut( clusterPair ) ) continue;
-
-            // If all cuts are pased, send a trigger signal
-//            sendTrigger( );
-
-            // Increment number of triggers
-            nTriggers +=1;
-
-            // Only require that at least one cluster pair passes all the
-            // trigger cuts
-            break;
-        }
-    }
-
-    /**
-     * Run before any processes are called
-     */
-    @Override
-    public void startOfData()
-    {
-        nTriggers = 0;
-        totalEvents = 0;
-    }
-
-    /**
-     * Run after all data has been processed
-     */
-    @Override
-    public void endOfData( ) {
-
-        System.out.println( "Total Number of Triggers: " + nTriggers );
-        System.out.println( "The Trigger Rate: "
-            + ( (( double )nTriggers/( double )totalEvents))*100. +  "%" );
-    }
-
-    /**
-     * Get a list of all unique cluster pairs in the event
-     *
-     * @param ecalClusters : List of ECal clusters
-     * @return true if there are any cluster pairs
-     */
-    public boolean getClusterPairs(List<Cluster> ecalClusters)
-    {
-
-        // Check to see if there are at least two clusters
-        if (ecalClusters.size() < 2) return false;
-
-        // Create a list which will hold all neighboring cluster to the cluster
-        // of interest
-        List< Cluster> ecalClusterNeighbors = new ArrayList< Cluster >();
-        for (Cluster ecalCluster : ecalClusters) {
-            ecalClusterNeighbors.add(ecalCluster);
-        }
-
-        // Clear the list of cluster pairs
-        clusterPairs.clear();
-
-        for ( Cluster ecalCluster : ecalClusters ) {
-
-            // Get the quadrant which contains the ECal cluster of interest
-            int ecalClusterQuad = getECalQuadrant(ecalCluster);
-
-            // Create a list of neighbors to the cluster of interest
-            ecalClusterNeighbors.remove(ecalCluster);
-
-            // Loop over all neigboring clusters and check to see if there is
-            // any which lie in opposing quadrants to the cluster of interest.
-            // If so, add them to the list of cluster pairs
-            for (Cluster ecalClusterNeighbor : ecalClusterNeighbors ){
-
-                switch (ecalClusterQuad) {
-                    case 1:
-                        if ( getECalQuadrant( ecalClusterNeighbor ) == 3 ){
-                            Cluster[] clusterPair
-                                = { ecalCluster, ecalClusterNeighbor };
-                            clusterPairs.add( clusterPair );
-                        }
-                        break;
-                    case 2:
-                        if ( getECalQuadrant( ecalClusterNeighbor ) == 4 ){
-                            Cluster[] clusterPair
-                                = { ecalCluster, ecalClusterNeighbor };
-                            clusterPairs.add( clusterPair );
-                        }
-                        break;
-                    case 3:
-                        if ( getECalQuadrant( ecalClusterNeighbor ) == 1 ) {
-                            Cluster[] clusterPair
-                                = { ecalCluster, ecalClusterNeighbor };
-                            clusterPairs.add(clusterPair);
-                        }
-                        break;
-                    case 4:
-                        if ( getECalQuadrant( ecalClusterNeighbor ) == 2 ) {
-                            Cluster[] clusterPair
-                                = { ecalCluster, ecalClusterNeighbor };
-                            clusterPairs.add(clusterPair);
-                        }
-                        break;
-                }
-            }
-        }
-
-        return !clusterPairs.isEmpty();
-    }
-
-    /**
-     * Checks if the ECal clusters making up a cluster pair lie above the low
-     * energy threshold and below the high energy threshold
-     *
-     * @param clusterPair : pair of clusters
-     * @return  true if a pair is found, false otherwise
-     */
-    public boolean clusterECut( Cluster[] clusterPair )
-    {
-
-        if(           clusterPair[ 0 ].getEnergy( ) < clusterEnergyHigh
-                && clusterPair[ 1 ].getEnergy( ) < clusterEnergyHigh
-                && clusterPair[ 0 ].getEnergy( ) > clusterEnergyLow
-                && clusterPair[ 1 ].getEnergy( ) > clusterEnergyLow  )
-            return true;
-
-        return false;
-    }
-
-    /**
-     *  Returns the quadrant which contains the ECal cluster
-     *
-     * @param ecalCluster : ECal cluster
-     * @return Quadrant number
-     */
-    public int getECalQuadrant(Cluster ecalCluster)
-    {
-        double[] clusterPosition = ecalCluster.getPosition();
-
-        // Quadrant 1
-        if(( clusterPosition[0] > 0.0 ) && ( clusterPosition[1] > 0.0 ))
-            return 1;
-        //Quadrant 2
-        if(( clusterPosition[0] < 0.0 ) && ( clusterPosition[1] > 0.0 ))
-            return 2;
-        // Quadrant 3
-        if(( clusterPosition[0] < 0.0 ) && ( clusterPosition[1] < 0.0 ))
-            return 3;
-        // Quadrant 4
-        return 4;
-    }
-
-    /**
-     * Checks if the sum of the energies of ECal clusters making up a cluster
-     * pair is below an energy sum threshold
-     *
-     * @param clusterPair : pair of clusters
-     * @return true if a pair is found, false otherwise
-     */
-    public boolean energySum( Cluster[] clusterPair )
-    {
-        double clusterESum = clusterPair[ 0 ].getEnergy()
-               + clusterPair[ 1 ].getEnergy();
-            if( clusterESum < energySumThreshold  ) return true;
-
-            return false;
-    }
-
-    /**
-     * Checks if the energy difference between the ECal clusters making up
-     * a cluster pair is below an energy difference threshold
-     *
-     * @param clusterPair : pair of clusters
-     * @return  true if pair is found, false otherwise
-     */
-    public boolean energyDifference(  Cluster[] clusterPair )
-    {
-        double clusterEDifference
-               = Math.abs( clusterPair[ 0 ].getEnergy( )
-                    - clusterPair[ 1 ].getEnergy() );
-
-        if( clusterEDifference <  energyDifferenceThreshold )
-            return true;
-
-        return false;
-
-    }
-
-    /**
-     * Require that the distance from the beam of the lowest energy cluster
-     * in a cluster pair satisfies the following
-     * E_low + d_b*.0032 GeV/mm < .8 GeV
-     *
-     * @param clusterPiar : pair of clusters
-     * @return  true if pair is found, false otherwise
-     */
-    public boolean energyDistanceCut( Cluster[] clusterPair )
-    {
-        Cluster lowEnergyCluster;
-
-        // Obtain the lowest energy cluster
-        if( clusterPair[0].getEnergy() < clusterPair[1].getEnergy() )
-            lowEnergyCluster = clusterPair[0];
-       else lowEnergyCluster = clusterPair[1];
-
-        // Calculate its position
-        double lowEClusterPosition
-           = Math.sqrt( Math.pow( lowEnergyCluster.getPosition()[0], 2)
-                + Math.pow( lowEnergyCluster.getPosition()[1], 2) );
-
-        double clusterDistvsE
-                = lowEnergyCluster.getEnergy() + lowEClusterPosition*(0.0032);
-
-        if( clusterDistvsE > .8  /* GeV */ ) return true;
-
-        return false;
-    }
-
-    /**
-     * Checks if a cluster pair is coplanar to the beam within a given
-     * angle
-     *
-     * @param clusterPair : pair of clusters
-     * @return true if pair is found, false otherwise
-     */
-    public boolean coplanarityCut( Cluster[] clusterPair  )
-    {
-        // Find the distance of both clusters from the origin
-        double cluster1Dist
-               = Math.sqrt( Math.pow( clusterPair[0].getPosition()[0],2 )
-                    + Math.pow( clusterPair[0].getPosition()[1],2) );
-        double cluster2Dist
-               = Math.sqrt( Math.pow( clusterPair[1].getPosition()[0],2 )
-                    + Math.pow( clusterPair[1].getPosition()[1],2) );
-
-        // Calculate the dot product between the distance vectors of
-        // each cluster in the cluster pair
-        double clusterDot
-           = clusterPair[0].getPosition()[0]*clusterPair[1].getPosition()[0]
-              +clusterPair[0].getPosition()[1]*clusterPair[1].getPosition()[1];
-
-        // Find the angle between clusters in the pair
-        double cosphi = clusterDot/( cluster1Dist*cluster2Dist );
-        double phi = Math.toDegrees( Math.acos( cosphi ) );
-
-        if( (180 - phi ) < maxCoplanarityAngle ) return true;
-
-        return false;
-
-    }
-
-    /**
-     * Sends an ECal trigger signal
-     */
-    public void sendTrigger()
-    {
-        ClockSingleton.setTrigger();
-    }
-
-    /**
-     * Set the upper energy cluster threshold
-     *
-     * @param highThreshold : Threshold in GeV
-     */
-    public void setUpperETheshold( double highThreshold )
-    {
-
-        clusterEnergyHigh = highThreshold;
-    }
-
-    /**
-     * Set the lower energy cluster threshold
-     *
-     * @param lowThrehold : Threshold in GeV
-     */
-    public void setLowerEThreshold( double lowThreshold )
-    {
-
-        clusterEnergyLow = lowThreshold;
-    }
-
-    /**
-     * Set the threshold on the sum of the two cluster energies
-     *
-     * @param sumThreshold : Threshold in GeV
-     */
-    public void setESumThreshold( double sumThreshold )
-    {
-
-        energySumThreshold = sumThreshold;
-    }
-
-    /**
-     * Set the threshold on the energy difference between two cluster energies
-     *
-     * @param diffThreshold : Threshold in GeV
-     */
-    public void setEDiffThrehold( double diffThreshold )
-    {
-
-        energyDifferenceThreshold = diffThreshold;
-    }
-
-    /**
-     * Set the maximum angle required to achieve coplanarity between the
-     * clusters and the beam
-     *
-     * @param maxCoplanarity : Maximum angle in degrees
-     */
-    public void setMaxCoplanarityAngle( double maxCoplanarity )
-    {
-        maxCoplanarityAngle = maxCoplanarity;
-    }
-
-}

hps-java/src/main/java/org/lcsim/hps/users/omoreno
HPSTestRunDriver.java removed after 1.3
diff -N HPSTestRunDriver.java
--- HPSTestRunDriver.java	29 Apr 2012 02:10:05 -0000	1.3
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,104 +0,0 @@
-
-package org.lcsim.hps.users.omoreno;
-
-//--- Java ---//
-import org.lcsim.hps.util.HPSTrigger;
-import java.util.ArrayList;
-import java.util.List;
-
-
-//--- LCSim ---//
-import org.lcsim.event.EventHeader;
-import org.lcsim.util.Driver;
-
-//--- HPS Java ---//
-import org.lcsim.hps.recon.tracking.SiTrackerSpectrometerSensorSetup;
-//import org.lcsim.hps.users.omoreno.tracking.HPSTrackerHitDriverL3;
-//import org.lcsim.hps.recon.tracking.HPSAPV25.HPSSVTHitDriver;
-import org.lcsim.hps.util.ClockSingleton;
-
-/**
- *
- * @author Omar Moreno <[log in to unmask]>
- * @version $Id: HPSTestRunDriver.java,v 1.3 2012/04/29 02:10:05 meeg Exp $
- */
-public class HPSTestRunDriver extends Driver {
-
-    HPSEcalFlashTrigger ecal;
-    
-    List<int[]>   stereo_pairs = new ArrayList();    // List of stereo pairs
-    List<Integer> pass_layers  = new ArrayList();    // 
-
-    // Set up  some detector attributes 
-    int    nlayers = 10;      // Number of tracking layers
-    double b_field = 0.5;     // [Tesla] Magnetic field strength
-
-    // Strategy file prefix
-    String strategy_prefix 
-        = "/home/omoreno/workdir/hps/software/hps-java/src/main/resources/";
-   
-   // Tracking strategy
-   String strategy   = "HPS-Test-1pt3.xml";
-    
-   
-   /**
-     * Constructor
-     */
-    public HPSTestRunDriver( )
-    {
-        // Instantiate the ECal reconstruction
-        HPSEcalFlashTrigger ecalTrigger = new HPSEcalFlashTrigger();         
-
-        // Instantiate the HPS trigger
-        HPSTrigger hpsTrig = new HPSTrigger();
-
-        // Configure the tracker geometry
-        ConfigTracker( "HPS Test Run" );
-
-        //
-        //HPSSVTHitDriver hitDriver = new HPSSVTHitDriver();
-
-        //--- Add Drivers ---//
-        add(ecalTrigger);
-        add(hpsTrig);
-        // Configure the SVT sensors
-        add( new SiTrackerSpectrometerSensorSetup( "Tracker" ) );
-//        add(hitDriver);        
-
-//       HPSTrackerHitDriverL3 hps_thd = new HPSTrackerHitDriverL3();
-//       add( hps_thd );
-    }
-    
-    public void process( EventHeader event )
-    {
-        super.process(event);
-        ClockSingleton.step();
-    }
-    
-    /**
-     * Configure the SVT tracker geometry
-     */
-    private void ConfigTracker ( String detector ) {
-    
-        System.out.println("Configuring the HPS SVT geometry ... ");
-
-        if( detector.equals( "HPS Test Run" ) ) {
-
-            System.out.println( "Using HPS test run geometry" );
-      
-      	// Set the stereo pairs for the test tracker
-      	int[] pair1 = { 1, 2  };
-      	int[] pair2 = { 3, 4  };
-      	int[] pair3 = { 5, 6  };
-      	int[] pair4 = { 7, 8  };
-      	int[] pair5 = { 9, 10 };
-
-      	// Add the pairs to the stereo_pairs list  to be processed
-      	stereo_pairs.add( pair1 );
-      	stereo_pairs.add( pair2 );
-      	stereo_pairs.add( pair3 );
-      	stereo_pairs.add( pair4 );
-      	stereo_pairs.add( pair5 );      
-        }
-    }
-}

hps-java/src/main/java/org/lcsim/hps/users/meeg
FilterMCBunches.java 1.3 -> 1.4
diff -u -r1.3 -r1.4
--- FilterMCBunches.java	29 Jun 2012 23:48:16 -0000	1.3
+++ FilterMCBunches.java	30 Jul 2012 23:31:45 -0000	1.4
@@ -22,7 +22,7 @@
  * Intended use is to clean up a photon-run MC file before running trigger and readout sim.
  *
  * @author Sho Uemura <[log in to unmask]>
- * @version $Id: FilterMCBunches.java,v 1.3 2012/06/29 23:48:16 meeg Exp $
+ * @version $Id: FilterMCBunches.java,v 1.4 2012/07/30 23:31:45 meeg Exp $
  */
 public class FilterMCBunches {
 
@@ -119,9 +119,8 @@
                 }
 
                 for (int i = 1; i < nEmpty; i++) {
-                    event = new BaseLCSimEvent(0, 0, detectorName);
                     try {
-                        writer.write(event);
+                        writer.write(new BaseLCSimEvent(event.getRunNumber(), event.getEventNumber(), detectorName));
                     } catch (IOException e) {
                         break;
                     }

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSTriggerDriver.java 1.10 -> 1.11
diff -u -r1.10 -r1.11
--- HPSTriggerDriver.java	29 Jun 2012 23:00:48 -0000	1.10
+++ HPSTriggerDriver.java	30 Jul 2012 23:31:45 -0000	1.11
@@ -22,7 +22,7 @@
  * Applies SVT trigger latency and sends trigger signal to SVT
  *
  * @author Sho Uemura <[log in to unmask]>
- * @version $Id: HPSTriggerDriver.java,v 1.10 2012/06/29 23:00:48 meeg Exp $
+ * @version $Id: HPSTriggerDriver.java,v 1.11 2012/07/30 23:31:45 meeg Exp $
  */
 public abstract class HPSTriggerDriver extends Driver {
 
@@ -43,6 +43,7 @@
     private Queue<Double> ecalTriggerTimestamps = null;
     // ECal trigger latency
     private static final double ecalTriggerLatency = 100.0; // [ns]
+    private static boolean triggerBit = false;
 
     public HPSTriggerDriver() {
     }
@@ -101,6 +102,7 @@
 
     @Override
     public void process(EventHeader event) {
+        triggerBit = false; //reset trigger
         //System.out.println(this.getClass().getCanonicalName() + " - process");
 
         // Get the list of raw ECal hits.
@@ -111,13 +113,24 @@
 
         if (testTrigger(clusters)) {
             if (ClockSingleton.getClock() - lastTrigger > deadTime) {
-                ClockSingleton.setTrigger();
+                triggerBit = true;
                 lastTrigger = ClockSingleton.getClock();
                 numTriggers++;
                 System.out.printf("Trigger on event %d\n", event.getEventNumber());
                 if (outputStream != null) {
                     outputStream.printf("Trigger on event %d\n", event.getEventNumber());
                 }
+
+                // If an ECal trigger signal has been sent store the trigger
+                // time offset by the trigger latencies
+                svtTriggerTimeStamp.offer(
+                        ClockSingleton.getTime() + svtTriggerLatency);
+                ecalTriggerTimestamps.add(ClockSingleton.getTime() + ecalTriggerLatency);
+                System.out.println("Trigger added");
+
+                if (outputStream != null) {
+                    outputStream.printf("trigger sent to ET event builder on event %d\n", event.getEventNumber());
+                }
             } else {
                 if (outputStream != null) {
                     outputStream.printf("Event %d rejected by dead time\n", event.getEventNumber());
@@ -125,21 +138,6 @@
             }
         }
 
-        // If an ECal trigger signal has been sent store the trigger
-        // time offset by the trigger latencies
-        if (ClockSingleton.triggered()) {
-            svtTriggerTimeStamp.offer(
-                    ClockSingleton.getTime() + svtTriggerLatency);
-            ecalTriggerTimestamps.add(ClockSingleton.getTime() + ecalTriggerLatency);
-            System.out.println("Trigger added");
-
-            if (outputStream != null) {
-                outputStream.printf("trigger sent to ET event builder on event %d\n", event.getEventNumber());
-            }
-            TestRunTriggeredReconToEvio.triggerBit = true;
-
-        }
-
         // Check if there are any pending SVT triggers to process
         if (svtTriggerTimeStamp.peek() != null
                 && ClockSingleton.getTime() == svtTriggerTimeStamp.peek()) {
@@ -179,4 +177,8 @@
         }
         System.out.printf("Trigger count: %d\n", numTriggers);
     }
+
+    public static boolean triggerBit() {
+        return triggerBit;
+    }
 }
\ No newline at end of file
CVSspam 0.2.12


Use REPLY-ALL to reply to list

To unsubscribe from the LCD-CVS list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCD-CVS&A=1