Print

Print


Author: [log in to unmask]
Date: Mon Mar 21 09:12:32 2016
New Revision: 4310

Log:
moves track position at ecal if outside ecal to eliminate negative cluster energies

Modified:
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterEnergyCorrection.java

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterEnergyCorrection.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterEnergyCorrection.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterEnergyCorrection.java	Mon Mar 21 09:12:32 2016
@@ -5,161 +5,204 @@
 import org.hps.detector.ecal.EcalCrystal;
 import org.hps.detector.ecal.HPSEcalDetectorElement;
 import org.jdom.DataConversionException;
-//import org.hps.recon.tracking.TrackUtils;
+// import org.hps.recon.tracking.TrackUtils;
 import org.lcsim.event.Cluster;
 import org.lcsim.event.base.BaseCluster;
 import org.lcsim.geometry.subdetector.HPSEcal3;
 
 /**
- * This is the cluster energy correction requiring the particle id 
- * uncorrected cluster energy. This is now updated to include edge 
- * corrections and sampling fractions derived from data. 
+ * This is the cluster energy correction requiring the particle id uncorrected
+ * cluster energy. This is now updated to include edge corrections and sampling
+ * fractions derived from data.
  * 
  * @author Holly Vance <[log in to unmask]>
  * @author Jeremy McCormick <[log in to unmask]>
  */
 public final class ClusterEnergyCorrection {
-    
+
     // Variables for electron energy corrections.
     static final double par0_em = -0.017;
-    static final double par1_em[] = {35,-0.06738,-0.0005613,16.42,0.3431,-2.021,74.85,-0.3626};
-    static final double par2_em[] = {35, 0.933, 0.003234, 18.06, 0.24, 8.586, 75.08, -0.39};
+    static final double par1_em[] = { 35, -0.06738, -0.0005613, 16.42, 0.3431,
+            -2.021, 74.85, -0.3626 };
+    static final double par2_em[] = { 35, 0.933, 0.003234, 18.06, 0.24, 8.586,
+            75.08, -0.39 };
 
     // Variables for positron energy corrections.
     static final double par0_ep = -0.0131;
-    static final double par1_ep[] = {35,-0.076,-0.0008183,17.88,0.2886,-1.192,73.12,-0.3747};
-    static final double par2_ep[] = {35, 0.94, 0.003713, 18.19, 0.24, 8.342, 72.44, -0.39};
-    
+    static final double par1_ep[] = { 35, -0.076, -0.0008183, 17.88, 0.2886,
+            -1.192, 73.12, -0.3747 };
+    static final double par2_ep[] = { 35, 0.94, 0.003713, 18.19, 0.24, 8.342,
+            72.44, -0.39 };
+
     // Variables for photon energy corrections.
     static final double par0_p = -0.0113;
-    static final double par1_p[] = {35,-0.0585,-0.0008572,16.76,0.2784,-0.07232,72.88,-0.1685};
-    static final double par2_p[] = {35, 0.9307, 0.004, 18.05, 0.23, 3.027, 74.93, -0.34};
-          
+    static final double par1_p[] = { 35, -0.0585, -0.0008572, 16.76, 0.2784,
+            -0.07232, 72.88, -0.1685 };
+    static final double par2_p[] = { 35, 0.9307, 0.004, 18.05, 0.23, 3.027,
+            74.93, -0.34 };
+
     /**
      * Calculate the corrected energy for the cluster.
-     * @param cluster The input cluster.
+     * 
+     * @param cluster
+     *            The input cluster.
      * @return The corrected energy.
      */
     public static double calculateCorrectedEnergy(HPSEcal3 ecal, Cluster cluster) {
         double rawE = cluster.getEnergy();
-        return computeCorrectedEnergy(ecal, cluster.getParticleId(), rawE, cluster.getPosition()[0], cluster.getPosition()[1]);
-    }
-    
-    /**
-     * Calculate the corrected energy for the cluster using track position at ecal.
-     * @param cluster The input cluster.
+        return computeCorrectedEnergy(ecal, cluster.getParticleId(), rawE,
+                cluster.getPosition()[0], cluster.getPosition()[1]);
+    }
+
+    /**
+     * Calculate the corrected energy for the cluster using track position at
+     * ecal.
+     * 
+     * @param cluster
+     *            The input cluster.
      * @return The corrected energy.
      */
-    public static double calculateCorrectedEnergy(HPSEcal3 ecal, Cluster cluster, double ypos) {
+    public static double calculateCorrectedEnergy(HPSEcal3 ecal,
+            Cluster cluster, double ypos) {
         double rawE = cluster.getEnergy();
-        return computeCorrectedEnergy(ecal, cluster.getParticleId(), rawE, cluster.getPosition()[0], ypos);
-    }
-    
+        return computeCorrectedEnergy(ecal, cluster.getParticleId(), rawE,
+                cluster.getPosition()[0], ypos);
+    }
+
     /**
      * Calculate the corrected energy and set on the cluster.
-     * @param cluster The input cluster.
+     * 
+     * @param cluster
+     *            The input cluster.
      */
     public static void setCorrectedEnergy(HPSEcal3 ecal, BaseCluster cluster) {
         double correctedEnergy = calculateCorrectedEnergy(ecal, cluster);
         cluster.setEnergy(correctedEnergy);
     }
-    
+
     /**
      * Calculate the corrected energy and set on the cluster.
-     * @param cluster The input cluster.
-     */
-    
-    public static void setCorrectedEnergy(HPSEcal3 ecal, BaseCluster cluster, double ypos) {
+     * 
+     * @param cluster
+     *            The input cluster.
+     */
+
+    public static void setCorrectedEnergy(HPSEcal3 ecal, BaseCluster cluster,
+            double ypos) {
         double correctedEnergy = calculateCorrectedEnergy(ecal, cluster, ypos);
         cluster.setEnergy(correctedEnergy);
     }
-                           
-    /**
-     * Calculates energy correction based on cluster raw energy and particle type as per 
-     * <a href="https://misportal.jlab.org/mis/physics/hps_notes/index.cfm?note_year=2014">HPS Note 2014-001</a>
-     * @param pdg Particle id as per PDG
-     * @param rawEnergy Raw Energy of the cluster (sum of hits with shared hit distribution)
+
+    /**
+     * Calculates energy correction based on cluster raw energy and particle
+     * type as per <a href=
+     * "https://misportal.jlab.org/mis/physics/hps_notes/index.cfm?note_year=2014"
+     * >HPS Note 2014-001</a>
+     * 
+     * @param pdg
+     *            Particle id as per PDG
+     * @param rawEnergy
+     *            Raw Energy of the cluster (sum of hits with shared hit
+     *            distribution)
      * @return Corrected Energy
-     */  
-    
-    private static double computeCorrectedEnergy(HPSEcal3 ecal, int pdg, double rawEnergy, double xpos, double ypos) {
-        //distance to beam gap edge
+     */
+
+    private static double computeCorrectedEnergy(HPSEcal3 ecal, int pdg,
+            double rawEnergy, double xpos, double ypos) {
+        // distance to beam gap edge
         double r;
-        //Get these values from the Ecal geometry:
-        HPSEcalDetectorElement detElement = (HPSEcalDetectorElement) ecal.getDetectorElement();
-//        double BEAMGAPTOP = 22.3;//ecal.getNode().getChild("layout").getAttribute("beamgapTop").getDoubleValue();//mm
-        double BEAMGAPTOP=20.0;
+        // Get these values from the Ecal geometry:
+        HPSEcalDetectorElement detElement = (HPSEcalDetectorElement) ecal
+                .getDetectorElement();
+        // double BEAMGAPTOP =
+        // 22.3;//ecal.getNode().getChild("layout").getAttribute("beamgapTop").getDoubleValue();//mm
+        double BEAMGAPTOP = 20.0;
         try {
-            BEAMGAPTOP = ecal.getNode().getChild("layout").getAttribute("beamgapTop").getDoubleValue();
+            BEAMGAPTOP = ecal.getNode().getChild("layout")
+                    .getAttribute("beamgapTop").getDoubleValue();
         } catch (DataConversionException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
-        }//mm
-        double BEAMGAPBOT=-20.0;
+        }// mm
+        double BEAMGAPBOT = -20.0;
         try {
-            BEAMGAPBOT = -ecal.getNode().getChild("layout").getAttribute("beamgapBottom").getDoubleValue();
+            BEAMGAPBOT = -ecal.getNode().getChild("layout")
+                    .getAttribute("beamgapBottom").getDoubleValue();
         } catch (DataConversionException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
-        }//mm
-        double BEAMGAPTOPC = BEAMGAPTOP + 13.0;//mm
-        double BEAMGAPBOTC = BEAMGAPBOT - 13.0;//mm
+        }// mm
+        double BEAMGAPTOPC = BEAMGAPTOP + 13.0;// mm
+        double BEAMGAPBOTC = BEAMGAPBOT - 13.0;// mm
         // x-coordinates of crystals on either side of row 1 cut out
         EcalCrystal crystalM = detElement.getCrystal(-11, 1);
         Hep3Vector posM = crystalM.getPositionFront();
         EcalCrystal crystalP = detElement.getCrystal(-1, 1);
         Hep3Vector posP = crystalP.getPositionFront();
-               
-        if ((xpos<posM.x())||(xpos>posP.x())){
-            if (ypos>0){
-                r = Math.abs(ypos-BEAMGAPTOP);}         
-            else{
-                r = Math.abs(ypos-BEAMGAPBOT);}
+
+        if ((xpos < posM.x()) || (xpos > posP.x())) {
+            if (ypos > 0) {
+                r = Math.abs(ypos - BEAMGAPTOP);
+            } else {
+                r = Math.abs(ypos - BEAMGAPBOT);
+            }
         }
         // crystals above row 1 cut out
         else {
-            if (ypos>0){
-                if (ypos>(par1_em[0]+BEAMGAPTOP)){
-                    r = Math.abs(ypos-BEAMGAPTOP);}
-                else{
-                    r = Math.abs(ypos-BEAMGAPTOPC);}
-            }
-            else {
-                if (ypos>(-par1_em[0]+BEAMGAPBOT)){
-                    r = Math.abs(ypos-BEAMGAPBOTC);}
-                else {
-                    r = Math.abs(ypos-BEAMGAPBOT);}
+            if (ypos > 0) {
+                if (ypos > (par1_em[0] + BEAMGAPTOP)) {
+                    r = Math.abs(ypos - BEAMGAPTOP);
+                } else {
+                    r = Math.abs(ypos - BEAMGAPTOPC);
+                }
+            } else {
+                if (ypos > (-par1_em[0] + BEAMGAPBOT)) {
+                    r = Math.abs(ypos - BEAMGAPBOTC);
+                } else {
+                    r = Math.abs(ypos - BEAMGAPBOT);
+                }
             }
         }
-            
-        switch(pdg) {
-            case 11: 
-                // electron             
-                return computeCorrectedEnergy(r, rawEnergy, par0_em, par1_em, par2_em);
-            case -11: 
-                // positron
-                return computeCorrectedEnergy(r, rawEnergy, par0_ep, par1_ep, par2_ep);
-            case 22: 
-                // photon
-                return computeCorrectedEnergy(r, rawEnergy, par0_p, par1_p, par2_p);
-            default: 
-                // unknown 
-                return rawEnergy;
+        
+        //Eliminates corrections at outermost edges to negative cluster energies
+        //66 for positrons, 69 is safe for electrons and photons
+        if (r > 66) {r = 66;}
+                
+        switch (pdg) {
+        case 11:
+            // electron
+            return computeCorrectedEnergy(r, rawEnergy, par0_em, par1_em,
+                    par2_em);
+        case -11:
+            // positron
+            return computeCorrectedEnergy(r, rawEnergy, par0_ep, par1_ep,
+                    par2_ep);
+        case 22:
+            // photon
+            return computeCorrectedEnergy(r, rawEnergy, par0_p, par1_p, par2_p);
+        default:
+            // unknown
+            return rawEnergy;
         }
     }
-    
-    /**
-     * Calculates the energy correction to a cluster given the variables from the fit as per
-     * <a href="https://misportal.jlab.org/mis/physics/hps_notes/index.cfm?note_year=2014">HPS Note 2014-001</a>
-     * Note that this is correct as there is a typo in the formula print in the note. 
-     * @param rawEnergy Raw energy of the cluster
+
+    /**
+     * Calculates the energy correction to a cluster given the variables from
+     * the fit as per <a href=
+     * "https://misportal.jlab.org/mis/physics/hps_notes/index.cfm?note_year=2014"
+     * >HPS Note 2014-001</a> Note that this is correct as there is a typo in
+     * the formula print in the note.
+     * 
+     * @param rawEnergy
+     *            Raw energy of the cluster
      * @param A,B,C from fitting in note
      * @return Corrected Energy
-     */   
-    private static double computeCorrectedEnergy(double y, double rawEnergy, double varA, double varB[], double varC[]){
-        int ii = y<varB[0] ? 2 : 5;
-        double corrEnergy = rawEnergy / (varA / rawEnergy + (varB[1]-varB[ii]*Math.exp(-(y-varB[ii+1])*varB[ii+2])) / (Math.sqrt(rawEnergy)) + 
-                (varC[1]-varC[ii]*Math.exp(-(y-varC[ii+1])*varC[ii+2])));
+     */
+    private static double computeCorrectedEnergy(double y, double rawEnergy,
+            double varA, double varB[], double varC[]) {
+        int ii = y < varB[0] ? 2 : 5;
+        double corrEnergy = rawEnergy/ (varA / rawEnergy+ (varB[1] - varB[ii]* Math.exp(-(y - varB[ii + 1]) * varB[ii + 2]))/ (Math.sqrt(rawEnergy)) + 
+                (varC[1] - varC[ii]* Math.exp(-(y - varC[ii + 1]) * varC[ii + 2])));
         return corrEnergy;
-    }                   
+    }
 }