Commit in hps-java on MAIN | |||
src/main/java/org/lcsim/hps/evio/ECalHitWriter.java | +440 | added 1.1 | |
/SVTHitWriter.java | +74 | added 1.1 | |
/TestRunTriggeredReconToLcio.java | +134 | added 1.1 | |
/HitWriter.java | +25 | added 1.1 | |
/TestRunReconToEvio.java | +4 | -4 | 1.8 -> 1.9 |
/TestRunTriggeredReconToEvio.java | +9 | -11 | 1.13 -> 1.14 |
/ECalEvioWriter.java | -422 | 1.8 removed | |
/SVTEvioWriter.java | -69 | 1.5 removed | |
/EvioWriter.java | -22 | 1.1 removed | |
src/main/java/org/lcsim/hps/util/ClockSingleton.java | +1 | -12 | 1.4 -> 1.5 |
src/main/resources/org/lcsim/hps/steering/HPSTestRunReconToLcio.lcsim | +85 | added 1.1 | |
/HPSTestRunRecon.lcsim | -74 | 1.2 removed | |
src/main/java/org/lcsim/hps/analysis/ecal/HPSEcalTriggerPlotsDriver.java | +3 | -2 | 1.4 -> 1.5 |
/HPSEcalPlotsDriver.java | +5 | -4 | 1.14 -> 1.15 |
sandbox/HPSTestRunDriver.java | +104 | added 1.1 | |
/HPSEcalFlashTrigger.java | +411 | added 1.1 | |
/HPSTestRunRecon.lcsim | +74 | added 1.1 | |
src/main/java/org/lcsim/hps/users/omoreno/HPSEcalFlashTrigger.java | -411 | 1.1 removed | |
/HPSTestRunDriver.java | -104 | 1.3 removed | |
src/main/java/org/lcsim/hps/users/meeg/FilterMCBunches.java | +2 | -3 | 1.3 -> 1.4 |
src/main/java/org/lcsim/hps/recon/ecal/HPSTriggerDriver.java | +19 | -17 | 1.10 -> 1.11 |
+1390 | -1155 |
first steps at making readout simulation output to LCIO
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; + } + } +}
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."); + } +}
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
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); +}
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() {
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;
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); - } - } -}
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); - } - } -}
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); -}
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;
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> +
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> -
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();
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); }
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 ); + } + } +}
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; + } + +}
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> +
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; - } - -}
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 ); - } - } -}
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; }
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
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