8 added + 6 removed + 7 modified, total 21 files
hps-java/src/main/java/org/lcsim/hps/evio
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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