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