Skip to content

Commit 4590496

Browse files
committed
DataFormats: first steps toward a unified barrel/fwd track
1 parent aafbebf commit 4590496

13 files changed

Lines changed: 512 additions & 304 deletions

File tree

DataFormats/Reconstruction/include/ReconstructionDataFormats/GlobalFwdTrack.h

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,15 @@
1515
#ifndef ALICEO2_TRACKGLOBALFWD_H
1616
#define ALICEO2_TRACKGLOBALFWD_H
1717

18+
#include <array>
1819
#include "ReconstructionDataFormats/TrackFwd.h"
1920
#include "ReconstructionDataFormats/MatchInfoFwd.h"
20-
#include "Math/SMatrix.h"
2121

2222
namespace o2
2323
{
2424
namespace dataformats
2525
{
26-
using SMatrix5 = ROOT::Math::SVector<Double_t, 5>;
27-
using SMatrix55Sym = ROOT::Math::SMatrix<double, 5, 5, ROOT::Math::MatRepSym<double, 5>>;
26+
using FwdResiduals = std::array<double, 5>;
2827

2928
class GlobalFwdTrack : public o2::track::TrackParCovFwd, public o2::dataformats::MatchInfoFwd
3029
{
@@ -34,15 +33,15 @@ class GlobalFwdTrack : public o2::track::TrackParCovFwd, public o2::dataformats:
3433
GlobalFwdTrack(o2::track::TrackParCovFwd const& t) { *this = t; }
3534
~GlobalFwdTrack() = default;
3635

37-
SMatrix5 computeResiduals2Cov(const o2::track::TrackParCovFwd& t) const
36+
FwdResiduals computeResiduals2Cov(const o2::track::TrackParCovFwd& t) const
3837
{
39-
SMatrix5 Residuals2Cov;
38+
FwdResiduals Residuals2Cov;
4039

41-
Residuals2Cov(0) = (getX() - t.getX()) / TMath::Sqrt(getCovariances()(0, 0) + t.getCovariances()(0, 0));
42-
Residuals2Cov(1) = (getY() - t.getY()) / TMath::Sqrt(getCovariances()(1, 1) + t.getCovariances()(1, 1));
43-
Residuals2Cov(2) = (getPhi() - t.getPhi()) / TMath::Sqrt(getCovariances()(2, 2) + t.getCovariances()(2, 2));
44-
Residuals2Cov(3) = (getTanl() - t.getTanl()) / TMath::Sqrt(getCovariances()(3, 3) + t.getCovariances()(3, 3));
45-
Residuals2Cov(4) = (getInvQPt() - t.getInvQPt()) / TMath::Sqrt(getCovariances()(4, 4) + t.getCovariances()(4, 4));
40+
Residuals2Cov[0] = (getX() - t.getX()) / o2::math_utils::sqrtd(getSigma2X() + t.getSigma2X());
41+
Residuals2Cov[1] = (getY() - t.getY()) / o2::math_utils::sqrtd(getSigma2Y() + t.getSigma2Y());
42+
Residuals2Cov[2] = (getPhi() - t.getPhi()) / o2::math_utils::sqrtd(getSigma2Phi() + t.getSigma2Phi());
43+
Residuals2Cov[3] = (getTanl() - t.getTanl()) / o2::math_utils::sqrtd(getSigma2Tanl() + t.getSigma2Tanl());
44+
Residuals2Cov[4] = (getInvQPt() - t.getInvQPt()) / o2::math_utils::sqrtd(getSigma2InvQPt() + t.getSigma2InvQPt());
4645
return Residuals2Cov;
4746
}
4847

DataFormats/Reconstruction/include/ReconstructionDataFormats/Track.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ using TrackParCovF = TrackParametrizationWithError<float>;
3232
using TrackParCovD = TrackParametrizationWithError<double>;
3333
using TrackParCov = TrackParCovF;
3434

35+
static_assert(sizeof(TrackPar) == sizeof(TrackPar::base_t) + 8);
36+
static_assert(sizeof(TrackParCov) == sizeof(TrackPar) + sizeof(TrackParCov::covMat_t));
37+
3538
} // namespace track
3639
} // namespace o2
3740

DataFormats/Reconstruction/include/ReconstructionDataFormats/TrackFwd.h

Lines changed: 118 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -17,29 +17,32 @@
1717
#ifndef ALICEO2_BASE_TRACKFWD
1818
#define ALICEO2_BASE_TRACKFWD
1919

20-
#include <Rtypes.h>
21-
#include <TMath.h>
22-
#include "Math/SMatrix.h"
20+
#include <array>
21+
#include "GPUCommonRtypes.h"
22+
#ifndef GPUCA_GPUCODE_DEVICE
23+
#include <ostream>
24+
#endif
2325
#include "MathUtils/Utils.h"
2426
#include "ReconstructionDataFormats/TrackUtils.h"
27+
#include "ReconstructionDataFormats/TrackParametrizationData.h"
2528
#include "MathUtils/Primitive2D.h"
2629

2730
namespace o2::track
2831
{
2932

30-
using SMatrix55Sym = ROOT::Math::SMatrix<double, 5, 5, ROOT::Math::MatRepSym<double, 5>>;
31-
using SMatrix55Std = ROOT::Math::SMatrix<double, 5>;
32-
using SMatrix5 = ROOT::Math::SVector<Double_t, 5>;
33-
3433
template <typename value_T>
3534
class TrackParametrization; // fwd declaration for conversion method
3635

3736
template <typename value_T>
3837
class TrackParametrizationWithError; // fwd declaration for conversion method
3938

40-
class TrackParFwd
39+
class TrackParFwd : public TrackParametrizationData<float, 5>
4140
{ // Forward track parameterization, kinematics only.
4241
public:
42+
using value_t = float;
43+
using base_t = TrackParametrizationData<value_t, 5>;
44+
using params_t = std::array<value_t, 5>;
45+
4346
TrackParFwd() = default;
4447
~TrackParFwd() = default;
4548

@@ -52,76 +55,96 @@ class TrackParFwd
5255
void toBarrelTrackPar(TrackParametrization<T>& t) const;
5356

5457
/// return Z coordinate (cm)
55-
Double_t getZ() const { return mZ; }
58+
value_t getZ() const { return mX; }
5659
/// set Z coordinate (cm)
57-
void setZ(Double_t z) { mZ = z; }
58-
Double_t getX() const { return mParameters(0); }
59-
void setX(Double_t x) { mParameters(0) = x; }
60+
void setZ(value_t z) { mX = z; }
61+
value_t getX() const { return mP[0]; }
62+
void setX(value_t x) { mP[0] = x; }
6063

61-
Double_t getY() const { return mParameters(1); }
62-
void setY(Double_t y) { mParameters(1) = y; }
64+
value_t getY() const { return mP[1]; }
65+
void setY(value_t y) { mP[1] = y; }
6366

64-
void setPhi(Double_t phi) { mParameters(2) = phi; }
65-
Double_t getPhi() const { return mParameters(2); }
67+
void setPhi(value_t phi) { mP[2] = phi; }
68+
value_t getPhi() const { return mP[2]; }
6669

67-
Double_t getSnp() const
70+
value_t getSnp() const
6871
{
69-
return o2::math_utils::sin(mParameters(2));
72+
return o2::math_utils::sin(mP[2]);
7073
}
7174

72-
Double_t getCsp2() const
75+
value_t getCsp2() const
7376
{
74-
auto snp = o2::math_utils::sin(mParameters(2));
75-
Double_t csp;
76-
csp = std::sqrt((1. - snp) * (1. + snp));
77+
auto snp = o2::math_utils::sin(mP[2]);
78+
value_t csp = o2::math_utils::sqrt((value_t(1) - snp) * (value_t(1) + snp));
7779
return csp * csp;
7880
}
7981

80-
void setTanl(Double_t tanl) { mParameters(3) = tanl; }
81-
Double_t getTanl() const { return mParameters(3); }
82+
void setTanl(value_t tanl) { mP[3] = tanl; }
83+
value_t getTanl() const { return mP[3]; }
8284

83-
Double_t getTgl() const { return mParameters(3); } // for the sake of helixhelper
85+
value_t getTgl() const { return mP[3]; } // for the sake of helixhelper
8486

85-
void setInvQPt(Double_t invqpt) { mParameters(4) = invqpt; }
86-
Double_t getInvQPt() const { return mParameters(4); } // return Inverse charged pt
87-
Double_t getPt() const { return TMath::Abs(1.f / mParameters(4)); }
88-
Double_t getInvPt() const { return TMath::Abs(mParameters(4)); }
89-
Double_t getPx() const { return TMath::Cos(getPhi()) * getPt(); } // return px
90-
Double_t getPy() const { return TMath::Sin(getPhi()) * getPt(); } // return py
91-
Double_t getPz() const { return getTanl() * getPt(); } // return pz
92-
Double_t getP() const { return getPt() * TMath::Sqrt(1. + getTanl() * getTanl()); } // return total momentum
93-
Double_t getInverseMomentum() const { return 1.f / getP(); }
87+
void setInvQPt(value_t invqpt) { mP[4] = invqpt; }
88+
value_t getInvQPt() const { return mP[4]; } // return Inverse charged pt
89+
value_t getPt() const { return o2::math_utils::abs(value_t(1) / mP[4]); }
90+
value_t getInvPt() const { return o2::math_utils::abs(mP[4]); }
91+
value_t getPx() const { return o2::math_utils::cos(getPhi()) * getPt(); } // return px
92+
value_t getPy() const { return o2::math_utils::sin(getPhi()) * getPt(); } // return py
93+
value_t getPz() const { return getTanl() * getPt(); } // return pz
94+
value_t getP() const { return getPt() * o2::math_utils::sqrt(value_t(1) + getTanl() * getTanl()); }
95+
value_t getInverseMomentum() const { return value_t(1) / getP(); }
9496

95-
Double_t getTheta() const { return TMath::PiOver2() - TMath::ATan(getTanl()); }
96-
Double_t getEta() const { return -TMath::Log(TMath::Tan(getTheta() / 2)); } // return total momentum
97+
value_t getTheta() const { return value_t(0.5) * o2::math_utils::pi() - o2::math_utils::atan(getTanl()); }
98+
value_t getEta() const { return -o2::math_utils::log(o2::math_utils::tan(getTheta() / value_t(2))); } // return total momentum
9799

98-
Double_t getCurvature(double b) const
100+
value_t getCurvature(value_t b) const
99101
{
100102
auto invqpt = getInvQPt();
101103
return o2::constants::math::B2C * b * invqpt;
102104
}
103105

104106
/// return the charge (assumed forward motion)
105-
Double_t getCharge() const { return TMath::Sign(1., mParameters(4)); }
107+
int getCharge() const { return mP[4] >= 0.f ? 1 : -1; }
106108
/// set the charge (assumed forward motion)
107-
void setCharge(Double_t charge)
109+
void setCharge(int charge)
108110
{
109-
if (charge * mParameters(4) < 0.) {
110-
mParameters(4) *= -1.;
111+
if (charge * mP[4] < 0.) {
112+
mP[4] *= -1.;
111113
}
112114
}
113115

114116
/// return track parameters
115-
const SMatrix5& getParameters() const { return mParameters; }
117+
const value_t* getParameters() const { return mP; }
118+
const value_t* getParams() const { return mP; }
119+
params_t getParametersArray() const
120+
{
121+
params_t params;
122+
for (int i = 0; i < 5; ++i) {
123+
params[i] = mP[i];
124+
}
125+
return params;
126+
}
116127
/// set track parameters
117-
void setParameters(const SMatrix5& parameters) { mParameters = parameters; }
128+
void setParameters(const params_t& parameters) { setParameters(parameters.data()); }
129+
void setParameters(const value_t* parameters)
130+
{
131+
for (int i = 0; i < 5; ++i) {
132+
mP[i] = parameters[i];
133+
}
134+
}
118135
/// add track parameters
119-
void addParameters(const SMatrix5& parameters) { mParameters += parameters; }
136+
void addParameters(const params_t& parameters) { addParameters(parameters.data()); }
137+
void addParameters(const value_t* parameters)
138+
{
139+
for (int i = 0; i < 5; ++i) {
140+
mP[i] += parameters[i];
141+
}
142+
}
120143

121144
/// return the chi2 of the track when the associated cluster was attached
122-
Double_t getTrackChi2() const { return mTrackChi2; }
145+
value_t getTrackChi2() const { return mTrackChi2; }
123146
/// set the chi2 of the track when the associated cluster was attached
124-
void setTrackChi2(Double_t chi2) { mTrackChi2 = chi2; }
147+
void setTrackChi2(value_t chi2) { mTrackChi2 = chi2; }
125148

126149
// Track parameter propagation
127150
void propagateParamToZlinear(double zEnd);
@@ -130,43 +153,52 @@ class TrackParFwd
130153
void getCircleParams(float bz, o2::math_utils::CircleXY<float>& c, float& sna, float& csa) const;
131154

132155
protected:
133-
Double_t mZ = 0.; ///< Z coordinate (cm)
156+
using base_t::mP;
157+
using base_t::mX;
134158

135159
/// Track parameters ordered as follow: <pre>
136160
/// X = X coordinate (cm)
137161
/// Y = Y coordinate (cm)
138162
/// PHI = azimutal angle
139163
/// TANL = tangent of \lambda (dip angle)
140164
/// INVQPT = Inverse transverse momentum (GeV/c ** -1) times charge (assumed forward motion) </pre>
141-
SMatrix5 mParameters{}; ///< \brief Track parameters
142-
Double_t mTrackChi2 = 0.; ///< Chi2 of the track when the associated cluster was attached
165+
value_t mTrackChi2 = 0.; ///< Chi2 of the track when the associated cluster was attached
143166

144167
ClassDefNV(TrackParFwd, 1);
145168
};
146169

147-
class TrackParCovFwd : public TrackParFwd
170+
class TrackParCovFwd : public TrackParFwd, public TrackCovarianceData<TrackParFwd::value_t, 15>
148171
{ // Forward track+error parameterization
149172
public:
173+
using cov_base_t = TrackCovarianceData<value_t, 15>;
174+
using covMat_t = std::array<value_t, 15>;
175+
struct cov_view_t {
176+
const value_t* data = nullptr;
177+
value_t operator()(int i, int j) const { return data[TrackParCovFwd::covIndex(i, j)]; }
178+
};
150179
using TrackParFwd::TrackParFwd; // inherit base constructors
151180

152181
TrackParCovFwd() = default;
153182
~TrackParCovFwd() = default;
154183
TrackParCovFwd& operator=(const TrackParCovFwd& tpf) = default;
155-
TrackParCovFwd(const Double_t z, const SMatrix5& parameters, const SMatrix55Sym& covariances, const Double_t chi2);
184+
TrackParCovFwd(value_t z, const params_t& parameters, const covMat_t& covariances, value_t chi2);
156185

157186
template <typename T>
158187
void toBarrelTrackParCov(TrackParametrizationWithError<T>& t) const;
159188

160-
const SMatrix55Sym& getCovariances() const { return mCovariances; }
161-
void setCovariances(const SMatrix55Sym& covariances) { mCovariances = covariances; }
162-
void deleteCovariances() { mCovariances = SMatrix55Sym(); }
189+
cov_view_t getCovariances() const { return {mC.data()}; }
190+
const covMat_t& getCov() const { return mC; }
191+
value_t getCovarElem(int i, int j) const { return mC[covIndex(i, j)]; }
192+
void setCovariances(const covMat_t& covariances) { mC = covariances; }
193+
void setCovariances(const value_t* covariances);
194+
void deleteCovariances() { mC = {}; }
163195

164-
Double_t getSigma2X() const { return mCovariances(0, 0); }
165-
Double_t getSigma2Y() const { return mCovariances(1, 1); }
166-
Double_t getSigmaXY() const { return mCovariances(0, 1); }
167-
Double_t getSigma2Phi() const { return mCovariances(2, 2); }
168-
Double_t getSigma2Tanl() const { return mCovariances(3, 3); }
169-
Double_t getSigma2InvQPt() const { return mCovariances(4, 4); }
196+
value_t getSigma2X() const { return mC[covIndex(0, 0)]; }
197+
value_t getSigma2Y() const { return mC[covIndex(1, 1)]; }
198+
value_t getSigmaXY() const { return mC[covIndex(0, 1)]; }
199+
value_t getSigma2Phi() const { return mC[covIndex(2, 2)]; }
200+
value_t getSigma2Tanl() const { return mC[covIndex(3, 3)]; }
201+
value_t getSigma2InvQPt() const { return mC[covIndex(4, 4)]; }
170202

171203
// Propagate parameters and covariances matrix
172204
void propagateToZlinear(double zEnd);
@@ -187,17 +219,42 @@ class TrackParCovFwd : public TrackParFwd
187219

188220
bool getCovXYZPxPyPzGlo(std::array<float, 21>& cv) const;
189221

222+
static constexpr int covIndex(int i, int j)
223+
{
224+
return i >= j ? i * (i + 1) / 2 + j : j * (j + 1) / 2 + i;
225+
}
226+
227+
protected:
228+
using cov_base_t::mC;
229+
190230
private:
191231
/// Covariance matrix of track parameters, ordered as follows: <pre>
192232
/// <X,X> <Y,X> <PHI,X> <TANL,X> <INVQPT,X>
193233
/// <X,Y> <Y,Y> <PHI,Y> <TANL,Y> <INVQPT,Y>
194234
/// <X,PHI> <Y,PHI> <PHI,PHI> <TANL,PHI> <INVQPT,PHI>
195235
/// <X,TANL> <Y,TANL> <PHI,TANL> <TANL,TANL> <INVQPT,TANL>
196236
/// <X,INVQPT> <Y,INVQPT> <PHI,INVQPT> <TANL,INVQPT> <INVQPT,INVQPT> </pre>
197-
SMatrix55Sym mCovariances{}; ///< \brief Covariance matrix of track parameters
198237
ClassDefNV(TrackParCovFwd, 1);
199238
};
200239

240+
static_assert(sizeof(TrackParFwd) == sizeof(TrackParFwd::base_t) + sizeof(TrackParFwd::value_t));
241+
static_assert(sizeof(TrackParCovFwd) == sizeof(TrackParFwd) + 15 * sizeof(TrackParFwd::value_t));
242+
243+
#ifndef GPUCA_GPUCODE_DEVICE
244+
inline std::ostream& operator<<(std::ostream& os, const TrackParCovFwd::cov_view_t& cov)
245+
{
246+
for (int i = 0; i < 5; ++i) {
247+
for (int j = 0; j <= i; ++j) {
248+
os << cov(i, j);
249+
if (i != 4 || j != 4) {
250+
os << ' ';
251+
}
252+
}
253+
}
254+
return os;
255+
}
256+
#endif
257+
201258
} // namespace o2::track
202259

203260
#endif

0 commit comments

Comments
 (0)