ATLAS Offline Software
Loading...
Searching...
No Matches
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
16template<class EnumType>
18public:
19 using Categories = EnumType;
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
46
47 //increment event count
48 void
52
53 //return number of events
54 int
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 //
79 void incrementCounterByRegion(Categories categoryIdx,const Trk::Track* track){
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
118private:
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
static Double_t a
if(febId1==febId2)
std::array< std::array< int, nRegions >, static_cast< size_t >(Categories::kNCounter)> m_counter
std::optional< size_t > etaBin(const double val)
void newEvent()
Definition AmbiCounter.h:49
void incrementCounterByRegion(Categories categoryIdx, const Trk::Track *track)
Definition AmbiCounter.h:79
void increment(Categories category, unsigned int etaBinIdx)
Definition AmbiCounter.h:60
size_t idx(const Categories &categoryIndex) const
Definition AmbiCounter.h:38
std::string dumpRegions(const std::string &head, Categories categoryIdx, const int iw=9) const
Definition AmbiCounter.h:99
int numberOfEvents() const
Definition AmbiCounter.h:55
int globalCount(GlobalCounterIndices i) const
EnumType Categories
Definition AmbiCounter.h:19
std::array< int, nGlobalCounters > m_globalCounter
AmbiCounter< EnumType > & operator+=(const AmbiCounter< EnumType > &a)
Definition AmbiCounter.h:67
AmbiCounter(const std::vector< float > &eta_bounds)
Definition AmbiCounter.h:28
void resetGlobalCounters()
Definition AmbiCounter.h:43
const std::vector< float > & m_etaBounds
std::string head(std::string s, const std::string &pattern)
head of a string