Print

Print


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));
             }
         }
     }