Author: [log in to unmask]
Date: Wed Dec 2 14:12:22 2015
New Revision: 3999
Log:
energy correction can use track y at ecal
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 Wed Dec 2 14:12:22 2015
@@ -1,7 +1,14 @@
package org.hps.recon.ecal.cluster;
+import hep.physics.vec.Hep3Vector;
+
+import org.hps.detector.ecal.EcalCrystal;
+import org.hps.detector.ecal.HPSEcalDetectorElement;
+import org.jdom.DataConversionException;
+//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
@@ -13,61 +20,129 @@
* @author Jeremy McCormick <[log in to unmask]>
*/
public final class ClusterEnergyCorrection {
-
- // Variables for electron energy corrections.
- //Updated with recent monte carlo --7AUG15 HS.
- //Old values from 2014-2015 commented out to right.
- static final double ELECTRON_ENERGY_A = 0.01004;//-0.0027;
- static final double ELECTRON_ENERGY_B = -0.122;//-0.06;
- static final double ELECTRON_ENERGY_C = 0.9646;//0.95;
-
+
+ // Variables for electron energy corrections.
+ static final double par0_em = 0.009051;
+ static final double par1_em[] = {35,-0.1322,-0.0005613,16.42,0.3431,-2.021,74.85,-0.3626};
+ static final double par2_em[] = {35, 0.9652, 0.003234, 18.06, 0.2592, 8.586, 75.08, -0.3771};
+
// Variables for positron energy corrections.
- static final double POSITRON_ENERGY_A = 0.00711;//-0.0096;
- static final double POSITRON_ENERGY_B = -0.1154;//-0.042;
- static final double POSITRON_ENERGY_C = 0.9614;//0.94;
+ static final double par0_ep = 0.01307;
+ static final double par1_ep[] = {35,-0.1415,-0.0008183,17.88,0.2886,-1.192,73.12,-0.3747};
+ static final double par2_ep[] = {35, 0.9733, 0.003713, 18.19, 0.2557, 8.342, 72.44, -0.3834};
// Variables for photon energy corrections.
- static final double PHOTON_ENERGY_A = 0.007595;//0.0015;
- static final double PHOTON_ENERGY_B = -0.09766;//-0.047;
- static final double PHOTON_ENERGY_C = 0.9512;//0.94;
+ static final double par0_p = 0.01604;
+ static final double par1_p[] = {35,-0.1268,-0.0008572,16.76,0.2784,-0.07232,72.88,-0.1685};
+ static final double par2_p[] = {35, 0.965, 0.004, 18.05, 0.24, 3.027, 74.93, -0.3221};
/**
* Calculate the corrected energy for the cluster.
* @param cluster The input cluster.
* @return The corrected energy.
*/
- public static double calculateCorrectedEnergy(Cluster cluster) {
+ public static double calculateCorrectedEnergy(HPSEcal3 ecal, Cluster cluster) {
double rawE = cluster.getEnergy();
- return computeCorrectedEnergy(cluster.getParticleId(), rawE);
+ 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) {
+ double rawE = cluster.getEnergy();
+ return computeCorrectedEnergy(ecal, cluster.getParticleId(), rawE, cluster.getPosition()[0], ypos);
}
/**
* Calculate the corrected energy and set on the cluster.
* @param cluster The input cluster.
*/
- public static void setCorrectedEnergy(BaseCluster cluster) {
- double correctedEnergy = calculateCorrectedEnergy(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) {
+ 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)
* @return Corrected Energy
- */
- private static double computeCorrectedEnergy(int pdg, double rawEnergy) {
- switch(pdg) {
+ */
+
+ 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;
+ try {
+ BEAMGAPTOP = ecal.getNode().getChild("layout").getAttribute("beamgapTop").getDoubleValue();
+ } catch (DataConversionException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }//mm
+ double BEAMGAPBOT=-20.0;
+ try {
+ 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
+ // 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);}
+ }
+ // 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);}
+ }
+ }
+
+ switch(pdg) {
case 11:
// electron
- return computeCorrectedEnergy(rawEnergy, ELECTRON_ENERGY_A, ELECTRON_ENERGY_B, ELECTRON_ENERGY_C);
+ return computeCorrectedEnergy(r, rawEnergy, par0_em, par1_em, par2_em);
case -11:
// positron
- return computeCorrectedEnergy(rawEnergy, POSITRON_ENERGY_A, POSITRON_ENERGY_B, POSITRON_ENERGY_C);
+ return computeCorrectedEnergy(r, rawEnergy, par0_ep, par1_ep, par2_ep);
case 22:
// photon
- return computeCorrectedEnergy(rawEnergy, PHOTON_ENERGY_A, PHOTON_ENERGY_B, PHOTON_ENERGY_C);
+ return computeCorrectedEnergy(r, rawEnergy, par0_p, par1_p, par2_p);
default:
// unknown
return rawEnergy;
@@ -82,8 +157,10 @@
* @param A,B,C from fitting in note
* @return Corrected Energy
*/
- private static double computeCorrectedEnergy(double rawEnergy, double varA, double varB, double varC){
- double corrEnergy = rawEnergy / (varA / rawEnergy + varB / (Math.sqrt(rawEnergy)) + varC);
+ 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;
}
}
|