Print

Print


Author: [log in to unmask]
Date: Sat Apr 11 20:04:05 2015
New Revision: 2673

Log:
Added some new plots to the trigger driver and better organized them.

Modified:
    java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/FADCPrimaryTriggerDriver.java

Modified: java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/FADCPrimaryTriggerDriver.java
 =============================================================================
--- java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/FADCPrimaryTriggerDriver.java	(original)
+++ java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/FADCPrimaryTriggerDriver.java	Sat Apr 11 20:04:05 2015
@@ -55,46 +55,123 @@
     // ==================================================================
     // ==== Trigger Distribution Plots ==================================
     // ==================================================================
+    private static final int NO_CUTS       = 0;
+    private static final int ALL_CUTS      = 1;
+    private static final int OVER_1HIT     = 2;
+    private static final int OVER_2HIT     = 3;
+    private static final int SINGLES_CUTS  = 4;
+    private static final int PLOT_COUNT    = 5;
     private AIDA aida = AIDA.defaultInstance();
-    private IHistogram1D clusterSeedEnergy = aida.histogram1D("Trigger Plots :: Cluster Seed Energy Distribution", 176, 0.0, 2.2);
-    private IHistogram1D clusterSeedEnergy100 = aida.histogram1D("Trigger Plots :: Cluster Seed Energy Distribution (Over 100 MeV)", 176, 0.0, 2.2);
-    private IHistogram1D clusterSeedEnergySingle = aida.histogram1D("Trigger Plots :: Cluster Seed Energy Distribution (Passed Single Cuts)", 176, 0.0, 2.2);
-    private IHistogram1D clusterSeedEnergyAll = aida.histogram1D("Trigger Plots :: Cluster Seed Energy Distribution (Passed All Cuts)", 176, 0.0, 2.2);
-    private IHistogram1D clusterHitCount = aida.histogram1D("Trigger Plots :: Cluster Hit Count Distribution", 9, 1, 10);
-    private IHistogram1D clusterHitCount100 = aida.histogram1D("Trigger Plots :: Cluster Hit Count Distribution (Over 100 MeV)", 9, 1, 10);
-    private IHistogram1D clusterHitCountSingle = aida.histogram1D("Trigger Plots :: Cluster Hit Count Distribution (Passed Single Cuts)", 9, 1, 10);
-    private IHistogram1D clusterHitCountAll = aida.histogram1D("Trigger Plots :: Cluster Hit Count Distribution (Passed All Cuts)", 9, 1, 10);
-    private IHistogram1D clusterTotalEnergy = aida.histogram1D("Trigger Plots :: Cluster Total Energy Distribution", 176, 0.0, 2.2);
-    private IHistogram1D clusterTotalEnergy100 = aida.histogram1D("Trigger Plots :: Cluster Total Energy Distribution (Over 100 MeV)", 176, 0.0, 2.2);
-    private IHistogram1D clusterTotalEnergySingle = aida.histogram1D("Trigger Plots :: Cluster Total Energy Distribution (Passed Single Cuts)", 176, 0.0, 2.2);
-    private IHistogram1D clusterTotalEnergyAll = aida.histogram1D("Trigger Plots :: Cluster Total Energy Distribution (Passed All Cuts)", 176, 0.0, 2.2);
-    
-    private IHistogram1D pairEnergySum = aida.histogram1D("Trigger Plots :: Pair Energy Sum Distribution", 176, 0.0, 4.4);
-    private IHistogram1D pairEnergySumAll = aida.histogram1D("Trigger Plots :: Pair Energy Sum Distribution (Passed All Cuts)", 176, 0.0, 4.4);    
-    private IHistogram1D pairEnergyDifference = aida.histogram1D("Trigger Plots :: Pair Energy Difference Distribution", 176, 0.0, 2.2);
-    private IHistogram1D pairEnergyDifferenceAll = aida.histogram1D("Trigger Plots :: Pair Energy Difference Distribution (Passed All Cuts)", 176, 0.0, 2.2);
-    private IHistogram1D pairCoplanarity = aida.histogram1D("Trigger Plots :: Pair Coplanarity Distribution", 180, 0.0, 180.0);
-    private IHistogram1D pairCoplanarityAll = aida.histogram1D("Trigger Plots :: Pair Coplanarity Distribution (Passed All Cuts)", 180, 0.0, 180.0);
-    private IHistogram1D pairEnergySlope = aida.histogram1D("Trigger Plots :: Pair Energy Slope Distribution", 100, 0.0, 4.0);
-    private IHistogram1D pairEnergySlopeAll = aida.histogram1D("Trigger Plots :: Pair Energy Slope Distribution (Passed All Cuts)", 100, 0.0, 4.0);
-    
-    private IHistogram2D clusterDistribution = aida.histogram2D("Trigger Plots :: Cluster Seed Distribution", 46, -23, 23, 11, -5.5, 5.5);
-    private IHistogram2D clusterDistribution100 = aida.histogram2D("Trigger Plots :: Cluster Seed Distribution (Over 100 MeV)", 46, -23, 23, 11, -5.5, 5.5);
-    private IHistogram2D clusterDistributionSingle = aida.histogram2D("Trigger Plots :: Cluster Seed Distribution (Passed Single Cuts)", 46, -23, 23, 11, -5.5, 5.5);
-    private IHistogram2D clusterDistributionAll = aida.histogram2D("Trigger Plots :: Cluster Seed Distribution (Passed All Cuts)", 46, -23, 23, 11, -5.5, 5.5);
-    
-    // ==================================================================
-    // ==== Hardware Diagnostic Variables ===============================
-    // ==================================================================
-    private IHistogram2D diagClusters = aida.histogram2D("Diagnostic Plots :: Cluster Seed Distribution", 46, -23, 23, 11, -5.5, 5.5);
-    private IHistogram1D[] diagHitCount = {
-                aida.histogram1D("Diagnostic Plots :: Cluster Hit Count Distribution (Top)", 8, 0, 8),
-                aida.histogram1D("Diagnostic Plots :: Cluster Hit Count Distribution (Bottom)", 8, 0, 8)
-            };
-    private IHistogram1D[] diagTotalEnergy = {
-                aida.histogram1D("Diagnostic Plots :: Cluster Total Energy Distribution (Top)", 1024, 0.0, 8.192),
-                aida.histogram1D("Diagnostic Plots :: Cluster Total Energy Distribution (Bottom)", 1024, 0.0, 8.192)
-            };
+    private IHistogram1D[] clusterSeedEnergy;
+    //private IHistogram1D clusterSeedEnergy = aida.histogram1D("Trigger Plots :: Cluster Seed Energy Distribution", 176, 0.0, 2.2);
+    //private IHistogram1D clusterSeedEnergySingle = aida.histogram1D("Trigger Plots :: Cluster Seed Energy Distribution (Passed Single Cuts)", 176, 0.0, 2.2);
+    //private IHistogram1D clusterSeedEnergyAll = aida.histogram1D("Trigger Plots :: Cluster Seed Energy Distribution (Passed All Cuts)", 176, 0.0, 2.2);
+    private IHistogram1D[] clusterHitCount;
+    //private IHistogram1D clusterHitCount = aida.histogram1D("Trigger Plots :: Cluster Hit Count Distribution", 9, 1, 10);
+    //private IHistogram1D clusterHitCountSingle = aida.histogram1D("Trigger Plots :: Cluster Hit Count Distribution (Passed Single Cuts)", 9, 1, 10);
+    //private IHistogram1D clusterHitCountAll = aida.histogram1D("Trigger Plots :: Cluster Hit Count Distribution (Passed All Cuts)", 9, 1, 10);
+    private IHistogram1D[] clusterTotalEnergy;
+    //private IHistogram1D clusterTotalEnergy = aida.histogram1D("Trigger Plots :: Cluster Total Energy Distribution", 176, 0.0, 2.2);
+    //private IHistogram1D clusterTotalEnergySingle = aida.histogram1D("Trigger Plots :: Cluster Total Energy Distribution (Passed Single Cuts)", 176, 0.0, 2.2);
+    //private IHistogram1D clusterTotalEnergyAll = aida.histogram1D("Trigger Plots :: Cluster Total Energy Distribution (Passed All Cuts)", 176, 0.0, 2.2);
+    
+    private IHistogram1D[] pairEnergySum;
+    //private IHistogram1D pairEnergySum = aida.histogram1D("Trigger Plots :: Pair Energy Sum Distribution", 176, 0.0, 4.4);
+    //private IHistogram1D pairEnergySumAll = aida.histogram1D("Trigger Plots :: Pair Energy Sum Distribution (Passed All Cuts)", 176, 0.0, 4.4); 
+    private IHistogram1D[] pairEnergyDifference;
+    //private IHistogram1D pairEnergyDifference = aida.histogram1D("Trigger Plots :: Pair Energy Difference Distribution", 176, 0.0, 2.2);
+    //private IHistogram1D pairEnergyDifferenceAll = aida.histogram1D("Trigger Plots :: Pair Energy Difference Distribution (Passed All Cuts)", 176, 0.0, 2.2);
+    private IHistogram1D[] pairCoplanarity;
+    //private IHistogram1D pairCoplanarity = aida.histogram1D("Trigger Plots :: Pair Coplanarity Distribution", 180, 0.0, 180.0);
+    //private IHistogram1D pairCoplanarityAll = aida.histogram1D("Trigger Plots :: Pair Coplanarity Distribution (Passed All Cuts)", 180, 0.0, 180.0);
+    private IHistogram1D[] pairEnergySlope;
+    //private IHistogram1D pairEnergySlope = aida.histogram1D("Trigger Plots :: Pair Energy Slope Distribution", 100, 0.0, 4.0);
+    //private IHistogram1D pairEnergySlopeAll = aida.histogram1D("Trigger Plots :: Pair Energy Slope Distribution (Passed All Cuts)", 100, 0.0, 4.0);
+    
+    private IHistogram2D[] clusterDistribution;
+    //private IHistogram2D clusterDistribution = aida.histogram2D("Trigger Plots :: Cluster Seed Distribution", 46, -23, 23, 11, -5.5, 5.5);
+    //private IHistogram2D clusterDistributionSingle = aida.histogram2D("Trigger Plots :: Cluster Seed Distribution (Passed Single Cuts)", 46, -23, 23, 11, -5.5, 5.5);
+    //private IHistogram2D clusterDistributionAll = aida.histogram2D("Trigger Plots :: Cluster Seed Distribution (Passed All Cuts)", 46, -23, 23, 11, -5.5, 5.5);
+    
+    /**
+     * Initializes the cluster pair queues and other variables.
+     */
+    @Override
+    public void startOfData() {
+    	// Define plot type names.
+    	String[] plotType = new String[PLOT_COUNT];
+    	plotType[NO_CUTS] = "";
+    	plotType[ALL_CUTS] = " (Passed Single Cuts)";
+    	plotType[OVER_1HIT] = " (More than 1 Hit)";
+    	plotType[OVER_2HIT] = " (More than 2 Hits)";
+    	plotType[SINGLES_CUTS] = " (Passed Single Cuts)";
+    	
+    	// Define plot type directories.
+    	String[] plotDir = new String[PLOT_COUNT];
+    	plotType[NO_CUTS] = "No Cuts/";
+    	plotType[ALL_CUTS] = "Passed All Cuts/";
+    	plotType[OVER_1HIT] = "2+ Hits/";
+    	plotType[OVER_2HIT] = "3+ Hits";
+    	plotType[SINGLES_CUTS] = "Passed Singles Cuts/";
+    	
+    	// Instantiate the singles plot arrays.
+    	clusterSeedEnergy = new IHistogram1D[PLOT_COUNT];
+    	clusterHitCount = new IHistogram1D[PLOT_COUNT];
+    	clusterTotalEnergy = new IHistogram1D[PLOT_COUNT];
+    	clusterDistribution = new IHistogram2D[PLOT_COUNT];
+    	
+    	// Instantiate the pair plot arrays. Note that the pair cuts
+    	// only ever see clusters that pass the singles cuts, so the
+    	// "passed singles cuts" plots are meaningless. Thusly, the
+    	// pair plots have one fewer plot than the singles.
+    	pairEnergySum = new IHistogram1D[PLOT_COUNT - 1];
+    	pairEnergyDifference = new IHistogram1D[PLOT_COUNT - 1];
+    	pairCoplanarity = new IHistogram1D[PLOT_COUNT - 1];
+    	pairEnergySlope = new IHistogram1D[PLOT_COUNT - 1];
+    	
+    	// Instantiate the plots.
+    	for(int i = 0; i < PLOT_COUNT; i++) {
+    		clusterSeedEnergy[i] = aida.histogram1D(plotDir[i] + "Cluster Seed Energy" + plotType[i], 176, 0.0, 2.2);
+    		clusterHitCount[i] = aida.histogram1D(plotDir[i] + "Cluster Hit Count Distribution" + plotType[i], 9, 0.5, 9.5);
+    		clusterTotalEnergy[i] = aida.histogram1D(plotDir[i] + "Cluster Total Energy Distribution" + plotType[i], 176, 0.0, 2.2);
+    		clusterDistribution[i] = aida.histogram2D(plotDir[i] + "Cluster Seed Distribution" + plotType[i], 46, -23, 23, 11, -5.5, 5.5);
+    		
+    		if(i != PLOT_COUNT - 1) {
+    			pairEnergySum[i] = aida.histogram1D("Trigger Plots :: Pair Energy Sum Distribution", 176, 0.0, 4.4);
+    			pairEnergyDifference[i] = aida.histogram1D("Trigger Plots :: Pair Energy Difference Distribution", 176, 0.0, 2.2);
+    			pairCoplanarity[i] = aida.histogram1D("Trigger Plots :: Pair Coplanarity Distribution", 180, 0.0, 180.0);
+    			pairEnergySlope[i] = aida.histogram1D("Trigger Plots :: Pair Energy Slope Distribution", 100, 0.0, 4.0);
+    		}
+    	}
+    	
+        // Make sure that a valid cluster collection name has been
+        // defined. If it has not, throw an exception.
+        if (clusterCollectionName == null) {
+            throw new RuntimeException("The parameter clusterCollectionName was not set!");
+        }
+        
+        // Initialize the top and bottom cluster queues.
+        topClusterQueue = new LinkedList<List<Cluster>>();
+        botClusterQueue = new LinkedList<List<Cluster>>();
+        
+        // Populate the top cluster queue. It should be populated with
+        // a number of empty lists equal to (2 * pairCoincidence + 1).
+        for (int i = 0; i < 2 * pairCoincidence + 1; i++) {
+            topClusterQueue.add(new ArrayList<Cluster>());
+        }
+        
+        // Populate the bottom cluster queue. It should be populated with
+        // a number of empty lists equal to (2 * pairCoincidence + 1).
+        for (int i = 0; i < pairCoincidence + 1; i++) {
+            botClusterQueue.add(new ArrayList<Cluster>());
+        }
+        
+        // If a background level has been set, pick the correct cuts.
+        if(backgroundLevel != -1) { setBackgroundCuts(backgroundLevel); }
+        
+        // Run the superclass method.
+        super.startOfData();
+    }
     
     /**
      * Prints out the results of the trigger at the end of the run.
@@ -173,24 +250,32 @@
                 if(ix > 0) { ix = ix - 1; }
                 
                 // Fill the general plots.
-                clusterSeedEnergy.fill(seedEnergy, 1);
-                clusterTotalEnergy.fill(clusterEnergy, 1);
-                clusterHitCount.fill(hitCount, 1);
-                clusterDistribution.fill(ix, iy, 1);
-                
-                // Fill the "over 100 MeV" plots if applicable.
-                if(seedEnergy >= 0.100) {
-                    clusterSeedEnergy100.fill(seedEnergy, 1);
-                    clusterTotalEnergy100.fill(clusterEnergy, 1);
-                    clusterHitCount100.fill(hitCount, 1);
-                    clusterDistribution100.fill(ix, iy, 1);
-                }
-                
-                // Populate the diagnostic plots.
-                diagClusters.fill(ix, iy, 1);
-                int plotIndex = iy > 0 ? 0 : 1;
-                diagTotalEnergy[plotIndex].fill(clusterEnergy, 1);
-                diagHitCount[plotIndex].fill(hitCount < 8 ? hitCount : 7, 1);
+                clusterSeedEnergy[NO_CUTS].fill(seedEnergy);
+                clusterTotalEnergy[NO_CUTS].fill(clusterEnergy);
+                clusterHitCount[NO_CUTS].fill(hitCount);
+                clusterDistribution[NO_CUTS].fill(ix, iy);
+                //clusterSeedEnergy.fill(seedEnergy, 1);
+                //clusterTotalEnergy.fill(clusterEnergy, 1);
+                //clusterHitCount.fill(hitCount, 1);
+                //clusterDistribution.fill(ix, iy, 1);
+                
+                // Fill the hit count plots for N > 1.
+                if(hitCount > 1) {
+                	// Populate the plots.
+                    clusterSeedEnergy[OVER_1HIT].fill(seedEnergy);
+                    clusterTotalEnergy[OVER_1HIT].fill(clusterEnergy);
+                    clusterHitCount[OVER_1HIT].fill(hitCount);
+                    clusterDistribution[OVER_1HIT].fill(ix, iy);
+                	
+                    // Fill the hit count plots for N > 2.
+                    if(hitCount > 2) {
+                    	// Populate the plots.
+                        clusterSeedEnergy[OVER_2HIT].fill(seedEnergy);
+                        clusterTotalEnergy[OVER_2HIT].fill(clusterEnergy);
+                        clusterHitCount[OVER_2HIT].fill(hitCount);
+                        clusterDistribution[OVER_2HIT].fill(ix, iy);
+                    }
+                }
                 
                 // ==== Seed Hit Energy Cut ====================================
                 // =============================================================
@@ -246,10 +331,14 @@
                 clusterTotalEnergyCount++;
                 
                 // Fill the "passed single cuts" plots.
-                clusterSeedEnergySingle.fill(seedEnergy, 1);
-                clusterTotalEnergySingle.fill(clusterEnergy, 1);
-                clusterHitCountSingle.fill(hitCount, 1);
-                clusterDistributionSingle.fill(ix, iy, 1);
+                clusterSeedEnergy[SINGLES_CUTS].fill(seedEnergy);
+                clusterTotalEnergy[SINGLES_CUTS].fill(clusterEnergy);
+                clusterHitCount[SINGLES_CUTS].fill(hitCount);
+                clusterDistribution[SINGLES_CUTS].fill(ix, iy, 1);
+                //clusterSeedEnergySingle.fill(seedEnergy, 1);
+                //clusterTotalEnergySingle.fill(clusterEnergy, 1);
+                //clusterHitCountSingle.fill(hitCount, 1);
+                //clusterDistributionSingle.fill(ix, iy, 1);
                 
                 // A cluster that passes all of the single-cluster cuts
                 // can be used in cluster pairs.
@@ -404,40 +493,6 @@
      */
     public void setVerbose(boolean verbose) {
         this.verbose = verbose;
-    }
-    
-    /**
-     * Initializes the cluster pair queues and other variables.
-     */
-    @Override
-    public void startOfData() {
-        // Make sure that a valid cluster collection name has been
-        // defined. If it has not, throw an exception.
-        if (clusterCollectionName == null) {
-            throw new RuntimeException("The parameter clusterCollectionName was not set!");
-        }
-        
-        // Initialize the top and bottom cluster queues.
-        topClusterQueue = new LinkedList<List<Cluster>>();
-        botClusterQueue = new LinkedList<List<Cluster>>();
-        
-        // Populate the top cluster queue. It should be populated with
-        // a number of empty lists equal to (2 * pairCoincidence + 1).
-        for (int i = 0; i < 2 * pairCoincidence + 1; i++) {
-            topClusterQueue.add(new ArrayList<Cluster>());
-        }
-        
-        // Populate the bottom cluster queue. It should be populated with
-        // a number of empty lists equal to (2 * pairCoincidence + 1).
-        for (int i = 0; i < pairCoincidence + 1; i++) {
-            botClusterQueue.add(new ArrayList<Cluster>());
-        }
-        
-        // If a background level has been set, pick the correct cuts.
-        if(backgroundLevel != -1) { setBackgroundCuts(backgroundLevel); }
-        
-        // Run the superclass method.
-        super.startOfData();
     }
 
     /**
@@ -599,10 +654,32 @@
             double coplanarity = TriggerModule.getValueCoplanarity(clusterPair);
             
             // Fill the general plots.
-            pairEnergySum.fill(energySum, 1);
-            pairEnergyDifference.fill(energyDifference, 1);
-            pairEnergySlope.fill(energySlope, 1);
-            pairCoplanarity.fill(coplanarity, 1);
+            pairEnergySum[NO_CUTS].fill(energySum);
+            pairEnergyDifference[NO_CUTS].fill(energyDifference);
+            pairEnergySlope[NO_CUTS].fill(energySlope);
+            pairCoplanarity[NO_CUTS].fill(coplanarity);
+            //pairEnergySum.fill(energySum, 1);
+            //pairEnergyDifference.fill(energyDifference, 1);
+            //pairEnergySlope.fill(energySlope, 1);
+            //pairCoplanarity.fill(coplanarity, 1);
+            
+            // Fill the hit count plots for N > 1.
+            if(clusterPair[0].getCalorimeterHits().size() > 1 && clusterPair[1].getCalorimeterHits().size() > 1) {
+            	// Populate the plots.
+                pairEnergySum[OVER_1HIT].fill(energySum);
+                pairEnergyDifference[OVER_1HIT].fill(energyDifference);
+                pairEnergySlope[OVER_1HIT].fill(energySlope);
+                pairCoplanarity[OVER_1HIT].fill(coplanarity);
+            	
+                // Fill the hit count plots for N > 2.
+                if(clusterPair[0].getCalorimeterHits().size() > 2 && clusterPair[1].getCalorimeterHits().size() > 2) {
+                	// Populate the plots.
+                    pairEnergySum[OVER_2HIT].fill(energySum);
+                    pairEnergyDifference[OVER_2HIT].fill(energyDifference);
+                    pairEnergySlope[OVER_2HIT].fill(energySlope);
+                    pairCoplanarity[OVER_2HIT].fill(coplanarity);
+                }
+            }
             
             // ==== Pair Energy Sum Cut ====================================
             // =============================================================
@@ -661,17 +738,21 @@
             
             // Fill the general plots.
             for(int i = 0; i < 2; i++) {
-                clusterSeedEnergyAll.fill(seedEnergy[i], 1);
-                clusterTotalEnergyAll.fill(clusterEnergy[i], 1);
-                clusterHitCountAll.fill(hitCount[i], 1);
-                clusterDistributionAll.fill(ix[i], iy[i], 1);
+                clusterSeedEnergy[ALL_CUTS].fill(seedEnergy[i]);
+                clusterTotalEnergy[ALL_CUTS].fill(clusterEnergy[i]);
+                clusterHitCount[ALL_CUTS].fill(hitCount[i]);
+                clusterDistribution[ALL_CUTS].fill(ix[i], iy[i]);
+                //clusterSeedEnergyAll.fill(seedEnergy[i], 1);
+                //clusterTotalEnergyAll.fill(clusterEnergy[i], 1);
+                //clusterHitCountAll.fill(hitCount[i], 1);
+                //clusterDistributionAll.fill(ix[i], iy[i], 1);
             }
             
             // Fill the "passed all cuts" plots.
-            pairEnergySumAll.fill(energySum, 1);
-            pairEnergyDifferenceAll.fill(energyDifference, 1);
-            pairEnergySlopeAll.fill(energySlope, 1);
-            pairCoplanarityAll.fill(coplanarity, 1);
+            pairEnergySum[ALL_CUTS].fill(energySum, 1);
+            pairEnergyDifference[ALL_CUTS].fill(energyDifference, 1);
+            pairEnergySlope[ALL_CUTS].fill(energySlope, 1);
+            pairCoplanarity[ALL_CUTS].fill(coplanarity, 1);
             
             // Clusters that pass all of the pair cuts produce a trigger.
             return true;