Project
Loading...
Searching...
No Matches
GPUTPCGMPropagator.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
14
15#ifndef GPUTPCGMPROPAGATOR_H
16#define GPUTPCGMPROPAGATOR_H
17
18#include "GPUCommonDef.h"
21#include "GPUCommonMath.h"
22
23namespace o2::base
24{
25struct MatBudget;
26class MatLayerCylSet;
27} // namespace o2::base
28
29namespace o2::gpu
30{
31class GPUTPCGMTrackParam;
32struct GPUParam;
33namespace gputpcgmmergertypes
34{
35struct InterpolationErrorHit;
36}
37
44{
45 public:
48 TPC = 0,
49 ITS = 1,
50 TRD = 2
51 };
65
67
69 GPUhd() MaterialCorrection() : radLen(28811.7f), rho(1.025e-3f), radLenInv(1.f / radLen), DLMax(0.f), EP2(0.f), sigmadE2(0.f), k22(0.f), k33(0.f), k43(0.f), k44(0.f) {}
70 float radLen; // [cm]
71 float rho; // [g/cm^3]
72 float radLenInv, DLMax, EP2, sigmadE2, k22, k33, k43, k44; // precalculated values for MS and EnergyLoss correction
73 };
74
75 GPUd() void SetMaterial(float radLen, float rho);
76 GPUd() void SetMaterialTPC() { SetMaterial(28811.7f, 1.025e-3f); }
77
79 GPUd() o2::base::MatBudget getMatBudget(const float* p1, const float* p2);
80
81 GPUd() void SetPolynomialField(const GPUTPCGMPolynomialField* field) { mField = field; }
82
83 GPUd() void SelectFieldRegion(FieldRegion region) { mFieldRegion = region; }
84
85 GPUd() void SetFitInProjections(bool Flag) { mFitInProjections = Flag; }
86 GPUd() void SetPropagateBzOnly(bool Flag) { mPropagateBzOnly = Flag; }
87 GPUd() void SetSeedingErrors(bool Flag) { mSeedingErrors = Flag; }
88 GPUd() void SetMatLUT(const o2::base::MatLayerCylSet* lut) { mMatLUT = lut; }
89
90 GPUd() void SetMaxSinPhi(float maxSinPhi) { mMaxSinPhi = maxSinPhi; }
91
92 GPUd() void SetTrack(GPUTPCGMTrackParam* track, float Alpha);
93 GPUd() void ResetT0()
94 {
95 if (!mT) {
96 return;
97 }
98 mT0.Set(*mT);
99 }
100
101 GPUd() int32_t RotateToAlpha(float newAlpha);
102
103 GPUd() int32_t PropagateToXAlpha(float posX, float posAlpha, bool inFlyDirection);
104
105 GPUd() int32_t PropagateToXAlphaBz(float posX, float posAlpha, bool inFlyDirection);
106
107 GPUd() int32_t Update(float posY, float posZ, int32_t iRow, const GPUParam& param, int16_t clusterState, int8_t rejectChi2, bool refit, int8_t sector, float time, float avgInvCharge, float invCharge);
108 GPUd() int32_t Update(float posY, float posZ, int32_t iRow, const GPUParam& param, int16_t clusterState, int8_t rejectChi2, bool refit, float err2Y, float err2Z);
109 GPUd() int32_t Update(float posY, float posZ, int16_t clusterState, bool rejectChi2, float err2Y, float err2Z, const GPUParam* param = nullptr);
110 GPUd() int32_t InterpolateReject(const GPUParam& param, float posY, float posZ, int16_t clusterState, int8_t rejectChi2, gputpcgmmergertypes::InterpolationErrorHit* inter, float err2Y, float err2Z, float deltaZ);
111 GPUd() float PredictChi2(float posY, float posZ, int32_t iRow, const GPUParam& param, int16_t clusterState, int8_t sideC, float time, float avgCharge, float charge) const;
112 GPUd() float PredictChi2(float posY, float posZ, float err2Y, float err2Z) const;
113 GPUd() static int32_t RejectCluster(float chiY, float chiZ, uint8_t clusterState)
114 {
115 if (chiY > 9.f || chiZ > 9.f) { // TODO: Check how a track can have chi2/ncl > 18
116 return 2;
117 }
119 return 2;
120 }
122 return 2;
123 }
124 return 0;
125 }
126
128 GPUd() float GetBz(float X, float Y, float Z) const;
130 GPUd() void GetBxByBz(float X, float Y, float Z, float B[3]) const;
131
133 GPUd() float GetBz(float Alpha, float X, float Y, float Z) const;
135 GPUd() void GetBxByBz(float Alpha, float X, float Y, float Z, float B[3]) const;
136
137 GPUd() void GetErr2(float& err2Y, float& err2Z, const GPUParam& param, float posZ, int32_t iRow, int16_t clusterState, int8_t sector, float time, float avgCharge, float charge) const;
138 GPUd() static void GetErr2(float& err2Y, float& err2Z, const GPUParam& param, float snp, float tgl, float posZ, float trackX, float trackY, int32_t iRow, int16_t clusterState, int8_t sector, float time, float avgCharge, float charge, bool seedingErrors);
139
140 GPUd() float GetAlpha() const { return mAlpha; }
141 GPUd() void SetAlpha(float v) { mAlpha = v; }
142 GPUd() float GetQPt0() const { return mT0.GetQPt(); }
143 GPUd() float GetSinPhi0() const { return mT0.GetSinPhi(); }
144 GPUd() float GetCosPhi0() const { return mT0.GetCosPhi(); }
145 GPUd() void Mirror(bool inFlyDirection);
146 GPUd() void Rotate180();
147 GPUd() void ChangeDirection();
148 GPUd() float GetMirroredYModel() const;
149 GPUd() float GetMirroredYTrack() const;
150 GPUd() int32_t GetPropagatedYZ(float x, float& projY, float& projZ);
151 GPUd() bool GetFitInProjections() const { return mFitInProjections; }
152
154 {
155 return mT0;
156 }
157 GPUd() void CalculateMaterialCorrection();
158
159 private:
160 GPUd() static float ApproximateBetheBloch(float beta2);
161 GPUd() int32_t FollowLinearization(const GPUTPCGMPhysicalTrackModel& t0e, float Bz, float dLp, bool inFlyDirection);
162
164 GPUd() float GetBzBase(float cosAlpha, float sinAlpha, float X, float Y, float Z) const;
166 GPUd() void GetBxByBzBase(float cosAlpha, float sinAlpha, float X, float Y, float Z, float B[3]) const;
167 // X in global coordinates
168 GPUd() float getGlobalX(float cosAlpha, float sinAlpha, float X, float Y) const;
169 // Y in global coordinates
170 GPUd() float getGlobalY(float cosAlpha, float sinAlpha, float X, float Y) const;
171 // X in global coordinates
172 GPUd() float getGlobalX(float X, float Y) const;
173 // Y in global coordinates
174 GPUd() float getGlobalY(float X, float Y) const;
175
176 const GPUTPCGMPolynomialField* mField = nullptr;
177 const o2::base::MatLayerCylSet* mMatLUT = nullptr;
178 GPUTPCGMTrackParam* mT = nullptr;
179 float mAlpha = 0.f; // rotation angle of the track coordinate system
180 float mCosAlpha = 1.f; // cos of the rotation angle
181 float mSinAlpha = 0.f; // sin of the rotation angle
182 float mMaxSinPhi = GPUCA_MAX_SIN_PHI;
184 MaterialCorrection mMaterial;
185 FieldRegion mFieldRegion = TPC;
186 bool mSeedingErrors = 0; // TODO: Hide variable in Run3 mode
187 bool mFitInProjections = 1; // fit (Y,SinPhi,QPt) and (Z,DzDs) paramteres separatelly
188 bool mPropagateBzOnly = 0; // Use Bz only in propagation
189};
190
191GPUdi() void GPUTPCGMPropagator::GetBxByBz(float Alpha, float X, float Y, float Z, float B[3]) const
192{
193 float c, s;
194 CAMath::SinCos(Alpha, s, c);
195 GetBxByBzBase(c, s, X, Y, Z, B);
196}
197
198GPUdi() float GPUTPCGMPropagator::GetBz(float Alpha, float X, float Y, float Z) const
199{
200 float c, s;
201 CAMath::SinCos(Alpha, s, c);
202 return GetBzBase(c, s, X, Y, Z);
203}
204
205GPUdi() void GPUTPCGMPropagator::GetBxByBz(float X, float Y, float Z, float B[3]) const
206{
207 GetBxByBzBase(mCosAlpha, mSinAlpha, X, Y, Z, B);
208}
209
210GPUdi() float GPUTPCGMPropagator::GetBz(float X, float Y, float Z) const
211{
212 return GetBzBase(mCosAlpha, mSinAlpha, X, Y, Z);
213}
214
215GPUdi() void GPUTPCGMPropagator::SetMaterial(float radLen, float rho)
216{
217 mMaterial.rho = rho;
218 mMaterial.radLen = radLen;
219 mMaterial.radLenInv = (radLen > 1.e-4f) ? 1.f / radLen : 0.f;
220 CalculateMaterialCorrection();
221}
222
223GPUdi() void GPUTPCGMPropagator::SetTrack(GPUTPCGMTrackParam* GPUrestrict() track, float Alpha)
224{
225 mT = track;
226 if (!mT) {
227 return;
228 }
229 mT0.Set(*mT);
230 mAlpha = Alpha;
231 CAMath::SinCos(mAlpha, mSinAlpha, mCosAlpha);
232 CalculateMaterialCorrection();
233}
234
235GPUdi() float GPUTPCGMPropagator::GetMirroredYModel() const
236{
237 float Bz = GetBz(mT0.GetX(), mT0.GetY(), mT0.GetZ());
238 return mT0.GetMirroredY(Bz);
239}
240
241GPUdi() float GPUTPCGMPropagator::GetMirroredYTrack() const
242{
243 if (!mT) {
244 return -1.E10f;
245 }
246 float Bz = GetBz(mT->GetX(), mT->GetY(), mT->GetZ());
247 return mT->GetMirroredY(Bz);
248}
249
250GPUdi() float GPUTPCGMPropagator::getGlobalX(float cosAlpha, float sinAlpha, float X, float Y) const
251{
252 return X * cosAlpha - Y * sinAlpha;
253}
254
255GPUdi() float GPUTPCGMPropagator::getGlobalY(float cosAlpha, float sinAlpha, float X, float Y) const
256{
257 return X * sinAlpha + Y * cosAlpha;
258}
259
260GPUdi() float GPUTPCGMPropagator::getGlobalX(float X, float Y) const
261{
262 return getGlobalX(mCosAlpha, mSinAlpha, X, Y);
263}
264
265GPUdi() float GPUTPCGMPropagator::getGlobalY(float X, float Y) const
266{
267 return getGlobalY(mCosAlpha, mSinAlpha, X, Y);
268}
269
270} // namespace o2::gpu
271
272#endif
#define GPUrestrict()
#define GPUCA_MAX_SIN_PHI
constexpr int p2()
constexpr int p1()
constexpr to accelerate the coordinates changing
uint32_t c
Definition RawData.h:2
Definition B.h:16
GPUd() float GetSinPhi0() const
GPUdDefault() GPUTPCGMPropagator()=default
float int32_t const GPUParam int16_t int8_t bool int8_t float float float invCharge
float int32_t const GPUParam int16_t clusterState
GPUd() void UpdateMaterial(const GPUTPCGMPhysicalTrackModel &GPUrestrict() t0e)
GPUd() void SetAlpha(float v)
float const GPUParam float float tgl
float int32_t const GPUParam int16_t int8_t rejectChi2
float const GPUParam float snp
float const GPUParam float float float float float trackY
GPUd() GPUTPCGMPhysicalTrackModel &Model()
float int32_t const GPUParam int16_t int8_t sideC
GPUd() void SelectFieldRegion(FieldRegion region)
float const GPUParam float float float float trackX
float int32_t const GPUParam int16_t int8_t bool refit
float int32_t const GPUParam int16_t int8_t bool float float err2Z
GPUd() void SetPropagateBzOnly(bool Flag)
GPUd() float GetCosPhi0() const
FieldRegion
Enumeration of field regions.
@ TRD
outer TPC -> outer TRD
float int32_t const GPUParam int16_t int8_t bool float err2Y
float int32_t const GPUParam int16_t int8_t bool int8_t sector
float float int16_t int8_t gputpcgmmergertypes::InterpolationErrorHit float float float deltaZ
float int32_t const GPUParam int16_t int8_t bool int8_t float time
float int32_t const GPUParam int16_t int8_t float float avgCharge
GPUd() void SetMaterial(float radLen
GPUd() void Mirror(bool inFlyDirection)
float float int16_t int8_t gputpcgmmergertypes::InterpolationErrorHit * inter
float int32_t const GPUParam int16_t int8_t bool int8_t float float avgInvCharge
GPUd() void SetSeedingErrors(bool Flag)
GPUd() int32_t RotateToAlpha(float new Alpha)
float const GPUParam float float float float float int32_t int16_t int8_t float float float bool seedingErrors
GPUd() float GetQPt0() const
float const GPUParam float float float float float int32_t int16_t int8_t float float float charge
GPUd() void SetMatLUT(const o2
float int32_t const GPUParam int16_t int8_t float float float charge const
GPUd() void SetFitInProjections(bool Flag)
GPUd() void CalculateMaterialCorrection()
GPUd() void SetMaxSinPhi(float maxSinPhi)
GLint GLenum GLint x
Definition glcorearb.h:403
const GLdouble * v
Definition glcorearb.h:832
GLdouble f
Definition glcorearb.h:310
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLenum GLfloat param
Definition glcorearb.h:271
GPUdi() o2
Definition TrackTRD.h:38
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...