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
2730namespace 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-
3433template <typename value_T>
3534class TrackParametrization ; // fwd declaration for conversion method
3635
3736template <typename value_T>
3837class 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