Print

Print


Author: [log in to unmask]
Date: Fri Sep 11 09:15:53 2015
New Revision: 3586

Log:
trigger decision helper and analysis class

Added:
    java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/TriggerDecisionCalculator.java
Modified:
    java/trunk/analysis/src/main/java/org/hps/analysis/trigger/TriggerTurnOnDriver.java

Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/TriggerTurnOnDriver.java
 =============================================================================
--- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/TriggerTurnOnDriver.java	(original)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/TriggerTurnOnDriver.java	Fri Sep 11 09:15:53 2015
@@ -7,18 +7,16 @@
 import hep.aida.IHistogram1D;
 import hep.aida.IPlotter;
 import hep.aida.IPlotterStyle;
-import hep.aida.ref.AnalysisFactory;
 
 import java.util.List;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-import org.hps.record.triggerbank.AbstractIntData;
-import org.hps.record.triggerbank.TIData;
+import org.hps.analysis.trigger.util.TriggerDecisionCalculator;
+import org.hps.analysis.trigger.util.TriggerDecisionCalculator.TriggerType;
 import org.hps.util.BasicLogFormatter;
 import org.lcsim.event.Cluster;
 import org.lcsim.event.EventHeader;
-import org.lcsim.event.GenericObject;
 import org.lcsim.geometry.Detector;
 import org.lcsim.util.Driver;
 import org.lcsim.util.aida.AIDA;
@@ -30,14 +28,18 @@
  */
 public class TriggerTurnOnDriver extends Driver {
 
-    private static Logger logger = LogUtil.create(TriggerTurnOnDriver.class, new BasicLogFormatter(), Level.INFO);
-    private String triggerBankCollectionName = "TriggerBank";
-    private String ecalClusterCollectionName = "EcalClusters";
+    private static Logger logger = LogUtil.create(TriggerTurnOnDriver.class, new BasicLogFormatter(), Level.FINE);
+    private final String triggerBankCollectionName = "TriggerBank";
+    private final String ecalClusterCollectionName = "EcalClustersCorr";
     IPlotter plotter;
+    IPlotter plotter2;
     private AIDA aida = AIDA.defaultInstance();
     IHistogram1D clusterE_Random;
     IHistogram1D clusterE_RandomSingles1;
-    IHistogram1D trigEff;
+    IHistogram1D clusterEOne_Random;
+    IHistogram1D clusterEOne_RandomSingles1;
+    IHistogram1D clusterE_RandomSingles1_trigEff;
+    IHistogram1D clusterEOne_RandomSingles1_trigEff;
     private boolean showPlots = true;
     private int nEventsProcessed = 0;
     
@@ -52,114 +54,95 @@
         
         aida.tree().cd("/");
         IAnalysisFactory fac = aida.analysisFactory();
-        plotter = fac.createPlotterFactory().create("HPS Tracking Plots");
-        plotter.setTitle("Momentum");
+
+        plotter = fac.createPlotterFactory().create("Trigger Efficiency");
         IPlotterStyle style = plotter.style();
         style.dataStyle().fillStyle().setColor("yellow");
         style.dataStyle().errorBarStyle().setVisible(false);
         plotter.createRegions(2, 2);
-        //plotterFrame.addPlotter(plotter);
-
-        clusterE_Random = aida.histogram1D("Cluster E rndm", 50, 0., 1.5);
-        clusterE_RandomSingles1 = aida.histogram1D("Cluster E rndm+singles1", 50, 0., 1.5);
-        trigEff = aida.histogram1D("trigEff", 50, 0., 1.5);
-
+        clusterE_Random = aida.histogram1D("clusterE_Random", 50, 0., 1.5);
+        clusterE_RandomSingles1 = aida.histogram1D("clusterE_RandomSingles1", 50, 0., 1.5);
+        plotter.setTitle("Cluster E efficiency");
         plotter.region(0).plot(clusterE_Random);
-
         plotter.region(1).plot(clusterE_RandomSingles1);
+        if(showPlots) plotter.show();
         
-        plotter.region(2).plot(trigEff);
-
-        if(showPlots) plotter.show();
+        plotter2 = fac.createPlotterFactory().create("Trigger Efficiency One");
+        plotter2.createRegions(2, 2);
+        clusterEOne_Random = aida.histogram1D("clusterEOne_Random", 50, 0., 1.5);
+        clusterEOne_RandomSingles1 = aida.histogram1D("clusterEOne_RandomSingles1", 50, 0., 1.5);
+        plotter2.region(0).plot(clusterEOne_Random);
+        plotter2.region(1).plot(clusterEOne_RandomSingles1);
+        if(showPlots) plotter2.show();
         
     }
     
     @Override
     protected void process(EventHeader event) {
 
-        // Get the list of trigger banks from the event
-        List<GenericObject> triggerBanks = event.get(GenericObject.class, triggerBankCollectionName);
+        
+        TriggerDecisionCalculator triggerDecisions = new TriggerDecisionCalculator(event);
+        
+        if(!triggerDecisions.passed(TriggerType.PULSER))
+            return;
+        
+        logger.fine("pulser trigger fired");
 
-        boolean isRandomTriggerEvent = false;
-        boolean isSingles1TriggerEvent = false;
+        if(triggerDecisions.passed(TriggerType.SINGLES1))
+            logger.fine("Singles1 trigger fired");
+        
+        if(triggerDecisions.passed(TriggerType.SINGLES1_SIM))
+            logger.fine("Sim Singles1 trigger fired");
+        
+        
+        List<Cluster> clusters = null;
+        Cluster clusterEMax = null;
+        
+        if(event.hasCollection(Cluster.class , ecalClusterCollectionName)) 
+            clusters = event.get(Cluster.class, ecalClusterCollectionName);
 
-        // Loop through the collection of banks and get the TI banks.
-        for (GenericObject triggerBank : triggerBanks) {
-
-            // If the bank contains TI data, process it
-            if (AbstractIntData.getTag(triggerBank) == TIData.BANK_TAG) {
-
-                TIData tiData = new TIData(triggerBank);
-
-                if(tiData.isPulserTrigger()) {
-                    isRandomTriggerEvent = true;
-                } else if(tiData.isSingle1Trigger()) {
-                    isSingles1TriggerEvent = true;
+        if(clusters != null) {
+            for(Cluster cluster : clusters) {
+                if(clusterEMax != null) {
+                    if(cluster.getEnergy() > clusterEMax.getEnergy()) 
+                        clusterEMax = cluster;
+                } else {
+                    clusterEMax = cluster;
                 }
             }
         }
 
-
-        if(isRandomTriggerEvent) {
-
-            logger.info("Random trigger fired");
-
-            // find offline ecal clusters -> denominator
-            // count how often the singles1trigger fired for a given offline cluster (vs E, x, y)
-
-            if(event.hasCollection(Cluster.class , ecalClusterCollectionName)) {
-
-
-                List<Cluster> clusters = event.get(Cluster.class, ecalClusterCollectionName);
-
-                for(Cluster cluster : clusters) {
-
-                    clusterE_Random.fill(cluster.getEnergy());
-                    nEventsProcessed++;
-
-                }
-
-
+        // fill denominator
+        if(clusterEMax!=null) {
+            clusterE_Random.fill(clusterEMax.getEnergy());
+            if(clusters.size() == 1) {
+                clusterEOne_Random.fill(clusterEMax.getEnergy());
             }
-
-        } else if(isSingles1TriggerEvent) {
-
-            logger.info("Singles1 trigger fired");
-        }
-        
-        
-        if (isRandomTriggerEvent && isSingles1TriggerEvent) {
-            
-            logger.info("Eureka. They both fired.");
-            if(event.hasCollection(Cluster.class , ecalClusterCollectionName)) {
-
-
-                List<Cluster> clusters = event.get(Cluster.class, ecalClusterCollectionName);
-
-                for(Cluster cluster : clusters) {
-
-                    clusterE_RandomSingles1.fill(cluster.getEnergy());
-
-                }
-
-
-            }
-            
-            
         }
 
-        
-        if(nEventsProcessed % 10 == 0 ) {
-            trigEff = aida.histogramFactory().divide("trigEff", clusterE_RandomSingles1, clusterE_Random);
+        // fill numerator
+        if (triggerDecisions.passed(TriggerType.SINGLES1_SIM)) {
+            logger.fine("Eureka. They both fired.");
+            if(clusterEMax != null) {
+                clusterE_RandomSingles1.fill(clusterEMax.getEnergy());
+                if(clusters.size() == 1) 
+                    clusterEOne_RandomSingles1.fill(clusterEMax.getEnergy());
+            }
         }
 
+        nEventsProcessed++;
+        
 
     }
     
     @Override
     protected void endOfData() {
+        clusterE_RandomSingles1_trigEff = aida.histogramFactory().divide("trigEff", clusterE_RandomSingles1, clusterE_Random);
+        clusterEOne_RandomSingles1_trigEff = aida.histogramFactory().divide("trigEffEone", clusterEOne_RandomSingles1, clusterEOne_Random);
+        logger.info("entries in clusterE_RandomSingles1_trigEff: " + Integer.toString(clusterE_RandomSingles1_trigEff.allEntries()));
+        plotter.region(2).plot(clusterE_RandomSingles1_trigEff);
+        plotter2.region(2).plot(clusterEOne_RandomSingles1_trigEff);
         
-
     }
 
 }

Added: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/TriggerDecisionCalculator.java
 =============================================================================
--- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/TriggerDecisionCalculator.java	(added)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/TriggerDecisionCalculator.java	Fri Sep 11 09:15:53 2015
@@ -0,0 +1,135 @@
+/**
+ * 
+ */
+package org.hps.analysis.trigger.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hps.record.triggerbank.AbstractIntData;
+import org.hps.record.triggerbank.SSPCluster;
+import org.hps.record.triggerbank.SSPData;
+import org.hps.record.triggerbank.TIData;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.GenericObject;
+
+/**
+ * @author Per Hansson Adrian <[log in to unmask]>
+ *
+ */
+public class TriggerDecisionCalculator {
+
+    public enum TriggerType {
+        SINGLES0, SINGLES1, PAIR0, PAIR1, SINGLES1_SIM, PULSER
+    }
+
+    private List<TriggerType> passedTriggers = new ArrayList<TriggerType>();
+
+    public TriggerDecisionCalculator(EventHeader event) {
+        process(event);
+    }
+    
+    public void add(TriggerType type) {
+        passedTriggers.add(type);
+    }
+
+    public boolean passed(TriggerType type) {
+        for(TriggerType passed : passedTriggers) {
+            if( passed == type) 
+                return true;
+        }
+        return false;
+    }
+
+    public void process(EventHeader event) {
+        List<GenericObject> triggerBanks = event.get(GenericObject.class, "TriggerBank");
+        for (GenericObject triggerBank : triggerBanks) {
+            if(AbstractIntData.getTag(triggerBank) == SSPData.BANK_TAG) {
+                SSPData sspBank = new SSPData(triggerBank);
+                List<SSPCluster> sspClusters = sspBank.getClusters();
+                List<List<SinglesTrigger<SSPCluster>>> singleTriggers = constructSinglesTriggersFromSSP(sspClusters);
+                if( singleTriggers.get(1).size() > 0 )
+                    passedTriggers.add(TriggerType.SINGLES1_SIM);
+            } 
+            else if (AbstractIntData.getTag(triggerBank) == TIData.BANK_TAG) {
+                TIData tiData = new TIData(triggerBank);
+                if(tiData.isSingle0Trigger())
+                    passedTriggers.add(TriggerType.SINGLES0);
+                else if(tiData.isSingle1Trigger())
+                    passedTriggers.add(TriggerType.SINGLES1);
+                else if(tiData.isPair0Trigger())
+                    passedTriggers.add(TriggerType.PAIR0);
+                else if(tiData.isPair1Trigger())
+                    passedTriggers.add(TriggerType.PAIR1);
+                else if(tiData.isPulserTrigger()) 
+                    passedTriggers.add(TriggerType.PULSER);
+            }
+        }      
+    }
+    
+    
+    static public List<List<SinglesTrigger<SSPCluster>>> constructSinglesTriggersFromSSP(List<SSPCluster> clusters) {
+        
+        List<List<SinglesTrigger<SSPCluster>>> triggers = new ArrayList<List<SinglesTrigger<SSPCluster>>>(2); 
+        // Instantiate the triggers lists.
+        for(int triggerNum = 0; triggerNum < 2; triggerNum++) 
+            triggers.add(new ArrayList<SinglesTrigger<SSPCluster>>());
+        
+    
+        
+        final double ENERGY_CUT_LOW[] = {0.5,0.0}; 
+        final double ENERGY_CUT_HIGH[] = {8.191,8.191}; 
+        final int HIT_COUNT_CUT_LOW[] = {0,0}; 
+        final boolean singlesCutsEnabled_ENERGY_MIN[] = {true,true};
+        final boolean singlesCutsEnabled_ENERGY_MAX[] = {true,true};
+        final boolean singlesCutsEnabled_HIT_COUNT[] = {true,true};
+       
+        
+        for(SSPCluster cluster : clusters) {
+           
+            triggerLoop:
+            for(int triggerNum = 0; triggerNum < 2; triggerNum++) {
+                // For a cluster to have formed it is assumed to have
+                // passed the cluster seed energy cuts. This can not
+                // be verified since the SSP bank does not report
+                // individual hit. 
+                boolean passSeedLow = true;
+                boolean passSeedHigh = true;
+                
+                // The remaining cuts may be acquired from trigger module.
+                boolean passClusterLow = cluster.getEnergy() >= ENERGY_CUT_LOW[triggerNum] ? true : false; 
+                boolean passClusterHigh = cluster.getEnergy() <= ENERGY_CUT_HIGH[triggerNum] ? true : false; 
+                boolean passHitCount = cluster.getHitCount() >= HIT_COUNT_CUT_LOW[triggerNum] ? true : false; 
+                
+                // Make a trigger to store the results.
+                SinglesTrigger<SSPCluster> trigger = new SinglesTrigger<SSPCluster>(cluster, triggerNum);
+                trigger.setStateSeedEnergyLow(passSeedLow);
+                trigger.setStateSeedEnergyHigh(passSeedHigh);
+                trigger.setStateClusterEnergyLow(passClusterLow);
+                trigger.setStateClusterEnergyHigh(passClusterHigh);
+                trigger.setStateHitCount(passHitCount);
+                
+                // A trigger will only be reported by the SSP if it
+                // passes all of the enabled cuts for that trigger.
+                // Check whether this trigger meets these conditions.
+                // Set the singles cut statuses.
+                if(singlesCutsEnabled_ENERGY_MIN[triggerNum] && !trigger.getStateClusterEnergyLow()) {
+                    continue triggerLoop;
+                } if(singlesCutsEnabled_ENERGY_MAX[triggerNum] && !trigger.getStateClusterEnergyHigh()) {
+                    continue triggerLoop;
+                } if(singlesCutsEnabled_HIT_COUNT[triggerNum] && !trigger.getStateHitCount()) {
+                    continue triggerLoop;
+                }
+                
+                // If all the necessary checks passed, store the new
+                // trigger for verification.
+                
+                triggers.get(triggerNum).add(trigger);
+            }
+        }
+        return triggers;
+    }
+    
+
+
+}