ATLAS Offline Software
Loading...
Searching...
No Matches
AFPFastReco.cxx
Go to the documentation of this file.
1/*
2 * Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 * *
4 * *
5 * * AFPFastReco.cxx
6 * *
7 * *
8 * */
9
11
12#include <cmath>
13
14namespace AFPMon {
15
17{
19 recoTracks();
20}
21
23{
24 constexpr float dx = 0.25; // [mm]
25 constexpr float dy = 0.05; // [mm]
26 constexpr float dz = 9.00; // [mm]
27 constexpr float tilt = 14. / 180. * M_PI;
28
29 std::list toCluster(m_hitContainer->begin(), m_hitContainer->end());
30
31 while (!toCluster.empty())
32 {
33 const auto *init = *(toCluster.begin());
34 toCluster.pop_front();
35 auto clusteredHits = findAround(init, toCluster);
36
37 float sumX = 0;
38 float sumY = 0;
39 float sumCharge = 0;
40 int sumToT_temp = 0;
41 for (const xAOD::AFPSiHit* h : clusteredHits)
42 {
43 const float charge = h->depositedCharge();
44 const float pixX = dx * h->pixelColIDChip();
45 const float pixY = dy * h->pixelRowIDChip();
46 sumX += charge * pixX;
47 sumY += charge * pixY;
48 sumCharge += charge;
49 sumToT_temp += h->timeOverThreshold();
50 }
51
52 const float xPlane = sumX / sumCharge;
53 const float yPlane = sumY / sumCharge;
54
55 const int stationID = init->stationID();
56 const int layerID = init->pixelLayerID();
57
58 const float x = xPlane;
59 const float y = yPlane * std::cos(tilt);
60 const float z = yPlane * std::sin(tilt) + dz * layerID;
61
62 m_clusters.emplace_back(x, y, z, stationID, layerID, sumToT_temp);
63 }
64}
65
67{
68 std::list toTrack(m_clusters.begin(), m_clusters.end());
69
70 while (!toTrack.empty())
71 {
72 auto init = *(toTrack.begin());
73 toTrack.pop_front();
74 auto trackCandidate = findAround(init, toTrack);
75
76 if (trackCandidate.size() < s_trackSize) continue;
77
78 std::array<int, 4> clusters {};
79
80 std::vector<std::pair<double, double>> XZ;
81 std::vector<std::pair<double, double>> YZ;
82
83 for (const auto& cluster : trackCandidate)
84 {
85 clusters[cluster.layer]++;
86
87 XZ.emplace_back(cluster.x, cluster.z);
88 YZ.emplace_back(cluster.y, cluster.z);
89 }
90
91 const auto [x, xSlope] = linReg(XZ);
92 const auto [y, ySlope] = linReg(YZ);
93 const int station = trackCandidate[0].station;
94
95 m_tracks.emplace_back(x, y, station, clusters);
96 }
97}
98
99std::pair<double, double> AFPFastReco::linReg(const std::vector<std::pair<double, double>>& YX) const
100{
101 double meanx = 0;
102 double meany = 0;
103 for (const auto& yx : YX)
104 {
105 meany += yx.first;
106 meanx += yx.second;
107 }
108
109 meanx /= YX.size();
110 meany /= YX.size();
111
112 double numerator = 0;
113 double denumerator = 0;
114 for (const auto& yx : YX)
115 {
116 const double dy = yx.first - meany;
117 const double dx = yx.second - meanx;
118 numerator += dx * dy;
119 denumerator += dx * dx;
120 }
121
122 if(denumerator==0.0) denumerator=1e-6;
123 const double slope = numerator / denumerator;
124 const double position = meany - slope * meanx;
125
126 return {position, slope};
127}
128
130{
131 if (lhs->stationID() != rhs->stationID()) return false;
132 if (lhs->pixelLayerID() != rhs->pixelLayerID()) return false;
133 if (lhs->pixelColIDChip() != rhs->pixelColIDChip()) return false;
134 if (abs(lhs->pixelRowIDChip() - rhs->pixelRowIDChip()) != 1) return false;
135
136 return true;
137}
138
139bool AFPFastReco::areNeighbours(const AFPCluster& lhs, const AFPCluster& rhs) const
140{
141 if (lhs.station != rhs.station) return false;
142
143 const float dx = lhs.x - rhs.x;
144 const float dy = lhs.y - rhs.y;
145 return dx * dx + dy * dy <= s_clusterDistance;
146}
147
148} // namespace AFPMon
149
#define M_PI
double charge(const T &p)
Definition AtlasPID.h:997
#define y
#define x
#define z
void reco()
Performs fast reconstruction of clusters and tracks.
static constexpr int s_trackSize
Minimum number of clusters in track.
void recoClusters()
Performs fast cluster reconstruction.
static constexpr float s_clusterDistance
Maximum distance between cluster.
const xAOD::AFPSiHitContainer * m_hitContainer
Pointer to hit container.
Definition AFPFastReco.h:86
std::vector< AFPTrack > m_tracks
Vector of tracks.
Definition AFPFastReco.h:92
std::vector< T > findAround(T init, std::list< T > &toJoin) const
Finds hits/clusters around given init element.
void recoTracks()
Performs fast track reconstruction.
std::pair< double, double > linReg(const std::vector< std::pair< double, double > > &YX) const
Returns parameters of fitted line.
std::vector< AFPCluster > m_clusters
Vector of clusters.
Definition AFPFastReco.h:89
const std::vector< AFPCluster > & clusters() const
Returns vector of clusters.
Definition AFPFastReco.h:60
bool areNeighbours(const xAOD::AFPSiHit *lhs, const xAOD::AFPSiHit *rhs) const
Checks if given hits are neighbours.
Header file for AthHistogramAlgorithm.
int pixelColIDChip() const
Index of the pixel column in chip coordinate system.
int stationID() const
Index of the station with pixel hit.
int pixelLayerID() const
Index of the layer of pixels, i.e.
int pixelRowIDChip() const
Index of the pixel row in chip coordinate system.
AFPSiHit_v2 AFPSiHit
Definition AFPSiHit.h:12