ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
Trigger
TrigTools
TrigInDetPattRecoTools
src
GNN_DataStorage.cxx
Go to the documentation of this file.
1
/*
2
Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3
*/
4
5
6
#include "
TrigInDetPattRecoEvent/TrigInDetSiLayer.h
"
7
#include "
TrigInDetPattRecoTools/GNN_Geometry.h
"
8
#include "
GNN_DataStorage.h
"
9
10
#include<iostream>
11
#include<cmath>
12
#include<cstring>
13
#include<algorithm>
14
15
TrigFTF_GNN_EtaBin::TrigFTF_GNN_EtaBin
():
m_minRadius
(0),
m_maxRadius
(0) {
16
m_vn
.clear();
17
m_params
.clear();
18
m_vn
.reserve(1000);
19
m_vFirstEdge
.reserve(1000);
20
m_vNumEdges
.reserve(1000);
21
}
22
23
TrigFTF_GNN_EtaBin::~TrigFTF_GNN_EtaBin
() {
24
m_vn
.clear();
25
m_params
.clear();
26
}
27
28
void
TrigFTF_GNN_EtaBin::sortByPhi
() {
29
30
std::vector<std::pair<float, const TrigFTF_GNN_Node*> > phiBuckets[32];
31
32
int
nBuckets = 31;
33
34
for
(
const
auto
& n :
m_vn
) {
35
int
bIdx = (int)(0.5*nBuckets*(n->phi()/(
float
)
M_PI
+ 1.0f));
36
phiBuckets[bIdx].push_back(std::make_pair(n->phi(), n));
37
}
38
39
for
(
auto
& b : phiBuckets) {
40
std::sort
(b.begin(), b.end());
41
}
42
43
int
idx = 0;
44
for
(
const
auto
& b : phiBuckets) {
45
for
(
const
auto
& p : b) {
46
m_vn
[idx++] = p.second;
47
}
48
}
49
50
}
51
52
53
void
TrigFTF_GNN_EtaBin::initializeNodes
() {
54
55
if
(
m_vn
.empty())
return
;
56
57
m_params
.resize(
m_vn
.size());
58
m_vFirstEdge
.resize(
m_vn
.size(), 0);
59
m_vNumEdges
.resize(
m_vn
.size(), 0);
60
m_vIsConnected
.resize(
m_vn
.size(), 0);
61
62
std::transform(
m_vn
.begin(),
m_vn
.end(),
m_params
.begin(),
63
[](
const
TrigFTF_GNN_Node
* pN) { std::array<float,5> a = {-100.0, 100.0, pN->phi(), pN->r(), pN->z()};
return
a
;});
64
65
auto
[min_iter, max_iter] = std::minmax_element(m_vn.begin(), m_vn.end(),
66
[](
const
TrigFTF_GNN_Node
* s,
const
TrigFTF_GNN_Node
* s1) { return (s->r() < s1->r()); });
67
m_maxRadius = (*max_iter)->r();
68
m_minRadius = (*min_iter)->r();
69
}
70
71
void
TrigFTF_GNN_EtaBin::generatePhiIndexing
(
float
dphi) {
72
73
for
(
unsigned
int
nIdx=0;nIdx<
m_vn
.size();nIdx++) {
74
75
float
phi
=
m_params
[nIdx][2];
76
if
(
phi
<=
M_PI
-dphi)
continue
;
77
m_vPhiNodes
.push_back(std::pair<float, unsigned int>(
phi
- 2*
M_PI
, nIdx));
78
79
}
80
81
for
(
unsigned
int
nIdx=0;nIdx<
m_vn
.size();nIdx++) {
82
float
phi
=
m_params
[nIdx][2];
83
m_vPhiNodes
.push_back(std::pair<float, unsigned int>(
phi
, nIdx));
84
}
85
86
for
(
unsigned
int
nIdx=0;nIdx<
m_vn
.size();nIdx++) {
87
88
float
phi
=
m_params
[nIdx][2];
89
if
(
phi
>= -
M_PI
+ dphi)
break
;
90
m_vPhiNodes
.push_back(std::pair<float, unsigned int>(
phi
+ 2*
M_PI
, nIdx));
91
}
92
93
}
94
95
TrigFTF_GNN_DataStorage::TrigFTF_GNN_DataStorage
(
const
TrigFTF_GNN_Geometry
& g,
const
std::vector<std::array<float, 5> >& lut) :
m_geo
(g),
m_mlLUT
(lut) {
96
m_etaBins
.resize(g.num_bins());
97
}
98
99
100
TrigFTF_GNN_DataStorage::~TrigFTF_GNN_DataStorage
() {
101
102
}
103
104
int
TrigFTF_GNN_DataStorage::loadPixelGraphNodes
(
short
layerIndex,
const
std::vector<TrigFTF_GNN_Node>& coll,
bool
useML) {
105
106
int
nLoaded = 0;
107
108
const
TrigFTF_GNN_Layer
* pL =
m_geo
.getTrigFTF_GNN_LayerByIndex(layerIndex);
109
110
if
(pL ==
nullptr
) {
111
return
-1;
112
}
113
114
bool
isBarrel = (pL->
m_layer
.
m_type
== 0);
115
116
for
(
const
auto
&
node
: coll) {
117
118
int
binIndex = pL->
getEtaBin
(
node
.z(),
node
.r());
119
120
if
(binIndex == -1) {
121
continue
;
122
}
123
124
if
(isBarrel) {
125
m_etaBins
.at(binIndex).m_vn.push_back(&
node
);
126
}
127
else
{
128
if
(useML) {
129
float
cluster_width =
node
.pixelClusterWidth();
130
if
(cluster_width > 0.35)
continue
;
131
}
132
m_etaBins
.at(binIndex).m_vn.push_back(&
node
);
133
}
134
135
nLoaded++;
136
137
}
138
139
return
nLoaded;
140
}
141
142
int
TrigFTF_GNN_DataStorage::loadStripGraphNodes
(
short
layerIndex,
const
std::vector<TrigFTF_GNN_Node>& coll) {
143
144
int
nLoaded = 0;
145
146
const
TrigFTF_GNN_Layer
* pL =
m_geo
.getTrigFTF_GNN_LayerByIndex(layerIndex);
147
148
if
(pL ==
nullptr
) {
149
return
-1;
150
}
151
152
for
(
const
auto
&
node
: coll) {
153
154
int
binIndex = pL->
getEtaBin
(
node
.z(),
node
.r());
155
156
if
(binIndex == -1) {
157
continue
;
158
}
159
160
m_etaBins
.at(binIndex).m_vn.push_back(&
node
);
161
nLoaded++;
162
}
163
164
return
nLoaded;
165
}
166
167
unsigned
int
TrigFTF_GNN_DataStorage::numberOfNodes
()
const
{
168
169
unsigned
int
n=0;
170
171
for
(
const
auto
& b :
m_etaBins
) {
172
n += b.m_vn.size();
173
}
174
return
n;
175
}
176
177
void
TrigFTF_GNN_DataStorage::sortByPhi
() {
178
179
for
(
auto
& b :
m_etaBins
) b.sortByPhi();
180
}
181
182
void
TrigFTF_GNN_DataStorage::initializeNodes
(
bool
useML) {
183
184
for
(
auto
& b :
m_etaBins
) {
185
b.initializeNodes();
186
if
(!b.m_vn.empty()) {
187
b.m_layerKey =
m_geo
.getTrigFTF_GNN_LayerKeyByIndex((*b.m_vn.begin())->m_layer);
188
}
189
}
190
191
if
(!useML)
return
;
192
193
unsigned
int
nL =
m_geo
.num_layers();
194
195
for
(
unsigned
int
layerIdx=0;layerIdx<nL;layerIdx++) {
196
197
const
TrigFTF_GNN_Layer
* pL =
m_geo
.getTrigFTF_GNN_LayerByIndex(layerIdx);
198
199
if
(pL->
m_layer
.
m_subdet
< 20000) {
//skip strips volumes: layers in range [1200X-1400X]
200
continue
;
201
}
202
203
bool
isBarrel = (pL->
m_layer
.
m_type
== 0);
//TO-DO: implement a separate id for inclined barrel layers
204
205
if
(!isBarrel)
continue
;
206
207
// adjusting cuts on |cot(theta)| using pre-trained LUT loaded from a file
208
209
int
lutSize =
m_mlLUT
.size();
210
211
int
nBins = pL->
m_bins
.size();
212
213
for
(
int
b=0;b<nBins;b++) {
//loop over eta-bins in Layer
214
215
TrigFTF_GNN_EtaBin
& B =
m_etaBins
.at(pL->
m_bins
.at(b));
216
217
if
(B.empty())
continue
;
218
219
for
(
unsigned
int
nIdx=0;nIdx<B.m_vn.size();nIdx++) {
220
221
float
cluster_width = B.m_vn[nIdx]->pixelClusterWidth();
222
223
float
locPosY = B.m_vn[nIdx]->localPositionY();
224
225
int
lutBinIdx = std::floor(20*cluster_width) - 1;
//lut bin width is 0.05 mm
226
227
if
(lutBinIdx >= lutSize)
continue
;
228
229
const
std::array<float, 5> lutBin =
m_mlLUT
[lutBinIdx];
230
231
float
dist2border = 10.0 - std::abs(locPosY);
232
233
float
min_tau = -100.0;
234
float
max_tau = 100.0;
235
236
if
(dist2border > 0.3f) {
//far enough from the edge
237
min_tau = lutBin[1];
238
max_tau = lutBin[2];
239
}
else
{
//possible cluster shortening at a module edge
240
min_tau = lutBin[3];
241
max_tau = lutBin[4];
242
}
243
244
if
(max_tau < 0) {
//insufficient training data
245
max_tau = 100.0;
//use "no-cut" default
246
}
247
248
B.m_params[nIdx][0] = min_tau;
249
B.m_params[nIdx][1] = max_tau;
250
251
}
252
}
253
}
254
}
255
256
void
TrigFTF_GNN_DataStorage::generatePhiIndexing
(
float
dphi) {
257
for
(
auto
& b :
m_etaBins
) b.generatePhiIndexing(dphi);
258
}
259
M_PI
#define M_PI
Definition
ActiveFraction.h:14
phi
Scalar phi() const
phi method
Definition
AmgMatrixBasePlugin.h:67
GNN_DataStorage.h
GNN_Geometry.h
a
static Double_t a
Definition
LArPhysWaveHECTool.cxx:38
TrigInDetSiLayer.h
TrigFTF_GNN_DataStorage::sortByPhi
void sortByPhi()
Definition
GNN_DataStorage.cxx:177
TrigFTF_GNN_DataStorage::m_etaBins
std::vector< TrigFTF_GNN_EtaBin > m_etaBins
Definition
GNN_DataStorage.h:106
TrigFTF_GNN_DataStorage::generatePhiIndexing
void generatePhiIndexing(float)
Definition
GNN_DataStorage.cxx:256
TrigFTF_GNN_DataStorage::numberOfNodes
unsigned int numberOfNodes() const
Definition
GNN_DataStorage.cxx:167
TrigFTF_GNN_DataStorage::initializeNodes
void initializeNodes(bool)
Definition
GNN_DataStorage.cxx:182
TrigFTF_GNN_DataStorage::m_geo
const TrigFTF_GNN_Geometry & m_geo
Definition
GNN_DataStorage.h:103
TrigFTF_GNN_DataStorage::m_mlLUT
const std::vector< std::array< float, 5 > > & m_mlLUT
Definition
GNN_DataStorage.h:104
TrigFTF_GNN_DataStorage::TrigFTF_GNN_DataStorage
TrigFTF_GNN_DataStorage(const TrigFTF_GNN_Geometry &, const std::vector< std::array< float, 5 > > &)
Definition
GNN_DataStorage.cxx:95
TrigFTF_GNN_DataStorage::loadStripGraphNodes
int loadStripGraphNodes(short, const std::vector< TrigFTF_GNN_Node > &)
Definition
GNN_DataStorage.cxx:142
TrigFTF_GNN_DataStorage::~TrigFTF_GNN_DataStorage
~TrigFTF_GNN_DataStorage()
Definition
GNN_DataStorage.cxx:100
TrigFTF_GNN_DataStorage::loadPixelGraphNodes
int loadPixelGraphNodes(short, const std::vector< TrigFTF_GNN_Node > &, bool)
Definition
GNN_DataStorage.cxx:104
TrigFTF_GNN_EtaBin
Definition
GNN_DataStorage.h:41
TrigFTF_GNN_EtaBin::m_vn
std::vector< const TrigFTF_GNN_Node * > m_vn
Definition
GNN_DataStorage.h:71
TrigFTF_GNN_EtaBin::m_vIsConnected
std::vector< unsigned short > m_vIsConnected
Definition
GNN_DataStorage.h:77
TrigFTF_GNN_EtaBin::m_vFirstEdge
std::vector< unsigned int > m_vFirstEdge
Definition
GNN_DataStorage.h:75
TrigFTF_GNN_EtaBin::generatePhiIndexing
void generatePhiIndexing(float)
Definition
GNN_DataStorage.cxx:71
TrigFTF_GNN_EtaBin::TrigFTF_GNN_EtaBin
TrigFTF_GNN_EtaBin()
Definition
GNN_DataStorage.cxx:15
TrigFTF_GNN_EtaBin::m_maxRadius
float m_maxRadius
Definition
GNN_DataStorage.h:78
TrigFTF_GNN_EtaBin::initializeNodes
void initializeNodes()
Definition
GNN_DataStorage.cxx:53
TrigFTF_GNN_EtaBin::m_vPhiNodes
std::vector< std::pair< float, unsigned int > > m_vPhiNodes
Definition
GNN_DataStorage.h:72
TrigFTF_GNN_EtaBin::sortByPhi
void sortByPhi()
Definition
GNN_DataStorage.cxx:28
TrigFTF_GNN_EtaBin::m_params
std::vector< std::array< float, 5 > > m_params
Definition
GNN_DataStorage.h:74
TrigFTF_GNN_EtaBin::m_minRadius
float m_minRadius
Definition
GNN_DataStorage.h:78
TrigFTF_GNN_EtaBin::m_vNumEdges
std::vector< unsigned short > m_vNumEdges
Definition
GNN_DataStorage.h:76
TrigFTF_GNN_EtaBin::~TrigFTF_GNN_EtaBin
~TrigFTF_GNN_EtaBin()
Definition
GNN_DataStorage.cxx:23
TrigFTF_GNN_Geometry
Definition
GNN_Geometry.h:48
TrigFTF_GNN_Layer
Definition
GNN_Geometry.h:16
TrigFTF_GNN_Layer::m_layer
const TrigInDetSiLayer & m_layer
Definition
GNN_Geometry.h:30
TrigFTF_GNN_Layer::getEtaBin
int getEtaBin(float, float) const
Definition
GNN_Geometry.cxx:265
TrigFTF_GNN_Layer::m_bins
std::vector< int > m_bins
Definition
GNN_Geometry.h:31
TrigInDetSiLayer::m_subdet
int m_subdet
Definition
TrigInDetSiLayer.h:10
TrigInDetSiLayer::m_type
int m_type
Definition
TrigInDetSiLayer.h:11
node
Definition
node.h:24
std::sort
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
Definition
DVL_algorithms.h:554
TrigFTF_GNN_Node
Definition
GNN_DataStorage.h:18
Generated on
for ATLAS Offline Software by
1.17.0