Project
Loading...
Searching...
No Matches
RegularSpline1D.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
17
18#ifndef ALICEO2_GPUCOMMON_TPCFASTTRANSFORMATION_REGULARSPLINE1D_H
19#define ALICEO2_GPUCOMMON_TPCFASTTRANSFORMATION_REGULARSPLINE1D_H
20
21#include "GPUCommonDef.h"
22
23namespace o2
24{
25namespace gpu
26{
35{
36 public:
38
40 RegularSpline1D() = default;
41
43 ~RegularSpline1D() = default;
44
46 void construct(int32_t numberOfKnots);
47
49
54 template <typename T>
55 void correctEdges(T* data) const;
56
58 template <typename T>
59 T getSpline(const int32_t iknot, T f0, T f1, T f2, T f3, float u) const;
60
62 template <typename T>
63 T getSpline(const T correctedData[], float u) const;
64
66 int32_t getNumberOfKnots() const { return mNumberOfKnots; }
67
69 double knotIndexToU(int32_t index) const;
70
76 int32_t getKnotIndex(float u) const;
77
78 private:
79 uint8_t mNumberOfKnots = 5;
80};
81
85
86inline void RegularSpline1D::construct(int32_t numberOfKnots)
87{
89 mNumberOfKnots = (numberOfKnots < 5) ? 5 : numberOfKnots;
90}
91
92template <typename T>
93inline T RegularSpline1D::getSpline(const int32_t iknot1, T f0, T f1, T f2, T f3, float u) const
94{
99
105
106 f0 -= f1;
107 f2 -= f1;
108 f3 -= f1;
109
110 const T half(0.5f);
111
112 // Scale u so that the knot1 is at 0.0 and the knot2 is at 1.0
113 T x = T((mNumberOfKnots - 1) * u - iknot1);
114 T x2 = x * x;
115
116 T z1 = half * (f2 - f0); // scaled u derivative at the knot 1
117 T z2 = half * f3; // scaled u derivative at the knot 2
118
119 // f(u) = a*u^3 + b*u^2 + c*u + d
120 //
121 // f(0) = f1
122 // f(1) = f2
123 // f'(0) = z1 = 0.5 f2 - 0.5 f0
124 // f'(1) = z2 = 0.5 f3 - 0.5 f1
125 //
126 // T d = f1;
127 // T c = z1;
128
129 T a = -f2 - f2 + z1 + z2;
130 T b = f2 - z1 - a;
131 return (a * x + b) * x2 + z1 * x + f1;
132}
133
134template <typename T>
135inline T RegularSpline1D::getSpline(const T correctedData[], float u) const
136{
138 int32_t iknot = getKnotIndex(u);
139 const T* f = correctedData + iknot - 1;
140 return getSpline(iknot, f[0], f[1], f[2], f[3], u);
141}
142
143inline double RegularSpline1D::knotIndexToU(int32_t iknot) const
144{
145 if (iknot <= 0) {
146 return 0;
147 }
148 if (iknot >= mNumberOfKnots) {
149 return 1;
150 }
151 return iknot / ((double)mNumberOfKnots - 1.);
152}
153
154inline int32_t RegularSpline1D::getKnotIndex(float u) const
155{
156 //index is just u elem [0, 1] * numberOfKnots and then floored. (so the "left" coordinate beside u gets chosen)
157 int32_t index = (int32_t)(u * (mNumberOfKnots - 1));
158 if (index <= 1) {
159 index = 1;
160 } else if (index >= mNumberOfKnots - 3) {
161 index = mNumberOfKnots - 3;
162 }
163 return index;
164}
165
166template <typename T>
168{
169 // data[i] is the i-th f-value
170 constexpr T c0(0.5), c1(1.5);
171 const int32_t i = mNumberOfKnots - 1;
172 data[0] = c0 * (data[0] + data[3]) + c1 * (data[1] - data[2]);
173 data[i] = c0 * (data[i - 0] + data[i - 3]) + c1 * (data[i - 1] - data[i - 2]);
174}
175
176} // namespace gpu
177} // namespace o2
178
179#endif
int32_t i
bool const GPUTPCGMMerger::trackCluster * c1
RegularSpline1D()=default
_____________ Constructors / destructors __________________________
~RegularSpline1D()=default
Destructor.
T getSpline(const int32_t iknot, T f0, T f1, T f2, T f3, float u) const
Get interpolated value for f(u) using spline at knot "knot_1" and function values at knots {knot_0,...
int32_t getKnotIndex(float u) const
void correctEdges(T *data) const
_______________ Main functionality ________________________
void construct(int32_t numberOfKnots)
Constructor. Number of knots will be set to at least 5.
int32_t getNumberOfKnots() const
Get number of knots.
double knotIndexToU(int32_t index) const
Get the U-Coordinate depending on the given knot-Index.
GLint GLenum GLint x
Definition glcorearb.h:403
GLuint index
Definition glcorearb.h:781
GLdouble f
Definition glcorearb.h:310
GLboolean GLboolean GLboolean b
Definition glcorearb.h:1233
GLboolean * data
Definition glcorearb.h:298
GLboolean GLboolean GLboolean GLboolean a
Definition glcorearb.h:1233
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...