Commit in hps-java/src/main/java/org/lcsim/hps/recon/ecal on MAIN | |||
HPSFADCTriggerDriver.java | +151 | -65 | 1.14 -> 1.15 |
EnumSet is pretty nifty but it doesn't make this code any prettier
diff -u -r1.14 -r1.15 --- HPSFADCTriggerDriver.java 11 Dec 2012 00:04:29 -0000 1.14 +++ HPSFADCTriggerDriver.java 11 Dec 2012 03:13:44 -0000 1.15 @@ -1,7 +1,10 @@
package org.lcsim.hps.recon.ecal;
+import hep.aida.IHistogram1D;
import hep.aida.IHistogram2D;
+import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.EnumSet;
import java.util.LinkedList; import java.util.List;
@@ -18,7 +21,7 @@
* * @author Omar Moreno <[log in to unmask]> * @author Sho Uemura <[log in to unmask]>
- * @version $Id: HPSFADCTriggerDriver.java,v 1.14 2012/12/11 00:04:29 meeg Exp $
+ * @version $Id: HPSFADCTriggerDriver.java,v 1.15 2012/12/11 03:13:44 meeg Exp $
*/ public class HPSFADCTriggerDriver extends HPSTriggerDriver {
@@ -43,13 +46,33 @@
int coplanarityCount; AIDA aida = AIDA.defaultInstance(); IHistogram2D clusterEnergy2D, energyDistance2D, clusterAngle2D;
+ IHistogram1D triggerBits1D; + private boolean useQuadrants = false; + + private enum Flag { + + CLUSTER_ENERGY(3), ENERGY_SUM_DIFF(2), ENERGY_DISTANCE(1), COPLANARITY(0); + private final int index; + + Flag(int i) { + index = i; + } + + static int bitmask(EnumSet<Flag> flags) { + int mask = 0; + for (Flag flag : flags) { + mask |= 1 << flag.index; + } + return mask; + } + }
public HPSFADCTriggerDriver() { clusterPairs = new LinkedList<HPSEcalCluster[]>(); } public void setBeamEnergy(double beamEnergy) {
- this.beamEnergy = beamEnergy;
+ this.beamEnergy = beamEnergy * HPSECalUtils.GeV;
} @Override
@@ -57,6 +80,7 @@
clusterEnergy2D = aida.histogram2D(detector.getDetectorName() + " : " + clusterCollectionName + " : energy difference vs. sum", 100, 0.0, 2 * beamEnergy, 100, 0.0, beamEnergy); energyDistance2D = aida.histogram2D(detector.getDetectorName() + " : " + clusterCollectionName + " : distance vs. energy (less energetic cluster)", 100, 0.0, beamEnergy, 100, 0.0, 400.0); clusterAngle2D = aida.histogram2D(detector.getDetectorName() + " : " + clusterCollectionName + " : cluster angle uncoplanarity vs. more energetic cluster angle", 100, -180.0, 180.0, 100, -180.0, 180.0);
+ triggerBits1D = aida.histogram1D(detector.getDetectorName() + " : " + clusterCollectionName + " : trigger bits", 17, -1.5, 15.5);
} @Override
@@ -76,7 +100,11 @@
public boolean testTrigger(List<HPSEcalCluster> clusters) { boolean trigger = false;
- getClusterPairs(clusters);
+ if (useQuadrants) { + getClusterPairs(clusters); + } else { + getClusterPairsTopBot(clusters); + }
//--- Apply Trigger Cuts ---//
@@ -85,6 +113,8 @@
// a trigger signal is sent to all other detectors. for (HPSEcalCluster[] clusterPair : clusterPairs) {
+ EnumSet<Flag> bits = EnumSet.noneOf(Flag.class); + boolean goodPair = true;
if (outputStream != null) { outputStream.printf("Event %d: cluster pair (energy %f in quadrant %d (%s), energy %f in quadrant %d (%s))\n",
@@ -95,84 +125,112 @@
allPairs++;
- // Require that the event have at least two clusters in opposite - // quadrants - if (!oppositeQuadrantsCut(clusterPair)) { - if (outputStream != null) { - outputStream.println("Failed opposite quadrant cut");
+ if (useQuadrants) { + // Require that the event have at least two clusters in opposite + // quadrants + if (!oppositeQuadrantsCut(clusterPair)) { + if (outputStream != null) { + outputStream.println("Failed opposite quadrant cut"); + } + continue;
}
- continue;
+ oppositeQuadrantCount++;
}
- oppositeQuadrantCount++; -
// Require the components of a cluster pair to have an energy in // the range of 100 MeV to 1.85 GeV
- if (!clusterECut(clusterPair)) { - if (outputStream != null) {
+ if (clusterECut(clusterPair)) { + bits.add(Flag.CLUSTER_ENERGY); + if (goodPair) { + clusterEnergyCount++; + } + } else { + goodPair = false; + if (goodPair && outputStream != null) {
outputStream.println("Failed cluster energy cut"); }
- continue; - } - clusterEnergyCount++; - - if (energyDistanceCut(clusterPair) && coplanarityCut(clusterPair)) { - clusterEnergy2D.fill(clusterPair[0].getEnergy() + clusterPair[1].getEnergy(), clusterPair[0].getEnergy() - clusterPair[1].getEnergy()); - } - if (energySum(clusterPair) && energyDifference(clusterPair) && coplanarityCut(clusterPair)) { - energyDistance2D.fill(clusterPair[1].getEnergy(), getClusterDistance(clusterPair[1])); - } - if (energySum(clusterPair) && energyDifference(clusterPair) && energyDistanceCut(clusterPair)) { - clusterAngle2D.fill(getClusterAngle(clusterPair[0]), ((360.0 + getClusterAngle(clusterPair[0]) - getClusterAngle(clusterPair[1])) % 360.0) - 180.0);
}
+ bits.add(Flag.ENERGY_SUM_DIFF);
// Require the sum of the energies of the components of the // cluster pair to be less than the // (Beam Energy)*(Sampling Fraction) ( 2 GeV for the Test Run )
- if (!energySum(clusterPair)) { - if (outputStream != null) {
+ if (energySum(clusterPair)) { + if (goodPair) { + energySumCount++; + } + } else { + goodPair = false; + bits.remove(Flag.ENERGY_SUM_DIFF); + if (goodPair && outputStream != null) {
outputStream.println("Failed energy sum cut"); }
- continue;
}
- energySumCount++;
// Require the difference in energy of the components of the // cluster pair to be less than 1.5 GeV
- if (!energyDifference(clusterPair)) { - if (outputStream != null) {
+ if (energyDifference(clusterPair)) { + if (goodPair) { + energyDifferenceCount++; + } + } else { + goodPair = false; + bits.remove(Flag.ENERGY_SUM_DIFF); + if (goodPair && outputStream != null) {
outputStream.println("Failed energy difference cut"); }
- continue;
}
- energyDifferenceCount++;
// Apply a low energy cluster vs. distance cut of the form // E_low + .0032 GeV/mm < .8 GeV
- if (!energyDistanceCut(clusterPair)) { - if (outputStream != null) {
+ if (energyDistanceCut(clusterPair)) { + bits.add(Flag.ENERGY_DISTANCE); + if (goodPair) { + energyDistanceCount++; + } + } else { + goodPair = false; + if (goodPair && outputStream != null) {
outputStream.println("Failed energy-distance cut"); }
- continue;
}
- energyDistanceCount++;
// Require that the two clusters are coplanar with the beam within // 35 degrees
- if (!coplanarityCut(clusterPair)) { - if (outputStream != null) {
+ if (coplanarityCut(clusterPair)) { + bits.add(Flag.COPLANARITY); + if (goodPair) { + coplanarityCount++; + } + } else { + goodPair = false; + if (goodPair && outputStream != null) {
outputStream.println("Failed coplanarity cut"); }
- continue;
}
- coplanarityCount++;
+ if (bits.containsAll(EnumSet.complementOf(EnumSet.of(Flag.ENERGY_SUM_DIFF)))) { //cluster energy, energy-distance, coplanarity + clusterEnergy2D.fill(clusterPair[0].getEnergy() + clusterPair[1].getEnergy(), clusterPair[0].getEnergy() - clusterPair[1].getEnergy()); + } + if (bits.containsAll(EnumSet.complementOf(EnumSet.of(Flag.ENERGY_DISTANCE)))) { + energyDistance2D.fill(clusterPair[1].getEnergy(), getClusterDistance(clusterPair[1])); + } + if (bits.containsAll(EnumSet.complementOf(EnumSet.of(Flag.COPLANARITY)))) { + clusterAngle2D.fill(getClusterAngle(clusterPair[0]), ((360.0 + getClusterAngle(clusterPair[0]) - getClusterAngle(clusterPair[1])) % 360.0) - 180.0); + } + + triggerBits1D.fill(Flag.bitmask(bits));
- // If all cuts are pased, we have a trigger - if (outputStream != null) { - outputStream.println("Passed all cuts");
+ if (bits.containsAll(EnumSet.allOf(Flag.class))) { + // If all cuts are pased, we have a trigger + if (outputStream != null) { + outputStream.println("Passed all cuts"); + } + trigger = true;
}
- trigger = true;
+ } + if (trigger) { + triggerBits1D.fill(-1);
} return trigger; }
@@ -180,29 +238,27 @@
@Override public void endOfData() { if (outputStream != null) {
- outputStream.printf("Number of pairs: %d\n", allPairs); - outputStream.printf("Number of cluster pairs after successive trigger conditions:\n"); - outputStream.printf("Opposite quadrants: %d\n", oppositeQuadrantCount); - outputStream.printf("Cluster energy: %d\n", clusterEnergyCount); - outputStream.printf("Energy sum: %d\n", energySumCount); - outputStream.printf("Energy difference: %d\n", energyDifferenceCount); - outputStream.printf("Energy-distance cut: %d\n", energyDistanceCount); - outputStream.printf("Coplanarity: %d\n", coplanarityCount); - outputStream.printf("Trigger count: %d\n", numTriggers); - outputStream.close(); - } - System.out.printf("Number of pairs: %d\n", allPairs); - System.out.printf("Number of cluster pairs after successive trigger conditions:\n"); - System.out.printf("Opposite quadrants: %d\n", oppositeQuadrantCount); - System.out.printf("Cluster energy: %d\n", clusterEnergyCount); - System.out.printf("Energy sum: %d\n", energySumCount); - System.out.printf("Energy difference: %d\n", energyDifferenceCount); - System.out.printf("Energy-distance cut: %d\n", energyDistanceCount); - System.out.printf("Coplanarity: %d\n", coplanarityCount); - System.out.printf("Trigger count: %d\n", numTriggers);
+ printCounts(outputStream); + } + printCounts(new PrintWriter(System.out));
super.endOfData(); }
+ private void printCounts(PrintWriter writer) { + writer.printf("Number of pairs: %d\n", allPairs); + writer.printf("Number of cluster pairs after successive trigger conditions:\n"); + if (useQuadrants) { + writer.printf("Opposite quadrants: %d\n", oppositeQuadrantCount); + } + writer.printf("Cluster energy: %d\n", clusterEnergyCount); + writer.printf("Energy sum: %d\n", energySumCount); + writer.printf("Energy difference: %d\n", energyDifferenceCount); + writer.printf("Energy-distance cut: %d\n", energyDistanceCount); + writer.printf("Coplanarity: %d\n", coplanarityCount); + writer.printf("Trigger count: %d\n", numTriggers); + writer.close(); + } +
/** * Get a list of all unique cluster pairs in the event *
@@ -239,6 +295,36 @@
return !clusterPairs.isEmpty(); }
+ private boolean getClusterPairsTopBot(List<HPSEcalCluster> ecalClusters) { + // Create a list which will hold all neighboring cluster to the cluster + // of interest + List< HPSEcalCluster> topClusters = new ArrayList< HPSEcalCluster>(); + List< HPSEcalCluster> botClusters = new ArrayList< HPSEcalCluster>(); + for (HPSEcalCluster ecalCluster : ecalClusters) { + if (ecalCluster.getSeedHit().getIdentifierFieldValue("iy") > 0) { + topClusters.add(ecalCluster); + } else { + botClusters.add(ecalCluster); + } + } + // Clear the list of cluster pairs + clusterPairs.clear(); + + // Loop over all top-bottom pairs of clusters; higher-energy cluster goes first in the pair + for (HPSEcalCluster topCluster : topClusters) { + for (HPSEcalCluster botCluster : botClusters) { + if (topCluster.getEnergy() > botCluster.getEnergy()) { + HPSEcalCluster[] clusterPair = {topCluster, botCluster}; + clusterPairs.add(clusterPair); + } else { + HPSEcalCluster[] clusterPair = {botCluster, topCluster}; + clusterPairs.add(clusterPair); + } + } + } + return !clusterPairs.isEmpty(); + } +
/** * Checks if the ECal clusters making up a cluster pair lie in opposite * quadrants
Use REPLY-ALL to reply to list
To unsubscribe from the LCD-CVS list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCD-CVS&A=1