From 00db9e0ba41f0395c48f823c62f9e34b73e3b524 Mon Sep 17 00:00:00 2001
From: Tobias Boeckh <boeckh.tobias@gmail.com>
Date: Thu, 14 Sep 2023 11:31:43 +0200
Subject: [PATCH] Add bitset showing which layers have a hit on track, module
 row, and module column to NtupleDumperAlg

---
 .../NtupleDumper/src/NtupleDumperAlg.cxx         | 16 ++++++++++++++++
 .../NtupleDumper/src/NtupleDumperAlg.h           |  6 ++++++
 2 files changed, 22 insertions(+)

diff --git a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
index 1fc059dc..30d9ac17 100644
--- a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
+++ b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
@@ -225,6 +225,9 @@ StatusCode NtupleDumperAlg::initialize()
   m_tree->Branch("longTracks", &m_longTracks, "longTracks/I");
   m_tree->Branch("Track_Chi2", &m_Chi2);
   m_tree->Branch("Track_nDoF", &m_DoF);
+  m_tree->Branch("Track_eta", &m_eta);
+  m_tree->Branch("Track_hitSet", &m_hitSet);
+  m_tree->Branch("Track_phi", &m_phi);
   m_tree->Branch("Track_x0", &m_xup);
   m_tree->Branch("Track_y0", &m_yup);
   m_tree->Branch("Track_z0", &m_zup);
@@ -912,16 +915,20 @@ StatusCode NtupleDumperAlg::execute(const EventContext &ctx) const
     std::set<std::pair<int, int>> layerMap;
     std::set<int> stationMap;
     // Check for hit in the three downstream stations
+    HitSet hitSet {24};
     for (auto measurement : *(track->measurementsOnTrack())) {
         const Tracker::FaserSCT_ClusterOnTrack* cluster = dynamic_cast<const Tracker::FaserSCT_ClusterOnTrack*>(measurement);
         if (cluster != nullptr) {
             Identifier id = cluster->identify();
             int station = m_sctHelper->station(id);
             int layer = m_sctHelper->layer(id);
+            int side = m_sctHelper->side(id);
             stationMap.emplace(station);
             layerMap.emplace(station, layer);
+            hitSet.set(23 - (station * 6 + layer * 2 + side));
         }
     }
+    m_hitSet.push_back(hitSet.to_ulong());
     if (stationMap.count(1) == 0 || stationMap.count(2) == 0 || stationMap.count(3) == 0) continue;
 
     const Trk::TrackParameters* upstreamParameters = track->trackParameters()->front();
@@ -933,6 +940,12 @@ StatusCode NtupleDumperAlg::execute(const EventContext &ctx) const
 
     m_Chi2.push_back(track->fitQuality()->chiSquared());
     m_DoF.push_back(track->fitQuality()->numberDoF());
+    const Trk::MeasurementBase *measurement = track->measurementsOnTrack()->front();
+    const Tracker::FaserSCT_ClusterOnTrack* cluster =
+      dynamic_cast<const Tracker::FaserSCT_ClusterOnTrack*>(measurement);
+    Identifier id = cluster->identify();
+    m_eta.push_back(m_sctHelper->eta_module(id));
+    m_phi.push_back(m_sctHelper->phi_module(id));
 
     m_nHit0.push_back(stationMap.count(0));
     m_nHit1.push_back(stationMap.count(1));
@@ -1418,6 +1431,9 @@ NtupleDumperAlg::clearTree() const
 
   m_Chi2.clear();
   m_DoF.clear();
+  m_eta.clear();
+  m_phi.clear();
+  m_hitSet.clear();
   m_charge.clear();
   m_nLayers.clear();
   m_longTracks = 0;
diff --git a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h
index 475378c1..5a75b0bb 100644
--- a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h
+++ b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h
@@ -24,10 +24,13 @@
 #include "xAODEventInfo/EventInfo.h"
 #include "StoreGate/ReadDecorHandle.h"
 #include "FaserActsVertexing/IVertexingTool.h"
+#include <boost/dynamic_bitset.hpp>
 
 #include <vector>
 #include <nlohmann/json.hpp>
 
+using HitSet = boost::dynamic_bitset<>;
+
 class TTree;
 class TH1;
 class FaserSCT_ID;
@@ -225,6 +228,9 @@ private:
 
   mutable int    m_longTracks;
   mutable int m_propagationError;
+  mutable std::vector<int> m_eta;
+  mutable std::vector<int> m_phi;
+  mutable std::vector<unsigned long> m_hitSet;
   mutable std::vector<double> m_Chi2;
   mutable std::vector<double> m_DoF;
   mutable std::vector<double> m_xup;
-- 
GitLab