Project
Loading...
Searching...
No Matches
Spline1DSpec.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
16
17#ifndef ALICEO2_GPUCOMMON_TPCFASTTRANSFORMATION_SPLINE1DSPEC_H
18#define ALICEO2_GPUCOMMON_TPCFASTTRANSFORMATION_SPLINE1DSPEC_H
19
20#include "GPUCommonDef.h"
21#include "FlatObject.h"
22#include "SplineUtil.h"
23
24#if !defined(GPUCA_GPUCODE)
25#include <functional>
26#include <type_traits>
27#endif
28
29class TFile;
30
31namespace o2::gpu
32{
33
36template <typename DataT>
37struct Knot {
38 DataT u;
39 DataT Li;
41 GPUd() int32_t getU() const { return (int32_t)(u + 0.1f); }
42};
43
47
57template <typename DataT, class FlatBase = FlatObject>
58class Spline1DContainerBase : public FlatBase
59{
60 public:
62
64 GPUd() static constexpr int32_t getVersion() { return 1; }
65
67
70
73
76
78
80 GPUd() int32_t getUmax() const { return mUmax; }
81
83 GPUd() int32_t getYdimensions() const { return mYdim; }
84
86 GPUd() size_t getParameterAlignmentBytes() const
87 {
88 size_t s = 2 * sizeof(DataT) * mYdim;
89 return (s < 16) ? s : 16;
90 }
91
93 GPUd() int32_t getNumberOfParameters() const { return calcNumberOfParameters(mYdim); }
94
96 GPUd() size_t getSizeOfParameters() const { return sizeof(DataT) * getNumberOfParameters(); }
97
99 GPUd() int32_t getNumberOfKnots() const { return mNumberOfKnots; }
100
102
104 GPUd() DataT convXtoU(DataT x) const { return (x - mXmin) * mXtoUscale; }
105
107 GPUd() DataT convUtoX(DataT u) const { return mXmin + u / mXtoUscale; }
108
110 GPUd() DataT getXmin() const { return mXmin; }
111
113 GPUd() DataT getXmax() const { return mXmin + mUmax / mXtoUscale; }
114
116 GPUd() DataT getXtoUscale() const { return mXtoUscale; }
117
119 GPUd() void setXrange(DataT xMin, DataT xMax);
120
122
124 GPUd() int32_t calcNumberOfParameters(int32_t nYdim) const { return (2 * nYdim) * getNumberOfKnots(); }
125
127 int32_t mYdim = 0;
128 int32_t mNumberOfKnots = 0;
129 int32_t mUmax = 0;
130 DataT mXmin = 0;
131 DataT mXtoUscale = 0;
132};
133
134template <typename DataT, typename FlatBase = FlatObject>
135class Spline1DContainer; // forward declaration
136
137template <typename DataT>
138class Spline1DContainer<DataT, FlatObject> : public Spline1DContainerBase<DataT, FlatObject>
139{
140 public:
142 GPUd() const int32_t* getUtoKnotMap() const { return mUtoKnotMap; }
143
145 GPUd() const Knot<DataT>* getKnots() const { return reinterpret_cast<const Knot<DataT>*>(this->mFlatBufferPtr); }
146
148 template <SafetyLevel SafeT = SafetyLevel::kSafe>
149 GPUd() const Knot<DataT>& getKnot(int32_t i) const
150 {
151 if (SafeT == SafetyLevel::kSafe) {
152 i = (i < 0) ? 0 : (i >= this->getNumberOfKnots() ? this->getNumberOfKnots() - 1 : i);
153 }
154 return getKnots()[i];
155 }
156
158 template <SafetyLevel SafeT = SafetyLevel::kSafe>
159 GPUd() int32_t getLeftKnotIndexForU(DataT u) const;
160
162 GPUd() DataT* getParameters() { return mParameters; }
163
165 GPUd() const DataT* getParameters() const { return mParameters; }
166
167#if !defined(GPUCA_GPUCODE) && !defined(GPUCA_STANDALONE)
169 void approximateFunction(double xMin, double xMax, std::function<void(double x, double f[])> F, int32_t nAuxiliaryDataPoints = 4);
170
172 int32_t writeToFile(TFile& outf, const char* name);
173
175 static Spline1DContainer* readFromFile(TFile& inpf, const char* name);
176
178 static int32_t test(const bool draw = 0, const bool drawDataPoints = 1);
179#endif
180
182 void print() const;
183
184#if !defined(GPUCA_GPUCODE)
185 void cloneFromObject(const Spline1DContainer& obj, char* newFlatBufferPtr);
186 void moveBufferTo(char* newBufferPtr);
187
190 template <class OtherFlatBase>
192#endif
193
194 void destroy();
195 void setActualBufferAddress(char* actualFlatBufferPtr);
196 void setFutureBufferAddress(char* futureFlatBufferPtr);
197
198 protected:
199#if !defined(GPUCA_GPUCODE)
200 void recreate(int32_t nYdim, int32_t numberOfKnots);
201 void recreate(int32_t nYdim, int32_t numberOfKnots, const int32_t knotU[]);
202#endif
203
205 int32_t* getUtoKnotMap() { return mUtoKnotMap; }
206
208 Knot<DataT>* getKnots() { return reinterpret_cast<Knot<DataT>*>(this->mFlatBufferPtr); }
209
210 int32_t* mUtoKnotMap = nullptr;
211 DataT* mParameters = nullptr;
212
214};
215
216template <typename DataT>
217class Spline1DContainer<DataT, NoFlatObject> : public Spline1DContainerBase<DataT, NoFlatObject>
218{
219 public:
221 GPUd() const int32_t* getUtoKnotMapFromBuffer(const char* flatBuf) const
222 {
223 return reinterpret_cast<const int32_t*>(flatBuf + this->getNumberOfKnots() * sizeof(Knot<DataT>));
224 }
225
228 template <SafetyLevel SafeT = SafetyLevel::kSafe>
229 GPUd() int32_t getLeftKnotIndexForUFromBuffer(const char* flatBuf, DataT u) const
230 {
231 int32_t iu = u < 0 ? 0 : (u > (float)this->mUmax ? this->mUmax : (int32_t)u);
232 if (SafeT == SafetyLevel::kSafe) {
233 iu = (iu < 0) ? 0 : (iu > this->mUmax ? this->mUmax : iu);
234 }
235 return getUtoKnotMapFromBuffer(flatBuf)[iu];
236 }
237
241 GPUd() const Knot<DataT>* getKnotsFromBuffer(const char* flatBuf) const { return reinterpret_cast<const Knot<DataT>*>(flatBuf); }
242
245 template <SafetyLevel SafeT = SafetyLevel::kSafe>
246 GPUd() const Knot<DataT>& getKnotFromBuffer(const char* flatBuf, int32_t i) const
247 {
248 if (SafeT == SafetyLevel::kSafe) {
249 i = (i < 0) ? 0 : (i >= this->getNumberOfKnots() ? this->getNumberOfKnots() - 1 : i);
250 }
251 return getKnotsFromBuffer(flatBuf)[i];
252 }
253
254 // Lifecycle no-ops: NoFlatObject splines have no owned buffer.
255 void destroy()
256 {
257 this->mNumberOfKnots = 0;
258 this->mUmax = 0;
259 this->mYdim = 0;
260 this->mXmin = 0.;
261 this->mXtoUscale = 1.;
262 this->mFlatBufferSize = 0;
263 }
264 GPUdi() void setActualBufferAddress(char*) {}
265 GPUdi() void setFutureBufferAddress(char*) {}
266
267#if !defined(GPUCA_GPUCODE)
269 template <class OtherFlatBase>
271 {
272 this->mYdim = src.getYdimensions();
273 this->mNumberOfKnots = src.getNumberOfKnots();
274 this->mUmax = src.getUmax();
275 this->mXmin = src.getXmin();
276 this->mXtoUscale = src.getXtoUscale();
277 this->mFlatBufferSize = src.getFlatBufferSize();
278 }
279#endif
280};
281
282template <typename DataT>
283template <SafetyLevel SafeT>
284GPUdi() int32_t Spline1DContainer<DataT, FlatObject>::getLeftKnotIndexForU(DataT u) const
285{
288 int32_t iu = u < 0 ? 0 : (u > (float)this->mUmax ? this->mUmax : (int32_t)u);
289 if (SafeT == SafetyLevel::kSafe) {
290 iu = (iu < 0) ? 0 : (iu > this->mUmax ? this->mUmax : iu);
291 }
292 return getUtoKnotMap()[iu];
293}
294
295template <typename DataT, class FlatBase>
296GPUdi() void Spline1DContainerBase<DataT, FlatBase>::setXrange(DataT xMin, DataT xMax)
297{
298 mXmin = xMin;
299 double l = ((double)xMax) - xMin;
300 if (l < 1.e-8) {
301 l = 1.e-8;
302 }
303 mXtoUscale = this->mUmax / l;
304}
305
326template <typename DataT, int32_t YdimT, int32_t SpecT, class FlatBase = FlatObject>
328
333template <typename DataT, int32_t YdimT, class FlatBase>
334class Spline1DSpec<DataT, YdimT, 0, FlatBase> : public Spline1DContainer<DataT, FlatBase>
335{
337
338 public:
340
342
344 GPUd() void interpolate(DataT x, GPUgeneric() DataT S[/*mYdim*/]) const
345 {
346 if constexpr (std::is_same_v<FlatBase, FlatObject>) {
347 interpolateAtU<SafetyLevel::kSafe>(this->mYdim, this->mParameters, this->convXtoU(x), S);
348 }
349 }
350
352 template <SafetyLevel SafeT = SafetyLevel::kSafe>
353 GPUd() void interpolateAtU(int32_t inpYdim, GPUgeneric() const DataT Parameters[], DataT u, GPUgeneric() DataT S[/*nYdim*/]) const
354 {
355 if constexpr (std::is_same_v<FlatBase, FlatObject>) {
356 const auto nYdimTmp = SplineUtil::getNdim<YdimT>(inpYdim);
357 const auto nYdim = nYdimTmp.get();
358 int32_t iknot = this->template getLeftKnotIndexForU<SafeT>(u);
359 const DataT* d = Parameters + (2 * nYdim) * iknot;
360 interpolateAtU(nYdim, this->getKnots()[iknot], &(d[0]), &(d[nYdim]), &(d[2 * nYdim]), &(d[3 * nYdim]), u, S);
361 }
362 }
363
367 template <typename T>
368 GPUd() void interpolateAtU(int32_t inpYdim, const KnotType& knotL,
369 GPUgeneric() const T Sl[/*mYdim*/], GPUgeneric() const T Dl[/*mYdim*/],
370 GPUgeneric() const T Sr[/*mYdim*/], GPUgeneric() const T Dr[/*mYdim*/],
371 DataT u, GPUgeneric() T S[/*mYdim*/]) const
372 {
373 const auto nYdimTmp = SplineUtil::getNdim<YdimT>(inpYdim);
374 const auto nYdim = nYdimTmp.get();
375
376 T dSdSl, dSdDl, dSdSr, dSdDr;
377 getSderivativesOverParsAtU<T>(knotL, u, dSdSl, dSdDl, dSdSr, dSdDr);
378
379 for (int32_t dim = 0; dim < nYdim; ++dim) {
380 S[dim] = dSdSr * Sr[dim] + dSdSl * Sl[dim] + dSdDl * Dl[dim] + dSdDr * Dr[dim];
381 }
382
383 /*
384 another way to calculate f(u):
385
386 if (u < (DataT)0) {
387 u = (DataT)0;
388 }
389 if (u > (DataT)ParentSpec::getUmax()) {
390 u = (DataT)ParentSpec::getUmax();
391 }
392
393 T uu = T(u - knotL.u);
394 T li = T(knotL.Li);
395 T v = uu * li; // scaled u
396 for (int32_t dim = 0; dim < nYdim; ++dim) {
397 T df = (Sr[dim] - Sl[dim]) * li;
398 T a = Dl[dim] + Dr[dim] - df - df;
399 T b = df - Dl[dim] - a;
400 S[dim] = ((a * v + b) * v + Dl[dim]) * uu + Sl[dim];
401 }
402 */
403 }
404
405 template <typename T>
406 GPUd() void getSderivativesOverParsAtU(const KnotType& knotL, DataT u, T& dSdSl, T& dSdDl, T& dSdSr, T& dSdDr) const
407 {
410
411 if (u < (DataT)0) {
412 u = (DataT)0;
413 }
414 if (u > (DataT)Container::getUmax()) {
415 u = (DataT)Container::getUmax();
416 }
417
418 u = u - knotL.u;
419 T v = u * T(knotL.Li); // scaled u
420 T vm1 = v - T(1.);
421 T a = u * vm1;
422 T v2 = v * v;
423 dSdSr = v2 * (T(3.) - v - v);
424 dSdSl = T(1.) - dSdSr;
425 dSdDl = vm1 * a;
426 dSdDr = v * a;
427 // S(u) = dSdSl * Sl + dSdSr * Sr + dSdDl * Dl + dSdDr * Dr;
428 }
429
430 template <typename T>
431 GPUd() void getSDderivativesOverParsAtU(const KnotType& knotL, DataT u, T& dSdSl, T& dSdDl, T& dSdSr, T& dSdDr, T& dDdSl, T& dDdDl, T& dDdSr, T& dDdDr) const
432 {
435
436 if (u < (DataT)0) {
437 u = (DataT)0;
438 }
439 if (u > (DataT)Container::getUmax()) {
440 u = (DataT)Container::getUmax();
441 }
442
443 u = u - knotL.u;
444 T v = u * T(knotL.Li); // scaled u
445 T vm1 = v - T(1.);
446 T a = u * vm1;
447 T v2 = v * v;
448 dSdSr = v2 * (T(3.) - v - v);
449 dSdSl = T(1.) - dSdSr;
450 dSdDl = vm1 * a;
451 dSdDr = v * a;
452
453 T dv = T(knotL.Li);
454 dDdSr = T(6.) * v * (T(1.) - v) * dv;
455 dDdSl = -dDdSr;
456 dDdDl = vm1 * (v + v + vm1);
457 dDdDr = v * (v + vm1 + vm1);
458 // S(u) = dSdSl * Sl + dSdSr * Sr + dSdDl * Dl + dSdDr * Dr;
459 // D(u) = dS(u)/du = dDdSl * Sl + dDdSr * Sr + dDdDl * Dl + dDdDr * Dr;
460 }
461};
462
467template <typename DataT, int32_t YdimT, class FlatBase>
469{
471
472 public:
473#if !defined(GPUCA_GPUCODE)
476 {
477 if constexpr (!std::is_same_v<FlatBase, NoFlatObject>) {
478 recreate(2);
479 }
480 }
481
483 Spline1DSpec(int32_t numberOfKnots) : ParentSpec() { recreate(numberOfKnots); }
484
486 Spline1DSpec(int32_t numberOfKnots, const int32_t knotU[]) : ParentSpec() { recreate(numberOfKnots, knotU); }
487
489 Spline1DSpec(const Spline1DSpec& v) : ParentSpec() { ParentSpec::cloneFromObject(v, nullptr); }
490
492 void recreate(int32_t numberOfKnots) { ParentSpec::recreate(YdimT, numberOfKnots); }
493
495 void recreate(int32_t numberOfKnots, const int32_t knotU[]) { ParentSpec::recreate(YdimT, numberOfKnots, knotU); }
496#endif
497
499 GPUd() constexpr int32_t getYdimensions() const { return YdimT; }
500
502 GPUd() constexpr size_t getParameterAlignmentBytes() const
503 {
504 size_t s = 2 * sizeof(DataT) * YdimT;
505 return (s < 16) ? s : 16;
506 }
507
509 GPUd() int32_t getNumberOfParameters() const { return (2 * YdimT) * this->getNumberOfKnots(); }
510
512 GPUd() size_t getSizeOfParameters() const { return (sizeof(DataT) * 2 * YdimT) * this->getNumberOfKnots(); }
513
515
517 template <SafetyLevel SafeT = SafetyLevel::kSafe>
518 GPUd() void interpolateAtU(GPUgeneric() const DataT Parameters[], DataT u, GPUgeneric() DataT S[/*nYdim*/]) const
519 {
520 ParentSpec::template interpolateAtU<SafeT>(YdimT, Parameters, u, S);
521 }
522
525 template <typename T>
526 GPUd() void interpolateAtU(const typename ParentSpec::KnotType& knotL,
527 GPUgeneric() const T Sl[/*mYdim*/], GPUgeneric() const T Dl[/*mYdim*/],
528 GPUgeneric() const T Sr[/*mYdim*/], GPUgeneric() const T Dr[/*mYdim*/],
529 DataT u, GPUgeneric() T S[/*mYdim*/]) const
530 {
531 ParentSpec::interpolateAtU(YdimT, knotL, Sl, Dl, Sr, Dr, u, S);
532 }
533};
534
539template <typename DataT, int32_t YdimT, class FlatBase>
541{
544
545 public:
546#if !defined(GPUCA_GPUCODE)
549 {
550 if constexpr (!std::is_same_v<FlatBase, NoFlatObject>) {
551 ParentSpec::recreate(0, 2);
552 }
553 }
554
556 Spline1DSpec(int32_t nYdim, int32_t numberOfKnots) : ParentSpec()
557 {
558 ParentSpec::recreate(nYdim, numberOfKnots);
559 }
560
562 Spline1DSpec(int32_t nYdim, int32_t numberOfKnots, const int32_t knotU[]) : ParentSpec()
563 {
564 ParentSpec::recreate(nYdim, numberOfKnots, knotU);
565 }
566
569 {
570 Container::cloneFromObject(v, nullptr);
571 }
572
574 void recreate(int32_t nYdim, int32_t numberOfKnots) { ParentSpec::recreate(nYdim, numberOfKnots); }
575
577 void recreate(int32_t nYdim, int32_t numberOfKnots, const int32_t knotU[]) { ParentSpec::recreate(nYdim, numberOfKnots, knotU); }
578#endif
579};
580
584template <typename DataT, class FlatBase>
586{
587 using ParentSpec = Spline1DSpec<DataT, 1, SplineUtil::getSpec(999), FlatBase>;
588
589 public:
591 GPUd() DataT interpolate(DataT x) const
592 {
593 DataT S = 0;
594 ParentSpec::interpolate(x, &S);
595 return S;
596 }
597};
598
599} // namespace o2::gpu
600
601#endif
Definition of FlatObject class.
int32_t i
#define GPUgeneric()
GPUd() int32_t getNumberOfParameters() const
Number of parameters.
GPUd() DataT convXtoU(DataT x) const
_______________ Technical stuff ________________________
GPUd() size_t getSizeOfParameters() const
Size of the parameter array in bytes.
GPUd() DataT getXmin() const
Get Xmin.
GPUd() int32_t getUmax() const
_______________ Getters ________________________
DataT mXtoUscale
a scaling factor to convert X to U
int32_t mYdim
_____________ Data members ____________
GPUd() static const expr int32_t getVersion()
_____________ Version control __________________________
Spline1DContainerBase(const Spline1DContainerBase &)=delete
Disable all other constructors.
~Spline1DContainerBase()=default
Destructor.
GPUd() DataT convUtoX(DataT u) const
Convert U coordinate to X.
GPUd() int32_t getNumberOfKnots() const
Get a number of knots.
DataT mXmin
X of the first knot.
GPUd() size_t getParameterAlignmentBytes() const
Get minimal required alignment for the spline parameters.
int32_t mNumberOfKnots
n knots on the grid
GPUd() DataT getXmax() const
Get Xmax.
GPUd() DataT getXtoUscale() const
Get XtoUscale.
GPUd() void setXrange(DataT xMin
Set X range.
GPUd() int32_t getYdimensions() const
Get number of Y dimensions.
Spline1DContainerBase()=default
_____________ C++ constructors / destructors __________________________
int32_t mUmax
U of the last knot.
void setFutureBufferAddress(char *futureFlatBufferPtr)
void importFrom(const Spline1DContainerBase< DataT, OtherFlatBase > &src)
Knot< DataT > * getKnots()
Non-const accessor to the knots array.
static Spline1DContainer * readFromFile(TFile &inpf, const char *name)
read a class object from the file
void recreate(int32_t nYdim, int32_t numberOfKnots, const int32_t knotU[])
ClassDefNV(Spline1DContainer, 1)
(transient!!) pointer to F-dependent parameters inside the mFlatBufferPtr array
GPUd() int32_t getLeftKnotIndexForU(DataT u) const
Get index of an associated knot for a given U coordinate. Performs a boundary check.
void setActualBufferAddress(char *actualFlatBufferPtr)
void recreate(int32_t nYdim, int32_t numberOfKnots)
GPUd() const Knot< DataT > *getKnots() const
Get the array of knots.
void approximateFunction(double xMin, double xMax, std::function< void(double x, double f[])> F, int32_t nAuxiliaryDataPoints=4)
approximate a function F with this spline
GPUd() const int32_t *getUtoKnotMap() const
Get a map (integer U -> corresponding knot index)
GPUd() const Knot< DataT > &getKnot(int32_t i) const
Get i-th knot.
int32_t writeToFile(TFile &outf, const char *name)
write a class object to the file
GPUd() const DataT *getParameters() const
Get spline parameters const.
int32_t * getUtoKnotMap()
Non-const accessor to U->knots map.
static int32_t test(const bool draw=0, const bool drawDataPoints=1)
Test the class functionality.
void cloneFromObject(const Spline1DContainer &obj, char *newFlatBufferPtr)
GPUdi() void setActualBufferAddress(char *)
void importFrom(const Spline1DContainerBase< DataT, OtherFlatBase > &src)
Copy schema fields from a spline with a different FlatBase (no pointer members to copy).
GPUd() const int32_t *getUtoKnotMapFromBuffer(const char *flatBuf) const
Get the U->knot-index map from an explicit flat buffer pointer.
GPUdi() void setFutureBufferAddress(char *)
GPUd() const Knot< DataT > *getKnotsFromBuffer(const char *flatBuf) const
GPUd() DataT interpolate(DataT x) const
Simplified interface for 1D: return the interpolated value.
GPUd() void interpolateAtU(int32_t inpYdim
Get interpolated value for an nYdim-dimensional S(u) using spline parameters Parameters.
GPUd() void interpolate(DataT x
_______________ Interpolation math ________________________
GPUd() size_t getSizeOfParameters() const
Size of the parameter array in bytes.
Spline1DSpec(int32_t numberOfKnots, const int32_t knotU[])
Constructor for an irregular spline.
void recreate(int32_t numberOfKnots)
Constructor for a regular spline.
void recreate(int32_t numberOfKnots, const int32_t knotU[])
Constructor for an irregular spline.
GPUd() void interpolateAtU(GPUgeneric() const DataT Parameters[]
_______ Expert tools: interpolation with given nYdim and external Parameters _______
Spline1DSpec()
Default constructor — skips recreate for NoFlatObject (no owned buffer)
GPUd() int32_t getNumberOfParameters() const
Number of parameters.
Spline1DSpec(int32_t numberOfKnots)
Constructor for a regular spline.
GPUd() const expr int32_t getYdimensions() const
Get number of Y dimensions.
Spline1DSpec(const Spline1DSpec &v)
Copy constructor.
GPUd() const expr size_t getParameterAlignmentBytes() const
Get minimal required alignment for the spline parameters.
Spline1DSpec(const Spline1DSpec &v)
Copy constructor.
void recreate(int32_t nYdim, int32_t numberOfKnots)
Constructor for a regular spline.
void recreate(int32_t nYdim, int32_t numberOfKnots, const int32_t knotU[])
Constructor for an irregular spline.
Spline1DSpec()
Default constructor — skips recreate for NoFlatObject (no owned buffer)
Spline1DSpec(int32_t nYdim, int32_t numberOfKnots, const int32_t knotU[])
Constructor for an irregular spline.
Spline1DSpec(int32_t nYdim, int32_t numberOfKnots)
Constructor for a regular spline.
static constexpr int32_t getSpec(int32_t nXdim, int32_t nYdim)
Definition SplineUtil.h:31
GLint GLenum GLint x
Definition glcorearb.h:403
GLenum src
Definition glcorearb.h:1767
const GLdouble * v
Definition glcorearb.h:832
GLuint const GLchar * name
Definition glcorearb.h:781
GLdouble f
Definition glcorearb.h:310
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLboolean GLboolean GLboolean GLboolean a
Definition glcorearb.h:1233
GLfloat GLfloat GLfloat v2
Definition glcorearb.h:813
SafetyLevel
Named enumeration for the safety level used by some methods.
GPUdi() o2
Definition TrackTRD.h:39
GPUd() const expr uint32_t MultivariatePolynomialHelper< Dim
TCanvas * drawDataPoints(TMultiGraph *mg, double min, double max)
GPUd() int32_t getU() const
Get u as an integer.
DataT u
u coordinate of the knot i (an integer number in float format)