ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
MuonSpectrometer
MuonPhaseII
MuonLearning
MuonInference
src
BucketGraphUtils.h
Go to the documentation of this file.
1
/*
2
Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3
*/
4
#ifndef MUONINFERENCE_BUCKETGRAPHUTILS_H
5
#define MUONINFERENCE_BUCKETGRAPHUTILS_H
6
7
#include <vector>
8
#include <cstdint>
9
#include <algorithm>
10
#include <cmath>
11
#include <unordered_set>
12
13
#include <
ActsGeometryInterfaces/GeometryContext.h
>
14
#include "
MuonSpacePoint/SpacePointContainer.h
"
15
#include "
MuonSpacePoint/SpacePointPerLayerSorter.h
"
16
#include "
GeoPrimitives/GeoPrimitives.h
"
17
18
namespace
MuonML::BucketGraphUtils
{
19
20
struct
NodeAux
{
21
double
x
{0.f};
22
double
y
{0.f};
23
double
z
{0.f};
24
int
layers
{0};
25
int
nSp
{0};
26
double
bucketSize
{0.f};
27
int
sector
{0};
28
int
chamber
{0};
29
};
30
31
inline
double
bucket_size_mm
(
const
MuonR4::SpacePointBucket
& b) {
32
return
b.coveredMax() - b.coveredMin();
33
}
34
38
inline
bool
keepBucketAsTrainingNode
(
const
MuonR4::SpacePointBucket
& b) {
39
return
bucket_size_mm
(b) != 0.0;
40
}
41
46
inline
void
buildNodesAndFeatures
(
const
MuonR4::SpacePointContainer
& buckets,
47
const
ActsTrk::GeometryContext
& gctx,
48
std::vector<NodeAux>& nodes,
49
std::vector<float>& featuresLeaves,
50
std::vector<int64_t>& spInBucket)
// << int64_t!
51
{
53
nodes.clear();
54
featuresLeaves.clear();
55
spInBucket.clear();
56
nodes.reserve(buckets.
size
());
57
featuresLeaves.reserve(6u * buckets.
size
());
// preallocate
58
spInBucket.reserve(buckets.
size
());
59
60
MuonR4::SpacePointPerLayerSorter
layerSorter{};
61
62
for
(
const
MuonR4::SpacePointBucket
* bucket : buckets) {
63
const
double
bsize =
bucket_size_mm
(*bucket);
64
65
if
(!
keepBucketAsTrainingNode
(*bucket)) {
66
continue
;
67
}
68
69
NodeAux
n;
70
71
const
double
midY = 0.5 * (bucket->coveredMin() + bucket->coveredMax());
72
const
Amg::Vector3D
glob = bucket->msSector()->localToGlobalTransform(gctx) * (midY * Amg::Vector3D::UnitY());
73
n.x = glob.x();
74
n.y = glob.y();
75
n.z = glob.z();
76
77
std::unordered_set<unsigned int> laySet;
78
laySet.reserve(bucket->size());
79
for
(
const
auto
& spPtr : *bucket) {
80
laySet.insert(layerSorter.
sectorLayerNum
(*spPtr));
81
}
82
n.layers =
static_cast<
int
>
(laySet.size());
83
n.nSp =
static_cast<
int
>
(bucket->size());
84
n.bucketSize = bsize;
85
n.sector = bucket->msSector()->sector();
86
n.chamber = Acts::toUnderlying(bucket->msSector()->chamberIndex());
87
88
nodes.push_back(n);
89
90
featuresLeaves.push_back(
static_cast<
float
>
(n.x));
91
featuresLeaves.push_back(
static_cast<
float
>
(n.y));
92
featuresLeaves.push_back(
static_cast<
float
>
(n.z));
93
featuresLeaves.push_back(
static_cast<
float
>
(n.layers));
94
featuresLeaves.push_back(
static_cast<
float
>
(n.nSp));
95
featuresLeaves.push_back(
static_cast<
float
>
(n.bucketSize));
96
97
spInBucket.emplace_back(
static_cast<
int64_t
>
(n.nSp));
// store as int64_t
98
}
99
}
100
101
inline
void
buildSparseEdges
(
const
std::vector<NodeAux>& nodes,
102
int
minLayers,
103
int
maxChamberDelta,
104
int
maxSectorDelta,
105
double
maxDistXY,
106
double
maxAbsDz,
107
std::vector<int64_t>& srcEdges,
108
std::vector<int64_t>& dstEdges)
109
{
111
srcEdges.clear();
112
dstEdges.clear();
113
114
std::vector<size_t> validIdx;
115
validIdx.reserve(nodes.size());
116
for
(
size_t
i = 0; i < nodes.size(); ++i) {
117
if
(nodes[i].layers >= minLayers) validIdx.push_back(i);
118
}
119
120
if
(validIdx.size() < 2) {
121
if
(!nodes.empty()) {
122
srcEdges.push_back(0);
123
dstEdges.push_back(0);
124
}
125
return
;
126
}
127
128
const
unsigned
int
secMax =
Muon::MuonStationIndex::numberOfSectors
();
129
130
for
(
size_t
a
= 0;
a
< validIdx.size(); ++
a
) {
131
const
size_t
i = validIdx[
a
];
132
const
auto
& ni = nodes[i];
133
for
(
size_t
b =
a
+ 1; b < validIdx.size(); ++b) {
134
const
size_t
j = validIdx[b];
135
const
auto
& nj = nodes[j];
136
137
const
double
dx =
static_cast<
double
>
(ni.x) -
static_cast<
double
>
(nj.x);
138
const
double
dy =
static_cast<
double
>
(ni.y) -
static_cast<
double
>
(nj.y);
139
const
double
dz =
static_cast<
double
>
(ni.z) -
static_cast<
double
>
(nj.z);
140
141
const
double
distXY = Acts::fastHypot(dx, dy);
142
const
int
secDiffLin = std::abs(ni.sector - nj.sector) %
static_cast<
int
>
(secMax);
143
const
int
d_sec = std::min(secDiffLin,
static_cast<
int
>
(secMax) - secDiffLin);
144
const
int
d_ch = std::abs(ni.chamber - nj.chamber);
145
146
const
bool
mask =
147
(d_ch > 0) &&
148
(d_sec <= maxSectorDelta) &&
149
(distXY < maxDistXY) &&
150
(std::abs(dz) < maxAbsDz) &&
151
(d_ch <= maxChamberDelta);
152
153
if
(mask) {
154
srcEdges.push_back(
static_cast<
int64_t
>
(i));
155
dstEdges.push_back(
static_cast<
int64_t
>
(j));
156
srcEdges.push_back(
static_cast<
int64_t
>
(j));
157
dstEdges.push_back(
static_cast<
int64_t
>
(i));
158
}
159
}
160
}
161
162
if
(srcEdges.empty() && !nodes.empty()) {
163
srcEdges.push_back(0);
164
dstEdges.push_back(0);
165
}
166
}
167
168
inline
size_t
packEdgeIndex
(
const
std::vector<int64_t>& srcEdges,
169
const
std::vector<int64_t>& dstEdges,
170
std::vector<int64_t>& edgeIndexPacked)
171
{
172
const
size_t
E = srcEdges.size();
173
edgeIndexPacked = srcEdges;
174
edgeIndexPacked.insert(edgeIndexPacked.end(), dstEdges.begin(), dstEdges.end());
175
return
E;
176
}
177
178
}
// namespace MuonML::BucketGraphUtils
179
180
#endif
181
GeoPrimitives.h
GeometryContext.h
a
static Double_t a
Definition
LArPhysWaveHECTool.cxx:38
SpacePointContainer.h
SpacePointPerLayerSorter.h
ActsTrk::GeometryContext
Definition
GeometryContext.h:30
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
MuonR4::SpacePointBucket
: The muon space point bucket represents a collection of points that will bre processed together in t...
Definition
MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/MuonSpacePoint/SpacePointContainer.h:21
MuonR4::SpacePointPerLayerSorter
The SpacePointPerLayerSorter sort two given space points by their layer Identifier.
Definition
SpacePointPerLayerSorter.h:15
MuonR4::SpacePointPerLayerSorter::sectorLayerNum
unsigned int sectorLayerNum(const SpacePoint &sp) const
method returning the logic layer number
Definition
SpacePointPerLayerSorter.cxx:13
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition
GeoPrimitives.h:48
MuonML::BucketGraphUtils
Definition
BucketGraphUtils.h:18
MuonML::BucketGraphUtils::buildNodesAndFeatures
void buildNodesAndFeatures(const MuonR4::SpacePointContainer &buckets, const ActsTrk::GeometryContext &gctx, std::vector< NodeAux > &nodes, std::vector< float > &featuresLeaves, std::vector< int64_t > &spInBucket)
Build nodes + flat features (N,6) and number of SPs per kept bucket.
Definition
BucketGraphUtils.h:46
MuonML::BucketGraphUtils::keepBucketAsTrainingNode
bool keepBucketAsTrainingNode(const MuonR4::SpacePointBucket &b)
bucket_size == 0, where bucket_size is bucket_max - bucket_min.
Definition
BucketGraphUtils.h:38
MuonML::BucketGraphUtils::buildSparseEdges
void buildSparseEdges(const std::vector< NodeAux > &nodes, int minLayers, int maxChamberDelta, int maxSectorDelta, double maxDistXY, double maxAbsDz, std::vector< int64_t > &srcEdges, std::vector< int64_t > &dstEdges)
Definition
BucketGraphUtils.h:101
MuonML::BucketGraphUtils::packEdgeIndex
size_t packEdgeIndex(const std::vector< int64_t > &srcEdges, const std::vector< int64_t > &dstEdges, std::vector< int64_t > &edgeIndexPacked)
Definition
BucketGraphUtils.h:168
MuonML::BucketGraphUtils::bucket_size_mm
double bucket_size_mm(const MuonR4::SpacePointBucket &b)
Definition
BucketGraphUtils.h:31
MuonR4::SpacePointContainer
DataVector< SpacePointBucket > SpacePointContainer
Abrivation of the space point container type.
Definition
MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/MuonSpacePoint/SpacePointContainer.h:56
Muon::MuonStationIndex::numberOfSectors
constexpr unsigned numberOfSectors()
return total number of sectors
Definition
MuonStationIndex.h:132
MuonML::BucketGraphUtils::NodeAux
Definition
BucketGraphUtils.h:20
MuonML::BucketGraphUtils::NodeAux::x
double x
Definition
BucketGraphUtils.h:21
MuonML::BucketGraphUtils::NodeAux::chamber
int chamber
Definition
BucketGraphUtils.h:28
MuonML::BucketGraphUtils::NodeAux::sector
int sector
Definition
BucketGraphUtils.h:27
MuonML::BucketGraphUtils::NodeAux::nSp
int nSp
Definition
BucketGraphUtils.h:25
MuonML::BucketGraphUtils::NodeAux::y
double y
Definition
BucketGraphUtils.h:22
MuonML::BucketGraphUtils::NodeAux::layers
int layers
Definition
BucketGraphUtils.h:24
MuonML::BucketGraphUtils::NodeAux::z
double z
Definition
BucketGraphUtils.h:23
MuonML::BucketGraphUtils::NodeAux::bucketSize
double bucketSize
Definition
BucketGraphUtils.h:26
Generated on
for ATLAS Offline Software by
1.17.0