00001 #include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
00002 #include "DataFormats/GsfTrackReco/interface/GsfTrack.h"
00003 #include "DataFormats/EgammaReco/interface/BasicCluster.h"
00004 #include "DataFormats/EgammaReco/interface/BasicClusterFwd.h"
00005
00006 #include <cmath>
00007
00008 const double pi = M_PI, pi2 = 2 * M_PI;
00009
00010 using namespace reco;
00011
00012 GsfElectron::GsfElectron(const LorentzVector & p4,
00013 const SuperClusterRef scl,
00014 const GsfTrackRef gsft,
00015 const GlobalPoint tssuperPos, const GlobalVector tssuperMom,
00016 const GlobalPoint tsseedPos, const GlobalVector tsseedMom,
00017 const GlobalPoint innPos, const GlobalVector innMom,
00018 const GlobalPoint vtxPos, const GlobalVector vtxMom,
00019 const GlobalPoint outPos, const GlobalVector outMom,
00020 const double HoE) :
00021 hadOverEm_(HoE), superCluster_(scl), track_(gsft)
00022 {
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 setCharge(track_->charge());
00034 setP4(p4);
00035 setVertex(Point(vtxPos));
00036 setPdgId( -11 * charge());
00037
00038 trackPositionAtVtx_=math::XYZVector(vtxPos.x(),vtxPos.y(),vtxPos.z());
00039 trackPositionAtCalo_=math::XYZVector(tssuperPos.x(),
00040 tssuperPos.y(),
00041 tssuperPos.z());
00042 trackMomentumAtCalo_=math::XYZVector(tssuperMom.x(),
00043 tssuperMom.y(),
00044 tssuperMom.z());
00045 trackMomentumAtVtx_=math::XYZVector(vtxMom.x(),
00046 vtxMom.y(),
00047 vtxMom.z());
00048 trackMomentumOut_=math::XYZVector(tsseedMom.x(),
00049 tsseedMom.y(),
00050 tsseedMom.z());
00051
00052
00053
00054 superClusterEnergy_=superCluster_->energy();
00055 eSuperClusterOverP_=-1;
00056
00057 if (innMom.mag()!=0) eSuperClusterOverP_= superCluster_->energy()/innMom.mag();
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080 const BasicClusterRef seedClus = superCluster_->seed();
00081 eSeedClusterOverPout_ = -1;
00082
00083
00084
00085
00086 if (tsseedMom.mag() > 0.)
00087 eSeedClusterOverPout_ = seedClus->energy()/tsseedMom.mag();
00088
00089 deltaEtaSeedClusterAtCalo_ = seedClus->eta() - tsseedPos.eta();
00090 float dphi = seedClus->phi() - tsseedPos.phi();
00091 if (fabs(dphi)>pi)
00092 dphi = dphi < 0? pi2 + dphi : dphi - pi2;
00093 deltaPhiSeedClusterAtCalo_ = dphi;
00094
00095
00096
00097
00098 energyScaleCorrected_=false;
00099 momentumFromEpCombination_=false;
00100 trackMomentumError_=0;
00101
00102
00103
00104
00105 }
00106
00107 void GsfElectron::correctElectronEnergyScale(const float newEnergy) {
00108
00109
00110
00111
00112 math::XYZTLorentzVectorD momentum=p4();
00113 momentum*=newEnergy/momentum.e();
00114 setP4(momentum);
00115 hadOverEm_ *=superClusterEnergy_/newEnergy;
00116 eSuperClusterOverP_*=newEnergy/superClusterEnergy_;
00117 superClusterEnergy_=newEnergy;
00118
00119 energyScaleCorrected_=true;
00120 }
00121
00122
00123 void GsfElectron::correctElectronFourMomentum(const math::XYZTLorentzVectorD & momentum,float & enErr, float & tmErr) {
00124
00125
00126 setP4(momentum);
00127
00128 energyError_ = enErr;
00129
00130 trackMomentumError_ = tmErr;
00131
00132 momentumFromEpCombination_=true;
00133 }
00134
00135
00136
00137 void GsfElectron::classifyElectron(const int myclass)
00138 {
00139 electronClass_ = myclass;
00140 }
00141
00142 bool GsfElectron::overlap( const Candidate & c ) const {
00143 const RecoCandidate * o = dynamic_cast<const RecoCandidate *>( & c );
00144 return ( o != 0 &&
00145 ( checkOverlap( gsfTrack(), o->gsfTrack() ) ||
00146 checkOverlap( superCluster(), o->superCluster() ) )
00147 );
00148 return false;
00149 }
00150
00151 GsfElectron * GsfElectron::clone() const {
00152 return new GsfElectron( * this );
00153 }
00154
00155 bool GsfElectron::isElectron() const {
00156 return true;
00157 }