Print

Print


Author: mccaky
Date: Sun Dec 14 10:36:18 2014
New Revision: 1721

Log:
Added an engineering run plot generation driver to produce comparison plots.

Added:
    java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/OccupancyAnalysisDriver.java

Added: java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/OccupancyAnalysisDriver.java
 =============================================================================
--- java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/OccupancyAnalysisDriver.java	(added)
+++ java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/OccupancyAnalysisDriver.java	Sun Dec 14 10:36:18 2014
@@ -0,0 +1,160 @@
+package org.hps.readout.ecal;
+
+import java.util.List;
+
+import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
+
+import org.hps.recon.ecal.HPSEcalCluster;
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.EventHeader;
+import org.lcsim.util.Driver;
+import org.lcsim.util.aida.AIDA;
+
+public class OccupancyAnalysisDriver extends Driver {
+	// Internal variables.
+	private double scalingFactor = 0.05;
+	private double seedThreshold = 0.050;
+	private double beamRatio = 1.92 / 2.2;
+	private double clusterThreshold = 0.200;
+    private AIDA aida = AIDA.defaultInstance();
+	private boolean ignoreBeamGapRows = false;
+	
+    // LCIO Collection Names
+    private String clusterCollectionName = "EcalClusters";
+    private String hitCollectionName = "EcalCorrectedHits";
+    
+	// Trigger plots.
+    IHistogram2D occupancyDistribution;
+    IHistogram2D[] clusterDistribution = new IHistogram2D[2];
+    IHistogram1D[] clusterHitDistribution = new IHistogram1D[2];
+    IHistogram1D[] totalEnergyDistribution = new IHistogram1D[2];
+    IHistogram1D[] clusterEnergyDistribution = new IHistogram1D[2];
+    
+    public void setIgnoreBeamGapRows(boolean ignoreBeamGapRows) {
+    	this.ignoreBeamGapRows = ignoreBeamGapRows;
+    }
+    
+    public void setBeamRatio(double beamRatio) {
+    	this.beamRatio = beamRatio;
+    }
+    
+    public void setScalingFactor(double scalingFactor) {
+    	this.scalingFactor = scalingFactor;
+    }
+    
+    public void setSeedThreshold(double seedThreshold) {
+    	this.seedThreshold = seedThreshold;
+    }
+    
+    public void setClusterThreshold(double clusterThreshold) {
+    	this.clusterThreshold = clusterThreshold;
+    }
+    
+    public void setClusterCollectionName(String clusterCollectionName) {
+    	this.clusterCollectionName = clusterCollectionName;
+    }
+    
+    public void setHitCollectionName(String hitCollectionName) {
+    	this.hitCollectionName = hitCollectionName;
+    }
+    
+    @Override
+    public void process(EventHeader event) {
+    	// If clusters are present, process them.
+    	if(event.hasCollection(HPSEcalCluster.class, clusterCollectionName)) {
+    		// Get the list of clusters.
+    		List<HPSEcalCluster> clusterList = event.get(HPSEcalCluster.class, clusterCollectionName);
+    		
+    		// Use the clusters to populate the cluster plots.
+    		for(HPSEcalCluster cluster : clusterList) {
+    			// Get the ix and iy values for the cluster.
+    			int ix = cluster.getSeedHit().getIdentifierFieldValue("ix");
+    			int iy = cluster.getSeedHit().getIdentifierFieldValue("iy");
+    			
+    			// If we want to ignore the beam gap rows, make sure
+    			// that iy exceeds two.
+    			if(!ignoreBeamGapRows || (Math.abs(iy) > 2)) {
+	        		// If the cluster passes the seed threshold, place it in
+	        		// the level 1 plots.
+	    			if(cluster.getSeedHit().getCorrectedEnergy() >= seedThreshold) {
+	    				clusterDistribution[0].fill(ix, iy, scalingFactor);
+	    				clusterHitDistribution[0].fill(cluster.getCalorimeterHits().size(), scalingFactor);
+	    				clusterEnergyDistribution[0].fill(cluster.getEnergy() * beamRatio, scalingFactor);
+	    			}
+	    			
+	    			// If the cluster energy passes the cluster threshold,
+	    			// populate the level 2 plots.
+	    			if(cluster.getEnergy() >= clusterThreshold) {
+	    				clusterDistribution[1].fill(ix, iy, scalingFactor);
+	    				clusterHitDistribution[1].fill(cluster.getCalorimeterHits().size(), scalingFactor);
+	    				clusterEnergyDistribution[1].fill(cluster.getEnergy() * beamRatio, scalingFactor);
+	    			}
+    			}
+    		}
+    	}
+    	
+    	// If the event has hits, process them.
+    	if(event.hasCollection(CalorimeterHit.class, hitCollectionName)) {
+    		// Get the list of hits.
+    		List<CalorimeterHit> hitList = event.get(CalorimeterHit.class, hitCollectionName);
+    		
+    		// Track the energy in the top and bottom of the calorimeter.
+    		double[] energy = { 0.0, 0.0 };
+    		
+    		// Iterate over the hits.
+    		for(CalorimeterHit hit : hitList) {
+    			// Get the ix and iy values.
+    			int ix = hit.getIdentifierFieldValue("ix");
+    			int iy = hit.getIdentifierFieldValue("iy");
+    			
+    			// If we want to ignore beam gap rows, ensure that iy
+    			// is greater than 2.
+    			if(!ignoreBeamGapRows || Math.abs(iy) > 2) {
+	    			// Add the energy to the appropriate energy tracking
+	    			// variable for the calorimeter halves.
+	    			if(iy > 0) { energy[0] += hit.getCorrectedEnergy() * beamRatio; }
+	    			else { energy[1] += hit.getCorrectedEnergy() * beamRatio; }
+	    			
+	    			// Populate the occupancy distribution.
+	    			occupancyDistribution.fill(ix, iy, scalingFactor);
+    			}
+    		}
+			
+			// Populate the total calorimeter energy plot.
+			totalEnergyDistribution[0].fill(energy[0], scalingFactor);
+			totalEnergyDistribution[1].fill(energy[1], scalingFactor);
+    	}
+    }
+    
+    @Override
+    public void startOfData() {
+    	// Define the cluster distribution plots.
+    	String[] clusterDistName = { String.format("Comp Plots :: Cluster Seed Distribution [Seed Threshold %.3f GeV]", seedThreshold),
+    			String.format("Comp Plots :: Cluster Seed Distribution [Cluster Threshold %.3f GeV]", clusterThreshold) };
+        clusterDistribution[0] = aida.histogram2D(clusterDistName[0], 46, -23, 23, 11, -5.5, 5.5);
+        clusterDistribution[1] = aida.histogram2D(clusterDistName[1], 46, -23, 23, 11, -5.5, 5.5);
+        
+    	// Define the occupancy distribution plots.
+    	String occupancyDistName = String.format("Comp Plots :: Crystal Occupancy");
+    	occupancyDistribution = aida.histogram2D(occupancyDistName, 46, -23, 23, 11, -5.5, 5.5);
+    	
+        // Define the cluster hit count distribution.
+    	String[] clusterHitDistName = { String.format("Comp Plots :: Cluster Hit Count Distribution [Seed Threshold %.3f GeV]", seedThreshold),
+    			String.format("Comp Plots :: Cluster Hit Count Distribution [Cluster Threshold %.3f GeV]", clusterThreshold) };
+    	clusterHitDistribution[0] = aida.histogram1D(clusterHitDistName[0], 9, 1, 10);
+    	clusterHitDistribution[1] = aida.histogram1D(clusterHitDistName[1], 9, 1, 10);
+    	
+        // Define the cluster total energy distribution.
+    	String[] clusterEnergyDistName = { String.format("Comp Plots :: Cluster Total Energy Distribution [Seed Threshold %.3f GeV]", seedThreshold),
+    			String.format("Comp Plots :: Cluster Total Energy Distribution [Cluster Threshold %.3f GeV]", clusterThreshold) };
+    	clusterEnergyDistribution[0] = aida.histogram1D(clusterEnergyDistName[0], 176, 0.0, 2.2);
+    	clusterEnergyDistribution[1] = aida.histogram1D(clusterEnergyDistName[1], 176, 0.0, 2.2);
+    	
+        // Define the calorimeter total energy distribution.
+    	String[] totalEnergyDistName = { String.format("Comp Plots :: Calorimeter Event Energy Distribution [Top]"),
+    			String.format("Comp Plots :: Calorimeter Event Energy Distribution [Bottom]") };
+    	totalEnergyDistribution[0] = aida.histogram1D(totalEnergyDistName[0], 500, 0.0, 10.0);
+    	totalEnergyDistribution[1] = aida.histogram1D(totalEnergyDistName[1], 500, 0.0, 10.0);
+    }
+}