Print

Print


Author: [log in to unmask]
Date: Thu Sep 24 15:32:43 2015
New Revision: 3708

Log:
Added additional plots to the trident MTE analysis driver.

Modified:
    java/trunk/users/src/main/java/org/hps/users/kmccarty/MTEAnalysis.java
    java/trunk/users/src/main/java/org/hps/users/kmccarty/RafoAnalysis.java

Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/MTEAnalysis.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/kmccarty/MTEAnalysis.java	(original)
+++ java/trunk/users/src/main/java/org/hps/users/kmccarty/MTEAnalysis.java	Thu Sep 24 15:32:43 2015
@@ -6,12 +6,15 @@
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.Map.Entry;
 
 import org.hps.record.triggerbank.AbstractIntData;
 import org.hps.record.triggerbank.TIData;
+import org.hps.record.triggerbank.TriggerModule;
 import org.lcsim.event.CalorimeterHit;
 import org.lcsim.event.Cluster;
 import org.lcsim.event.EventHeader;
@@ -55,6 +58,20 @@
 	private IHistogram1D negTrackCount = aida.histogram1D("MTE Analysis/All Negative Tracks", 10, -0.5, 9.5);
 	private IHistogram1D posTrackCount = aida.histogram1D("MTE Analysis/All Positive Event Tracks", 10, -0.5, 9.5);
 	private IHistogram1D chargedTrackCount = aida.histogram1D("MTE Analysis/All Event Event Tracks", 10, -0.5, 9.5);
+	
+	private IHistogram1D trTimeCoincidenceAll          = aida.histogram1D("Trident/Time Coincidence",                    45, 0.0, 15.0);
+	private IHistogram1D trTimeCoincidenceFiducial     = aida.histogram1D("Trident/Time Coincidence (Fiducial Region)",  45, 0.0, 15.0);
+	private IHistogram1D trEnergySumAll                = aida.histogram1D("Trident/Energy Sum",                         220, 0.0,  1.1);
+	private IHistogram1D trEnergySumFiducial           = aida.histogram1D("Trident/Energy Sum (Fiducial Region)",       220, 0.0,  1.1);
+	private IHistogram2D trEnergySum2DAll              = aida.histogram2D("Trident/Top Cluster Energy vs. Bottom Cluster Energy",                   220, 0, 1.1, 220, 0, 1.1);
+	private IHistogram2D trEnergySum2DFiducial         = aida.histogram2D("Trident/Top Cluster Energy vs. Bottom Cluster Energy (Fiducial Region)", 220, 0, 1.1, 220, 0, 1.1);
+	private IHistogram2D trSumCoplanarityAll           = aida.histogram2D("Trident/Hardware Coplanarity vs. Energy Sum",                            220, 0, 1.1, 115, 0, 230);
+	private IHistogram2D trSumCoplanarityFiducial      = aida.histogram2D("Trident/Hardware Coplanarity vs. Energy Sum (Fiducial Region)",          220, 0, 1.1, 115, 0, 230);
+	private IHistogram2D trSumCoplanarityCalcAll       = aida.histogram2D("Trident/Calculated Coplanarity vs. Energy Sum",                          220, 0, 1.1, 115, 0, 230);
+	private IHistogram2D trSumCoplanarityCalcFiducial  = aida.histogram2D("Trident/Calculated Coplanarity vs. Energy Sum (Fiducial Region)",        220, 0, 1.1, 115, 0, 230);
+	private IHistogram2D trTimeEnergyAll               = aida.histogram2D("Trident/Cluster Time vs. Cluster Energy",                                220, 0, 1.1, 100, 0, 100);
+	private IHistogram2D trTimeEnergyFiducial          = aida.histogram2D("Trident/Cluster Time vs. Cluster Energy (Fiducial Region)",              220, 0, 1.1, 100, 0, 100);
+	
 	private TriggerPlotsModule allPlots = new TriggerPlotsModule("All");
 	private TriggerPlotsModule møllerPlots = new TriggerPlotsModule("Møller");
 	private TriggerPlotsModule tridentPlots = new TriggerPlotsModule("Trident");
@@ -298,7 +315,6 @@
 				// Check the trident condition.
 				if((pair[0].getCharge() < 0 && pair[1].getCharge() > 0) || pair[0].getCharge() > 0 && pair[1].getCharge() < 0) {
 					// Both tracks must have clusters associated with them.
-					/*
 					Cluster[] trackClusters = new Cluster[2];
 					for(int i = 0; i < 2; i++) {
 						// Disallow tracks with no associated clusters.
@@ -319,14 +335,12 @@
 					if(Math.abs(trackClusters[0].getCalorimeterHits().get(0).getTime() - trackClusters[1].getCalorimeterHits().get(0).getTime()) > timeCoincidenceCut) {
 						continue tridentTrackLoop;
 					}
-					*/
 					
 					// Require that the energy of the electron is below
 					// 900 MeV.
-					//if((pair[0].getCharge() < 0 && pair[0].getMomentum().magnitude() < 0.900)
-					//		|| (pair[1].getCharge() < 0 && pair[1].getMomentum().magnitude() < 0.900)) {
+					if((pair[0].getCharge() < 0 && pair[0].getMomentum().magnitude() < 0.900) || (pair[1].getCharge() < 0 && pair[1].getMomentum().magnitude() < 0.900)) {
 						isTrident = true;
-						//tridentPlots.addClusterPair(trackClusters);
+						tridentPlots.addClusterPair(trackClusters);
 						if(pair[0].getCharge() > 0) {
 							positronPlot.fill(pair[1].getMomentum().magnitude());
 							electronPlot[TRIDENT].fill(pair[0].getMomentum().magnitude());
@@ -336,7 +350,47 @@
 						}
 						energyPlot[TRIDENT].fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude());
 						energy2DPlot[TRIDENT].fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude());
-					//}
+						
+						// Track which clusters have already been added to the
+						// singles plot so that there are no repeats.
+						Set<Cluster> plotSet = new HashSet<Cluster>();
+						Set<Cluster> plotFiducial = new HashSet<Cluster>();
+						
+						// Fill the all pairs plots.
+						double pairEnergy = trackClusters[0].getEnergy() + trackClusters[1].getEnergy();
+						trEnergySumAll.fill(pairEnergy);
+						trEnergySum2DAll.fill(trackClusters[1].getEnergy(), trackClusters[0].getEnergy());
+						trTimeCoincidenceAll.fill(TriggerModule.getValueTimeCoincidence(trackClusters));
+						trSumCoplanarityCalcAll.fill(pairEnergy, getCalculatedCoplanarity(trackClusters));
+						trSumCoplanarityAll.fill(pairEnergy, TriggerModule.getValueCoplanarity(trackClusters));
+						
+						// Fill the singles plots.
+						if(!plotSet.contains(trackClusters[0])) {
+							plotSet.add(trackClusters[0]);
+							trTimeEnergyAll.fill(trackClusters[0].getEnergy(), TriggerModule.getClusterTime(trackClusters[0]));
+						} if(!plotSet.contains(trackClusters[1])) {
+							plotSet.add(trackClusters[1]);
+							trTimeEnergyAll.fill(trackClusters[1].getEnergy(), TriggerModule.getClusterTime(trackClusters[1]));
+						}
+						
+						// Fill the fiducial plots if appropriate.
+						if(inFiducialRegion(trackClusters[0]) && inFiducialRegion(trackClusters[1])) {
+							trEnergySumFiducial.fill(pairEnergy);
+							trEnergySum2DFiducial.fill(trackClusters[1].getEnergy(), trackClusters[0].getEnergy());
+							trTimeCoincidenceFiducial.fill(TriggerModule.getValueTimeCoincidence(trackClusters));
+							trSumCoplanarityCalcFiducial.fill(pairEnergy, getCalculatedCoplanarity(trackClusters));
+							trSumCoplanarityFiducial.fill(pairEnergy, TriggerModule.getValueCoplanarity(trackClusters));
+						}
+						
+						// Fill the singles fiducial plots if appropriate.
+						if(!plotFiducial.contains(trackClusters[0]) && inFiducialRegion(trackClusters[0])) {
+							plotFiducial.add(trackClusters[0]);
+							trTimeEnergyFiducial.fill(trackClusters[0].getEnergy(), TriggerModule.getClusterTime(trackClusters[0]));
+						} if(!plotFiducial.contains(trackClusters[1]) && inFiducialRegion(trackClusters[1])) {
+							plotFiducial.add(trackClusters[1]);
+							trTimeEnergyFiducial.fill(trackClusters[1].getEnergy(), TriggerModule.getClusterTime(trackClusters[1]));
+						}
+					}
 				}
 			}
 			
@@ -428,12 +482,69 @@
 		}
 	}
 	
+	private static final double getCalculatedCoplanarity(Cluster[] pair) {
+		// Define the x- and y-coordinates of the clusters as well as
+		// calorimeter center.
+		final double ORIGIN_X = 42.52;
+		double x[] = { pair[0].getPosition()[0], pair[1].getPosition()[0] };
+		double y[] = { pair[0].getPosition()[1], pair[1].getPosition()[1] };
+		
+        // Get the cluster angles.
+        double[] clusterAngle = new double[2];
+        for(int i = 0; i < 2; i++) {
+        	clusterAngle[i] = Math.atan2(y[i], x[i] - ORIGIN_X) * 180 / Math.PI;
+        	if(clusterAngle[i] <= 0) { clusterAngle[i] += 360; }
+        }
+        
+        // Calculate the coplanarity cut value.
+        double clusterDiff = clusterAngle[0] - clusterAngle[1];
+        return clusterDiff > 0 ? clusterDiff : clusterDiff + 360;
+	}
+	
 	public void setTimeCoincidenceCut(double value) {
 		timeCoincidenceCut = value;
 	}
 	
 	public void setExcludeNoTrackEvents(boolean state) {
 		excludeNoTrackEvents = state;
+	}
+	
+	private static final boolean inFiducialRegion(Cluster cluster) {
+		// Get the x and y indices for the cluster.
+		int ix   = TriggerModule.getClusterXIndex(cluster);
+		int absx = Math.abs(TriggerModule.getClusterXIndex(cluster));
+		int absy = Math.abs(TriggerModule.getClusterYIndex(cluster));
+		
+		// Check if the cluster is on the top or the bottom of the
+		// calorimeter, as defined by |y| == 5. This is an edge cluster
+		// and is not in the fiducial region.
+		if(absy == 5) {
+			return false;
+		}
+		
+		// Check if the cluster is on the extreme left or right side
+		// of the calorimeter, as defined by |x| == 23. This is also
+		// and edge cluster is not in the fiducial region.
+		if(absx == 23) {
+			return false;
+		}
+		
+		// Check if the cluster is along the beam gap, as defined by
+		// |y| == 1. This is an internal edge cluster and is not in the
+		// fiducial region.
+		if(absy == 1) {
+			return false;
+		}
+		
+		// Lastly, check if the cluster falls along the beam hole, as
+		// defined by clusters with -11 <= x <= -1 and |y| == 2. This
+		// is not the fiducial region.
+		if(absy == 2 && ix <= -1 && ix >= -11) {
+			return false;
+		}
+		
+		// If all checks fail, the cluster is in the fiducial region.
+		return true;
 	}
 	
 	private static final List<ReconstructedParticle[]> getTrackPairs(List<ReconstructedParticle> trackList) {

Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/RafoAnalysis.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/kmccarty/RafoAnalysis.java	(original)
+++ java/trunk/users/src/main/java/org/hps/users/kmccarty/RafoAnalysis.java	Thu Sep 24 15:32:43 2015
@@ -352,10 +352,15 @@
 		List<ReconstructedParticle> topList = new ArrayList<ReconstructedParticle>();
 		List<ReconstructedParticle> botList = new ArrayList<ReconstructedParticle>();
 		for(ReconstructedParticle track : tracks) {
-			if(track.getMomentum().y() > 0.0) {
-				topList.add(track);
-			} else {
-				botList.add(track);
+			// Make sure that the track actually contains tracks.
+			if(track.getTracks().size() > 0) {
+				// Use the tan(Λ) to differentiate "top" and "bottom"
+				// tracks from one another.
+				if(track.getTracks().get(0).getTrackStates().get(0).getTanLambda() > 0) {
+					topList.add(track);
+				} else {
+					botList.add(track);
+				}
 			}
 		}