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
32{
33namespace gpu
34{
35
39template <typename DataT>
41{
42 public:
44
47
49 SplineHelper(const SplineHelper&) = delete;
50
53
55 ~SplineHelper() = default;
56
58
61 const double xMin[/* Xdim */], const double xMax[/* Xdim */],
62 std::function<void(const double x[/* Xdim */], double f[/* Fdim */])> F,
63 const int32_t nAxiliaryDataPoints[/* Xdim */] = nullptr);
64
66
68 int32_t setSpline(const SplineContainer<DataT>& spline, const int32_t nAxiliaryPoints[/* Xdim */]);
69
72 DataT* Fparameters, const double xMin[/* mXdimensions */], const double xMax[/* mXdimensions */],
73 std::function<void(const double x[/* mXdimensions */], double f[/* mFdimensions */])> F) const;
74
77 DataT* Fparameters, const double xMin[/* mXdimensions */], const double xMax[/* mXdimensions */],
78 std::function<void(const std::vector<double> x[/* mXdimensions */], double f[/*mFdimensions*/])> F,
79 uint32_t batchsize) const;
80
83 DataT* Fparameters, const double DataPointF[/*getNumberOfDataPoints() x nFdim*/]) const;
84
85 int32_t getNumberOfDataPoints(int32_t dimX) const { return mHelpers[dimX].getNumberOfDataPoints(); }
86
87 int32_t getNumberOfDataPoints() const { return mNumberOfDataPoints; }
88
89 const Spline1DHelperOld<DataT>& getHelper(int32_t dimX) const { return mHelpers[dimX]; }
90
92
94 const char* getLastError() const { return mError.Data(); }
95
96#if !defined(GPUCA_GPUCODE) && !defined(GPUCA_STANDALONE)
98 static int32_t test(const bool draw = 0, const bool drawDataPoints = 1);
99#endif
100
101 static int32_t arraytopoints(int32_t point, int32_t result[], const int32_t numbers[], int32_t dim);
102
103 static int32_t pointstoarray(const int32_t indices[], const int32_t numbers[], int32_t dim);
104
105 private:
107 int32_t storeError(Int_t code, const char* msg);
108
109 TString mError = "";
110 int32_t mXdimensions;
111 int32_t mFdimensions;
112 int32_t mNumberOfParameters;
113 int32_t mNumberOfDataPoints;
114 std::vector<Spline1DHelperOld<DataT>> mHelpers;
115};
116
117template <typename DataT>
120 const double xMin[/* Xdim */], const double xMax[/* Xdim */],
121 std::function<void(const double x[/* Xdim */], double f[/* Fdim */])> F,
122 const int32_t nAxiliaryDataPoints[/* Xdim */])
123{
125 setSpline(spline, nAxiliaryDataPoints);
126 approximateFunction(spline.getParameters(), xMin, xMax, F);
127 DataT xxMin[spline.getXdimensions()];
128 DataT xxMax[spline.getXdimensions()];
129 for (int32_t i = 0; i < spline.getXdimensions(); i++) {
130 xxMin[i] = xMin[i];
131 xxMax[i] = xMax[i];
132 }
133 spline.setXrange(xxMin, xxMax);
134}
135
136template <typename DataT>
138 const SplineContainer<DataT>& spline, const int32_t nAxiliaryPoints[/* Xdim */])
139{
140 // Prepare creation of an irregular spline
141 // The should be at least one (better, two) axiliary measurements on each segnment between two knots and at least 2*nKnots measurements in total
142 // Returns 0 when the spline can not be constructed with the given nAxiliaryPoints
143
144 int32_t ret = 0;
145 mXdimensions = spline.getXdimensions();
146 mFdimensions = spline.getYdimensions();
147 mNumberOfParameters = spline.getNumberOfParameters();
148 mNumberOfDataPoints = 1;
149 mHelpers.clear();
150 mHelpers.resize(mXdimensions);
151 for (int32_t i = 0; i < mXdimensions; i++) {
152 int32_t np = (nAxiliaryPoints != nullptr) ? nAxiliaryPoints[i] : 4;
153 if (mHelpers[i].setSpline(spline.getGrid(i), mFdimensions, np) != 0) {
154 ret = storeError(-2, "SplineHelper::setSpline: error by setting an axis");
155 }
156 mNumberOfDataPoints *= mHelpers[i].getNumberOfDataPoints();
157 }
158
159 return ret;
160}
161
162} // namespace gpu
163} // namespace o2
164
165#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
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
FIXME: do not use data model tables.
uint64_t const void const *restrict const msg
Definition x9.h:153