Author: jeremym
Date: Wed Mar 23 12:48:50 2016
New Revision: 4327
Log:
Example ECal time walk Driver (in sandbox for now).
Added:
java/sandbox/EcalTimeWalkDriver.java
Added: java/sandbox/EcalTimeWalkDriver.java
=============================================================================
--- java/sandbox/EcalTimeWalkDriver.java (added)
+++ java/sandbox/EcalTimeWalkDriver.java Wed Mar 23 12:48:50 2016
@@ -0,0 +1,114 @@
+package org.hps.recon.ecal;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hps.conditions.database.DatabaseConditionsManager;
+import org.hps.conditions.ecal.EcalTimeWalk;
+import org.hps.conditions.ecal.EcalTimeWalk.EcalTimeWalkCollection;
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.EventHeader;
+import org.lcsim.geometry.Detector;
+import org.lcsim.util.Driver;
+
+/**
+ * Perform time walk correction on ECal hits and create new collection of hits with
+ * corrected time.
+ *
+ * @author Jeremy McCormick, SLAC
+ */
+public class EcalTimeWalkDriver extends Driver {
+
+ private String inputHitsCollectionName = "EcalHits";
+ private String outputHitsCollectionName = "TimeCorrEcalHits";
+
+ private boolean mode7 = true;
+ private boolean useFit = true;
+ private boolean useTimeWalkCondition = true;
+
+ public void setMode7(boolean mode7) {
+ this.mode7 = mode7;
+ }
+
+ public void setUseFit(boolean useFit) {
+ this.useFit = useFit;
+ }
+
+ public void setUseTimeWalkCondition(boolean useTimeWalkCondition) {
+ this.useTimeWalkCondition = useTimeWalkCondition;
+ }
+
+ private static final double[] DEFAULT_PARAMETERS = {
+ 3.64218e+01,
+ -4.60756e+02,
+ 9.18743e+03,
+ 3.73873e+01,
+ -6.57130e+01,
+ 1.07182e+02 /* FIXME: This one is not used? --JM */
+ };
+
+ private double[] parameters = DEFAULT_PARAMETERS;
+
+ public void detectorChanged(Detector detector) {
+ if (useTimeWalkCondition) {
+ DatabaseConditionsManager manager = DatabaseConditionsManager.getInstance();
+ EcalTimeWalkCollection timeWalks =
+ manager.getCachedConditions(EcalTimeWalkCollection.class, "ecal_time_walk").getCachedData();
+ EcalTimeWalk timeWalk = timeWalks.get(0);
+ parameters = new double[6];
+ parameters[0] = timeWalk.getP0();
+ parameters[1] = timeWalk.getP1();
+ parameters[2] = timeWalk.getP2();
+ parameters[3] = timeWalk.getP3();
+ parameters[4] = timeWalk.getP4();
+ }
+ }
+
+ public void process(EventHeader event) {
+ List<CalorimeterHit> hits = event.get(CalorimeterHit.class, inputHitsCollectionName);
+ List<CalorimeterHit> newHits = new ArrayList<CalorimeterHit>();
+ for (CalorimeterHit hit : hits) {
+ double time = hit.getTime();
+ double energy = hit.getRawEnergy();
+ if (!mode7) {
+ time = correctTimeWalk(time, energy);
+ } else if (useFit && mode7) { /* Removed check on fit quality as it is not available here currently. */
+ time = correctTimeWalkPulseFitting(time, energy);
+ }
+
+ // This should happen here? --JM
+ // time -= findChannel(cellID).getTimeShift().getTimeShift();
+
+ newHits.add(CalorimeterHitUtilities.create(energy, time, hit.getCellID()));
+ }
+ event.put(this.outputHitsCollectionName, newHits, CalorimeterHit.class, event.getMetaData(hits).getFlags());
+ }
+
+ /**
+ * Perform time walk correction.
+ * @param time FADC Mode-3 Hit time (ns)
+ * @param energy Pulse energy (GeV)
+ * @return corrected time (ns)
+ */
+ private final double correctTimeWalk(double time, double energy) {
+ final double poly1 = parameters[0]
+ + parameters[1] * energy
+ + parameters[2] * energy * energy;
+ final double poly2 = parameters[3] * energy +
+ parameters[4] * energy * energy +
+ parameters[5] * Math.pow(energy, 4);
+ return time - poly1 * Math.exp(-poly2);
+ }
+
+ /**
+ * Perform time walk correction for mode 1 hits using pulse fitting.
+ * @param time FADC Mode 1 hit time from pulse fitting (ns)
+ * @param energy Pulse energy from pulse fitting (GeV)
+ * @return corrected time (ns)
+ */
+ private final double correctTimeWalkPulseFitting(double time, double energy) {
+ final double polyA = parameters[0] + parameters[1] * energy;
+ final double polyB = parameters[2] + parameters[3] * energy + parameters[4] * Math.pow(energy, 2);
+ return time - (Math.exp(polyA) + polyB);
+ }
+}
|