Author: [log in to unmask] Date: Wed May 27 17:20:49 2015 New Revision: 3042 Log: simulate APV trigger pipeline, make more plots Added: java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/SmallHits.lcsim - copied, changed from r3020, java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/HitTimes.lcsim Modified: java/trunk/users/src/main/java/org/hps/users/meeg/SVTSmallHitsDriver.java Copied: java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/SmallHits.lcsim (from r3020, java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/HitTimes.lcsim) ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/HitTimes.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/SmallHits.lcsim Wed May 27 17:20:49 2015 @@ -3,12 +3,16 @@ xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd"> <execute> <driver name="EventMarkerDriver"/> - <driver name="HitTimePrintDriver"/> + <driver name="SVTSmallHitsDriver"/> + <driver name="AidaSaveDriver"/> </execute> <drivers> <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> - <eventInterval>1</eventInterval> + <eventInterval>1000</eventInterval> </driver> - <driver name="HitTimePrintDriver" type="org.hps.users.meeg.HitTimePrintDriver"/> + <driver name="SVTSmallHitsDriver" type="org.hps.users.meeg.SVTSmallHitsDriver"/> + <driver name="AidaSaveDriver" type="org.lcsim.job.AidaSaveDriver"> + <outputFileName>smallhits.root</outputFileName> + </driver> </drivers> </lcsim> Modified: java/trunk/users/src/main/java/org/hps/users/meeg/SVTSmallHitsDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/meeg/SVTSmallHitsDriver.java (original) +++ java/trunk/users/src/main/java/org/hps/users/meeg/SVTSmallHitsDriver.java Wed May 27 17:20:49 2015 @@ -1,9 +1,7 @@ package org.hps.users.meeg; -import hep.aida.IAnalysisFactory; import hep.aida.IHistogram1D; import hep.aida.IHistogram2D; -import hep.aida.IPlotterFactory; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -25,7 +23,11 @@ private AIDA aida = AIDA.defaultInstance(); private String rawTrackerHitCollectionName = "SVTRawTrackerHits"; - private long previousTimestamp = 0; + private static final int SYNC_INTERVAL = 35 * 24; + private static final int READOUT_LENGTH = 6 * 140 * 24; + private long[] previousTriggerTimesPhased = new long[5]; + private long[] previousTriggerTimes = new long[5]; + private long[] previousReadoutTimes = new long[5]; private boolean printADCValues = false; private boolean printEvents = false; Map<HpsSiSensor, Set<Integer>> hitMap; @@ -35,9 +37,18 @@ double nHitsWithout = 0; int nWith = 0; int nWithout = 0; + private int syncPhaseOffset = 12; + private int daqDelay = 6200; IHistogram1D trigDt, trigDtWithSmallHits, smallHitFracDt, smallHitCount1D; IHistogram2D smallHitsDt2D; + IHistogram1D trigDtPhased, trigDtWithSmallHitsPhased, smallHitFracDtPhased; + IHistogram2D smallHitsDt2DPhased; + IHistogram1D trigDtReadout, trigDtWithSmallHitsReadout, smallHitFracDtReadout; + IHistogram2D smallHitsDt2DReadout; + IHistogram2D trigDt2DWithSmallHits; + + IHistogram2D trigDtPhase, trigDtWithSmallHitsPhase, trigDtReadoutWithSmallHitsPhase; public void setPrintADCValues(boolean printADCValues) { this.printADCValues = printADCValues; @@ -50,16 +61,51 @@ protected void detectorChanged(Detector detector) { aida.tree().cd("/"); - trigDt = aida.histogram1D("trigger dt", 1000, 0, 1e5); smallHitCount1D = aida.histogram1D("small hit count", 100, 0, 100); - trigDtWithSmallHits = aida.histogram1D("trigger dt, events with small hits", 1000, 0, 1e5); - smallHitsDt2D = aida.histogram2D("small hit count vs. trigger dt", 1000, 0, 1e5, 100, 0, 100); - smallHitFracDt = aida.histogram1D("fraction of events with small hits vs. dt", 1000, 0, 1e5); - } - - @Override + + trigDt2DWithSmallHits = aida.histogram2D("trigger dt vs. previous trigger dt, events with small hits", 1000, 0, 9.6e4, 1000, 0, 9.6e4); + + trigDt = aida.histogram1D("trigger dt", 4000, 0, 9.6e4); + trigDtWithSmallHits = aida.histogram1D("trigger dt, events with small hits", 4000, 0, 9.6e4); + smallHitsDt2D = aida.histogram2D("small hit count vs. trigger dt", 4000, 0, 9.6e4, 100, 0, 100); + smallHitFracDt = aida.histogram1D("fraction of events with small hits vs. dt", 4000, 0, 9.6e4); + + trigDtPhased = aida.histogram1D("trigger dt, sync phase subtracted", 4000, 0, 9.6e4); + trigDtWithSmallHitsPhased = aida.histogram1D("trigger dt, events with small hits, sync phase subtracted", 4000, 0, 9.6e4); + smallHitsDt2DPhased = aida.histogram2D("small hit count vs. trigger dt, sync phase subtracted", 4000, 0, 9.6e4, 100, 0, 100); + smallHitFracDtPhased = aida.histogram1D("fraction of events with small hits vs. dt, sync phase subtracted", 4000, 0, 9.6e4); + + trigDtReadout = aida.histogram1D("trigger dt, using previous readout time", 4000, 0, 9.6e4); + trigDtWithSmallHitsReadout = aida.histogram1D("trigger dt, events with small hits, using previous readout time", 4000, 0, 9.6e4); + smallHitsDt2DReadout = aida.histogram2D("small hit count vs. trigger dt, using previous readout time", 4000, 0, 9.6e4, 100, 0, 100); + smallHitFracDtReadout = aida.histogram1D("fraction of events with small hits vs. dt, using previous readout time", 4000, 0, 9.6e4); + + trigDtPhase = aida.histogram2D("sync phase vs. trigger dt", 4000, 0, 9.6e4, 210, 0, SYNC_INTERVAL); + trigDtWithSmallHitsPhase = aida.histogram2D("sync phase vs. trigger dt, events with small hits", 4000, 0, 9.6e4, 210, 0, SYNC_INTERVAL); + trigDtReadoutWithSmallHitsPhase = aida.histogram2D("sync phase vs. trigger dt, using previous readout time, events with small hits", 4000, 0, 9.6e4, 210, 0, SYNC_INTERVAL); + } + +// @Override protected void process(EventHeader event) { - int dt = (int) (event.getTimeStamp() - previousTimestamp); + for (int i = previousTriggerTimes.length - 1; i > 0; i--) { + previousTriggerTimes[i] = previousTriggerTimes[i - 1]; + } + previousTriggerTimes[0] = event.getTimeStamp(); + + for (int i = previousTriggerTimesPhased.length - 1; i > 0; i--) { + previousTriggerTimesPhased[i] = previousTriggerTimesPhased[i - 1]; + } + previousTriggerTimesPhased[0] = getNextSyncTime(event.getTimeStamp(), syncPhaseOffset); + + for (int i = previousReadoutTimes.length - 1; i > 0; i--) { + previousReadoutTimes[i] = previousReadoutTimes[i - 1]; + } + previousReadoutTimes[0] = Math.max(getNextSyncTime(event.getTimeStamp() + daqDelay, syncPhaseOffset + daqDelay), previousReadoutTimes[1] + READOUT_LENGTH); + + int dt = (int) (previousTriggerTimes[0] - previousTriggerTimes[1]); + int dtReadout = (int) (previousTriggerTimes[0] - previousReadoutTimes[1]); + long previousTimestampPhased = previousTriggerTimesPhased[1]; + int dtPhased = (int) (event.getTimeStamp() - previousTimestampPhased); if (event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName)) { // Get RawTrackerHit collection from event. @@ -97,10 +143,20 @@ } } trigDt.fill(dt); + trigDtPhased.fill(dtPhased); + trigDtReadout.fill(dtReadout); smallHitCount1D.fill(smallHitCount); smallHitsDt2D.fill(dt, smallHitCount); + smallHitsDt2DPhased.fill(dtPhased, smallHitCount); + smallHitsDt2DReadout.fill(dtReadout, smallHitCount); + trigDtPhase.fill(dt, previousTriggerTimes[1] % SYNC_INTERVAL); if (smallHitCount > 3) { trigDtWithSmallHits.fill(dt); + trigDt2DWithSmallHits.fill(previousTriggerTimes[0] - previousTriggerTimesPhased[1], previousTriggerTimes[0] - previousTriggerTimesPhased[2]); + trigDtWithSmallHitsPhased.fill(dtPhased); + trigDtWithSmallHitsReadout.fill(dtReadout); + trigDtWithSmallHitsPhase.fill(dt, previousTriggerTimes[1] % SYNC_INTERVAL); + trigDtReadoutWithSmallHitsPhase.fill(dtReadout, previousTriggerTimes[1] % SYNC_INTERVAL); dtSumWith += dt; nHitsWith += smallHitCount; nWith++; @@ -111,10 +167,9 @@ } if (printEvents) { System.out.format("%f ns with small hits (%d events with %f small hits),\t%f ns without small hits (%d events with %f small hits)\n", dtSumWith / nWith, nWith, nHitsWith / nWith, dtSumWithout / nWithout, nWithout, nHitsWithout / nWithout); - System.out.format("%d %d %d %d ", event.getEventNumber(), event.getTimeStamp(), event.getTimeStamp() - previousTimestamp, smallHitCount); - } - - previousTimestamp = event.getTimeStamp(); + System.out.format("%d %d %d %d ", event.getEventNumber(), event.getTimeStamp(), event.getTimeStamp() - previousTriggerTimes[1], smallHitCount); + } + if (printEvents) { for (String sensorName : smallHitCounts.keySet()) { System.out.format("%s:%d ", sensorName, smallHitCounts.get(sensorName)); @@ -124,6 +179,10 @@ } } + private static long getNextSyncTime(long triggerTime, int phaseOffset) { + return triggerTime + SYNC_INTERVAL - ((triggerTime - phaseOffset) % SYNC_INTERVAL); + } + private boolean isSmallHit(RawTrackerHit hit) { HpsSiSensor sensor = (HpsSiSensor) hit.getDetectorElement(); int strip = hit.getIdentifierFieldValue("strip"); @@ -144,8 +203,12 @@ public void endOfData() { if (trigDt != null) { smallHitFracDt.reset(); + smallHitFracDtPhased.reset(); + smallHitFracDtReadout.reset(); for (int i = 0; i < trigDt.axis().bins(); i++) { smallHitFracDt.fill(trigDt.axis().binCenter(i), trigDtWithSmallHits.binHeight(i) / trigDt.binHeight(i)); + smallHitFracDtPhased.fill(trigDt.axis().binCenter(i), trigDtWithSmallHitsPhased.binHeight(i) / trigDtPhased.binHeight(i)); + smallHitFracDtReadout.fill(trigDt.axis().binCenter(i), trigDtWithSmallHitsReadout.binHeight(i) / trigDtReadout.binHeight(i)); } } }