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
32{
33namespace gpu
34{
35
39template <typename DataT>
41{
42 public:
44
47
50
53
55 ~Spline2DHelper() = default;
56
58
62 double x1Min, double x1Max, double x2Min, double x2Max,
63 std::function<void(double x1, double x2, double f[/*spline.getYdimensions()*/])> F,
64 int32_t nAuxiliaryDataPointsU1 = 4, int32_t nAuxiliaryDataPointsU2 = 4);
65
66 // A wrapper around approximateDataPoints()
69 double x1Min, double x1Max, double x2Min, double x2Max,
70 std::function<void(double x1, double x2, double f[/*spline.getYdimensions()*/])> F,
71 int32_t nAuxiliaryDataPointsU1 = 4, int32_t nAuxiliaryDataPointsU2 = 4);
72
75 Spline2DContainer<DataT>& spline, DataT* splineParameters, double x1Min, double x1Max, double x2Min, double x2Max,
76 const double dataPointX1[/*nDataPoints*/], const double dataPointX2[/*nDataPoints*/],
77 const double dataPointF[/*nDataPoints x spline.getYdimensions*/], int32_t nDataPoints);
78
80
82 int32_t setSpline(const Spline2DContainer<DataT>& spline, int32_t nAuxiliaryPointsU1, int32_t nAuxiliaryPointsU2);
83
86 DataT* Fparameters, double x1Min, double x1Max, double x2Min, double x2Max,
87 std::function<void(double x1, double x2, double f[/*mFdimensions*/])> F) const;
88
91 DataT* Fparameters, double x1Min, double x1Max, double x2Min, double x2Max,
92 std::function<void(const std::vector<double>& x1, const std::vector<double>& x2, std::vector<double> f[/*mFdimensions*/])> F,
93 uint32_t batchsize) const;
94
97 DataT* Fparameters, const double DataPointF[/*getNumberOfDataPoints() x nFdim*/]) const;
98
99 int32_t getNumberOfDataPointsU1() const { return mHelperU1.getNumberOfDataPoints(); }
100
101 int32_t getNumberOfDataPointsU2() const { return mHelperU2.getNumberOfDataPoints(); }
102
104
105 const Spline1DHelperOld<DataT>& getHelperU1() const { return mHelperU1; }
106 const Spline1DHelperOld<DataT>& getHelperU2() const { return mHelperU2; }
107
109
111 const char* getLastError() const { return mError.c_str(); }
112
113#if !defined(GPUCA_GPUCODE) && !defined(GPUCA_STANDALONE) // code invisible on GPU and in the standalone compilation
115 static int32_t test(const bool draw = 0, const bool drawDataPoints = 1);
116#endif
117
118 private:
119 void setGrid(Spline2DContainer<DataT>& spline, double x1Min, double x1Max, double x2Min, double x2Max);
120 void getScoefficients(int32_t iu, int32_t iv, double u, double v,
121 double c[16], int32_t indices[16]);
122
124 int32_t storeError(int32_t code, const char* msg);
125
126 std::string mError = "";
127 int32_t mFdimensions;
128 Spline1DHelperOld<DataT> mHelperU1;
129 Spline1DHelperOld<DataT> mHelperU2;
130 Spline1D<double, 0> fGridU;
131 Spline1D<double, 0> fGridV;
132
133 ClassDefNV(Spline2DHelper, 0);
134};
135
136template <typename DataT>
139 double x1Min, double x1Max, double x2Min, double x2Max,
140 std::function<void(double x1, double x2, double f[/*spline.getYdimensions()*/])> F,
141 int32_t nAuxiliaryDataPointsU1, int32_t nAuxiliaryDataPointsU2)
142{
144 setSpline(spline, nAuxiliaryDataPointsU1, nAuxiliaryDataPointsU2);
145 approximateFunction(spline.getParameters(), x1Min, x1Max, x2Min, x2Max, F);
146 spline.setXrange(x1Min, x1Max, x2Min, x2Max);
147}
148
149template <typename DataT>
151 const Spline2DContainer<DataT>& spline, int32_t nAuxiliaryPointsU, int32_t nAuxiliaryPointsV)
152{
153 // Prepare creation of 2D irregular spline
154 // The should be at least one (better, two) Auxiliary measurements on each segnment between two knots and at least 2*nKnots measurements in total
155 // Returns 0 when the spline can not be constructed with the given nAuxiliaryPoints
156
157 int32_t ret = 0;
158 mFdimensions = spline.getYdimensions();
159 if (mHelperU1.setSpline(spline.getGridX1(), mFdimensions, nAuxiliaryPointsU) != 0) {
160 ret = storeError(-2, "Spline2DHelper::setSpline2D: error by setting U axis");
161 }
162 if (mHelperU2.setSpline(spline.getGridX2(), mFdimensions, nAuxiliaryPointsV) != 0) {
163 ret = storeError(-3, "Spline2DHelper::setSpline2D: error by setting V axis");
164 }
165 return ret;
166}
167
168} // namespace gpu
169} // namespace o2
170
171#endif
uint32_t c
Definition RawData.h:2
Definition of Spline1DHelperOld class.
Definition of Spline1D class.
Definition of Spline2D class.
mGridX2 setXrange(x2Min, x2Max)
int32_t setSpline(const Spline2DContainer< DataT > &spline, int32_t nAuxiliaryPointsU1, int32_t nAuxiliaryPointsU2)
_______________ Interface for a step-wise construction of the best-fit spline _______________________...
const Spline1DHelperOld< DataT > & getHelperU2() const
const char * getLastError() const
_______________ Utilities ________________________
const Spline1DHelperOld< DataT > & getHelperU1() const
void approximateFunction(Spline2DContainer< DataT > &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 ________________________
int32_t getNumberOfDataPoints() const
Spline2DHelper(const Spline2DHelper &)=delete
Copy constructor: disabled.
Spline2DHelper & operator=(const Spline2DHelper &)=delete
Assignment operator: disabled.
void approximateFunctionViaDataPoints(Spline2DContainer< DataT > &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 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.
int32_t getNumberOfDataPointsU1() const
int32_t getNumberOfDataPointsU2() const
~Spline2DHelper()=default
Destructor.
void approximateDataPoints(Spline2DContainer< DataT > &spline, DataT *splineParameters, double x1Min, double x1Max, double x2Min, double x2Max, const double dataPointX1[], const double dataPointX2[], const double dataPointF[], int32_t nDataPoints)
Create best-fit spline parameters for a given set of data points.
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
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
uint64_t const void const *restrict const msg
Definition x9.h:153