CMS 3D CMS Logo

GsfElectron.cc

Go to the documentation of this file.
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   // electron particle quantities
00025   //
00026 
00027   //Initialise to E from cluster + direction from track
00028 //   double scale = superCluster_->energy()/vtxMom.mag();    
00029 //   math::XYZTLorentzVectorD momentum= math::XYZTLorentzVector(vtxMom.x()*scale,
00030 //                           vtxMom.y()*scale,
00031 //                           vtxMom.z()*scale,
00032 //                        superCluster_->energy());
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   // supercluster - track at impact match parameters
00053   //
00054   superClusterEnergy_=superCluster_->energy();
00055   eSuperClusterOverP_=-1;
00056   //  if (innMom.R()!=0) eSuperClusterOverP_= superCluster_->energy()/innMom.R();
00057   if (innMom.mag()!=0) eSuperClusterOverP_= superCluster_->energy()/innMom.mag();
00058 //   float trackEta = ecalEta(
00059 //                                                track_->innerMomentum().eta(),
00060 //                                                   track_->innerPosition().z(),
00061 //                                                   track_->innerPosition().Rho());
00062 
00063 //   float trackPhi = ecalPhi(
00064 //                                                track_->innerMomentum().Rho(),
00065 //                                                   track_->innerMomentum().eta(),
00066 //                                                   track_->innerMomentum().phi(),
00067 //                                                track_->charge(),
00068 //                                                   track_->innerPosition().Rho());
00069 
00070 //   deltaEtaSuperClusterAtVtx_=superCluster_->position().eta() - trackEta;
00071 //   float dphi                =superCluster_->position().phi() - trackPhi;
00072 //   if (fabs(dphi)>pi)
00073 //       dphi = dphi < 0? pi2 + dphi : dphi - pi2;
00074 //   deltaPhiSuperClusterAtVtx_ = dphi;
00075 
00076   // 
00077   // seed cluster - track at calo match quantities
00078   //
00079 
00080   const BasicClusterRef seedClus = superCluster_->seed();
00081   eSeedClusterOverPout_ = -1;
00082   //  if (tsseed.globalMomentum().mag() > 0.)
00083   //    eSeedClusterOverPout_ = seedClus->energy()/tsseed.globalMomentum().mag();
00084   //  GlobalPoint tsseedPos=seedTsos.globalPosition();
00085   //  GlobalVector tsseedMom=seedTsos.globalMomentum();
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   // other quantities
00097   //
00098   energyScaleCorrected_=false;
00099   momentumFromEpCombination_=false;
00100   trackMomentumError_=0;
00101   
00102   //FIXME  hadOverEm_ = superCluster_->seed()->getHoe();
00103   //FIXME  hadOverEm_ *= seedClus->energy()/superCluster_->energy();
00104 
00105 }
00106 
00107 void GsfElectron::correctElectronEnergyScale(const float newEnergy) {
00108   
00109   //   float newEnergy = thecorr->getCorrectedEnergy();
00110  
00111   //momentum_*=newEnergy/momentum_.e();
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 //void GsfElectron::correctElectronFourMomentum(const PElectronMomentumCorrector *thecorr) {
00123 void GsfElectron::correctElectronFourMomentum(const math::XYZTLorentzVectorD & momentum,float & enErr, float & tmErr) {
00124  
00125   //   momentum_ = thecorr->getBestMomentum();
00126   setP4(momentum);
00127   //   energyError_ = thecorr->getSCEnergyError();
00128   energyError_ = enErr;
00129   //   trackMomentumError_ = thecorr->getTrackMomentumError();
00130   trackMomentumError_ = tmErr;
00131 
00132   momentumFromEpCombination_=true;
00133 }
00134  
00135 //void GsfElectron::classifyElectron(const PElectronClassification *theclassifier) {
00136 //   electronClass_ = theclassifier->getClass();
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 }

Generated on Tue Jun 9 17:30:43 2009 for CMSSW by  doxygen 1.5.4