63 using iplink_t = ElementLink<xAOD::IParticleContainer>;
65 static const SG::AuxElement::ConstAccessor< iplink_t >
acc_nominalObject(
"nominalObjectLink");
66 static const SG::AuxElement::ConstAccessor< std::vector<iplink_t > >
acc_ghostMuons(
"GhostMuon");
67 static const SG::AuxElement::ConstAccessor< std::vector<iplink_t > >
acc_ghostElecs(
"GhostElec");
69 static const SG::AuxElement::ConstAccessor< std::vector<int> >
acc_trkN(
"NumTrkPt500");
70 static const SG::AuxElement::ConstAccessor< std::vector<float> >
acc_trksumpt(
"SumPtTrkPt500");
71 static const SG::AuxElement::ConstAccessor< std::vector<float> >
acc_sampleE(
"EnergyPerSampling");
73 static const SG::AuxElement::ConstAccessor<float>
acc_emf(
"EMFrac");
74 static const SG::AuxElement::ConstAccessor<float>
acc_psf(
"PSFrac");
75 static const SG::AuxElement::ConstAccessor<float>
acc_width(
"Width");
76 static const SG::AuxElement::ConstAccessor<float>
acc_Eloss(
"EnergyLoss");
78 static const SG::AuxElement::Accessor< std::vector<iplink_t> >
dec_constitObjLinks(
"ConstitObjectLinks");
128 "EXPERIMENTAL: whether to use simplified OR based on nominal jets "
129 "and for jet-related systematics only. "
130 "WARNING: this property is strictly for doing physics studies of the feasibility "
131 "of this OR scheme, it should not be used in a regular analysis");
165 ATH_MSG_INFO(
"Custom jet selection configured. *** FOR EXPERT USE ONLY ***");
172 ATH_MSG_INFO(
"Jet selection for hadronic recoil calculation is configured.");
180 ATH_MSG_ERROR(
"Error: No available jet selection found! Please update JetSelection in METMaker. Choose one: Loose, Tight (recommended), Tighter, Tenacious" );
181 return StatusCode::FAILURE;
213 ATH_MSG_INFO(
"Requesting simplified overlap removal procedure in MET calculation");
216 return StatusCode::SUCCESS;
244 ATH_MSG_WARNING(
"Incorrect use of rebuildMET -- use rebuildJetMET for RefJet term");
245 return StatusCode::FAILURE;
248 return StatusCode::FAILURE;
252 if(
fillMET(
met,metCont, metKey , metSource) != StatusCode::SUCCESS) {
253 ATH_MSG_ERROR(
"failed to fill MET term \"" << metKey <<
"\"");
254 return StatusCode::FAILURE;
260 if(
fillMET(met_muEloss,metCont,
"MuonEloss",
263 return StatusCode::FAILURE;
276 bool removeOverlap =
true;
277 if(!collection->
empty()) {
281 removeOverlap =
false;
286 return rebuildMET(
met,collection,helper,p,removeOverlap,objScale);
295 if(!
met || !collection) {
297 <<
"MET (" <<
met <<
") or "
298 <<
"collection (" << collection <<
").");
299 return StatusCode::FAILURE;
303 ATH_MSG_ERROR(
"MET Association Helper isn't associated with a MissingETAssociationMap!");
304 return StatusCode::FAILURE;
307 ATH_MSG_WARNING(
"Incomplete association map received. Cannot rebuild MET.");
308 ATH_MSG_WARNING(
"Note: METMaker should only be run on events containing at least one PV");
309 return StatusCode::SUCCESS;
316 uniqueLinks.reserve(collection->
size());
317 uniqueWeights.reserve(collection->
size());
328 collectionSgKey =
getKey(collection);
329 if(collectionSgKey == 0) {
332 return StatusCode::FAILURE;
336 if(collection->
empty())
return StatusCode::SUCCESS;
341 if(isShallowCopy && originalInputs) {
342 ATH_MSG_WARNING(
"Shallow copy provided without \"originalObjectLinks\" decoration! "
343 <<
"Overlap removal cannot be done. "
344 <<
"Will not compute this term.");
345 ATH_MSG_WARNING(
"Please apply xAOD::setOriginalObjectLink() from xAODBase/IParticleHelpers.h");
346 return StatusCode::SUCCESS;
349 for(
const auto *
const obj : *collection) {
351 bool selected =
false;
355 std::string message =
"Object is not in association map. Did you make a deep copy but fail to set the \"originalObjectLinks\" decoration? "
356 "If not, Please apply xAOD::setOriginalObjectLink() from xAODBase/IParticleHelpers.h";
366 if(collectionSgKey == 0) {
368 objLink =
iplink_t(*ipc, obj->index());
370 objLink =
iplink_t(collectionSgKey, obj->index());
372 uniqueLinks.emplace_back( objLink );
373 uniqueWeights.emplace_back( 0. );
374 message =
"Missing an electron from the MET map. Included as a track in the soft term. pT: " + std::to_string(obj->pt()/1e3) +
" GeV";
382 ATH_MSG_ERROR(
"Missing an object: " << orig->
type() <<
" pT: " << obj->pt()/1e3 <<
" GeV, may be duplicated in the soft term.");
389 ATH_MSG_VERBOSE(obj->type() <<
" (" << orig <<
") with pt " << obj->pt()
390 <<
" is " << ( selected ?
"non-" :
"") <<
"overlapping");
395 std::vector<size_t> indices = assoc->overlapIndices(orig);
396 std::vector<const xAOD::IParticle*> allObjects = assoc->objects();
397 for (
size_t index : indices){
399 if(!thisObj)
continue;
402 helper.setObjSelectionFlag(assoc, thisObj,
true);
410 for (
size_t i = 0; i < assocs.size(); i++) {
411 std::vector<size_t> ind = assocs[i]->overlapIndices(orig);
412 std::vector<const xAOD::IParticle*> allObjects = assocs[i]->objects();
413 for (
size_t indi = 0; indi < ind.size(); indi++)
if (allObjects[ind[indi]]) {
415 && helper.objSelected(assocs[i], ind[indi])) {
435 if(collectionSgKey == 0) {
438 objLink =
iplink_t(*ipc, obj->index());
440 objLink =
iplink_t(collectionSgKey, obj->index());
442 uniqueLinks.push_back( objLink );
443 uniqueWeights.push_back( 1. );
447 return StatusCode::SUCCESS;
451 const std::string& softKey,
458 ATH_MSG_VERBOSE(
"Rebuild jet term: " << metJetKey <<
" and soft term: " << softKey);
462 ATH_MSG_ERROR(
"failed to fill MET term \"" << metJetKey <<
"\"");
463 return StatusCode::FAILURE;
466 const MissingET *coreSoftClus(
nullptr), *coreSoftTrk(
nullptr);
467 MissingET *metSoftClus(
nullptr), *metSoftTrk(
nullptr);
469 const MissingET* coreSoft = (*metCoreCont)[softKey+
"Core"];
472 return StatusCode::FAILURE;
475 coreSoftTrk = coreSoft;
477 metSoftTrk =
nullptr;
478 if(
fillMET(metSoftTrk,metCont, softKey , coreSoftTrk->
source() ) != StatusCode::SUCCESS) {
479 ATH_MSG_ERROR(
"failed to fill MET term \"" << softKey <<
"\"");
480 return StatusCode::FAILURE;
483 coreSoftClus = coreSoft;
485 metSoftClus =
nullptr;
486 if(
fillMET(metSoftClus, metCont, softKey , coreSoftClus->source() ) != StatusCode::SUCCESS) {
487 ATH_MSG_ERROR(
"failed to fill MET term \"" << softKey <<
"\"");
488 return StatusCode::FAILURE;
493 metSoftClus, coreSoftClus,
494 metSoftTrk, coreSoftTrk,
499 const std::string& softKey,
506 ATH_MSG_VERBOSE(
"Rebuild jet term: " << metJetKey <<
" and soft term: " << softKey);
510 ATH_MSG_ERROR(
"failed to fill MET term \"" << metJetKey <<
"\"");
511 return StatusCode::FAILURE;
517 const MissingET* coreSoft = (*metCoreCont)[softKey+
"Core"];
520 return StatusCode::FAILURE;
522 coreSoftTrk = coreSoft;
524 metSoftTrk =
nullptr;
525 if(
fillMET(metSoftTrk , metCont, softKey , coreSoftTrk->
source()) != StatusCode::SUCCESS) {
526 ATH_MSG_ERROR(
"failed to fill MET term \"" << softKey <<
"\"");
527 return StatusCode::FAILURE;
531 metSoftTrk, coreSoftTrk,
536 const std::string& softClusKey,
537 const std::string& softTrkKey,
548 ATH_MSG_ERROR(
"failed to fill MET term \"" << metJetKey <<
"\"");
549 return StatusCode::FAILURE;
552 const MissingET* coreSoftClus = (*metCoreCont)[softClusKey+
"Core"];
554 const MissingET* coreSoftTrk = (*metCoreCont)[softTrkKey+
"Core"];
556 ATH_MSG_WARNING(
"Invalid cluster soft term key supplied: " << softClusKey);
557 return StatusCode::FAILURE;
560 ATH_MSG_WARNING(
"Invalid track soft term key supplied: " << softTrkKey);
561 return StatusCode::FAILURE;
564 if(
fillMET(metSoftClus, metCont, softClusKey, coreSoftClus->
source()) != StatusCode::SUCCESS) {
565 ATH_MSG_ERROR(
"failed to fill MET term \"" << softClusKey <<
"\"");
566 return StatusCode::FAILURE;
570 if(
fillMET(metSoftTrk, metCont, softTrkKey, coreSoftTrk->
source()) != StatusCode::SUCCESS) {
571 ATH_MSG_ERROR(
"failed to fill MET term \"" << softTrkKey <<
"\"");
572 return StatusCode::FAILURE;
576 metSoftClus, coreSoftClus,
577 metSoftTrk, coreSoftTrk,
589 bool tracksForHardJets,
590 std::vector<const xAOD::IParticle*>* softConst)
const {
591 if(!metJet || !jets) {
593 <<
"MET (" << metJet <<
") or "
594 <<
"jet collection (" << jets <<
").");
595 return StatusCode::FAILURE;
599 ATH_MSG_ERROR(
"MET Association Helper isn't associated with a MissingETAssociationMap!");
600 return StatusCode::FAILURE;
603 ATH_MSG_WARNING(
"Requested soft track element links, but no track selection tool supplied.");
608 ATH_MSG_WARNING(
"Incomplete association map received. Cannot rebuild MET.");
609 ATH_MSG_WARNING(
"Note: METMaker should only be run on events containing at least one PV");
610 return StatusCode::SUCCESS;
613 if(doJetJVT &&
m_JvtWP ==
"None"){
619 if(!metSoftClus && !metSoftTrk) {
620 ATH_MSG_WARNING(
"Neither soft cluster nor soft track term has been supplied!");
621 return StatusCode::SUCCESS;
623 static const SG::AuxElement::ConstAccessor<std::vector<ElementLink<IParticleContainer> > > acc_softConst(
"softConstituents");
627 ATH_MSG_ERROR(
"Soft cluster term provided without a core term!");
628 return StatusCode::FAILURE;
632 <<
", mpy " << coreSoftClus->
mpy()
633 <<
" sumet " << coreSoftClus->
sumet());
634 *metSoftClus += *coreSoftClus;
638 if(softConst && acc_softConst.isAvailable(*coreSoftClus)) {
639 for(
const auto& constit : acc_softConst(*coreSoftClus)) {
640 softConst->push_back(*constit);
642 ATH_MSG_DEBUG(softConst->size() <<
" soft constituents from core term");
648 ATH_MSG_ERROR(
"Soft track term provided without a core term!");
649 return StatusCode::FAILURE;
653 <<
", mpy " << coreSoftTrk->
mpy()
654 <<
" sumet " << coreSoftTrk->
sumet());
655 *metSoftTrk += *coreSoftTrk;
657 for(
const auto& constit : acc_softConst(*coreSoftTrk)) {
658 softConst->push_back(*constit);
660 ATH_MSG_DEBUG(softConst->size() <<
" soft constituents from trk core term");
668 uniqueLinks.reserve(jets->size());
669 uniqueWeights.reserve(jets->size());
670 std::vector<iplink_t> softJetLinks;
671 std::vector<float> softJetWeights;
672 bool originalInputs = jets->empty() ? false : !
acc_originalObject.isAvailable(*jets->front());
684 ATH_MSG_ERROR(
"Could not find the jets with pointer: " << jets);
685 return StatusCode::FAILURE;
697 if(!assoc || assoc->
isMisc()){
710 ATH_MSG_ERROR(
"No nominal calibrated jet available for jet " <<
jet->index() <<
". Cannot simplify overlap removal!");
715 bool JVT_reject(
false);
716 bool isMuFSRJet(
false);
725 ATH_MSG_VERBOSE(
"Jet " << (JVT_reject ?
"fails" :
"passes") <<
" JVT selection");
732 bool caloverlap =
false;
733 caloverlap = calvec.
ce()>0;
734 ATH_MSG_DEBUG(
"Jet " <<
jet->index() <<
" is " << ( caloverlap ?
"" :
"non-") <<
"overlapping");
737 for(
const auto&
object : assoc->
objects()) {
750 constSF = denom>1
e-9 ? constjet.E()/denom : 0.;
754 double jpx = constjet.Px();
755 double jpy = constjet.Py();
756 double jpt = constjet.Pt();
757 double opx = jpx - calvec.
cpx();
758 double opy = jpy - calvec.
cpy();
764 met_muonEloss = (*metCont)[
"MuonEloss"];
766 ATH_MSG_WARNING(
"Attempted to apply muon Eloss correction, but corresponding MET term does not exist!");
767 return StatusCode::FAILURE;
771 float total_eloss(0);
773 std::vector<const xAOD::Muon*> muons_in_jet;
774 std::vector<const xAOD::Electron*> electrons_in_jet;
775 bool passJetForEl=
false;
779 return StatusCode::FAILURE;
783 ATH_MSG_ERROR(
"Invalid element link to ghost muon! Quitting.");
784 return StatusCode::FAILURE;
786 muons_in_jet.push_back(
static_cast<const xAOD::Muon*
>(*el));
789 for(
const auto& obj : assoc->
objects()) {
797 muons_in_jet.push_back(mu_test);
805 if(helper.objSelected(assoc,el_test)){
806 if(el_test->
pt()>90.0e3) {
807 electrons_in_jet.push_back(el_test);
816 float jet_all_trk_pt = initialTrkMom.
sumpt();
817 float jet_unique_trk_pt = jet_all_trk_pt - jet_ORtrk_sumpt;
820 for(
const auto& elec : electrons_in_jet) {
821 el_calvec += assoc->
calVec(elec);
822 el_trkvec += assoc->
trkVec(elec);
824 float el_cal_pt = el_calvec.
cpt();
825 float el_trk_pt = el_trkvec.
cpt();
827 <<
" jetalltrk: " << jet_all_trk_pt
828 <<
" jetORtrk: " << jet_ORtrk_sumpt
829 <<
" electrk-jetORtrk: " << (el_trk_pt-jet_ORtrk_sumpt)
830 <<
" elec cal: " << el_cal_pt
831 <<
" jetalltrk-electrk: " << (jet_all_trk_pt-el_trk_pt)
832 <<
" jetalltrk-jetORtrk: " << (jet_all_trk_pt-jet_ORtrk_sumpt) );
836 if(el_trk_pt>1
e-9 && jet_unique_trk_pt>10.0e3) passJetForEl=
true;
839 for(
const xAOD::Muon* mu_in_jet : muons_in_jet) {
840 if (!mu_in_jet)
continue;
846 float mu_id_pt = mu_in_jet->trackParticle(xAOD::Muon::InnerDetectorTrackParticle) ? mu_in_jet->trackParticle(xAOD::Muon::InnerDetectorTrackParticle)->pt() : 0.;
850 if(0.9999*mu_id_pt>jet_trk_sumpt)
851 jet_trk_sumpt+=mu_id_pt;
854 ATH_MSG_VERBOSE(
"Jet has pt " <<
jet->pt() <<
", trk sumpt " << jet_trk_sumpt <<
", trk N " << jet_trk_N);
855 bool jet_from_muon = mu_id_pt>1
e-9 && jet_trk_sumpt>1
e-9 && (
jet->pt()/mu_id_pt < m_muIDPTJetPtRatioMuOlap && mu_id_pt/jet_trk_sumpt>
m_jetTrkPtMuPt) && jet_trk_N<
m_jetTrkNMuOlap;
864 float mu_id_pt = mu_in_jet->trackParticle(xAOD::Muon::InnerDetectorTrackParticle) ? mu_in_jet->trackParticle(xAOD::Muon::InnerDetectorTrackParticle)->pt() : 0.;
867 if(0.9999*mu_id_pt>jet_trk_sumpt)
868 jet_trk_sumpt+=mu_id_pt;
877 ATH_MSG_ERROR(
"Jet PS fraction or sampling energy must be available to calculate MET with doSetMuonJetEMScale");
878 return StatusCode::FAILURE;
886 ATH_MSG_VERBOSE(
"Jet is from muon -- set to EM scale and subtract Eloss.");
889 ATH_MSG_VERBOSE(
"Jet e: " << constjet.E() <<
", mu Eloss: " << mu_Eloss);
890 float elosscorr = mu_Eloss >= constjet.e() ? 0. : 1.-mu_Eloss/constjet.e();
895 ATH_MSG_VERBOSE(
" Jet eloss factor " << elosscorr <<
", final pt: " << sqrt(opx*opx+opy*opy));
902 switch(mu_in_jet->energyLossType()) {
903 using enum xAOD::Muon::EnergyLossType;
912 total_eloss += mu_Eloss;
913 muons_selflags |= (1<<assoc->
findIndex(mu_in_jet));
921 for(
size_t iKey = 0; iKey < assoc->
sizeCal(); iKey++) {
922 bool selector = (muons_selflags & assoc->
calkey()[iKey]);
923 if(selector) mu_calovec += assoc->
calVec(iKey);
927 if(
m_muEloss) mu_calovec *= std::max<float>(0.,1-(total_eloss/mu_calovec.
ce()));
932 ATH_MSG_VERBOSE(
"Jet " <<
jet->index() <<
" const pT after OR " << sqrt(opx*opx+opy*opy));
933 opx += mu_calovec.
cpx();
934 opy += mu_calovec.
cpy();
935 double opt = sqrt( opx*opx+opy*opy );
936 ATH_MSG_VERBOSE(
"Jet " <<
jet->index() <<
" const pT diff after OR readding muon clusters " << opt-jpt);
937 double uniquefrac = 1. - (calvec.
ce() - mu_calovec.
ce()) / constjet.E();
938 ATH_MSG_VERBOSE(
"Jet constscale px, py, pt, E = " << jpx <<
", " << jpy <<
", " << jpt <<
", " << constjet.E() );
940 ATH_MSG_VERBOSE(
"Jet OR px, py, pt, E = " << opx <<
", " << opy <<
", " << opt <<
", " << constjet.E() - calvec.
ce() );
944 ATH_MSG_ERROR(
"Attempted to apply muon Eloss correction, but corresponding MET term does not exist!");
945 return StatusCode::FAILURE;
947 met_muonEloss->
add(opx,opy,opt);
951 if(selected && !JVT_reject) {
955 if (!tracksForHardJets) {
957 metJet->
add(jpx,jpy,jpt);
965 if(!tracksForHardJets) {
968 metJet->
add(opx,opy,opt);
970 double jesF =
jet->pt() / jpt;
971 metJet->
add(opx*jesF,opy*jesF,opt*jesF);
975 metJet->
add(uniquefrac*jpx,uniquefrac*jpy,uniquefrac*jpt);
978 metJet->
add(opx,opy,opt);
980 metJet->
add(uniquefrac*
jet->px(),uniquefrac*
jet->py(),uniquefrac*
jet->pt());
999 uniqueLinks.push_back( jetLink );
1000 uniqueWeights.push_back( uniquefrac );
1002 if(metSoftClus && !JVT_reject) {
1006 softJetLinks.push_back( jetLink );
1007 softJetWeights.push_back( uniquefrac );
1008 metSoftClus->
add(opx,opy,opt);
1017 for(
size_t iConst=0; iConst<
jet->numConstituents(); ++iConst) {
1018 const IParticle* constit =
jet->rawConstituent(iConst);
1019 softConst->push_back(constit);
1025 if(!metSoftTrk || (hardJet && !tracksForHardJets))
continue;
1031 if(jettrkvec.
ce()>1
e-9) {
1032 jpx = jettrkvec.
cpx();
1033 jpy = jettrkvec.
cpy();
1034 jpt = jettrkvec.
sumpt();
1035 jettrkvec -= trkvec;
1036 opx = jettrkvec.
cpx();
1037 opy = jettrkvec.
cpy();
1038 opt = jettrkvec.
sumpt();
1039 ATH_MSG_VERBOSE(
"Jet track px, py, sumpt = " << jpx <<
", " << jpy <<
", " << jpt );
1040 ATH_MSG_VERBOSE(
"Jet OR px, py, sumpt = " << opx <<
", " << opy <<
", " << opt );
1042 opx = opy = opt = 0;
1045 if (hardJet) metJet->
add(opx,opy,opt);
1047 metSoftTrk->
add(opx,opy,opt);
1050 softJetLinks.push_back( jetLink );
1051 softJetWeights.push_back( uniquefrac );
1060 std::vector<const IParticle*> jettracks;
1062 for(
size_t iConst=0; iConst<jettracks.size(); ++iConst) {
1064 if (
acceptTrack(pTrk,pv)) softConst->push_back(pTrk);
1082 if(softConst)
ATH_MSG_DEBUG(softConst->size() <<
" soft constituents from core term + jets");
1085 if(!assoc)
return StatusCode::SUCCESS;
1091 double opx = trkvec.
cpx();
1092 double opy = trkvec.
cpy();
1093 double osumpt = trkvec.
sumpt();
1094 ATH_MSG_VERBOSE(
"Misc track px, py, sumpt = " << opx <<
", " << opy <<
", " << osumpt );
1095 metSoftTrk->
add(opx,opy,osumpt);
1097 <<
", mpy " << metSoftTrk->
mpy()
1098 <<
" sumet " << metSoftTrk->
sumet());
1104 float total_eloss(0.);
1107 double opx = calvec.
cpx();
1108 double opy = calvec.
cpy();
1109 double osumpt = calvec.
sumpt();
1110 for(
const auto& obj : assoc->
objects()) {
1117 using enum xAOD::Muon::EnergyLossType;
1126 total_eloss += mu_Eloss;
1127 muons_selflags |= (1<<assoc->
findIndex(mu_test));
1137 for(
size_t iKey = 0; iKey < assoc->
sizeCal(); iKey++) {
1138 bool selector = (muons_selflags & assoc->
calkey()[iKey]);
1140 <<
" this calvec E: " << assoc->
calVec(iKey).
ce());
1141 if(selector) mu_calovec += assoc->
calVec(iKey);
1144 mu_calovec *= std::max<float>(0.,1-(total_eloss/mu_calovec.
ce()));
1145 opx += mu_calovec.
cpx();
1146 opy += mu_calovec.
cpy();
1147 osumpt += mu_calovec.
sumpt();
1151 ATH_MSG_VERBOSE(
"Misc cluster px, py, sumpt = " << opx <<
", " << opy <<
", " << osumpt );
1152 metSoftClus->
add(opx,opy,osumpt);
1154 <<
", mpy " << metSoftClus->
mpy()
1155 <<
" sumet " << metSoftClus->
sumet());
1158 return StatusCode::SUCCESS;
1166 bool doJetJVT)
const {
1167 return rebuildJetMET(metJet,jets,helper,
nullptr,
nullptr,metSoftTrk,coreSoftTrk,doJetJVT,
true);
1178 return StatusCode::FAILURE;
1185 return static_cast<bool>(
m_trkseltool->accept( *trk, vx ));
1193 ATH_MSG_WARNING(
"Unable to retrieve primary vertex container PrimaryVertices");
1196 ATH_MSG_DEBUG(
"Successfully retrieved primary vertex container");
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
Base class for elements of a container that can have aux data.
Defines enum to access jet attribute and associated particles/objects.
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
const T * front() const
Access the first element in the collection as an rvalue.
SG::OwnershipPolicy ownPolicy() const
Return the ownership policy setting for this container.
size_type size() const noexcept
Returns the number of elements in the collection.
bool empty() const noexcept
Returns true if the collection is empty.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
StatusCode setProperty(const std::string &name, const T &value)
set the given property
bool m_skipSystematicJetSelection
double m_customFwdJetPtCut
METMaker()
Default constructor:
std::string m_customJvtWP
ToolHandle< IAsgSelectionTool > m_JvtTool
float m_missObjWarningPtThreshold
std::string m_jetSelection
std::string m_jetRejectionDec
virtual StatusCode rebuildTrackMET(const std::string &metJetKey, const std::string &softTrkKey, xAOD::MissingETContainer *metCont, const xAOD::JetContainer *jets, const xAOD::MissingETContainer *metCoreCont, xAOD::MissingETAssociationHelper &helper, bool doJetJVT) const override final
std::unique_ptr< SG::AuxElement::ConstAccessor< char > > m_acc_jetRejectionDec
double m_jetMinWeightedPt
bool m_doRemoveElecTrksEM
virtual StatusCode markInvisible(const xAOD::IParticleContainer *collection, xAOD::MissingETAssociationHelper &helper, xAOD::MissingETContainer *metCont) const override final
double m_muIDPTJetPtRatioMuOlap
bool m_doSetMuonJetEMScale
SG::ReadHandleKey< xAOD::VertexContainer > m_PVkey
double m_customCenJetPtCut
bool acceptTrack(const xAOD::TrackParticle *trk, const xAOD::Vertex *vx) const
ToolHandle< InDet::IInDetTrackSelectionTool > m_trkseltool
SG::ReadHandleKey< xAOD::JetContainer > m_jetContainer
std::string m_jetConstitScaleMom
virtual StatusCode rebuildMET(const std::string &metKey, xAOD::Type::ObjectType metType, xAOD::MissingETContainer *metCont, const xAOD::IParticleContainer *collection, xAOD::MissingETAssociationHelper &helper, MissingETBase::UsageHandler::Policy objScale) const override final
virtual StatusCode initialize() override final
Dummy implementation of the initialisation function.
virtual ~METMaker()
Destructor:
const xAOD::Vertex * getPV() const
virtual StatusCode rebuildJetMET(const std::string &metJetKey, const std::string &softClusKey, const std::string &softTrkKey, xAOD::MissingETContainer *metCont, const xAOD::JetContainer *jets, const xAOD::MissingETContainer *metCoreCont, xAOD::MissingETAssociationHelper &helper, bool doJetJVT) const override final
virtual double pt() const override final
The transverse momentum ( ) of the particle.
Class providing the definition of the 4-vector interface.
virtual double pt() const =0
The transverse momentum ( ) of the particle.
virtual Type::ObjectType type() const =0
The type of the object as a simple enumeration.
A vector of jet constituents at the scale used during jet finding.
float ce() const
Returns .
float sumpt() const
Returns sum of component pt.
float cpt() const
Returns .
float cpx() const
Returns .
float cpy() const
Returns .
bool isMisc() const
Check if this association is a miscellaneous association.
const std::vector< MissingETBase::Types::bitmask_t > & calkey() const
Get the vector of cal keys.
ConstVec trkVec(const IParticle *pPart) const
Get track constituent vector for a given object.
ConstVec overlapTrkVec(const MissingETAssociationHelper &helper) const
Retrieve total track-based vector to be subtracted from the jet.
std::vector< const IParticle * > objects() const
Access contributing objects.
xAOD::JetFourMom_t getAlternateConstVec() const
bool hasAlternateConstVec() const
ConstVec overlapCalVec(const MissingETAssociationHelper &helper) const
Retrieve total cluster-based vector to be subtracted from the jet.
ConstVec jetTrkVec() const
Get track constituent vector for the reference jet.
size_t findIndex(const IParticle *pPart) const
Find index of given object in contributing object store.
ConstVec calVec(const IParticle *pPart) const
Get calo constituent vector for a given object.
float sumet() const
Returns.
void add(const IParticle *particle)
Add particle kinematics to MET.
MissingETBase::Types::bitmask_t source() const
MET object source tag.
const std::string & name() const
Identifier getters.
float mpx() const
Returns .
float mpy() const
Returns .
EnergyLossType energyLossType(void) const
Energy determined from parametrization or not (measured).
Class creating a shallow copy of an existing auxiliary container.
xAOD::MissingETAssociation_v1::ConstVec constvec_t
Type for constituent vector.
uint64_t bitmask_t
Type for status word bit mask.
Policy
Policies on usage checks.
@ OnlyTrack
Track based only.
@ OnlyCluster
CaloCluster based only.
@ TruthParticle
Truth particle based.
@ ParticleFlow
Particle Flow Object based.
@ PhysicsObject
Physics object based.
uint32_t sgkey_t
Type used for hashed StoreGate key+CLID pairs.
@ OWN_ELEMENTS
this data object owns its elements
ElementLink< xAOD::IParticleContainer > iplink_t
static const SG::AuxElement::ConstAccessor< float > acc_emf("EMFrac")
static const SG::AuxElement::Accessor< std::vector< float > > dec_constitObjWeights("ConstitObjectWeights")
static const SG::AuxElement::ConstAccessor< float > acc_Eloss("EnergyLoss")
static const SG::AuxElement::ConstAccessor< float > acc_width("Width")
static const SG::AuxElement::ConstAccessor< iplink_t > acc_nominalObject("nominalObjectLink")
static const SG::AuxElement::Accessor< std::vector< iplink_t > > dec_constitObjLinks("ConstitObjectLinks")
static const SG::AuxElement::ConstAccessor< float > acc_psf("PSFrac")
static const SG::AuxElement::ConstAccessor< std::vector< int > > acc_trkN("NumTrkPt500")
static const MissingETBase::Types::bitmask_t invisSource
static const SG::AuxElement::ConstAccessor< std::vector< float > > acc_sampleE("EnergyPerSampling")
static const SG::AuxElement::ConstAccessor< iplink_t > acc_originalObject("originalObjectLink")
static const SG::AuxElement::ConstAccessor< std::vector< iplink_t > > acc_ghostMuons("GhostMuon")
static const SG::AuxElement::ConstAccessor< std::vector< float > > acc_trksumpt("SumPtTrkPt500")
StatusCode fillMET(xAOD::MissingET *&met, xAOD::MissingETContainer *metCont, const std::string &metKey, const MissingETBase::Types::bitmask_t metSource)
static const SG::AuxElement::ConstAccessor< std::vector< iplink_t > > acc_ghostElecs("GhostElec")
ObjectType
Type of objects that have a representation in the xAOD EDM.
@ Jet
The object is a jet.
@ Photon
The object is a photon.
@ Muon
The object is a muon.
@ Electron
The object is an electron.
@ Tau
The object is a tau (jet).
Jet_v1 Jet
Definition of the current "jet version".
MissingETAssociation_v1 MissingETAssociation
Version control by type definition.
MissingET_v1 MissingET
Version control by type defintion.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Vertex_v1 Vertex
Define the latest version of the vertex class.
MissingETContainer_v1 MissingETContainer
Muon_v1 Muon
Reference the current persistent version:
setBGCode setTAP setLVL2ErrorBits bool
MissingETAuxContainer_v1 MissingETAuxContainer
JetContainer_v1 JetContainer
Definition of the current "jet container version".
MissingETAssociationMap_v1 MissingETAssociationMap
Version control by type defintion.
Electron_v1 Electron
Definition of the current "egamma version".
DataVector< IParticle > IParticleContainer
Simple convenience declaration of IParticleContainer.
ROOT::Math::LorentzVector< ROOT::Math::PtEtaPhiM4D< double > > JetFourMom_t
Base 4 Momentum type for Jet.
static Types::bitmask_t muon(Region reg=Region::FullAcceptance)
Standard MET term from reconstructed muons.
static Types::bitmask_t jet(Region reg=Region::FullAcceptance)
Standard MET term from reconstructed jets.
@ Calo
Indicator for MET terms reconstructed from calorimeter signals alone.
static Types::bitmask_t track(Region reg=Region::FullAcceptance)
Bit mask for MET term from Track signal objects.
static bool isTrackTerm(Types::bitmask_t bits, Region reg=Region::FullAcceptance)
static Types::bitmask_t tau(Region reg=Region::FullAcceptance)
Standard MET term from reconstructed tau leptons.
static Types::bitmask_t electron(Region reg=Region::FullAcceptance)
Standard MET term from reconstructed electrons.
static Types::bitmask_t photon(Region reg=Region::FullAcceptance)
Standard MET term from reconstructed photons.
@ Central
Indicator for MET contribution from the central region.
static bool objSelected(const MissingETAssociationHelper &helper, const IParticle *obj)
static MissingETBase::Types::constvec_t getConstVec(const MissingETAssociationMap *pMap, const IParticle *pPart, MissingETBase::UsageHandler::Policy p)
static bool selectIfNoOverlaps(MissingETAssociationHelper &helper, const IParticle *obj, MissingETBase::UsageHandler::Policy p)
static const MissingETAssociation * getAssociation(const MissingETAssociationMap *pMap, const Jet *pJet)
Collection of functions managing the MET composition map and association map.
static std::vector< const MissingETAssociation * > getAssociations(const MissingETAssociationMap *pMap, const IParticle *pPart)
Access non-modifiable contribution object.