Commit in hps-java/src/main/java/org/lcsim/hps on MAIN | |||
readout/ecal/TriggerableDriver.java | +74 | added 1.1 | |
/EcalReadoutDriver.java | +6 | -8 | 1.1 -> 1.2 |
/TriggerDriver.java | +13 | -63 | 1.1 -> 1.2 |
recon/tracking/SimpleSvtReadout.java | +45 | -42 | 1.8 -> 1.9 |
+138 | -113 |
clean up trigger driver, prepare to add readout timestamps
diff -N TriggerableDriver.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ TriggerableDriver.java 19 Mar 2013 22:24:07 -0000 1.1 @@ -0,0 +1,74 @@
+package org.lcsim.hps.readout.ecal; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; +import org.lcsim.event.EventHeader; +import org.lcsim.hps.util.ClockSingleton; +import org.lcsim.util.Driver; + +/** + * A driver that accepts triggers from TriggerDriver. + * To implement, write your own processTrigger(), and call checkTrigger() somewhere in process(). + * You might want to set your own default latency in your constructor. + * nextReadoutTime() and isLive() are meant to be overridden if you're doing something unusual. + * @author Sho Uemura <[log in to unmask]> + * @version $Id: TriggerableDriver.java,v 1.1 2013/03/19 22:24:07 meeg Exp $ + */ +public abstract class TriggerableDriver extends Driver { + + private static final List<TriggerableDriver> triggerables = new ArrayList<TriggerableDriver>(); + private Queue<Double> triggerTimestamps = new LinkedList<Double>(); + protected double latency = 0.0; // [ns] + + public void setLatency(double latency) { + this.latency = latency; + } + + /** + * + * @return next time checkTrigger() will be called + */ + public double nextReadoutTime() { + return ClockSingleton.getTime() + ClockSingleton.getDt(); + } + + @Override + public void startOfData() { + TriggerDriver.addTriggerable(this); + } + + protected abstract void processTrigger(EventHeader event); + + protected void checkTrigger(EventHeader event) { + if (triggerTimestamps.peek() != null && ClockSingleton.getTime() >= triggerTimestamps.peek()) { + processTrigger(event); + triggerTimestamps.remove(); + } + } + + public void addTrigger() { + triggerTimestamps.add(ClockSingleton.getTime() + latency); + } + + public boolean isLive() { + return true; + } + + protected static boolean sendTrigger() { + for (TriggerableDriver triggerable : triggerables) { + if (!triggerable.isLive()) { + return false; + } + } + for (TriggerableDriver triggerable : triggerables) { + triggerable.addTrigger(); + } + return true; + } + + public static void addTriggerable(TriggerableDriver triggerable) { + triggerables.add(triggerable); + } +}
diff -u -r1.1 -r1.2 --- EcalReadoutDriver.java 25 Feb 2013 22:39:26 -0000 1.1 +++ EcalReadoutDriver.java 19 Mar 2013 22:24:07 -0000 1.2 @@ -6,16 +6,15 @@
import org.lcsim.event.CalorimeterHit; import org.lcsim.event.EventHeader; import org.lcsim.hps.util.ClockSingleton;
-import org.lcsim.util.Driver;
import org.lcsim.util.lcio.LCIOConstants; /** * Performs readout of ECal hits. * * @author Sho Uemura <[log in to unmask]>
- * @version $Id: EcalReadoutDriver.java,v 1.1 2013/02/25 22:39:26 meeg Exp $
+ * @version $Id: EcalReadoutDriver.java,v 1.2 2013/03/19 22:24:07 meeg Exp $
*/
-public abstract class EcalReadoutDriver<T> extends Driver {
+public abstract class EcalReadoutDriver<T> extends TriggerableDriver {
String ecalCollectionName; String ecalRawCollectionName = "EcalRawHits";
@@ -41,7 +40,7 @@
public EcalReadoutDriver() { flags += 1 << LCIOConstants.CHBIT_LONG; //store position flags += 1 << LCIOConstants.RCHBIT_ID1; //store cell ID
-
+ latency = 100.0;
} public void setDebug(boolean debug) {
@@ -82,6 +81,7 @@
@Override public void startOfData() {
+ super.startOfData();
if (ecalCollectionName == null) { throw new RuntimeException("The parameter ecalCollectionName was not set!"); }
@@ -127,10 +127,7 @@
event.put(ecalRawCollectionName, newHits, hitClass, flags, ecalReadoutName); }
- if (readoutBit) { - processTrigger(event); - readoutBit = false; - }
+ checkTrigger(event);
} protected double readoutTime() {
@@ -144,6 +141,7 @@
//must be run every event, even if the list is empty protected abstract void putHits(List<CalorimeterHit> hits);
+ @Override
protected void processTrigger(EventHeader event) { }
diff -u -r1.1 -r1.2 --- TriggerDriver.java 25 Feb 2013 22:39:26 -0000 1.1 +++ TriggerDriver.java 19 Mar 2013 22:24:07 -0000 1.2 @@ -4,19 +4,14 @@
import java.io.IOException; import java.io.PrintStream; import java.io.PrintWriter;
-import java.util.LinkedList;
import java.util.List;
-import java.util.Queue;
import java.util.logging.Level; import java.util.logging.Logger; import org.lcsim.event.EventHeader; import org.lcsim.hps.recon.ecal.HPSEcalCluster;
-import org.lcsim.hps.recon.tracking.apv25.Apv25Full; -import org.lcsim.hps.recon.tracking.apv25.HPSAPV25;
import org.lcsim.hps.util.ClockSingleton;
-import org.lcsim.util.Driver;
import org.lcsim.util.lcio.LCIOWriter; /**
@@ -25,9 +20,9 @@
* Applies SVT trigger latency and sends trigger signal to SVT * * @author Sho Uemura <[log in to unmask]>
- * @version $Id: TriggerDriver.java,v 1.1 2013/02/25 22:39:26 meeg Exp $
+ * @version $Id: TriggerDriver.java,v 1.2 2013/03/19 22:24:07 meeg Exp $
*/
-public abstract class TriggerDriver extends Driver {
+public abstract class TriggerDriver extends TriggerableDriver {
private boolean _DEBUG = false; protected String clusterCollectionName = "EcalClusters";
@@ -36,23 +31,12 @@
protected int numTriggers; private int lastTrigger; private int deadTime = 0;
- // FIFO queue to store the svt trigger time stamp - private Queue<Double> svtTriggerTimeStamp = new LinkedList<Double>(); - // SVT trigger latency - public static final double svtTriggerLatency = 100.0; // [ns] - // FIFO queue to store the ECal trigger time stamp - private Queue<Double> ecalTriggerTimestamps = null; - // ECal trigger latency - private static final double ecalTriggerLatency = 100.0; // [ns] - // FIFO queue to store the trigger bank trigger time stamp - private Queue<Double> triggerTriggerTimestamps = null; - // trigger bank trigger latency - public static final double triggerTriggerLatency = 50.0; // [ns]
private static boolean triggerBit = false; private String lcioFile = null; LCIOWriter lcioWriter = null; public TriggerDriver() {
+ latency = 50.0;
} public void setLcioFile(String lcioFile) {
@@ -77,6 +61,7 @@
@Override public void startOfData() {
+ addTriggerable(this);
if (clusterCollectionName == null) { throw new RuntimeException("The parameter clusterCollectionName was not set!"); }
@@ -102,9 +87,6 @@
} numTriggers = 0;
- - ecalTriggerTimestamps = new LinkedList<Double>(); - triggerTriggerTimestamps = new LinkedList<Double>();
} @Override
@@ -113,6 +95,7 @@
//System.out.println(this.getClass().getCanonicalName() + " - process"); if (ClockSingleton.getClock() - lastTrigger > deadTime && triggerDecision(event)) {
+ sendTrigger();
triggerBit = true; lastTrigger = ClockSingleton.getClock(); numTriggers++;
@@ -125,9 +108,6 @@
// If an ECal trigger signal has been sent store the trigger // time offset by the trigger latencies
- svtTriggerTimeStamp.add(ClockSingleton.getTime() + svtTriggerLatency); - ecalTriggerTimestamps.add(ClockSingleton.getTime() + ecalTriggerLatency); - triggerTriggerTimestamps.add(ClockSingleton.getTime() + triggerTriggerLatency);
if (_DEBUG) { System.out.println(this.getClass().getSimpleName() + ": Trigger added on event " + event.getEventNumber()); }
@@ -145,46 +125,16 @@
} }
- // Check if there are any pending SVT triggers to process - if (svtTriggerTimeStamp.peek() != null - && ClockSingleton.getTime() >= svtTriggerTimeStamp.peek()) { - - if (outputStream != null) { - outputStream.printf("SVT trigger sent on event %d\n", event.getEventNumber()); - } - - // Send a trigger signal to the SVT - HPSAPV25.readoutBit = true; - Apv25Full.readoutBit = true; - svtTriggerTimeStamp.remove(); - } - - // Check if there are any pending ECal triggers to process - if (ecalTriggerTimestamps.peek() != null - && ClockSingleton.getTime() >= ecalTriggerTimestamps.peek()) { - - if (outputStream != null) { - outputStream.printf("ECal trigger sent on event %d\n", event.getEventNumber()); - } - - // Send a trigger signal to the ECal - EcalReadoutDriver.readoutBit = true; - ecalTriggerTimestamps.remove(); - } - -
// Check if there are any pending trigger bank triggers to process
- if (triggerTriggerTimestamps.peek() != null - && ClockSingleton.getTime() >= triggerTriggerTimestamps.peek()) { - - if (outputStream != null) { - outputStream.printf("Trigger bank trigger sent on event %d\n", event.getEventNumber()); - }
+ checkTrigger(event); + }
- // Make trigger bank - makeTriggerData(event, "TriggerBank"); - triggerTriggerTimestamps.remove();
+ @Override + protected void processTrigger(EventHeader event) { + if (outputStream != null) { + outputStream.printf("Trigger bank trigger sent on event %d\n", event.getEventNumber());
}
+ makeTriggerData(event, "TriggerBank");
} protected boolean triggerDecision(EventHeader event) {
@@ -196,7 +146,7 @@
} }
- public abstract boolean testTrigger(List<HPSEcalCluster> clusters);
+ protected abstract boolean testTrigger(List<HPSEcalCluster> clusters);
protected void makeTriggerData(EventHeader event, String collectionName) { }
diff -u -r1.8 -r1.9 --- SimpleSvtReadout.java 1 Mar 2013 22:34:25 -0000 1.8 +++ SimpleSvtReadout.java 19 Mar 2013 22:24:07 -0000 1.9 @@ -13,8 +13,8 @@
import org.lcsim.event.RawTrackerHit; import org.lcsim.event.base.BaseRawTrackerHit; import org.lcsim.geometry.Detector;
+import org.lcsim.hps.readout.ecal.TriggerableDriver;
import org.lcsim.hps.recon.tracking.apv25.Apv25Constants;
-import org.lcsim.hps.recon.tracking.apv25.HPSAPV25;
import org.lcsim.hps.util.ClockSingleton; import org.lcsim.hps.util.RandomGaussian; import org.lcsim.hps.util.RingBuffer;
@@ -23,15 +23,14 @@
import org.lcsim.recon.tracking.digitization.sisim.SiElectrodeDataCollection; import org.lcsim.recon.tracking.digitization.sisim.SiSensorSim; import org.lcsim.recon.tracking.digitization.sisim.config.SimTrackerHitReadoutDriver;
-import org.lcsim.util.Driver;
import org.lcsim.util.lcio.LCIOConstants; /** * * @author Omar Moreno <[log in to unmask]>
- * @version $Id: SimpleSvtReadout.java,v 1.8 2013/03/01 22:34:25 meeg Exp $
+ * @version $Id: SimpleSvtReadout.java,v 1.9 2013/03/19 22:24:07 meeg Exp $
*/
-public class SimpleSvtReadout extends Driver {
+public class SimpleSvtReadout extends TriggerableDriver {
private SimTrackerHitReadoutDriver readoutDriver = new SimTrackerHitReadoutDriver(); private SiSensorSim siSimulation = new CDFSiSensorSim();
@@ -53,6 +52,7 @@
public SimpleSvtReadout() { add(readoutDriver);
+ latency = 100.0;
} public void setAddNoise(boolean addNoise) {
@@ -145,44 +145,7 @@
} // If an ECal trigger is received, make hits from pipelines
- if (HPSAPV25.readoutBit) { -// System.out.println("Got trigger"); - - HPSAPV25.readoutBit = false; - - // Create a list to hold the analog data - List<RawTrackerHit> hits = new ArrayList<RawTrackerHit>(); - - for (SiSensor sensor : SvtUtils.getInstance().getSensors()) { - APV25Pipeline[] pipelines = pipelineMap.get(sensor); - for (int channel = 0; channel < pipelines.length; channel++) { - if (pipelines[channel] != null) { - short[] samples = new short[6]; - if (addNoise) { - double[] noise = makeNoise(sensor, channel); - for (int i = 0; i < 6; i++) { - samples[i] = (short) Math.round(pipelines[channel].getValue(i) + HPSSVTCalibrationConstants.getPedestal(sensor, channel) + noise[i]); - } - } else { - for (int i = 0; i < 6; i++) { - samples[i] = (short) Math.round(pipelines[channel].getValue(i) + HPSSVTCalibrationConstants.getPedestal(sensor, channel)); - } - } - long cell_id = SvtUtils.makeCellID(sensor, channel); - - RawTrackerHit hit = new BaseRawTrackerHit(0, cell_id, samples, null, sensor); -// System.out.println("Making RTH"); - if (readoutCuts(hit)) { - hits.add(hit); - } - } - } - } - - int flags = 1 << LCIOConstants.TRAWBIT_ID1; - event.put(outputCollection, hits, RawTrackerHit.class, flags, readout); - System.out.println("Made " + hits.size() + " RawTrackerHits"); - }
+ checkTrigger(event);
} else { // Create a list to hold the analog data List<RawTrackerHit> hits = new ArrayList<RawTrackerHit>();
@@ -318,6 +281,46 @@
return count >= samplesAboveThreshold; }
+ @Override + protected void processTrigger(EventHeader event) { + if (!noPileup) { +// System.out.println("Got trigger"); + + // Create a list to hold the analog data + List<RawTrackerHit> hits = new ArrayList<RawTrackerHit>(); + + for (SiSensor sensor : SvtUtils.getInstance().getSensors()) { + APV25Pipeline[] pipelines = pipelineMap.get(sensor); + for (int channel = 0; channel < pipelines.length; channel++) { + if (pipelines[channel] != null) { + short[] samples = new short[6]; + if (addNoise) { + double[] noise = makeNoise(sensor, channel); + for (int i = 0; i < 6; i++) { + samples[i] = (short) Math.round(pipelines[channel].getValue(i) + HPSSVTCalibrationConstants.getPedestal(sensor, channel) + noise[i]); + } + } else { + for (int i = 0; i < 6; i++) { + samples[i] = (short) Math.round(pipelines[channel].getValue(i) + HPSSVTCalibrationConstants.getPedestal(sensor, channel)); + } + } + long cell_id = SvtUtils.makeCellID(sensor, channel); + + RawTrackerHit hit = new BaseRawTrackerHit(0, cell_id, samples, null, sensor); +// System.out.println("Making RTH"); + if (readoutCuts(hit)) { + hits.add(hit); + } + } + } + } + + int flags = 1 << LCIOConstants.TRAWBIT_ID1; + event.put(outputCollection, hits, RawTrackerHit.class, flags, readout); + System.out.println("Made " + hits.size() + " RawTrackerHits"); + } + } +
private class APV25Pipeline extends RingBuffer { private int _trigger_latency = (int) Math.floor(270 / Apv25Constants.SAMPLING_INTERVAL);
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