ATTPCROOT  0.3.0-alpha
A ROOT-based framework for analyzing data from active target detectors
AtTrack.h
Go to the documentation of this file.
1 #ifndef ATTRACK_H
2 #define ATTRACK_H
3 
4 #include "AtContainerManip.h"
5 #include "AtHit.h"
6 #include "AtHitCluster.h"
7 #include "AtPattern.h" // IWYU pragma: keep
8 
9 #include <Math/Point3D.h>
10 #include <Math/Point3Dfwd.h>
11 #include <Rtypes.h>
12 #include <TMath.h>
13 #include <TObject.h>
14 
15 #include <algorithm>
16 #include <iostream>
17 #include <memory>
18 #include <utility>
19 #include <vector>
20 
21 class TBuffer;
22 class TClass;
23 class TMemberInspector;
24 
25 class AtTrack : public TObject {
26 
27 protected:
29  using HitPtr = std::unique_ptr<AtHit>;
30  using HitVector = std::vector<HitPtr>;
31  using PatternPtr = std::unique_ptr<AtPatterns::AtPattern>;
32 
33  // Attributes shared by all track finding algorithms
34  Int_t fTrackID{-1};
36  PatternPtr fPattern{nullptr};
37  Bool_t fIsMerged{false};
38  Double_t fVertexToZDist{0};
39 
40  // Used by AtPRA
41  Double_t fGeoThetaAngle{}; //< Geometrical scattering angle with respect to the detector FitParameters
42  Double_t fGeoPhiAngle{}; //< " azimuthal "
43  Double_t fGeoRadius{}; //< Initial radius of curvature
44  std::pair<Double_t, Double_t> fGeoCenter; //< Center of the spiral track
45  std::vector<AtHitCluster> fHitClusterArray; //< Clusterized hits container. Can also be stored in fHitArray
46 
47 public:
48  AtTrack() = default;
49  AtTrack(const AtTrack &obj);
51  AtTrack(AtTrack &&) = default;
52  ~AtTrack() = default;
53 
60  friend void swap(AtTrack &a, AtTrack &b) noexcept
61  {
62  using std::swap; // Enable ADL
63 
64  swap(a.fTrackID, b.fTrackID);
65  swap(a.fHitArray, b.fHitArray);
66  swap(a.fHitClusterArray, b.fHitClusterArray);
67  swap(a.fPattern, b.fPattern);
68  swap(a.fIsMerged, b.fIsMerged);
69  swap(a.fVertexToZDist, b.fVertexToZDist);
70 
71  swap(a.fGeoThetaAngle, b.fGeoThetaAngle);
72  swap(a.fGeoPhiAngle, b.fGeoPhiAngle);
73  swap(a.fGeoRadius, b.fGeoRadius);
74  swap(a.fGeoCenter, b.fGeoCenter);
75  };
76 
77  // Getters
78  Int_t GetTrackID() const { return fTrackID; }
80  const HitVector &GetHitArray() const { return fHitArray; }
81 
83  // const std::vector<AtHit> &GetHitArrayConst() const { return fHitArray; }
84  const AtPatterns::AtPattern *GetPattern() const { return fPattern.get(); }
85 
86  Double_t GetGeoTheta() const { return fGeoThetaAngle; }
87  Double_t GetGeoPhi() const { return fGeoPhiAngle; }
88  Double_t GetGeoRadius() const { return fGeoRadius; }
89  std::pair<Double_t, Double_t> GetGeoCenter() const { return fGeoCenter; }
90  std::vector<AtHitCluster> *GetHitClusterArray() { return &fHitClusterArray; }
91 
92  Bool_t GetIsMerged() const { return fIsMerged; }
93  Double_t GetVertexToZDist() const { return fVertexToZDist; }
94 
95  // Setters
96  void SetTrackID(Int_t val) { fTrackID = val; }
97  void AddHit(const AtHit &hit) { fHitArray.emplace_back(std::make_unique<AtHit>(hit)); }
98  void AddHit(HitPtr hit) { fHitArray.push_back(std::move(hit)); }
99  void SetPattern(std::unique_ptr<AtPatterns::AtPattern> pat) { fPattern = std::move(pat); }
100 
101  void SetGeoTheta(Double_t angle) { fGeoThetaAngle = angle; }
102  void SetGeoPhi(Double_t angle) { fGeoPhiAngle = angle; }
103  void SetGeoRadius(Double_t radius) { fGeoRadius = radius; }
104  void SetGeoCenter(std::pair<Double_t, Double_t> center) { fGeoCenter = center; }
105  void AddClusterHit(std::shared_ptr<AtHitCluster> hitCluster);
106 
107  void SetIsMerged(bool val) { fIsMerged = val; }
108  void SetVertexToZDist(Double_t val) { fVertexToZDist = val; }
109 
110  // Operations
112 
113  Double_t GetMeanTime();
114  Double_t GetLinearRange();
115  Double_t GetLinearRange(XYZPoint vertex);
116 
117  Double_t GetGeoQEnergy();
120  static Double_t GetLinearRange(const XYZPoint &vertex, const XYZPoint &maxPos);
121 
122  void SortHitArrayTime();
123  void SortClusterHitArrayZ();
124 
125 protected:
126  static Bool_t SortClusterHitZ(const AtHitCluster &lhs, const AtHitCluster &rhs)
127  {
128  return lhs.GetPosition().Z() < rhs.GetPosition().Z();
129  }
130 
131  friend inline std::ostream &operator<<(std::ostream &o, const AtTrack &track)
132  {
133  std::cout << " ====================================================== " << std::endl;
134  std::cout << " Track " << track.fTrackID << " Info : " << std::endl;
135  std::cout << " Geomterical Scattering Angle : " << track.fGeoThetaAngle * (180.0 / TMath::Pi()) << " deg "
136  << " - Geomterical Azimuthal Angle : " << track.fGeoPhiAngle * (180.0 / TMath::Pi()) << " deg "
137  << std::endl;
138 
139  return o;
140  }
141 
143 };
144 
145 #endif
AtTrack::GetGeoPhi
Double_t GetGeoPhi() const
Definition: AtTrack.h:87
AtTrack::SetPattern
void SetPattern(std::unique_ptr< AtPatterns::AtPattern > pat)
Definition: AtTrack.h:99
swap
void swap(AtPad &a, AtPad &b) noexcept
Definition: AtPad.cxx:22
AtTrack::swap
friend void swap(AtTrack &a, AtTrack &b) noexcept
ADL-findable swap for AtTrack.
Definition: AtTrack.h:60
AtTrack::PatternPtr
std::unique_ptr< AtPatterns::AtPattern > PatternPtr
Definition: AtTrack.h:31
AtTrack::fTrackID
Int_t fTrackID
Definition: AtTrack.h:34
AtTrack::SetGeoTheta
void SetGeoTheta(Double_t angle)
Definition: AtTrack.h:101
ContainerManip::GetObjectVector
std::vector< T > GetObjectVector(const std::vector< std::unique_ptr< T >> &vec)
Definition: AtContainerManip.h:125
AtTrack::GetGeoRadius
Double_t GetGeoRadius() const
Definition: AtTrack.h:88
AtHitCluster
: Class representing a cluster of hits that arise from the same deposition of charge in space....
Definition: AtHitCluster.h:37
AtTrack::ResetHitClusterArray
void ResetHitClusterArray()
Definition: AtTrack.h:111
AtHitCluster.h
AtTrack::fIsMerged
Bool_t fIsMerged
Definition: AtTrack.h:37
AtTrack::fPattern
PatternPtr fPattern
Definition: AtTrack.h:36
AtTrack::SortClusterHitArrayZ
void SortClusterHitArrayZ()
Definition: AtTrack.cxx:124
AtPattern.h
AtTrack::ClassDef
ClassDef(AtTrack, 3)
AtTrack::fGeoPhiAngle
Double_t fGeoPhiAngle
Definition: AtTrack.h:42
AtTrack::operator=
AtTrack & operator=(AtTrack obj)
Copy assignment using copy-swap idiom.
Definition: AtTrack.cxx:22
AtTrack::GetHitArrayObject
std::vector< AtHit > GetHitArrayObject()
Definition: AtTrack.h:82
AtTrack::GetMeanTime
Double_t GetMeanTime()
Definition: AtTrack.cxx:71
AtTrack::fVertexToZDist
Double_t fVertexToZDist
Definition: AtTrack.h:38
AtTrack::SortHitArrayTime
void SortHitArrayTime()
Definition: AtTrack.cxx:119
AtTrack::SetGeoRadius
void SetGeoRadius(Double_t radius)
Definition: AtTrack.h:103
AtTrack::fHitClusterArray
std::vector< AtHitCluster > fHitClusterArray
Definition: AtTrack.h:45
AtTrack::SortClusterHitZ
static Bool_t SortClusterHitZ(const AtHitCluster &lhs, const AtHitCluster &rhs)
Definition: AtTrack.h:126
AtTrack::GetLinearRange
Double_t GetLinearRange()
Definition: AtTrack.cxx:83
XYZPoint
ROOT::Math::XYZPoint XYZPoint
Definition: AtPatternCircle2D.h:18
AtPatterns::AtPattern
Describes a shape in 3D space.
Definition: AtPattern.h:40
AtTrack::fGeoRadius
Double_t fGeoRadius
Definition: AtTrack.h:43
AtTrack::HitVector
std::vector< HitPtr > HitVector
Definition: AtTrack.h:30
AtTrack::GetVertexToZDist
Double_t GetVertexToZDist() const
Definition: AtTrack.h:93
AtTrack::operator<<
friend std::ostream & operator<<(std::ostream &o, const AtTrack &track)
Definition: AtTrack.h:131
AtTrack::GetIsMerged
Bool_t GetIsMerged() const
Definition: AtTrack.h:92
AtHit::GetPosition
const XYZPoint & GetPosition() const
Definition: AtHit.h:79
AtTrack::SetGeoPhi
void SetGeoPhi(Double_t angle)
Definition: AtTrack.h:102
AtHit.h
AtTrack::GetHitClusterArray
std::vector< AtHitCluster > * GetHitClusterArray()
Definition: AtTrack.h:90
AtTrack
Definition: AtTrack.h:25
AtTrack::~AtTrack
~AtTrack()=default
AtTrack::AtTrack
AtTrack(AtTrack &&)=default
AtTrack::HitPtr
std::unique_ptr< AtHit > HitPtr
Definition: AtTrack.h:29
AtTrack::AddClusterHit
void AddClusterHit(std::shared_ptr< AtHitCluster > hitCluster)
Definition: AtTrack.cxx:38
AtTrack::GetGeoQEnergy
Double_t GetGeoQEnergy()
Definition: AtTrack.cxx:107
AtTrack::GetTrackID
Int_t GetTrackID() const
Definition: AtTrack.h:78
AtTrack::SetGeoCenter
void SetGeoCenter(std::pair< Double_t, Double_t > center)
Definition: AtTrack.h:104
AtTrack::GetLastPoint
XYZPoint GetLastPoint()
Definition: AtTrack.cxx:43
AtTrack::SetIsMerged
void SetIsMerged(bool val)
Definition: AtTrack.h:107
AtTrack::fGeoCenter
std::pair< Double_t, Double_t > fGeoCenter
Definition: AtTrack.h:44
AtContainerManip.h
AtTrack::GetPattern
const AtPatterns::AtPattern * GetPattern() const
Definition: AtTrack.h:84
AtTrack::AtTrack
AtTrack()=default
AtTrack::GetGeoCenter
std::pair< Double_t, Double_t > GetGeoCenter() const
Definition: AtTrack.h:89
AtTrack::fGeoThetaAngle
Double_t fGeoThetaAngle
Definition: AtTrack.h:41
AtTrack::GetGeoTheta
Double_t GetGeoTheta() const
Definition: AtTrack.h:86
AtTrack::AddHit
void AddHit(HitPtr hit)
Definition: AtTrack.h:98
AtTrack::SetVertexToZDist
void SetVertexToZDist(Double_t val)
Definition: AtTrack.h:108
AtTrack::fHitArray
HitVector fHitArray
Definition: AtTrack.h:35
AtTrack::GetFirstPoint
XYZPoint GetFirstPoint()
Definition: AtTrack.cxx:57
AtTrack::GetHitArray
HitVector & GetHitArray()
Definition: AtTrack.h:79
AtTrack::XYZPoint
ROOT::Math::XYZPoint XYZPoint
Definition: AtTrack.h:28
AtTrack::GetHitArray
const HitVector & GetHitArray() const
Definition: AtTrack.h:80
AtTrack::SetTrackID
void SetTrackID(Int_t val)
Definition: AtTrack.h:96
AtHit
Point in space with charge.
Definition: AtHit.h:27
AtTrack::AddHit
void AddHit(const AtHit &hit)
Definition: AtTrack.h:97