00001 00002 #include "RecoEgamma/EgammaTools/interface/ECALPositionCalculator.h" 00003 00004 // Framework includes 00005 #include "FWCore/MessageLogger/interface/MessageLogger.h" 00006 #include "DataFormats/GeometryVector/interface/Pi.h" 00007 #include "DataFormats/GeometryVector/interface/GlobalPoint.h" 00008 #include "MagneticField/Engine/interface/MagneticField.h" 00009 00010 static const float R_ECAL = 136.5; 00011 static const float Z_Endcap = 328.0; 00012 static const float etaBarrelEndcap = 1.479; 00013 00014 double ECALPositionCalculator::ecalPhi(const MagneticField *magField,const math::XYZVector &momentum, const math::XYZPoint &vertex, int charge) 00015 { 00016 00017 // Get kinematic variables 00018 00019 float ptParticle = momentum.Rho(); 00020 float etaParticle = momentum.eta(); 00021 float phiParticle = momentum.phi(); 00022 float vRho = vertex.Rho(); 00023 00024 // Magnetic field 00025 00026 const float RBARM = 1.357 ; // was 1.31 , updated on 16122003 00027 const float ZENDM = 3.186 ; // was 3.15 , updated on 16122003 00028 00029 float rbend = RBARM-(vRho/100.0); //Assumed vRho in cm 00030 float bend = 0.3 * magField->inTesla(GlobalPoint(0.,0.,0.)).z() * rbend / 2.0; 00031 float phi = 0.0; 00032 00033 if( fabs(etaParticle) <= etaBarrelEndcap) 00034 { 00035 if (fabs(bend/ptParticle) <= 1.) 00036 { 00037 phi = phiParticle - asin(bend/ptParticle)*charge; 00038 if(phi > Geom::pi()) phi = phi - Geom::twoPi(); 00039 if(phi < -Geom::pi()) phi = phi + Geom::twoPi(); 00040 } else { 00041 edm::LogWarning("") << "[EcalPositionFromTrack::phiTransformation] Warning: " 00042 << "Too low Pt, giving up"; 00043 return phiParticle; 00044 } 00045 00046 } // end if in the barrel 00047 00048 if(fabs(etaParticle) > etaBarrelEndcap) 00049 { 00050 float rHit = 0.0; 00051 rHit = ZENDM / sinh(fabs(etaParticle)); 00052 if (fabs(((rHit-(vRho/100.0))/rbend)*bend/ptParticle) <= 1.0) 00053 { 00054 phi = phiParticle - asin(((rHit-(vRho/100.0)) / rbend)*bend/ptParticle)*charge; 00055 if(phi > Geom::pi()) phi = phi - Geom::twoPi(); 00056 if(phi < -Geom::pi()) phi = phi + Geom::twoPi(); 00057 } else { 00058 edm::LogWarning("") << "[EcalPositionFromTrack::phiTransformation] Warning: " 00059 << "Too low Pt, giving up"; 00060 return phiParticle; 00061 } 00062 00063 } // end if in the endcap 00064 00065 return phi; 00066 00067 } 00068 00069 double ECALPositionCalculator::ecalEta(const math::XYZVector &momentum, const math::XYZPoint &vertex) 00070 { 00071 00072 // Get kinematic variables 00073 00074 float etaParticle = momentum.eta(); 00075 float vZ = vertex.z(); 00076 float vRho = vertex.Rho(); 00077 00078 if (etaParticle != 0.0) 00079 { 00080 float theta = 0.0; 00081 float zEcal = (R_ECAL-vRho)*sinh(etaParticle)+vZ; 00082 00083 if(zEcal != 0.0) theta = atan(R_ECAL/zEcal); 00084 if(theta < 0.0) theta = theta + Geom::pi() ; 00085 00086 float ETA = - log(tan(0.5*theta)); 00087 00088 if( fabs(ETA) > etaBarrelEndcap ) 00089 { 00090 float Zend = Z_Endcap ; 00091 if(etaParticle < 0.0 ) Zend = - Zend; 00092 float Zlen = Zend - vZ ; 00093 float RR = Zlen/sinh(etaParticle); 00094 theta = atan((RR+vRho)/Zend); 00095 if(theta < 0.0) theta = theta+Geom::pi(); 00096 ETA = -log(tan(0.5*theta)); 00097 } 00098 return ETA; 00099 00100 } else { 00101 edm::LogWarning("") << "[EcalPositionFromTrack::etaTransformation] Warning: " 00102 << "Eta equals to zero, not correcting"; 00103 return etaParticle; 00104 } 00105 00106 } 00107