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