Skip to content

Commit 30fd1ca

Browse files
committed
Start of the generic CRTP interface to tracks
1 parent 4590496 commit 30fd1ca

7 files changed

Lines changed: 308 additions & 40 deletions

File tree

DataFormats/Reconstruction/include/ReconstructionDataFormats/Track.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ 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));
35+
static_assert(sizeof(TrackPar) == sizeof(TrackPar::base_t));
36+
static_assert(sizeof(TrackParCov) == sizeof(TrackPar) + sizeof(TrackParCov::cov_base_t));
3737

3838
} // namespace track
3939
} // namespace o2

DataFormats/Reconstruction/include/ReconstructionDataFormats/TrackFwd.h

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
#endif
2525
#include "MathUtils/Utils.h"
2626
#include "ReconstructionDataFormats/TrackUtils.h"
27-
#include "ReconstructionDataFormats/TrackParametrizationData.h"
27+
#include "ReconstructionDataFormats/TrackParametrizationInterface.h"
2828
#include "MathUtils/Primitive2D.h"
2929

3030
namespace o2::track
@@ -36,11 +36,12 @@ class TrackParametrization; // fwd declaration for conversion method
3636
template <typename value_T>
3737
class TrackParametrizationWithError; // fwd declaration for conversion method
3838

39-
class TrackParFwd : public TrackParametrizationData<float, 5>
39+
class TrackParFwd : public TrackParametrizationData<float, 5>, public TrackParFwdInterface<TrackParFwd, float>
4040
{ // Forward track parameterization, kinematics only.
4141
public:
4242
using value_t = float;
4343
using base_t = TrackParametrizationData<value_t, 5>;
44+
using fwd_interface_t = TrackParFwdInterface<TrackParFwd, value_t>;
4445
using params_t = std::array<value_t, 5>;
4546

4647
TrackParFwd() = default;
@@ -141,11 +142,6 @@ class TrackParFwd : public TrackParametrizationData<float, 5>
141142
}
142143
}
143144

144-
/// return the chi2 of the track when the associated cluster was attached
145-
value_t getTrackChi2() const { return mTrackChi2; }
146-
/// set the chi2 of the track when the associated cluster was attached
147-
void setTrackChi2(value_t chi2) { mTrackChi2 = chi2; }
148-
149145
// Track parameter propagation
150146
void propagateParamToZlinear(double zEnd);
151147
void propagateParamToZquadratic(double zEnd, double zField);
@@ -162,15 +158,15 @@ class TrackParFwd : public TrackParametrizationData<float, 5>
162158
/// PHI = azimutal angle
163159
/// TANL = tangent of \lambda (dip angle)
164160
/// INVQPT = Inverse transverse momentum (GeV/c ** -1) times charge (assumed forward motion) </pre>
165-
value_t mTrackChi2 = 0.; ///< Chi2 of the track when the associated cluster was attached
166161

167162
ClassDefNV(TrackParFwd, 1);
168163
};
169164

170-
class TrackParCovFwd : public TrackParFwd, public TrackCovarianceData<TrackParFwd::value_t, 15>
165+
class TrackParCovFwd : public TrackParFwd, public TrackCovarianceData<TrackParFwd::value_t, 15>, public TrackParCovFwdInterface<TrackParCovFwd, TrackParFwd::value_t>
171166
{ // Forward track+error parameterization
172167
public:
173168
using cov_base_t = TrackCovarianceData<value_t, 15>;
169+
using cov_interface_t = TrackParCovFwdInterface<TrackParCovFwd, value_t>;
174170
using covMat_t = std::array<value_t, 15>;
175171
struct cov_view_t {
176172
const value_t* data = nullptr;
@@ -237,8 +233,8 @@ class TrackParCovFwd : public TrackParFwd, public TrackCovarianceData<TrackParFw
237233
ClassDefNV(TrackParCovFwd, 1);
238234
};
239235

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));
236+
static_assert(sizeof(TrackParFwd) == sizeof(TrackParFwd::base_t));
237+
static_assert(sizeof(TrackParCovFwd) == sizeof(TrackParFwd) + sizeof(TrackParCovFwd::cov_base_t));
242238

243239
#ifndef GPUCA_GPUCODE_DEVICE
244240
inline std::ostream& operator<<(std::ostream& os, const TrackParCovFwd::cov_view_t& cov)

DataFormats/Reconstruction/include/ReconstructionDataFormats/TrackParametrization.h

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -274,25 +274,22 @@ class TrackParametrization : public TrackParametrizationData<value_T, kNParams>
274274
protected:
275275
using base_t::mP;
276276
using base_t::mX;
277+
using base_t::mAlpha;
278+
using base_t::mAbsCharge;
279+
using base_t::mPID;
280+
using base_t::mUserField;
277281

278282
private:
279-
//
280283
static constexpr value_t InvalidX = -99999.f;
281-
value_t mAlpha = 0.f; /// track frame angle
282-
char mAbsCharge = 1; /// Extra info about the abs charge, to be taken into account only if not 1
283-
PID mPID{PID::Pion}; /// 8 bit PID
284-
uint16_t mUserField = 0; /// field provided to user
285284

286285
ClassDefNV(TrackParametrization, 3);
287286
};
288287

289288
//____________________________________________________________
290289
template <typename value_T>
291290
GPUdi() TrackParametrization<value_T>::TrackParametrization(value_t x, value_t alpha, const params_t& par, int charge, const PID pid)
292-
: base_t{x}, mAlpha{alpha}, mAbsCharge{char(gpu::CAMath::Abs(charge))}, mPID{pid}
291+
: base_t{x, alpha, charge, pid}
293292
{
294-
// explicit constructor
295-
math_utils::detail::bringToPMPi<value_t>(mAlpha);
296293
for (int i = 0; i < kNParams; i++) {
297294
mP[i] = par[i];
298295
}

DataFormats/Reconstruction/include/ReconstructionDataFormats/TrackParametrizationData.h

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,21 @@
1717

1818
#include "GPUCommonDef.h"
1919
#include "GPUCommonRtypes.h"
20+
#include "MathUtils/Utils.h"
21+
#include "ReconstructionDataFormats/PID.h"
2022

2123
#include <array>
24+
#include <cstdint>
2225

2326
namespace o2::track
2427
{
2528

29+
template <typename derived_T, typename value_T, int nParams>
30+
class TrackParametrizationInterface;
31+
32+
template <typename derived_T, typename value_T, int nCov>
33+
class TrackCovarianceInterface;
34+
2635
template <typename value_T, int nParams>
2736
class TrackParametrizationData
2837
{
@@ -31,15 +40,27 @@ class TrackParametrizationData
3140

3241
GPUdDefault() TrackParametrizationData() = default;
3342
GPUd() explicit TrackParametrizationData(value_t s) : mX{s} {}
43+
GPUd() TrackParametrizationData(value_t s, value_t alpha, int charge, PID pid = PID::Pion)
44+
: mX{s}, mAlpha{alpha}, mAbsCharge{static_cast<char>(charge < 0 ? -charge : charge)}, mPID{pid}
45+
{
46+
math_utils::detail::bringToPMPi<value_t>(mAlpha);
47+
}
3448
GPUdDefault() TrackParametrizationData(const TrackParametrizationData&) = default;
3549
GPUdDefault() TrackParametrizationData(TrackParametrizationData&&) = default;
3650
GPUhdDefault() TrackParametrizationData& operator=(const TrackParametrizationData&) = default;
3751
GPUhdDefault() TrackParametrizationData& operator=(TrackParametrizationData&&) = default;
3852
GPUdDefault() ~TrackParametrizationData() = default;
3953

4054
protected:
41-
value_t mX = 0; ///< Intrinsic coordinate of the track parameterization
55+
value_t mX = 0; ///< Intrinsic coordinate of the track parameterization
4256
value_t mP[nParams] = {}; ///< Local track parameters
57+
value_t mAlpha = 0; ///< Track frame angle (where applicable)
58+
char mAbsCharge = 1; ///< Extra info about the abs charge, to be taken into account only if not 1
59+
PID mPID{PID::Pion}; ///< 8 bit PID
60+
uint16_t mUserField = 0; ///< Field provided to user
61+
62+
template <typename, typename, int>
63+
friend class TrackParametrizationInterface;
4364

4465
ClassDefNV(TrackParametrizationData, 1);
4566
};
@@ -59,6 +80,10 @@ class TrackCovarianceData
5980

6081
protected:
6182
std::array<value_t, nCov> mC{}; ///< Packed covariance matrix
83+
value_t mTrackChi2 = 0; ///< Chi2 of the track fit
84+
85+
template <typename, typename, int>
86+
friend class TrackCovarianceInterface;
6287

6388
ClassDefNV(TrackCovarianceData, 1);
6489
};

0 commit comments

Comments
 (0)