Author: [log in to unmask] Date: Thu Oct 22 21:33:15 2015 New Revision: 3885 Log: Added new cuts to pair process analysis driver to try and reduce background. Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/TriggerProcessAnalysisDriver.java Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/TriggerProcessAnalysisDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/TriggerProcessAnalysisDriver.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/TriggerProcessAnalysisDriver.java Thu Oct 22 21:33:15 2015 @@ -21,14 +21,18 @@ import org.lcsim.util.aida.AIDA; public class TriggerProcessAnalysisDriver extends Driver { - private boolean checkSVT = false; private int eventsProcessed = 0; private int møllersProcessed = 0; + private boolean checkSVT = false; private int tridentsProcessed = 0; private int gblMøllersProcessed = 0; private int gblTridentsProcessed = 0; private double timeCoincidence = 2.5; + private double elasticThreshold = 0.800; + private double møllerLowerRange = 0.900; + private double møllerUpperRange = 1.200; private AIDA aida = AIDA.defaultInstance(); + private boolean checkTriggerTimeWindow = false; private String clusterCollectionName = "EcalClustersCorr"; private String particleCollectionName = "FinalStateParticles"; @@ -281,6 +285,10 @@ public void setCheckSVT(boolean state) { checkSVT = state; + } + + public void setCheckTriggerTimeWindow(boolean state) { + checkTriggerTimeWindow = state; } /** @@ -448,10 +456,10 @@ continue tridentTrackLoop; } - // Require that the negative track have less than 900 MeV - // momentum to exclude elastic electrons. - if(pair[0].getCharge() < 0 && pair[0].getMomentum().magnitude() > 0.900 - || pair[1].getCharge() < 0 && pair[1].getMomentum().magnitude() > 0.900) { + // Require that the negative track have less than the + // elastic threshold momentum to exclude elastic electrons. + if(pair[0].getCharge() < 0 && pair[0].getMomentum().magnitude() > elasticThreshold + || pair[1].getCharge() < 0 && pair[1].getMomentum().magnitude() > elasticThreshold) { continue tridentTrackLoop; } @@ -505,15 +513,32 @@ } // The clusters must within a limited time window. + /* Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; if(TriggerModule.getValueTimeCoincidence(trackClusters) > timeCoincidence) { continue tridentLoop; } + */ + + // The clusters must be coincidental within an energy + // dependent coincidence window. + Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; + if(!isCoincidental(trackClusters)) { + continue tridentLoop; + } // Require that the electron in the pair have an energy - // below 900 MeV to exclude elastic electrons. - if(electron.getMomentum().magnitude() >= 0.900) { + // below the elastic threshold to exclude elastic electrons. + if(electron.getMomentum().magnitude() >= elasticThreshold) { continue tridentLoop; + } + + // Require that all clusters occur within the trigger time + // window to exclude accidentals. + if(checkTriggerTimeWindow) { + if(!inTriggerWindow(trackClusters[0]) || !inTriggerWindow(trackClusters[1])) { + continue tridentLoop; + } } // If all the above conditions are met, the pair is to be @@ -553,15 +578,15 @@ } // Require that the electrons in the pair have energies - // below 900 MeV to exclude elastic electrons. - if(pair[0].getMomentum().magnitude() > 0.900 || pair[1].getMomentum().magnitude() > 0.900) { + // below the elastic threshold to exclude said electrons. + if(pair[0].getMomentum().magnitude() > elasticThreshold || pair[1].getMomentum().magnitude() > elasticThreshold) { continue møllerLoop; } // Require that the energy of the pair be within a range // that is sufficiently "Møller-like." double momentumSum = VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(); - if(momentumSum < 0.800 || momentumSum > 1.500) { + if(momentumSum < møllerLowerRange || momentumSum > møllerUpperRange) { continue møllerLoop; } @@ -605,22 +630,39 @@ } // The clusters must within a limited time window. + /* Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; if(TriggerModule.getValueTimeCoincidence(trackClusters) > timeCoincidence) { continue møllerLoop; } + */ + + // The clusters must be coincidental within an energy + // dependent coincidence window. + Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; + if(!isCoincidental(trackClusters)) { + continue møllerLoop; + } // Require that the electrons in the pair have energies - // below 900 MeV to exclude elastic electrons. - if(pair[0].getMomentum().magnitude() > 0.900 || pair[1].getMomentum().magnitude() > 0.900) { + // below the elastic threshold to exclude said electrons. + if(pair[0].getMomentum().magnitude() > elasticThreshold || pair[1].getMomentum().magnitude() > elasticThreshold) { continue møllerLoop; } // Require that the energy of the pair be within a range // that is sufficiently "Møller-like." double momentumSum = VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(); - if(momentumSum < 0.800 || momentumSum > 1.500) { - continue møllerLoop; + if(momentumSum < møllerLowerRange || momentumSum > møllerUpperRange) { + continue møllerLoop; + } + + // Require that all clusters occur within the trigger time + // window to exclude accidentals. + if(checkTriggerTimeWindow) { + if(!inTriggerWindow(trackClusters[0]) || !inTriggerWindow(trackClusters[1])) { + continue møllerLoop; + } } // If all the above conditions are met, the pair is to be @@ -704,5 +746,43 @@ private static final double getCalculatedCoplanarity(Track[] pair) { return getCalculatedCoplanarity(TrackUtils.getTrackPositionAtEcal(pair[0]).v(), TrackUtils.getTrackPositionAtEcal(pair[1]).v()); } -} -// [log in to unmask] + + private static final boolean inTriggerWindow(Cluster cluster) { + // Get the cluster time. + double clusterTime = TriggerModule.getClusterTime(cluster); + + // Check that it is within the allowed bounds. + return (35 <= clusterTime && clusterTime <= 50); + } + + private static final boolean isCoincidental(Cluster[] pair) { + // Get the energy sum and the time coincidence. + double energySum = pair[0].getEnergy() + pair[1].getEnergy(); + double timeCoincidence = TriggerModule.getValueTimeCoincidence(pair); + + // Get the upper and lower bounds of the allowed range. + double mean = getTimeDependenceMean(energySum); + double threeSigma = 3.0 * getTimeDependenceSigma(energySum); + double lowerBound = mean - threeSigma; + double upperBound = mean + threeSigma; + + // Perform the time coincidence check. + return (lowerBound <= timeCoincidence && timeCoincidence <= upperBound); + } + + private static final double getTimeDependenceMean(double energySum) { + // Define the fit parameters. + double[] param = { 0.289337, -2.81998, 9.03475, -12.93, 8.71476, -2.26969 }; + + // Calculate the mean. + return param[0] + energySum * (param[1] + energySum * (param[2] + energySum * (param[3] + energySum * (param[4] + energySum * (param[5]))))); + } + + private static final double getTimeDependenceSigma(double energySum) { + // Define the fit parameters. + double[] param = { 4.3987, -24.2371, 68.9567, -98.2586, 67.562, -17.8987 }; + + // Calculate the standard deviation. + return param[0] + energySum * (param[1] + energySum * (param[2] + energySum * (param[3] + energySum * (param[4] + energySum * (param[5]))))); + } +}