Print

Print


Author: [log in to unmask]
Date: Sat May 21 15:24:08 2016
New Revision: 4364

Log:
new driver would occur after EcalRawConverter and applies time walk and time shift ecal corrections

Added:
    java/sandbox/EcalTimeCorrectionDriver.java

Added: java/sandbox/EcalTimeCorrectionDriver.java
 =============================================================================
--- java/sandbox/EcalTimeCorrectionDriver.java	(added)
+++ java/sandbox/EcalTimeCorrectionDriver.java	Sat May 21 15:24:08 2016
@@ -0,0 +1,121 @@
+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;
+    }
+    
+    // Time walk default parameters for mode 3. Not studied since 2014 run.
+    // This is basically not used anymore.
+    private static final double[] DEFAULT_PARAMETERS = { 
+        3.64218e+01, 
+       -4.60756e+02, 
+        9.18743e+03,
+        3.73873e+01, 
+       -6.57130e+01,
+        1.07182e+02 
+    };
+    
+    private double[] parameters = DEFAULT_PARAMETERS;
+    
+    /*
+     * Time walk parameters for mode 1. 
+     * These parameters were dervied from data for both 2015 and 2016 running. 
+     */
+    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) { /* Removed check on fit quality as it is not available here currently. */
+                time = correctTimeWalkPulseFitting(time, energy);
+            }
+            
+            // Apply overall time offset
+            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);
+    }
+}