Print

Print


Commit in java/trunk/hps-java/src/main on MAIN
java/org/lcsim/hps/readout/ecal/FADCTriggerDriver.java+68-67339 -> 340
                               /FADCTriggerVariableDriver.java+6-4339 -> 340
resources/org/lcsim/hps/steering/readout/HPS2014ReadoutToLcio.lcsim+4-3339 -> 340
+78-74
3 modified files
apply pair coincidence time in FADCTriggerDriver

java/trunk/hps-java/src/main/java/org/lcsim/hps/readout/ecal
FADCTriggerDriver.java 339 -> 340
--- java/trunk/hps-java/src/main/java/org/lcsim/hps/readout/ecal/FADCTriggerDriver.java	2014-03-25 00:32:58 UTC (rev 339)
+++ java/trunk/hps-java/src/main/java/org/lcsim/hps/readout/ecal/FADCTriggerDriver.java	2014-03-25 00:56:25 UTC (rev 340)
@@ -7,11 +7,11 @@
 import java.util.EnumSet;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Queue;
 
 import org.lcsim.event.Cluster;
 import org.lcsim.event.EventHeader;
 import org.lcsim.geometry.Detector;
-import org.lcsim.hps.evio.TriggerData;
 import org.lcsim.hps.recon.ecal.ECalUtils;
 import org.lcsim.hps.recon.ecal.HPSEcalCluster;
 import org.lcsim.hps.util.ClockSingleton;
@@ -27,8 +27,6 @@
  */
 public class FADCTriggerDriver extends TriggerDriver {
 
-    // A list to contain all cluster pairs in an event
-    List<HPSEcalCluster[]> clusterPairs;
     int nTriggers;
     int totalEvents;
     protected double beamEnergy = 2.2 * ECalUtils.GeV;
@@ -41,6 +39,8 @@
 //    private double energyDistanceThreshold = 0.8 / 2.2;
     private double energyDistanceDistance = 200; // mm
     private double energyDistanceThreshold = 0.5;
+    // maximum time difference between two clusters, in units of readout cycles (4 ns).
+    private int pairCoincidence = 2;
     int allPairs;
     int oppositeQuadrantCount;
     int clusterEnergyCount;
@@ -55,6 +55,10 @@
     int truthPeriod = 250;
     private boolean useQuadrants = false;
     protected String clusterCollectionName = "EcalClusters";
+    // FIFO queues of lists of clusters in each ECal half.
+    // Each list corresponds to one readout cycle.
+    private Queue<List<HPSEcalCluster>> topClusterQueue = null;
+    private Queue<List<HPSEcalCluster>> botClusterQueue = null;
 
     private enum Flag {
 
@@ -74,10 +78,6 @@
         }
     }
 
-    public FADCTriggerDriver() {
-        clusterPairs = new LinkedList<HPSEcalCluster[]>();
-    }
-
     public void setClusterCollectionName(String clusterCollectionName) {
         this.clusterCollectionName = clusterCollectionName;
     }
@@ -121,6 +121,10 @@
         this.truthPeriod = truthPeriod;
     }
 
+    public void setPairCoincidence(int pairCoincidence) {
+        this.pairCoincidence = pairCoincidence;
+    }
+
     @Override
     public void detectorChanged(Detector detector) {
         setBeamEnergy(this.getBeamEnergyFromDetector(detector));
@@ -143,6 +147,15 @@
 
     @Override
     public void startOfData() {
+        //initialize queues and fill with empty lists
+        topClusterQueue = new LinkedList<List<HPSEcalCluster>>();
+        botClusterQueue = new LinkedList<List<HPSEcalCluster>>();
+        for (int i = 0; i < 2 * pairCoincidence + 1; i++) {
+            topClusterQueue.add(new ArrayList<HPSEcalCluster>());
+        }
+        for (int i = 0; i < pairCoincidence + 1; i++) {
+            botClusterQueue.add(new ArrayList<HPSEcalCluster>());
+        }
         super.startOfData();
         if (clusterCollectionName == null) {
             throw new RuntimeException("The parameter clusterCollectionName was not set!");
@@ -158,23 +171,28 @@
     }
 
     @Override
+    public void process(EventHeader event) {
+        if (event.hasCollection(HPSEcalCluster.class, clusterCollectionName)) {
+            // this needs to run every readout cycle whether or not trigger is live
+            updateClusterQueues(event.get(HPSEcalCluster.class, clusterCollectionName));
+        }
+        super.process(event);
+    }
+
+    @Override
     protected boolean triggerDecision(EventHeader event) {
         // Get the list of raw ECal hits.
         if (event.hasCollection(HPSEcalCluster.class, clusterCollectionName)) {
-            return testTrigger(event.get(HPSEcalCluster.class, clusterCollectionName));
+            return testTrigger();
         } else {
             return false;
         }
     }
 
-    public boolean testTrigger(List<HPSEcalCluster> clusters) {
+    public boolean testTrigger() {
         boolean trigger = false;
 
-        if (useQuadrants) {
-            getClusterPairs(clusters);
-        } else {
-            getClusterPairsTopBot(clusters);
-        }
+        List<HPSEcalCluster[]> clusterPairs = getClusterPairsTopBot();
 
         //--- Apply Trigger Cuts ---//
 
@@ -323,70 +341,53 @@
         writer.close();
     }
 
-    /**
-     * 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
-     */
-    protected boolean getClusterPairs(List<HPSEcalCluster> ecalClusters) {
-        // Create a list which will hold all neighboring cluster to the cluster
-        // of interest
-        List< HPSEcalCluster> ecalClusterNeighbors = new LinkedList< HPSEcalCluster>();
-        ecalClusterNeighbors.addAll(ecalClusters);
-
-        // Clear the list of cluster pairs
-        clusterPairs.clear();
-
+    protected void updateClusterQueues(List<HPSEcalCluster> ecalClusters) {
+        ArrayList<HPSEcalCluster> topClusterList = new ArrayList<HPSEcalCluster>();
+        ArrayList<HPSEcalCluster> botClusterList = new ArrayList<HPSEcalCluster>();
         for (HPSEcalCluster ecalCluster : ecalClusters) {
-            // 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 (HPSEcalCluster ecalClusterNeighbor : ecalClusterNeighbors) {
-                if (ecalCluster.getEnergy() > ecalClusterNeighbor.getEnergy()) {
-                    HPSEcalCluster[] clusterPair = {ecalCluster, ecalClusterNeighbor};
-                    clusterPairs.add(clusterPair);
-                } else {
-                    HPSEcalCluster[] clusterPair = {ecalClusterNeighbor, ecalCluster};
-                    clusterPairs.add(clusterPair);
-                }
+//            System.out.format("add cluster\t%f\t%d\n", ecalCluster.getSeedHit().getTime(), ecalCluster.getSeedHit().getIdentifierFieldValue("iy"));
+            if (ecalCluster.getSeedHit().getIdentifierFieldValue("iy") > 0) {
+                topClusterList.add(ecalCluster);
+            } else {
+                botClusterList.add(ecalCluster);
             }
         }
 
-        return !clusterPairs.isEmpty();
+        topClusterQueue.add(topClusterList);
+        botClusterQueue.add(botClusterList);
+        topClusterQueue.remove();
+        botClusterQueue.remove();
     }
 
-    protected boolean getClusterPairsTopBot(List<HPSEcalCluster> ecalClusters) {
-        // Create a list which will hold all neighboring cluster to the cluster
-        // of interest
-        List< HPSEcalCluster> topClusters = new ArrayList< HPSEcalCluster>();
-        List< HPSEcalCluster> botClusters = new ArrayList< HPSEcalCluster>();
-        for (HPSEcalCluster ecalCluster : ecalClusters) {
-            if (ecalCluster.getSeedHit().getIdentifierFieldValue("iy") > 0) {
-                topClusters.add(ecalCluster);
-            } else {
-                botClusters.add(ecalCluster);
-            }
-        }
-        // Clear the list of cluster pairs
-        clusterPairs.clear();
+    /**
+     * Get a list of all unique cluster pairs in the event
+     *
+     * @param ecalClusters : List of ECal clusters
+     * @return list of cluster pairs
+     */
+    protected List<HPSEcalCluster[]> getClusterPairsTopBot() {
+        // Make a list of cluster pairs
+        List<HPSEcalCluster[]> clusterPairs = new ArrayList<HPSEcalCluster[]>();
 
         // Loop over all top-bottom pairs of clusters; higher-energy cluster goes first in the pair
-        for (HPSEcalCluster topCluster : topClusters) {
-            for (HPSEcalCluster botCluster : botClusters) {
-                if (topCluster.getEnergy() > botCluster.getEnergy()) {
-                    HPSEcalCluster[] clusterPair = {topCluster, botCluster};
-                    clusterPairs.add(clusterPair);
-                } else {
-                    HPSEcalCluster[] clusterPair = {botCluster, topCluster};
-                    clusterPairs.add(clusterPair);
+        // To apply pair coincidence time, use only bottom clusters from the 
+        // readout cycle pairCoincidence readout cycles ago, and top clusters 
+        // from all 2*pairCoincidence+1 previous readout cycles
+        for (HPSEcalCluster botCluster : botClusterQueue.element()) {
+            for (List<HPSEcalCluster> topClusters : topClusterQueue) {
+                for (HPSEcalCluster topCluster : topClusters) {
+//                    System.out.format("%f\t%f\n", topCluster.getSeedHit().getTime(), botCluster.getSeedHit().getTime());
+                    if (topCluster.getEnergy() > botCluster.getEnergy()) {
+                        HPSEcalCluster[] clusterPair = {topCluster, botCluster};
+                        clusterPairs.add(clusterPair);
+                    } else {
+                        HPSEcalCluster[] clusterPair = {botCluster, topCluster};
+                        clusterPairs.add(clusterPair);
+                    }
                 }
             }
         }
-        return !clusterPairs.isEmpty();
+        return clusterPairs;
     }
 
     /**

java/trunk/hps-java/src/main/java/org/lcsim/hps/readout/ecal
FADCTriggerVariableDriver.java 339 -> 340
--- java/trunk/hps-java/src/main/java/org/lcsim/hps/readout/ecal/FADCTriggerVariableDriver.java	2014-03-25 00:32:58 UTC (rev 339)
+++ java/trunk/hps-java/src/main/java/org/lcsim/hps/readout/ecal/FADCTriggerVariableDriver.java	2014-03-25 00:56:25 UTC (rev 340)
@@ -71,11 +71,13 @@
         	//for(HPSEcalCluster cl : unique_clusters) {
         	//	System.out.printf("%s: cl E %f x %f y %f \n",this.getClass().getSimpleName(),cl.getEnergy(),cl.getPosition()[0],cl.getPosition()[1]);
         	//}
-        	
-            boolean foundClusterPairs = getClusterPairs(unique_clusters);
-            
-            if( foundClusterPairs) {
 
+            updateClusterQueues(unique_clusters);
+            List<HPSEcalCluster[]> clusterPairs = getClusterPairsTopBot();
+            boolean foundClusterPairs = !clusterPairs.isEmpty();
+
+            if (foundClusterPairs) {
+
             int ipair = 0;
             for(HPSEcalCluster[] pair : clusterPairs) {
             

java/trunk/hps-java/src/main/resources/org/lcsim/hps/steering/readout
HPS2014ReadoutToLcio.lcsim 339 -> 340
--- java/trunk/hps-java/src/main/resources/org/lcsim/hps/steering/readout/HPS2014ReadoutToLcio.lcsim	2014-03-25 00:32:58 UTC (rev 339)
+++ java/trunk/hps-java/src/main/resources/org/lcsim/hps/steering/readout/HPS2014ReadoutToLcio.lcsim	2014-03-25 00:56:25 UTC (rev 340)
@@ -39,7 +39,7 @@
         </driver>
 			
         <driver name="EcalReadout" type="org.lcsim.hps.readout.ecal.FADCEcalReadoutDriver">
-            <coincidenceWindow>2</coincidenceWindow>
+            <coincidenceWindow>1</coincidenceWindow>
             <ecalName>Ecal</ecalName>
             <ecalCollectionName>EcalHits</ecalCollectionName>
             <ecalRawCollectionName>EcalRawHits</ecalRawCollectionName>
@@ -59,15 +59,16 @@
 <!--            <debug>true</debug>-->
         </driver>	
 
-        <driver name="EcalClusterer" type="org.lcsim.hps.recon.ecal.CTPEcalClusterer">
+        <driver name="EcalClusterer" type="org.lcsim.hps.recon.ecal.GTPEcalClusterer">
             <ecalName>Ecal</ecalName>
-            <clusterWindow>8.0</clusterWindow>
+            <clusterWindow>1</clusterWindow>
             <ecalCollectionName>EcalCorrectedHits</ecalCollectionName>
         </driver>
 
         <driver name="EcalTrigger" type="org.lcsim.hps.readout.ecal.FADCTriggerDriver">
             <clusterCollectionName>EcalClusters</clusterCollectionName>
             <deadTime>10</deadTime>
+            <pairCoincidence>2</pairCoincidence>
             <outputFileName>${outputFile}.triggers</outputFileName>
         </driver>	
         <driver name="SimpleSVTReadout" type="org.lcsim.hps.recon.tracking.SimpleSvtReadout">
SVNspam 0.1