Author: mccaky Date: Mon Nov 10 10:46:34 2014 New Revision: 1472 Log: Updated primary trigger driver to include updated cuts for large-angle bremsstrahlung. 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 Mon Nov 10 10:46:34 2014 @@ -29,16 +29,16 @@ // ================================================================== // ==== Trigger Cut Default Parameters ============================== // ================================================================== - private int minHitCount = 1; // Minimum required cluster hit count threshold. (Hits) - private double seedEnergyHigh = Double.MAX_VALUE; // Maximum allowed cluster seed energy. (GeV) - private double seedEnergyLow = Double.MIN_VALUE; // Minimum required cluster seed energy. (GeV) - private double clusterEnergyHigh = 1.5 * ECalUtils.GeV; // Maximum allowed cluster total energy. (GeV) - private double clusterEnergyLow = .1 * ECalUtils.GeV; // Minimum required cluster total energy. (GeV) - private double energySumHigh = 1.9 * ECalUtils.GeV; // Maximum allowed pair energy sum. (GeV) - private double energySumLow = 0.0 * ECalUtils.GeV; // Minimum required pair energy sum. (GeV) - private double energyDifferenceHigh = 2.2 * ECalUtils.GeV; // Maximum allowed pair energy difference. (GeV) - private double energySlopeLow = 1.1; // Minimum required pair energy slope value. - private double coplanarityHigh = 35; // Maximum allowed pair coplanarity deviation. (Degrees) + private int minHitCount = 1; // Minimum required cluster hit count threshold. (Hits) + private double seedEnergyHigh = Double.MAX_VALUE; // Maximum allowed cluster seed energy. (GeV) + private double seedEnergyLow = Double.MIN_VALUE; // Minimum required cluster seed energy. (GeV) + private double clusterEnergyHigh = 1.5 * ECalUtils.GeV; // Maximum allowed cluster total energy. (GeV) + private double clusterEnergyLow = .1 * ECalUtils.GeV; // Minimum required cluster total energy. (GeV) + private double energySumHigh = 1.9 * ECalUtils.GeV; // Maximum allowed pair energy sum. (GeV) + private double energySumLow = 0.0 * ECalUtils.GeV; // Minimum required pair energy sum. (GeV) + private double energyDifferenceHigh = 2.2 * ECalUtils.GeV; // Maximum allowed pair energy difference. (GeV) + private double energySlopeLow = 1.1; // Minimum required pair energy slope value. + private double coplanarityHigh = 35; // Maximum allowed pair coplanarity deviation. (Degrees) // ================================================================== // ==== Trigger General Default Parameters ========================== @@ -63,6 +63,7 @@ private int pairEnergyDifferenceCount = 0; // Track the pairs which pass the energy difference cut. private int pairEnergySlopeCount = 0; // Track the pairs which pass the energy slope cut. private int pairCoplanarityCount = 0; // Track the pairs which pass the coplanarity cut. + private boolean verbose = false; // Stores whether debug text should be output. // ================================================================== // ==== Trigger Distribution Plots ================================== @@ -100,15 +101,13 @@ // ================================================================== IHistogram2D diagClusters = aida.histogram2D("Diagnostic Plots :: Cluster Seed Distribution", 46, -23, 23, 11, -5.5, 5.5); IHistogram1D[] diagHitCount = { - aida.histogram1D("Diagnostic Plots :: Cluster Hit Count Distribution (Top)", 7, 0, 7), - aida.histogram1D("Diagnostic Plots :: Cluster Hit Count Distribution (Bottom)", 7, 0, 7) + aida.histogram1D("Diagnostic Plots :: Cluster Hit Count Distribution (Top)", 8, 0, 8), + aida.histogram1D("Diagnostic Plots :: Cluster Hit Count Distribution (Bottom)", 8, 0, 8) }; 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 boolean verbose = false; /** * Prints out the results of the trigger at the end of the run. @@ -266,7 +265,6 @@ /** * Sets the trigger cuts automatically to a given background level. - * * @param backgroundLevel - The level to which the background should * be set. Actual background rates equal about (5 * backgroundLevel) kHz. */ @@ -276,7 +274,6 @@ /** * Sets the name of the LCIO collection that contains the clusters. - * * @param clusterCollectionName - The cluster LCIO collection name. */ public void setClusterCollectionName(String clusterCollectionName) { @@ -287,7 +284,6 @@ * Sets the highest allowed energy a cluster may have and still * pass the cluster total energy single cluster cut. Value uses * units of GeV. - * * @param clusterEnergyHigh - The parameter value. */ public void setClusterEnergyHigh(double clusterEnergyHigh) { @@ -298,7 +294,6 @@ * Sets the lowest allowed energy a cluster may have and still * pass the cluster total energy single cluster cut. Value uses * units of GeV. - * * @param clusterEnergyLow - The parameter value. */ public void setClusterEnergyLow(double clusterEnergyLow) { @@ -309,7 +304,6 @@ * Sets the maximum deviation from coplanarity that a cluster pair * may possess and still pass the coplanarity pair cut. Value uses * units of degrees. - * * @param maxCoplanarityAngle - The parameter value. */ public void setCoplanarityHigh(double coplanarityHigh) { @@ -320,7 +314,6 @@ * Sets the highest allowed energy difference a cluster pair may * have and still pass the cluster pair energy difference cut. * Value uses units of GeV. - * * @param energyDifferenceHigh - The parameter value. */ public void setEnergyDifferenceHigh(double energyDifferenceHigh) { @@ -330,7 +323,6 @@ /** * Sets the lowest allowed energy slope a cluster pair may * have and still pass the cluster pair energy slope cut. - * * @param energySlopeLow - The parameter value. */ public void setEnergySlopeLow(double energySlopeLow) { @@ -341,7 +333,6 @@ * Sets the highest allowed energy a cluster pair may have and * still pass the cluster pair energy sum cluster cut. Value uses * units of GeV. - * * @param energySumHigh - The parameter value. */ public void setEnergySumHigh(double energySumHigh) { @@ -352,7 +343,6 @@ * Sets the lowest allowed energy a cluster pair may have and * still pass the cluster pair energy sum cluster cut. Value uses * units of GeV. - * * @param energySumHigh - The parameter value. */ public void setEnergySumLow(double energySumLow) { @@ -362,7 +352,6 @@ /** * Sets the minimum number of hits needed for a cluster to pass * the hit count single cluster cut. - * * @param minHitCount - The parameter value. */ public void setMinHitCount(int minHitCount) { @@ -373,7 +362,6 @@ * Sets X coordinate used as the origin for cluster coplanarity and * slope calculations. This defaults to the calorimeter mid-plane * and is in units of millimeters. - * * @param originX - The parameter value. */ public void setOriginX(double originX) { @@ -384,7 +372,6 @@ * Sets the time range over which cluster pairs will be formed. * Value uses units of clock-cycles. Note that the number of * clock-cycles used is calculated as (2 * pairCoincidence) + 1. - * * @param pairCoincidence - The parameter value. */ public void setPairCoincidence(int pairCoincidence) { @@ -395,7 +382,6 @@ * Sets the highest allowed energy a seed hit may have and still * pass the seed hit energy single cluster cut. Value uses units * of GeV. - * * @param seedEnergyHigh - The parameter value. */ public void setSeedEnergyHigh(double seedEnergyHigh) { @@ -406,7 +392,6 @@ * Sets the lowest allowed energy a seed hit may have and still * pass the seed hit energy single cluster cut. Value uses units * of GeV. - * * @param seedEnergyLow - The parameter value. */ public void setSeedEnergyLow(double seedEnergyLow) { @@ -448,10 +433,9 @@ } /** - * Get a list of all unique cluster pairs in the event - * - * @param ecalClusters : List of ECal clusters - * @return list of cluster pairs + * Get a list of all unique cluster pairs in the event. + * @return A <code>List</code> collection of <code>HPSEcalCLuster + * </code> objects containing all cluster pairs. */ protected List<HPSEcalCluster[]> getClusterPairsTopBot() { // Create a list to store cluster pairs. @@ -487,7 +471,6 @@ /** * Determines if the event produces a trigger. - * * @return Returns <code>true</code> if the event produces a trigger * and <code>false</code> if it does not. */ @@ -507,7 +490,6 @@ /** * Checks whether the argument cluster possesses the minimum * allowed hits. - * * @param cluster - The cluster to check. * @return Returns <code>true</code> if the cluster passes the cut * and <code>false</code> if the cluster does not. @@ -519,7 +501,6 @@ /** * Checks whether the argument cluster seed hit falls within the * allowed seed hit energy range. - * * @param cluster - The cluster to check. * @return Returns <code>true</code> if the cluster passes the cut * and <code>false</code> if the cluster does not. @@ -536,7 +517,6 @@ /** * Checks whether the argument cluster falls within the allowed * cluster total energy range. - * * @param cluster - The cluster to check. * @return Returns <code>true</code> if the cluster passes the cut * and <code>false</code> if the cluster does not. @@ -552,7 +532,6 @@ /** * Calculates the distance between two clusters. - * * @param clusterPair - The cluster pair from which the value should * be calculated. * @return Returns the distance between the clusters. @@ -563,7 +542,6 @@ /** * Gets the value used for the cluster total energy cut. - * * @param cluster - The cluster from which the value should be * derived. * @return Returns the cut value. @@ -574,7 +552,6 @@ /** * Gets the value used for the cluster hit count cut. - * * @param cluster - The cluster from which the value should be * derived. * @return Returns the cut value. @@ -585,7 +562,6 @@ /** * Gets the value used for the seed hit energy cut. - * * @param cluster - The cluster from which the value should be * derived. * @return Returns the cut value. @@ -596,7 +572,6 @@ /** * Calculates the value used by the coplanarity cut. - * * @param clusterPair - The cluster pair from which the value should * be calculated. * @return Returns the cut value. @@ -615,7 +590,6 @@ /** * Calculates the value used by the energy difference cut. - * * @param clusterPair - The cluster pair from which the value should * be calculated. * @return Returns the cut value. @@ -626,7 +600,6 @@ /** * Calculates the value used by the energy slope cut. - * * @param clusterPair - The cluster pair from which the value should * be calculated. * @return Returns the cut value. @@ -645,7 +618,6 @@ /** * Calculates the value used by the energy sum cut. - * * @param clusterPair - The cluster pair from which the value should * be calculated. * @return Returns the cut value. @@ -657,7 +629,6 @@ /** * Checks if a cluster pair is coplanar to the beam within a given * angle. - * * @param clusterPair - The cluster pair to check. * @return Returns <code>true</code> if the cluster pair passes * the cut and <code>false</code> if it does not. @@ -669,7 +640,6 @@ /** * Checks if the energy difference between the clusters making up * a cluster pair is below an energy difference threshold. - * * @param clusterPair - The cluster pair to check. * @return Returns <code>true</code> if the cluster pair passes * the cut and <code>false</code> if it does not. @@ -681,8 +651,7 @@ /** * Requires that the distance from the beam of the lowest energy * cluster in a cluster pair satisfies the following: - * E_low + d_b*.0032 GeV/mm < [ Threshold ] - * + * E_low + d_b * 0.0032 GeV/mm < [ Threshold ] * @param clusterPair : pair of clusters * @return true if pair is found, false otherwise */ @@ -693,7 +662,6 @@ /** * Checks if the sum of the energies of clusters making up a cluster * pair is below an energy sum threshold. - * * @param clusterPair - The cluster pair to check. * @return Returns <code>true</code> if the cluster pair passes * the cut and <code>false</code> if it does not. @@ -706,125 +674,77 @@ return (energySum < energySumHigh) && (energySum > energySumLow); } + /** + * Sets the cuts to accept a certain background level. Levels are + * defined with an integer between 1 and 10, where each step is + * indicative of a hypothetical background rate of approximately + * 5 kHz. Thusly, <code>backgroundLevel = 1</code> represents a + * hypothetical background rate of approximately 5 kHz, <code> + * backgroundLevel = 2</code> represents 10 kHz, and so on. Using + * a value of 0 will set the cuts to the original test run values. + * @param backgroundLevel - The hypothetical background rate value. + * This must be between 1 and 10, or zero for the original test + * run cut values. + */ private void setBackgroundCuts(int backgroundLevel) { // Make sure that the background level is valid. if(backgroundLevel < 0 || backgroundLevel > 10) { throw new RuntimeException(String.format("Trigger cuts are undefined for background level %d.", backgroundLevel)); } - // Otherwise, set the trigger cuts. Certain cuts are constant - // across all background levels. - clusterEnergyLow = 0.000; - seedEnergyLow = 0.100; + // Some cut values are almost always the same thing. Set those + // here and only overwrite if necessary. + seedEnergyLow = 0.125; + seedEnergyHigh = 1.300; + clusterEnergyLow = 0.200; + clusterEnergyHigh = 1.700; + energySumLow = 0.500; + energySumHigh = 2.000; + energyDifferenceHigh = 1.200; + coplanarityHigh = 30; + minHitCount = 2; // Set the variable values. if(backgroundLevel == 1) { - clusterEnergyHigh = 1.700; - seedEnergyHigh = 1.300; - energySumLow = 0.400; - energySumHigh = 2.00; - energyDifferenceHigh = 1.500; - energySlopeLow = 1.0; - coplanarityHigh = 40; - minHitCount = 2; + energySumLow = 1.000; + energySlopeLow = 1.2; + coplanarityHigh = 20; } else if(backgroundLevel == 2) { - clusterEnergyHigh = 1.600; - seedEnergyHigh = 1.200; - energySumLow = 0.300; - energySumHigh = 2.00; - energyDifferenceHigh = 1.400; - energySlopeLow = 0.8; - coplanarityHigh = 40; - minHitCount = 2; + energySlopeLow = 1.0; + coplanarityHigh = 20; } else if(backgroundLevel == 3) { - clusterEnergyHigh = 1.600; - seedEnergyHigh = 1.200; - energySumLow = 0.200; - energySumHigh = 2.000; - energyDifferenceHigh = 1.400; - energySlopeLow = 0.7; - coplanarityHigh = 40; - minHitCount = 2; + energySlopeLow = 1.0; } else if(backgroundLevel == 4) { - clusterEnergyHigh = 1.500; - seedEnergyHigh = 1.200; - energySumLow = 0.500; - energySumHigh = 1.950; - energyDifferenceHigh = 1.400; - energySlopeLow = 0.6; - coplanarityHigh = 40; - minHitCount = 2; + energySlopeLow = 0.8; } else if(backgroundLevel == 5) { - clusterEnergyHigh = 1.500; - seedEnergyHigh = 1.200; - energySumLow = 0.400; - energySumHigh = 2.000; - energyDifferenceHigh = 1.400; - energySlopeLow = 0.6; - coplanarityHigh = 45; - minHitCount = 2; + energySlopeLow = 0.8; } else if(backgroundLevel == 6) { - clusterEnergyHigh = 1.500; - seedEnergyHigh = 1.200; - energySumLow = 0.200; - energySumHigh = 1.950; - energyDifferenceHigh = 1.400; - energySlopeLow = 0.6; - coplanarityHigh = 55; - minHitCount = 2; + energySlopeLow = 0.6; } else if(backgroundLevel == 7) { - clusterEnergyHigh = 1.700; - seedEnergyHigh = 1.200; - energySumLow = 0.200; - energySumHigh = 2.000; - energyDifferenceHigh = 1.500; - energySlopeLow = 0.6; - coplanarityHigh = 60; - minHitCount = 2; + energySlopeLow = 0.6; } else if(backgroundLevel == 8) { - clusterEnergyHigh = 1.700; - seedEnergyHigh = 1.300; - energySumLow = 0.200; - energySumHigh = 2.000; - energyDifferenceHigh = 1.500; - energySlopeLow = 0.6; - coplanarityHigh = 65; - minHitCount = 2; + clusterEnergyHigh = 1.500; + energySlopeLow = 0.4; } else if(backgroundLevel == 9) { - clusterEnergyHigh = 1.500; - seedEnergyHigh = 1.200; - energySumLow = 0.400; - energySumHigh = 1.950; - energyDifferenceHigh = 1.400; - energySlopeLow = 0.5; - coplanarityHigh = 60; - minHitCount = 2; + energySlopeLow = 0.4; } else if(backgroundLevel == 10) { - clusterEnergyHigh = 1.500; - seedEnergyHigh = 1.200; - energySumLow = 0.400; - energySumHigh = 2.000; - energyDifferenceHigh = 1.400; - energySlopeLow = 0.5; - coplanarityHigh = 65; - minHitCount = 2; + energySlopeLow = 0.4; } else if(backgroundLevel == 0) { - seedEnergyLow = 0.100; - seedEnergyHigh = 6.6; - clusterEnergyLow = 0.100; - clusterEnergyHigh = 1.500; - energySumLow = 0.000; - energySumHigh = 1.900; + seedEnergyLow = 0.100; + seedEnergyHigh = 6.600; + clusterEnergyLow = 0.100; + clusterEnergyHigh = 1.500; + energySumLow = 0.000; + energySumHigh = 1.900; energyDifferenceHigh = 2.200; - energySlopeLow = 1.10; - coplanarityHigh = 35; - minHitCount = 1; + energySlopeLow = 1.10; + coplanarityHigh = 35; + minHitCount = 1; } } /** * Tests all of the current cluster pairs for triggers. - * * @return Returns <code>true</code> if one of the cluster pairs * passes all of the cluster cuts and <code>false</code> otherwise. */ @@ -871,7 +791,6 @@ // ==== Pair Energy Slope Cut ================================== // ============================================================= // If the cluster fails the cut, skip to the next pair. - //if(!energyDistanceCut(clusterPair)) { continue pairLoop; } if(!pairEnergySlopeCut(clusterPair)) { continue pairLoop; } // Otherwise, note that it passed the cut. @@ -926,7 +845,6 @@ /** * Adds clusters from a new event into the top and bottom cluster * queues so that they may be formed into pairs. - * * @param clusterList - The clusters to add to the queues. */ private void updateClusterQueues(List<HPSEcalCluster> clusterList) {