Project
Loading...
Searching...
No Matches
SplineHelper.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_SPLINEHELPER_H
18#define ALICEO2_GPUCOMMON_TPCFASTTRANSFORMATION_SPLINEHELPER_H
19
20#include <cmath>
21#include <vector>
22
23#include "GPUCommonDef.h"
24#include "Rtypes.h"
25#include "TString.h"
26#include "Spline1D.h"
27#include "Spline.h"
28#include "Spline1DHelperOld.h"
29#include <functional>
30
31namespace o2::gpu
32{
33
37template <typename DataT>
39{
40 public:
42
45
47 SplineHelper(const SplineHelper&) = delete;
48
51
53 ~SplineHelper() = default;
54
56
59 const double xMin[/* Xdim */], const double xMax[/* Xdim */],
60 std::function<void(const double x[/* Xdim */], double f[/* Fdim */])> F,
61 const int32_t nAxiliaryDataPoints[/* Xdim */] = nullptr);
62
64
66 int32_t setSpline(const SplineContainer<DataT>& spline, const int32_t nAxiliaryPoints[/* Xdim */]);
67
70 DataT* Fparameters, const double xMin[/* mXdimensions */], const double xMax[/* mXdimensions */],
71 std::function<void(const double x[/* mXdimensions */], double f[/* mFdimensions */])> F) const;
72
75 DataT* Fparameters, const double xMin[/* mXdimensions */], const double xMax[/* mXdimensions */],
76 std::function<void(const std::vector<double> x[/* mXdimensions */], double f[/*mFdimensions*/])> F,
77 uint32_t batchsize) const;
78
81 DataT* Fparameters, const double DataPointF[/*getNumberOfDataPoints() x nFdim*/]) const;
82
83 int32_t getNumberOfDataPoints(int32_t dimX) const { return mHelpers[dimX].getNumberOfDataPoints(); }
84
85 int32_t getNumberOfDataPoints() const { return mNumberOfDataPoints; }
86
87 const Spline1DHelperOld<DataT>& getHelper(int32_t dimX) const { return mHelpers[dimX]; }
88
90
92 const char* getLastError() const { return mError.Data(); }
93
94#if !defined(GPUCA_GPUCODE) && !defined(GPUCA_STANDALONE)
96 static int32_t test(const bool draw = 0, const bool drawDataPoints = 1);
97#endif
98
99 static int32_t arraytopoints(int32_t point, int32_t result[], const int32_t numbers[], int32_t dim);
100
101 static int32_t pointstoarray(const int32_t indices[], const int32_t numbers[], int32_t dim);
102
103 private:
105 int32_t storeError(Int_t code, const char* msg);
106
107 TString mError = "";
108 int32_t mXdimensions;
109 int32_t mFdimensions;
110 int32_t mNumberOfParameters;
111 int32_t mNumberOfDataPoints;
112 std::vector<Spline1DHelperOld<DataT>> mHelpers;
113};
114
115template <typename DataT>
118 const double xMin[/* Xdim */], const double xMax[/* Xdim */],
119 std::function<void(const double x[/* Xdim */], double f[/* Fdim */])> F,
120 const int32_t nAxiliaryDataPoints[/* Xdim */])
121{
123 setSpline(spline, nAxiliaryDataPoints);
124 approximateFunction(spline.getParameters(), xMin, xMax, F);
125 DataT xxMin[spline.getXdimensions()];
126 DataT xxMax[spline.getXdimensions()];
127 for (int32_t i = 0; i < spline.getXdimensions(); i++) {
128 xxMin[i] = xMin[i];
129 xxMax[i] = xMax[i];
130 }
131 spline.setXrange(xxMin, xxMax);
132}
133
134template <typename DataT>
136 const SplineContainer<DataT>& spline, const int32_t nAxiliaryPoints[/* Xdim */])
137{
138 // Prepare creation of an irregular spline
139 // The should be at least one (better, two) axiliary measurements on each segnment between two knots and at least 2*nKnots measurements in total
140 // Returns 0 when the spline can not be constructed with the given nAxiliaryPoints
141
142 int32_t ret = 0;
143 mXdimensions = spline.getXdimensions();
144 mFdimensions = spline.getYdimensions();
145 mNumberOfParameters = spline.getNumberOfParameters();
146 mNumberOfDataPoints = 1;
147 mHelpers.clear();
148 mHelpers.resize(mXdimensions);
149 for (int32_t i = 0; i < mXdimensions; i++) {
150 int32_t np = (nAxiliaryPoints != nullptr) ? nAxiliaryPoints[i] : 4;
151 if (mHelpers[i].setSpline(spline.getGrid(i), mFdimensions, np) != 0) {
152 ret = storeError(-2, "SplineHelper::setSpline: error by setting an axis");
153 }
154 mNumberOfDataPoints *= mHelpers[i].getNumberOfDataPoints();
155 }
156
157 return ret;
158}
159
160} // namespace o2::gpu
161
162#endif
int32_t i
Definition of Spline1DHelperOld class.
Definition of Spline1D class.
Definition of Spline class.
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 pointstoarray(const int32_t indices[], const int32_t numbers[], int32_t dim)
SplineHelper()
_____________ Constructors / destructors __________________________
int32_t getNumberOfDataPoints(int32_t dimX) const
int32_t getNumberOfDataPoints() const
static int32_t arraytopoints(int32_t point, int32_t result[], const int32_t numbers[], int32_t dim)
void approximateFunctionBatch(DataT *Fparameters, const double xMin[], const double xMax[], std::function< void(const std::vector< double > x[], double f[])> F, uint32_t batchsize) const
approximate std::function, output in Fparameters. F calculates values for a batch of points.
int32_t setSpline(const SplineContainer< DataT > &spline, const int32_t nAxiliaryPoints[])
_______________ Interface for a step-wise construction of the best-fit spline _______________________...
SplineHelper & operator=(const SplineHelper &)=delete
Assignment operator: disabled.
const char * getLastError() const
_______________ Utilities ________________________
~SplineHelper()=default
Destructor.
const Spline1DHelperOld< DataT > & getHelper(int32_t dimX) const
SplineHelper(const SplineHelper &)=delete
Copy constructor: disabled.
GLint GLenum GLint x
Definition glcorearb.h:403
GLuint64EXT * result
Definition glcorearb.h:5662
GLdouble f
Definition glcorearb.h:310
GLsizei GLenum const void * indices
Definition glcorearb.h:400
FIXME: do not use data model tables.
TCanvas * drawDataPoints(TMultiGraph *mg, double min, double max)
uint64_t const void const *restrict const msg
Definition x9.h:153