Project
Loading...
Searching...
No Matches
Ray.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 ALICEO2_RAY_H
16#define ALICEO2_RAY_H
17
18#include "GPUCommonRtypes.h"
19#include "GPUCommonDef.h"
20#include "GPUCommonMath.h"
22#include "MathUtils/Utils.h"
23
24#ifndef GPUCA_ALIGPUCODE // this part is unvisible on GPU version
25#include "MathUtils/Cartesian.h"
26#endif // !GPUCA_ALIGPUCODE
27
28/**********************************************************************
29 * *
30 * Ray parameterized via its endpoints as *
31 * Vi = Vi0 + t*(Vi1-Vi0), with Vi (i=0,1,2) for global X,Y,Z *
32 * and 0 < t < 1 *
33 * *
34 **********************************************************************/
35namespace o2
36{
37namespace base
38{
39
40class Ray
41{
42
43 public:
44 using vecF3 = float[3];
45 static constexpr float MinDistToConsider = 1e-4; // treat as 0 lenght distance below this
46 static constexpr float InvalidT = -1e9;
47 static constexpr float Tiny = 1e-9;
48
49 GPUd() Ray() : mP{0.f}, mD{0.f}, mDistXY2(0.f), mDistXY2i(0.f), mDistXYZ(0.f), mXDxPlusYDy(0.f), mXDxPlusYDyRed(0.f), mXDxPlusYDy2(0.f), mR02(0.f), mR12(0.f)
50 {
51 }
52 GPUdDefault() ~Ray() = default;
53
54#ifndef GPUCA_ALIGPUCODE // this part is unvisible on GPU version
56#endif // !GPUCA_ALIGPUCODE
57 GPUd() Ray(float x0, float y0, float z0, float x1, float y1, float z1);
58 GPUd() int crossLayer(const MatLayerCyl& lr);
59 GPUd() bool crossCircleR(float r2, float& cross1, float& cross2) const;
60
61 GPUd() float crossRadial(const MatLayerCyl& lr, int sliceID) const;
62 GPUd() float crossRadial(float cs, float sn) const;
63 GPUd() float crossZ(float z) const;
64
65 GPUd() void getCrossParams(int i, float& par1, float& par2) const
66 {
67 par1 = mCrossParams1[i];
68 par2 = mCrossParams2[i];
69 }
70
71 GPUd() bool isTooShort() const { return mDistXYZ < MinDistToConsider; }
72 GPUd() void getMinMaxR2(float& rmin2, float& rmax2) const;
73
74 GPUd() float getDist() const { return mDistXYZ; }
75 GPUd() float getDist(float deltaT) const { return mDistXYZ * (deltaT > 0 ? deltaT : -deltaT); }
76
77 // for debug only
78 GPUd() float getPos(float t, int i) const { return mP[i] + t * mD[i]; }
79
80 GPUd() float getPhi(float t) const
81 {
82 float p = o2::gpu::CAMath::ATan2(mP[1] + t * mD[1], mP[0] + t * mD[0]);
83 o2::math_utils::bringTo02Pi(p);
84 return p;
85 }
86
87 GPUd() float getZ(float t) const { return mP[2] + t * mD[2]; }
88
89 GPUd() bool validateZRange(float& cpar1, float& cpar2, const MatLayerCyl& lr) const;
90
91 private:
92 vecF3 mP;
93 vecF3 mD;
94 float mDistXY2;
95 float mDistXY2i;
96 float mDistXYZ;
97 float mXDxPlusYDy;
98 float mXDxPlusYDyRed;
99 float mXDxPlusYDy2;
100 float mR02;
101 float mR12;
102 float mCrossParams1[2];
103 float mCrossParams2[2];
104
105 ClassDefNV(Ray, 1);
106};
107
108//______________________________________________________
109#ifndef GPUCA_ALIGPUCODE // this part is unvisible on GPU version
110
112 : mP{point0.X(), point0.Y(), point0.Z()}, mD{point1.X() - point0.X(), point1.Y() - point0.Y(), point1.Z() - point0.Z()}
113{
114 mDistXY2 = mD[0] * mD[0] + mD[1] * mD[1];
115 mDistXY2i = mDistXY2 > Tiny ? 1.f / mDistXY2 : 0.f;
116 mDistXYZ = o2::gpu::CAMath::Sqrt(mDistXY2 + mD[2] * mD[2]);
117 mXDxPlusYDy = point0.X() * mD[0] + point0.Y() * mD[1];
118 mXDxPlusYDyRed = -mXDxPlusYDy * mDistXY2i;
119 mXDxPlusYDy2 = mXDxPlusYDy * mXDxPlusYDy;
120 mR02 = point0.Perp2();
121 mR12 = point1.Perp2();
122}
123#endif // !GPUCA_ALIGPUCODE
124
125//______________________________________________________
126GPUdi() Ray::Ray(float x0, float y0, float z0, float x1, float y1, float z1)
127 : mP{x0, y0, z0}, mD{x1 - x0, y1 - y0, z1 - z0}
128{
129 mDistXY2 = mD[0] * mD[0] + mD[1] * mD[1];
130 mDistXY2i = mDistXY2 > Tiny ? 1.f / mDistXY2 : 0.f;
131 mDistXYZ = o2::gpu::CAMath::Sqrt(mDistXY2 + mD[2] * mD[2]);
132 mXDxPlusYDy = x0 * mD[0] + y0 * mD[1];
133 mXDxPlusYDyRed = -mXDxPlusYDy * mDistXY2i;
134 mXDxPlusYDy2 = mXDxPlusYDy * mXDxPlusYDy;
135 mR02 = x0 * x0 + y0 * y0;
136 mR12 = x1 * x1 + y1 * y1;
137}
138
139//______________________________________________________
140GPUdi() float Ray::crossRadial(float cs, float sn) const
141{
142 // calculate t of crossing with radial line with inclination cosine and sine
143 float den = mD[0] * sn - mD[1] * cs;
144 return den != 0. ? (mP[1] * cs - mP[0] * sn) / den : InvalidT;
145}
146
147//______________________________________________________
148GPUdi() bool Ray::crossCircleR(float r2, float& cross1, float& cross2) const
149{
150 // calculate parameters t of intersection with circle of radius r^2
151 // calculated as solution of equation
152 // t^2*mDistXY2 +- sqrt( mXDxPlusYDy^2 - mDistXY2*(mR02 - r^2) )
153 //
154 float det = mXDxPlusYDy2 - mDistXY2 * (mR02 - r2);
155 if (det < 0.f) {
156 return false; // no intersection
157 }
158 float detRed = o2::gpu::CAMath::Sqrt(det) * mDistXY2i;
159 cross1 = mXDxPlusYDyRed + detRed; // (-mXDxPlusYDy + det)*mDistXY2i;
160 cross2 = mXDxPlusYDyRed - detRed; // (-mXDxPlusYDy - det)*mDistXY2i;
161 return true;
162}
163
164//______________________________________________________
165GPUdi() float Ray::crossRadial(const MatLayerCyl& lr, int sliceID) const
166{
167 // calculate t of crossing with phimin of layer's slice sliceID
168 return crossRadial(lr.getSliceCos(sliceID), lr.getSliceSin(sliceID));
169}
170
171//______________________________________________________
172GPUdi() float Ray::crossZ(float z) const
173{
174 // calculate t of crossing XY plane at Z
175 return mD[2] != 0. ? (z - mP[2]) / mD[2] : InvalidT;
176}
177
178//______________________________________________________
179GPUdi() bool Ray::validateZRange(float& cpar1, float& cpar2, const MatLayerCyl& lr) const
180{
181 // make sure that estimated crossing parameters are compatible
182 // with Z coverage of the layer
183 MatLayerCyl::RangeStatus zout0 = lr.isZOutside(getZ(cpar1)), zout1 = lr.isZOutside(getZ(cpar2));
184 if (zout0 == zout1) { // either both points outside w/o crossing or boht inside
185 return zout0 == MatLayerCyl::Within ? true : false;
186 }
187 // at least 1 point is outside, but there is a crossing
188 if (zout0 != MatLayerCyl::Within) {
189 cpar1 = crossZ(zout0 == MatLayerCyl::Below ? lr.getZMin() : lr.getZMax());
190 }
191 if (zout1 != MatLayerCyl::Within) {
192 cpar2 = crossZ(zout1 == MatLayerCyl::Below ? lr.getZMin() : lr.getZMax());
193 }
194 return true;
195}
196
197//______________________________________________________
198GPUdi() void Ray::getMinMaxR2(float& rmin2, float& rmax2) const
199{
200 // calculate min and max R2
201 if (mR02 > mR12) {
202 rmin2 = mR12;
203 rmax2 = mR02;
204 } else {
205 rmin2 = mR02;
206 rmax2 = mR12;
207 }
208 if (mXDxPlusYDyRed > 0.f && mXDxPlusYDyRed < 1.f) {
209 // estimate point of closest approach to origin as the crossing of normal from the origin to input vector
210 // use r^2(t) = mR02 + t^2 (mD[0]^2+mD[1]^2) + 2t*mXDxPlusYDy
211 float xMin = mP[0] + mXDxPlusYDyRed * mD[0], yMin = mP[1] + mXDxPlusYDyRed * mD[1];
212 rmin2 = xMin * xMin + yMin * yMin;
213 }
214}
215
216} // namespace base
217} // namespace o2
218
219#endif
General auxilliary methods.
int32_t i
Declarations for single cylindrical material layer class.
GPUd() float getDist(float deltaT) const
Definition Ray.h:75
GPUd() bool isTooShort() const
Definition Ray.h:71
GPUd() float getPhi(float t) const
Definition Ray.h:80
Ray(const math_utils::Point3D< float > point0, const math_utils::Point3D< float > point1)
Definition Ray.h:111
float & par1
Definition Ray.h:65
float[3] vecF3
Definition Ray.h:44
static constexpr float MinDistToConsider
Definition Ray.h:45
float float float float float z1
Definition Ray.h:57
GPUd() Ray(float x0
GPUd() float getZ(float t) const
Definition Ray.h:87
float float &cross2 const
Definition Ray.h:59
static constexpr float InvalidT
Definition Ray.h:46
GPUdDefault() ~Ray()=default
float & cpar2
Definition Ray.h:89
static constexpr float Tiny
Definition Ray.h:47
GPUd() Ray()
Definition Ray.h:49
float float z0
Definition Ray.h:57
float & cross1
Definition Ray.h:59
GLuint GLfloat GLfloat GLfloat GLfloat y1
Definition glcorearb.h:5034
GLuint GLfloat GLfloat GLfloat x1
Definition glcorearb.h:5034
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLuint GLfloat x0
Definition glcorearb.h:5034
GLuint GLfloat GLfloat y0
Definition glcorearb.h:5034
GLdouble GLdouble GLdouble z
Definition glcorearb.h:843
GPUdi() Ray
Definition Ray.h:126
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...