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;