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();
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;
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;
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_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(x,...)
#define ATH_MSG_INFO(x,...)
Base class for elements of a container that can have aux data.
std::vector< std::vector< int64_t > > indices
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.
Helper class to provide type-safe access to aux data.
Helper class to provide constant type-safe access to aux data.
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
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
std::unique_ptr< SG::ConstAccessor< char > > m_acc_jetRejectionDec
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::ConstAccessor< float > acc_emf("EMFrac")
static const SG::ConstAccessor< float > acc_psf("PSFrac")
static const SG::ConstAccessor< std::vector< float > > acc_sampleE("EnergyPerSampling")
static const SG::ConstAccessor< std::vector< int > > acc_trkN("NumTrkPt500")
static const SG::ConstAccessor< float > acc_Eloss("EnergyLoss")
static const SG::Accessor< std::vector< float > > dec_constitObjWeights("ConstitObjectWeights")
static const SG::ConstAccessor< std::vector< iplink_t > > acc_ghostElecs("GhostElec")
static const SG::ConstAccessor< std::vector< iplink_t > > acc_ghostMuons("GhostMuon")
static const MissingETBase::Types::bitmask_t invisSource
static const SG::ConstAccessor< iplink_t > acc_originalObject("originalObjectLink")
static const SG::ConstAccessor< float > acc_width("Width")
static const SG::ConstAccessor< std::vector< float > > acc_trksumpt("SumPtTrkPt500")
static const SG::ConstAccessor< iplink_t > acc_nominalObject("nominalObjectLink")
static const SG::Accessor< std::vector< iplink_t > > dec_constitObjLinks("ConstitObjectLinks")
StatusCode fillMET(xAOD::MissingET *&met, xAOD::MissingETContainer *metCont, const std::string &metKey, const MissingETBase::Types::bitmask_t metSource)
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.