18 ATH_CHECK(m_TruthParticleKey.initialize(m_isMC));
19 ATH_CHECK(m_TruthVertexKey.initialize(m_isMC && m_dumpTruthVertices));
20 ATH_CHECK(m_TrackParticleKey.initialize(m_computeVertexIso));
21 ATH_CHECK(m_JetKey.initialize(m_fillJets || m_computeVertexIso || m_computeActiveVertices));
22 ATH_CHECK(m_MetKey.initialize(m_fillMET));
28 m_trigDec.setTypeAndName(
"Trig::TrigDecisionTool/TrigDecisionTool");
29 m_matchingTool.setTypeAndName(
"Trig::R3MatchingTool/R3MatchingTool");
35 m_tree.addBranch(std::make_unique<MuonVal::EventInfoBranch>(m_tree, 0));
38 m_truthParticle = std::make_shared<MuonVal::IParticleFourMomBranch>(m_tree,
"truthParticle");
45 m_tree.addBranch(m_truthParticle);
48 m_portal = std::make_shared<MuonVal::IParticleFourMomBranch>(m_tree,
"portal");
50 m_tree.addBranch(m_portal);
53 m_llp = std::make_shared<MuonVal::IParticleFourMomBranch>(m_tree,
"llp");
55 m_tree.addBranch(m_llp);
58 m_muonSeg = std::make_shared<MuonPRDTest::SegmentVariables>(m_tree, m_MuonSegKey.key(),
"muonSeg", msgLevel());
59 m_tree.addBranch(m_muonSeg);
62 m_muon = std::make_shared<MuonVal::IParticleFourMomBranch>(m_tree,
"muon");
63 m_tree.addBranch(m_muon);
66 m_jet = std::make_shared<MuonVal::IParticleFourMomBranch>(m_tree,
"jet");
68 m_tree.addBranch(m_jet);
77 auto h_LLP1LLP2dR = std::make_unique<TH1F>(
"h_LLP1LLP2dR",
"h_LLP1LLP2dR; #Delta R(LLP1, LLP2); Count / bin",50,0,4);
78 m_h_LLP1LLP2dR = h_LLP1LLP2dR.get();
79 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_LLP1LLP2dR", std::move(h_LLP1LLP2dR)));
81 auto h_diLLPMass = std::make_unique<TH1F>(
"h_diLLPMass",
"h_diLLPMass; m_{LL1, LLP2} [GeV]; Count / bin",50,0,1000);
82 m_h_diLLPMass = h_diLLPMass.get();
83 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_diLLPMass", std::move(h_diLLPMass)));
86 auto h_leadLLPLxy = std::make_unique<TH1F>(
"h_leadLLPLxy",
"h_leadLLPLxy; lead LLP L_{xy} [mm]; Count / bin",50,0,10000);
87 m_h_leadLLPLxy = h_leadLLPLxy.get();
88 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_leadLLPLxy", std::move(h_leadLLPLxy)));
90 auto h_leadLLPLz = std::make_unique<TH1F>(
"h_leadLLPLz",
"h_leadLLPLz; lead LLP L_{z} [mm]; Count / bin",50,0,14000);
91 m_h_leadLLPLz = h_leadLLPLz.get();
92 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_leadLLPLz", std::move(h_leadLLPLz)));
94 auto h_leadLLPctau = std::make_unique<TH1F>(
"h_leadLLPctau",
"h_leadLLPctau; lead LLP c#tau [mm]; Count / bin",50,0,2000);
95 m_h_leadLLPctau = h_leadLLPctau.get();
96 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_leadLLPctau", std::move(h_leadLLPctau)));
98 auto h_leadLLPpt = std::make_unique<TH1F>(
"h_leadLLPpt",
"h_leadLLPpt; lead LLP p_{T} [GeV]; Count / bin",50,0,400);
99 m_h_leadLLPpt = h_leadLLPpt.get();
100 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_leadLLPpt", std::move(h_leadLLPpt)));
103 auto h_subleadLLPLxy = std::make_unique<TH1F>(
"h_subleadLLPLxy",
"h_subleadLLPLxy; sublead LLP L_{xy} [mm]; Count / bin",50,0,10000);
104 m_h_subleadLLPLxy = h_subleadLLPLxy.get();
105 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_subleadLLPLxy", std::move(h_subleadLLPLxy)));
107 auto h_subleadLLPLz = std::make_unique<TH1F>(
"h_subleadLLPLz",
"h_subleadLLPLz; sublead LLP L_{z} [mm]; Count / bin",50,0,10000);
108 m_h_subleadLLPLz = h_subleadLLPLz.get();
109 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_subleadLLPLz", std::move(h_subleadLLPLz)));
111 auto h_subleadLLPctau = std::make_unique<TH1F>(
"h_subleadLLPctau",
"h_subleadLLPctau; sublead LLP c#tau [mm]; Count / bin",50,0,2000);
112 m_h_subleadLLPctau = h_subleadLLPctau.get();
113 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_subleadLLPctau", std::move(h_subleadLLPctau)));
115 auto h_subleadLLPpt = std::make_unique<TH1F>(
"h_subleadLLPpt",
"h_subleadLLPpt; sublead LLP p_{T} [GeV]; Count / bin",50,0,400);
116 m_h_subleadLLPpt = h_subleadLLPpt.get();
117 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_subleadLLPpt", std::move(h_subleadLLPpt)));
119 return StatusCode::SUCCESS;
125 if(m_dumpTruthVertices)
ATH_CHECK(fillTruthVertex(ctx));
127 return StatusCode::SUCCESS;
137 std::vector<const xAOD::TruthParticle*> portals{}, llps{};
140 if (m_dumpTruthParticles) {
141 m_truthParticle->push_back(
tp);
143 m_truthParticle_llpVtx_link_tmp->push_back(-1);
144 m_truthParticle_actVtx_link_tmp->push_back(-1);
145 m_truthParticle_truthVtx_link_tmp->push_back(-1);
149 if(std::abs(
tp->pdgId()) == m_pdgId_portal){
150 bool selfdecay =
false;
151 for (
size_t p = 0;
p <
tp->production_vertex()->nIncomingParticles(); ++
p)
if (
tp->parent(
p)->pdgId() ==
tp->pdgId()) { selfdecay =
true;
break;}
152 if (!selfdecay) portals.push_back(
tp);
156 if(std::abs(
tp->pdgId()) == m_pdgId_llp) llps.push_back(
tp);
160 m_portal_N = portals.size();
166 return StatusCode::SUCCESS;
173 m_llp_N = llps.size();
174 std::sort(llps.begin(), llps.end(),
comparePt);
180 m_llp->push_back(llp);
182 if(llp->hasDecayVtx()){
184 m_llpVtx_pos.push_back(decVtx->
v4().Vect());
185 m_llpVtx_Lxy.push_back(decVtx->
perp());
186 m_llpVtx_ctau.push_back(
getCTau(decVtx));
192 if(llp->hasDecayVtx()){
194 m_h_leadLLPLxy->Fill(decVtx->
perp());
195 m_h_leadLLPLz->Fill(decVtx->
z());
196 m_h_leadLLPctau->Fill(
getCTau(decVtx));
203 if(llp->hasDecayVtx()){
205 m_h_subleadLLPLxy->Fill(decVtx->
perp());
206 m_h_subleadLLPLz->Fill(decVtx->
z());
207 m_h_subleadLLPctau->Fill(
getCTau(decVtx));
213 TLorentzVector llpSum = subleadLLP->
p4()+leadLLP->
p4();
214 m_h_LLP1LLP2dR->Fill(leadLLP->
p4().DeltaR(subleadLLP->
p4()));
219 if (llp->hasDecayVtx() && llp->nChildren()>0 && !llp->isGenStable()) {
220 std::vector<const xAOD::TruthParticle*> stableChildren =
getStableChildren(llp, m_llp_genStableChildren);
221 m_llp_Nchildren.push_back((
int)stableChildren.size());
222 int nChargedChildren = 0;
224 if (child->charge() != 0) ++nChargedChildren;
225 if (!m_dumpTruthParticles)
continue;
226 m_llpVtx_truthParticle_link.push_back(llp_idx, child->index());
227 m_truthParticle_llpVtx_link_tmp->at(child->index()) = llp_idx;
229 m_llp_NchildrenCharged.push_back(nChargedChildren);
233 m_llpVtx_N = num_vtx;
236 if (m_dumpTruthParticles) {
237 for (
int link : *m_truthParticle_llpVtx_link_tmp) m_truthParticle_llpVtx_link.push_back(link);
238 m_truthParticle_llpVtx_link_tmp->clear();
242 return StatusCode::SUCCESS;
253 m_truthVtx_pos.push_back(vtx->v4().Vect());
254 m_truthVtx_status.push_back(vtx->status());
257 int interactionType = -1;
258 if (m_hadronicProcessEnum.count(vtx->status() - 1000)) interactionType = 0;
259 else if (m_emProcessEnum.count(vtx->status() - 1000)) interactionType = 1;
260 m_truthVtx_interactionType.push_back(interactionType);
263 m_truthVtx_NchildrenDirect.push_back(vtx->nOutgoingParticles());
265 int nChildrenCharged = 0;
267 std::vector<const xAOD::TruthParticle*> stableChildren =
getStableChildren(child,
false);
268 nChildren += stableChildren.size();
270 if (stableChild->charge() != 0) ++nChildrenCharged;
271 if (!m_dumpTruthParticles)
continue;
272 m_truthVtx_truthParticle_link.push_back(truthVtxIdx, stableChild->index());
273 m_truthParticle_truthVtx_link_tmp->at(stableChild->index()) = truthVtxIdx;
276 m_truthVtx_Nchildren.push_back(nChildren);
277 m_truthVtx_NchildrenCharged.push_back(nChildrenCharged);
282 if (m_dumpTruthParticles) {
283 for (
int link : *m_truthParticle_truthVtx_link_tmp) m_truthParticle_truthVtx_link.push_back(link);
284 m_truthParticle_truthVtx_link_tmp->clear();
287 return StatusCode::SUCCESS;
296 if (m_readTriggers) triggerInfo = getTriggerDecisions(m_triggerStringJets);
298 m_jet_N =
jets->size();
300 m_jet->push_back(
jet);
301 if (m_readTriggers) m_jet_triggers.push_back(getTriggerMatchingDecision(
jet, triggerInfo, m_jetTriggerMatchingDR));
302 if (m_computeActiveVertices && m_isMC)
ATH_CHECK(fillActiveVertices(ctx,
jet));
306 if (m_dumpTruthParticles) {
307 for (
int link : *m_truthParticle_actVtx_link_tmp) m_truthParticle_actVtx_link.push_back(link);
308 m_truthParticle_actVtx_link_tmp->clear();
311 return StatusCode::SUCCESS;
318 std::vector<std::string> triggerNames =
chain->getListOfTriggers();
320 std::vector<bool> triggerPassed;
321 for (
const std::string& triggerName : triggerNames) {
322 if (m_trigDec->isPassed(triggerName)) triggerPassed.push_back(
true);
323 else triggerPassed.push_back(
false);
326 return {triggerString, triggerNames, triggerPassed};
330 template <
typename T>
333 bool firedTrigger =
false;
334 for (
size_t i = 0;
i < triggerInfo.
passed.size(); ++
i) {
335 if (!triggerInfo.
passed[
i])
continue;
336 if (m_matchingTool->match(*
object, triggerInfo.
names[
i], dRmatching,
false)) {
352 if (!actVertices.size()){
353 m_jet_actVtx_link.push_back({});
354 return StatusCode::SUCCESS;
358 if (!actVtx.vtx)
continue;
360 size_t actVtxIdx = m_actVtx_NChildren.size();
362 m_actVtx_pos.push_back(actVtx.vtx->v4().Vect());
363 m_actVtx_NChildren.push_back(actVtx.nChildren);
364 m_actVtx_chainDepth.push_back(actVtx.decayDepth);
370 m_actVtx_jet_link.push_back(
jet->index());
371 m_actVtx_jet_dEta.push_back(
jet->eta() - actVtx.vtx->v4().Eta());
372 m_actVtx_jet_dPhi.push_back(
jet->p4().DeltaPhi(actVtx.vtx->v4()));
374 m_jet_actVtx_link.push_back(
jet->index(), actVtxIdx);
377 if (!m_dumpTruthParticles)
continue;
378 for (
auto tpLink : actVtx.vtx->outgoingParticleLinks()) {
379 if (!tpLink)
continue;
380 m_actVtx_truthParticle_link.push_back(actVtxIdx, tpLink.index());
381 m_truthParticle_actVtx_link_tmp->at(tpLink.index()) = actVtxIdx;
384 m_jet_NactVtx.push_back(actVertices.size());
386 return StatusCode::SUCCESS;
397 m_met_phi = (*MET)[
"Final"]->phi();
400 return StatusCode::SUCCESS;
410 return StatusCode::SUCCESS;
419 m_trklet_N = msOnlyTracklets->size();
422 m_trklet_d0.push_back(mstrklet->d0());
423 m_trklet_z0.push_back(mstrklet->z0());
424 m_trklet_phi.push_back(mstrklet->phi());
425 m_trklet_theta.push_back(mstrklet->theta());
426 m_trklet_eta.push_back(mstrklet->eta());
427 m_trklet_qOverP.push_back(mstrklet->qOverP());
428 m_trklet_q.push_back(mstrklet->charge());
430 const Trk::Perigee &tkl_perigee = mstrklet->perigeeParameters();
433 m_trklet_pos.push_back(trklet_pos);
434 m_trklet_mom.push_back(trklet_mom);
436 m_trklet_vtxLink.push_back(-1);
439 return StatusCode::SUCCESS;
449 if (m_computeVertexIso) {
454 m_msVtx_N = msVertices->size();
456 m_msVtx_pos.push_back(msVtx->position());
457 m_msVtx_chi2.push_back(msVtx->chiSquared());
458 m_msVtx_nDoF.push_back(msVtx->numberDoF());
461 fillHits(msVtx,
"nMDT", m_msVtx_nMDT);
462 fillHits(msVtx,
"nMDT_inwards", m_msVtx_nMDT_inwards);
463 fillHits(msVtx,
"nMDT_I", m_msVtx_nMDT_I);
464 fillHits(msVtx,
"nMDT_E", m_msVtx_nMDT_E);
465 fillHits(msVtx,
"nMDT_M", m_msVtx_nMDT_M);
466 fillHits(msVtx,
"nMDT_O", m_msVtx_nMDT_O);
468 fillHits(msVtx,
"nRPC", m_msVtx_nRPC);
469 fillHits(msVtx,
"nRPC_inwards", m_msVtx_nRPC_inwards);
470 fillHits(msVtx,
"nRPC_I", m_msVtx_nRPC_I);
471 fillHits(msVtx,
"nRPC_E", m_msVtx_nRPC_E);
472 fillHits(msVtx,
"nRPC_M", m_msVtx_nRPC_M);
473 fillHits(msVtx,
"nRPC_O", m_msVtx_nRPC_O);
475 fillHits(msVtx,
"nTGC", m_msVtx_nTGC);
476 fillHits(msVtx,
"nTGC_inwards", m_msVtx_nTGC_inwards);
477 fillHits(msVtx,
"nTGC_I", m_msVtx_nTGC_I);
478 fillHits(msVtx,
"nTGC_E", m_msVtx_nTGC_E);
479 fillHits(msVtx,
"nTGC_M", m_msVtx_nTGC_M);
480 fillHits(msVtx,
"nTGC_O", m_msVtx_nTGC_O);
483 size_t nTrk = msVtx->nTrackParticles();
484 m_msVtx_Ntrklet.push_back(nTrk);
486 for(
size_t j=0; j<nTrk; ++j){
488 if (!consti)
continue;
489 m_trklet_vtxLink[consti->
index()] = msVtx->
index();
493 if (m_computeVertexIso)
ATH_CHECK(fillMSVtxIsolation(msVtx, tracks,
jets));
496 return StatusCode::SUCCESS;
511 VtxIso iso =
getIso(msVtx, *tracks, *
jets, m_trackIso_pT, m_softTrackIso_R, m_jetIso_pT, m_jetIso_LogRatio);
512 m_msVtx_isoTracks_mindR.push_back(iso.
track_mindR);
513 m_msVtx_isoTracks_pTsum.push_back(iso.
track_pTsum);
514 m_msVtx_isoJets_mindR.push_back(iso.
jet_mindR);
516 return StatusCode::SUCCESS;
523 const EventContext& ctx = Gaudi::Hive::currentContext();
529 ATH_MSG_DEBUG(
"Start to run over event "<<eventInfo->eventNumber()<<
" in run" <<eventInfo->runNumber());
540 return StatusCode::SUCCESS;
548 return StatusCode::SUCCESS;