14 constexpr
int default_d = -99999;
15 constexpr
float default_f = -99999.;
23 ATH_CHECK(m_TruthParticleKey.initialize());
24 ATH_CHECK(m_TrackParticleKey.initialize(m_computeIso));
25 ATH_CHECK(m_JetKey.initialize(m_readJets || m_computeIso));
26 ATH_CHECK(m_MetKey.initialize(m_readMET));
34 m_tree.addBranch(std::make_unique<MuonVal::EventInfoBranch>(m_tree, 0));
37 m_truthParticle = std::make_shared<MuonVal::IParticleFourMomBranch>(m_tree,
"truthParticle");
38 m_truthParticle->addVariableGeV<
float>(default_f,
"m");
39 m_truthParticle->addVariable<
int>(default_d,
"pdgId");
40 m_truthParticle->addVariable<
float>(default_f,
"pX");
41 m_truthParticle->addVariable<
float>(default_f,
"pY");
42 m_truthParticle->addVariable<
float>(default_f,
"pZ");
43 m_tree.addBranch(m_truthParticle);
46 m_portal = std::make_shared<MuonVal::IParticleFourMomBranch>(m_tree,
"portal");
47 m_portal->addVariableGeV<
float>(default_f,
"m");
48 m_tree.addBranch(m_portal);
51 m_llp = std::make_shared<MuonVal::IParticleFourMomBranch>(m_tree,
"llp");
52 m_llp->addVariableGeV<
float>(default_f,
"m");
53 m_tree.addBranch(m_llp);
56 m_tree.disableBranch(
"msVtx_isoTracks_mindR");
57 m_tree.disableBranch(
"msVtx_isoTracks_pTsum");
58 m_tree.disableBranch(
"msVtx_isoJets_mindR");
62 m_muonSeg = std::make_shared<MuonPRDTest::SegmentVariables>(m_tree, m_MuonSegKey,
"muonSeg", msgLevel());
63 m_tree.addBranch(m_muonSeg);
67 m_jet = std::make_shared<MuonVal::IParticleFourMomBranch>(m_tree,
"jet");
68 m_jet->addVariableGeV<
float>(default_f,
"m");
69 m_tree.addBranch(m_jet);
71 else m_tree.disableBranch(
"jet_N");
75 m_tree.disableBranch(
"met");
76 m_tree.disableBranch(
"met_x");
77 m_tree.disableBranch(
"met_y");
78 m_tree.disableBranch(
"met_phi");
89 auto h_LLP1LLP2dR = std::make_unique<TH1F>(
"h_LLP1LLP2dR",
"h_LLP1LLP2dR; #Delta R(LLP1, LLP2); Count / bin",50,0,4);
90 m_h_LLP1LLP2dR = h_LLP1LLP2dR.get();
91 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_LLP1LLP2dR", std::move(h_LLP1LLP2dR)));
93 auto h_diLLPMass = std::make_unique<TH1F>(
"h_diLLPMass",
"h_diLLPMass; m_{LL1, LLP2} [GeV]; Count / bin",50,0,1000);
94 m_h_diLLPMass = h_diLLPMass.get();
95 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_diLLPMass", std::move(h_diLLPMass)));
98 auto h_leadLLPLxy = std::make_unique<TH1F>(
"h_leadLLPLxy",
"h_leadLLPLxy; lead LLP L_{xy} [mm]; Count / bin",50,0,10000);
99 m_h_leadLLPLxy = h_leadLLPLxy.get();
100 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_leadLLPLxy", std::move(h_leadLLPLxy)));
102 auto h_leadLLPLz = std::make_unique<TH1F>(
"h_leadLLPLz",
"h_leadLLPLz; lead LLP L_{z} [mm]; Count / bin",50,0,14000);
103 m_h_leadLLPLz = h_leadLLPLz.get();
104 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_leadLLPLz", std::move(h_leadLLPLz)));
106 auto h_leadLLPctau = std::make_unique<TH1F>(
"h_leadLLPctau",
"h_leadLLPctau; lead LLP c#tau [mm]; Count / bin",50,0,2000);
107 m_h_leadLLPctau = h_leadLLPctau.get();
108 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_leadLLPctau", std::move(h_leadLLPctau)));
110 auto h_leadLLPpt = std::make_unique<TH1F>(
"h_leadLLPpt",
"h_leadLLPpt; lead LLP p_{T} [GeV]; Count / bin",50,0,400);
111 m_h_leadLLPpt = h_leadLLPpt.get();
112 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_leadLLPpt", std::move(h_leadLLPpt)));
115 auto h_subleadLLPLxy = std::make_unique<TH1F>(
"h_subleadLLPLxy",
"h_subleadLLPLxy; sublead LLP L_{xy} [mm]; Count / bin",50,0,10000);
116 m_h_subleadLLPLxy = h_subleadLLPLxy.get();
117 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_subleadLLPLxy", std::move(h_subleadLLPLxy)));
119 auto h_subleadLLPLz = std::make_unique<TH1F>(
"h_subleadLLPLz",
"h_subleadLLPLz; sublead LLP L_{z} [mm]; Count / bin",50,0,10000);
120 m_h_subleadLLPLz = h_subleadLLPLz.get();
121 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_subleadLLPLz", std::move(h_subleadLLPLz)));
123 auto h_subleadLLPctau = std::make_unique<TH1F>(
"h_subleadLLPctau",
"h_subleadLLPctau; sublead LLP c#tau [mm]; Count / bin",50,0,2000);
124 m_h_subleadLLPctau = h_subleadLLPctau.get();
125 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_subleadLLPctau", std::move(h_subleadLLPctau)));
127 auto h_subleadLLPpt = std::make_unique<TH1F>(
"h_subleadLLPpt",
"h_subleadLLPpt; sublead LLP p_{T} [GeV]; Count / bin",50,0,400);
128 m_h_subleadLLPpt = h_subleadLLPpt.get();
129 ATH_CHECK(
histSvc()->regHist(
"/MSVtxValidation/h_subleadLLPpt", std::move(h_subleadLLPpt)));
131 return StatusCode::SUCCESS;
141 std::vector<const xAOD::TruthParticle*> portals{}, llps{};
144 m_truthParticle->push_back(
tp);
146 m_truthParticle_llpVtx_link_tmp->push_back(-1);
147 m_truthParticle_jetVtx_link_tmp->push_back(-1);
150 if(std::abs(
tp->pdgId()) == m_pdgId_portal){
151 bool selfdecay =
false;
152 for (
size_t p = 0;
p <
tp->production_vertex()->nIncomingParticles(); ++
p)
if (
tp->parent(
p)->pdgId() ==
tp->pdgId()) { selfdecay =
true;
break;}
153 if (!selfdecay) portals.push_back(
tp);
157 if(std::abs(
tp->pdgId()) == m_pdgId_llp) llps.push_back(
tp);
161 m_portal_N = portals.size();
165 m_llp_N = llps.size();
166 std::sort(llps.begin(), llps.end(),
comparePt);
172 m_llp->push_back(llp);
174 if(llp->hasDecayVtx()){
176 m_llpVtx_pos.push_back(decVtx->
v4().Vect());
177 m_llpVtx_Lxy.push_back(decVtx->
perp());
178 m_llpVtx_ctau.push_back(
getCTau(decVtx));
184 if(llp->hasDecayVtx()){
186 m_h_leadLLPLxy->Fill(decVtx->
perp());
187 m_h_leadLLPLz->Fill(decVtx->
z());
188 m_h_leadLLPctau->Fill(
getCTau(decVtx));
195 if(llp->hasDecayVtx()){
197 m_h_subleadLLPLxy->Fill(decVtx->
perp());
198 m_h_subleadLLPLz->Fill(decVtx->
z());
199 m_h_subleadLLPctau->Fill(
getCTau(decVtx));
205 TLorentzVector llpSum = subleadLLP->
p4()+leadLLP->
p4();
206 m_h_LLP1LLP2dR->Fill(leadLLP->
p4().DeltaR(subleadLLP->
p4()));
211 if (llp->hasDecayVtx() && llp->nChildren()>0 && !llp->isGenStable()){
212 std::vector<const xAOD::TruthParticle*> stableChildren =
getStableChildren(llp, m_llp_genStableChildren);
213 m_llp_Nchildren.push_back((
int)stableChildren.size());
215 for (
const xAOD::TruthParticle *child : stableChildren) m_truthParticle_llpVtx_link_tmp->at(child->index()) = llp_idx;
219 m_llpVtx_N = num_vtx;
221 for (
int link : *m_truthParticle_llpVtx_link_tmp) m_truthParticle_llpVtx_link.push_back(link);
222 m_truthParticle_llpVtx_link_tmp->clear();
225 return StatusCode::SUCCESS;
230 if (!m_readJets)
return StatusCode::SUCCESS;
236 const std::vector<std::string> triggerNames =
chain->getListOfTriggers();
238 std::vector<bool> triggerPassed{};
239 for (
const std::string& triggerName : triggerNames) {
240 if (m_trigDec->isPassed(triggerName)) triggerPassed.push_back(
true);
241 else triggerPassed.push_back(
false);
244 m_jet_N =
jets->size();
245 bool jetFiredTrigger =
false;
247 m_jet->push_back(
jet);
249 for (
size_t i = 0;
i < triggerNames.size(); ++
i) {
250 if (!triggerPassed[
i])
continue;
251 if (m_matchingTool->match(*
jet, triggerNames[
i], m_jetTriggerMatchingDR,
false)) {
252 jetFiredTrigger =
true;
253 m_jet_triggers.push_back(1);
257 if (!jetFiredTrigger) m_jet_triggers.push_back(0);
258 jetFiredTrigger =
false;
264 for (
int link : *m_truthParticle_jetVtx_link_tmp) m_truthParticle_jetVtx_link.push_back(link);
265 m_truthParticle_jetVtx_link_tmp->clear();
267 return StatusCode::SUCCESS;
279 m_jet_jetVtx_link.push_back(-1);
280 return StatusCode::SUCCESS;
282 size_t currNjetVtx = m_jetVtx_NChildren.size();
283 m_jetVtx_pos.push_back(jetVtx.
vtx->
v4().Vect());
284 m_jetVtx_jet_dEta.push_back(
jet->eta() - jetVtx.
vtx->
v4().Eta());
285 m_jetVtx_jet_dPhi.push_back(
jet->p4().DeltaPhi(jetVtx.
vtx->
v4()));
286 m_jetVtx_NChildren.push_back(jetVtx.
nChildren);
287 m_jetVtx_chainDepth.push_back(jetVtx.
decayDepth);
290 m_jet_jetVtx_link.push_back(currNjetVtx);
293 if (!tpLink)
continue;
294 m_truthParticle_jetVtx_link_tmp->at(tpLink.index()) = currNjetVtx;
297 return StatusCode::SUCCESS;
302 if (!m_readMET)
return StatusCode::SUCCESS;
310 m_met_phi = (*MET)[
"Final"]->phi();
313 return StatusCode::SUCCESS;
322 m_trklet_N = msOnlyTracklets->size();
325 m_trklet_d0.push_back(mstrklet->d0());
326 m_trklet_z0.push_back(mstrklet->z0());
327 m_trklet_phi.push_back(mstrklet->phi());
328 m_trklet_theta.push_back(mstrklet->theta());
329 m_trklet_eta.push_back(mstrklet->eta());
330 m_trklet_qOverP.push_back(mstrklet->qOverP());
331 m_trklet_q.push_back(mstrklet->charge());
333 const Trk::Perigee &tkl_perigee = mstrklet->perigeeParameters();
336 m_trklet_pos.push_back(trklet_pos);
337 m_trklet_mom.push_back(trklet_mom);
339 m_trklet_vtxLink.push_back(-1);
342 return StatusCode::SUCCESS;
362 m_msVtx_N = msVertices->size();
364 m_msVtx_pos.push_back(msVtx->position());
365 m_msVtx_chi2.push_back(msVtx->chiSquared());
366 m_msVtx_nDoF.push_back(msVtx->numberDoF());
369 fillHits(msVtx,
"nMDT", m_msVtx_nMDT);
370 fillHits(msVtx,
"nMDT_inwards", m_msVtx_nMDT_inwards);
371 fillHits(msVtx,
"nMDT_I", m_msVtx_nMDT_I);
372 fillHits(msVtx,
"nMDT_E", m_msVtx_nMDT_E);
373 fillHits(msVtx,
"nMDT_M", m_msVtx_nMDT_M);
374 fillHits(msVtx,
"nMDT_O", m_msVtx_nMDT_O);
376 fillHits(msVtx,
"nRPC", m_msVtx_nRPC);
377 fillHits(msVtx,
"nRPC_inwards", m_msVtx_nRPC_inwards);
378 fillHits(msVtx,
"nRPC_I", m_msVtx_nRPC_I);
379 fillHits(msVtx,
"nRPC_E", m_msVtx_nRPC_E);
380 fillHits(msVtx,
"nRPC_M", m_msVtx_nRPC_M);
381 fillHits(msVtx,
"nRPC_O", m_msVtx_nRPC_O);
383 fillHits(msVtx,
"nTGC", m_msVtx_nTGC);
384 fillHits(msVtx,
"nTGC_inwards", m_msVtx_nTGC_inwards);
385 fillHits(msVtx,
"nTGC_I", m_msVtx_nTGC_I);
386 fillHits(msVtx,
"nTGC_E", m_msVtx_nTGC_E);
387 fillHits(msVtx,
"nTGC_M", m_msVtx_nTGC_M);
388 fillHits(msVtx,
"nTGC_O", m_msVtx_nTGC_O);
391 size_t nTrk = msVtx->nTrackParticles();
392 m_msVtx_Ntrklet.push_back(nTrk);
394 for(
size_t j=0; j<nTrk; ++j){
396 if (!consti)
continue;
397 m_trklet_vtxLink[consti->
index()] = msVtx->
index();
401 return StatusCode::SUCCESS;
407 if (!m_computeIso)
return StatusCode::SUCCESS;
417 VtxIso iso =
getIso(msVtx, *tracks, *
jets, m_trackIso_pT, m_softTrackIso_R, m_jetIso_pT, m_jetIso_LogRatio);
418 m_msVtx_isoTracks_mindR.push_back(iso.
track_mindR);
419 m_msVtx_isoTracks_pTsum.push_back(iso.
track_pTsum);
420 m_msVtx_isoJets_mindR.push_back(iso.
jet_mindR);
423 return StatusCode::SUCCESS;
430 const EventContext& ctx = Gaudi::Hive::currentContext();
436 ATH_MSG_DEBUG(
"Start to run over event "<<eventInfo->eventNumber()<<
" in run" <<eventInfo->runNumber());
447 return StatusCode::SUCCESS;
455 return StatusCode::SUCCESS;