11 #include "TMVA/MethodBDT.h"
15 _tag(conf.getParameter<std::
string>(
"mvaTag")),
16 _MethodName(
"BDTG method"),
17 _beamSpotLabel(conf.getParameter<edm::
InputTag>(
"beamSpot")),
18 _conversionsLabelAOD(conf.getParameter<edm::
InputTag>(
"conversionsAOD")),
19 _conversionsLabelMiniAOD(conf.getParameter<edm::
InputTag>(
"conversionsMiniAOD")) {
21 const std::vector <std::string> weightFileNames
22 = conf.
getParameter<std::vector<std::string> >(
"weightFileNames");
26 <<
"wrong number of weightfiles" << std::endl;
65 const std::vector<float> vars = std::move(
fillMVAVariables( particle, iEvent ) );
68 const bool debug =
false;
72 <<
" fbrem " << vars[11]
73 <<
" kfchi2 " << vars[9]
74 <<
" mykfhits " << vars[8]
75 <<
" gsfchi2 " << vars[10]
76 <<
" deta " << vars[18]
77 <<
" dphi " << vars[19]
78 <<
" detacalo " << vars[20]
81 <<
" etawidth " << vars[4]
82 <<
" phiwidth " << vars[5]
83 <<
" OneMinusE1x5E5x5 " << vars[2]
86 <<
" EoP " << vars[15]
87 <<
" IoEmIoP " << vars[17]
88 <<
" eleEoPout " << vars[16]
89 <<
" eta " << vars[24]
90 <<
" pt " << vars[21] << std::endl;
91 std::cout <<
" ### MVA " << result << std::endl;
104 <<
" given particle is expected to be reco::GsfElectron or pat::Electron," << std::endl
105 <<
" but appears to be neither" << std::endl;
107 float pt = eleRecoPtr->pt();
108 float eta = eleRecoPtr->superCluster()->eta();
114 const float ptSplit = 10;
115 const float ebSplit = 0.800;
116 const float ebeeSplit = 1.479;
118 if (pt < ptSplit &&
std::abs(eta) < ebSplit)
124 if (pt < ptSplit &&
std::abs(eta) >= ebeeSplit)
127 if (pt >= ptSplit &&
std::abs(eta) < ebSplit)
133 if (pt >= ptSplit &&
std::abs(eta) >= ebeeSplit)
156 TMVA::Reader tmpTMVAReader(
"!Color:Silent:!Error" );
163 tmpTMVAReader.AddVariable(
"ele_oldsigmaietaieta", &
_allMVAVars.
see);
164 tmpTMVAReader.AddVariable(
"ele_oldsigmaiphiiphi", &
_allMVAVars.
spp);
213 return std::unique_ptr<const GBRForest> (
new GBRForest( dynamic_cast<TMVA::MethodBDT*>( tmpTMVAReader.FindMVA(
_MethodName) ) ) );
241 <<
"Failed to retrieve event content needed for this MVA"
243 <<
"Check python MVA configuration file."
251 <<
" given particle is expected to be reco::GsfElectron or pat::Electron," << std::endl
252 <<
" but appears to be neither" << std::endl;
256 auto superCluster = eleRecoPtr->superCluster();
261 allMVAVars.
see = eleRecoPtr->full5x5_sigmaIetaIeta();
262 allMVAVars.
spp = eleRecoPtr->full5x5_sigmaIphiIphi();
263 allMVAVars.
OneMinusE1x5E5x5 = 1. - eleRecoPtr->full5x5_e1x5() / eleRecoPtr->full5x5_e5x5();
264 allMVAVars.
R9 = eleRecoPtr->full5x5_r9();
265 allMVAVars.
etawidth = superCluster->etaWidth();
266 allMVAVars.
phiwidth = superCluster->phiWidth();
267 allMVAVars.
HoE = eleRecoPtr->hadronicOverEm();
269 allMVAVars.
PreShowerOverRaw = superCluster->preshowerEnergy() / superCluster->rawEnergy();
280 myTrackRef = elePatPtr->closestCtfTrackRef();
284 allMVAVars.
kfhits = (validKF) ? myTrackRef->hitPattern().trackerLayersWithMeasurement() : -1. ;
285 allMVAVars.
kfchi2 = (validKF) ? myTrackRef->normalizedChi2() : 0;
286 allMVAVars.
gsfchi2 = eleRecoPtr->gsfTrack()->normalizedChi2();
289 allMVAVars.
fbrem = eleRecoPtr->fbrem();
291 allMVAVars.
gsfhits = eleRecoPtr->gsfTrack()->hitPattern().trackerLayersWithMeasurement();
297 theBeamSpot->position());
298 double vertexFitProbability = -1.;
301 vertexFitProbability = TMath::Prob( vtx.
chi2(), vtx.
ndof());
306 allMVAVars.
EoP = eleRecoPtr->eSuperClusterOverP();
307 allMVAVars.
eleEoPout = eleRecoPtr->eEleClusterOverPout();
308 float pAtVertex = eleRecoPtr->trackMomentumAtVtx().R();
309 allMVAVars.
IoEmIoP = (1.0/eleRecoPtr->ecalEnergy()) - (1.0 / pAtVertex );
312 allMVAVars.
deta = eleRecoPtr->deltaEtaSuperClusterTrackAtVtx();
313 allMVAVars.
dphi = eleRecoPtr->deltaPhiSuperClusterTrackAtVtx();
314 allMVAVars.
detacalo = eleRecoPtr->deltaEtaSeedClusterTrackAtCalo();
317 allMVAVars.
pt = eleRecoPtr->pt();
318 float scEta = superCluster->eta();
322 allMVAVars.
SCeta = scEta;
329 allMVAVars.
eClass = nines;
338 std::vector<float> vars;
422 if(allMVAVars.
fbrem < -1.)
423 allMVAVars.
fbrem = -1.;
425 allMVAVars.
deta = fabs(allMVAVars.
deta);
426 if(allMVAVars.
deta > 0.06)
427 allMVAVars.
deta = 0.06;
430 allMVAVars.
dphi = fabs(allMVAVars.
dphi);
431 if(allMVAVars.
dphi > 0.6)
432 allMVAVars.
dphi = 0.6;
435 if(allMVAVars.
EoP > 20.)
436 allMVAVars.
EoP = 20.;
454 if(allMVAVars.
R9 > 5)
461 if(allMVAVars.
kfchi2 > 10.)
T getParameter(std::string const &) const
std::vector< std::unique_ptr< const GBRForest > > _gbrForests
bool isNonnull() const
Checks for non-null.
std::unique_ptr< const GBRForest > createSingleReader(const int iCategory, const edm::FileInPath &weightFile)
ElectronMVAEstimatorRun2Spring15NonTrig(const edm::ParameterSet &conf)
float expectedMissingInnerHits
T const * get() const
Returns C++ pointer to the item.
bool isValid() const
Tells whether the vertex is valid.
int findCategory(const edm::Ptr< reco::Candidate > &particle) const override
std::vector< float > fillMVAVariables(const edm::Ptr< reco::Candidate > &particle, const edm::Event &) const override
const edm::InputTag _beamSpotLabel
std::vector< Conversion > ConversionCollection
collectin of Conversion objects
void constrainMVAVariables(AllVariables &) const
std::vector< float > packMVAVariables(const Args...args) const
bool isEndcapCategory(int category) const
Abs< T >::type abs(const T &t)
double chi2() const
chi-squares
const edm::InputTag _conversionsLabelAOD
T const * get() const
Returns C++ pointer to the item.
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
bool isEndcap(GeomDetEnumerators::SubDetector m)
bool isNull() const
Checks for null.
const edm::InputTag _conversionsLabelMiniAOD
float mcCBmatchingCategory
void setConsumes(edm::ConsumesCollector &&) const overridefinal
float convVtxFitProbability
std::string fullPath() const
float mvaValue(const edm::Ptr< reco::Candidate > &particle, const edm::Event &) const override
const std::string _MethodName
~ElectronMVAEstimatorRun2Spring15NonTrig()