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 };
62
64
66 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) {}
67 float radLen; // [cm]
68 float rho; // [g/cm^3]
69 float radLenInv, DLMax, EP2, sigmadE2, k22, k33, k43, k44; // precalculated values for MS and EnergyLoss correction
70 };
71
73 int32_t retVal = -100;
74 float err2Y = -1e6f, err2Z = -1e6f;
75 };
76
77 GPUd() void SetMaterial(float radLen, float rho);
78 GPUd() void SetMaterialTPC() { SetMaterial(28811.7f, 1.025e-3f); }
79
81 GPUd() o2::base::MatBudget getMatBudget(const float* p1, const float* p2);
82
83 GPUd() void SetPolynomialField(const GPUTPCGMPolynomialField* field) { mField = field; }
84
85 GPUd() void SelectFieldRegion(FieldRegion region) { mFieldRegion = region; }
86
87 GPUd() void SetFitInProjections(bool Flag) { mFitInProjections = Flag; }
88 GPUd() void SetPropagateBzOnly(bool Flag) { mPropagateBzOnly = Flag; }
89 GPUd() void SetToyMCEventsFlag(bool Flag) { mToyMCEvents = Flag; }
90 GPUd() void SetSeedingErrors(bool Flag) { mSeedingErrors = Flag; }
91 GPUd() void SetMatLUT(const o2::base::MatLayerCylSet* lut) { mMatLUT = lut; }
92
93 GPUd() void SetMaxSinPhi(float maxSinPhi) { mMaxSinPhi = maxSinPhi; }
94
95 GPUd() void SetTrack(GPUTPCGMTrackParam* track, float Alpha);
96 GPUd() void ResetT0()
97 {
98 if (!mT) {
99 return;
100 }
101 mT0.Set(*mT);
102 }
103
104 GPUd() int32_t RotateToAlpha(float newAlpha);
105
106 GPUd() int32_t PropagateToXAlpha(float posX, float posAlpha, bool inFlyDirection);
107
108 GPUd() int32_t PropagateToXAlphaBz(float posX, float posAlpha, bool inFlyDirection);
109
110 GPUd() int32_t Update(float posY, float posZ, int32_t iRow, const GPUParam& param, int16_t clusterState, int8_t rejectChi2, gputpcgmmergertypes::InterpolationErrorHit* inter, bool refit, int8_t sideC, float time, float avgInvCharge, float invCharge GPUCA_DEBUG_STREAMER_CHECK(, DebugStreamerVals* debugVals = nullptr));
111 GPUd() int32_t Update(float posY, float posZ, int16_t clusterState, bool rejectChi2, float err2Y, float err2Z, const GPUParam* param = nullptr);
112 GPUd() int32_t InterpolateReject(const GPUParam& param, float posY, float posZ, int16_t clusterState, int8_t rejectChi2, gputpcgmmergertypes::InterpolationErrorHit* inter, float err2Y, float err2Z);
113 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;
114 GPUd() float PredictChi2(float posY, float posZ, float err2Y, float err2Z) const;
115 GPUd() int32_t RejectCluster(float chiY, float chiZ, uint8_t clusterState)
116 {
117 if (chiY > 9.f || chiZ > 9.f) {
118 return 2;
119 }
121 return 2;
122 }
124 return 2;
125 }
126 return 0;
127 }
128
130 GPUd() float GetBz(float X, float Y, float Z) const;
132 GPUd() void GetBxByBz(float X, float Y, float Z, float B[3]) const;
133
135 GPUd() float GetBz(float Alpha, float X, float Y, float Z) const;
137 GPUd() void GetBxByBz(float Alpha, float X, float Y, float Z, float B[3]) const;
138
139 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;
140 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);
141
142 GPUd() float GetAlpha() const { return mAlpha; }
143 GPUd() void SetAlpha(float v) { mAlpha = v; }
144 GPUd() float GetQPt0() const { return mT0.GetQPt(); }
145 GPUd() float GetSinPhi0() const { return mT0.GetSinPhi(); }
146 GPUd() float GetCosPhi0() const { return mT0.GetCosPhi(); }
147 GPUd() void Mirror(bool inFlyDirection);
148 GPUd() void Rotate180();
149 GPUd() void ChangeDirection();
150 GPUd() float GetMirroredYModel() const;
151 GPUd() float GetMirroredYTrack() const;
152 GPUd() int32_t GetPropagatedYZ(float x, float& projY, float& projZ);
153 GPUd() bool GetFitInProjections() const { return mFitInProjections; }
154
156 {
157 return mT0;
158 }
159 GPUd() void CalculateMaterialCorrection();
160
161 private:
162 GPUd() static float ApproximateBetheBloch(float beta2);
163 GPUd() int32_t FollowLinearization(const GPUTPCGMPhysicalTrackModel& t0e, float Bz, float dLp, bool inFlyDirection);
164
166 GPUd() float GetBzBase(float cosAlpha, float sinAlpha, float X, float Y, float Z) const;
168 GPUd() void GetBxByBzBase(float cosAlpha, float sinAlpha, float X, float Y, float Z, float B[3]) const;
169 // X in global coordinates
170 GPUd() float getGlobalX(float cosAlpha, float sinAlpha, float X, float Y) const;
171 // Y in global coordinates
172 GPUd() float getGlobalY(float cosAlpha, float sinAlpha, float X, float Y) const;
173 // X in global coordinates
174 GPUd() float getGlobalX(float X, float Y) const;
175 // Y in global coordinates
176 GPUd() float getGlobalY(float X, float Y) const;
177
178 const GPUTPCGMPolynomialField* mField = nullptr;
179 const o2::base::MatLayerCylSet* mMatLUT = nullptr;
180 GPUTPCGMTrackParam* mT = nullptr;
181 float mAlpha = 0.f; // rotation angle of the track coordinate system
182 float mCosAlpha = 1.f; // cos of the rotation angle
183 float mSinAlpha = 0.f; // sin of the rotation angle
184 float mMaxSinPhi = GPUCA_MAX_SIN_PHI;
186 MaterialCorrection mMaterial;
187 FieldRegion mFieldRegion = TPC;
188 bool mSeedingErrors = 0;
189 bool mFitInProjections = 1; // fit (Y,SinPhi,QPt) and (Z,DzDs) paramteres separatelly
190 bool mPropagateBzOnly = 0; // Use Bz only in propagation
191 bool mToyMCEvents = 0; // events are simulated with simple home-made simulation
192};
193
194GPUdi() void GPUTPCGMPropagator::GetBxByBz(float Alpha, float X, float Y, float Z, float B[3]) const
195{
196 float c, s;
197 CAMath::SinCos(Alpha, s, c);
198 GetBxByBzBase(c, s, X, Y, Z, B);
199}
200
201GPUdi() float GPUTPCGMPropagator::GetBz(float Alpha, float X, float Y, float Z) const
202{
203 float c, s;
204 CAMath::SinCos(Alpha, s, c);
205 return GetBzBase(c, s, X, Y, Z);
206}
207
208GPUdi() void GPUTPCGMPropagator::GetBxByBz(float X, float Y, float Z, float B[3]) const
209{
210 GetBxByBzBase(mCosAlpha, mSinAlpha, X, Y, Z, B);
211}
212
213GPUdi() float GPUTPCGMPropagator::GetBz(float X, float Y, float Z) const
214{
215 return GetBzBase(mCosAlpha, mSinAlpha, X, Y, Z);
216}
217
218GPUdi() void GPUTPCGMPropagator::SetMaterial(float radLen, float rho)
219{
220 mMaterial.rho = rho;
221 mMaterial.radLen = radLen;
222 mMaterial.radLenInv = (radLen > 1.e-4f) ? 1.f / radLen : 0.f;
223 CalculateMaterialCorrection();
224}
225
226GPUdi() void GPUTPCGMPropagator::SetTrack(GPUTPCGMTrackParam* GPUrestrict() track, float Alpha)
227{
228 mT = track;
229 if (!mT) {
230 return;
231 }
232 mT0.Set(*mT);
233 mAlpha = Alpha;
234 CAMath::SinCos(mAlpha, mSinAlpha, mCosAlpha);
235 CalculateMaterialCorrection();
236}
237
238GPUdi() float GPUTPCGMPropagator::GetMirroredYModel() const
239{
240 float Bz = GetBz(mT0.GetX(), mT0.GetY(), mT0.GetZ());
241 return mT0.GetMirroredY(Bz);
242}
243
244GPUdi() float GPUTPCGMPropagator::GetMirroredYTrack() const
245{
246 if (!mT) {
247 return -1.E10f;
248 }
249 float Bz = GetBz(mT->GetX(), mT->GetY(), mT->GetZ());
250 return mT->GetMirroredY(Bz);
251}
252
253GPUdi() float GPUTPCGMPropagator::getGlobalX(float cosAlpha, float sinAlpha, float X, float Y) const
254{
255 return X * cosAlpha - Y * sinAlpha;
256}
257
258GPUdi() float GPUTPCGMPropagator::getGlobalY(float cosAlpha, float sinAlpha, float X, float Y) const
259{
260 return X * sinAlpha + Y * cosAlpha;
261}
262
263GPUdi() float GPUTPCGMPropagator::getGlobalX(float X, float Y) const
264{
265 return getGlobalX(mCosAlpha, mSinAlpha, X, Y);
266}
267
268GPUdi() float GPUTPCGMPropagator::getGlobalY(float X, float Y) const
269{
270 return getGlobalY(mCosAlpha, mSinAlpha, X, Y);
271}
272
273} // namespace o2::gpu
274
275#endif
#define GPUrestrict()
#define GPUCA_DEBUG_STREAMER_CHECK(...)
#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 gputpcgmmergertypes::InterpolationErrorHit bool int8_t sideC
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()
GPUd() void SetToyMCEventsFlag(bool Flag)
GPUd() void SelectFieldRegion(FieldRegion region)
float const GPUParam float float float float trackX
float int16_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 gputpcgmmergertypes::InterpolationErrorHit bool int8_t float float avgInvCharge
float int32_t const GPUParam int16_t int8_t float float avgCharge
float const GPUParam float int32_t int16_t int8_t sector
float int32_t const GPUParam int16_t int8_t gputpcgmmergertypes::InterpolationErrorHit bool refit
GPUd() void SetMaterial(float radLen
GPUd() void Mirror(bool inFlyDirection)
float int32_t const GPUParam int16_t int8_t gputpcgmmergertypes::InterpolationErrorHit * inter
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 int16_t bool float err2Y
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)
float int32_t const GPUParam int16_t int8_t gputpcgmmergertypes::InterpolationErrorHit bool int8_t float time
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 ...