Go to the documentation of this file.00001 #include "DataFormats/ParticleFlowCandidate/interface/PFCandidateElectronExtra.h"
00002 #include "DataFormats/GsfTrackReco/interface/GsfTrack.h"
00003 #include <ostream>
00004 #include <iomanip>
00005
00006 using namespace reco;
00007
00008 PFCandidateElectronExtra::PFCandidateElectronExtra() {
00009 status_ = 0;
00010 mvaStatus_ = 0;
00011 pout_ = math::XYZTLorentzVector(0.,0.,0.,0.);
00012 hadEnergy_ = -9999. ;
00013 sigmaEtaEta_ = -9999.;
00014
00015 for(MvaVariable m=MVA_FIRST; m<MVA_LAST; m=MvaVariable(m+1))
00016 mvaVariables_.push_back(-9999.);
00017
00018 gsfTrackRef_ = GsfTrackRef();
00019 kfTrackRef_ = TrackRef();
00020 }
00021
00022 PFCandidateElectronExtra::PFCandidateElectronExtra(const reco::GsfTrackRef& gsfTrack) {
00023 status_ = 0;
00024 mvaStatus_ = 0;
00025 pout_ = math::XYZTLorentzVector(0.,0.,0.,0.);
00026 hadEnergy_ = -9999. ;
00027 sigmaEtaEta_ = -9999.;
00028
00029 for(MvaVariable m=MVA_FIRST; m<MVA_LAST; m=MvaVariable(m+1))
00030 mvaVariables_.push_back(-9999.);
00031
00032 gsfTrackRef_ = gsfTrack;
00033 kfTrackRef_ = TrackRef();
00034
00035 setVariable(MVA_LnPtGsf,log(gsfTrackRef_->ptMode()));
00036 setVariable(MVA_EtaGsf,gsfTrackRef_->etaMode());
00037 setVariable(MVA_Chi2Gsf,gsfTrackRef_->normalizedChi2());
00038 float ptmodeerror=gsfTrackRef_->ptModeError() ;
00039 if(ptmodeerror>0.)
00040 setVariable(MVA_SigmaPtOverPt,ptmodeerror/gsfTrackRef_->ptMode());
00041 else
00042 setVariable(MVA_SigmaPtOverPt,-999.);
00043
00044 setVariable(MVA_Fbrem,(gsfTrackRef_->ptMode() - pout_.pt())/gsfTrackRef_->ptMode());
00045 }
00046
00047 void PFCandidateElectronExtra::setGsfTrackRef(const reco::GsfTrackRef& ref) {
00048 gsfTrackRef_= ref;
00049 }
00050
00051 void PFCandidateElectronExtra::setGsfTrackPout(const math::XYZTLorentzVector& pout) {
00052 pout_ = pout;
00053
00054 }
00055
00056 void PFCandidateElectronExtra::setKfTrackRef(const reco::TrackRef & ref){
00057 kfTrackRef_ = ref;
00058 float nhit_kf=0;
00059 float chi2_kf=-0.01;
00060
00061 if(kfTrackRef_.isNonnull()) {
00062 nhit_kf=(float)kfTrackRef_->hitPattern().trackerLayersWithMeasurement();
00063 chi2_kf=kfTrackRef_->normalizedChi2();
00064 }
00065 setVariable(MVA_NhitsKf,nhit_kf);
00066 setVariable(MVA_Chi2Kf,chi2_kf);
00067 }
00068
00069 void PFCandidateElectronExtra::setLateBrem(float val) {
00070 lateBrem_ = val;
00071 setVariable(MVA_LateBrem,val);
00072 }
00073
00074 void PFCandidateElectronExtra::setEarlyBrem(float val) {
00075 earlyBrem_ = val;
00076 setVariable(MVA_FirstBrem,val);
00077 }
00078
00079 void PFCandidateElectronExtra::setHadEnergy(float val) {
00080 hadEnergy_ = val;
00081 if(clusterEnergies_.size()>0)
00082 setVariable(MVA_HOverHE,hadEnergy_/(hadEnergy_+clusterEnergies_[0]));
00083 }
00084
00085 void PFCandidateElectronExtra::setSigmaEtaEta(float val) {
00086 sigmaEtaEta_ = val;
00087 setVariable(MVA_LogSigmaEtaEta,val);
00088 }
00089
00090 void PFCandidateElectronExtra::setDeltaEta(float val) {
00091 deltaEta_ = val;
00092 setVariable(MVA_DeltaEtaTrackCluster,val);
00093 }
00094
00095
00096 void PFCandidateElectronExtra::setClusterEnergies(const std::vector<float>& energies){
00097 clusterEnergies_=energies;
00098
00099 if(pout_.t()!=0.)
00100 setVariable(MVA_EseedOverPout,clusterEnergies_[0]/pout_.t());
00101
00102 static float m_el2=0.00051*0.00051;
00103 float Ein_gsf =sqrt(gsfTrackRef_->pMode()*
00104 gsfTrackRef_->pMode()+m_el2);
00105
00106 float etot=0;
00107 unsigned size=clusterEnergies_.size();
00108
00109 float ebrem=0.;
00110 for(unsigned ic=0;ic<size;++ic) {
00111 etot+=clusterEnergies_[ic];
00112 if(ic>0)
00113 ebrem+=clusterEnergies_[ic];
00114 }
00115 setVariable(MVA_EtotOverPin,etot/Ein_gsf);
00116 setVariable(MVA_EbremOverDeltaP,ebrem/(Ein_gsf-pout_.t()));
00117
00118
00119 if(hadEnergy_!=-9999.)
00120 setHadEnergy(hadEnergy_);
00121
00122 }
00123
00124 void PFCandidateElectronExtra::setMVA(float val) {
00125 setVariable(MVA_MVA,val);
00126 }
00127
00128 void PFCandidateElectronExtra::setVariable(MvaVariable type,float val) {
00129
00130 mvaVariables_[type]=val;
00131 mvaStatus_ |= (1 << (type)) ;
00132 }
00133
00134
00135 void PFCandidateElectronExtra::setStatus(StatusFlag type,bool status){
00136 if(status) {
00137 status_ |= (1 << type);
00138 }
00139 else {
00140 status_ &= ~(1 <<type);
00141 }
00142 }
00143
00144 bool PFCandidateElectronExtra::electronStatus(StatusFlag flag) const {
00145 return status_ & (1<<flag) ;
00146 }
00147
00148 bool PFCandidateElectronExtra::mvaStatus(MvaVariable flag) const {
00149 return mvaStatus_ & (1<< (flag)) ;
00150 }
00151
00152 float PFCandidateElectronExtra::mvaVariable(MvaVariable var) const {
00153 return (mvaStatus(var) ? mvaVariables_[var] : -9999. );
00154 }
00155
00156 #include <string>
00157
00158 std::ostream& reco::operator<<(std::ostream& out,
00159 const PFCandidateElectronExtra& extra ) {
00160 if(!out) return out;
00161
00162 static std::vector<std::string> listVar;
00163 if(listVar.size()==0) {
00164 listVar.push_back("LogPt");
00165 listVar.push_back("Eta");
00166 listVar.push_back("SigmaPtOverPt");
00167 listVar.push_back("fbrem");
00168 listVar.push_back("Chi2Gsf");
00169 listVar.push_back("NhitsKf");
00170 listVar.push_back("Chi2Kf");
00171 listVar.push_back("EtotOverPin");
00172 listVar.push_back("EseedOverPout");
00173 listVar.push_back("EbremOverDeltaP");
00174 listVar.push_back("DeltaEtaTrackCluster");
00175 listVar.push_back("LogSigmaEtaEta");
00176 listVar.push_back("H/(H+E)");
00177 listVar.push_back("LateBrem");
00178 listVar.push_back("FirstBrem");
00179 listVar.push_back("MVA");
00180 }
00181 out << std::setiosflags(std::ios::left)<< std::setw(20) << "Variable index" << std::setw(20) << "Name" << std::setw(10) << "Set(0/1)" << std::setw(8) << "value" << std::endl;
00182 for( PFCandidateElectronExtra::MvaVariable i=PFCandidateElectronExtra::MVA_FIRST;
00183 i<PFCandidateElectronExtra::MVA_LAST;i=PFCandidateElectronExtra::MvaVariable(i+1)) {
00184 out << std::setw(20)<< i << std::setw(20) << listVar[i] << std::setw(10) << extra.mvaStatus(i) << std::setw(8) << extra.mvaVariable(i) << std::endl;
00185 }
00186
00187 return out;
00188 }