2222
2323namespace o2 ::gpu
2424{
25+
26+ template <template <template <class > class > class S , template <class > class F >
27+ struct CRTP { };
28+
29+ template <template <template <class > class > class S >
30+ struct CRTP <S, wrapper::value> {
31+ using Derived = S<wrapper::value>;
32+ constexpr operator S<wrapper::reference>() { return {{}, static_cast <Derived*>(this )->mParam , static_cast <Derived*>(this )->mSignCosPhi , static_cast <Derived*>(this )->mChi2 , static_cast <Derived*>(this )->mNDF }; };
33+ constexpr operator S<wrapper::const_reference>() const { return {{}, static_cast <const Derived*>(this )->mParam , static_cast <const Derived*>(this )->mSignCosPhi , static_cast <const Derived*>(this )->mChi2 , static_cast <const Derived*>(this )->mNDF }; };
34+ };
35+
36+ template <template <template <class > class > class S >
37+ struct CRTP <S, wrapper::reference> {
38+ using Derived = S<wrapper::reference>;
39+ constexpr operator S<wrapper::const_reference>() const { return {{}, static_cast <const Derived*>(this )->mParam , static_cast <const Derived*>(this )->mSignCosPhi , static_cast <const Derived*>(this )->mChi2 , static_cast <const Derived*>(this )->mNDF }; };
40+ };
41+
2542class GPUTPCTrackLinearisation ;
2643
2744/* *
@@ -32,16 +49,66 @@ class GPUTPCTrackLinearisation;
3249 *
3350 */
3451template <template <class > class F >
35- class GPUTPCTrackParamSkeleton
52+ class GPUTPCTrackParamSkeleton : public CRTP <GPUTPCTrackParamSkeleton, F>
3653{
3754 public:
55+
3856 struct GPUTPCTrackFitParam {
3957 float bethe, e, theta2, EP2, sigmadE2, k22, k33, k43, k44; // parameters
4058 };
4159
42- GPUd () const GPUTPCBaseTrackParam& GetParam () const { return mParam ; }
43- GPUd () void SetParam (const GPUTPCBaseTrackParam& v) { mParam = v; }
44- GPUd () void InitParam ();
60+ GPUd () GPUTPCBaseTrackParamSkeleton<wrapper::const_reference> GetParam () const { return mParam ; }
61+ GPUd () void SetParam (GPUTPCBaseTrackParamSkeleton<wrapper::const_reference> v) {
62+ mParam .mX = v.mX ;
63+ mParam .mC [0 ] = v.mC [0 ];
64+ mParam .mC [1 ] = v.mC [1 ];
65+ mParam .mC [2 ] = v.mC [2 ];
66+ mParam .mC [3 ] = v.mC [3 ];
67+ mParam .mC [4 ] = v.mC [4 ];
68+ mParam .mC [5 ] = v.mC [5 ];
69+ mParam .mC [6 ] = v.mC [6 ];
70+ mParam .mC [7 ] = v.mC [7 ];
71+ mParam .mC [8 ] = v.mC [8 ];
72+ mParam .mC [9 ] = v.mC [9 ];
73+ mParam .mC [10 ] = v.mC [10 ];
74+ mParam .mC [11 ] = v.mC [11 ];
75+ mParam .mC [12 ] = v.mC [12 ];
76+ mParam .mC [13 ] = v.mC [13 ];
77+ mParam .mC [14 ] = v.mC [14 ];
78+ mParam .mZOffset = v.mZOffset ;
79+ mParam .mP [0 ] = v.mP [0 ];
80+ mParam .mP [1 ] = v.mP [1 ];
81+ mParam .mP [2 ] = v.mP [2 ];
82+ mParam .mP [3 ] = v.mP [3 ];
83+ mParam .mP [4 ] = v.mP [4 ];
84+ }
85+
86+ GPUd () void InitParam ()
87+ {
88+ // Initialize Tracklet Parameters using default values
89+ SetSinPhi (0 );
90+ SetDzDs (0 );
91+ SetQPt (0 );
92+ SetSignCosPhi (1 );
93+ SetChi2 (0 );
94+ SetNDF (-3 );
95+ SetCov (0 , 1 );
96+ SetCov (1 , 0 );
97+ SetCov (2 , 1 );
98+ SetCov (3 , 0 );
99+ SetCov (4 , 0 );
100+ SetCov (5 , 1 );
101+ SetCov (6 , 0 );
102+ SetCov (7 , 0 );
103+ SetCov (8 , 0 );
104+ SetCov (9 , 1 );
105+ SetCov (10 , 0 );
106+ SetCov (11 , 0 );
107+ SetCov (12 , 0 );
108+ SetCov (13 , 0 );
109+ SetCov (14 , 1000 .f );
110+ SetZOffset (0 );
111+ }
45112
46113 GPUd () float X () const { return mParam .X (); }
47114 GPUd () float Y () const { return mParam .Y (); }
@@ -94,8 +161,8 @@ class GPUTPCTrackParamSkeleton
94161 GPUd () void SetChi2 (float v) { mChi2 = v; }
95162 GPUd () void SetNDF (int32_t v) { mNDF = v; }
96163
97- GPUd () float GetDist2 (const GPUTPCTrackParamSkeleton<F>& t) const ;
98- GPUd () float GetDistXZ2 (const GPUTPCTrackParamSkeleton<F>& t) const ;
164+ GPUd () float GetDist2 (GPUTPCTrackParamSkeleton<wrapper::const_reference> t) const ;
165+ GPUd () float GetDistXZ2 (GPUTPCTrackParamSkeleton<wrapper::const_reference> t) const ;
99166
100167 GPUd () float GetS (float x, float y, float Bz) const ;
101168
@@ -142,11 +209,11 @@ class GPUTPCTrackParamSkeleton
142209 GPUd () void Print () const ;
143210
144211#ifndef GPUCA_GPUCODE
145- private:
212+ // private:
146213#endif // ! GPUCA_GPUCODE
147214 GPUTPCBaseTrackParamSkeleton<F> mParam ; // Track Parameters
148215
149- private:
216+ // private:
150217 // WARNING, Track Param Data is copied in the GPU Tracklet Constructor element by element instead of using copy constructor!!!
151218 // This is neccessary for performance reasons!!!
152219 // Changes to Elements of this class therefore must also be applied to TrackletConstructor!!!
@@ -155,35 +222,42 @@ class GPUTPCTrackParamSkeleton
155222 F<int32_t > mNDF ; // the Number of Degrees of Freedom
156223};
157224
225+ template <> GPUd () void GPUTPCTrackParamSkeleton<wrapper::const_reference>::SetParam(GPUTPCBaseTrackParamSkeleton<wrapper::const_reference> v) = delete;
226+ template <> GPUd () void GPUTPCTrackParamSkeleton<wrapper::const_reference>::InitParam() = delete;
227+
228+ template <> GPUhd () void GPUTPCTrackParamSkeleton<wrapper::const_reference>::SetPar(int32_t i, float v) = delete;
229+ template <> GPUhd () void GPUTPCTrackParamSkeleton<wrapper::const_reference>::SetCov(int32_t i, float v) = delete;
230+
231+ template <> GPUd () void GPUTPCTrackParamSkeleton<wrapper::const_reference>::SetX(float v) = delete;
232+ template <> GPUd () void GPUTPCTrackParamSkeleton<wrapper::const_reference>::SetY(float v) = delete;
233+ template <> GPUd () void GPUTPCTrackParamSkeleton<wrapper::const_reference>::SetZ(float v) = delete;
234+ template <> GPUd () void GPUTPCTrackParamSkeleton<wrapper::const_reference>::SetSinPhi(float v) = delete;
235+ template <> GPUd () void GPUTPCTrackParamSkeleton<wrapper::const_reference>::SetDzDs(float v) = delete;
236+ template <> GPUd () void GPUTPCTrackParamSkeleton<wrapper::const_reference>::SetQPt(float v) = delete;
237+ template <> GPUd () void GPUTPCTrackParamSkeleton<wrapper::const_reference>::SetZOffset(float v) = delete;
238+ template <> GPUd () void GPUTPCTrackParamSkeleton<wrapper::const_reference>::SetSignCosPhi(float v) = delete;
239+ template <> GPUd () void GPUTPCTrackParamSkeleton<wrapper::const_reference>::SetChi2(float v) = delete;
240+ template <> GPUd () void GPUTPCTrackParamSkeleton<wrapper::const_reference>::SetNDF(int32_t v) = delete;
241+
242+ template <> GPUd () bool GPUTPCTrackParamSkeleton<wrapper::const_reference>::TransportToX(float x, float Bz, float maxSinPhi) = delete;
243+ template <> GPUd () bool GPUTPCTrackParamSkeleton<wrapper::const_reference>::TransportToXWithMaterial(float x, float Bz, float maxSinPhi) = delete;
244+ template <> GPUd () bool GPUTPCTrackParamSkeleton<wrapper::const_reference>::TransportToX(float x, GPUTPCTrackLinearisation& t0, float Bz, float maxSinPhi, float * DL) = delete;
245+ template <> GPUd () bool GPUTPCTrackParamSkeleton<wrapper::const_reference>::TransportToX(float x, float sinPhi0, float cosPhi0, float Bz, float maxSinPhi) = delete;
246+ template <> GPUd () bool GPUTPCTrackParamSkeleton<wrapper::const_reference>::TransportToXWithMaterial(float x, GPUTPCTrackLinearisation& t0, GPUTPCTrackFitParam& par, float Bz, float maxSinPhi) = delete;
247+ template <> GPUd () bool GPUTPCTrackParamSkeleton<wrapper::const_reference>::TransportToXWithMaterial(float x, GPUTPCTrackFitParam& par, float Bz, float maxSinPhi) = delete;
248+ template <> GPUd () void GPUTPCTrackParamSkeleton<wrapper::const_reference>::CalculateFitParameters(GPUTPCTrackFitParam& par, float mass) = delete;
249+ template <> GPUd () bool GPUTPCTrackParamSkeleton<wrapper::const_reference>::CorrectForMeanMaterial(float xOverX0, float xTimesRho, const GPUTPCTrackFitParam& par) = delete;
250+ template <> GPUd () bool GPUTPCTrackParamSkeleton<wrapper::const_reference>::Rotate(float alpha, float maxSinPhi) = delete;
251+ template <> GPUd () bool GPUTPCTrackParamSkeleton<wrapper::const_reference>::Rotate(float alpha, GPUTPCTrackLinearisation& t0, float maxSinPhi) = delete;
252+ template <> GPUd () bool GPUTPCTrackParamSkeleton<wrapper::const_reference>::Filter(float y, float z, float err2Y, float err2Z, float maxSinPhi, bool paramOnly) = delete;
253+
254+ template <> GPUd () void GPUTPCTrackParamSkeleton<wrapper::const_reference>::ShiftZ(float z1, float z2, float x1, float x2, float bz, float defaultZOffsetOverR) = delete;
255+ template <> GPUd () void GPUTPCTrackParamSkeleton<wrapper::const_reference>::ConstrainZ(float & z, int32_t sector, float & z0, float & lastZ) = delete;
256+
257+ template <> GPUdi () void GPUTPCTrackParamSkeleton<wrapper::const_reference>::ConstrainSinPhi(float limit) = delete;
258+
158259using GPUTPCTrackParam = GPUTPCTrackParamSkeleton<wrapper::value>;
159260
160- template <>
161- GPUdi () void GPUTPCTrackParam::InitParam ()
162- {
163- // Initialize Tracklet Parameters using default values
164- SetSinPhi (0 );
165- SetDzDs (0 );
166- SetQPt (0 );
167- SetSignCosPhi (1 );
168- SetChi2 (0 );
169- SetNDF (-3 );
170- SetCov (0 , 1 );
171- SetCov (1 , 0 );
172- SetCov (2 , 1 );
173- SetCov (3 , 0 );
174- SetCov (4 , 0 );
175- SetCov (5 , 1 );
176- SetCov (6 , 0 );
177- SetCov (7 , 0 );
178- SetCov (8 , 0 );
179- SetCov (9 , 1 );
180- SetCov (10 , 0 );
181- SetCov (11 , 0 );
182- SetCov (12 , 0 );
183- SetCov (13 , 0 );
184- SetCov (14 , 1000 .f );
185- SetZOffset (0 );
186- }
187261} // namespace o2::gpu
188262
189263#endif // GPUTPCTRACKPARAM_H
0 commit comments