63 using iplink_t = ElementLink<xAOD::IParticleContainer>;
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);
409 for (
size_t i = 0; i < assocs.size(); i++) {
410 std::vector<size_t> ind = assocs[i]->overlapIndices(orig);
411 std::vector<const xAOD::IParticle*> allObjects = assocs[i]->objects();
412 for (
size_t indi = 0; indi < ind.size(); indi++)
if (allObjects[ind[indi]]) {
414 && helper.objSelected(assocs[i], ind[indi])) {
434 if(collectionSgKey == 0) {
437 objLink =
iplink_t(*ipc, obj->index());
439 objLink =
iplink_t(collectionSgKey, obj->index());
441 uniqueLinks.push_back( objLink );
442 uniqueWeights.push_back( 1. );
446 return StatusCode::SUCCESS;
450 const std::string& softKey,
457 ATH_MSG_VERBOSE(
"Rebuild jet term: " << metJetKey <<
" and soft term: " << softKey);
461 ATH_MSG_ERROR(
"failed to fill MET term \"" << metJetKey <<
"\"");
462 return StatusCode::FAILURE;
465 const MissingET *coreSoftClus(
nullptr), *coreSoftTrk(
nullptr);
466 MissingET *metSoftClus(
nullptr), *metSoftTrk(
nullptr);
468 const MissingET* coreSoft = (*metCoreCont)[softKey+
"Core"];
471 return StatusCode::FAILURE;
474 coreSoftTrk = coreSoft;
476 metSoftTrk =
nullptr;
477 if(
fillMET(metSoftTrk,metCont, softKey , coreSoftTrk->
source() ) != StatusCode::SUCCESS) {
478 ATH_MSG_ERROR(
"failed to fill MET term \"" << softKey <<
"\"");
479 return StatusCode::FAILURE;
482 coreSoftClus = coreSoft;
484 metSoftClus =
nullptr;
485 if(
fillMET(metSoftClus, metCont, softKey , coreSoftClus->source() ) != StatusCode::SUCCESS) {
486 ATH_MSG_ERROR(
"failed to fill MET term \"" << softKey <<
"\"");
487 return StatusCode::FAILURE;
492 metSoftClus, coreSoftClus,
493 metSoftTrk, coreSoftTrk,
498 const std::string& softKey,
505 ATH_MSG_VERBOSE(
"Rebuild jet term: " << metJetKey <<
" and soft term: " << softKey);
509 ATH_MSG_ERROR(
"failed to fill MET term \"" << metJetKey <<
"\"");
510 return StatusCode::FAILURE;
516 const MissingET* coreSoft = (*metCoreCont)[softKey+
"Core"];
519 return StatusCode::FAILURE;
521 coreSoftTrk = coreSoft;
523 metSoftTrk =
nullptr;
524 if(
fillMET(metSoftTrk , metCont, softKey , coreSoftTrk->
source()) != StatusCode::SUCCESS) {
525 ATH_MSG_ERROR(
"failed to fill MET term \"" << softKey <<
"\"");
526 return StatusCode::FAILURE;
530 metSoftTrk, coreSoftTrk,
535 const std::string& softClusKey,
536 const std::string& softTrkKey,
547 ATH_MSG_ERROR(
"failed to fill MET term \"" << metJetKey <<
"\"");
548 return StatusCode::FAILURE;
551 const MissingET* coreSoftClus = (*metCoreCont)[softClusKey+
"Core"];
553 const MissingET* coreSoftTrk = (*metCoreCont)[softTrkKey+
"Core"];
555 ATH_MSG_WARNING(
"Invalid cluster soft term key supplied: " << softClusKey);
556 return StatusCode::FAILURE;
559 ATH_MSG_WARNING(
"Invalid track soft term key supplied: " << softTrkKey);
560 return StatusCode::FAILURE;
563 if(
fillMET(metSoftClus, metCont, softClusKey, coreSoftClus->
source()) != StatusCode::SUCCESS) {
564 ATH_MSG_ERROR(
"failed to fill MET term \"" << softClusKey <<
"\"");
565 return StatusCode::FAILURE;
569 if(
fillMET(metSoftTrk, metCont, softTrkKey, coreSoftTrk->
source()) != StatusCode::SUCCESS) {
570 ATH_MSG_ERROR(
"failed to fill MET term \"" << softTrkKey <<
"\"");
571 return StatusCode::FAILURE;
575 metSoftClus, coreSoftClus,
576 metSoftTrk, coreSoftTrk,
588 bool tracksForHardJets,
589 std::vector<const xAOD::IParticle*>* softConst)
const {
590 if(!metJet || !jets) {
592 <<
"MET (" << metJet <<
") or "
593 <<
"jet collection (" << jets <<
").");
594 return StatusCode::FAILURE;
598 ATH_MSG_ERROR(
"MET Association Helper isn't associated with a MissingETAssociationMap!");
599 return StatusCode::FAILURE;
602 ATH_MSG_WARNING(
"Requested soft track element links, but no track selection tool supplied.");
607 ATH_MSG_WARNING(
"Incomplete association map received. Cannot rebuild MET.");
608 ATH_MSG_WARNING(
"Note: METMaker should only be run on events containing at least one PV");
609 return StatusCode::SUCCESS;
612 if(doJetJVT &&
m_JvtWP ==
"None"){
618 if(!metSoftClus && !metSoftTrk) {
619 ATH_MSG_WARNING(
"Neither soft cluster nor soft track term has been supplied!");
620 return StatusCode::SUCCESS;
626 ATH_MSG_ERROR(
"Soft cluster term provided without a core term!");
627 return StatusCode::FAILURE;
631 <<
", mpy " << coreSoftClus->
mpy()
632 <<
" sumet " << coreSoftClus->
sumet());
633 *metSoftClus += *coreSoftClus;
637 if(softConst && acc_softConst.
isAvailable(*coreSoftClus)) {
638 for(
const auto& constit : acc_softConst(*coreSoftClus)) {
639 softConst->push_back(*constit);
641 ATH_MSG_DEBUG(softConst->size() <<
" soft constituents from core term");
647 ATH_MSG_ERROR(
"Soft track term provided without a core term!");
648 return StatusCode::FAILURE;
652 <<
", mpy " << coreSoftTrk->
mpy()
653 <<
" sumet " << coreSoftTrk->
sumet());
654 *metSoftTrk += *coreSoftTrk;
656 for(
const auto& constit : acc_softConst(*coreSoftTrk)) {
657 softConst->push_back(*constit);
659 ATH_MSG_DEBUG(softConst->size() <<
" soft constituents from trk core term");
667 uniqueLinks.reserve(jets->size());
668 uniqueWeights.reserve(jets->size());
669 std::vector<iplink_t> softJetLinks;
670 std::vector<float> softJetWeights;
671 bool originalInputs = jets->empty() ? false : !
acc_originalObject.isAvailable(*jets->front());
683 ATH_MSG_ERROR(
"Could not find the jets with pointer: " << jets);
684 return StatusCode::FAILURE;
696 if(!assoc || assoc->
isMisc()){
709 ATH_MSG_ERROR(
"No nominal calibrated jet available for jet " <<
jet->index() <<
". Cannot simplify overlap removal!");
714 bool JVT_reject(
false);
715 bool isMuFSRJet(
false);
724 ATH_MSG_VERBOSE(
"Jet " << (JVT_reject ?
"fails" :
"passes") <<
" JVT selection");
731 bool caloverlap =
false;
732 caloverlap = calvec.
ce()>0;
733 ATH_MSG_DEBUG(
"Jet " <<
jet->index() <<
" is " << ( caloverlap ?
"" :
"non-") <<
"overlapping");
736 for(
const auto&
object : assoc->
objects()) {
749 constSF = denom>1
e-9 ? constjet.E()/denom : 0.;
753 double jpx = constjet.Px();
754 double jpy = constjet.Py();
755 double jpt = constjet.Pt();
756 double opx = jpx - calvec.
cpx();
757 double opy = jpy - calvec.
cpy();
763 met_muonEloss = (*metCont)[
"MuonEloss"];
765 ATH_MSG_WARNING(
"Attempted to apply muon Eloss correction, but corresponding MET term does not exist!");
766 return StatusCode::FAILURE;
770 float total_eloss(0);
772 std::vector<const xAOD::Muon*> muons_in_jet;
773 std::vector<const xAOD::Electron*> electrons_in_jet;
774 bool passJetForEl=
false;
778 return StatusCode::FAILURE;
782 ATH_MSG_ERROR(
"Invalid element link to ghost muon! Quitting.");
783 return StatusCode::FAILURE;
785 muons_in_jet.push_back(
static_cast<const xAOD::Muon*
>(*el));
788 for(
const auto& obj : assoc->
objects()) {
796 muons_in_jet.push_back(mu_test);
804 if(helper.objSelected(assoc,el_test)){
805 if(el_test->
pt()>90.0e3) {
806 electrons_in_jet.push_back(el_test);
815 float jet_all_trk_pt = initialTrkMom.
sumpt();
816 float jet_unique_trk_pt = jet_all_trk_pt - jet_ORtrk_sumpt;
819 for(
const auto& elec : electrons_in_jet) {
820 el_calvec += assoc->
calVec(elec);
821 el_trkvec += assoc->
trkVec(elec);
823 float el_cal_pt = el_calvec.
cpt();
824 float el_trk_pt = el_trkvec.
cpt();
826 <<
" jetalltrk: " << jet_all_trk_pt
827 <<
" jetORtrk: " << jet_ORtrk_sumpt
828 <<
" electrk-jetORtrk: " << (el_trk_pt-jet_ORtrk_sumpt)
829 <<
" elec cal: " << el_cal_pt
830 <<
" jetalltrk-electrk: " << (jet_all_trk_pt-el_trk_pt)
831 <<
" jetalltrk-jetORtrk: " << (jet_all_trk_pt-jet_ORtrk_sumpt) );
835 if(el_trk_pt>1
e-9 && jet_unique_trk_pt>10.0e3) passJetForEl=
true;
838 for(
const xAOD::Muon* mu_in_jet : muons_in_jet) {
839 if (!mu_in_jet)
continue;
845 float mu_id_pt = mu_in_jet->trackParticle(xAOD::Muon::InnerDetectorTrackParticle) ? mu_in_jet->trackParticle(xAOD::Muon::InnerDetectorTrackParticle)->pt() : 0.;
849 if(0.9999*mu_id_pt>jet_trk_sumpt)
850 jet_trk_sumpt+=mu_id_pt;
853 ATH_MSG_VERBOSE(
"Jet has pt " <<
jet->pt() <<
", trk sumpt " << jet_trk_sumpt <<
", trk N " << jet_trk_N);
854 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;
863 float mu_id_pt = mu_in_jet->trackParticle(xAOD::Muon::InnerDetectorTrackParticle) ? mu_in_jet->trackParticle(xAOD::Muon::InnerDetectorTrackParticle)->pt() : 0.;
866 if(0.9999*mu_id_pt>jet_trk_sumpt)
867 jet_trk_sumpt+=mu_id_pt;
876 ATH_MSG_ERROR(
"Jet PS fraction or sampling energy must be available to calculate MET with doSetMuonJetEMScale");
877 return StatusCode::FAILURE;
885 ATH_MSG_VERBOSE(
"Jet is from muon -- set to EM scale and subtract Eloss.");
888 ATH_MSG_VERBOSE(
"Jet e: " << constjet.E() <<
", mu Eloss: " << mu_Eloss);
889 float elosscorr = mu_Eloss >= constjet.e() ? 0. : 1.-mu_Eloss/constjet.e();
894 ATH_MSG_VERBOSE(
" Jet eloss factor " << elosscorr <<
", final pt: " << sqrt(opx*opx+opy*opy));
901 switch(mu_in_jet->energyLossType()) {
902 case xAOD::Muon::Parametrized:
903 case xAOD::Muon::MOP:
904 case xAOD::Muon::Tail:
905 case xAOD::Muon::FSRcandidate:
906 case xAOD::Muon::NotIsolated:
910 total_eloss += mu_Eloss;
911 muons_selflags |= (1<<assoc->
findIndex(mu_in_jet));
919 for(
size_t iKey = 0; iKey < assoc->
sizeCal(); iKey++) {
920 bool selector = (muons_selflags & assoc->
calkey()[iKey]);
921 if(selector) mu_calovec += assoc->
calVec(iKey);
925 if(
m_muEloss) mu_calovec *= std::max<float>(0.,1-(total_eloss/mu_calovec.
ce()));
930 ATH_MSG_VERBOSE(
"Jet " <<
jet->index() <<
" const pT after OR " << sqrt(opx*opx+opy*opy));
931 opx += mu_calovec.
cpx();
932 opy += mu_calovec.
cpy();
933 double opt = sqrt( opx*opx+opy*opy );
934 ATH_MSG_VERBOSE(
"Jet " <<
jet->index() <<
" const pT diff after OR readding muon clusters " << opt-jpt);
935 double uniquefrac = 1. - (calvec.
ce() - mu_calovec.
ce()) / constjet.E();
936 ATH_MSG_VERBOSE(
"Jet constscale px, py, pt, E = " << jpx <<
", " << jpy <<
", " << jpt <<
", " << constjet.E() );
938 ATH_MSG_VERBOSE(
"Jet OR px, py, pt, E = " << opx <<
", " << opy <<
", " << opt <<
", " << constjet.E() - calvec.
ce() );
942 ATH_MSG_ERROR(
"Attempted to apply muon Eloss correction, but corresponding MET term does not exist!");
943 return StatusCode::FAILURE;
945 met_muonEloss->
add(opx,opy,opt);
949 if(selected && !JVT_reject) {
953 if (!tracksForHardJets) {
955 metJet->
add(jpx,jpy,jpt);
963 if(!tracksForHardJets) {
966 metJet->
add(opx,opy,opt);
968 double jesF =
jet->pt() / jpt;
969 metJet->
add(opx*jesF,opy*jesF,opt*jesF);
973 metJet->
add(uniquefrac*jpx,uniquefrac*jpy,uniquefrac*jpt);
976 metJet->
add(opx,opy,opt);
978 metJet->
add(uniquefrac*
jet->px(),uniquefrac*
jet->py(),uniquefrac*
jet->pt());
997 uniqueLinks.push_back( jetLink );
998 uniqueWeights.push_back( uniquefrac );
1000 if(metSoftClus && !JVT_reject) {
1004 softJetLinks.push_back( jetLink );
1005 softJetWeights.push_back( uniquefrac );
1006 metSoftClus->
add(opx,opy,opt);
1015 for(
size_t iConst=0; iConst<
jet->numConstituents(); ++iConst) {
1016 const IParticle* constit =
jet->rawConstituent(iConst);
1017 softConst->push_back(constit);
1023 if(!metSoftTrk || (hardJet && !tracksForHardJets))
continue;
1029 if(jettrkvec.
ce()>1
e-9) {
1030 jpx = jettrkvec.
cpx();
1031 jpy = jettrkvec.
cpy();
1032 jpt = jettrkvec.
sumpt();
1033 jettrkvec -= trkvec;
1034 opx = jettrkvec.
cpx();
1035 opy = jettrkvec.
cpy();
1036 opt = jettrkvec.
sumpt();
1037 ATH_MSG_VERBOSE(
"Jet track px, py, sumpt = " << jpx <<
", " << jpy <<
", " << jpt );
1038 ATH_MSG_VERBOSE(
"Jet OR px, py, sumpt = " << opx <<
", " << opy <<
", " << opt );
1040 opx = opy = opt = 0;
1043 if (hardJet) metJet->
add(opx,opy,opt);
1045 metSoftTrk->
add(opx,opy,opt);
1048 softJetLinks.push_back( jetLink );
1049 softJetWeights.push_back( uniquefrac );
1058 std::vector<const IParticle*> jettracks;
1060 for(
size_t iConst=0; iConst<jettracks.size(); ++iConst) {
1062 if (
acceptTrack(pTrk,pv)) softConst->push_back(pTrk);
1080 if(softConst)
ATH_MSG_DEBUG(softConst->size() <<
" soft constituents from core term + jets");
1083 if(!assoc)
return StatusCode::SUCCESS;
1089 double opx = trkvec.
cpx();
1090 double opy = trkvec.
cpy();
1091 double osumpt = trkvec.
sumpt();
1092 ATH_MSG_VERBOSE(
"Misc track px, py, sumpt = " << opx <<
", " << opy <<
", " << osumpt );
1093 metSoftTrk->
add(opx,opy,osumpt);
1095 <<
", mpy " << metSoftTrk->
mpy()
1096 <<
" sumet " << metSoftTrk->
sumet());
1102 float total_eloss(0.);
1105 double opx = calvec.
cpx();
1106 double opy = calvec.
cpy();
1107 double osumpt = calvec.
sumpt();
1108 for(
const auto& obj : assoc->
objects()) {
1115 case xAOD::Muon::Parametrized:
1116 case xAOD::Muon::MOP:
1117 case xAOD::Muon::Tail:
1118 case xAOD::Muon::FSRcandidate:
1119 case xAOD::Muon::NotIsolated:
1123 total_eloss += mu_Eloss;
1124 muons_selflags |= (1<<assoc->
findIndex(mu_test));
1134 for(
size_t iKey = 0; iKey < assoc->
sizeCal(); iKey++) {
1135 bool selector = (muons_selflags & assoc->
calkey()[iKey]);
1137 <<
" this calvec E: " << assoc->
calVec(iKey).
ce());
1138 if(selector) mu_calovec += assoc->
calVec(iKey);
1141 mu_calovec *= std::max<float>(0.,1-(total_eloss/mu_calovec.
ce()));
1142 opx += mu_calovec.
cpx();
1143 opy += mu_calovec.
cpy();
1144 osumpt += mu_calovec.
sumpt();
1148 ATH_MSG_VERBOSE(
"Misc cluster px, py, sumpt = " << opx <<
", " << opy <<
", " << osumpt );
1149 metSoftClus->
add(opx,opy,osumpt);
1151 <<
", mpy " << metSoftClus->
mpy()
1152 <<
" sumet " << metSoftClus->
sumet());
1155 return StatusCode::SUCCESS;
1163 bool doJetJVT)
const {
1164 return rebuildJetMET(metJet,jets,helper,
nullptr,
nullptr,metSoftTrk,coreSoftTrk,doJetJVT,
true);
1175 return StatusCode::FAILURE;
1182 return static_cast<bool>(
m_trkseltool->accept( *trk, vx ));
1190 ATH_MSG_WARNING(
"Unable to retrieve primary vertex container PrimaryVertices");
1193 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.
SG::ConstAccessor< T, ALLOC > ConstAccessor
SG::Accessor< T, ALLOC > Accessor
const SG::AuxVectorData * container() const
Return the container holding this element.
size_t index() const
Return the index of this element within its container.
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
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
static const SG::AuxElement::ConstAccessor< iplink_t > acc_nominalObject("nominalObjectLink")
ElementLink< xAOD::IParticleContainer > iplink_t
static const SG::AuxElement::ConstAccessor< float > acc_width("Width")
static const SG::AuxElement::ConstAccessor< std::vector< int > > acc_trkN("NumTrkPt500")
static const SG::AuxElement::ConstAccessor< iplink_t > acc_originalObject("originalObjectLink")
static const SG::AuxElement::ConstAccessor< float > acc_Eloss("EnergyLoss")
static const SG::AuxElement::ConstAccessor< std::vector< iplink_t > > acc_ghostElecs("GhostElec")
static const SG::AuxElement::Accessor< std::vector< iplink_t > > dec_constitObjLinks("ConstitObjectLinks")
static const SG::AuxElement::Accessor< std::vector< float > > dec_constitObjWeights("ConstitObjectWeights")
static const SG::AuxElement::ConstAccessor< std::vector< iplink_t > > acc_ghostMuons("GhostMuon")
static const SG::AuxElement::ConstAccessor< float > acc_emf("EMFrac")
static const SG::AuxElement::ConstAccessor< std::vector< float > > acc_trksumpt("SumPtTrkPt500")
static const MissingETBase::Types::bitmask_t invisSource
StatusCode fillMET(xAOD::MissingET *&met, xAOD::MissingETContainer *metCont, const std::string &metKey, const MissingETBase::Types::bitmask_t metSource)
static const SG::AuxElement::ConstAccessor< float > acc_psf("PSFrac")
static const SG::AuxElement::ConstAccessor< std::vector< float > > acc_sampleE("EnergyPerSampling")
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.