16 struct DescendingPt:std::function<bool(const xAOD::IParticle*, const xAOD::IParticle*)> {
18 return l->pt() >
r->pt();
22 template<
typename T,
typename...
Args>
24 return std::unique_ptr<T>(
new T(std::forward<Args>(
args)...));
29 const IInterface*
p) :
36 declareProperty(
"JetContainer",
m_jetSGKey =
"AntiKt4EMTopoJets");
39 declareProperty(
"MonoJetPtCut",
m_monoJetPt = 100000.);
42 declareProperty(
"DiJetMassCut",
m_Mjj = 150000.);
52 m_jetCalibrationTool.setTypeAndName(
"JetCalibrationTool/EXOT5JESTool");
53 CHECK(m_jetCalibrationTool.retrieve());
54 ATH_MSG_INFO(
"Retrieved tool: " << m_jetCalibrationTool);
56 return StatusCode::SUCCESS;
62 ATH_MSG_INFO(
"Processed " << m_ntot <<
" events, " << m_npass <<
" events passed filter ");
64 return StatusCode::SUCCESS;
79 bool passUncalibMonojetCut =
false;
80 bool passRecoJetCuts =
false;
81 bool passTruthJetCuts =
false;
83 std::unique_ptr<xAOD::JetContainer> recoJets = make_unique<xAOD::JetContainer>();
84 std::unique_ptr<xAOD::JetAuxContainer> recoJetsAux = make_unique<xAOD::JetAuxContainer>();
85 recoJets->setStore(recoJetsAux.get());
88 for (
const auto jet : *jets_shallowCopy.first) {
89 if (
jet->pt() > 100000.) passUncalibMonojetCut =
true;
91 if (m_jetCalibrationTool->applyCalibration(*jets_shallowCopy.first).isFailure()) {
95 for (
const auto jet : *jets_shallowCopy.first) {
100 delete jets_shallowCopy.first;
101 delete jets_shallowCopy.second;
105 if (recoJets->
size() > 1) {
106 TLorentzVector jet1 = recoJets->
at(0)->p4();
107 TLorentzVector jet2 = recoJets->
at(1)->p4();
108 auto dijet = jet1 + jet2;
111 if ((recoJets->
size() > 0 && recoJets->
at(0)->pt() > m_monoJetPt) || (recoJets->
size() > 1 && recoJets->
at(0)->pt() > m_leadingJetPt && recoJets->
at(1)->pt() > m_subleadingJetPt && mjj > m_Mjj)) passRecoJetCuts =
true;
117 std::unique_ptr<xAOD::JetContainer> truthJets = make_unique<xAOD::JetContainer>();
118 std::unique_ptr<xAOD::JetAuxContainer> truthJetsAux = make_unique<xAOD::JetAuxContainer>();
119 truthJets->setStore(truthJetsAux.get());
121 for (
const auto truthJet : *truthJetContainer) {
129 if (truthJets->
size() > 1) {
130 TLorentzVector truthJet1 = truthJets->
at(0)->p4();
131 TLorentzVector truthJet2 = truthJets->
at(1)->p4();
132 auto truthDijet = truthJet1 + truthJet2;
133 truthMjj = truthDijet.M();
135 if ((truthJets->
size() > 0 && truthJets->
at(0)->pt() > m_monoJetPt) || (truthJets->
size() > 1 && truthJets->
at(0)->pt() > m_leadingJetPt && truthJets->
at(1)->pt() > m_subleadingJetPt && truthMjj > m_Mjj)) passTruthJetCuts =
true;
138 bool acceptEvent = passUncalibMonojetCut || passRecoJetCuts || passTruthJetCuts;