Project
Loading...
Searching...
No Matches
SplineSpec.cxx
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#if !defined(GPUCA_GPUCODE) && !defined(GPUCA_STANDALONE) // code invisible on GPU and in the standalone compilation
18#include "Rtypes.h"
19#endif
20
21#include "SplineSpec.h"
22
23#if !defined(GPUCA_GPUCODE)
24#include <iostream>
25#endif
26
27#if !defined(GPUCA_GPUCODE) && !defined(GPUCA_STANDALONE) // code invisible on GPU and in the standalone compilation
28#include "TRandom.h"
29#include "Riostream.h"
30#include "TMath.h"
31#include "SplineHelper.h"
32#include "TCanvas.h"
33#include "TNtuple.h"
34#include "TFile.h"
35#include "GPUCommonMath.h"
36
39
40#endif
41
42using namespace std;
43using namespace o2::gpu;
44
45template <typename DataT>
47{
49 mXdim = 0;
50 mYdim = 0;
51 mNknots = 0;
52 mGrid = nullptr;
53 mParameters = nullptr;
55}
56
57template <typename DataT>
59{
61
62 FlatObject::setActualBufferAddress(actualFlatBufferPtr);
63 mGrid = reinterpret_cast<Spline1D<DataT>*>(mFlatBufferPtr);
64 int32_t offset = sizeof(*mGrid) * mXdim;
65 for (int32_t i = 0; i < mXdim; i++) {
66 offset = alignSize(offset, mGrid[i].getBufferAlignmentBytes());
67 mGrid[i].setActualBufferAddress(mFlatBufferPtr + offset);
68 offset += mGrid[i].getFlatBufferSize();
69 }
70 offset = alignSize(offset, getParameterAlignmentBytes());
71 mParameters = reinterpret_cast<DataT*>(mFlatBufferPtr + offset);
72}
73
74template <typename DataT>
76{
78 mParameters = relocatePointer(mFlatBufferPtr, futureFlatBufferPtr, mParameters);
79 for (int32_t i = 0; i < mXdim; i++) {
80 char* buffer = relocatePointer(mFlatBufferPtr, futureFlatBufferPtr, mGrid[i].getFlatBufferPtr());
81 mGrid[i].setFutureBufferAddress(buffer);
82 }
83 mGrid = relocatePointer(mFlatBufferPtr, futureFlatBufferPtr, mGrid);
84 FlatObject::setFutureBufferAddress(futureFlatBufferPtr);
85}
86
87template <typename DataT>
89{
90 printf(" Irregular Spline %dD->%dD: \n", mXdim, mYdim);
91 for (int32_t i = 0; i < mXdim; i++) {
92 printf(" grid X%d: \n", i);
93 mGrid[i].print();
94 }
95}
96
97#if !defined(GPUCA_GPUCODE)
98
99template <typename DataT>
101{
103
104 const char* oldFlatBufferPtr = obj.mFlatBufferPtr;
105 FlatObject::cloneFromObject(obj, newFlatBufferPtr);
106 mXdim = obj.mXdim;
107 mYdim = obj.mYdim;
108 mNknots = obj.mNknots;
109
110 Spline1D<DataT>* newGrid = FlatObject::relocatePointer(oldFlatBufferPtr, mFlatBufferPtr, obj.mGrid);
111 for (int32_t i = 0; i < mXdim; i++) {
112 char* buffer = FlatObject::relocatePointer(oldFlatBufferPtr, mFlatBufferPtr, obj.mGrid[i].getFlatBufferPtr());
113 newGrid[i].cloneFromObject(obj.mGrid[i], buffer);
114 }
115 mGrid = newGrid;
116 mParameters = FlatObject::relocatePointer(oldFlatBufferPtr, mFlatBufferPtr, obj.mParameters);
117}
118
119template <typename DataT>
120void SplineContainer<DataT>::moveBufferTo(char* newFlatBufferPtr)
121{
123 char* oldFlatBufferPtr = mFlatBufferPtr;
124 FlatObject::moveBufferTo(newFlatBufferPtr);
125 char* currFlatBufferPtr = mFlatBufferPtr;
126 mFlatBufferPtr = oldFlatBufferPtr;
127 setActualBufferAddress(currFlatBufferPtr);
128}
129
130template <typename DataT>
132 int32_t nXdim, int32_t nYdim, const int32_t numberOfKnots[/* nXdim */], const int32_t* const knots[/* nXdim */])
133{
135
136 mXdim = nXdim;
137 mYdim = nYdim;
139
140 Spline1D<DataT> vGrids[mXdim];
141
142 mNknots = 1;
143 for (int32_t i = 0; i < mXdim; i++) {
144 if (knots) {
145 vGrids[i].recreate(0, numberOfKnots[i], knots[i]);
146 } else if (numberOfKnots) {
147 vGrids[i].recreate(0, numberOfKnots[i]);
148 } else {
149 vGrids[i].recreate(0, 2);
150 }
151 mNknots *= vGrids[i].getNumberOfKnots();
152 }
153
154 int32_t offset = sizeof(Spline1D<DataT>) * mXdim;
155
156 for (int32_t i = 0; i < mXdim; i++) {
157 offset = alignSize(offset, vGrids[i].getBufferAlignmentBytes());
158 offset += vGrids[i].getFlatBufferSize();
159 }
160
161 offset = alignSize(offset, getParameterAlignmentBytes());
162 offset += getSizeOfParameters();
163
165
166 mGrid = reinterpret_cast<Spline1D<DataT>*>(mFlatBufferPtr);
167
168 offset = sizeof(Spline1D<DataT>) * mXdim;
169
170 for (int32_t i = 0; i < mXdim; i++) {
171 new (&mGrid[i]) Spline1D<DataT>; // constructor
172 offset = alignSize(offset, mGrid[i].getBufferAlignmentBytes());
173 mGrid[i].cloneFromObject(vGrids[i], mFlatBufferPtr + offset);
174 offset += mGrid[i].getFlatBufferSize();
175 }
176
177 offset = alignSize(offset, getParameterAlignmentBytes());
178 mParameters = reinterpret_cast<DataT*>(mFlatBufferPtr + offset);
179 offset += getSizeOfParameters();
180
181 for (int32_t i = 0; i < getNumberOfParameters(); i++) {
182 mParameters[i] = 0;
183 }
184}
185
186template <typename DataT>
188 int32_t nXdim, int32_t nYdim, const int32_t numberOfKnots[/* nXdim */])
189{
191 recreate(nXdim, nYdim, numberOfKnots, nullptr);
192}
193
194#endif // GPUCA_GPUCODE
195
196#if !defined(GPUCA_GPUCODE) && !defined(GPUCA_STANDALONE) // code invisible on GPU and in the standalone compilation
197
198template <typename DataT>
200 approximateFunction(const double xMin[/* mXdim */], const double xMax[/* mXdim */],
201 std::function<void(const double x[/* mXdim */], double f[/*mYdim*/])> F,
202 const int32_t nAuxiliaryDataPoints[/* mXdim */])
203{
205 SplineHelper<DataT> helper;
206 helper.approximateFunction(*reinterpret_cast<Spline<DataT>*>(this), xMin, xMax, F, nAuxiliaryDataPoints);
207}
208
209template <typename DataT>
210int32_t SplineContainer<DataT>::writeToFile(TFile& outf, const char* name)
211{
213 return FlatObject::writeToFile(*this, outf, name);
214}
215
216template <typename DataT>
218 TFile& inpf, const char* name)
219{
221 return FlatObject::readFromFile<SplineContainer<DataT>>(inpf, name);
222}
223
224template <typename DataT>
225int32_t SplineContainer<DataT>::test(const bool draw, const bool drawDataPoints)
226{
227 return SplineHelper<DataT>::test(draw, drawDataPoints);
228}
229
230#endif // GPUCA_GPUCODE && !GPUCA_STANDALONE
231
int32_t i
Definition of SplineHelper class.
templateClassImp(o2::gpu::SplineContainer)
Definition of SplineSpec class.
void setFutureBufferAddress(char *futureFlatBufferPtr)
Definition FlatObject.h:557
void destroy()
_______________ Utilities _______________________________________________
Definition FlatObject.h:349
static T * relocatePointer(const char *oldBase, char *newBase, const T *ptr)
Relocates a pointer inside a buffer to the new buffer address.
Definition FlatObject.h:285
void setActualBufferAddress(char *actualFlatBufferPtr)
_____________ Methods for moving the class with its external buffer to another location _____________...
Definition FlatObject.h:547
static int32_t writeToFile(T &obj, TFile &outf, const char *name)
write a child class object to the file
Definition FlatObject.h:480
void startConstruction()
_____________ Construction _________
Definition FlatObject.h:342
void moveBufferTo(char *newBufferPtr)
Definition FlatObject.h:396
void finishConstruction(int32_t flatBufferSize)
Definition FlatObject.h:358
void cloneFromObject(const FlatObject &obj, char *newFlatBufferPtr)
Definition FlatObject.h:373
int32_t mYdim
dimentionality of Y
Definition SplineSpec.h:186
int32_t mNknots
number of spline knots
Definition SplineSpec.h:187
int32_t writeToFile(TFile &outf, const char *name)
_______________ IO ________________________
void cloneFromObject(const SplineContainer &obj, char *newFlatBufferPtr)
static SplineContainer * readFromFile(TFile &inpf, const char *name)
read a class object from the file
void moveBufferTo(char *newBufferPtr)
void recreate(int32_t nXdim, int32_t nYdim, const int32_t nKnots[])
Constructor for a regular spline.
Spline1D< DataT > * mGrid
Definition SplineSpec.h:189
void setActualBufferAddress(char *actualFlatBufferPtr)
void setFutureBufferAddress(char *futureFlatBufferPtr)
int32_t mXdim
_____________ Data members ____________
Definition SplineSpec.h:185
DataT * mParameters
(transient!!) mXdim grids
Definition SplineSpec.h:190
void print() const
Print method.
void approximateFunction(const double xMin[], const double xMax[], std::function< void(const double x[], double f[])> F, const int32_t nAuxiliaryDataPoints[]=nullptr)
_______________ Construction interface ________________________
static int32_t test(const bool draw=0, const bool drawDataPoints=1)
_______________ Test tools _______________
void approximateFunction(SplineContainer< DataT > &spline, const double xMin[], const double xMax[], std::function< void(const double x[], double f[])> F, const int32_t nAxiliaryDataPoints[]=nullptr)
_______________ Main functionality ________________________
static int32_t test(const bool draw=0, const bool drawDataPoints=1)
Test the Spline class functionality.
GLint GLenum GLint x
Definition glcorearb.h:403
GLuint buffer
Definition glcorearb.h:655
GLuint const GLchar * name
Definition glcorearb.h:781
GLdouble f
Definition glcorearb.h:310
GLintptr offset
Definition glcorearb.h:660
Defining DataPointCompositeObject explicitly as copiable.