ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
Tracking
TrkTools
TrkAmbiguityProcessor
src
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;
20
enum
RegionIndex
{
iBarrel
,
iTransi
,
iEndcap
,
iFWD
= 3,
nRegions
=4,
iForwrd
= 3};
21
enum
GlobalCounterIndices
{
22
nEvents
,
23
nInvalidTracks
,
24
nTracksWithoutParam
,
25
nGlobalCounters
,
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
43
resetGlobalCounters
(){
44
m_globalCounter
.fill(0);
45
}
46
47
//increment event count
48
void
49
newEvent
(){
50
++
m_globalCounter
[
nEvents
];
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
//
67
AmbiCounter<EnumType>
&
operator +=
(
const
AmbiCounter<EnumType>
&
a
) {
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) {
82
++
m_globalCounter
[
nInvalidTracks
];
83
return
;
84
}
85
// use first parameter
86
if
(!track->trackParameters()) {
87
++
m_globalCounter
[
nTracksWithoutParam
];
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
114
globalCount
(
GlobalCounterIndices
i)
const
{
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
a
static Double_t a
Definition
LArPhysWaveHECTool.cxx:38
if
if(pathvar)
Definition
SealSharedLib.cxx:168
Track.h
AmbiCounter< CounterIndex >::m_counter
std::array< std::array< int, nRegions >, static_cast< size_t >(Categories::kNCounter)> m_counter
Definition
AmbiCounter.h:119
AmbiCounter< CounterIndex >::RegionIndex
RegionIndex
Definition
AmbiCounter.h:20
AmbiCounter< CounterIndex >::iBarrel
@ iBarrel
Definition
AmbiCounter.h:20
AmbiCounter< CounterIndex >::iFWD
@ iFWD
Definition
AmbiCounter.h:20
AmbiCounter< CounterIndex >::iTransi
@ iTransi
Definition
AmbiCounter.h:20
AmbiCounter< CounterIndex >::nRegions
@ nRegions
Definition
AmbiCounter.h:20
AmbiCounter< CounterIndex >::iEndcap
@ iEndcap
Definition
AmbiCounter.h:20
AmbiCounter< CounterIndex >::iForwrd
@ iForwrd
Definition
AmbiCounter.h:20
AmbiCounter::etaBin
std::optional< size_t > etaBin(const double val)
Definition
AmbiCounter.h:123
AmbiCounter::newEvent
void newEvent()
Definition
AmbiCounter.h:49
AmbiCounter::incrementCounterByRegion
void incrementCounterByRegion(Categories categoryIdx, const Trk::Track *track)
Definition
AmbiCounter.h:79
AmbiCounter::increment
void increment(Categories category, unsigned int etaBinIdx)
Definition
AmbiCounter.h:60
AmbiCounter::idx
size_t idx(const Categories &categoryIndex) const
Definition
AmbiCounter.h:38
AmbiCounter::GlobalCounterIndices
GlobalCounterIndices
Definition
AmbiCounter.h:21
AmbiCounter< CounterIndex >::nInvalidTracks
@ nInvalidTracks
Definition
AmbiCounter.h:23
AmbiCounter< CounterIndex >::nEvents
@ nEvents
Definition
AmbiCounter.h:22
AmbiCounter< CounterIndex >::nTracksWithoutParam
@ nTracksWithoutParam
Definition
AmbiCounter.h:24
AmbiCounter< CounterIndex >::nGlobalCounters
@ nGlobalCounters
Definition
AmbiCounter.h:25
AmbiCounter::dumpRegions
std::string dumpRegions(const std::string &head, Categories categoryIdx, const int iw=9) const
Definition
AmbiCounter.h:99
AmbiCounter::numberOfEvents
int numberOfEvents() const
Definition
AmbiCounter.h:55
AmbiCounter::globalCount
int globalCount(GlobalCounterIndices i) const
Definition
AmbiCounter.h:114
AmbiCounter::Categories
EnumType Categories
Definition
AmbiCounter.h:19
AmbiCounter< CounterIndex >::m_globalCounter
std::array< int, nGlobalCounters > m_globalCounter
Definition
AmbiCounter.h:120
AmbiCounter::operator+=
AmbiCounter< EnumType > & operator+=(const AmbiCounter< EnumType > &a)
Definition
AmbiCounter.h:67
AmbiCounter::AmbiCounter
AmbiCounter(const std::vector< float > &eta_bounds)
Definition
AmbiCounter.h:28
AmbiCounter::resetGlobalCounters
void resetGlobalCounters()
Definition
AmbiCounter.h:43
AmbiCounter< CounterIndex >::m_etaBounds
const std::vector< float > & m_etaBounds
Definition
AmbiCounter.h:121
Trk::Track
The ATLAS Track class.
Definition
Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h:73
head
std::string head(std::string s, const std::string &pattern)
head of a string
Definition
computils.cxx:312
Generated on
for ATLAS Offline Software by
1.17.0