LISTSERV mailing list manager LISTSERV 16.5

Help for HPS-SVN Archives


HPS-SVN Archives

HPS-SVN Archives


HPS-SVN@LISTSERV.SLAC.STANFORD.EDU


View:

Message:

[

First

|

Previous

|

Next

|

Last

]

By Topic:

[

First

|

Previous

|

Next

|

Last

]

By Author:

[

First

|

Previous

|

Next

|

Last

]

Font:

Proportional Font

LISTSERV Archives

LISTSERV Archives

HPS-SVN Home

HPS-SVN Home

HPS-SVN  March 2015

HPS-SVN March 2015

Subject:

r2491 - in /java/trunk/analysis/src/main/java/org/hps/analysis/trigger: TriggerDiagnosticDriver.java event/TriggerMatchEvent.java event/TriggerMatchStatus.java event/TriggerMatchedPair.java event/TriggerPlotsModule.java event/TriggerStatModule.java

From:

[log in to unmask]

Reply-To:

Notification of commits to the hps svn repository <[log in to unmask]>

Date:

Thu, 19 Mar 2015 17:30:12 -0000

Content-Type:

text/plain

Parts/Attachments:

Parts/Attachments

text/plain (1025 lines)

Author: [log in to unmask]
Date: Thu Mar 19 10:30:08 2015
New Revision: 2491

Log:
Updated trigger diagnostic functionality and fixed a statistics tracking bug. Additionally, added in support for diagnostic trigger plots and their management.

Added:
    java/trunk/analysis/src/main/java/org/hps/analysis/trigger/event/TriggerPlotsModule.java
Modified:
    java/trunk/analysis/src/main/java/org/hps/analysis/trigger/TriggerDiagnosticDriver.java
    java/trunk/analysis/src/main/java/org/hps/analysis/trigger/event/TriggerMatchEvent.java
    java/trunk/analysis/src/main/java/org/hps/analysis/trigger/event/TriggerMatchStatus.java
    java/trunk/analysis/src/main/java/org/hps/analysis/trigger/event/TriggerMatchedPair.java
    java/trunk/analysis/src/main/java/org/hps/analysis/trigger/event/TriggerStatModule.java

Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/TriggerDiagnosticDriver.java
 =============================================================================
--- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/TriggerDiagnosticDriver.java	(original)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/TriggerDiagnosticDriver.java	Thu Mar 19 10:30:08 2015
@@ -22,6 +22,7 @@
 import org.hps.analysis.trigger.event.TriggerEfficiencyModule;
 import org.hps.analysis.trigger.event.TriggerMatchEvent;
 import org.hps.analysis.trigger.event.TriggerMatchStatus;
+import org.hps.analysis.trigger.event.TriggerPlotsModule;
 import org.hps.analysis.trigger.util.OutputLogger;
 import org.hps.analysis.trigger.util.Pair;
 import org.hps.analysis.trigger.util.PairTrigger;
@@ -125,7 +126,14 @@
 	private static final int ENERGY_SLOPE = TriggerDiagnosticUtil.PAIR_ENERGY_SLOPE;
 	private static final int COPLANARITY  = TriggerDiagnosticUtil.PAIR_COPLANARITY;
     
+	// Cut names for logging.
+	private static final String[][] cutNames = {
+			{ "E_min", "E_max", "hit count", "null" },
+			{ "E_sum", "E_diff", "E_slope", "coplanar" }
+	};
+	
 	// Temporary AIDA Plots
+	private TriggerPlotsModule globalTriggerPlots = new TriggerPlotsModule(0, 0);
 	private static final int RECON   = 0;
 	private static final int SSP     = 1;
 	private static final int ALL     = 0;
@@ -134,58 +142,57 @@
 	private AIDA aida = AIDA.defaultInstance();
 	private IHistogram1D[][] clusterHitPlot = {
 			{
-				aida.histogram1D("Trigger Diagnostics :: Recon Cluster Hit Count (All)",     9, 0.5, 9.5),
-				aida.histogram1D("Trigger Diagnostics :: Recon Cluster Hit Count (Matched)", 9, 0.5, 9.5),
-				aida.histogram1D("Trigger Diagnostics :: Recon Cluster Hit Count (Failed)",  9, 0.5, 9.5)
+				aida.histogram1D("cluster/Recon Cluster Hit Count (All)",     9, 0.5, 9.5),
+				aida.histogram1D("cluster/Recon Cluster Hit Count (Matched)", 9, 0.5, 9.5),
+				aida.histogram1D("cluster/Recon Cluster Hit Count (Failed)",  9, 0.5, 9.5)
 			},
 			{
-				aida.histogram1D("Trigger Diagnostics :: SSP Cluster Hit Count (All)",     9, 0.5, 9.5),
-				aida.histogram1D("Trigger Diagnostics :: SSP Cluster Hit Count (Matched)", 9, 0.5, 9.5),
-				aida.histogram1D("Trigger Diagnostics :: SSP Cluster Hit Count (Failed)",  9, 0.5, 9.5)
+				aida.histogram1D("cluster/SSP Cluster Hit Count (All)",     9, 0.5, 9.5),
+				aida.histogram1D("cluster/SSP Cluster Hit Count (Matched)", 9, 0.5, 9.5),
+				aida.histogram1D("cluster/SSP Cluster Hit Count (Failed)",  9, 0.5, 9.5)
 			}
 	};
 	private IHistogram1D[][] clusterEnergyPlot = {
 			{
-				aida.histogram1D("Trigger Diagnostics :: Recon Cluster Energy (All)",     300, 0.0, 3.0),
-				aida.histogram1D("Trigger Diagnostics :: Recon Cluster Energy (Matched)", 300, 0.0, 3.0),
-				aida.histogram1D("Trigger Diagnostics :: Recon Cluster Energy (Failed)",  300, 0.0, 3.0)
+				aida.histogram1D("cluster/Recon Cluster Energy (All)",     300, 0.0, 3.0),
+				aida.histogram1D("cluster/Recon Cluster Energy (Matched)", 300, 0.0, 3.0),
+				aida.histogram1D("cluster/Recon Cluster Energy (Failed)",  300, 0.0, 3.0)
 			},
 			{
-				aida.histogram1D("Trigger Diagnostics :: SSP Cluster Energy (All)",     300, 0.0, 3.0),
-				aida.histogram1D("Trigger Diagnostics :: SSP Cluster Energy (Matched)", 300, 0.0, 3.0),
-				aida.histogram1D("Trigger Diagnostics :: SSP Cluster Energy (Failed)",  300, 0.0, 3.0)
+				aida.histogram1D("cluster/SSP Cluster Energy (All)",     300, 0.0, 3.0),
+				aida.histogram1D("cluster/SSP Cluster Energy (Matched)", 300, 0.0, 3.0),
+				aida.histogram1D("cluster/SSP Cluster Energy (Failed)",  300, 0.0, 3.0)
 			}
 	};
 	private IHistogram1D[][] clusterTimePlot = {
 			{
-				aida.histogram1D("Trigger Diagnostics :: Recon Cluster Time (All)",     115, 0, 460),
-				aida.histogram1D("Trigger Diagnostics :: Recon Cluster Time (Matched)", 115, 0, 460),
-				aida.histogram1D("Trigger Diagnostics :: Recon Cluster Time (Failed)",  115, 0, 460)
+				aida.histogram1D("cluster/Recon Cluster Time (All)",     115, 0, 460),
+				aida.histogram1D("cluster/Recon Cluster Time (Matched)", 115, 0, 460),
+				aida.histogram1D("cluster/Recon Cluster Time (Failed)",  115, 0, 460)
 			},
 			{
-				aida.histogram1D("Trigger Diagnostics :: SSP Cluster Time (All)",     115, 0, 460),
-				aida.histogram1D("Trigger Diagnostics :: SSP Cluster Time (Matched)", 115, 0, 460),
-				aida.histogram1D("Trigger Diagnostics :: SSP Cluster Time (Failed)",  115, 0, 460)
+				aida.histogram1D("cluster/SSP Cluster Time (All)",     115, 0, 460),
+				aida.histogram1D("cluster/SSP Cluster Time (Matched)", 115, 0, 460),
+				aida.histogram1D("cluster/SSP Cluster Time (Failed)",  115, 0, 460)
 			}
 	};
 	private IHistogram2D[][] clusterPositionPlot = {
 			{
-				aida.histogram2D("Trigger Diagnostics :: Recon Cluster Position (All)",     47, -23.5, 23.5, 11, -5.5, 5.5),
-				aida.histogram2D("Trigger Diagnostics :: Recon Cluster Position (Matched)", 47, -23.5, 23.5, 11, -5.5, 5.5),
-				aida.histogram2D("Trigger Diagnostics :: Recon Cluster Position (Failed)",  47, -23.5, 23.5, 11, -5.5, 5.5)
+				aida.histogram2D("cluster/Recon Cluster Position (All)",     47, -23.5, 23.5, 11, -5.5, 5.5),
+				aida.histogram2D("cluster/Recon Cluster Position (Matched)", 47, -23.5, 23.5, 11, -5.5, 5.5),
+				aida.histogram2D("cluster/Recon Cluster Position (Failed)",  47, -23.5, 23.5, 11, -5.5, 5.5)
 			},
 			{
-				aida.histogram2D("Trigger Diagnostics :: SSP Cluster Position (All)",     47, -23.5, 23.5, 11, -5.5, 5.5),
-				aida.histogram2D("Trigger Diagnostics :: SSP Cluster Position (Matched)", 47, -23.5, 23.5, 11, -5.5, 5.5),
-				aida.histogram2D("Trigger Diagnostics :: SSP Cluster Position (Failed)",  47, -23.5, 23.5, 11, -5.5, 5.5)
+				aida.histogram2D("cluster/SSP Cluster Position (All)",     47, -23.5, 23.5, 11, -5.5, 5.5),
+				aida.histogram2D("cluster/SSP Cluster Position (Matched)", 47, -23.5, 23.5, 11, -5.5, 5.5),
+				aida.histogram2D("cluster/SSP Cluster Position (Failed)",  47, -23.5, 23.5, 11, -5.5, 5.5)
 			}
 	};
 	private IHistogram2D[] energyhitDiffPlot = {
-		aida.histogram2D("Trigger Diagnostics :: Recon-SSP Energy-Hit Difference (All)",     60, -0.060, 0.060, 6, -3, 3),
-		aida.histogram2D("Trigger Diagnostics :: Recon-SSP Energy-Hit Difference (Matched)", 60, -0.060, 0.060, 6, -3, 3),
-		aida.histogram2D("Trigger Diagnostics :: Recon-SSP Energy-Hit Difference (Failed)",  60, -0.060, 0.060, 6, -3, 3)
+		aida.histogram2D("cluster/Recon-SSP Energy-Hit Difference (All)",     21, -0.010, 0.010, 6, -3, 3),
+		aida.histogram2D("cluster/Recon-SSP Energy-Hit Difference (Matched)", 21, -0.010, 0.010, 6, -3, 3),
+		aida.histogram2D("cluster/Recon-SSP Energy-Hit Difference (Failed)",  21, -0.010, 0.010, 6, -3, 3)
 	};
-	
 	
 	/**
 	 * Define the trigger modules. This should be replaced by parsing
@@ -218,6 +225,10 @@
 				public void actionPerformed(ActionEvent e) {
 					// Get the DAQ configuration.
 					DAQConfig daq = ConfigurationManager.getInstance();
+					
+					// Update the plotting energy slope values.
+					globalTriggerPlots.setEnergySlopeParamF(0, daq.getSSPConfig().getPair1Config().getEnergySlopeCutConfig().getParameterF());
+					globalTriggerPlots.setEnergySlopeParamF(1, daq.getSSPConfig().getPair2Config().getEnergySlopeCutConfig().getParameterF());
 					
 					// Load the DAQ settings from the configuration manager.
 					singlesTrigger[0].loadDAQConfiguration(daq.getSSPConfig().getSingles1Config());
@@ -346,7 +357,33 @@
 		System.out.printf("\tPair Events Failed    :: %d / %d (%7.3f%%)%n",
 				failedPairEvents, totalEvents, (100.0 * failedPairEvents / totalEvents));
 		
+		// Print out how many events were triggered by a type along
+		// with how many were verified.
+		System.out.println();
+		System.out.println("Event Failure Rate:");
+		System.out.printf("\tSingles Trigger 1     :: %d / %d",
+				triggerRunStats[0].getEventsOfTypeSeen(0), triggerRunStats[0].getEventsOfType(0));
+		if(triggerRunStats[0].getEventsOfType(0) != 0) {
+			System.out.printf(" %d / %d (%7.3f%%)%n", (100.0 * triggerRunStats[0].getEventsOfTypeSeen(0) / triggerRunStats[0].getEventsOfTypeSeen(0)));
+		} else { System.out.println(); }
+		System.out.printf("\tSingles Trigger 2     :: %d / %d",
+				triggerRunStats[0].getEventsOfTypeSeen(1), triggerRunStats[0].getEventsOfType(1));
+		if(triggerRunStats[0].getEventsOfType(0) != 0) {
+			System.out.printf(" %d / %d (%7.3f%%)%n", (100.0 * triggerRunStats[0].getEventsOfTypeSeen(1) / triggerRunStats[0].getEventsOfTypeSeen(1)));
+		} else { System.out.println(); }
+		System.out.printf("\tPair Trigger 1        :: %d / %d",
+				triggerRunStats[1].getEventsOfTypeSeen(0), triggerRunStats[0].getEventsOfType(0));
+		if(triggerRunStats[1].getEventsOfType(0) != 0) {
+			System.out.printf(" %d / %d (%7.3f%%)%n", (100.0 * triggerRunStats[1].getEventsOfTypeSeen(0) / triggerRunStats[1].getEventsOfTypeSeen(0)));
+		} else { System.out.println(); }
+		System.out.printf("\tPair Trigger 2        :: %d / %d",
+				triggerRunStats[1].getEventsOfTypeSeen(1), triggerRunStats[0].getEventsOfType(1));
+		if(triggerRunStats[1].getEventsOfType(0) != 0) {
+			System.out.printf(" %d / %d (%7.3f%%)%n", (100.0 * triggerRunStats[1].getEventsOfTypeSeen(1) / triggerRunStats[1].getEventsOfTypeSeen(1)));
+		} else { System.out.println(); }
+		
 		// Print the cluster verification data.
+		System.out.println();
 		System.out.println("Cluster Verification:");
 		System.out.printf("\tRecon Clusters        :: %d%n", clusterRunStats.getReconClusterCount());
 		System.out.printf("\tSSP Clusters          :: %d%n", clusterRunStats.getSSPClusterCount());
@@ -389,6 +426,7 @@
 				System.out.println();
 				System.out.printf("\tTrigger %d Individual Cut Failure Rate:%n", (triggerNum + 1));
 				if(sspTriggerCount == 0) {
+					System.out.printf("\t\tUmatched Triggers          :: %" + spaces + "d%n", triggerRunStats[0].getUnmatchedTriggers(triggerNum));
 						System.out.printf("\t\tCluster Energy Lower Bound :: %" + spaces + "d / %" + spaces + "d%n",
 								triggerRunStats[0].getCutFailures(triggerNum, ENERGY_MIN), sspTriggerCount);
 						System.out.printf("\t\tCluster Energy Upper Bound :: %" + spaces + "d / %" + spaces + "d%n",
@@ -396,6 +434,7 @@
 						System.out.printf("\t\tCluster Hit Count          :: %" + spaces + "d / %" + spaces + "d%n",
 								triggerRunStats[0].getCutFailures(triggerNum, HIT_COUNT), sspTriggerCount);
 					} else {
+						System.out.printf("\t\tUmatched Triggers          :: %" + spaces + "d%n", triggerRunStats[0].getUnmatchedTriggers(triggerNum));
 						System.out.printf("\t\tCluster Energy Lower Bound :: %" + spaces + "d / %" + spaces + "d (%7.3f%%)%n",
 								triggerRunStats[0].getCutFailures(triggerNum, ENERGY_MIN), sspTriggerCount,
 								(100.0 * triggerRunStats[0].getCutFailures(triggerNum, ENERGY_MIN) / sspTriggerCount));
@@ -413,6 +452,7 @@
 					System.out.println();
 					System.out.printf("\tTrigger %d Individual Cut Failure Rate:%n", (triggerNum + 1));
 					if(sspTriggerCount == 0) {
+						System.out.printf("\t\tUmatched Triggers          :: %" + spaces + "d%n", triggerRunStats[1].getUnmatchedTriggers(triggerNum));
 						System.out.printf("\t\tPair Energy Sum            :: %" + spaces + "d / %" + spaces + "d%n",
 								triggerRunStats[1].getCutFailures(triggerNum, ENERGY_SUM), sspTriggerCount);
 						System.out.printf("\t\tPair Energy Difference     :: %" + spaces + "d / %" + spaces + "d%n",
@@ -422,6 +462,7 @@
 						System.out.printf("\t\tPair Coplanarity           :: %" + spaces + "d / %" + spaces + "d%n",
 								triggerRunStats[1].getCutFailures(triggerNum, COPLANARITY), sspTriggerCount);
 					} else {
+						System.out.printf("\t\tUmatched Triggers          :: %" + spaces + "d%n", triggerRunStats[1].getUnmatchedTriggers(triggerNum));
 						System.out.printf("\t\tPair Energy Sum            :: %" + spaces + "d / %" + spaces + "d (%7.3f%%)%n",
 								triggerRunStats[1].getCutFailures(triggerNum, ENERGY_SUM), sspTriggerCount,
 								(100.0 * triggerRunStats[1].getCutFailures(triggerNum, ENERGY_SUM) / sspTriggerCount));
@@ -555,6 +596,9 @@
 					} else if(tiBank.isCalibTrigger()) {
 						OutputLogger.println("Trigger type :: Cosmic");
 						activeTrigger = TriggerDiagnosticUtil.TRIGGER_COSMIC;
+					} else {
+						System.err.println("TriggerDiagnosticDriver: Skipping event; no TI trigger source found.");
+						return;
 					}
 				}
 			}
@@ -568,6 +612,12 @@
 					OutputLogger.printf("%d SSP clusters found.%n", sspClusters.size());
 				}
 			}
+		}
+		
+		// Make sure that both an SSP bank and a TI bank were found.
+		if(tiBank == null || sspBank == null) {
+			System.err.println("TriggerDiagnosticDriver :: SEVERE WARNING :: TI bank or SSP bank missing from event!");
+			return;
 		}
 		
 		
@@ -858,12 +908,6 @@
 			}
 		}
 		 else { OutputLogger.println("\tNone"); }
-		
-		// Get the number of position failures.
-		//int failPosition = event.getPositionFailures();
-		//if(sspClusters == null || sspClusters.isEmpty()) {
-		//	failPosition = (reconClusters == null ? 0 : reconClusters.size());
-		//}
 		
 		// Print event statistics.
 		OutputLogger.println();
@@ -1372,11 +1416,11 @@
 		
 		// Iterate over the triggers.
 		OutputLogger.println();
-		OutputLogger.println("Matching SSP Reported Triggers to SSP Simulated Trigger:");
+		OutputLogger.println("Matching SSP Reported Triggers to SSP Simulated Triggers:");
 		for(SSPNumberedTrigger sspTrigger : sspTriggers) {
 			// Get the trigger information.
 			int triggerNum = sspTrigger.isFirstTrigger() ? 0 : 1;
-			OutputLogger.printf("Considering %s%n", sspTrigger.toString());
+			OutputLogger.printf("\t%s%n", sspTrigger.toString());
 			
 			// Iterate over the SSP cluster simulated triggers and
 			// look for a trigger that matches.
@@ -1384,7 +1428,7 @@
 			for(Trigger<?> simTrigger : sspTriggerList.get(triggerNum)) {
 				// VERBOSE :: Output the trigger being considered for
 				//            matching.
-				OutputLogger.printf("\tTrigger %d :: %s :: %3.0f :: %s ",
+				OutputLogger.printf("\t\tTrigger %d :: %s :: %3.0f :: %s ",
 						(triggerNum + 1), triggerPositionString(simTrigger),
 						getTriggerTime(simTrigger), simTrigger.toString());
 				
@@ -1407,7 +1451,8 @@
 				boolean[] matchedCuts = triggerCutMatch(simTrigger, sspTrigger);
 				for(int i = 0; i < matchedCuts.length; i++) {
 					if(!matchedCuts[i]) {
-						OutputLogger.printf("[ %-15s ]%n", String.format("failed; cut %d", i));
+						int typeIndex = isSingles ? 0 : 1;
+						OutputLogger.printf("[ %-15s ]%n", String.format("failed; %s", cutNames[typeIndex][i]));
 						continue matchLoop;
 					}
 				}
@@ -1422,14 +1467,34 @@
 			}
 		}
 		
+		for(int triggerNum = 0; triggerNum < 2; triggerNum++) {
+			for(Trigger<?> simTrigger : sspTriggerList.get(triggerNum)) {
+				globalTriggerPlots.sawTrigger(simTrigger);
+				if(simTriggerSet.contains(simTrigger)) {
+					globalTriggerPlots.matchedTrigger(simTrigger);
+				} else {
+					globalTriggerPlots.failedTrigger(simTrigger);
+				}
+			}
+		}
+		
 		// Iterate over the unmatched simulated triggers again and the
 		// unmatched SSP reported trigger that most closely matches it.
-		simLoop:
+		OutputLogger.println();
+		OutputLogger.println("Matching Failed SSP Reported Triggers to Remaining SSP Simulated Triggers:");
 		for(int triggerNum = 0; triggerNum < 2; triggerNum++) {
+			simLoop:
 			for(Trigger<?> simTrigger : sspTriggerList.get(triggerNum)) {
+				OutputLogger.printf("\tTrigger %d :: %s :: %3.0f :: %s%n",
+						(triggerNum + 1), triggerPositionString(simTrigger),
+						getTriggerTime(simTrigger), simTrigger.toString());
+				
 				// Check whether this trigger has already been matched
 				// or not. If it has been matched, skip it.
-				if(simTriggerSet.contains(simTrigger)) { continue simLoop; }
+				if(simTriggerSet.contains(simTrigger)) {
+					OutputLogger.println("\t\tSkipping; already matched successfully");
+					continue simLoop;
+				}
 				
 				// Get the trigger time for the simulated trigger.
 				double simTime = getTriggerTime(simTrigger);
@@ -1440,18 +1505,27 @@
 				boolean[] matchedCut = null;
 				SSPNumberedTrigger bestMatch = null;
 				
+				// Store the readout for the best match.
+				String bestMatchText = null;
+				
 				// Iterate over the reported triggers to find a match.
 				reportedLoop:
 				for(SSPNumberedTrigger sspTrigger : sspTriggers) {
+					OutputLogger.printf("\t\t%s ", sspTrigger.toString());
+					
 					// If the two triggers have different times, this
 					// trigger should be skipped.
 					if(sspTrigger.getTime() != simTime) {
+						OutputLogger.printf("[ %-15s ]%n", "failed; time");
 						continue reportedLoop;
 					}
 					
 					// If this reported trigger has been matched then
 					// it should be skipped.
-					if(sspTriggerSet.contains(sspTrigger)) { continue reportedLoop; }
+					if(sspTriggerSet.contains(sspTrigger)) {
+						OutputLogger.printf("[ %-15s ]%n", "failed; matched");
+						continue reportedLoop;
+					}
 					
 					// Check each of the cuts.
 					boolean[] tempMatchedCut = triggerCutMatch(simTrigger, sspTrigger);
@@ -1460,6 +1534,7 @@
 					// than the previous best match.
 					int tempNumMatched = 0;
 					for(boolean passed : tempMatchedCut) { if(passed) { tempNumMatched++; } }
+					OutputLogger.printf("[ %-15s ]%n", String.format("maybe; %d failed", tempNumMatched));
 					
 					// If the number of matched cuts exceeds the old
 					// best result, this becomes the new best result.
@@ -1467,6 +1542,7 @@
 						numMatched = tempNumMatched;
 						matchedCut = tempMatchedCut;
 						bestMatch = sspTrigger;
+						bestMatchText = String.format("%s%n", sspTrigger.toString());
 					}
 				}
 				
@@ -1476,8 +1552,17 @@
 				if(bestMatch == null) {
 					if(isSingles) { singlesInternalFail = true; }
 					else { pairInternalFail = true; }
+					event.matchedSSPPair(simTrigger, bestMatch, matchedCut);
+					OutputLogger.printf("\t\tTrigger %d :: %s :: %3.0f :: %s",
+							(triggerNum + 1), triggerPositionString(simTrigger),
+							getTriggerTime(simTrigger), simTrigger.toString());
+					OutputLogger.println(" --> No Valid Match Found");
 				} else {
 					event.matchedSSPPair(simTrigger, bestMatch, matchedCut);
+					OutputLogger.printf("\t\tTrigger %d :: %s :: %3.0f :: %s",
+							(triggerNum + 1), triggerPositionString(simTrigger),
+							getTriggerTime(simTrigger), simTrigger.toString());
+					OutputLogger.println(" --> " + bestMatchText);
 				}
 			}
 		}
@@ -1496,12 +1581,31 @@
 		OutputLogger.println("Recon Cluster Trigger --> SSP Reported Trigger Match Status");
 		for(int triggerNum = 0; triggerNum < 2; triggerNum++) {
 			for(Trigger<?> simTrigger : reconTriggerList.get(triggerNum)) {
+				// If the trigger number and type align with the event
+				// trigger type, mark that it was seen.
+				if(triggerNum == 1) {
+					if(activeTrigger == TriggerDiagnosticUtil.TRIGGER_SINGLES_1 && isSingles) {
+						event.setSawEventType(true);
+					} else if(activeTrigger == TriggerDiagnosticUtil.TRIGGER_PAIR_1 && !isSingles) {
+						event.setSawEventType(true);
+					}
+				} else {
+					if(activeTrigger == TriggerDiagnosticUtil.TRIGGER_SINGLES_2 && isSingles) {
+						event.setSawEventType(true);
+					} else if(activeTrigger == TriggerDiagnosticUtil.TRIGGER_PAIR_2 && !isSingles) {
+						event.setSawEventType(true);
+					}
+				}
 				
 				OutputLogger.printf("\tTrigger %d :: %s :: %s%n", (triggerNum + 1),
 						triggerPositionString(simTrigger), simTrigger.toString());
 				
+				// TEMP :: Populate the recon ALL pairs plots.
+				globalTriggerPlots.sawTrigger(simTrigger);
+				
 				// Iterate over the SSP reported triggers and compare
 				// them to the reconstructed cluster simulated trigger.
+				boolean matched = false;
 				matchLoop:
 				for(SSPNumberedTrigger sspTrigger : sspTriggers) {
 					OutputLogger.printf("\t\t\t%s", sspTrigger.toString());
@@ -1522,10 +1626,6 @@
 					}
 					
 					// Test each cut.
-					String[][] cutNames = {
-							{ "E_min", "E_max", "hit count", "null" },
-							{ "E_sum", "E_diff", "E_slope", "coplanar" }
-					};
 					int typeIndex = isSingles ? 0 : 1;
 					boolean[] matchedCuts = triggerCutMatch(simTrigger, sspTrigger);
 					for(int cutIndex = 0; cutIndex < matchedCuts.length; cutIndex++) {
@@ -1540,8 +1640,12 @@
 					sspTriggerSet.add(sspTrigger);
 					event.matchedReconPair(simTrigger, sspTrigger);
 					OutputLogger.print(" [ success         ]%n");
+					globalTriggerPlots.matchedTrigger(simTrigger);
+					matched = true;
 					break matchLoop;
 				}
+				
+				if(!matched) { globalTriggerPlots.failedTrigger(simTrigger); }
 			}
 		}
 		
@@ -1560,6 +1664,12 @@
 		// Print event statistics.
 		OutputLogger.println();
 		OutputLogger.println("Event Statistics:");
+		OutputLogger.printf("\tSaw Triggering Event Type  :: ");
+		if(activeTrigger == TriggerDiagnosticUtil.TRIGGER_COSMIC || activeTrigger == TriggerDiagnosticUtil.TRIGGER_PULSER) {
+			OutputLogger.println("Unsupported for Cosmic/Pulser");
+		} else {
+			OutputLogger.println("" + event.sawEventType());
+		}
 		OutputLogger.printf("\tSSP Cluster Sim Triggers   :: %d%n", sspSimTriggers);
 		OutputLogger.printf("\tRecon Cluster Sim Triggers :: %d%n", reconSimTriggers);
 		OutputLogger.printf("\tSSP Reported Triggers      :: %d%n", sspTriggers.size());
@@ -1602,8 +1712,8 @@
 			}
 			
 			// Update the global trigger tracking variables.
-			triggerRunStats[0].addEvent(event, reconTriggerList, sspTriggerList, sspTriggers);
-			triggerLocalStats[0].addEvent(event, reconTriggerList, sspTriggerList, sspTriggers);
+			triggerRunStats[0].addEvent(activeTrigger, event, reconTriggerList, sspTriggerList, sspTriggers);
+			triggerLocalStats[0].addEvent(activeTrigger, event, reconTriggerList, sspTriggerList, sspTriggers);
 			efficiencyRunStats.addSinglesTriggers(activeTrigger, reconTriggerList);
 			efficiencyLocalStats.addSinglesTriggers(activeTrigger, reconTriggerList);
 			efficiencyRunStats.addEvent(activeTrigger, event);
@@ -1635,8 +1745,8 @@
 			}
 			
 			// Update the global trigger tracking variables.
-			triggerRunStats[1].addEvent(event, reconTriggerList, sspTriggerList, sspTriggers);
-			triggerLocalStats[1].addEvent(event, reconTriggerList, sspTriggerList, sspTriggers);
+			triggerRunStats[1].addEvent(activeTrigger, event, reconTriggerList, sspTriggerList, sspTriggers);
+			triggerLocalStats[1].addEvent(activeTrigger, event, reconTriggerList, sspTriggerList, sspTriggers);
 			efficiencyRunStats.addPairTriggers(activeTrigger, reconTriggerList);
 			efficiencyLocalStats.addSinglesTriggers(activeTrigger, reconTriggerList);
 			efficiencyRunStats.addEvent(activeTrigger, event);

Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/event/TriggerMatchEvent.java
 =============================================================================
--- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/event/TriggerMatchEvent.java	(original)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/event/TriggerMatchEvent.java	Thu Mar 19 10:30:08 2015
@@ -19,10 +19,14 @@
 	private int[] sspInternalMatched = new int[2];
 	private int[] reconTriggersMatched = new int[2];
 	private int[][] triggerComp = new int[4][2];
+	private int[] unmatchedTriggers = new int[2];
 	
 	// Track the matched trigger pairs.
 	private List<TriggerMatchedPair> sspPairList = new ArrayList<TriggerMatchedPair>();
 	private List<Pair<Trigger<?>, SSPNumberedTrigger>> reconPairList = new ArrayList<Pair<Trigger<?>, SSPNumberedTrigger>>();
+	
+	// Track whether the event triggering type was seen.
+	private boolean sawEventType = false;
 	
 	/**
 	 * Gets the number of times a cut of the given cut ID failed when
@@ -34,7 +38,7 @@
 	 */
 	public int getCutFailures(int triggerNumber, int cutID) {
 		// Validate the arguments.
-		if(triggerNumber !=0 && triggerNumber != 1) {
+		if(triggerNumber != 0 && triggerNumber != 1) {
 			throw new IndexOutOfBoundsException("Trigger number must be 0 or 1.");
 		} if(cutID < 0 || cutID > 3) {
 			throw new IndexOutOfBoundsException(String.format("Cut ID \"%d\" is not valid.", cutID));
@@ -42,6 +46,23 @@
 		
 		// Return the requested cut value.
 		return triggerComp[cutID][triggerNumber];
+	}
+	
+	/**
+	 * Gets the number of triggers for this trigger for which there
+	 * were no matches.
+	 * @param triggerNum - The trigger for which to get the value.
+	 * @return Returns the number of triggers that failed to match as
+	 * an <code>int</code>.
+	 */
+	public int getUnmatchedTriggers(int triggerNum) {
+		// Validate the arguments.
+		if(triggerNum != 0 && triggerNum != 1) {
+			throw new IndexOutOfBoundsException("Trigger number must be 0 or 1.");
+		}
+		
+		// Return the requested cut value.
+		return unmatchedTriggers[triggerNum];
 	}
 	
 	/**
@@ -139,7 +160,9 @@
 		// singles triggers use arrays of size 3. If the array is not
 		// of the appropriate size, resize it.
 		boolean[] cutArray;
-		if(cutsMatched.length == 4) {
+		if(cutsMatched == null) {
+			cutArray = new boolean[] { false, false, false, false };
+		} else if(cutsMatched.length == 4) {
 			cutArray = cutsMatched;
 		} else {
 			cutArray = new boolean[] { cutsMatched[0], cutsMatched[1], cutsMatched[2], true };
@@ -149,11 +172,15 @@
 		TriggerMatchedPair triggerPair = new TriggerMatchedPair(simTrigger, sspTrigger, cutArray);
 		sspPairList.add(triggerPair);
 		
+		// If the argument cut array was null, then this trigger was
+		// not actually matched. Track this.
+		int triggerNum = triggerPair.isFirstTrigger() ? 0 : 1;
+		if(cutsMatched == null) { unmatchedTriggers[triggerNum]++; }
+		
 		// Track which cuts have failed.
 		boolean isMatched = true;
-		int triggerNum = triggerPair.isFirstTrigger() ? 0 : 1;
-		for(int cutIndex = 0; cutIndex < cutsMatched.length; cutIndex++) {
-			if(!cutsMatched[cutIndex]) {
+		for(int cutIndex = 0; cutIndex < cutArray.length; cutIndex++) {
+			if(!cutArray[cutIndex]) {
 				triggerComp[cutIndex][triggerNum]++;
 				isMatched = false;
 			}
@@ -162,4 +189,24 @@
 		// If all the cuts are true, then the trigger pair is a match.
 		if(isMatched) { sspInternalMatched[triggerNum]++; }
 	}
+	
+	/**
+	 * Indicates whether an event of the type that caused the event
+	 * readout was seen.
+	 * @return Returns <code>true</code> if an event was seen and
+	 * <code>false</code> otherwise.
+	 */
+	public boolean sawEventType() {
+		return sawEventType;
+	}
+	
+	/**
+	 * Sets whether a simulated trigger of the type that caused the
+	 * event readout was seen.
+	 * @param state - <code>true</code> indicates that the trigger type
+	 * was seen and <code>false</code> that it was not.
+	 */
+	public void setSawEventType(boolean state) {
+		sawEventType = state;
+	}
 }

Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/event/TriggerMatchStatus.java
 =============================================================================
--- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/event/TriggerMatchStatus.java	(original)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/event/TriggerMatchStatus.java	Thu Mar 19 10:30:08 2015
@@ -3,6 +3,7 @@
 import java.util.List;
 
 import org.hps.analysis.trigger.util.Trigger;
+import org.hps.analysis.trigger.util.TriggerDiagnosticUtil;
 import org.hps.recon.ecal.triggerbank.SSPNumberedTrigger;
 
 /**
@@ -23,8 +24,15 @@
 	 * @param sspSimTriggers - A list of simulated SSP cluster triggers.
 	 * @param sspBankTriggers - A list of SSP bank triggers.
 	 */
-	public void addEvent(TriggerMatchEvent event, List<List<? extends Trigger<?>>> reconTriggers,
+	public void addEvent(int eventType, TriggerMatchEvent event, List<List<? extends Trigger<?>>> reconTriggers,
 			List<List<? extends Trigger<?>>> sspSimTriggers, List<? extends SSPNumberedTrigger> sspBankTriggers) {
+		// Increment the event type count.
+		if(eventType == TriggerDiagnosticUtil.TRIGGER_SINGLES_1 || eventType == TriggerDiagnosticUtil.TRIGGER_PAIR_1) {
+			triggerTypesSeen[0]++;
+		} else if(eventType == TriggerDiagnosticUtil.TRIGGER_SINGLES_2 || eventType == TriggerDiagnosticUtil.TRIGGER_PAIR_2) {
+			triggerTypesSeen[1]++;
+		}
+		
 		// Check if there are more bank triggers than there are
 		// simulated SSP triggers.
 		int sspTriggerDiff = sspBankTriggers.size() - sspSimTriggers.size();
@@ -46,6 +54,8 @@
 		
 		// Increment the count for each cut failure type.
 		for(int triggerNum = 0; triggerNum < 2; triggerNum++) {
+			unmatchedTriggers[triggerNum] += event.getUnmatchedTriggers(triggerNum);
+			
 			for(int cutIndex = 0; cutIndex < 4; cutIndex++) {
 				triggerComp[cutIndex][triggerNum] += event.getCutFailures(triggerNum, cutIndex);
 			}
@@ -55,6 +65,12 @@
 		for(int triggerNum = 0; triggerNum < 2; triggerNum++) {
 			sspInternalMatched[triggerNum] += event.getMatchedSSPTriggers(triggerNum);
 			reconTriggersMatched[triggerNum] += event.getMatchedReconTriggers(triggerNum);
+		}
+		
+		// Check if a trigger of the right time was found.
+		// Get the trigger number and type.
+		if(event.sawEventType()) {
+			triggerTypesFound[eventType]++;
 		}
 	}
 	

Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/event/TriggerMatchedPair.java
 =============================================================================
--- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/event/TriggerMatchedPair.java	(original)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/event/TriggerMatchedPair.java	Thu Mar 19 10:30:08 2015
@@ -80,7 +80,11 @@
 	 * object.
 	 */
 	public Class<?> getSimulatedTriggerType() {
-		return getFirstElement().getTriggerSource().getClass();
+		if(getFirstElement() != null) {
+			return getFirstElement().getTriggerSource().getClass();
+		} else {
+			return null;
+		}
 	}
 	
 	/**
@@ -99,7 +103,11 @@
 	 * first trigger and <code>false</code> otherwise.
 	 */
 	public boolean isFirstTrigger() {
-		return getSecondElement().isFirstTrigger();
+		if(getSecondElement() != null) {
+			return getSecondElement().isFirstTrigger();
+		} else {
+			return getFirstElement().getTriggerNumber() == 0 ? true : false;
+		}
 	}
 	
 	/**
@@ -108,7 +116,7 @@
 	 * triggers and <code>false</code> otherwise.
 	 */
 	public boolean isPairTrigger() {
-		if(getFirstElement() instanceof PairTrigger && getSecondElement() instanceof SSPPairTrigger) {
+		if(getFirstElement() instanceof PairTrigger || getSecondElement() instanceof SSPPairTrigger) {
 			return true;
 		} else {
 			return false;
@@ -122,7 +130,7 @@
 	 * second trigger and <code>false</code> otherwise.
 	 */
 	public boolean isSecondTrigger() {
-		return getSecondElement().isSecondTrigger();
+		return !isFirstTrigger();
 	}
 	
 	/**
@@ -131,7 +139,7 @@
 	 * triggers and <code>false</code> otherwise.
 	 */
 	public boolean isSinglesTrigger() {
-		if(getFirstElement() instanceof SinglesTrigger && getSecondElement() instanceof SSPSinglesTrigger) {
+		if(getFirstElement() instanceof SinglesTrigger || getSecondElement() instanceof SSPSinglesTrigger) {
 			return true;
 		} else {
 			return false;

Added: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/event/TriggerPlotsModule.java
 =============================================================================
--- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/event/TriggerPlotsModule.java	(added)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/event/TriggerPlotsModule.java	Thu Mar 19 10:30:08 2015
@@ -0,0 +1,241 @@
+package org.hps.analysis.trigger.event;
+
+import org.hps.analysis.trigger.util.Trigger;
+import org.hps.recon.ecal.triggerbank.SSPCluster;
+import org.hps.recon.ecal.triggerbank.TriggerModule;
+import org.lcsim.event.Cluster;
+import org.lcsim.util.aida.AIDA;
+
+import hep.aida.IHistogram1D;
+
+/**
+ * Class <code>TriggerPlotsModule</code> handles the plotting of singles
+ * and pair trigger values.
+ * 
+ * @author Kyle McCarty
+ */
+public class TriggerPlotsModule {
+	// Reference variables.
+	private static final int RECON   = 0;
+	private static final int SSP     = 1;
+	private static final int ALL     = 0;
+	private static final int MATCHED = 1;
+	private static final int FAILED  = 2;
+	
+	// Class variables.
+	private final double[] energySlopeParamF;
+	
+	// Plots.
+	private AIDA aida = AIDA.defaultInstance();
+	private IHistogram1D[][][] singlesClusterEnergyPlot = new IHistogram1D[2][2][3];
+	private IHistogram1D[][][] singlesHitCountPlot = new IHistogram1D[2][2][3];
+	
+	private IHistogram1D[][][] pairClusterEnergyPlot = new IHistogram1D[2][2][3];
+	private IHistogram1D[][][] pairHitCountPlot = new IHistogram1D[2][2][3];
+	private IHistogram1D[][][] pairTimePlot = new IHistogram1D[2][2][3];
+	private IHistogram1D[][][] pairSumPlot = new IHistogram1D[2][2][3];
+	private IHistogram1D[][][] pairDiffPlot = new IHistogram1D[2][2][3];
+	private IHistogram1D[][][] pairSlopePlot = new IHistogram1D[2][2][3];
+	private IHistogram1D[][][] pairCoplanarityPlot = new IHistogram1D[2][2][3];
+	
+	/**
+	 * Instantiates a new <code>TriggerPlotsModule</code> that will use
+	 * the indicated values for the energy slope conversion factor when
+	 * plotting energy slope values. Plots will be attached to the
+	 * default AIDA instance.
+	 * @param trigger0F - The energy slope conversion factor for the
+	 * first trigger.
+	 * @param trigger1F - The energy slope conversion factor for the
+	 * second trigger.
+	 */
+	public TriggerPlotsModule(double trigger0F, double trigger1F) {
+		// Store the energy slope parameter.
+		energySlopeParamF = new double[2];
+		energySlopeParamF[0] = trigger0F;
+		energySlopeParamF[1] = trigger1F;
+		
+		// Define type string values.
+		String[] sourceType = { "Recon", "SSP" };
+		String[] resultType = { "All", "Matched", "Failed" };
+		
+		// Instantiate the trigger result plots for each trigger.
+		for(int triggerNum = 0; triggerNum < 2; triggerNum++) {
+			// Get the directory for the current triggers.
+			String pairDir = "Pair Trigger " + triggerNum;
+			String singlesDir = "Singles Trigger " + triggerNum;
+			
+			// Instantiate the trigger result plots for each type of
+			// trigger source object.
+			for(int source = 0; source < 2; source++) {
+				// Instantiate the trigger result plots for each type
+				// of trigger match result.
+				for(int result = 0; result < 3; result++) {
+					// Instantiate the singles trigger plots.
+					singlesClusterEnergyPlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s Singles Hit Count (%s)",
+							singlesDir, sourceType[source], resultType[result]), 9, 0.5, 9.5);
+					singlesHitCountPlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s Singles Cluster Energy (%s)",
+							singlesDir, sourceType[source], resultType[result]), 300, 0.0, 3.0);
+					
+					// Instantiate the pair trigger plots.
+					pairHitCountPlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s Pair Hit Count (%s)",
+							pairDir, sourceType[source], resultType[result]), 9, 0.5, 9.5);
+					pairClusterEnergyPlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s Pair Cluster Energy (%s)",
+							pairDir, sourceType[source], resultType[result]), 300, 0.0, 3.0);
+					pairTimePlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s Pair Time Coincidence (%s)",
+							pairDir, sourceType[source], resultType[result]), 8, 0, 32);
+					pairSumPlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s Pair Energy Sum (%s)",
+							pairDir, sourceType[source], resultType[result]), 300, 0.0, 3.0);
+					pairDiffPlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s Pair Energy Difference (%s)",
+							pairDir, sourceType[source], resultType[result]), 300, 0.0, 3.0);
+					pairSlopePlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s Pair Energy Slope (%s)",
+							pairDir, sourceType[source], resultType[result]), 300, 0.0, 3.0);
+					pairCoplanarityPlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s Pair Coplanarity (%s)",
+							pairDir, sourceType[source], resultType[result]), 180, 0, 180);
+				}
+			}
+		}
+	}
+	
+	/**
+	 * Populates the "all" plots of the appropriate type with the cut
+	 * results from the argument trigger.
+	 * @param trigger - The trigger from which to populate the plots.
+	 */
+	public void sawTrigger(Trigger<?> trigger) {
+		processTrigger(trigger, ALL);
+	}
+	
+	/**
+	 * Populates the "matched" plots of the appropriate type with the
+	 * cut results from the argument trigger.
+	 * @param trigger - The trigger from which to populate the plots.
+	 */
+	public void matchedTrigger(Trigger<?> trigger) {
+		processTrigger(trigger, MATCHED);
+	}
+	
+	/**
+	 * Populates the "failed" plots of the appropriate type with the
+	 * cut results from the argument trigger.
+	 * @param trigger - The trigger from which to populate the plots.
+	 */
+	public void failedTrigger(Trigger<?> trigger) {
+		processTrigger(trigger, FAILED);
+	}
+	
+	public void setEnergySlopeParamF(int triggerNum, double value) {
+		// Make sure that the trigger number is valid.
+		if(triggerNum < 0 || triggerNum > 1) {
+			throw new IllegalArgumentException(String.format("Trigger number %d is not valid.", triggerNum));
+		}
+		
+		// Set the parameter.
+		energySlopeParamF[triggerNum] = value;
+	}
+	
+	/**
+	 * Populates the indicated type of plots of the appropriate type
+	 * for the argument trigger.
+	 * @param trigger - The trigger from which to populate the plots.
+	 * @param plotType - The type of plot to populate. This must be one
+	 * of <code>ALL</code>, <code>MATCHED</code>, or <code>FAILED</code>.
+	 */
+	private void processTrigger(Trigger<?> trigger, int plotType) {
+		// Get the trigger number and source.
+		Object source = trigger.getTriggerSource();
+		int triggerNum = trigger.getTriggerNumber();
+		
+		// Populate the plots using the appropriate method.
+		if(source instanceof Cluster) {
+			processSingles(triggerNum, plotType, (Cluster) source);
+		}
+		else if(source instanceof SSPCluster) {
+			processSingles(triggerNum, plotType, (SSPCluster) source);
+		}
+		else if(source instanceof Cluster[]) {
+			processPair(triggerNum, plotType, (Cluster[]) source);
+		}
+		else if(source instanceof SSPCluster[]) {
+			processPair(triggerNum, plotType, (SSPCluster[]) source);
+		}
+		
+		// If the trigger source is unsupported, produce an error.
+		else {
+			throw new IllegalArgumentException(String.format("Trigger source \"%s\" is not supported.", source.getClass().getSimpleName()));
+		}
+	}
+	
+	/**
+	 * Populates the trigger singles plots for the indicated type for
+	 * reconstructed clusters.
+	 * @param triggerNum - The trigger number of the source trigger.
+	 * @param plotType - The type of plot to populate. This must be one
+	 * of <code>ALL</code>, <code>MATCHED</code>, or <code>FAILED</code>.
+	 * @param pair - The triggering cluster.
+	 */
+	private void processSingles(int triggerNum, int plotType, Cluster cluster) {
+		// Fill the cluster singles plots.
+		singlesHitCountPlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueClusterHitCount(cluster));
+		singlesClusterEnergyPlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueClusterTotalEnergy(cluster));
+	}
+	
+	/**
+	 * Populates the trigger singles plots for the indicated type for SSP
+	 * clusters.
+	 * @param triggerNum - The trigger number of the source trigger.
+	 * @param plotType - The type of plot to populate. This must be one
+	 * of <code>ALL</code>, <code>MATCHED</code>, or <code>FAILED</code>.
+	 * @param pair - The triggering cluster.
+	 */
+	private void processSingles(int triggerNum, int plotType, SSPCluster cluster) {
+		// Fill the cluster singles plots.
+		singlesHitCountPlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueClusterHitCount(cluster));
+		singlesClusterEnergyPlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueClusterTotalEnergy(cluster));
+	}
+	
+	/**
+	 * Populates the trigger pair plots for the indicated type for
+	 * reconstructed cluster pairs.
+	 * @param triggerNum - The trigger number of the source trigger.
+	 * @param plotType - The type of plot to populate. This must be one
+	 * of <code>ALL</code>, <code>MATCHED</code>, or <code>FAILED</code>.
+	 * @param pair - The triggering pair.
+	 */
+	private void processPair(int triggerNum, int plotType, Cluster[] pair) {
+		// Fill the cluster singles plots.
+		pairHitCountPlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueClusterHitCount(pair[0]));
+		pairHitCountPlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueClusterHitCount(pair[1]));
+		pairClusterEnergyPlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueClusterTotalEnergy(pair[0]));
+		pairClusterEnergyPlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueClusterTotalEnergy(pair[1]));
+		
+		// Fill the cluster pair plots.
+		pairTimePlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueTimeCoincidence(pair));
+		pairSumPlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueEnergySum(pair));
+		pairDiffPlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueEnergyDifference(pair));
+		pairSlopePlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueEnergySlope(pair, energySlopeParamF[triggerNum]));
+		pairCoplanarityPlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueCoplanarity(pair));
+	}
+	
+	/**
+	 * Populates the trigger pair plots for the indicated type for SSP
+	 * cluster pairs.
+	 * @param triggerNum - The trigger number of the source trigger.
+	 * @param plotType - The type of plot to populate. This must be one
+	 * of <code>ALL</code>, <code>MATCHED</code>, or <code>FAILED</code>.
+	 * @param pair - The triggering pair.
+	 */
+	private void processPair(int triggerNum, int plotType, SSPCluster[] pair) {
+		// Fill the cluster singles plots.
+		pairHitCountPlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueClusterHitCount(pair[0]));
+		pairHitCountPlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueClusterHitCount(pair[1]));
+		pairClusterEnergyPlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueClusterTotalEnergy(pair[0]));
+		pairClusterEnergyPlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueClusterTotalEnergy(pair[1]));
+		
+		// Fill the cluster pair plots.
+		pairTimePlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueTimeCoincidence(pair));
+		pairSumPlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueEnergySum(pair));
+		pairDiffPlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueEnergyDifference(pair));
+		pairSlopePlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueEnergySlope(pair, energySlopeParamF[triggerNum]));
+		pairCoplanarityPlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueCoplanarity(pair));
+	}
+}

Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/event/TriggerStatModule.java
 =============================================================================
--- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/event/TriggerStatModule.java	(original)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/event/TriggerStatModule.java	Thu Mar 19 10:30:08 2015
@@ -15,7 +15,9 @@
 	protected int[] sspInternalMatched = new int[2];
 	protected int[] reconTriggersMatched = new int[2];
 	protected int[][] triggerComp = new int[4][2];
-	
+	protected int[] unmatchedTriggers = new int[2];
+	protected int[] triggerTypesSeen = new int[2];
+	protected int[] triggerTypesFound = new int[2];
 	
 	/**
 	 * Instantiates a <code>TriggerStatModule</code> with no statistics
@@ -40,6 +42,13 @@
 		for(int i = 0; i < reconTriggersMatched.length; i++) {
 			reconTriggersMatched[i] = base.reconTriggersMatched[i];
 		}
+		for(int i = 0; i < triggerTypesSeen.length; i++) {
+			triggerTypesSeen[i] = base.triggerTypesSeen[i];
+			triggerTypesFound[i] = base.triggerTypesFound[i];
+		}
+		for(int i = 0; i < unmatchedTriggers.length; i++) {
+			unmatchedTriggers[i] = base.unmatchedTriggers[i];
+		}
 		for(int i = 0; i < triggerComp.length; i++) {
 			for(int j = 0; j < triggerComp[i].length; j++) {
 				triggerComp[i][j] = base.triggerComp[i][j];
@@ -82,6 +91,40 @@
 	}
 	
 	/**
+	 * Gets the number of events that were readout due to a trigger
+	 * of the indicated type.
+	 * @param triggerType - The type of trigger.
+	 * @return Returns the number of events readout because of the
+	 * trigger type as an <code>int</code>.
+	 */
+	public int getEventsOfType(int triggerNum) {
+		// Make sure that the trigger type is defined.
+		if(triggerNum < 0 || triggerNum > 1) {
+			throw new IndexOutOfBoundsException(String.format("Trigger number \"%d\" is not valid.", triggerNum));
+		}
+		
+		// Return the number of events that were trigger by this type.
+		return triggerTypesSeen[triggerNum];
+	}
+	
+	/**
+	 * Gets the number of events that were readout due to a trigger
+	 * of the indicated type where a reconstructed cluster simulated
+	 * trigger of that type existed.
+	 * @param triggerType - The type of trigger.
+	 * @return Returns the number of events as an <code>int</code>.
+	 */
+	public int getEventsOfTypeSeen(int triggerNum) {
+		// Make sure that the trigger type is defined.
+		if(triggerNum < 0 || triggerNum > 1) {
+			throw new IndexOutOfBoundsException(String.format("Trigger number \"%d\" is not valid.", triggerNum));
+		}
+		
+		// Return the number of events that were trigger by this type.
+		return triggerTypesFound[triggerNum];
+	}
+	
+	/**
 	 * Gets the number of SSP bank triggers that were reported in excess
 	 * of the number of simulated SSP triggers seen.
 	 * @return Returns the value as an <code>int</code> primitive.
@@ -163,4 +206,21 @@
 	public int getSSPBankTriggerCount() {
 		return reportedTriggers;
 	}
+	
+	/**
+	 * Gets the number of triggers for this trigger for which there
+	 * were no matches.
+	 * @param triggerNum - The trigger for which to get the value.
+	 * @return Returns the number of triggers that failed to match as
+	 * an <code>int</code>.
+	 */
+	public int getUnmatchedTriggers(int triggerNum) {
+		// Validate the arguments.
+		if(triggerNum != 0 && triggerNum != 1) {
+			throw new IndexOutOfBoundsException("Trigger number must be 0 or 1.");
+		}
+		
+		// Return the requested cut value.
+		return unmatchedTriggers[triggerNum];
+	}
 }

Top of Message | Previous Page | Permalink

Advanced Options


Options

Log In

Log In

Get Password

Get Password


Search Archives

Search Archives


Subscribe or Unsubscribe

Subscribe or Unsubscribe


Archives

November 2017
August 2017
July 2017
January 2017
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
December 2013
November 2013

ATOM RSS1 RSS2



LISTSERV.SLAC.STANFORD.EDU

Secured by F-Secure Anti-Virus CataList Email List Search Powered by the LISTSERV Email List Manager

Privacy Notice, Security Notice and Terms of Use