hps-java/src/main/java/org/lcsim/hps/recon/ecal
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