Commit in hps-java/src/main/java/org/lcsim/hps on MAIN
analysis/ecal/HPSEcalTriggerPlotsDriver.java+142-921.5 -> 1.6
recon/ecal/HPSFADCTriggerDriver.java+30-151.19 -> 1.20
+172-107
2 modified files
final proposal version of trigger cuts

hps-java/src/main/java/org/lcsim/hps/analysis/ecal
HPSEcalTriggerPlotsDriver.java 1.5 -> 1.6
diff -u -r1.5 -r1.6
--- HPSEcalTriggerPlotsDriver.java	30 Jul 2012 23:31:45 -0000	1.5
+++ HPSEcalTriggerPlotsDriver.java	22 Dec 2012 00:54:15 -0000	1.6
@@ -9,10 +9,10 @@
 import org.lcsim.event.CalorimeterHit;
 import org.lcsim.event.EventHeader;
 import org.lcsim.geometry.IDDecoder;
+import org.lcsim.hps.recon.ecal.HPSECalUtils;
 import org.lcsim.hps.recon.ecal.HPSEcalCluster;
 import org.lcsim.hps.recon.ecal.HPSRawCalorimeterHit;
 import org.lcsim.hps.recon.ecal.HPSTriggerDriver;
-import org.lcsim.hps.util.ClockSingleton;
 import org.lcsim.util.Driver;
 import org.lcsim.util.aida.AIDA;
 
@@ -20,106 +20,156 @@
  * Diagnostic plots for HPS ECal.
  *
  * @author Sho Uemura <[log in to unmask]>
- * @version $Id: HPSEcalTriggerPlotsDriver.java,v 1.5 2012/07/30 23:31:45 meeg Exp $
+ * @version $Id: HPSEcalTriggerPlotsDriver.java,v 1.6 2012/12/22 00:54:15 meeg Exp $
  */
 public class HPSEcalTriggerPlotsDriver extends Driver {
 
-	String ecalCollectionName = "EcalHits";
-	String clusterCollectionName = "EcalClusters";
-	AIDA aida = AIDA.defaultInstance();
-	IHistogram2D hitXYPlot;
-	IHistogram2D clusterHitXYPlot;
-	IHistogram2D seedHitXYPlot;
-	IHistogram2D triggerClusterHitXYPlot;
-	IHistogram2D triggerSeedHitXYPlot;
-	IDDecoder dec = null;
-
-	public void setEcalCollectionName(String ecalCollectionName) {
-		this.ecalCollectionName = ecalCollectionName;
-	}
-
-	public void setClusterCollectionName(String clusterCollectionName) {
-		this.clusterCollectionName = clusterCollectionName;
-	}
-
-	@Override
-	public void startOfData() {
-		hitXYPlot = aida.histogram2D(
-				"Trigger plots: " + ecalCollectionName + " : Hits",
-				47, -23.5, 23.5, 11, -5.5, 5.5);
-		clusterHitXYPlot = aida.histogram2D(
-				"Trigger plots: " + clusterCollectionName + " : Crystals in clusters",
-				47, -23.5, 23.5, 11, -5.5, 5.5);
-		seedHitXYPlot = aida.histogram2D(
-				"Trigger plots: " + clusterCollectionName + " : Seed hits",
-				47, -23.5, 23.5, 11, -5.5, 5.5);
-		triggerClusterHitXYPlot = aida.histogram2D(
-				"Trigger plots: " + clusterCollectionName + " : Crystals in clusters, with trigger",
-				47, -23.5, 23.5, 11, -5.5, 5.5);
-		triggerSeedHitXYPlot = aida.histogram2D(
-				"Trigger plots: " + clusterCollectionName + " : Seed hits, with trigger",
-				47, -23.5, 23.5, 11, -5.5, 5.5);
-	}
-
-	@Override
-	public void process(EventHeader event) {
-		List<HPSEcalCluster> clusters = event.get(HPSEcalCluster.class, clusterCollectionName);
-		if (clusters == null) {
-			throw new RuntimeException("Missing cluster collection!");
-		}
-
-		List<CalorimeterHit> hits = event.get(CalorimeterHit.class, ecalCollectionName);
-		if (hits == null) {
-			throw new RuntimeException("Missing hit collection!");
-		}
-
-		// Get ID helper.
-		IIdentifierHelper helper =
-				event.getMetaData(hits).getIDDecoder().getSubdetector().getDetectorElement().getIdentifierHelper();
-
-		for (CalorimeterHit hit : hits) {
-			IIdentifier id = hit.getIdentifier();
-			int ix = helper.unpack(id).getValue(helper.getFieldIndex("ix"));
-			int iy = helper.unpack(id).getValue(helper.getFieldIndex("iy"));
-			hitXYPlot.fill(ix, iy);
-		}
-
-		for (HPSEcalCluster clus : clusters) {
-			HPSRawCalorimeterHit seedHit = (HPSRawCalorimeterHit) clus.getSeedHit();
-			IIdentifier id = seedHit.getIdentifier();
-			int ix = helper.unpack(id).getValue(helper.getFieldIndex("ix"));
-			int iy = helper.unpack(id).getValue(helper.getFieldIndex("iy"));
+    String ecalCollectionName = "EcalHits";
+    String clusterCollectionName = "EcalClusters";
+    AIDA aida = AIDA.defaultInstance();
+    IHistogram2D hitXYPlot;
+    IHistogram2D hitXYPlot100;
+    IHistogram2D hitXYPlot200;
+    IHistogram2D hitXYPlot500;
+    IHistogram2D hitXYPlot1000;
+    IHistogram2D crystalDeadTime;
+    IHistogram2D clusterHitXYPlot;
+    IHistogram2D seedHitXYPlot;
+    IHistogram2D triggerClusterHitXYPlot;
+    IHistogram2D triggerSeedHitXYPlot;
+    IDDecoder dec = null;
+    private int coincidenceWindow = 2;
+    private double tp = 14.0;
+    private double threshold = 50 * 10 * 0.15 * HPSECalUtils.MeV;
+
+    public void setEcalCollectionName(String ecalCollectionName) {
+        this.ecalCollectionName = ecalCollectionName;
+    }
+
+    public void setClusterCollectionName(String clusterCollectionName) {
+        this.clusterCollectionName = clusterCollectionName;
+    }
+
+    @Override
+    public void startOfData() {
+        hitXYPlot = aida.histogram2D(
+                "Trigger plots: " + ecalCollectionName + " : Hits",
+                46, -23, 23, 11, -5.5, 5.5);
+        hitXYPlot100 = aida.histogram2D(
+                "Trigger plots: " + ecalCollectionName + " : Hits above 100 MeV",
+                46, -23, 23, 11, -5.5, 5.5);
+        hitXYPlot200 = aida.histogram2D(
+                "Trigger plots: " + ecalCollectionName + " : Hits above 200 MeV",
+                46, -23, 23, 11, -5.5, 5.5);
+        hitXYPlot500 = aida.histogram2D(
+                "Trigger plots: " + ecalCollectionName + " : Hits above 500 MeV",
+                46, -23, 23, 11, -5.5, 5.5);
+        hitXYPlot1000 = aida.histogram2D(
+                "Trigger plots: " + ecalCollectionName + " : Hits above 1000 MeV",
+                46, -23, 23, 11, -5.5, 5.5);
+        crystalDeadTime = aida.histogram2D(
+                "Trigger plots: " + ecalCollectionName + " : Crystal dead time",
+                46, -23, 23, 11, -5.5, 5.5);
+        clusterHitXYPlot = aida.histogram2D(
+                "Trigger plots: " + clusterCollectionName + " : Crystals in clusters",
+                47, -23.5, 23.5, 11, -5.5, 5.5);
+        seedHitXYPlot = aida.histogram2D(
+                "Trigger plots: " + clusterCollectionName + " : Seed hits",
+                47, -23.5, 23.5, 11, -5.5, 5.5);
+        triggerClusterHitXYPlot = aida.histogram2D(
+                "Trigger plots: " + clusterCollectionName + " : Crystals in clusters, with trigger",
+                47, -23.5, 23.5, 11, -5.5, 5.5);
+        triggerSeedHitXYPlot = aida.histogram2D(
+                "Trigger plots: " + clusterCollectionName + " : Seed hits, with trigger",
+                47, -23.5, 23.5, 11, -5.5, 5.5);
+    }
+
+    @Override
+    public void process(EventHeader event) {
+        List<HPSEcalCluster> clusters = event.get(HPSEcalCluster.class, clusterCollectionName);
+        if (clusters == null) {
+            throw new RuntimeException("Missing cluster collection!");
+        }
+
+        List<CalorimeterHit> hits = event.get(CalorimeterHit.class, ecalCollectionName);
+        if (hits == null) {
+            throw new RuntimeException("Missing hit collection!");
+        }
+
+        // Get ID helper.
+        IIdentifierHelper helper =
+                event.getMetaData(hits).getIDDecoder().getSubdetector().getDetectorElement().getIdentifierHelper();
+
+        for (CalorimeterHit hit : hits) {
+            int ix = hit.getIdentifierFieldValue("ix");
+            int iy = hit.getIdentifierFieldValue("iy");
+            hitXYPlot.fill(ix-0.5*Math.signum(ix), iy, 1.0 / coincidenceWindow);
+            if (hit.getRawEnergy() > 100.0 * HPSECalUtils.MeV) {
+                hitXYPlot100.fill(ix-0.5*Math.signum(ix), iy, 1.0 / coincidenceWindow);
+                if (hit.getRawEnergy() > 200.0 * HPSECalUtils.MeV) {
+                    hitXYPlot200.fill(ix-0.5*Math.signum(ix), iy, 1.0 / coincidenceWindow);
+                    if (hit.getRawEnergy() > 500.0 * HPSECalUtils.MeV) {
+                        hitXYPlot500.fill(ix-0.5*Math.signum(ix), iy, 1.0 / coincidenceWindow);
+                        if (hit.getRawEnergy() > 1000.0 * HPSECalUtils.MeV) {
+                            hitXYPlot1000.fill(ix-0.5*Math.signum(ix), iy, 1.0 / coincidenceWindow);
+                        }
+                    }
+                }
+            }
+            double deadTime = 0;
+            for (int time = 0; time < 500; time++) {
+                if (hit.getRawEnergy() * pulseAmplitude(time) > threshold) {
+                    deadTime += 1e-6; //units of milliseconds
+                } else if (time > 2*tp || deadTime != 0) {
+                    break;
+                }
+            }
+            crystalDeadTime.fill(ix-0.5*Math.signum(ix), iy, deadTime / coincidenceWindow);
+        }
+
+        for (HPSEcalCluster clus : clusters) {
+            HPSRawCalorimeterHit seedHit = (HPSRawCalorimeterHit) clus.getSeedHit();
+            IIdentifier id = seedHit.getIdentifier();
+            int ix = helper.unpack(id).getValue(helper.getFieldIndex("ix"));
+            int iy = helper.unpack(id).getValue(helper.getFieldIndex("iy"));
 //                dec = seedHit.getIDDecoder();
 //                dec.setID(seedHit.getCellID());
-			seedHitXYPlot.fill(ix, iy);
-			for (CalorimeterHit hit : clus.getCalorimeterHits()) {
-				id = hit.getIdentifier();
-				ix = helper.unpack(id).getValue(helper.getFieldIndex("ix"));
-				iy = helper.unpack(id).getValue(helper.getFieldIndex("iy"));
+            seedHitXYPlot.fill(ix, iy);
+            for (CalorimeterHit hit : clus.getCalorimeterHits()) {
+                id = hit.getIdentifier();
+                ix = helper.unpack(id).getValue(helper.getFieldIndex("ix"));
+                iy = helper.unpack(id).getValue(helper.getFieldIndex("iy"));
 //                    dec = hit.getIDDecoder();
 //                    dec.setID(hit.getCellID());
-				clusterHitXYPlot.fill(ix, iy);
-			}
-		}
-
-		if (HPSTriggerDriver.triggerBit()) {
-			for (HPSEcalCluster clus : clusters) {
-				HPSRawCalorimeterHit seedHit = (HPSRawCalorimeterHit) clus.getSeedHit();
-				IIdentifier id = seedHit.getIdentifier();
-				int ix = helper.unpack(id).getValue(helper.getFieldIndex("ix"));
-				int iy = helper.unpack(id).getValue(helper.getFieldIndex("iy"));
+                clusterHitXYPlot.fill(ix, iy);
+            }
+        }
+
+        if (HPSTriggerDriver.triggerBit()) {
+            for (HPSEcalCluster clus : clusters) {
+                HPSRawCalorimeterHit seedHit = (HPSRawCalorimeterHit) clus.getSeedHit();
+                IIdentifier id = seedHit.getIdentifier();
+                int ix = helper.unpack(id).getValue(helper.getFieldIndex("ix"));
+                int iy = helper.unpack(id).getValue(helper.getFieldIndex("iy"));
 //                dec = seedHit.getIDDecoder();
 //                dec.setID(seedHit.getCellID());
-				triggerSeedHitXYPlot.fill(ix, iy);
-				for (CalorimeterHit hit : clus.getCalorimeterHits()) {
-					id = hit.getIdentifier();
-					ix = helper.unpack(id).getValue(helper.getFieldIndex("ix"));
-					iy = helper.unpack(id).getValue(helper.getFieldIndex("iy"));
+                triggerSeedHitXYPlot.fill(ix, iy);
+                for (CalorimeterHit hit : clus.getCalorimeterHits()) {
+                    id = hit.getIdentifier();
+                    ix = helper.unpack(id).getValue(helper.getFieldIndex("ix"));
+                    iy = helper.unpack(id).getValue(helper.getFieldIndex("iy"));
 //                    dec = hit.getIDDecoder();
 //                    dec.setID(hit.getCellID());
-					triggerClusterHitXYPlot.fill(ix, iy);
-				}
-			}
-		}
-	}
+                    triggerClusterHitXYPlot.fill(ix, iy);
+                }
+            }
+        }
+    }
+
+    private double pulseAmplitude(double time) {
+        if (time <= 0.0) {
+            return 0.0;
+        }
+        return (time / tp) * Math.exp(1.0 - time / tp);
+    }
 }

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSFADCTriggerDriver.java 1.19 -> 1.20
diff -u -r1.19 -r1.20
--- HPSFADCTriggerDriver.java	19 Dec 2012 19:12:23 -0000	1.19
+++ HPSFADCTriggerDriver.java	22 Dec 2012 00:54:16 -0000	1.20
@@ -21,7 +21,7 @@
  *
  * @author Omar Moreno <[log in to unmask]>
  * @author Sho Uemura <[log in to unmask]>
- * @version $Id: HPSFADCTriggerDriver.java,v 1.19 2012/12/19 19:12:23 meeg Exp $
+ * @version $Id: HPSFADCTriggerDriver.java,v 1.20 2012/12/22 00:54:16 meeg Exp $
  */
 public class HPSFADCTriggerDriver extends HPSTriggerDriver {
 
@@ -35,8 +35,10 @@
     private double energySumThreshold = 1.0;
     private double energyDifferenceThreshold = 1.5 / 2.2;
     private double maxCoplanarityAngle = 35; // degrees
-    private double energyDistanceDistance = 250; // mm
-    private double energyDistanceThreshold = 0.8 / 2.2;
+//    private double energyDistanceDistance = 250; // mm
+//    private double energyDistanceThreshold = 0.8 / 2.2;
+    private double energyDistanceDistance = 200; // mm
+    private double energyDistanceThreshold = 0.5;
     int allPairs;
     int oppositeQuadrantCount;
     int clusterEnergyCount;
@@ -45,8 +47,8 @@
     int energyDistanceCount;
     int coplanarityCount;
     AIDA aida = AIDA.defaultInstance();
-    IHistogram2D clusterEnergy2DAll, clusterSumDiff2DAll, energyDistance2DAll, clusterAngle2DAll;
-    IHistogram2D clusterEnergy2D, clusterSumDiff2D, energyDistance2D, clusterAngle2D;
+    IHistogram2D clusterEnergy2DAll, clusterSumDiff2DAll, energyDistance2DAll, clusterAngles2DAll, clusterCoplanarity2DAll;
+    IHistogram2D clusterEnergy2D, clusterSumDiff2D, energyDistance2D, clusterAngles2D, clusterCoplanarity2D;
     IHistogram1D triggerBits1D, triggerTimes1D;
     private boolean useQuadrants = false;
 
@@ -75,13 +77,22 @@
     public void setBeamEnergy(double beamEnergy) {
         if (beamEnergy == 1.1) {
             System.out.println(this.getClass().getSimpleName() + ": Setting trigger for 1.1 GeV beam");
-            energySumThreshold = 0.8 / 1.1;
+            maxCoplanarityAngle = 90;
+            clusterEnergyHigh = .7 / beamEnergy;
+            clusterEnergyLow = .1 / beamEnergy;
+            energySumThreshold = 0.8 / beamEnergy;
         } else if (beamEnergy == 2.2) {
             System.out.println(this.getClass().getSimpleName() + ": Setting trigger for 2.2 GeV beam");
-            energySumThreshold = 1.7 / 2.2;
+            maxCoplanarityAngle = 45;
+            clusterEnergyHigh = 1.6 / beamEnergy;
+            clusterEnergyLow = .1 / beamEnergy;
+            energySumThreshold = 1.7 / beamEnergy;
         } else if (beamEnergy == 6.6) {
             System.out.println(this.getClass().getSimpleName() + ": Setting trigger for 6.6 GeV beam");
-            energySumThreshold = 5.3 / 6.6;
+            maxCoplanarityAngle = 60;
+            clusterEnergyHigh = 5.0 / beamEnergy;
+            clusterEnergyLow = .1 / beamEnergy;
+            energySumThreshold = 5.5 / beamEnergy;
         }
         this.beamEnergy = beamEnergy * HPSECalUtils.GeV;
     }
@@ -99,12 +110,14 @@
         clusterSumDiff2DAll = aida.histogram2D("All cluster pairs: energy difference vs. sum", 100, 0.0, 2 * beamEnergy, 100, 0.0, beamEnergy);
         clusterEnergy2DAll = aida.histogram2D("All cluster pairs: energy (less energetic vs. more energetic)", 100, 0.0, 2 * beamEnergy, 100, 0.0, beamEnergy);
         energyDistance2DAll = aida.histogram2D("All cluster pairs: distance vs. energy (less energetic cluster)", 100, 0.0, 0.5 * beamEnergy, 25, 0.0, 400.0);
-        clusterAngle2DAll = aida.histogram2D("All cluster pairs: cluster angle uncoplanarity vs. less energetic cluster angle", 100, -180.0, 180.0, 100, -180.0, 180.0);
+        clusterCoplanarity2DAll = aida.histogram2D("All cluster pairs: cluster angle uncoplanarity vs. less energetic cluster angle", 100, -180.0, 180.0, 100, -180.0, 180.0);
+        clusterAngles2DAll = aida.histogram2D("All cluster pairs: cluster angle (less energetic vs. more energetic)", 100, -180.0, 180.0, 100, -180.0, 180.0);
 
         clusterSumDiff2D = aida.histogram2D("Passed other cuts: energy difference vs. sum", 100, 0.0, 2 * beamEnergy, 100, 0.0, beamEnergy);
         clusterEnergy2D = aida.histogram2D("Passed other cuts: energy (less energetic vs. more energetic)", 100, 0.0, 2 * beamEnergy, 100, 0.0, beamEnergy);
         energyDistance2D = aida.histogram2D("Passed other cuts: distance vs. energy (less energetic cluster)", 100, 0.0, 0.5 * beamEnergy, 25, 0.0, 400.0);
-        clusterAngle2D = aida.histogram2D("Passed other cuts: cluster angle uncoplanarity vs. less energetic cluster angle", 100, -180.0, 180.0, 100, -180.0, 180.0);
+        clusterCoplanarity2D = aida.histogram2D("Passed other cuts: cluster angle uncoplanarity vs. less energetic cluster angle", 100, -180.0, 180.0, 100, -180.0, 180.0);
+        clusterAngles2D = aida.histogram2D("Passed other cuts: cluster angle (less energetic vs. more energetic)", 100, -180.0, 180.0, 100, -180.0, 180.0);
 
         triggerBits1D = aida.histogram1D(detector.getDetectorName() + " : " + clusterCollectionName + " : trigger bits", 17, -1.5, 15.5);
         triggerTimes1D = aida.histogram1D(detector.getDetectorName() + " : " + clusterCollectionName + " : trigger times", 500, -0.5, 499.5);
@@ -224,7 +237,8 @@
             clusterSumDiff2DAll.fill(clusterPair[0].getEnergy() + clusterPair[1].getEnergy(), clusterPair[0].getEnergy() - clusterPair[1].getEnergy());
             clusterEnergy2DAll.fill(clusterPair[0].getEnergy(), clusterPair[1].getEnergy());
             energyDistance2DAll.fill(clusterPair[1].getEnergy(), getClusterDistance(clusterPair[1]));
-            clusterAngle2DAll.fill(getClusterAngle(clusterPair[1]), pairAcoplanarity(clusterPair));
+            clusterCoplanarity2DAll.fill(getClusterAngle(clusterPair[1]), pairUncoplanarity(clusterPair));
+            clusterAngles2DAll.fill(getClusterAngle(clusterPair[0]), getClusterAngle(clusterPair[1]));
 
             if (bits.containsAll(EnumSet.complementOf(EnumSet.of(Flag.ENERGY_SUM_DIFF, Flag.CLUSTER_ENERGY)))) { //cluster energy, energy-distance, coplanarity
                 clusterSumDiff2D.fill(clusterPair[0].getEnergy() + clusterPair[1].getEnergy(), clusterPair[0].getEnergy() - clusterPair[1].getEnergy());
@@ -234,7 +248,8 @@
                 energyDistance2D.fill(clusterPair[1].getEnergy(), getClusterDistance(clusterPair[1]));
             }
             if (bits.containsAll(EnumSet.complementOf(EnumSet.of(Flag.COPLANARITY)))) {
-                clusterAngle2D.fill(getClusterAngle(clusterPair[1]), pairAcoplanarity(clusterPair));
+                clusterCoplanarity2D.fill(getClusterAngle(clusterPair[1]), pairUncoplanarity(clusterPair));
+                clusterAngles2D.fill(getClusterAngle(clusterPair[0]), getClusterAngle(clusterPair[1]));
             }
 
             triggerBits1D.fill(Flag.bitmask(bits));
@@ -428,10 +443,10 @@
      * @return true if pair is found, false otherwise
      */
     private boolean coplanarityCut(HPSEcalCluster[] clusterPair) {
-        return (Math.abs(pairAcoplanarity(clusterPair)) < maxCoplanarityAngle);
+        return (Math.abs(pairUncoplanarity(clusterPair)) < maxCoplanarityAngle);
     }
 
-    private double pairAcoplanarity(HPSEcalCluster[] clusterPair) { // Find the angle between clusters in the pair
+    private double pairUncoplanarity(HPSEcalCluster[] clusterPair) { // Find the angle between clusters in the pair
         double cluster1Angle = (getClusterAngle(clusterPair[0]) + 180.0) % 180.0;
         double cluster2Angle = (getClusterAngle(clusterPair[1]) + 180.0) % 180.0;
 
@@ -440,7 +455,7 @@
 
     private double getClusterAngle(HPSEcalCluster cluster) { //returns angle in range of -180 to 180
         double position[] = cluster.getSeedHit().getPosition();
-        return Math.toDegrees(Math.atan2(position[0], position[1]));
+        return Math.toDegrees(Math.atan2(position[1], position[0]));
     }
 
     private double getClusterDistance(HPSEcalCluster cluster) {
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