17#ifndef ALICEO2_GPUCOMMON_TPCFASTTRANSFORMATION_IRREGULARSPLINE1D_H
18#define ALICEO2_GPUCOMMON_TPCFASTTRANSFORMATION_IRREGULARSPLINE1D_H
184 void construct(int32_t numberOfKnots,
const float knots[], int32_t numberOfAxisBins);
196 template <
typename T>
200 template <typename T>
204 template <typename T>
208 GPUd() int32_t getNumberOfKnots()
const {
return mNumberOfKnots; }
235 GPUd()
const int32_t* getBin2KnotMap()
const {
return reinterpret_cast<const int32_t*
>(
mFlatBufferPtr + mBin2KnotMapOffset); }
249 GPUd() static
void getEdgeCorrectionCoefficients(
double u0,
double u1,
double u2,
double u3,
double&
c0,
double&
c1,
double&
c2,
double&
c3);
259 int32_t* getBin2KnotMapNonConst() {
return reinterpret_cast<int32_t*
>(
mFlatBufferPtr + mBin2KnotMapOffset); }
265 int32_t mNumberOfKnots;
266 int32_t mNumberOfAxisBins;
267 uint32_t mBin2KnotMapOffset;
277GPUdi() T IrregularSpline1D::getSpline(const IrregularSpline1D::Knot& knot1, T f0, T f1, T f2, T f3,
float u)
286 T
x = T((u - knot1.u) * knot1.scale);
287 T z1 = T(f0 * knot1.scaleL0 + f2 * knot1.scaleL2);
288 T z2 = T(f2 * knot1.scaleR2 + f3 * knot1.scaleR3);
302 T
a = -f2 - f2 + z1 + z2;
304 return a *
x * x2 +
b * x2 + z1 *
x + f1;
308GPUdi() T IrregularSpline1D::getSpline(const T correctedData[],
float u)
const
311 int32_t iknot = getKnotIndex(u);
312 const IrregularSpline1D::Knot& knot = getKnot(iknot);
313 const T*
f = correctedData + iknot - 1;
314 return getSpline(knot,
f[0],
f[1],
f[2],
f[3], u);
317GPUdi() int32_t IrregularSpline1D::getKnotIndex(
float u)
const
320 int32_t ibin = (int32_t)(u * mNumberOfAxisBins);
324 if (ibin > mNumberOfAxisBins - 1) {
325 ibin = mNumberOfAxisBins - 1;
327 return getBin2KnotMap()[ibin];
330GPUdi()
void IrregularSpline1D::getEdgeCorrectionCoefficients(
double u0,
double u1,
double u2,
double u3,
double& c0,
double&
c1,
double&
c2,
double& c3)
337 double x0 = (u0 - u1) / du;
340 double x3 = (u3 - u1) / du;
342 double cL0 = -1. / (
x0 * (
x0 - 1.));
343 double cL2 =
x0 / (
x0 - 1.);
344 double cR2 = (
x3 - 2.) / (x3 - 1.);
345 double cR3 = 1. / (
x3 * (
x3 - 1.));
366 double x01 =
x0 - 1.;
370 c0 = 1. / (
x0 * x01 * x01);
372 c2 = -(-2 *
x0 + 3. + x01 * cR2) *
x0 / (x01 * x01);
373 c3 = -
x0 * cR3 / x01;
379 c2 = (
c2 - cL2) / cL0;
387 c1 = 1. - c0 -
c2 - c3;
393 const IrregularSpline1D::Knot*
s = getKnots();
394 double c0,
c1,
c2, c3;
395 getEdgeCorrectionCoefficients(s[0].u, s[1].u, s[2].u, s[3].u, c0,
c1,
c2, c3);
397 int32_t
i = mNumberOfKnots - 1;
398 getEdgeCorrectionCoefficients(s[
i - 0].u, s[
i - 1].u, s[
i - 2].u, s[
i - 3].u, c0,
c1,
c2, c3);
Definition of FlatObject class.
bool const GPUTPCGMMerger::trackCluster * c1
bool const GPUTPCGMMerger::trackCluster const clcomparestruct * c2
char * releaseInternalBuffer()
_____________ Methods for making the data buffer external __________________________
void setFutureBufferAddress(char *futureFlatBufferPtr)
static constexpr size_t getBufferAlignmentBytes()
Gives minimal alignment in bytes required for the flat buffer.
void setActualBufferAddress(char *actualFlatBufferPtr)
_____________ Methods for moving the class with its external buffer to another location _____________...
void moveBufferTo(char *newBufferPtr)
static constexpr size_t getClassAlignmentBytes()
_____________ Memory alignment __________________________
static constexpr size_t getDataAlignmentBytes()
Get minimal required alignment for the spline data.
GPUd() static T getSpline(const IrregularSpline1D float u const
void print() const
Print method.
int32_t getNumberOfAxisBins() const
Get number of axis bins.
double double double double double double & c2
void construct(int32_t numberOfKnots, const float knots[], int32_t numberOfAxisBins)
_______________ Construction interface ________________________
~IrregularSpline1D()=default
Destructor.
double double double double double & c1
void cloneFromObject(const IrregularSpline1D &obj, char *newFlatBufferPtr)
Construction interface.
double double double double double double double & c3
GPUd() void correctEdges(T *data) const
_______________ Main functionality ________________________
GPUd() const int32_t *getBin2KnotMap() const
technical stuff
static constexpr size_t getClassAlignmentBytes()
_____________ Memory alignment __________________________
double double double double & c0
IrregularSpline1D()
_____________ Constructors / destructors __________________________
static constexpr size_t getBufferAlignmentBytes()
Get minimal required alignment for the flat buffer.
IrregularSpline1D(const IrregularSpline1D &)=delete
Copy constructor: disabled to avoid ambiguity. Use cloneFromObject instead.
GPUd() int32_t getKnotIndex(float u) const
void constructRegular(int32_t numberOfKnotsU)
Constructor for a regular spline.
IrregularSpline1D & operator=(const IrregularSpline1D &)=delete
Assignment operator: disabled to avoid ambiguity. Use cloneFromObject instead.
GLboolean GLboolean GLboolean b
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLboolean GLboolean GLboolean GLboolean a
const float3 float float float float x3
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
The struct represents a knot(i) and interval [ knot(i), knot(i+1) ].
float scaleL2
a coefficient at f(i+1) for f'(i) calculation
float scale
some useful values for spline calculation:
float scaleR3
a coefficient at f(i+2) for f'(i+1) calculation
float u
u coordinate of the knot i
float scaleR2
a coefficient at f(i+1) for f'(i+1) calculation
float scaleL0
a coefficient at f(i-1) for f'(i) calculation