From ed08de7aa389bdc0a06c98d71fef43a0f99a1d56 Mon Sep 17 00:00:00 2001 From: Lottie Cavanagh <ccavanagh@hep.ph.liv.ac.uk> Date: Tue, 29 Nov 2022 16:12:04 +0000 Subject: [PATCH] Adding truth information for dark photon mc samples --- .../NtupleDumper/src/NtupleDumperAlg.cxx | 93 +++++++++++++++++-- .../NtupleDumper/src/NtupleDumperAlg.h | 33 +++++++ 2 files changed, 117 insertions(+), 9 deletions(-) diff --git a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx index 587a894b..bb314c92 100644 --- a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx +++ b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx @@ -266,6 +266,32 @@ StatusCode NtupleDumperAlg::initialize() m_tree->Branch("truthPdg", &m_truthPdg, "truthPdg/I"); m_tree->Branch("CrossSection", &m_crossSection, "crossSection/D"); + // for mother + daughter particle truth infomation + + m_tree->Branch("truthM_P", &m_truthM_P); + m_tree->Branch("truthM_px", &m_truthM_px); + m_tree->Branch("truthM_py", &m_truthM_py); + m_tree->Branch("truthM_pz", &m_truthM_pz); + m_tree->Branch("truthM_x", &m_truthM_x); + m_tree->Branch("truthM_y", &m_truthM_y); + m_tree->Branch("truthM_z", &m_truthM_z); + + m_tree->Branch("truthd0_P", &m_truthd0_P); + m_tree->Branch("truthd0_px", &m_truthd0_px); + m_tree->Branch("truthd0_py", &m_truthd0_py); + m_tree->Branch("truthd0_pz", &m_truthd0_pz); + m_tree->Branch("truthd0_x", &m_truthd0_x); + m_tree->Branch("truthd0_y", &m_truthd0_y); + m_tree->Branch("truthd0_z", &m_truthd0_z); + + m_tree->Branch("truthd1_P", &m_truthd1_P); + m_tree->Branch("truthd1_px", &m_truthd1_px); + m_tree->Branch("truthd1_py", &m_truthd1_py); + m_tree->Branch("truthd1_pz", &m_truthd1_pz); + m_tree->Branch("truthd1_x", &m_truthd1_x); + m_tree->Branch("truthd1_y", &m_truthd1_y); + m_tree->Branch("truthd1_z", &m_truthd1_z); + ATH_CHECK(histSvc()->regTree("/HIST2/tree", m_tree)); // Register histograms @@ -412,20 +438,69 @@ StatusCode NtupleDumperAlg::execute(const EventContext &ctx) const m_crossSection = m_baseEventCrossSection; } - // Find the primary lepton (if any) + // Find the M d0 and d1 truth information SG::ReadHandle<xAOD::TruthParticleContainer> truthParticleContainer { m_truthParticleContainer, ctx }; if (truthParticleContainer.isValid() && truthParticleContainer->size() > 0) { for (auto particle : *truthParticleContainer) { - if ( particle->absPdgId() == 11 || particle->absPdgId() == 13 || particle->absPdgId() == 15 ) + if ( particle->barcode() <= 3) { - if (particle->status() == 1 && (particle->nParents() == 0 || particle->nParents() == 2) ) - { - m_truthLeptonMomentum = particle->p4().P(); - break; - } - } + + if ( particle->barcode() == 1) // mother particle (A') + { + + m_truthM_P.push_back(particle->p4().P()); + m_truthM_px.push_back(particle->p4().X()); + m_truthM_py.push_back(particle->p4().Y()); + m_truthM_pz.push_back(particle->p4().Z()); + + if ( particle->hasProdVtx()) { + m_truthM_x.push_back(particle->prodVtx()->x()); + m_truthM_y.push_back(particle->prodVtx()->y()); + m_truthM_z.push_back(particle->prodVtx()->z()); + } else { + m_truthM_x.push_back(-999999); + m_truthM_y.push_back(-999999); + m_truthM_z.push_back(-999999); + } + + } + if ( particle->pdgId() == 11) // daughter particle (positron) + { + m_truthd0_P.push_back(particle->p4().P()); + m_truthd0_px.push_back(particle->p4().X()); + m_truthd0_py.push_back(particle->p4().Y()); + m_truthd0_pz.push_back(particle->p4().Z()); + + if ( particle->hasProdVtx()) { + m_truthd0_x.push_back(particle->prodVtx()->x()); + m_truthd0_y.push_back(particle->prodVtx()->y()); + m_truthd0_z.push_back(particle->prodVtx()->z()); + } else { + m_truthd0_x.push_back(-999999); + m_truthd0_y.push_back(-999999); + m_truthd0_z.push_back(-999999); + } + } + if ( particle->pdgId() == -11) // daughter particle (electron) + { + m_truthd1_P.push_back(particle->p4().P()); + m_truthd1_px.push_back(particle->p4().X()); + m_truthd1_py.push_back(particle->p4().Y()); + m_truthd1_pz.push_back(particle->p4().Z()); + + if ( particle->hasProdVtx()) { + m_truthd1_x.push_back(particle->prodVtx()->x()); + m_truthd1_y.push_back(particle->prodVtx()->y()); + m_truthd1_z.push_back(particle->prodVtx()->z()); + } else { + m_truthd1_x.push_back(-999999); + m_truthd1_y.push_back(-999999); + m_truthd1_z.push_back(-999999); + } + } + } } } } @@ -1049,4 +1124,4 @@ void NtupleDumperAlg::setNaN() const { m_t_st_z[station].push_back(NaN); } m_isFiducial.push_back(false); -} \ No newline at end of file +} diff --git a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h index fb805829..e079a32e 100644 --- a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h +++ b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h @@ -126,6 +126,7 @@ private: mutable float m_calo_total; mutable float m_calo_rawtotal; + mutable float m_Calo0_Edep; mutable float m_Calo1_Edep; mutable float m_Calo2_Edep; @@ -237,6 +238,38 @@ private: mutable std::vector<int> m_truthParticleMatchedTracks; // vector of number of tracks to which a truth particle is matched to mutable std::vector<bool> m_truthParticleIsFiducial; // vector of boolean showing whether a truth particle is fiducial + // mother + daughter truth information + + mutable std::vector<double> m_truthM_P; + + mutable std::vector<double> m_truthM_px; + mutable std::vector<double> m_truthM_py; + mutable std::vector<double> m_truthM_pz; + + mutable std::vector<double> m_truthM_x; + mutable std::vector<double> m_truthM_y; + mutable std::vector<double> m_truthM_z; + + mutable std::vector<double> m_truthd0_P; + + mutable std::vector<double> m_truthd0_px; + mutable std::vector<double> m_truthd0_py; + mutable std::vector<double> m_truthd0_pz; + + mutable std::vector<double> m_truthd0_x; + mutable std::vector<double> m_truthd0_y; + mutable std::vector<double> m_truthd0_z; + + mutable std::vector<double> m_truthd1_P; + + mutable std::vector<double> m_truthd1_px; + mutable std::vector<double> m_truthd1_py; + mutable std::vector<double> m_truthd1_pz; + + mutable std::vector<double> m_truthd1_x; + mutable std::vector<double> m_truthd1_y; + mutable std::vector<double> m_truthd1_z; + mutable double m_truthLeptonMomentum; mutable int m_truthBarcode; mutable int m_truthPdg; -- GitLab