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 "GPUCommonRtypes.h"
25
26#ifndef GPUCA_GPUCODE
27#include <array>
28#include <string>
29#endif
30
31namespace o2
32{
33namespace parameters
34{
35class GRPObject;
36class GRPMagField;
37} // namespace parameters
38
39namespace dataformats
40{
41class VertexBase;
42}
43
44namespace field
45{
46class MagFieldFast;
47class MagneticField;
48} // namespace field
49
50namespace gpu
51{
52class GPUTPCGMPolynomialField;
53}
54
55namespace base
56{
57
58template <typename value_T>
60{
61 public:
62 using value_type = value_T;
65
66 enum class MatCorrType : int {
67 USEMatCorrNONE, // flag to not use material corrections
68 USEMatCorrTGeo, // flag to use TGeo for material queries
70 }; // flag to use LUT for material queries (user must provide a pointer
71
72 static constexpr float MAX_SIN_PHI = 0.85f;
73 static constexpr float MAX_STEP = 2.0f;
74
75 GPUd() bool PropagateToXBxByBz(TrackParCov_t& track, value_type x,
77 track::TrackLTIntegral* tofInfo = nullptr, int signCorr = 0) const;
78
79 GPUd() bool PropagateToXBxByBz(TrackPar_t& track, value_type x,
81 track::TrackLTIntegral* tofInfo = nullptr, int signCorr = 0) const;
82
83 GPUd() bool propagateToX(TrackParCov_t& track, value_type x, value_type bZ,
85 track::TrackLTIntegral* tofInfo = nullptr, int signCorr = 0) const;
86
87 GPUd() bool propagateToX(TrackPar_t& track, value_type x, value_type bZ,
89 track::TrackLTIntegral* tofInfo = nullptr, int signCorr = 0) const;
90
91 template <typename track_T>
92 GPUd() bool propagateTo(track_T& track, value_type x, bool bzOnly = false, value_type maxSnp = MAX_SIN_PHI, value_type maxStep = MAX_STEP,
93 MatCorrType matCorr = MatCorrType::USEMatCorrLUT, track::TrackLTIntegral* tofInfo = nullptr, int signCorr = 0) const
94 {
95 return bzOnly ? propagateToX(track, x, getBz(track.getXYZGlo()), maxSnp, maxStep, matCorr, tofInfo, signCorr) : PropagateToXBxByBz(track, x, maxSnp, maxStep, matCorr, tofInfo, signCorr);
96 }
97
98 template <typename track_T>
99 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,
100 MatCorrType matCorr = MatCorrType::USEMatCorrLUT, track::TrackLTIntegral* tofInfo = nullptr, int signCorr = 0) const;
101
102 template <typename track_T>
103 GPUd() bool propagateToR(track_T& track, value_type r, bool bzOnly = false, value_type maxSnp = MAX_SIN_PHI, value_type maxStep = MAX_STEP,
104 MatCorrType matCorr = MatCorrType::USEMatCorrLUT, track::TrackLTIntegral* tofInfo = nullptr, int signCorr = 0) const;
105
106 GPUd() bool propagateToDCA(const o2::dataformats::VertexBase& vtx, o2::track::TrackParametrizationWithError<value_type>& track, value_type bZ,
108 o2::dataformats::DCA* dcaInfo = nullptr, track::TrackLTIntegral* tofInfo = nullptr,
109 int signCorr = 0, value_type maxD = 999.f) const;
110
111 GPUd() bool propagateToDCABxByBz(const o2::dataformats::VertexBase& vtx, o2::track::TrackParametrizationWithError<value_type>& track,
113 o2::dataformats::DCA* dcaInfo = nullptr, track::TrackLTIntegral* tofInfo = nullptr,
114 int signCorr = 0, value_type maxD = 999.f) const;
115
116 GPUd() bool propagateToDCA(const o2::math_utils::Point3D<value_type>& vtx, o2::track::TrackParametrization<value_type>& track, value_type bZ,
118 std::array<value_type, 2>* dca = nullptr, track::TrackLTIntegral* tofInfo = nullptr,
119 int signCorr = 0, value_type maxD = 999.f) const;
120
121 GPUd() bool propagateToDCABxByBz(const o2::math_utils::Point3D<value_type>& vtx, o2::track::TrackParametrization<value_type>& track,
123 std::array<value_type, 2>* dca = nullptr, track::TrackLTIntegral* tofInfo = nullptr,
124 int signCorr = 0, value_type maxD = 999.f) const;
125
128 PropagatorImpl& operator=(PropagatorImpl const&) = delete;
129 PropagatorImpl& operator=(PropagatorImpl&&) = delete;
130
131 // Bz at the origin
132 GPUd() void updateField();
133 GPUd() value_type getNominalBz() const { return mNominalBz; }
134 GPUd() void setTGeoFallBackAllowed(bool v) { mTGeoFallBackAllowed = v; }
135 GPUd() bool isTGeoFallBackAllowed() const { return mTGeoFallBackAllowed; }
136 GPUd() void setMatLUT(const o2::base::MatLayerCylSet* lut) { mMatLUT = lut; }
137 GPUd() const o2::base::MatLayerCylSet* getMatLUT() const { return mMatLUT; }
138 GPUd() void setGPUField(const o2::gpu::GPUTPCGMPolynomialField* field) { mGPUField = field; }
139 GPUd() const o2::gpu::GPUTPCGMPolynomialField* getGPUField() const { return mGPUField; }
140 GPUd() void setNominalBz(value_type bz) { mNominalBz = bz; }
141 GPUd() bool hasMagFieldSet() const { return mField != nullptr; }
142
143 GPUd() value_type estimateLTFast(o2::track::TrackLTIntegral& lt, const o2::track::TrackParametrization<value_type>& trc) const;
144 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;
145
146#ifndef GPUCA_GPUCODE
147 static PropagatorImpl* Instance(bool uninitialized = false)
148 {
149 static PropagatorImpl instance(uninitialized);
150 return &instance;
151 }
152 static int initFieldFromGRP(const o2::parameters::GRPMagField* grp, bool verbose = false);
153
154 static int initFieldFromGRP(const o2::parameters::GRPObject* grp, bool verbose = false);
155 static int initFieldFromGRP(const std::string grpFileName = "", bool verbose = false);
156#endif
157
158 GPUd() MatBudget getMatBudget(MatCorrType corrType, const o2::math_utils::Point3D<value_type>& p0, const o2::math_utils::Point3D<value_type>& p1) const;
159
160 GPUd() void getFieldXYZ(const math_utils::Point3D<float> xyz, float* bxyz) const;
161
162 GPUd() void getFieldXYZ(const math_utils::Point3D<double> xyz, double* bxyz) const;
163
164 GPUd() float getBz(const math_utils::Point3D<float> xyz) const;
165
166 GPUd() double getBz(const math_utils::Point3D<double> xyz) const;
167
168 private:
169#ifndef GPUCA_GPUCODE
170 PropagatorImpl(bool uninitialized = false);
171 ~PropagatorImpl() = default;
172#endif
173 static constexpr value_type Epsilon = 0.00001; // precision of propagation to X
174 template <typename T>
175 GPUd() void getFieldXYZImpl(const math_utils::Point3D<T> xyz, T* bxyz) const;
176 template <typename T>
177 GPUd() T getBzImpl(const math_utils::Point3D<T> xyz) const;
178
179 const o2::field::MagFieldFast* mFieldFast = nullptr;
180 o2::field::MagneticField* mField = nullptr;
181 value_type mNominalBz = 0;
182
183 bool mTGeoFallBackAllowed = true;
184 const o2::base::MatLayerCylSet* mMatLUT = nullptr; // externally set LUT
185 const o2::gpu::GPUTPCGMPolynomialField* mGPUField = nullptr; // externally set GPU Field
186
187 ClassDefNV(PropagatorImpl, 0);
188};
189
193
194} // namespace base
195} // namespace o2
196
197#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:141
GPUd() void updateField()
value_type value_type value_type MatCorrType track::TrackLTIntegral * tofInfo
Definition Propagator.h:77
value_type value_type value_type MatCorrType track::TrackLTIntegral int signCorr
Definition Propagator.h:77
static constexpr float MAX_SIN_PHI
Definition Propagator.h:72
value_type value_type bZ
Definition Propagator.h:83
value_type bool bzOnly
Definition Propagator.h:92
static constexpr float MAX_STEP
Definition Propagator.h:73
GPUd() bool isTGeoFallBackAllowed() const
Definition Propagator.h:135
const o2::math_utils::Point3D< value_type > const o2::math_utils::Point3D< value_type > &p1 const
Definition Propagator.h:158
GPUd() void setTGeoFallBackAllowed(bool v)
Definition Propagator.h:134
value_type value_type maxSnp
Definition Propagator.h:76
GPUd() void setMatLUT(const o2
Definition Propagator.h:136
static int initFieldFromGRP(const o2::parameters::GRPMagField *grp, bool verbose=false)
const o2::math_utils::Point3D< value_type > & p0
Definition Propagator.h:158
value_type value_type value_type maxStep
Definition Propagator.h:76
GPUd() bool PropagateToXBxByBz(TrackParCov_t &track
value_type value_type value_type MatCorrType matCorr
Definition Propagator.h:76
GPUd() value_type estimateLTFast(o2 static GPUd() float estimateLTIncrement(const o2 PropagatorImpl * Instance(bool uninitialized=false)
Definition Propagator.h:147
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 ...
Defining DataPointCompositeObject explicitly as copiable.