ATLAS Offline Software
AmbiCounter.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #ifndef TrkAmbiguityProcessor_AmbiCounter_icc
6 #define TrkAmbiguityProcessor_AmbiCounter_icc
7 #include <array>
8 #include <numeric>
9 #include <vector>
10 #include <string>
11 #include "TrkTrack/Track.h"
12 #include <stdexcept>
13 #include <algorithm>
14 #include <optional>
15 
16 template<class EnumType>
17 class AmbiCounter {
18 public:
19  using Categories = EnumType;
26  };
27  //
28  AmbiCounter(const std::vector<float> &eta_bounds): m_etaBounds(eta_bounds){
29  const std::string errMsgPrefix = "In AmbiCounter.icc, eta_bounds size must be ";
30  if (m_etaBounds.size()!=nRegions) throw std::runtime_error(errMsgPrefix + std::to_string(nRegions) + " elements long.");
31  if (not std::is_sorted(m_etaBounds.begin(), m_etaBounds.end())){
32  throw std::runtime_error(errMsgPrefix + "in ascending order.");
33  }
34  }
35 
36  //convert Category to array index
37  size_t
38  idx(const Categories & categoryIndex) const{
39  return static_cast<size_t>(categoryIndex);
40  }
41 
42  void
44  m_globalCounter.fill(0);
45  }
46 
47  //increment event count
48  void
51  }
52 
53  //return number of events
54  int
55  numberOfEvents() const{
56  return m_globalCounter[nEvents];
57  }
58  // increment one bin
59  void
60  increment(Categories category, unsigned int etaBinIdx) {
61  if ((category>= Categories::kNCounter) or (etaBinIdx >=nRegions)){
62  throw std::out_of_range("in AmbiCounter.icc::increment()");
63  }
64  ++m_counter[idx(category)][etaBinIdx];
65  }
66  //
68  for (unsigned int i=0; i<nGlobalCounters; ++i) {
69  m_globalCounter[i]+= a.m_globalCounter[i];
70  }
71  for (size_t categoryIdx=0; categoryIdx < idx(Categories::kNCounter); ++categoryIdx) {
72  for (unsigned int etaBinIdx=0; etaBinIdx < a.m_counter[categoryIdx].size(); ++etaBinIdx) {
73  m_counter[categoryIdx][etaBinIdx] += a.m_counter[categoryIdx][etaBinIdx];
74  }
75  }
76  return *this;
77 }
78  //
80  // test
81  if (!track) {
83  return;
84  }
85  // use first parameter
86  if (!track->trackParameters()) {
88  } else {
89  std::array<int, nRegions> &nTracks = m_counter.at(idx(categoryIdx));
90  // @TODO make sure that list of track parameters is not empty
91  const double absEta = std::abs(track->trackParameters()->front()->eta());
92  if (const auto &possibleIdx{etaBin(absEta)}){//i.e. if it's within bounds
93  ++nTracks[possibleIdx.value()];
94  }
95  }
96  }
97  //
98  std::string
99  dumpRegions(const std::string & head,Categories categoryIdx, const int iw =9) const {
100  std::stringstream out;
101  out << head;
102  if (categoryIdx >= Categories::kNCounter) throw std::out_of_range("Array index out of range in AmbiCounter::inc by region");
103  const auto & displayedArray = m_counter[idx(categoryIdx)];
104  const auto allRegionCounts = std::accumulate(displayedArray.begin(), displayedArray.end(),0);
105  out << std::setiosflags(std::ios::dec) << std::setw(iw) << allRegionCounts;
106  for (unsigned int etaBinIdx=0; etaBinIdx < nRegions; ++etaBinIdx) {
107  out << std::setiosflags(std::ios::dec) << std::setw(iw) << m_counter[idx(categoryIdx)][etaBinIdx];
108  }
109  out << "\n";
110  return out.str();
111  }
112  //
113  int
115  return m_globalCounter[i];
116  }
117 
118 private:
119  std::array<std::array<int, nRegions>,static_cast<size_t>(Categories::kNCounter)> m_counter{};
120  std::array<int,nGlobalCounters> m_globalCounter{};
121  const std::vector<float> &m_etaBounds;
122  std::optional<size_t>
123  etaBin(const double val){
124  auto pVal = std::lower_bound(m_etaBounds.begin(), m_etaBounds.end(), val);
125  //if it's in bounds, return the value, otherwise return a nullopt
126  return (pVal!=m_etaBounds.end()) ? std::optional<size_t>(std::distance(m_etaBounds.begin(), pVal)):std::nullopt;
127  }
128 };
129 
130 #endif
AmbiCounter::iEndcap
@ iEndcap
Definition: AmbiCounter.h:20
AmbiCounter::iFWD
@ iFWD
Definition: AmbiCounter.h:20
Trk::Track
The ATLAS Track class.
Definition: Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h:73
AmbiCounter::idx
size_t idx(const Categories &categoryIndex) const
Definition: AmbiCounter.h:38
runITkAlign.accumulate
accumulate
Update flags based on parser line args.
Definition: runITkAlign.py:62
AmbiCounter::RegionIndex
RegionIndex
Definition: AmbiCounter.h:20
AmbiCounter::iForwrd
@ iForwrd
Definition: AmbiCounter.h:20
AmbiCounter::nInvalidTracks
@ nInvalidTracks
Definition: AmbiCounter.h:23
AmbiCounter::incrementCounterByRegion
void incrementCounterByRegion(Categories categoryIdx, const Trk::Track *track)
Definition: AmbiCounter.h:79
python.AthDsoLogger.out
out
Definition: AthDsoLogger.py:70
AmbiCounter::iTransi
@ iTransi
Definition: AmbiCounter.h:20
AmbiCounter::globalCount
int globalCount(GlobalCounterIndices i) const
Definition: AmbiCounter.h:114
AmbiCounter::nRegions
@ nRegions
Definition: AmbiCounter.h:20
Track.h
AmbiCounter::m_globalCounter
std::array< int, nGlobalCounters > m_globalCounter
Definition: AmbiCounter.h:120
AmbiCounter::nTracksWithoutParam
@ nTracksWithoutParam
Definition: AmbiCounter.h:24
AmbiCounter::resetGlobalCounters
void resetGlobalCounters()
Definition: AmbiCounter.h:43
AmbiCounter::GlobalCounterIndices
GlobalCounterIndices
Definition: AmbiCounter.h:21
AmbiCounter::newEvent
void newEvent()
Definition: AmbiCounter.h:49
lumiFormat.i
int i
Definition: lumiFormat.py:85
ReweightUtils.category
category
Definition: ReweightUtils.py:15
AmbiCounter::m_counter
std::array< std::array< int, nRegions >, static_cast< size_t >Categories::kNCounter)> m_counter
Definition: AmbiCounter.h:119
AmbiCounter::etaBin
std::optional< size_t > etaBin(const double val)
Definition: AmbiCounter.h:123
AmbiCounter::numberOfEvents
int numberOfEvents() const
Definition: AmbiCounter.h:55
head
std::string head(std::string s, const std::string &pattern)
head of a string
Definition: computils.cxx:312
AmbiCounter::nGlobalCounters
@ nGlobalCounters
Definition: AmbiCounter.h:25
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
AmbiCounter::nEvents
@ nEvents
Definition: AmbiCounter.h:22
AmbiCounter::increment
void increment(Categories category, unsigned int etaBinIdx)
Definition: AmbiCounter.h:60
AmbiCounter::AmbiCounter
AmbiCounter(const std::vector< float > &eta_bounds)
Definition: AmbiCounter.h:28
AmbiCounter::iBarrel
@ iBarrel
Definition: AmbiCounter.h:20
a
TList * a
Definition: liststreamerinfos.cxx:10
Pythia8_RapidityOrderMPI.val
val
Definition: Pythia8_RapidityOrderMPI.py:14
AmbiCounter::dumpRegions
std::string dumpRegions(const std::string &head, Categories categoryIdx, const int iw=9) const
Definition: AmbiCounter.h:99
AmbiCounter::m_etaBounds
const std::vector< float > & m_etaBounds
eta intervals for internal monitoring
Definition: AmbiCounter.h:121
TauScalarVars::absEta
bool absEta(const xAOD::TauJet &tau, float &out)
Definition: TauGNNDataLoader.cxx:118
xAOD::track
@ track
Definition: TrackingPrimitives.h:513
AmbiCounter::operator+=
AmbiCounter< EnumType > & operator+=(const AmbiCounter< EnumType > &a)
Definition: AmbiCounter.h:67
Amg::distance
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space
Definition: GeoPrimitivesHelpers.h:54
AmbiCounter::Categories
EnumType Categories
Definition: AmbiCounter.h:19
AmbiCounter
Definition: AmbiCounter.h:17