00001 #include "RecoEgamma/EgammaElectronAlgos/interface/ElectronClassification.h" 00002 00003 #include "DataFormats/EgammaReco/interface/SuperCluster.h" 00004 00005 00006 #include "FWCore/MessageLogger/interface/MessageLogger.h" 00007 00008 //=================================================================== 00009 // Author: Federico Ferri - INFN Milano, Bicocca university 00010 // 12/2005 00011 // See GsfElectron::Classification 00012 //=================================================================== 00013 00014 using namespace reco; 00015 00016 void ElectronClassification::correct(GsfElectron &electron) { 00017 classify(electron); 00018 // electron.classifyElectron(this); 00019 electron.classifyElectron(electronClass_); 00020 } 00021 00022 void ElectronClassification::classify(const GsfElectron &electron) 00023 { 00024 electronClass_ = GsfElectron::UNKNOWN ; 00025 00026 00027 reco::SuperClusterRef sclRef=electron.superCluster(); 00028 00029 // use supercluster energy including f(Ncry) correction 00030 float scEnergy=sclRef->energy(); 00031 00032 // first look whether it's in crack, barrel or endcap 00033 if ((!electron.isEB())&&(!electron.isEE())) 00034 { 00035 edm::LogWarning("") << "ElectronClassification::init(): Undefined electron, eta = " << 00036 electron.eta() << "!!!!" ; 00037 return ; 00038 } 00039 00040 if (electron.isEBEEGap() || electron.isEBEtaGap() || electron.isEERingGap()) 00041 { 00042 electronClass_ = GsfElectron::GAP ; 00043 return ; 00044 } 00045 00046 float pin = electron.trackMomentumAtVtx().R() ; 00047 float fbrem = electron.fbrem() ; 00048 int nbrem = electron.numberOfBrems() ; 00049 00050 // golden 00051 if (nbrem == 0 && (pin - scEnergy)/pin < 0.1 && fbrem < 0.5) { 00052 electronClass_ = GsfElectron::GOLDEN ; 00053 } 00054 00055 // big brem 00056 else if (nbrem == 0 && (pin - scEnergy)/pin < 0.1 && fbrem > 0.5) { 00057 electronClass_ = GsfElectron::BIGBREM ; 00058 } 00059 00060 // showering 00061 else 00062 electronClass_ = GsfElectron::SHOWERING ; 00063 00064 } 00065 00066 /* 00067 bool ElectronClassification::isInCrack(float eta) const{ 00068 00069 return (eta>1.460 && eta<1.558); 00070 00071 } 00072 00073 bool ElectronClassification::isInEtaGaps(float eta) const{ 00074 00075 return (eta < 0.018 || 00076 (eta>0.423 && eta<0.461) || 00077 (eta>0.770 && eta<0.806) || 00078 (eta>1.127 && eta<1.163)); 00079 00080 } 00081 00082 bool ElectronClassification::isInPhiGaps(float phi) const{ 00083 00084 return false; 00085 00086 } 00087 */