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