From f6e095aebb34691b9481f782ce63ca0840855479 Mon Sep 17 00:00:00 2001
From: seley <sinead.mary.eley@cern.ch>
Date: Wed, 24 Jul 2024 17:03:10 +0100
Subject: [PATCH 01/10] truthParticleIsFiducial updated for first 10 truth
 particles and daughters of A'

---
 PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
index 468a6739b..23ab07536 100644
--- a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
+++ b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
@@ -759,6 +759,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()));
 
         if ( particle->hasProdVtx()) {
           m_truth_prod_x.push_back(particle->prodVtx()->x());
@@ -788,6 +789,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());
@@ -805,6 +807,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()));
 
             if ( particle->hasProdVtx()) {
               m_truthd0_x.push_back(particle->prodVtx()->x());
-- 
GitLab


From 51586b309f3157871172108d8df9ea02e7a110bf Mon Sep 17 00:00:00 2001
From: seley <sinead.mary.eley@cern.ch>
Date: Thu, 25 Jul 2024 11:01:51 +0100
Subject: [PATCH 02/10] Updating issue where ntuple maker won't run due to
 issue with ecal container

---
 PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx | 10 +++++-----
 faser-common                                         |  2 +-
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
index 23ab07536..2079edf56 100644
--- a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
+++ b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
@@ -101,7 +101,7 @@ StatusCode NtupleDumperAlg::initialize()
   ATH_CHECK(m_triggerContainer.initialize());
   ATH_CHECK(m_preshowerContainer.initialize());
   ATH_CHECK(m_ecalContainer.initialize());
-  ATH_CHECK(m_ecal2Container.initialize());
+  //ATH_CHECK(m_ecal2Container.initialize());
   ATH_CHECK(m_clusterContainer.initialize());
   ATH_CHECK(m_simDataCollection.initialize());
   ATH_CHECK(m_FaserTriggerData.initialize());
@@ -590,15 +590,15 @@ StatusCode NtupleDumperAlg::execute(const EventContext &ctx) const
   SG::ReadHandle<xAOD::WaveformHitContainer> ecalContainer { m_ecalContainer, ctx };
   ATH_CHECK(ecalContainer.isValid());
 
-  SG::ReadHandle<xAOD::WaveformHitContainer> ecal2Container { m_ecal2Container, ctx };
-  ATH_CHECK(ecal2Container.isValid());
+  //SG::ReadHandle<xAOD::WaveformHitContainer> ecal2Container { m_ecal2Container, ctx };
+  //ATH_CHECK(ecal2Container.isValid());
 
   FillWaveBranches(*vetoNuContainer);
   FillWaveBranches(*vetoContainer);
   FillWaveBranches(*triggerContainer);
   FillWaveBranches(*preshowerContainer);
   FillWaveBranches(*ecalContainer);
-  FillWaveBranches(*ecal2Container);
+  //FillWaveBranches(*ecal2Container);
 
   // if real data, store charge in histograms from random events
   if (!isMC) {
@@ -1313,7 +1313,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));
     }
   }
 
diff --git a/faser-common b/faser-common
index 0a1e6ca7b..89ce6a071 160000
--- a/faser-common
+++ b/faser-common
@@ -1 +1 @@
-Subproject commit 0a1e6ca7be9dbc17b0692f998e36c87541ca8be3
+Subproject commit 89ce6a07128eb2ebc367b6b68f29c9c88220e3e6
-- 
GitLab


From a21b07d7f2fe9f0b6a0048d6d471351d6d3c3be8 Mon Sep 17 00:00:00 2001
From: seley <sinead.mary.eley@cern.ch>
Date: Tue, 20 Aug 2024 12:11:09 +0100
Subject: [PATCH 03/10] Added first 10 MC truth at ST1, ST2, ST3 and updated
 fiducial for d0 [truthd0_isFiducial] ,d1 [truthd1_isFiducial] and first 10 MC
 truth [truth_isFiducial]

---
 .../NtupleDumper/src/NtupleDumperAlg.cxx      | 78 ++++++++++++++++++-
 .../NtupleDumper/src/NtupleDumperAlg.h        | 13 ++++
 2 files changed, 87 insertions(+), 4 deletions(-)

diff --git a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
index 2079edf56..0df49fce4 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 d4fc22b97..762879a5f 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;
-- 
GitLab


From 7d41575822dae630e5ad6b2036dc4375c9e26ac3 Mon Sep 17 00:00:00 2001
From: seley <sinead.mary.eley@cern.ch>
Date: Tue, 20 Aug 2024 12:19:57 +0100
Subject: [PATCH 04/10] Fixed issue with using getTruthMomenta

---
 PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
index 0df49fce4..e24049487 100644
--- a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
+++ b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
@@ -824,7 +824,7 @@ StatusCode NtupleDumperAlg::execute(const EventContext &ctx) const
           m_truth_st_z[station].push_back(positions[station].z());
         }
 
-        auto momenta = m_fiducialParticleTool->getTruthMomenta(truthParticle->barcode());
+        auto momenta = m_fiducialParticleTool->getTruthMomenta(particle->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());
-- 
GitLab


From e9a12a4b0a208f262e4b0b9bb70f573e797f924b Mon Sep 17 00:00:00 2001
From: seley <sinead.mary.eley@cern.ch>
Date: Tue, 20 Aug 2024 14:47:19 +0100
Subject: [PATCH 05/10] Updating trackCollection issue

---
 .../NtupleDumper/src/NtupleDumperAlg.cxx      | 92 +++++++++----------
 .../NtupleDumper/src/NtupleDumperAlg.h        | 12 +--
 2 files changed, 52 insertions(+), 52 deletions(-)

diff --git a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
index e24049487..ae3db7b6d 100644
--- a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
+++ b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
@@ -377,37 +377,37 @@ StatusCode NtupleDumperAlg::initialize()
   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_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_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_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_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_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_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_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]);
+  // 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 
 
@@ -817,19 +817,19 @@ 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 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(particle->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());
-        }
+        // auto momenta = m_fiducialParticleTool->getTruthMomenta(particle->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
@@ -1655,16 +1655,16 @@ NtupleDumperAlg::clearTree() const
   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();
-    }
+  // 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();
diff --git a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h
index 762879a5f..2782faf09 100644
--- a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h
+++ b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h
@@ -380,12 +380,12 @@ 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::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
-- 
GitLab


From 45acb92d0a6b65d98d16ac1ecadf0a18bcfb508b Mon Sep 17 00:00:00 2001
From: seley <sinead.mary.eley@cern.ch>
Date: Tue, 20 Aug 2024 16:26:02 +0100
Subject: [PATCH 06/10] Revert "Updating trackCollection issue"

This reverts commit e9a12a4b0a208f262e4b0b9bb70f573e797f924b.
---
 .../NtupleDumper/src/NtupleDumperAlg.cxx      | 92 +++++++++----------
 .../NtupleDumper/src/NtupleDumperAlg.h        | 12 +--
 2 files changed, 52 insertions(+), 52 deletions(-)

diff --git a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
index ae3db7b6d..e24049487 100644
--- a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
+++ b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
@@ -377,37 +377,37 @@ StatusCode NtupleDumperAlg::initialize()
   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_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_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_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_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_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_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_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]);
+  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 
 
@@ -817,19 +817,19 @@ 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 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(particle->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());
-        // }
+        auto momenta = m_fiducialParticleTool->getTruthMomenta(particle->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
@@ -1655,16 +1655,16 @@ NtupleDumperAlg::clearTree() const
   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();
-  //   }
+  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();
diff --git a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h
index 2782faf09..762879a5f 100644
--- a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h
+++ b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h
@@ -380,12 +380,12 @@ 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::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
-- 
GitLab


From aa3cdc9cbbb5893b3445badb980af55f6c186a13 Mon Sep 17 00:00:00 2001
From: seley <sinead.mary.eley@cern.ch>
Date: Tue, 20 Aug 2024 16:26:20 +0100
Subject: [PATCH 07/10] Revert "Fixed issue with using getTruthMomenta"

This reverts commit 7d41575822dae630e5ad6b2036dc4375c9e26ac3.
---
 PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
index e24049487..0df49fce4 100644
--- a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
+++ b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
@@ -824,7 +824,7 @@ StatusCode NtupleDumperAlg::execute(const EventContext &ctx) const
           m_truth_st_z[station].push_back(positions[station].z());
         }
 
-        auto momenta = m_fiducialParticleTool->getTruthMomenta(particle->barcode());
+        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());
-- 
GitLab


From 6f59743c4a79cf007dea7e75fb9ead176b458a93 Mon Sep 17 00:00:00 2001
From: seley <sinead.mary.eley@cern.ch>
Date: Tue, 20 Aug 2024 16:26:25 +0100
Subject: [PATCH 08/10] Revert "Added first 10 MC truth at ST1, ST2, ST3 and
 updated fiducial for d0 [truthd0_isFiducial] ,d1 [truthd1_isFiducial] and
 first 10 MC truth [truth_isFiducial]"

This reverts commit a21b07d7f2fe9f0b6a0048d6d471351d6d3c3be8.
---
 .../NtupleDumper/src/NtupleDumperAlg.cxx      | 78 +------------------
 .../NtupleDumper/src/NtupleDumperAlg.h        | 13 ----
 2 files changed, 4 insertions(+), 87 deletions(-)

diff --git a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
index 0df49fce4..2079edf56 100644
--- a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
+++ b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
@@ -375,39 +375,6 @@ 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 
 
@@ -426,7 +393,6 @@ 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);
@@ -435,7 +401,6 @@ 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");
@@ -783,9 +748,7 @@ 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;
@@ -796,7 +759,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_truth_isFiducial.push_back(m_fiducialParticleTool->isFiducial(particle->barcode()));
+        m_truthParticleIsFiducial.push_back(m_fiducialParticleTool->isFiducial(particle->barcode()));
 
         if ( particle->hasProdVtx()) {
           m_truth_prod_x.push_back(particle->prodVtx()->x());
@@ -817,20 +780,6 @@ 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 ) {
@@ -840,7 +789,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());
@@ -858,7 +807,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_truthd0_isFiducial.push_back(m_fiducialParticleTool->isFiducial(particle->barcode()));
+            m_truthParticleIsFiducial.push_back(m_fiducialParticleTool->isFiducial(particle->barcode()));
 
             if ( particle->hasProdVtx()) {
               m_truthd0_x.push_back(particle->prodVtx()->x());
@@ -880,9 +829,6 @@ 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());
@@ -1367,7 +1313,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));
     }
   }
 
@@ -1652,20 +1598,6 @@ 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();
@@ -1682,7 +1614,6 @@ 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();
@@ -1691,7 +1622,6 @@ 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 762879a5f..d4fc22b97 100644
--- a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h
+++ b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h
@@ -340,19 +340,16 @@ 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;
@@ -362,8 +359,6 @@ 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;
@@ -380,15 +375,7 @@ 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;
-- 
GitLab


From ecd51e9fd032b0fb0b7e2d92025bd93b03c0834c Mon Sep 17 00:00:00 2001
From: seley <sinead.mary.eley@cern.ch>
Date: Wed, 21 Aug 2024 11:42:09 +0100
Subject: [PATCH 09/10] Added truth_isFiducial , truthd0_isFiducial and
 truthd1_isFiducial

---
 .../NtupleDumper/src/NtupleDumperAlg.cxx          | 15 +++++++++++----
 .../NtupleDumper/src/NtupleDumperAlg.h            |  3 +++
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
index 2079edf56..5b789e0ef 100644
--- a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
+++ b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
@@ -375,6 +375,7 @@ 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);
 
   // for mother + daughter particle truth infomation 
 
@@ -393,6 +394,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 +403,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");
@@ -759,7 +762,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());
@@ -789,7 +792,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 +810,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 +832,7 @@ 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()));
 
             if ( particle->hasProdVtx()) {
               m_truthd1_x.push_back(particle->prodVtx()->x());
@@ -1313,7 +1317,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 +1602,7 @@ NtupleDumperAlg::clearTree() const
   m_truth_dec_x.clear();
   m_truth_dec_y.clear();
   m_truth_dec_z.clear();
+  m_truth_isFiducial.clear();
 
   m_truthM_P.clear();
   m_truthM_px.clear();
@@ -1614,6 +1619,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 +1628,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 d4fc22b97..0786017d3 100644
--- a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h
+++ b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h
@@ -340,6 +340,7 @@ private:
   mutable std::vector<double> m_truthM_z;
 
   mutable std::vector<double> m_truthd0_P;
+  mutable std::vector<bool> m_truthd0_isFiducial; //Boolean for if electron is fiducial
 
   mutable std::vector<double> m_truthd0_px;
   mutable std::vector<double> m_truthd0_py;
@@ -350,6 +351,7 @@ private:
   mutable std::vector<double> m_truthd0_z;
 
   mutable std::vector<double> m_truthd1_P;
+  mutable std::vector<bool> m_truthd1_isFiducial; // Boolean for if positron is fiducial
 
   mutable std::vector<double> m_truthd1_px;
   mutable std::vector<double> m_truthd1_py;
@@ -376,6 +378,7 @@ private:
   mutable std::vector<double> m_truth_prod_z;
 
   mutable std::vector<int> m_truth_pdg; // pdg of first 10 truth particles 
+  mutable std::vector<bool> m_truth_isFiducial; // Boolean for if first 10 truth particles are fiducial
 
   mutable double m_truthLeptonMomentum; 
   mutable int    m_truthBarcode;
-- 
GitLab


From 7b9c90003cb83926267c5cdf9b8c77e66057621d Mon Sep 17 00:00:00 2001
From: seley <sinead.mary.eley@cern.ch>
Date: Fri, 23 Aug 2024 10:26:00 +0100
Subject: [PATCH 10/10] Added truth_st1_x, truth_st1_px etc. for truth
 positions and momenta extrapolated to each station for first 10 MC truth
 particles

---
 .../NtupleDumper/src/NtupleDumperAlg.cxx      | 51 +++++++++++++++++++
 .../NtupleDumper/src/NtupleDumperAlg.h        |  7 +++
 2 files changed, 58 insertions(+)

diff --git a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
index 5b789e0ef..937b2e7e4 100644
--- a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
+++ b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
@@ -377,6 +377,32 @@ StatusCode NtupleDumperAlg::initialize()
   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 
 
   m_tree->Branch("truthM_P", &m_truthM_P);
@@ -764,6 +790,20 @@ StatusCode NtupleDumperAlg::execute(const EventContext &ctx) const
         m_truth_pdg.push_back(particle->pdgId());
         m_truth_isFiducial.push_back(m_fiducialParticleTool->isFiducial(particle->barcode()));
 
+        auto positions = m_fiducialParticleTool->getTruthPositions(particle->barcode()); // Add truth position information at each station
+        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(particle->barcode()); //  Add truth momentum information at each station
+        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());
+        }
+
         if ( particle->hasProdVtx()) {
           m_truth_prod_x.push_back(particle->prodVtx()->x());
           m_truth_prod_y.push_back(particle->prodVtx()->y());
@@ -1604,6 +1644,17 @@ NtupleDumperAlg::clearTree() const
   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();
   m_truthM_py.clear();
diff --git a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h
index 0786017d3..c57c803ce 100644
--- a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h
+++ b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h
@@ -380,6 +380,13 @@ private:
   mutable std::vector<int> m_truth_pdg; // pdg of first 10 truth particles 
   mutable std::vector<bool> m_truth_isFiducial; // Boolean for if first 10 truth particles are fiducial
 
+  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
+  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
+  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
+  mutable std::array<std::vector<double>, 4> m_truth_st_px; // x components of the true momentum at each station
+  mutable std::array<std::vector<double>, 4> m_truth_st_py; // y components of the true momentum at each station
+  mutable std::array<std::vector<double>, 4> m_truth_st_pz; // z components of the true momentum at each station
+
   mutable double m_truthLeptonMomentum; 
   mutable int    m_truthBarcode;
   mutable int    m_truthPdg;
-- 
GitLab