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