HerdSoftware  0.1.1
CaloAxis.h
Go to the documentation of this file.
1 /*
2  * CaloAxis.h
3  *
4  * Created on: 27 April 2020
5  * Author: Valerio Vagelli
6  */
7 
10 #ifndef HERD_CALOAXIS_H_
11 #define HERD_CALOAXIS_H_
12 
13 // HerdSoftware headersCalo
14 #include "common/DefaultValues.h"
15 #include "common/Vec3D.h"
17 #include "dataobjects/CaloHits.h"
18 #include "dataobjects/Hit.h"
19 #include "dataobjects/Point.h"
20 
21 #ifdef HS_USE_ROOT
22 #include "Rtypes.h"
23 #endif
24 
25 // C/C++ standard headers
26 #include <algorithm>
27 #include <array>
28 #include <map>
29 #include <numeric>
30 #include <vector>
31 
32 namespace Herd {
33 
34 enum class CaloAxisAlgoType {
35  NONE,
36  PCA
37 };
38 
46 class CaloAxis {
47 public:
54  : DEFAULT_INIT(m_axisCOG), DEFAULT_INIT(m_axisEigenvalues), DEFAULT_INIT(m_axisEigenvectors),
55  DEFAULT_INIT(m_axisDir), DEFAULT_INIT(m_axisSigma), DEFAULT_INIT(m_axisSkewness), DEFAULT_INIT(m_axisKurtosis),
56  DEFAULT_INIT(m_axisEntryHit), DEFAULT_INIT(m_axisExitHit), DEFAULT_INIT(m_axisPathlengthHit){};
57 
63  CaloAxis(const CaloHits caloHits, float energyThreshold)
64  : DEFAULT_INIT(m_axisCOG), DEFAULT_INIT(m_axisEigenvalues), DEFAULT_INIT(m_axisEigenvectors),
65  DEFAULT_INIT(m_axisDir), DEFAULT_INIT(m_axisSigma), DEFAULT_INIT(m_axisSkewness), DEFAULT_INIT(m_axisKurtosis),
66  DEFAULT_INIT(m_axisEntryHit), DEFAULT_INIT(m_axisExitHit),
67  DEFAULT_INIT(m_axisPathlengthHit), m_caloHits{std::move(caloHits)}, m_energyThreshold{energyThreshold} {};
68 
70  virtual ~CaloAxis() = default;
71 
78  std::array<double, 3> AxisSigma(const CaloGeoParams &geoParams) {
79  if (m_axisSigma == DefaultValue(m_axisSigma)) {
80  ComputeMomenta(geoParams);
81  }
82  return m_axisSigma;
83  };
84 
91  std::array<double, 3> AxisSkewness(const CaloGeoParams &geoParams) {
92  if (m_axisSkewness == DefaultValue(m_axisSkewness)) {
93  ComputeMomenta(geoParams);
94  }
95  return m_axisSkewness;
96  };
97 
104  std::array<double, 3> AxisKurtosis(const CaloGeoParams &geoParams) {
105  if (m_axisKurtosis == DefaultValue(m_axisKurtosis)) {
106  ComputeMomenta(geoParams);
107  }
108  return m_axisKurtosis;
109  };
110 
112  CaloAxisAlgoType AlgoType() const { return m_axisAlgo; };
113 
115  unsigned short AxisHits() const {
116  return std::count_if(begin(m_caloHits), end(m_caloHits),
117  [this](const Hit &hit) { return hit.EDep() > m_energyThreshold; });
118  };
119 
125  Point COG() const { return m_axisCOG; };
126 
132  std::array<double, 3> Eigenvalues() const { return m_axisEigenvalues; };
133 
139  std::array<Point, 3> Eigenvectors() const { return m_axisEigenvectors; };
140 
146  Line Axis() const { return Line(m_axisCOG, m_axisDir); };
147 
153  Point AxisEntryHit(const CaloGeoParams &geoParams) {
154  if (m_axisEntryHit == DefaultValue(m_axisEntryHit)) {
155  ComputePathlength(geoParams);
156  }
157  return m_axisEntryHit;
158  }
159 
165  Point AxisExitHit(const CaloGeoParams &geoParams) {
166  if (m_axisExitHit == DefaultValue(m_axisExitHit)) {
167  ComputePathlength(geoParams);
168  }
169  return m_axisExitHit;
170  }
171 
177  double AxisPathlengthHit(const CaloGeoParams &geoParams) {
178  if (m_axisPathlengthHit == DefaultValue(m_axisPathlengthHit)) {
179  ComputePathlength(geoParams);
180  }
181  return m_axisPathlengthHit;
182  }
183 
192  double LateralEnergy(const CaloGeoParams &geoParams, double radmin = 0, double radmax = defaultValue<double>);
193 
205  double LongitudinalEntryEnergy(const CaloGeoParams &geoParams, double dist, double radmin = 0,
206  double radmax = defaultValue<double>);
207 
219  double LongitudinalExitEnergy(const CaloGeoParams &geoParams, double dist, double radmin = 0,
220  double radmax = defaultValue<double>);
221 
236  double LocalEnergy(const CaloGeoParams &geoParams, Point center, double distneg, double distpos, double radmin = 0,
237  double radmax = defaultValue<double>);
238 
239  void SetAlgoType(CaloAxisAlgoType algoType) { m_axisAlgo = algoType; };
240 
244  void SetCOG(Point cog) { m_axisCOG = cog; };
245 
249  void SetDirection(Vec3D dir) { m_axisDir = dir; };
250 
254  void SetEigenvalues(std::array<double, 3> eig) { m_axisEigenvalues = eig; };
255 
259  void SetEigenvectors(std::array<Point, 3> eig) { m_axisEigenvectors = eig; };
260 
265  void Reset();
266 
267 private:
270  std::array<double, 3> m_axisEigenvalues;
271  std::array<Point, 3> m_axisEigenvectors;
273  std::array<double, 3> m_axisSigma;
274  std::array<double, 3> m_axisSkewness;
275  std::array<double, 3> m_axisKurtosis;
279 
280  CaloHits m_caloHits; // Internal reference to caloHits used for this Axis
281  void ComputeMomenta(const CaloGeoParams &geoParams);
282 
283  void ComputePathlength(const CaloGeoParams &geoParams);
284 
285  float m_energyThreshold = 0;
286 
287 #ifdef HS_USE_ROOT
288  ClassDef(CaloAxis, 1)
289 #endif
290 };
291 
292 } // namespace Herd
293 
294 #endif /* HERD_CALOAXIS_H_ */
unsigned short AxisHits() const
Number of hits used for axis reconstruction.
Definition: CaloAxis.h:115
Point AxisExitHit(const CaloGeoParams &geoParams)
Axis Exit point
Definition: CaloAxis.h:165
CssGeoParams.h CssGeoParams class declaration.
Definition: CaloPDCalibrationAlgo.h:24
Container of information about the Calorimeter Shower Axis.
Definition: CaloAxis.h:46
std::array< double, 3 > m_axisSkewness
Definition: CaloAxis.h:274
Vec3D m_axisDir
Definition: CaloAxis.h:272
Line Axis() const
get the shower Axis
Definition: CaloAxis.h:146
Point COG() const
Axis Center of Gravity
Definition: CaloAxis.h:125
CaloAxis()
Default constructor.
Definition: CaloAxis.h:53
#define DEFAULT_INIT(x)
Definition: DefaultValues.h:23
CaloAxisAlgoType AlgoType() const
Flag provinding the algorithm used for the reconstruction of the CaloAxis object. ...
Definition: CaloAxis.h:112
CaloAxis(const CaloHits caloHits, float energyThreshold)
Constructor from a collection of hits and threshold.
Definition: CaloAxis.h:63
double AxisPathlengthHit(const CaloGeoParams &geoParams)
Axis total pathlength inside crystals
Definition: CaloAxis.h:177
Point AxisEntryHit(const CaloGeoParams &geoParams)
Axis Entry point
Definition: CaloAxis.h:153
void SetCOG(Point cog)
Set the COG.
Definition: CaloAxis.h:244
Point m_axisExitHit
Definition: CaloAxis.h:277
Point m_axisEntryHit
Definition: CaloAxis.h:276
void SetDirection(Vec3D dir)
Set the direction.
Definition: CaloAxis.h:249
void SetEigenvectors(std::array< Point, 3 > eig)
Set the eigenvectors.
Definition: CaloAxis.h:259
CaloAxisAlgoType
Definition: CaloAxis.h:34
A class describing a vector in 3D space.
Definition: Vec3D.h:33
Data structure for the Calo geometry parameters.
Definition: CaloGeoParams.h:29
CaloAxisAlgoType m_axisAlgo
Definition: CaloAxis.h:268
std::array< Point, 3 > m_axisEigenvectors
Definition: CaloAxis.h:271
std::array< double, 3 > AxisSigma(const CaloGeoParams &geoParams)
Axis Sigma around COG (cm).
Definition: CaloAxis.h:78
Class describing a line in the 3D space.
Definition: Line.h:32
std::array< double, 3 > AxisKurtosis(const CaloGeoParams &geoParams)
Axis Kurtosis around COG (adim).
Definition: CaloAxis.h:104
double m_axisPathlengthHit
Definition: CaloAxis.h:278
void SetAlgoType(CaloAxisAlgoType algoType)
Definition: CaloAxis.h:239
std::array< Point, 3 > Eigenvectors() const
Eigenvectors of Axis Covariance matrix.
Definition: CaloAxis.h:139
void SetEigenvalues(std::array< double, 3 > eig)
Set the eigenvalues.
Definition: CaloAxis.h:254
CaloHits m_caloHits
Definition: CaloAxis.h:280
std::array< double, 3 > AxisSkewness(const CaloGeoParams &geoParams)
Axis Skewness around COG (adim).
Definition: CaloAxis.h:91
std::array< double, 3 > m_axisSigma
Definition: CaloAxis.h:273
std::array< double, 3 > m_axisEigenvalues
Definition: CaloAxis.h:270
float EDep() const
Get the deposited energy.
Definition: Hit.h:45
std::array< double, 3 > m_axisKurtosis
Definition: CaloAxis.h:275
Hit object for transient data model.
Definition: Hit.h:30
std::array< double, 3 > Eigenvalues() const
Eigenvalues of Axis Covariance matrix.
Definition: CaloAxis.h:132
Point m_axisCOG
Definition: CaloAxis.h:269
Container for the hits of a single CALO detector.