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