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);
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;
622 static const SG::AuxElement::ConstAccessor<std::vector<ElementLink<IParticleContainer> > > acc_softConst(
"softConstituents");
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.
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.