diff --git a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx index 2079edf56b82552c564f1a28d19af9c56e9223e7..0df49fce419154eb46a24f24cc46920349874d41 100644 --- a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx +++ b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx @@ -375,6 +375,39 @@ StatusCode NtupleDumperAlg::initialize() m_tree->Branch("truth_dec_x", &m_truth_dec_x); m_tree->Branch("truth_dec_y", &m_truth_dec_y); m_tree->Branch("truth_dec_z", &m_truth_dec_z); + m_tree->Branch("truth_isFiducial", &m_truth_isFiducial); + + m_tree->Branch("truth_st0_x", &m_truth_st_x[0]); + m_tree->Branch("truth_st0_y", &m_truth_st_y[0]); + m_tree->Branch("truth_st0_z", &m_truth_st_z[0]); + + m_tree->Branch("truth_st1_x", &m_truth_st_x[1]); + m_tree->Branch("truth_st1_y", &m_truth_st_y[1]); + m_tree->Branch("truth_st1_z", &m_truth_st_z[1]); + + m_tree->Branch("truth_st2_x", &m_truth_st_x[2]); + m_tree->Branch("truth_st2_y", &m_truth_st_y[2]); + m_tree->Branch("truth_st2_z", &m_truth_st_z[2]); + + m_tree->Branch("truth_st3_x", &m_truth_st_x[3]); + m_tree->Branch("truth_st3_y", &m_truth_st_y[3]); + m_tree->Branch("truth_st3_z", &m_truth_st_z[3]); + + m_tree->Branch("truth_st0_px", &m_truth_st_px[0]); + m_tree->Branch("truth_st0_py", &m_truth_st_py[0]); + m_tree->Branch("truth_st0_pz", &m_truth_st_pz[0]); + + m_tree->Branch("truth_st1_px", &m_truth_st_px[1]); + m_tree->Branch("truth_st1_py", &m_truth_st_py[1]); + m_tree->Branch("truth_st1_pz", &m_truth_st_pz[1]); + + m_tree->Branch("truth_st2_px", &m_truth_st_px[2]); + m_tree->Branch("truth_st2_py", &m_truth_st_py[2]); + m_tree->Branch("truth_st2_pz", &m_truth_st_pz[2]); + + m_tree->Branch("truth_st3_px", &m_truth_st_px[3]); + m_tree->Branch("truth_st3_py", &m_truth_st_py[3]); + m_tree->Branch("truth_st3_pz", &m_truth_st_pz[3]); // for mother + daughter particle truth infomation @@ -393,6 +426,7 @@ StatusCode NtupleDumperAlg::initialize() 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("truthd0_isFiducial", &m_truthd0_isFiducial); m_tree->Branch("truthd1_P", &m_truthd1_P); m_tree->Branch("truthd1_px", &m_truthd1_px); @@ -401,6 +435,7 @@ StatusCode NtupleDumperAlg::initialize() m_tree->Branch("truthd1_x", &m_truthd1_x); m_tree->Branch("truthd1_y", &m_truthd1_y); m_tree->Branch("truthd1_z", &m_truthd1_z); + m_tree->Branch("truthd1_isFiducial", &m_truthd1_isFiducial); m_tree->Branch("vertex_x", &m_vertex_x, "vertex_x/D"); m_tree->Branch("vertex_y", &m_vertex_y, "vertex_y/D"); @@ -748,7 +783,9 @@ StatusCode NtupleDumperAlg::execute(const EventContext &ctx) const // Find truth particle information SG::ReadHandle<xAOD::TruthParticleContainer> truthParticleContainer { m_truthParticleContainer, ctx }; + if (truthParticleContainer.isValid() && truthParticleContainer->size() > 0) { + int ipart(0); for (auto particle : *truthParticleContainer) { // loop over first 10 truth particles (for non A' samples) if (ipart++ > 9) break; @@ -759,7 +796,7 @@ StatusCode NtupleDumperAlg::execute(const EventContext &ctx) const m_truth_pz.push_back(particle->p4().Z()); m_truth_m.push_back(particle->m()); m_truth_pdg.push_back(particle->pdgId()); - m_truthParticleIsFiducial.push_back(m_fiducialParticleTool->isFiducial(particle->barcode())); + m_truth_isFiducial.push_back(m_fiducialParticleTool->isFiducial(particle->barcode())); if ( particle->hasProdVtx()) { m_truth_prod_x.push_back(particle->prodVtx()->x()); @@ -780,6 +817,20 @@ StatusCode NtupleDumperAlg::execute(const EventContext &ctx) const m_truth_dec_y.push_back(999999); m_truth_dec_z.push_back(999999); } + auto positions = m_fiducialParticleTool->getTruthPositions(particle->barcode()); + for (int station = 0; station < 4; ++station) { + m_truth_st_x[station].push_back(positions[station].x()); + m_truth_st_y[station].push_back(positions[station].y()); + m_truth_st_z[station].push_back(positions[station].z()); + } + + auto momenta = m_fiducialParticleTool->getTruthMomenta(truthParticle->barcode()); + for (int station = 0; station < 4; ++station) { + m_truth_st_px[station].push_back(momenta[station].x()); + m_truth_st_py[station].push_back(momenta[station].y()); + m_truth_st_pz[station].push_back(momenta[station].z()); + } + // Find the M d0 and d1 truth information for dark photon if ( particle->barcode() == 1 || particle->barcode() == 2 || particle->barcode() == 3 ) { @@ -789,7 +840,7 @@ StatusCode NtupleDumperAlg::execute(const EventContext &ctx) const m_truthM_px.push_back(particle->p4().X()); m_truthM_py.push_back(particle->p4().Y()); m_truthM_pz.push_back(particle->p4().Z()); - m_truthParticleIsFiducial.push_back(m_fiducialParticleTool->isFiducial(particle->barcode())); + if ( particle->hasDecayVtx()) { // decay vertex for A' particle m_truthM_x.push_back(particle->decayVtx()->x()); @@ -807,7 +858,7 @@ StatusCode NtupleDumperAlg::execute(const EventContext &ctx) const m_truthd0_px.push_back(particle->p4().X()); m_truthd0_py.push_back(particle->p4().Y()); m_truthd0_pz.push_back(particle->p4().Z()); - m_truthParticleIsFiducial.push_back(m_fiducialParticleTool->isFiducial(particle->barcode())); + m_truthd0_isFiducial.push_back(m_fiducialParticleTool->isFiducial(particle->barcode())); if ( particle->hasProdVtx()) { m_truthd0_x.push_back(particle->prodVtx()->x()); @@ -829,6 +880,9 @@ StatusCode NtupleDumperAlg::execute(const EventContext &ctx) const m_truthd1_px.push_back(particle->p4().X()); m_truthd1_py.push_back(particle->p4().Y()); m_truthd1_pz.push_back(particle->p4().Z()); + m_truthd1_isFiducial.push_back(m_fiducialParticleTool->isFiducial(particle->barcode())); + //m_isFiducial.push_back(m_fiducialParticleTool->isFiducial(truthParticle->barcode())); + if ( particle->hasProdVtx()) { m_truthd1_x.push_back(particle->prodVtx()->x()); @@ -1313,7 +1367,7 @@ StatusCode NtupleDumperAlg::execute(const EventContext &ctx) const for (auto &tp : truthParticleCount) { m_truthParticleBarcode.push_back(tp.first); m_truthParticleMatchedTracks.push_back(tp.second); - //m_truthParticleIsFiducial.push_back(m_fiducialParticleTool->isFiducial(tp.first)); + m_truthParticleIsFiducial.push_back(m_fiducialParticleTool->isFiducial(tp.first)); } } @@ -1598,6 +1652,20 @@ NtupleDumperAlg::clearTree() const m_truth_dec_x.clear(); m_truth_dec_y.clear(); m_truth_dec_z.clear(); + m_truth_isFiducial.clear(); + + + for (int station = 0; station < 4; ++station) { + m_truth_st_x[station].clear(); + m_truth_st_y[station].clear(); + m_truth_st_z[station].clear(); + } + for (int station = 0; station < 4; ++station) { + m_truth_st_px[station].clear(); + m_truth_st_py[station].clear(); + m_truth_st_pz[station].clear(); + } + m_truthM_P.clear(); m_truthM_px.clear(); @@ -1614,6 +1682,7 @@ NtupleDumperAlg::clearTree() const m_truthd0_x.clear(); m_truthd0_y.clear(); m_truthd0_z.clear(); + m_truthd0_isFiducial.clear(); m_truthd1_P.clear(); m_truthd1_px.clear(); @@ -1622,6 +1691,7 @@ NtupleDumperAlg::clearTree() const m_truthd1_x.clear(); m_truthd1_y.clear(); m_truthd1_z.clear(); + m_truthd1_isFiducial.clear(); m_vertex_x = NaN; m_vertex_y = NaN; diff --git a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h index d4fc22b9754617ea8c68aba3c365ef334abd0d5d..762879a5f65b1541bd989405af8b647c4e20192c 100644 --- a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h +++ b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h @@ -340,16 +340,19 @@ private: mutable std::vector<double> m_truthM_z; mutable std::vector<double> m_truthd0_P; + mutable std::vector<bool> m_truthd0_isFiducial; // isFiducial applied to daughter of A' [Electron] 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; // production vertex for daughter particles mutable std::vector<double> m_truthd0_y; mutable std::vector<double> m_truthd0_z; mutable std::vector<double> m_truthd1_P; + mutable std::vector<bool> m_truthd1_isFiducial; // isFiducial applied to daughter of A' [Positron] mutable std::vector<double> m_truthd1_px; mutable std::vector<double> m_truthd1_py; @@ -359,6 +362,8 @@ private: mutable std::vector<double> m_truthd1_y; mutable std::vector<double> m_truthd1_z; + + // first 10 truth particles mutable std::vector<double> m_truth_P; @@ -375,7 +380,15 @@ private: mutable std::vector<double> m_truth_prod_y; mutable std::vector<double> m_truth_prod_z; + mutable std::array<std::vector<double>, 4> m_truth_st_x; // vector of the x components of the simulated hits of the truth particle for each station [first 10 MC particles] + mutable std::array<std::vector<double>, 4> m_truth_st_y; // vector of the y components of the simulated hits of the truth particle for each station [first 10 MC particles] + mutable std::array<std::vector<double>, 4> m_truth_st_z; // vector of the z components of the simulated hits of the truth particle for each station [first 10 MC particles] + mutable std::array<std::vector<double>, 4> m_truth_st_px; // x components of the true momentum at each station [first 10 MC particles] + mutable std::array<std::vector<double>, 4> m_truth_st_py; // y components of the true momentum at each station [first 10 MC particles] + mutable std::array<std::vector<double>, 4> m_truth_st_pz; // z components of the true momentum at each station [first 10 MC particles] + mutable std::vector<int> m_truth_pdg; // pdg of first 10 truth particles + mutable std::vector<bool> m_truth_isFiducial; /// Vector of boolean showing whether a truth particle is fiducial for the first 10 particles mutable double m_truthLeptonMomentum; mutable int m_truthBarcode;