9 #include "GaudiKernel/ThreadLocalContext.h"
13 #include "TMVA/Config.h"
40 m_BDTVarKey(Def::
NONE)
46 ATH_MSG_DEBUG(
"Initializing DecoratePromptLeptonImproved...");
65 ATH_CHECK(m_primaryVertexKey.initialize());
66 ATH_CHECK(m_clusterContainerKey.initialize());
70 ATH_CHECK(m_electronsKey.initialize(m_leptonsName ==
"Electrons"));
71 ATH_CHECK(m_muonsKey.initialize(m_leptonsName ==
"Muons"));
73 ATH_MSG_DEBUG(
"Number of int vars to read: " << m_stringIntVars.size());
74 ATH_MSG_DEBUG(
"Number of float vars to read: " << m_stringFloatVars.size());
77 m_vars = std::make_unique<Prompt::VarHolder>();
82 m_intVars = m_vars->readVectorVars(m_stringIntVars);
83 m_floatVars = m_vars->readVectorVars(m_stringFloatVars);
85 m_allVars.insert(m_allVars.end(), m_intVars .begin(), m_intVars .end());
86 m_allVars.insert(m_allVars.end(), m_floatVars.begin(), m_floatVars.end());
88 m_varTMVA.resize(m_allVars.size());
94 m_BDTVarKey = m_vars->registerDynamicVar(m_BDTName);
97 ATH_MSG_ERROR(
"Failed to create key for BDT name=" << m_BDTName);
98 return StatusCode::FAILURE;
109 initializeConstAccessors();
120 return StatusCode::SUCCESS;
132 ATH_MSG_INFO(
"Real time: " << m_timerAll.RealTime() <<
"\t CPU time: " << m_timerAll.CpuTime());
139 return StatusCode::SUCCESS;
151 const EventContext& ctx = Gaudi::Hive::currentContext();
161 <<
"\n\t\t\t Size of vertex container: " << vertices ->
size()
162 <<
"\n\t\t\t Size of track jet container: " << trackJets->
size()
163 <<
"\n-----------------------------------------------------------------");
172 primaryVertex = vertex;
177 std::vector<decoratorFloatH_t> floatDecors;
178 floatDecors.reserve (m_floatDecorHandleKeys.size());
180 floatDecors.emplace_back (
k, ctx);
183 std::vector<decoratorShortH_t> shortDecors;
184 shortDecors.reserve (m_shortDecorHandleKeys.size());
186 shortDecors.emplace_back (
k, ctx);
189 if(m_leptonsName ==
"Electrons") {
197 decorateElec(*elec, *trackJets, *
clusters, primaryVertex, floatDecors, shortDecors);
199 }
else if(m_leptonsName ==
"Muons") {
207 decorateMuon(*muon, *trackJets, primaryVertex, floatDecors, shortDecors);
212 return StatusCode::FAILURE;
215 return StatusCode::SUCCESS;
225 m_TMVAReader = std::make_unique<TMVA::Reader>();
227 for(
unsigned i = 0;
i < m_allVars.size(); ++
i) {
228 m_TMVAReader->AddVariable(m_vars->asStr(m_allVars.at(
i)), &m_varTMVA[
i]);
235 + m_configFileVersion
236 +
"/TMVAClassification_" + m_methodTitleMVA +
".weights.xml");
238 if(!m_configPathOverride.empty()) {
240 fullPathToFile = m_configPathOverride;
243 ATH_MSG_INFO(
"TMVA configuration file: " + fullPathToFile);
249 if(fullPathToFile ==
"") {
254 m_TMVAReader->BookMVA(m_methodTitleMVA.toString(), fullPathToFile);
264 std::string inputContName;
265 if (m_leptonsName ==
"Electrons") {
266 inputContName = m_electronsKey.key();
268 else if (m_leptonsName ==
"Muons") {
269 inputContName = m_muonsKey.key();
272 ATH_MSG_ERROR (
"LeptonContainerName was " << m_leptonsName <<
273 "; must be either Electrons or Muons");
274 return StatusCode::FAILURE;
278 for(
const std::string &vvar: m_vetoDecoratorFloatVars) {
279 const Def::Var vkey = m_vars->registerDynamicVar(vvar);
282 ATH_MSG_ERROR(
"Failed to create key for variable name=" << vvar);
283 return StatusCode::FAILURE;
286 vetoedVars.try_emplace (vkey, 0);
288 for(
const std::string &vvar: m_vetoDecoratorShortVars) {
289 const Def::Var vkey = m_vars->registerDynamicVar(vvar);
292 ATH_MSG_ERROR(
"Failed to create key for variable name=" << vvar);
293 return StatusCode::FAILURE;
296 vetoedVars.try_emplace (vkey, 0);
303 if (!vetoedVars.contains (
var)) {
304 m_shortDecorMap.try_emplace (
var, m_shortDecorHandleKeys.size());
305 m_shortDecorHandleKeys.push_back (
SG::makeContDecorKey (inputContName, m_inputVarDecoratePrefix + m_vars->asStr(
var)));
312 m_floatDecorHandleKeys.clear();
314 if (!vetoedVars.contains (
var)) {
315 m_floatDecorMap.try_emplace (
var, m_floatDecorHandleKeys.size());
316 m_floatDecorHandleKeys.push_back (
SG::makeContDecorKey (inputContName, m_inputVarDecoratePrefix + m_vars->asStr(
var)));
323 if (!vetoedVars.contains (m_BDTVarKey)) {
324 m_floatDecorMap.try_emplace (m_BDTVarKey, m_floatDecorHandleKeys.size());
328 for(
const std::string &evar: m_extraDecoratorFloatVars) {
329 const Def::Var ekey = m_vars->registerDynamicVar(evar);
332 ATH_MSG_ERROR(
"Failed to create key for variable name=" << evar);
333 return StatusCode::FAILURE;
336 if (!vetoedVars.contains (ekey)) {
337 m_floatDecorMap.try_emplace (ekey, m_floatDecorHandleKeys.size());
338 m_floatDecorHandleKeys.push_back (
SG::makeContDecorKey (inputContName, m_inputVarDecoratePrefix + evar));
342 for(
const std::string &evar: m_extraDecoratorShortVars) {
343 const Def::Var ekey = m_vars->registerDynamicVar(evar);
346 ATH_MSG_ERROR(
"Failed to create key for variable name=" << evar);
347 return StatusCode::FAILURE;
350 if (!vetoedVars.contains (ekey)) {
351 m_shortDecorMap.try_emplace (ekey, m_shortDecorHandleKeys.size());
352 m_shortDecorHandleKeys.push_back (
SG::makeContDecorKey (inputContName, m_inputVarDecoratePrefix + evar));
356 ATH_CHECK(m_shortDecorHandleKeys.initialize());
357 ATH_CHECK(m_floatDecorHandleKeys.initialize());
360 ATH_MSG_DEBUG(
"Added " << m_shortDecorHandleKeys.size() <<
" short decorators");
361 ATH_MSG_DEBUG(
"Added " << m_floatDecorHandleKeys.size() <<
" float decorators");
364 if(m_leptonPtBinsVector.size() < 2) {
365 ATH_MSG_ERROR(
"Invalid PtBins size=" << m_leptonPtBinsVector.size());
366 return StatusCode::FAILURE;
369 std::unique_ptr<double []> PtBins = std::make_unique<double []>(m_leptonPtBinsVector.size());
371 for(
unsigned i = 0;
i < m_leptonPtBinsVector.size();
i++) {
372 PtBins[
i] = m_leptonPtBinsVector[
i];
375 m_leptonPtBinHist = std::make_unique<TH1D>(
"PtBin",
"PtBin", m_leptonPtBinsVector.size() - 1, PtBins.get());
377 return StatusCode::SUCCESS;
386 m_accessDeepSecondaryVertex.emplace (m_vertexLinkName);
391 for(
const std::string &
name: m_accessorRNNVars) {
409 std::vector<decoratorFloatH_t>& floatDecors,
410 std::vector<decoratorShortH_t>& shortDecors
420 std::pair<double, const xAOD::Jet*>
match = findTrackJet(electron, trackJets);
426 getElectronAnpVariables(electron,
clusters, vars, primaryVertex);
431 getMutualVariables(electron, *
match.second, electron.trackParticle(), vars);
442 fillVarDefault(vars);
450 decorateAuxLepton(electron, vars, floatDecors, shortDecors);
459 std::vector<decoratorFloatH_t>& floatDecors,
460 std::vector<decoratorShortH_t>& shortDecors
470 std::pair<double, const xAOD::Jet*>
match = findTrackJet(muon, trackJets);
476 getMuonAnpVariables(muon, vars, primaryVertex);
481 getMutualVariables(muon, *
match.second, muon.primaryTrackParticle(), vars);
492 fillVarDefault(vars);
500 decorateAuxLepton(muon, vars, floatDecors, shortDecors);
521 const double deta = elec_calEta - cluster->eta();
523 const double dr = std::sqrt(deta*deta + dphi*dphi);
525 if(
dr < m_elecMinCalErelConeSize) {
526 sumCoreEt_large += cluster->pt();
538 const double Topoetcone30rel = accessIsolation(accessCalIsolation30, elec);
539 const double Ptvarcone30rel = accessIsolation(accessTrackIsolation30, elec);
547 std::vector<double> goodVertexNdistLong;
549 if(m_accessDeepSecondaryVertex->isAvailable(elec)) {
550 std::vector<ElementLink<xAOD::VertexContainer> > vtxLinks = (*m_accessDeepSecondaryVertex)(elec);
553 if(!vtxLink.isValid()) {
562 if(fitProb < m_vertexMinChiSquaredProb) {
566 const double theta = std::acos(getVertexCosThetaWithLepDir(elec, vtx, primaryVertex));
568 if (theta < m_vertexMinThetaBarrElec && std::fabs(elec.
eta()) <= m_vertexBarrEcapAbsEtaAt)
continue;
569 else if (theta < m_vertexMinThetaEcapElec && std::fabs(elec.
eta()) > m_vertexBarrEcapAbsEtaAt)
continue;
571 const double vertex_ndist_long = getVertexLongitudinalNormDist(elec, vtx, primaryVertex);
573 goodVertexNdistLong.push_back(vertex_ndist_long);
577 ATH_MSG_WARNING(
"VertexContainer : " << m_vertexLinkName <<
" not found for the electron");
580 double best_vertex_ndist_long = 0.0;
582 if(goodVertexNdistLong.size() > 0) {
583 std::sort(goodVertexNdistLong.begin(), goodVertexNdistLong.end());
584 best_vertex_ndist_long = goodVertexNdistLong.back();
601 double calE = -99.0, peloss = -99.0, caloClusterERel = -99.0;
603 if(muon.clusterLink().isValid()) {
606 if(accessMuonCalE.isAvailable(*cluster) && accessMuonParamEnergyLoss.isAvailable(muon)) {
607 calE = accessMuonCalE(*cluster);
608 peloss = accessMuonParamEnergyLoss(muon);
610 caloClusterERel = calE/peloss;
613 ATH_MSG_WARNING(
"Muon calE or ParamEnergyLoss not found in auxiliary store");
622 const double Topoetcone30rel = accessIsolation(accessCalIsolation30, muon);
623 const double ptvarcone30TightTTVAPt500rel = accessIsolation(accessTrackIsolation30TTVA, muon);
631 std::vector<double> goodVertexNdistLong;
633 if(m_accessDeepSecondaryVertex->isAvailable(muon)) {
634 std::vector<ElementLink<xAOD::VertexContainer> > vtxLinks = (*m_accessDeepSecondaryVertex)(muon);
635 goodVertexNdistLong.reserve(vtxLinks.size());
638 if(!vtxLink.isValid()) {
647 if(fitProb > m_vertexMinChiSquaredProb) {
648 const double vertex_ndist_long = getVertexLongitudinalNormDist(muon, vtx, primaryVertex);
650 goodVertexNdistLong.push_back(vertex_ndist_long);
655 ATH_MSG_WARNING(
"VertexContainer : " << m_vertexLinkName <<
" not found for the muon");
658 double best_vertex_ndist_long = 0.0;
660 if(goodVertexNdistLong.size() > 0) {
661 std::sort(goodVertexNdistLong.begin(), goodVertexNdistLong.end());
662 best_vertex_ndist_long = goodVertexNdistLong.back();
683 if(particle.pt() > 0.0 && track_jet.
pt() > 0.0) {
686 PtFrac = track->pt()/track_jet.
pt();
689 const double angle = particle.p4().Vect().Angle(track_jet.
p4().Vect());
705 for(
const floatAccessorMap::value_type &
acc: m_accessRNNMap) {
706 if(
acc.second.isAvailable(particle)) {
717 const double lepPt = particle.pt();
719 const double xmax = m_leptonPtBinHist->GetXaxis()->GetXmax();
720 const double xmin = m_leptonPtBinHist->GetXaxis()->GetXmin();
725 curr_bin = m_leptonPtBinHist->FindBin(lepPt);
727 else if (!(lepPt <
xmax)) {
728 curr_bin = m_leptonPtBinHist->GetNbinsX();
730 else if (!(lepPt >
xmin)) {
737 ATH_MSG_DEBUG(
"getMutualVariables - lepPt = " << lepPt <<
", MVAXBin = " << curr_bin);
745 double isolation = -99., isolationrel = -99.;
748 isolation = isoAccessor(particle);
754 if(particle.pt() > 0.0) {
755 isolationrel = isolation / particle.pt();
767 for(
unsigned i = 0;
i < m_allVars.size(); ++
i) {
770 if(!vars.
getVar(m_allVars.at(
i), m_varTMVA[
i])) {
771 ATH_MSG_WARNING(
"Missing input variable: " << m_vars->asStr(m_allVars.at(
i)));
778 float bdt_weight = m_TMVAReader->EvaluateMVA(m_methodTitleMVA.toString());
781 vars.
addVar(m_BDTVarKey, bdt_weight);
784 ATH_MSG_WARNING(
"addVarsToTMVA - invalid Def::Var key for " << m_BDTName);
794 for(
const DecorMap_t::value_type &dec: m_floatDecorMap) {
795 vars.
addVar(dec.first, -99.0);
798 for(
const DecorMap_t::value_type &dec: m_shortDecorMap) {
799 vars.
addVar(dec.first, -99.0);
807 std::vector<decoratorFloatH_t>& floatDecors,
808 std::vector<decoratorShortH_t>& shortDecors
814 for(
const DecorMap_t::value_type &dec: m_shortDecorMap) {
818 shortDecors.at(dec.second)(particle) =
static_cast<short>(
val);
830 for(
const DecorMap_t::value_type &dec: m_floatDecorMap) {
834 floatDecors.at(dec.second)(particle) =
val;
853 std::pair<double, const xAOD::Jet*>
match(mindr, minjet);
856 const double dr =
part.p4().DeltaR(
jet->p4());
858 if(!minjet ||
dr < mindr) {
861 match = std::make_pair(mindr, minjet);
866 if(minjet && mindr < m_maxLepTrackJetDR) {
871 return std::make_pair(10., minjet);
884 if(!secondaryVertex || !primaryVertex) {
885 ATH_MSG_WARNING(
"getVertexLongitudinalNormDist - invalid pointer of lepton/secondaryVertex/primaryVertex");
890 float normDist_SVPV = 0.0;
893 ATH_MSG_WARNING(
"getVertexLongitudinalNormDist - missing \"normDistToPriVtx\"");
896 double cos_theta = getVertexCosThetaWithLepDir(lepton, secondaryVertex, primaryVertex);
898 return normDist_SVPV*cos_theta;
909 if(!secondaryVertex || !primaryVertex) {
910 ATH_MSG_WARNING(
"GetVertexThetaWithLepDir - invalid pointer of lepton/secondaryVertex/primaryVertex");
916 const TVector3 sv_to_pv_t3 = TVector3(sv_to_pv_v3.x(), sv_to_pv_v3.y(), sv_to_pv_v3.z());
917 const TVector3 lepton_dirt = lepton.
p4().Vect();
919 const double cos_theta = sv_to_pv_t3.Unit()*lepton_dirt.Unit();