LDMX Software
TruthTrack.h
1#pragma once
2
3#include <TObject.h>
4
5#include <vector>
6
7namespace ldmx {
8
9class TruthTrack {
10 public:
14 TruthTrack() = default;
15
16 virtual ~TruthTrack() = default;
24 // TruthTrack(const ldmx::SimParticle &particle);
25
26 friend std::ostream& operator<<(std::ostream& o, const TruthTrack& d);
27
36 // TruthTrack(const ldmx::SimParticle &particle,
37 // const ldmx::SimTrackerHit &hit) {};
38
47 // TruthTrack(const std::vector<double> &pos_vec,
48 // const std::vector<double> &p_vec, int charge){};
49
50 /*
51 Acts::Vector3 pos_{pos_vec.data()};
52 Acts::Vector3 mom{p_vec.data()};
53 double time{0.};
54
55 // Rotate the position and momentum into the ACTS frame.
56 pos_ = tracking::sim::utils::Ldmx2Acts(pos_);
57 mom = tracking::sim::utils::Ldmx2Acts(mom);
58
59 // Get the charge of the particle.
60 // TODO: Add function that uses the PDG ID to calculate this.
61 double q{charge * Acts::UnitConstants::e};
62
63 // Transform the position, momentum and charge to free parameters.
64 auto free_params{tracking::sim::utils::toFreeParameters(pos_, mom, q)};
65
66 // Create a line surface at the perigee. The perigee position is extracted
67 // from a particle's vertex or the particle's position at a specific
68 // scoring plane.
69 auto gen_surface{Acts::Surface::makeShared<Acts::PerigeeSurface>(
70 Acts::Vector3(free_params[Acts::eFreePos0],
71 free_params[Acts::eFreePos1], free_params[Acts::eFreePos2]))};
72
73 // Transform the parameters to local positions on the perigee surface.
74 auto bound_params{Acts::detail::transformFreeToBoundParameters(
75 free_params, *gen_surface, gctx_)
76 .value()};
77
78 // Create the seed track object.
79 auto seed_track = ldmx::Track();
80 seed_track.setPerigeeLocation(free_params[Acts::eFreePos0],
81 free_params[Acts::eFreePos1],
82 free_params[Acts::eFreePos2]);
83
84
85 seed_track.setPerigeeParameters(
86 tracking::sim::utils::convertActsToLdmxPars(bound_params));
87
88
89 };
90 */
91
92 void setTrackID(int trackid) { track_id_ = trackid; };
93 int getTrackID() const { return track_id_; };
94
95 void setPdgID(int pdgID) { pdg_id_ = pdgID; };
96 int getPdgID() const { return pdg_id_; };
97
98 void setNhits(int nHits) { n_hits_ = nHits; };
99 int getNhits() const { return n_hits_; }
100
101 // in units of e
102 int q() const { return perigee_pars_[4] > 0 ? 1 : -1; }
103
104 // Vector representation
105 void setPerigeeParameters(const std::vector<double>& par) {
106 perigee_pars_ = par;
107 }
108 std::vector<double> getPerigeeParameters() const { return perigee_pars_; }
109
110 void setPerigeeLocation(const std::vector<double>& perigee) {
111 perigee_ = perigee;
112 }
113
114 void setPerigeeLocation(const double& x_, const double& y_,
115 const double& z_) {
116 perigee_[0] = x_;
117 perigee_[1] = y_;
118 perigee_[2] = z_;
119 }
120
121 void setMomentum(const double& px, const double& py, const double& pz) {
122 momentum_[0] = px;
123 momentum_[1] = py;
124 momentum_[2] = pz;
125 }
126
127 void setPosition(const double& x_, const double& y_, const double& z_) {
128 position_[0] = x_;
129 position_[1] = y_;
130 position_[2] = z_;
131 }
132
133 std::vector<double> getPerigeeLocation() const { return perigee_; };
134 double getPerigeeX() const { return perigee_[0]; };
135 double getPerigeeY() const { return perigee_[1]; };
136 double getPerigeeZ() const { return perigee_[2]; };
137
138 std::vector<double> getMomentum() const { return momentum_; };
139 std::vector<double> getPosition() const { return position_; };
140
141 // getters -- TODO use an enum instead
142
143 double getD0() const { return perigee_pars_[0]; };
144 double getZ0() const { return perigee_pars_[1]; };
145 double getPhi() const { return perigee_pars_[2]; };
146 double getTheta() const { return perigee_pars_[3]; };
147 double getQoP() const { return perigee_pars_[4]; };
148 double getT() const { return perigee_pars_[5]; };
149
150 friend std::ostream& operator<<(std::ostream& output, const TruthTrack& trk);
151
152 private:
153 // 6 elements
154 // d0 / z0 / phi / theta / qop / t
155 std::vector<double> perigee_pars_{0., 0., 0., 0., 0., 0.};
156
157 // The perigee location
158 std::vector<double> perigee_{0., 0., 0.};
159
160 // The 3-momentum at the perigee
161 std::vector<double> momentum_{0., 0., 0.};
162
163 // The 3-position at the perigee
164 std::vector<double> position_{0., 0., 0.};
165
166 // N hits_
167 int n_hits_{0};
168
169 // ID of the matched particle in the SimParticles map
170 int track_id_{-1};
171
172 // pdgID
173 int pdg_id_{0};
174
177
178}; // TruthTrack
179
180} // namespace ldmx
void setTrackID(int trackid)
Use the scoring plane hit at the target to extract (x_, y_, z_, px, py, pz) and create a track seed.
Definition TruthTrack.h:92
friend std::ostream & operator<<(std::ostream &o, const TruthTrack &d)
Use the vertex position of the SimParticle to extract (x_, y_, z_, px, py, pz, q) and create a track ...
Definition TruthTrack.cxx:8
ClassDef(TruthTrack, 3)
Class declaration needed by the ROOT dictionary.
TruthTrack()=default
default constructor