ATLAS Offline Software
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 
14 namespace AFPMon {
15 
17 {
18  recoClusters();
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 
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 
99 std::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 
129 bool AFPFastReco::areNeighbours(const xAOD::AFPSiHit* lhs, const xAOD::AFPSiHit* rhs) const
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 
139 bool 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 
AFPMon::AFPCluster::x
float x
Definition: AFPFastReco.h:19
AFPMon::AFPFastReco::findAround
std::vector< T > findAround(T init, std::list< T > &toJoin) const
Finds hits/clusters around given init element.
Definition: AFPFastReco.h:107
AFPMon::AFPFastReco::s_trackSize
static constexpr int s_trackSize
Minimum number of clusters in track.
Definition: AFPFastReco.h:101
AFPMon::AFPCluster::y
float y
Definition: AFPFastReco.h:20
AFPFastReco.h
AFPMon::AFPFastReco::linReg
std::pair< double, double > linReg(const std::vector< std::pair< double, double >> &YX) const
Returns parameters of fitted line.
Definition: AFPFastReco.cxx:99
xAOD::AFPSiHit_v2::pixelLayerID
int pixelLayerID() const
Index of the layer of pixels, i.e.
xAOD::AFPSiHit_v2
Class representing a hit in silicon detector.
Definition: AFPSiHit_v2.h:30
M_PI
#define M_PI
Definition: ActiveFraction.h:11
AFPMon::AFPFastReco::s_clusterDistance
static constexpr float s_clusterDistance
Maximum distance between cluster.
Definition: AFPFastReco.h:104
drawFromPickle.cos
cos
Definition: drawFromPickle.py:36
AFPMon::AFPFastReco::areNeighbours
bool areNeighbours(const xAOD::AFPSiHit *lhs, const xAOD::AFPSiHit *rhs) const
Checks if given hits are neighbours.
Definition: AFPFastReco.cxx:129
x
#define x
AFPMon::AFPFastReco::m_tracks
std::vector< AFPTrack > m_tracks
Vector of tracks.
Definition: AFPFastReco.h:92
xAOD::AFPSiHit_v2::pixelColIDChip
int pixelColIDChip() const
Index of the pixel column in chip coordinate system.
AFPMon::AFPFastReco::recoClusters
void recoClusters()
Performs fast cluster reconstruction.
Definition: AFPFastReco.cxx:22
z
#define z
AFPMon
Definition: AFPFastReco.h:12
AFPMon::AFPCluster::station
int station
Definition: AFPFastReco.h:22
AFPMon::AFPFastReco::clusters
std::vector< AFPCluster > clusters() const
Returns vector of clusters.
Definition: AFPFastReco.h:60
histSizes.list
def list(name, path='/')
Definition: histSizes.py:38
AFPMon::AFPFastReco::m_hitContainer
const xAOD::AFPSiHitContainer * m_hitContainer
Pointer to hit container.
Definition: AFPFastReco.h:86
AFPMon::AFPFastReco::recoTracks
void recoTracks()
Performs fast track reconstruction.
Definition: AFPFastReco.cxx:66
AFPMon::AFPFastReco::m_clusters
std::vector< AFPCluster > m_clusters
Vector of clusters.
Definition: AFPFastReco.h:89
charge
double charge(const T &p)
Definition: AtlasPID.h:494
AFPMon::AFPFastReco::reco
void reco()
Performs fast reconstruction of clusters and tracks.
Definition: AFPFastReco.cxx:16
python.PyKernel.init
def init(v_theApp, v_rootStream=None)
Definition: PyKernel.py:45
DataVector::end
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
makeTRTBarrelCans.dy
tuple dy
Definition: makeTRTBarrelCans.py:21
xAOD::AFPSiHit_v2::pixelRowIDChip
int pixelRowIDChip() const
Index of the pixel row in chip coordinate system.
DiTauMassTools::MaxHistStrategyV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:26
y
#define y
h
makeTRTBarrelCans.dx
tuple dx
Definition: makeTRTBarrelCans.py:20
AFPMon::AFPCluster
Definition: AFPFastReco.h:15
xAOD::AFPSiHit_v2::stationID
int stationID() const
Index of the station with pixel hit.
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.