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