Project
Loading...
Searching...
No Matches
Spline2DHelper.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_Spline2DHelper_H
18#define ALICEO2_GPUCOMMON_TPCFASTTRANSFORMATION_Spline2DHelper_H
19
20#include <cmath>
21#include <vector>
22
23#include "GPUCommonDef.h"
24#include "GPUCommonRtypes.h"
25#include "Spline1D.h"
26#include "Spline2D.h"
27#include "Spline1DHelperOld.h"
28#include <functional>
29#include <string>
30
31namespace o2::gpu
32{
33
37template <typename DataT>
39{
40 public:
42
45
48
51
53 ~Spline2DHelper() = default;
54
56
60 double x1Min, double x1Max, double x2Min, double x2Max,
61 std::function<void(double x1, double x2, double f[/*spline.getYdimensions()*/])> F,
62 int32_t nAuxiliaryDataPointsU1 = 4, int32_t nAuxiliaryDataPointsU2 = 4);
63
64 // A wrapper around approximateDataPoints()
67 double x1Min, double x1Max, double x2Min, double x2Max,
68 std::function<void(double x1, double x2, double f[/*spline.getYdimensions()*/])> F,
69 int32_t nAuxiliaryDataPointsU1 = 4, int32_t nAuxiliaryDataPointsU2 = 4);
70
73 Spline2DContainerBase<DataT, FlatObject>& spline, DataT* splineParameters, double x1Min, double x1Max, double x2Min, double x2Max,
74 const double dataPointX1[/*nDataPoints*/], const double dataPointX2[/*nDataPoints*/],
75 const double dataPointF[/*nDataPoints x spline.getYdimensions*/], const double dataPointWeight[/*nDataPoints*/], int32_t nDataPoints);
76
78
80 int32_t setSpline(const Spline2DContainerBase<DataT, FlatObject>& spline, int32_t nAuxiliaryPointsU1, int32_t nAuxiliaryPointsU2);
81
84 DataT* Fparameters, double x1Min, double x1Max, double x2Min, double x2Max,
85 std::function<void(double x1, double x2, double f[/*mFdimensions*/])> F) const;
86
89 DataT* Fparameters, double x1Min, double x1Max, double x2Min, double x2Max,
90 std::function<void(const std::vector<double>& x1, const std::vector<double>& x2, std::vector<double> f[/*mFdimensions*/])> F,
91 uint32_t batchsize) const;
92
95 DataT* Fparameters, const double DataPointF[/*getNumberOfDataPoints() x nFdim*/]) const;
96
97 int32_t getNumberOfDataPointsU1() const { return mHelperU1.getNumberOfDataPoints(); }
98
99 int32_t getNumberOfDataPointsU2() const { return mHelperU2.getNumberOfDataPoints(); }
100
102
103 const Spline1DHelperOld<DataT>& getHelperU1() const { return mHelperU1; }
104 const Spline1DHelperOld<DataT>& getHelperU2() const { return mHelperU2; }
105
107
109 const char* getLastError() const { return mError.c_str(); }
110
111#if !defined(GPUCA_GPUCODE) && !defined(GPUCA_STANDALONE) // code invisible on GPU and in the standalone compilation
113 static int32_t test(const bool draw = 0, const bool drawDataPoints = 1);
114#endif
115
116 private:
117 void setGrid(Spline2DContainerBase<DataT, FlatObject>& spline, double x1Min, double x1Max, double x2Min, double x2Max);
118 void getScoefficients(int32_t iu, int32_t iv, double u, double v,
119 double c[16], int32_t indices[16]);
120
122 int32_t storeError(int32_t code, const char* msg);
123
124 std::string mError = "";
125 int32_t mFdimensions;
126 Spline1DHelperOld<DataT> mHelperU1;
127 Spline1DHelperOld<DataT> mHelperU2;
128 Spline1D<double, 0> fGridU;
129 Spline1D<double, 0> fGridV;
130
131 ClassDefNV(Spline2DHelper, 0);
132};
133
134template <typename DataT>
137 double x1Min, double x1Max, double x2Min, double x2Max,
138 std::function<void(double x1, double x2, double f[/*spline.getYdimensions()*/])> F,
139 int32_t nAuxiliaryDataPointsU1, int32_t nAuxiliaryDataPointsU2)
140{
142 setSpline(spline, nAuxiliaryDataPointsU1, nAuxiliaryDataPointsU2);
143 approximateFunction(spline.getParameters(), x1Min, x1Max, x2Min, x2Max, F);
144 spline.setXrange(x1Min, x1Max, x2Min, x2Max);
145}
146
147template <typename DataT>
149 const Spline2DContainerBase<DataT, FlatObject>& spline, int32_t nAuxiliaryPointsU, int32_t nAuxiliaryPointsV)
150{
151 // Prepare creation of 2D irregular spline
152 // The should be at least one (better, two) Auxiliary measurements on each segnment between two knots and at least 2*nKnots measurements in total
153 // Returns 0 when the spline can not be constructed with the given nAuxiliaryPoints
154
155 int32_t ret = 0;
156 mFdimensions = spline.getYdimensions();
157 if (mHelperU1.setSpline(spline.getGridX1(), mFdimensions, nAuxiliaryPointsU) != 0) {
158 ret = storeError(-2, "Spline2DHelper::setSpline2D: error by setting U axis");
159 }
160 if (mHelperU2.setSpline(spline.getGridX2(), mFdimensions, nAuxiliaryPointsV) != 0) {
161 ret = storeError(-3, "Spline2DHelper::setSpline2D: error by setting V axis");
162 }
163 return ret;
164}
165
166} // namespace o2::gpu
167
168#endif
uint32_t c
Definition RawData.h:2
Definition of Spline1DHelperOld class.
Definition of Spline1D class.
Definition of Spline2D class.
Forward declaration — specializations below select ClassDefNV based on FlatBase.
Definition Spline1D.h:171
const Spline1DHelperOld< DataT > & getHelperU2() const
void approximateFunctionViaDataPoints(Spline2DContainerBase< DataT, FlatObject > &spline, double x1Min, double x1Max, double x2Min, double x2Max, std::function< void(double x1, double x2, double f[])> F, int32_t nAuxiliaryDataPointsU1=4, int32_t nAuxiliaryDataPointsU2=4)
void approximateFunction(Spline2DContainerBase< DataT, FlatObject > &spline, double x1Min, double x1Max, double x2Min, double x2Max, std::function< void(double x1, double x2, double f[])> F, int32_t nAuxiliaryDataPointsU1=4, int32_t nAuxiliaryDataPointsU2=4)
_______________ Main functionality ________________________
const char * getLastError() const
_______________ Utilities ________________________
int32_t setSpline(const Spline2DContainerBase< DataT, FlatObject > &spline, int32_t nAuxiliaryPointsU1, int32_t nAuxiliaryPointsU2)
_______________ Interface for a step-wise construction of the best-fit spline _______________________...
const Spline1DHelperOld< DataT > & getHelperU1() const
int32_t getNumberOfDataPoints() const
Spline2DHelper(const Spline2DHelper &)=delete
Copy constructor: disabled.
Spline2DHelper & operator=(const Spline2DHelper &)=delete
Assignment operator: disabled.
void approximateFunctionBatch(DataT *Fparameters, double x1Min, double x1Max, double x2Min, double x2Max, std::function< void(const std::vector< double > &x1, const std::vector< double > &x2, std::vector< double > f[])> F, uint32_t batchsize) const
approximate std::function, output in Fparameters. F calculates values for a batch of points.
void approximateDataPoints(Spline2DContainerBase< DataT, FlatObject > &spline, DataT *splineParameters, double x1Min, double x1Max, double x2Min, double x2Max, const double dataPointX1[], const double dataPointX2[], const double dataPointF[], const double dataPointWeight[], int32_t nDataPoints)
Create best-fit spline parameters for a given set of data points.
int32_t getNumberOfDataPointsU1() const
int32_t getNumberOfDataPointsU2() const
~Spline2DHelper()=default
Destructor.
Spline2DHelper()
_____________ Constructors / destructors __________________________
const GLdouble * v
Definition glcorearb.h:832
GLuint GLfloat GLfloat GLfloat x1
Definition glcorearb.h:5034
GLdouble f
Definition glcorearb.h:310
GLsizei GLenum const void * indices
Definition glcorearb.h:400
uint64_t const void const *restrict const msg
Definition x9.h:153