Print

Print


Commit in hps-java/src/main/java/org/lcsim/hps/recon/ecal on MAIN
HPSFADCTriggerDriver.java+151-651.14 -> 1.15
EnumSet is pretty nifty but it doesn't make this code any prettier

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSFADCTriggerDriver.java 1.14 -> 1.15
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
CVSspam 0.2.12


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