Project
Loading...
Searching...
No Matches
Propagator.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
15
16#ifndef ALICEO2_BASE_PROPAGATOR_
17#define ALICEO2_BASE_PROPAGATOR_
18
19#include "GPUCommonDef.h"
20
21#include "GPUCommonRtypes.h"
27
28#ifndef GPUCA_GPUCODE
29#include <array>
30#include <string>
31#endif
32
33namespace o2
34{
35namespace parameters
36{
37class GRPObject;
38class GRPMagField;
39} // namespace parameters
40
41namespace dataformats
42{
43class VertexBase;
44}
45
46namespace field
47{
48class MagFieldFast;
49class MagneticField;
50} // namespace field
51
52namespace gpu
53{
54class GPUTPCGMPolynomialField;
55}
56
57namespace base
58{
59
60template <typename value_T>
62{
63 public:
64 using value_type = value_T;
67
68 enum class MatCorrType : int {
69 USEMatCorrNONE, // flag to not use material corrections
70 USEMatCorrTGeo, // flag to use TGeo for material queries
72 }; // flag to use LUT for material queries (user must provide a pointer
73
74 static GPUglobalconstexpr() float MAX_SIN_PHI = 0.85f;
75 static GPUglobalconstexpr() float MAX_STEP = 2.0f;
76
77 GPUd() bool PropagateToXBxByBz(TrackParCov_t& track, value_type x,
79 track::TrackLTIntegral* tofInfo = nullptr, int signCorr = 0) const;
80
81 GPUd() bool PropagateToXBxByBz(TrackParCov_t& track, TrackPar_t& linRef, value_type x,
83 track::TrackLTIntegral* tofInfo = nullptr, int signCorr = 0) const;
84
85 GPUd() bool PropagateToXBxByBz(TrackPar_t& track, value_type x,
87 track::TrackLTIntegral* tofInfo = nullptr, int signCorr = 0) const;
88
89 GPUd() bool propagateToX(TrackParCov_t& track, value_type x, value_type bZ,
91 track::TrackLTIntegral* tofInfo = nullptr, int signCorr = 0) const;
92
93 GPUd() bool propagateToX(TrackParCov_t& track, TrackPar_t& linRef, value_type x, value_type bZ,
95 track::TrackLTIntegral* tofInfo = nullptr, int signCorr = 0) const;
96
97 GPUd() bool propagateToX(TrackPar_t& track, value_type x, value_type bZ,
99 track::TrackLTIntegral* tofInfo = nullptr, int signCorr = 0) const;
100
101 template <typename track_T>
102 GPUd() bool propagateTo(track_T& track, value_type x, bool bzOnly = false, value_type maxSnp = MAX_SIN_PHI, value_type maxStep = MAX_STEP,
103 MatCorrType matCorr = MatCorrType::USEMatCorrLUT, track::TrackLTIntegral* tofInfo = nullptr, int signCorr = 0) const
104 {
105 return bzOnly ? propagateToX(track, x, getBz(track.getXYZGlo()), maxSnp, maxStep, matCorr, tofInfo, signCorr) : PropagateToXBxByBz(track, x, maxSnp, maxStep, matCorr, tofInfo, signCorr);
106 }
107
108 GPUd() bool propagateToX(TrackParCov_t& track, TrackPar_t* linRef, value_type x, value_type bZ,
110 track::TrackLTIntegral* tofInfo = nullptr, int signCorr = 0) const
111 {
112 return linRef ? propagateToX(track, *linRef, x, bZ, maxSnp, maxStep, matCorr, tofInfo, signCorr) : propagateToX(track, x, bZ, maxSnp, maxStep, matCorr, tofInfo, signCorr);
113 }
114
115 GPUd() bool PropagateToXBxByBz(TrackParCov_t& track, TrackPar_t* linRef, value_type x,
117 track::TrackLTIntegral* tofInfo = nullptr, int signCorr = 0) const
118 {
119 return linRef ? PropagateToXBxByBz(track, *linRef, x, maxSnp, maxStep, matCorr, tofInfo, signCorr) : PropagateToXBxByBz(track, x, maxSnp, maxStep, matCorr, tofInfo, signCorr);
120 }
121
122 GPUd() bool propagateTo(TrackParCov_t& track, TrackPar_t* linRef, value_type x, bool bzOnly = false, value_type maxSnp = MAX_SIN_PHI, value_type maxStep = MAX_STEP,
123 MatCorrType matCorr = MatCorrType::USEMatCorrLUT, track::TrackLTIntegral* tofInfo = nullptr, int signCorr = 0) const
124 {
125 return bzOnly ? propagateToX(track, linRef, x, getBz(track.getXYZGlo()), maxSnp, maxStep, matCorr, tofInfo, signCorr) : PropagateToXBxByBz(track, linRef, x, maxSnp, maxStep, matCorr, tofInfo, signCorr);
126 }
127
128 template <typename track_T>
129 GPUd() bool propagateToAlphaX(track_T& track, value_type alpha, value_type x, bool bzOnly = false, value_type maxSnp = MAX_SIN_PHI, value_type maxStep = MAX_STEP, int minSteps = 1,
130 MatCorrType matCorr = MatCorrType::USEMatCorrLUT, track::TrackLTIntegral* tofInfo = nullptr, int signCorr = 0) const;
131
132 GPUd() bool propagateToAlphaX(TrackParCov_t& track, TrackPar_t* linRef, value_type alpha, value_type x, bool bzOnly = false, value_type maxSnp = MAX_SIN_PHI, value_type maxStep = MAX_STEP, int minSteps = 1,
133 MatCorrType matCorr = MatCorrType::USEMatCorrLUT, track::TrackLTIntegral* tofInfo = nullptr, int signCorr = 0) const;
134
135 template <typename track_T>
136 GPUd() bool propagateToR(track_T& track, value_type r, bool bzOnly = false, value_type maxSnp = MAX_SIN_PHI, value_type maxStep = MAX_STEP,
137 MatCorrType matCorr = MatCorrType::USEMatCorrLUT, track::TrackLTIntegral* tofInfo = nullptr, int signCorr = 0) const;
138
139 GPUd() bool propagateToDCA(const o2::dataformats::VertexBase& vtx, o2::track::TrackParametrizationWithError<value_type>& track, value_type bZ,
141 o2::dataformats::DCA* dcaInfo = nullptr, track::TrackLTIntegral* tofInfo = nullptr,
142 int signCorr = 0, value_type maxD = 999.f) const;
143
144 GPUd() bool propagateToDCABxByBz(const o2::dataformats::VertexBase& vtx, o2::track::TrackParametrizationWithError<value_type>& track,
146 o2::dataformats::DCA* dcaInfo = nullptr, track::TrackLTIntegral* tofInfo = nullptr,
147 int signCorr = 0, value_type maxD = 999.f) const;
148
149 GPUd() bool propagateToDCA(const o2::math_utils::Point3D<value_type>& vtx, o2::track::TrackParametrization<value_type>& track, value_type bZ,
151 std::array<value_type, 2>* dca = nullptr, track::TrackLTIntegral* tofInfo = nullptr,
152 int signCorr = 0, value_type maxD = 999.f) const;
153
154 GPUd() bool propagateToDCABxByBz(const o2::math_utils::Point3D<value_type>& vtx, o2::track::TrackParametrization<value_type>& track,
156 std::array<value_type, 2>* dca = nullptr, track::TrackLTIntegral* tofInfo = nullptr,
157 int signCorr = 0, value_type maxD = 999.f) const;
158
161 PropagatorImpl& operator=(PropagatorImpl const&) = delete;
162 PropagatorImpl& operator=(PropagatorImpl&&) = delete;
163
164 // Bz at the origin
165 GPUd() void updateField();
166 GPUd() value_type getNominalBz() const { return mNominalBz; }
167 GPUd() void setTGeoFallBackAllowed(bool v) { mTGeoFallBackAllowed = v; }
168 GPUd() bool isTGeoFallBackAllowed() const { return mTGeoFallBackAllowed; }
169 GPUd() void setMatLUT(const o2::base::MatLayerCylSet* lut) { mMatLUT = lut; }
170 GPUd() const o2::base::MatLayerCylSet* getMatLUT() const { return mMatLUT; }
171 GPUd() void setGPUField(const o2::gpu::GPUTPCGMPolynomialField* field) { mGPUField = field; }
172 GPUd() const o2::gpu::GPUTPCGMPolynomialField* getGPUField() const { return mGPUField; }
173 GPUd() void setNominalBz(value_type bz) { mNominalBz = bz; }
174 GPUd() bool hasMagFieldSet() const { return mField != nullptr; }
175
176 GPUd() value_type estimateLTFast(o2::track::TrackLTIntegral& lt, const o2::track::TrackParametrization<value_type>& trc) const;
177 GPUd() float estimateLTIncrement(const o2::track::TrackParametrization<value_type>& trc, const o2::math_utils::Point3D<value_type>& postStart, const o2::math_utils::Point3D<value_type>& posEnd) const;
178
179#ifndef GPUCA_GPUCODE
180 static PropagatorImpl* Instance(bool uninitialized = false)
181 {
182 static PropagatorImpl instance(uninitialized);
183 return &instance;
184 }
185 static int initFieldFromGRP(const o2::parameters::GRPMagField* grp, bool verbose = false);
186 static int initFieldFromGRP(const o2::parameters::GRPObject* grp, bool verbose = false);
187 static int initFieldFromGRP(const std::string grpFileName = "", bool verbose = false);
188 static int initFieldFromGRP(float currL3, float currDip, bool uniform, bool verbose = false);
189#endif
190
192
193 GPUd() void getFieldXYZ(const math_utils::Point3D<float> xyz, float* bxyz) const;
194
195 GPUd() void getFieldXYZ(const math_utils::Point3D<double> xyz, double* bxyz) const;
196
197 GPUd() float getBz(const math_utils::Point3D<float> xyz) const;
198
199 GPUd() double getBz(const math_utils::Point3D<double> xyz) const;
200
201 private:
202#ifndef GPUCA_GPUCODE
203 PropagatorImpl(bool uninitialized = false);
204 ~PropagatorImpl() = default;
205#endif
206 static GPUglobalconstexpr() value_type Epsilon = 0.00001; // precision of propagation to X
207 template <typename T>
208 GPUd() void getFieldXYZImpl(const math_utils::Point3D<T> xyz, T* bxyz) const;
209 template <typename T>
210 GPUd() T getBzImpl(const math_utils::Point3D<T> xyz) const;
211
212 const o2::field::MagFieldFast* mFieldFast = nullptr;
213 o2::field::MagneticField* mField = nullptr;
214 value_type mNominalBz = 0;
215
216 bool mTGeoFallBackAllowed = true;
217 const o2::base::MatLayerCylSet* mMatLUT = nullptr; // externally set LUT
218 const o2::gpu::GPUTPCGMPolynomialField* mGPUField = nullptr; // externally set GPU Field
219
220 ClassDefNV(PropagatorImpl, 0);
221};
222
226
227} // namespace base
228} // namespace o2
229
230#endif
Base track model for the Barrel, params only, w/o covariance.
constexpr int p1()
constexpr to accelerate the coordinates changing
Declarations for the wrapper for the set of cylindrical material layers.
Header to collect physics constants.
Track Length and TOF integral.
GPUd() bool hasMagFieldSet() const
Definition Propagator.h:174
GPUd() void updateField()
value_type value_type value_type MatCorrType track::TrackLTIntegral * tofInfo
Definition Propagator.h:79
value_type value_type value_type MatCorrType track::TrackLTIntegral int signCorr
Definition Propagator.h:79
track::TrackParametrizationWithError< value_type > TrackParCov_t
Definition Propagator.h:66
track::TrackParametrization< value_type > TrackPar_t
Definition Propagator.h:65
value_type value_type bZ
Definition Propagator.h:89
value_type bool bzOnly
Definition Propagator.h:102
GPUd() bool isTGeoFallBackAllowed() const
Definition Propagator.h:168
const o2::math_utils::Point3D< value_type > const o2::math_utils::Point3D< value_type > &p1 const
Definition Propagator.h:191
GPUd() void setTGeoFallBackAllowed(bool v)
Definition Propagator.h:167
value_type value_type maxSnp
Definition Propagator.h:78
GPUd() void setMatLUT(const o2
Definition Propagator.h:169
static int initFieldFromGRP(const o2::parameters::GRPMagField *grp, bool verbose=false)
const o2::math_utils::Point3D< value_type > & p0
Definition Propagator.h:191
value_type value_type value_type maxStep
Definition Propagator.h:78
static GPUglobalconstexpr() float MAX_SIN_PHI=0.85f
value_type value_type value_type MatCorrType matCorr
Definition Propagator.h:78
GPUd() value_type estimateLTFast(o2 static GPUd() float estimateLTIncrement(const o2 PropagatorImpl * Instance(bool uninitialized=false)
Definition Propagator.h:180
TrackPar_t value_type value_type bool value_type value_type int minSteps
Definition Propagator.h:132
GLfloat GLfloat GLfloat alpha
Definition glcorearb.h:279
GLint GLenum GLint x
Definition glcorearb.h:403
const GLdouble * v
Definition glcorearb.h:832
GLenum array
Definition glcorearb.h:4274
GLdouble f
Definition glcorearb.h:310
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLboolean r
Definition glcorearb.h:1233
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...