ATLAS Offline Software
Loading...
Searching...
No Matches
MuonML::BucketGraphUtils Namespace Reference

Classes

struct  NodeAux

Functions

double bucket_size_mm (const MuonR4::SpacePointBucket &b)
bool keepBucketAsTrainingNode (const MuonR4::SpacePointBucket &b)
 bucket_size == 0, where bucket_size is bucket_max - bucket_min.
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.
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)
size_t packEdgeIndex (const std::vector< int64_t > &srcEdges, const std::vector< int64_t > &dstEdges, std::vector< int64_t > &edgeIndexPacked)

Function Documentation

◆ bucket_size_mm()

double MuonML::BucketGraphUtils::bucket_size_mm ( const MuonR4::SpacePointBucket & b)
inline

Definition at line 31 of file BucketGraphUtils.h.

31 {
32 return b.coveredMax() - b.coveredMin();
33}

◆ buildNodesAndFeatures()

void MuonML::BucketGraphUtils::buildNodesAndFeatures ( const MuonR4::SpacePointContainer & buckets,
const ActsTrk::GeometryContext & gctx,
std::vector< NodeAux > & nodes,
std::vector< float > & featuresLeaves,
std::vector< int64_t > & spInBucket )
inline

Build nodes + flat features (N,6) and number of SPs per kept bucket.

  • Features: [x, y, z, layers, nSp, bucketSize]

In cas that the data vectors have been used by an earlier ML algorithm ensure that the vectors remain clean

Definition at line 46 of file BucketGraphUtils.h.

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
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}
size_type size() const noexcept
Returns the number of elements in the collection.
: The muon space point bucket represents a collection of points that will bre processed together in t...
The SpacePointPerLayerSorter sort two given space points by their layer Identifier.
unsigned int sectorLayerNum(const SpacePoint &sp) const
method returning the logic layer number
Eigen::Matrix< double, 3, 1 > Vector3D
bool keepBucketAsTrainingNode(const MuonR4::SpacePointBucket &b)
bucket_size == 0, where bucket_size is bucket_max - bucket_min.
double bucket_size_mm(const MuonR4::SpacePointBucket &b)

◆ buildSparseEdges()

void MuonML::BucketGraphUtils::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 )
inline

Ensure that previously built graphs don't leak memory

Definition at line 101 of file BucketGraphUtils.h.

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}
static Double_t a
constexpr unsigned numberOfSectors()
return total number of sectors
float j(const xAOD::IParticle &, const xAOD::TrackMeasurementValidation &hit, const Eigen::Matrix3d &jab_inv)

◆ keepBucketAsTrainingNode()

bool MuonML::BucketGraphUtils::keepBucketAsTrainingNode ( const MuonR4::SpacePointBucket & b)
inline

bucket_size == 0, where bucket_size is bucket_max - bucket_min.

Definition at line 38 of file BucketGraphUtils.h.

38 {
39 return bucket_size_mm(b) != 0.0;
40}

◆ packEdgeIndex()

size_t MuonML::BucketGraphUtils::packEdgeIndex ( const std::vector< int64_t > & srcEdges,
const std::vector< int64_t > & dstEdges,
std::vector< int64_t > & edgeIndexPacked )
inline

Definition at line 168 of file BucketGraphUtils.h.

171{
172 const size_t E = srcEdges.size();
173 edgeIndexPacked = srcEdges;
174 edgeIndexPacked.insert(edgeIndexPacked.end(), dstEdges.begin(), dstEdges.end());
175 return E;
176}