Skip to content

Commit 09718ee

Browse files
matthias-kleinerdavidrohr
authored andcommitted
make TPCFastTransformPOD fully independent of FlatObject and root
1 parent dbad636 commit 09718ee

17 files changed

+502
-296
lines changed

GPU/TPCFastTransformation/Spline1D.h

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -134,12 +134,14 @@ namespace gpu
134134
/// YdimT = 0 : the number of Y dimensions will be set in the runtime
135135
/// YdimT < 0 : the number of Y dimensions will be set in the runtime, and it will not exceed abs(YdimT)
136136
///
137-
template <typename DataT, int32_t YdimT = 0>
138-
class Spline1D
139-
: public Spline1DSpec<DataT, YdimT, SplineUtil::getSpec(YdimT)>
137+
/// Common implementation (no ClassDefNV — ROOT dictionary is in the FlatObject specialization below)
138+
template <typename DataT, int32_t YdimT, class FlatBase>
139+
class Spline1DBase
140+
: public Spline1DSpec<DataT, YdimT, SplineUtil::getSpec(YdimT), FlatBase>
140141
{
141-
typedef Spline1DContainer<DataT> TVeryBase;
142-
typedef Spline1DSpec<DataT, YdimT, SplineUtil::getSpec(YdimT)> TBase;
142+
protected:
143+
typedef Spline1DContainerBase<DataT, FlatBase> TVeryBase;
144+
typedef Spline1DSpec<DataT, YdimT, SplineUtil::getSpec(YdimT), FlatBase> TBase;
143145

144146
public:
145147
typedef typename TVeryBase::SafetyLevel SafetyLevel;
@@ -148,34 +150,56 @@ class Spline1D
148150
#if !defined(GPUCA_GPUCODE)
149151
using TBase::TBase; // inherit constructors
150152

151-
/// Assignment operator
152-
Spline1D() = default;
153-
Spline1D(const Spline1D& v) : TBase(v)
153+
Spline1DBase() = default;
154+
Spline1DBase(const Spline1DBase& v) : TBase(v)
154155
{
155-
TVeryBase::cloneFromObject(v, nullptr);
156+
static_cast<TVeryBase*>(this)->cloneFromObject(v, nullptr);
156157
}
157-
Spline1D& operator=(const Spline1D& v)
158+
Spline1DBase& operator=(const Spline1DBase& v)
158159
{
159-
TVeryBase::cloneFromObject(v, nullptr);
160+
static_cast<TVeryBase*>(this)->cloneFromObject(v, nullptr);
160161
return *this;
161162
}
162163
#else
163-
/// Disable constructors for the GPU implementation
164-
Spline1D() = delete;
165-
Spline1D(const Spline1D&) = delete;
164+
Spline1DBase() = delete;
165+
Spline1DBase(const Spline1DBase&) = delete;
166166
#endif
167167

168168
#if !defined(GPUCA_GPUCODE) && !defined(GPUCA_STANDALONE)
169-
/// read a class object from the file
170-
static Spline1D* readFromFile(TFile& inpf, const char* name)
169+
static Spline1DBase* readFromFile(TFile& inpf, const char* name)
171170
{
172-
return (Spline1D*)TVeryBase::readFromFile(inpf, name);
171+
return (Spline1DBase*)TVeryBase::readFromFile(inpf, name);
173172
}
174173
#endif
174+
};
175175

176+
/// Forward declaration — specializations below select ClassDefNV based on FlatBase
177+
template <typename DataT, int32_t YdimT = 0, class FlatBase = FlatObject>
178+
class Spline1D;
179+
180+
/// FlatObject specialization — carries ClassDefNV for ROOT I/O
181+
template <typename DataT, int32_t YdimT>
182+
class Spline1D<DataT, YdimT, FlatObject> : public Spline1DBase<DataT, YdimT, FlatObject>
183+
{
184+
public:
185+
using Spline1DBase<DataT, YdimT, FlatObject>::Spline1DBase;
186+
#if !defined(GPUCA_GPUCODE) && !defined(GPUCA_STANDALONE)
187+
static Spline1D* readFromFile(TFile& inpf, const char* name)
188+
{
189+
return (Spline1D*)Spline1DContainerBase<DataT, FlatObject>::readFromFile(inpf, name);
190+
}
191+
#endif
176192
ClassDefNV(Spline1D, 0);
177193
};
178194

195+
/// NoFlatObject specialization — no ROOT ClassDef overhead
196+
template <typename DataT, int32_t YdimT>
197+
class Spline1D<DataT, YdimT, NoFlatObject> : public Spline1DBase<DataT, YdimT, NoFlatObject>
198+
{
199+
public:
200+
using Spline1DBase<DataT, YdimT, NoFlatObject>::Spline1DBase;
201+
};
202+
179203
} // namespace gpu
180204
} // namespace o2
181205

GPU/TPCFastTransformation/Spline1DHelper.cxx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ void Spline1DHelper<DataT>::getDDDScoefficients(const typename Spline1D<double>:
133133

134134
template <typename DataT>
135135
void Spline1DHelper<DataT>::approximateDataPoints(
136-
Spline1DContainer<DataT>& spline,
136+
Spline1DContainerBase<DataT, FlatObject>& spline,
137137
double xMin, double xMax,
138138
const double vx[], const double vf[], int32_t nDataPoints)
139139
{
@@ -246,7 +246,7 @@ void Spline1DHelper<DataT>::approximateDataPoints(
246246

247247
template <typename DataT>
248248
void Spline1DHelper<DataT>::approximateDerivatives(
249-
Spline1DContainer<DataT>& spline,
249+
Spline1DContainerBase<DataT, FlatObject>& spline,
250250
const double vx[], const double vf[], int32_t nDataPoints)
251251
{
252252
/// Create best-fit spline parameters for a given input function F
@@ -298,7 +298,7 @@ void Spline1DHelper<DataT>::approximateDerivatives(
298298
}
299299

300300
template <typename DataT>
301-
void Spline1DHelper<DataT>::approximateFunctionClassic(Spline1DContainer<DataT>& spline,
301+
void Spline1DHelper<DataT>::approximateFunctionClassic(Spline1DContainerBase<DataT, FlatObject>& spline,
302302
double xMin, double xMax, std::function<void(double x, double f[/*spline.getFdimensions()*/])> F)
303303
{
304304
/// Create classic spline parameters for a given input function F
@@ -422,7 +422,7 @@ void Spline1DHelper<DataT>::approximateFunctionClassic(Spline1DContainer<DataT>&
422422

423423
template <typename DataT>
424424
void Spline1DHelper<DataT>::makeDataPoints(
425-
Spline1DContainer<DataT>& spline, double xMin, double xMax, std::function<void(double x, double f[/*spline.getFdimensions()*/])> F,
425+
Spline1DContainerBase<DataT, FlatObject>& spline, double xMin, double xMax, std::function<void(double x, double f[/*spline.getFdimensions()*/])> F,
426426
int32_t nAuxiliaryDataPoints, std::vector<double>& vx, std::vector<double>& vf)
427427
{
428428
/// Create best-fit spline parameters for a given input function F
@@ -451,7 +451,7 @@ void Spline1DHelper<DataT>::makeDataPoints(
451451

452452
template <typename DataT>
453453
void Spline1DHelper<DataT>::approximateFunction(
454-
Spline1DContainer<DataT>& spline, double xMin, double xMax, std::function<void(double x, double f[/*spline.getFdimensions()*/])> F,
454+
Spline1DContainerBase<DataT, FlatObject>& spline, double xMin, double xMax, std::function<void(double x, double f[/*spline.getFdimensions()*/])> F,
455455
int32_t nAuxiliaryDataPoints)
456456
{
457457
/// Create best-fit spline parameters for a given input function F
@@ -463,7 +463,7 @@ void Spline1DHelper<DataT>::approximateFunction(
463463

464464
template <typename DataT>
465465
void Spline1DHelper<DataT>::approximateFunctionGradually(
466-
Spline1DContainer<DataT>& spline, double xMin, double xMax, std::function<void(double x, double f[/*spline.getFdimensions()*/])> F,
466+
Spline1DContainerBase<DataT, FlatObject>& spline, double xMin, double xMax, std::function<void(double x, double f[/*spline.getFdimensions()*/])> F,
467467
int32_t nAuxiliaryDataPoints)
468468
{
469469
/// Create best-fit spline parameters for a given input function F
@@ -491,7 +491,7 @@ void Spline1DHelper<DataT>::approximateFunctionGradually(
491491
}
492492

493493
template <typename DataT>
494-
void Spline1DHelper<DataT>::setSpline(const Spline1DContainer<DataT>& spline)
494+
void Spline1DHelper<DataT>::setSpline(const Spline1DContainerBase<DataT, FlatObject>& spline)
495495
{
496496
const int32_t nKnots = spline.getNumberOfKnots();
497497
std::vector<int32_t> knots(nKnots);

GPU/TPCFastTransformation/Spline1DHelper.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,25 +52,25 @@ class Spline1DHelper
5252
/// _______________ Main functionality ________________________
5353

5454
/// Create best-fit spline parameters for a set of data points
55-
void approximateDataPoints(Spline1DContainer<DataT>& spline,
55+
void approximateDataPoints(Spline1DContainerBase<DataT, FlatObject>& spline,
5656
double xMin, double xMax,
5757
const double vx[], const double vf[], int32_t nDataPoints);
5858

5959
/// Create best-fit spline parameters for a function F
6060
void approximateFunction(
61-
Spline1DContainer<DataT>& spline, double xMin, double xMax, std::function<void(double x, double f[/*spline.getFdimensions()*/])> F,
61+
Spline1DContainerBase<DataT, FlatObject>& spline, double xMin, double xMax, std::function<void(double x, double f[/*spline.getFdimensions()*/])> F,
6262
int32_t nAuxiliaryDataPoints = 4);
6363

6464
/// Approximate only derivatives assuming the spline values at knozts are already set
65-
void approximateDerivatives(Spline1DContainer<DataT>& spline,
65+
void approximateDerivatives(Spline1DContainerBase<DataT, FlatObject>& spline,
6666
const double vx[], const double vf[], int32_t nDataPoints);
6767

6868
void approximateFunctionGradually(
69-
Spline1DContainer<DataT>& spline, double xMin, double xMax, std::function<void(double x, double f[/*spline.getFdimensions()*/])> F,
69+
Spline1DContainerBase<DataT, FlatObject>& spline, double xMin, double xMax, std::function<void(double x, double f[/*spline.getFdimensions()*/])> F,
7070
int32_t nAuxiliaryDataPoints);
7171

7272
/// Create classic spline parameters for a given input function F
73-
void approximateFunctionClassic(Spline1DContainer<DataT>& spline,
73+
void approximateFunctionClassic(Spline1DContainerBase<DataT, FlatObject>& spline,
7474
double xMin, double xMax, std::function<void(double x, double f[/*spline.getFdimensions()*/])> F);
7575

7676
/// _______________ Utilities ________________________
@@ -110,9 +110,9 @@ class Spline1DHelper
110110

111111
std::string mError = ""; ///< error string
112112

113-
void setSpline(const Spline1DContainer<DataT>& spline);
113+
void setSpline(const Spline1DContainerBase<DataT, FlatObject>& spline);
114114

115-
void makeDataPoints(Spline1DContainer<DataT>& spline, double xMin, double xMax, std::function<void(double x, double f[/*spline.getFdimensions()*/])> F,
115+
void makeDataPoints(Spline1DContainerBase<DataT, FlatObject>& spline, double xMin, double xMax, std::function<void(double x, double f[/*spline.getFdimensions()*/])> F,
116116
int32_t nAuxiliaryDataPoints, std::vector<double>& vx, std::vector<double>& vf);
117117

118118
/// helpers for the construction of 1D spline

GPU/TPCFastTransformation/Spline1DHelperOld.cxx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ void Spline1DHelperOld<DataT>::getDDDScoefficients(const typename Spline1D<doubl
129129
}
130130

131131
template <typename DataT>
132-
void Spline1DHelperOld<DataT>::approximateFunctionClassic(Spline1DContainer<DataT>& spline,
132+
void Spline1DHelperOld<DataT>::approximateFunctionClassic(Spline1DContainerBase<DataT, FlatObject>& spline,
133133
double xMin, double xMax, std::function<void(double x, double f[/*spline.getFdimensions()*/])> F)
134134
{
135135
/// Create classic spline parameters for a given input function F
@@ -253,7 +253,7 @@ void Spline1DHelperOld<DataT>::approximateFunctionClassic(Spline1DContainer<Data
253253

254254
template <typename DataT>
255255
void Spline1DHelperOld<DataT>::approximateDataPoints(
256-
Spline1DContainer<DataT>& spline,
256+
Spline1DContainerBase<DataT, FlatObject>& spline,
257257
double xMin, double xMax,
258258
double vx[], double vf[], int32_t nDataPoints)
259259
{
@@ -266,7 +266,7 @@ void Spline1DHelperOld<DataT>::approximateDataPoints(
266266

267267
template <typename DataT>
268268
void Spline1DHelperOld<DataT>::approximateFunction(
269-
Spline1DContainer<DataT>& spline, double xMin, double xMax, std::function<void(double x, double f[/*spline.getFdimensions()*/])> F,
269+
Spline1DContainerBase<DataT, FlatObject>& spline, double xMin, double xMax, std::function<void(double x, double f[/*spline.getFdimensions()*/])> F,
270270
int32_t nAuxiliaryDataPoints)
271271
{
272272
/// Create best-fit spline parameters for a given input function F
@@ -277,7 +277,7 @@ void Spline1DHelperOld<DataT>::approximateFunction(
277277

278278
template <typename DataT>
279279
void Spline1DHelperOld<DataT>::approximateFunctionGradually(
280-
Spline1DContainer<DataT>& spline, double xMin, double xMax, std::function<void(double x, double f[/*spline.getFdimensions()*/])> F,
280+
Spline1DContainerBase<DataT, FlatObject>& spline, double xMin, double xMax, std::function<void(double x, double f[/*spline.getFdimensions()*/])> F,
281281
int32_t nAuxiliaryDataPoints)
282282
{
283283
/// Create best-fit spline parameters gradually for a given input function F
@@ -316,7 +316,7 @@ void Spline1DHelperOld<DataT>::approximateFunctionGradually(
316316

317317
template <typename DataT>
318318
int32_t Spline1DHelperOld<DataT>::setSpline(
319-
const Spline1DContainer<DataT>& spline, int32_t nFdimensions, int32_t nAuxiliaryDataPoints)
319+
const Spline1DContainerBase<DataT, FlatObject>& spline, int32_t nFdimensions, int32_t nAuxiliaryDataPoints)
320320
{
321321
// Prepare creation of a best-fit spline
322322
//
@@ -463,7 +463,7 @@ int32_t Spline1DHelperOld<DataT>::setSpline(
463463

464464
template <typename DataT>
465465
int32_t Spline1DHelperOld<DataT>::setSpline(
466-
const Spline1DContainer<DataT>& spline, int32_t nFdimensions, double xMin, double xMax, double vx[], int32_t nDataPoints)
466+
const Spline1DContainerBase<DataT, FlatObject>& spline, int32_t nFdimensions, double xMin, double xMax, double vx[], int32_t nDataPoints)
467467
{
468468
// Prepare creation of a best-fit spline
469469
//

GPU/TPCFastTransformation/Spline1DHelperOld.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,31 +69,31 @@ class Spline1DHelperOld
6969
void bandGauss(double A[], double b[], int32_t n);
7070

7171
/// Create best-fit spline parameters for a given input function F
72-
void approximateDataPoints(Spline1DContainer<DataT>& spline,
72+
void approximateDataPoints(Spline1DContainerBase<DataT, FlatObject>& spline,
7373
double xMin, double xMax,
7474
double x[], double f[], int32_t nDataPoints);
7575

7676
/// Create best-fit spline parameters for a given input function F
77-
void approximateFunction(Spline1DContainer<DataT>& spline,
77+
void approximateFunction(Spline1DContainerBase<DataT, FlatObject>& spline,
7878
double xMin, double xMax, std::function<void(double x, double f[/*spline.getFdimensions()*/])> F,
7979
int32_t nAuxiliaryDataPoints = 4);
8080

8181
/// Create best-fit spline parameters gradually for a given input function F
82-
void approximateFunctionGradually(Spline1DContainer<DataT>& spline,
82+
void approximateFunctionGradually(Spline1DContainerBase<DataT, FlatObject>& spline,
8383
double xMin, double xMax, std::function<void(double x, double f[/*spline.getFdimensions()*/])> F,
8484
int32_t nAuxiliaryDataPoints = 4);
8585

8686
/// Create classic spline parameters for a given input function F
87-
void approximateFunctionClassic(Spline1DContainer<DataT>& spline,
87+
void approximateFunctionClassic(Spline1DContainerBase<DataT, FlatObject>& spline,
8888
double xMin, double xMax, std::function<void(double x, double f[/*spline.getFdimensions()*/])> F);
8989

9090
/// _______________ Interface for a step-wise construction of the best-fit spline ________________________
9191

9292
/// precompute everything needed for the construction
93-
int32_t setSpline(const Spline1DContainer<DataT>& spline, int32_t nFdimensions, int32_t nAuxiliaryDataPoints);
93+
int32_t setSpline(const Spline1DContainerBase<DataT, FlatObject>& spline, int32_t nFdimensions, int32_t nAuxiliaryDataPoints);
9494

9595
/// precompute everything needed for the construction
96-
int32_t setSpline(const Spline1DContainer<DataT>& spline, int32_t nFdimensions, double xMin, double xMax, double vx[], int32_t nDataPoints);
96+
int32_t setSpline(const Spline1DContainerBase<DataT, FlatObject>& spline, int32_t nFdimensions, double xMin, double xMax, double vx[], int32_t nDataPoints);
9797

9898
/// approximate std::function, output in Fparameters
9999
void approximateFunction(DataT* Fparameters, double xMin, double xMax, std::function<void(double x, double f[])> F) const;

0 commit comments

Comments
 (0)