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); + } +}