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_STANDALONE) // code invisible in the standalone compilation
18#include "Rtypes.h"
19#endif
20
21#include "SplineSpec.h"
22
23#include <iostream>
24
25#if !defined(GPUCA_STANDALONE) // code invisible in the standalone compilation
26#include "TRandom.h"
27#include "Riostream.h"
28#include "TMath.h"
29#include "SplineHelper.h"
30#include "TCanvas.h"
31#include "TNtuple.h"
32#include "TFile.h"
33#include "GPUCommonMath.h"
34
37
38#endif
39
40using namespace std;
41using namespace o2::gpu;
42
43template <typename DataT>
45{
47 mXdim = 0;
48 mYdim = 0;
49 mNknots = 0;
50 mGrid = nullptr;
51 mParameters = nullptr;
53}
54
55template <typename DataT>
57{
59
60 FlatObject::setActualBufferAddress(actualFlatBufferPtr);
61 mGrid = reinterpret_cast<Spline1D<DataT>*>(mFlatBufferPtr);
62 int32_t offset = sizeof(*mGrid) * mXdim;
63 for (int32_t i = 0; i < mXdim; i++) {
64 offset = alignSize(offset, mGrid[i].getBufferAlignmentBytes());
65 mGrid[i].setActualBufferAddress(mFlatBufferPtr + offset);
66 offset += mGrid[i].getFlatBufferSize();
67 }
68 offset = alignSize(offset, getParameterAlignmentBytes());
69 mParameters = reinterpret_cast<DataT*>(mFlatBufferPtr + offset);
70}
71
72template <typename DataT>
74{
76 mParameters = relocatePointer(mFlatBufferPtr, futureFlatBufferPtr, mParameters);
77 for (int32_t i = 0; i < mXdim; i++) {
78 char* buffer = relocatePointer(mFlatBufferPtr, futureFlatBufferPtr, mGrid[i].getFlatBufferPtr());
79 mGrid[i].setFutureBufferAddress(buffer);
80 }
81 mGrid = relocatePointer(mFlatBufferPtr, futureFlatBufferPtr, mGrid);
82 FlatObject::setFutureBufferAddress(futureFlatBufferPtr);
83}
84
85template <typename DataT>
87{
88 printf(" Irregular Spline %dD->%dD: \n", mXdim, mYdim);
89 for (int32_t i = 0; i < mXdim; i++) {
90 printf(" grid X%d: \n", i);
91 mGrid[i].print();
92 }
93}
94
95template <typename DataT>
97{
99
100 const char* oldFlatBufferPtr = obj.mFlatBufferPtr;
101 FlatObject::cloneFromObject(obj, newFlatBufferPtr);
102 mXdim = obj.mXdim;
103 mYdim = obj.mYdim;
104 mNknots = obj.mNknots;
105
106 Spline1D<DataT>* newGrid = FlatObject::relocatePointer(oldFlatBufferPtr, mFlatBufferPtr, obj.mGrid);
107 for (int32_t i = 0; i < mXdim; i++) {
108 char* buffer = FlatObject::relocatePointer(oldFlatBufferPtr, mFlatBufferPtr, obj.mGrid[i].getFlatBufferPtr());
109 newGrid[i].cloneFromObject(obj.mGrid[i], buffer);
110 }
111 mGrid = newGrid;
112 mParameters = FlatObject::relocatePointer(oldFlatBufferPtr, mFlatBufferPtr, obj.mParameters);
113}
114
115template <typename DataT>
116void SplineContainer<DataT>::moveBufferTo(char* newFlatBufferPtr)
117{
119 char* oldFlatBufferPtr = mFlatBufferPtr;
120 FlatObject::moveBufferTo(newFlatBufferPtr);
121 char* currFlatBufferPtr = mFlatBufferPtr;
122 mFlatBufferPtr = oldFlatBufferPtr;
123 setActualBufferAddress(currFlatBufferPtr);
124}
125
126template <typename DataT>
128 int32_t nXdim, int32_t nYdim, const int32_t numberOfKnots[/* nXdim */], const int32_t* const knots[/* nXdim */])
129{
131
132 mXdim = nXdim;
133 mYdim = nYdim;
135
136 Spline1D<DataT> vGrids[mXdim];
137
138 mNknots = 1;
139 for (int32_t i = 0; i < mXdim; i++) {
140 if (knots) {
141 vGrids[i].recreate(0, numberOfKnots[i], knots[i]);
142 } else if (numberOfKnots) {
143 vGrids[i].recreate(0, numberOfKnots[i]);
144 } else {
145 vGrids[i].recreate(0, 2);
146 }
147 mNknots *= vGrids[i].getNumberOfKnots();
148 }
149
150 int32_t offset = sizeof(Spline1D<DataT>) * mXdim;
151
152 for (int32_t i = 0; i < mXdim; i++) {
153 offset = alignSize(offset, vGrids[i].getBufferAlignmentBytes());
154 offset += vGrids[i].getFlatBufferSize();
155 }
156
157 offset = alignSize(offset, getParameterAlignmentBytes());
158 offset += getSizeOfParameters();
159
161
162 mGrid = reinterpret_cast<Spline1D<DataT>*>(mFlatBufferPtr);
163
164 offset = sizeof(Spline1D<DataT>) * mXdim;
165
166 for (int32_t i = 0; i < mXdim; i++) {
167 new (&mGrid[i]) Spline1D<DataT>; // constructor
168 offset = alignSize(offset, mGrid[i].getBufferAlignmentBytes());
169 mGrid[i].cloneFromObject(vGrids[i], mFlatBufferPtr + offset);
170 offset += mGrid[i].getFlatBufferSize();
171 }
172
173 offset = alignSize(offset, getParameterAlignmentBytes());
174 mParameters = reinterpret_cast<DataT*>(mFlatBufferPtr + offset);
175 offset += getSizeOfParameters();
176
177 for (int32_t i = 0; i < getNumberOfParameters(); i++) {
178 mParameters[i] = 0;
179 }
180}
181
182template <typename DataT>
184 int32_t nXdim, int32_t nYdim, const int32_t numberOfKnots[/* nXdim */])
185{
187 recreate(nXdim, nYdim, numberOfKnots, nullptr);
188}
189
190#if !defined(GPUCA_STANDALONE) // code invisible in the standalone compilation
191
192template <typename DataT>
194 approximateFunction(const double xMin[/* mXdim */], const double xMax[/* mXdim */],
195 std::function<void(const double x[/* mXdim */], double f[/*mYdim*/])> F,
196 const int32_t nAuxiliaryDataPoints[/* mXdim */])
197{
199 SplineHelper<DataT> helper;
200 helper.approximateFunction(*reinterpret_cast<Spline<DataT>*>(this), xMin, xMax, F, nAuxiliaryDataPoints);
201}
202
203template <typename DataT>
204int32_t SplineContainer<DataT>::writeToFile(TFile& outf, const char* name)
205{
207 return FlatObject::writeToFile(*this, outf, name);
208}
209
210template <typename DataT>
212 TFile& inpf, const char* name)
213{
215 return FlatObject::readFromFile<SplineContainer<DataT>>(inpf, name);
216}
217
218template <typename DataT>
219int32_t SplineContainer<DataT>::test(const bool draw, const bool drawDataPoints)
220{
222}
223
224#endif
225
int32_t i
Definition of SplineHelper class.
templateClassImp(o2::gpu::SplineContainer)
Definition of SplineSpec class.
void setFutureBufferAddress(char *futureFlatBufferPtr)
Definition FlatObject.h:569
void destroy()
_______________ Utilities _______________________________________________
Definition FlatObject.h:361
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:283
void setActualBufferAddress(char *actualFlatBufferPtr)
_____________ Methods for moving the class with its external buffer to another location _____________...
Definition FlatObject.h:559
static int32_t writeToFile(T &obj, TFile &outf, const char *name)
write a child class object to the file
Definition FlatObject.h:492
void startConstruction()
_____________ Construction _________
Definition FlatObject.h:354
void moveBufferTo(char *newBufferPtr)
Definition FlatObject.h:408
void finishConstruction(int32_t flatBufferSize)
Definition FlatObject.h:370
void cloneFromObject(const FlatObject &obj, char *newFlatBufferPtr)
Definition FlatObject.h:385
Forward declaration — specializations below select ClassDefNV based on FlatBase.
Definition Spline1D.h:171
int32_t mYdim
dimentionality of Y
Definition SplineSpec.h:183
int32_t mNknots
number of spline knots
Definition SplineSpec.h:184
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:186
void setActualBufferAddress(char *actualFlatBufferPtr)
void setFutureBufferAddress(char *futureFlatBufferPtr)
int32_t mXdim
_____________ Data members ____________
Definition SplineSpec.h:182
DataT * mParameters
(transient!!) mXdim grids
Definition SplineSpec.h:187
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
TCanvas * drawDataPoints(TMultiGraph *mg, double min, double max)