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));
27 m_trigDec.setTypeAndName(
"Trig::TrigDecisionTool/TrigDecisionTool");
28 m_matchingTool.setTypeAndName(
"Trig::R3MatchingTool/R3MatchingTool");
34 m_tree.addBranch(std::make_unique<MuonVal::EventInfoBranch>(m_tree, 0));
37 m_truthParticle = std::make_shared<MuonVal::IParticleFourMomBranch>(m_tree,
"truthParticle");
44 m_tree.addBranch(m_truthParticle);
47 m_portal = std::make_shared<MuonVal::IParticleFourMomBranch>(m_tree,
"portal");
49 m_tree.addBranch(m_portal);
52 m_llp = std::make_shared<MuonVal::IParticleFourMomBranch>(m_tree,
"llp");
54 m_tree.addBranch(m_llp);
57 m_muonSeg = std::make_shared<MuonPRDTest::SegmentVariables>(m_tree, m_MuonSegKey.key(),
"muonSeg", msgLevel());
58 m_tree.addBranch(m_muonSeg);
61 m_jet = std::make_shared<MuonVal::IParticleFourMomBranch>(m_tree,
"jet");
63 m_tree.addBranch(m_jet);
72 auto h_LLP1LLP2dR = std::make_unique<TH1F>(
"h_LLP1LLP2dR",
"h_LLP1LLP2dR; #Delta R(LLP1, LLP2); Count / bin",50,0,4);
73 m_h_LLP1LLP2dR = h_LLP1LLP2dR.get();
74 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_LLP1LLP2dR", std::move(h_LLP1LLP2dR)));
76 auto h_diLLPMass = std::make_unique<TH1F>(
"h_diLLPMass",
"h_diLLPMass; m_{LL1, LLP2} [GeV]; Count / bin",50,0,1000);
77 m_h_diLLPMass = h_diLLPMass.get();
78 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_diLLPMass", std::move(h_diLLPMass)));
81 auto h_leadLLPLxy = std::make_unique<TH1F>(
"h_leadLLPLxy",
"h_leadLLPLxy; lead LLP L_{xy} [mm]; Count / bin",50,0,10000);
82 m_h_leadLLPLxy = h_leadLLPLxy.get();
83 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_leadLLPLxy", std::move(h_leadLLPLxy)));
85 auto h_leadLLPLz = std::make_unique<TH1F>(
"h_leadLLPLz",
"h_leadLLPLz; lead LLP L_{z} [mm]; Count / bin",50,0,14000);
86 m_h_leadLLPLz = h_leadLLPLz.get();
87 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_leadLLPLz", std::move(h_leadLLPLz)));
89 auto h_leadLLPctau = std::make_unique<TH1F>(
"h_leadLLPctau",
"h_leadLLPctau; lead LLP c#tau [mm]; Count / bin",50,0,2000);
90 m_h_leadLLPctau = h_leadLLPctau.get();
91 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_leadLLPctau", std::move(h_leadLLPctau)));
93 auto h_leadLLPpt = std::make_unique<TH1F>(
"h_leadLLPpt",
"h_leadLLPpt; lead LLP p_{T} [GeV]; Count / bin",50,0,400);
94 m_h_leadLLPpt = h_leadLLPpt.get();
95 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_leadLLPpt", std::move(h_leadLLPpt)));
98 auto h_subleadLLPLxy = std::make_unique<TH1F>(
"h_subleadLLPLxy",
"h_subleadLLPLxy; sublead LLP L_{xy} [mm]; Count / bin",50,0,10000);
99 m_h_subleadLLPLxy = h_subleadLLPLxy.get();
100 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_subleadLLPLxy", std::move(h_subleadLLPLxy)));
102 auto h_subleadLLPLz = std::make_unique<TH1F>(
"h_subleadLLPLz",
"h_subleadLLPLz; sublead LLP L_{z} [mm]; Count / bin",50,0,10000);
103 m_h_subleadLLPLz = h_subleadLLPLz.get();
104 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_subleadLLPLz", std::move(h_subleadLLPLz)));
106 auto h_subleadLLPctau = std::make_unique<TH1F>(
"h_subleadLLPctau",
"h_subleadLLPctau; sublead LLP c#tau [mm]; Count / bin",50,0,2000);
107 m_h_subleadLLPctau = h_subleadLLPctau.get();
108 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_subleadLLPctau", std::move(h_subleadLLPctau)));
110 auto h_subleadLLPpt = std::make_unique<TH1F>(
"h_subleadLLPpt",
"h_subleadLLPpt; sublead LLP p_{T} [GeV]; Count / bin",50,0,400);
111 m_h_subleadLLPpt = h_subleadLLPpt.get();
112 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_subleadLLPpt", std::move(h_subleadLLPpt)));
114 return StatusCode::SUCCESS;
120 if(m_dumpTruthVertices)
ATH_CHECK(fillTruthVertex(ctx));
122 return StatusCode::SUCCESS;
132 std::vector<const xAOD::TruthParticle*> portals{}, llps{};
135 if (m_dumpTruthParticles) {
136 m_truthParticle->push_back(
tp);
138 m_truthParticle_llpVtx_link_tmp->push_back(-1);
139 m_truthParticle_actVtx_link_tmp->push_back(-1);
140 m_truthParticle_truthVtx_link_tmp->push_back(-1);
144 if(std::abs(
tp->pdgId()) == m_pdgId_portal){
145 bool selfdecay =
false;
146 for (
size_t p = 0;
p <
tp->production_vertex()->nIncomingParticles(); ++
p)
if (
tp->parent(
p)->pdgId() ==
tp->pdgId()) { selfdecay =
true;
break;}
147 if (!selfdecay) portals.push_back(
tp);
151 if(std::abs(
tp->pdgId()) == m_pdgId_llp) llps.push_back(
tp);
155 m_portal_N = portals.size();
161 return StatusCode::SUCCESS;
168 m_llp_N = llps.size();
169 std::sort(llps.begin(), llps.end(),
comparePt);
175 m_llp->push_back(llp);
177 if(llp->hasDecayVtx()){
179 m_llpVtx_pos.push_back(decVtx->
v4().Vect());
180 m_llpVtx_Lxy.push_back(decVtx->
perp());
181 m_llpVtx_ctau.push_back(
getCTau(decVtx));
187 if(llp->hasDecayVtx()){
189 m_h_leadLLPLxy->Fill(decVtx->
perp());
190 m_h_leadLLPLz->Fill(decVtx->
z());
191 m_h_leadLLPctau->Fill(
getCTau(decVtx));
198 if(llp->hasDecayVtx()){
200 m_h_subleadLLPLxy->Fill(decVtx->
perp());
201 m_h_subleadLLPLz->Fill(decVtx->
z());
202 m_h_subleadLLPctau->Fill(
getCTau(decVtx));
208 TLorentzVector llpSum = subleadLLP->
p4()+leadLLP->
p4();
209 m_h_LLP1LLP2dR->Fill(leadLLP->
p4().DeltaR(subleadLLP->
p4()));
214 if (llp->hasDecayVtx() && llp->nChildren()>0 && !llp->isGenStable()) {
215 std::vector<const xAOD::TruthParticle*> stableChildren =
getStableChildren(llp, m_llp_genStableChildren);
216 m_llp_Nchildren.push_back((
int)stableChildren.size());
217 int nChargedChildren = 0;
219 if (child->charge() != 0) ++nChargedChildren;
220 if (!m_dumpTruthParticles)
continue;
221 m_llpVtx_truthParticle_link.push_back(llp_idx, child->index());
222 m_truthParticle_llpVtx_link_tmp->at(child->index()) = llp_idx;
224 m_llp_NchildrenCharged.push_back(nChargedChildren);
228 m_llpVtx_N = num_vtx;
231 if (m_dumpTruthParticles) {
232 for (
int link : *m_truthParticle_llpVtx_link_tmp) m_truthParticle_llpVtx_link.push_back(link);
233 m_truthParticle_llpVtx_link_tmp->clear();
237 return StatusCode::SUCCESS;
248 m_truthVtx_pos.push_back(vtx->v4().Vect());
249 m_truthVtx_status.push_back(vtx->status());
252 int interactionType = -1;
253 if (m_hadronicProcessEnum.count(vtx->status() - 1000)) interactionType = 0;
254 else if (m_emProcessEnum.count(vtx->status() - 1000)) interactionType = 1;
255 m_truthVtx_interactionType.push_back(interactionType);
258 m_truthVtx_NchildrenDirect.push_back(vtx->nOutgoingParticles());
260 int nChildrenCharged = 0;
262 std::vector<const xAOD::TruthParticle*> stableChildren =
getStableChildren(child,
false);
263 nChildren += stableChildren.size();
265 if (stableChild->charge() != 0) ++nChildrenCharged;
266 if (!m_dumpTruthParticles)
continue;
267 m_truthVtx_truthParticle_link.push_back(truthVtxIdx, stableChild->index());
268 m_truthParticle_truthVtx_link_tmp->at(stableChild->index()) = truthVtxIdx;
271 m_truthVtx_Nchildren.push_back(nChildren);
272 m_truthVtx_NchildrenCharged.push_back(nChildrenCharged);
277 if (m_dumpTruthParticles) {
278 for (
int link : *m_truthParticle_truthVtx_link_tmp) m_truthParticle_truthVtx_link.push_back(link);
279 m_truthParticle_truthVtx_link_tmp->clear();
282 return StatusCode::SUCCESS;
291 if (m_readTriggers) triggerInfo = getTriggerDecisions(m_triggerStringJets);
293 m_jet_N =
jets->size();
295 m_jet->push_back(
jet);
296 if (m_readTriggers) m_jet_triggers.push_back(getTriggerMatchingDecision(
jet, triggerInfo, m_jetTriggerMatchingDR));
297 if (m_computeActiveVertices && m_isMC)
ATH_CHECK(fillActiveVertices(ctx,
jet));
301 if (m_dumpTruthParticles) {
302 for (
int link : *m_truthParticle_actVtx_link_tmp) m_truthParticle_actVtx_link.push_back(link);
303 m_truthParticle_actVtx_link_tmp->clear();
306 return StatusCode::SUCCESS;
313 std::vector<std::string> triggerNames =
chain->getListOfTriggers();
315 std::vector<bool> triggerPassed;
316 for (
const std::string& triggerName : triggerNames) {
317 if (m_trigDec->isPassed(triggerName)) triggerPassed.push_back(
true);
318 else triggerPassed.push_back(
false);
321 return {triggerString, triggerNames, triggerPassed};
325 template <
typename T>
328 bool firedTrigger =
false;
329 for (
size_t i = 0;
i < triggerInfo.
passed.size(); ++
i) {
330 if (!triggerInfo.
passed[
i])
continue;
331 if (m_matchingTool->match(*
object, triggerInfo.
names[
i], dRmatching,
false)) {
347 if (!actVertices.size()){
348 m_jet_actVtx_link.push_back({});
349 return StatusCode::SUCCESS;
353 if (!actVtx.vtx)
continue;
355 size_t actVtxIdx = m_actVtx_NChildren.size();
357 m_actVtx_pos.push_back(actVtx.vtx->v4().Vect());
358 m_actVtx_NChildren.push_back(actVtx.nChildren);
359 m_actVtx_chainDepth.push_back(actVtx.decayDepth);
365 m_actVtx_jet_link.push_back(
jet->index());
366 m_actVtx_jet_dEta.push_back(
jet->eta() - actVtx.vtx->v4().Eta());
367 m_actVtx_jet_dPhi.push_back(
jet->p4().DeltaPhi(actVtx.vtx->v4()));
369 m_jet_actVtx_link.push_back(
jet->index(), actVtxIdx);
372 if (!m_dumpTruthParticles)
continue;
373 for (
auto tpLink : actVtx.vtx->outgoingParticleLinks()) {
374 if (!tpLink)
continue;
375 m_actVtx_truthParticle_link.push_back(actVtxIdx, tpLink.index());
376 m_truthParticle_actVtx_link_tmp->at(tpLink.index()) = actVtxIdx;
379 m_jet_NactVtx.push_back(actVertices.size());
381 return StatusCode::SUCCESS;
392 m_met_phi = (*MET)[
"Final"]->phi();
395 return StatusCode::SUCCESS;
404 m_trklet_N = msOnlyTracklets->size();
407 m_trklet_d0.push_back(mstrklet->d0());
408 m_trklet_z0.push_back(mstrklet->z0());
409 m_trklet_phi.push_back(mstrklet->phi());
410 m_trklet_theta.push_back(mstrklet->theta());
411 m_trklet_eta.push_back(mstrklet->eta());
412 m_trklet_qOverP.push_back(mstrklet->qOverP());
413 m_trklet_q.push_back(mstrklet->charge());
415 const Trk::Perigee &tkl_perigee = mstrklet->perigeeParameters();
418 m_trklet_pos.push_back(trklet_pos);
419 m_trklet_mom.push_back(trklet_mom);
421 m_trklet_vtxLink.push_back(-1);
424 return StatusCode::SUCCESS;
434 if (m_computeVertexIso) {
439 m_msVtx_N = msVertices->size();
441 m_msVtx_pos.push_back(msVtx->position());
442 m_msVtx_chi2.push_back(msVtx->chiSquared());
443 m_msVtx_nDoF.push_back(msVtx->numberDoF());
446 fillHits(msVtx,
"nMDT", m_msVtx_nMDT);
447 fillHits(msVtx,
"nMDT_inwards", m_msVtx_nMDT_inwards);
448 fillHits(msVtx,
"nMDT_I", m_msVtx_nMDT_I);
449 fillHits(msVtx,
"nMDT_E", m_msVtx_nMDT_E);
450 fillHits(msVtx,
"nMDT_M", m_msVtx_nMDT_M);
451 fillHits(msVtx,
"nMDT_O", m_msVtx_nMDT_O);
453 fillHits(msVtx,
"nRPC", m_msVtx_nRPC);
454 fillHits(msVtx,
"nRPC_inwards", m_msVtx_nRPC_inwards);
455 fillHits(msVtx,
"nRPC_I", m_msVtx_nRPC_I);
456 fillHits(msVtx,
"nRPC_E", m_msVtx_nRPC_E);
457 fillHits(msVtx,
"nRPC_M", m_msVtx_nRPC_M);
458 fillHits(msVtx,
"nRPC_O", m_msVtx_nRPC_O);
460 fillHits(msVtx,
"nTGC", m_msVtx_nTGC);
461 fillHits(msVtx,
"nTGC_inwards", m_msVtx_nTGC_inwards);
462 fillHits(msVtx,
"nTGC_I", m_msVtx_nTGC_I);
463 fillHits(msVtx,
"nTGC_E", m_msVtx_nTGC_E);
464 fillHits(msVtx,
"nTGC_M", m_msVtx_nTGC_M);
465 fillHits(msVtx,
"nTGC_O", m_msVtx_nTGC_O);
468 size_t nTrk = msVtx->nTrackParticles();
469 m_msVtx_Ntrklet.push_back(nTrk);
471 for(
size_t j=0; j<nTrk; ++j){
473 if (!consti)
continue;
474 m_trklet_vtxLink[consti->
index()] = msVtx->
index();
478 if (m_computeVertexIso)
ATH_CHECK(fillMSVtxIsolation(msVtx, tracks,
jets));
481 return StatusCode::SUCCESS;
496 VtxIso iso =
getIso(msVtx, *tracks, *
jets, m_trackIso_pT, m_softTrackIso_R, m_jetIso_pT, m_jetIso_LogRatio);
497 m_msVtx_isoTracks_mindR.push_back(iso.
track_mindR);
498 m_msVtx_isoTracks_pTsum.push_back(iso.
track_pTsum);
499 m_msVtx_isoJets_mindR.push_back(iso.
jet_mindR);
501 return StatusCode::SUCCESS;
508 const EventContext& ctx = Gaudi::Hive::currentContext();
514 ATH_MSG_DEBUG(
"Start to run over event "<<eventInfo->eventNumber()<<
" in run" <<eventInfo->runNumber());
524 return StatusCode::SUCCESS;
532 return StatusCode::SUCCESS;