Skip to content

Commit e8502c0

Browse files
matthias-kleinerdavidrohr
authored andcommitted
Adding class to store the calibration splines for dEdx corrections
fix splines class to compile
1 parent 70f5b5e commit e8502c0

4 files changed

Lines changed: 343 additions & 3 deletions

File tree

GPU/GPUTracking/CMakeLists.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ set(SRCS
5757
TRDTracking/GPUTRDTracker.cxx
5858
TRDTracking/GPUTRDTrackletWord.cxx
5959
TRDTracking/GPUTRDTrackerKernels.cxx
60-
Base/GPUParam.cxx)
60+
Base/GPUParam.cxx
61+
dEdx/TPCdEdxCalibrationSplines.cxx)
6162

6263
set(SRCS_NO_CINT
6364
Base/GPUDataTypes.cxx
@@ -128,7 +129,7 @@ set(HDRS_INSTALL
128129
# Sources only for O2
129130
if(ALIGPU_BUILD_TYPE STREQUAL "O2")
130131
set(SRCS ${SRCS} Interface/GPUO2Interface.cxx)
131-
set(HDRS_CINT_O2 ${HDRS_CINT_O2} Interface/GPUO2Interface.h)
132+
set(HDRS_CINT_O2 ${HDRS_CINT_O2} Interface/GPUO2Interface.h dEdx/TPCdEdxCalibrationSplines.h)
132133
endif()
133134

134135
# Sources for O2 and for Standalone if requested in config file
@@ -167,7 +168,6 @@ if(ALIGPU_BUILD_TYPE STREQUAL "O2" OR CONFIG_O2_EXTENSIONS)
167168
set(HDRS_INSTALL ${HDRS_INSTALL}
168169
Interface/GPUO2InterfaceConfiguration.h
169170
ITS/GPUITSTrack.h
170-
dEdx/GPUdEdxInfo.h
171171
TPCClusterFinder/Array2D.h
172172
TPCClusterFinder/CfConsts.h
173173
TPCClusterFinder/CfFragment.h

GPU/GPUTracking/GPUTrackingLinkDef_O2.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,6 @@
1818
#pragma link off all functions;
1919

2020
#pragma link C++ class o2::gpu::GPUTPCO2Interface + ;
21+
#pragma link C++ class o2::gpu::TPCdEdxCalibrationSplines + ;
2122

2223
#endif
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
// Copyright CERN and copyright holders of ALICE O2. This software is
2+
// distributed under the terms of the GNU General Public License v3 (GPL
3+
// Version 3), copied verbatim in the file "COPYING".
4+
//
5+
// See http://alice-o2.web.cern.ch/license for full licensing information.
6+
//
7+
// In applying this license CERN does not waive the privileges and immunities
8+
// granted to it by virtue of its status as an Intergovernmental Organization
9+
// or submit itself to any jurisdiction.
10+
11+
/// \file dEdxCalibrationSplines.cxx
12+
/// \brief Definition of dEdxCalibrationSplines class
13+
///
14+
/// \author Matthias Kleiner <matthias.kleiner@cern.ch>
15+
16+
#include "TPCdEdxCalibrationSplines.h"
17+
18+
using namespace GPUCA_NAMESPACE::gpu;
19+
20+
#if !defined(GPUCA_GPUCODE)
21+
TPCdEdxCalibrationSplines::TPCdEdxCalibrationSplines()
22+
: FlatObject()
23+
{
24+
/// Default constructor
25+
int nKnots[mFSplines];
26+
for (int i = 0; i < mFSplines; i++) {
27+
nKnots[i] = 2;
28+
}
29+
recreate(nKnots, nKnots);
30+
}
31+
32+
TPCdEdxCalibrationSplines::TPCdEdxCalibrationSplines(const TPCdEdxCalibrationSplines& obj)
33+
: FlatObject()
34+
{
35+
/// Copy constructor
36+
this->cloneFromObject(obj, nullptr);
37+
}
38+
39+
TPCdEdxCalibrationSplines& TPCdEdxCalibrationSplines::operator=(const TPCdEdxCalibrationSplines& obj)
40+
{
41+
/// Assignment operator
42+
this->cloneFromObject(obj, nullptr);
43+
return *this;
44+
}
45+
46+
void TPCdEdxCalibrationSplines::recreate(int nKnotsU1[], int nKnotsU2[])
47+
{
48+
/// Default constructor
49+
50+
FlatObject::startConstruction();
51+
52+
int buffSize = 0;
53+
int offsets1[mFSplines];
54+
int offsets2[mFSplines];
55+
for (int i = 0; i < mFSplines; i++) {
56+
mCalibSplinesqMax[i].recreate(nKnotsU1[i], nKnotsU2[i]);
57+
buffSize = alignSize(buffSize, mCalibSplinesqMax[i].getBufferAlignmentBytes());
58+
offsets1[i] = buffSize;
59+
buffSize += mCalibSplinesqMax[i].getFlatBufferSize();
60+
}
61+
for (int i = 0; i < mFSplines; i++) {
62+
mCalibSplinesqTot[i].recreate(nKnotsU1[i], nKnotsU2[i]);
63+
buffSize = alignSize(buffSize, mCalibSplinesqTot[i].getBufferAlignmentBytes());
64+
offsets2[i] = buffSize;
65+
buffSize += mCalibSplinesqTot[i].getFlatBufferSize();
66+
}
67+
68+
FlatObject::finishConstruction(buffSize);
69+
70+
for (int i = 0; i < mFSplines; i++) {
71+
mCalibSplinesqMax[i].moveBufferTo(mFlatBufferPtr + offsets1[i]);
72+
}
73+
for (int i = 0; i < mFSplines; i++) {
74+
mCalibSplinesqTot[i].moveBufferTo(mFlatBufferPtr + offsets2[i]);
75+
}
76+
}
77+
78+
#endif
79+
80+
#if !defined(GPUCA_GPUCODE)
81+
82+
void TPCdEdxCalibrationSplines::cloneFromObject(const TPCdEdxCalibrationSplines& obj, char* newFlatBufferPtr)
83+
{
84+
/// See FlatObject for description
85+
86+
const char* oldFlatBufferPtr = obj.mFlatBufferPtr;
87+
FlatObject::cloneFromObject(obj, newFlatBufferPtr);
88+
89+
for (int i = 0; i < mFSplines; i++) {
90+
char* buffer = FlatObject::relocatePointer(oldFlatBufferPtr, mFlatBufferPtr, obj.mCalibSplinesqMax[i].getFlatBufferPtr());
91+
mCalibSplinesqMax[i].cloneFromObject(obj.mCalibSplinesqMax[i], buffer);
92+
}
93+
94+
for (int i = 0; i < mFSplines; i++) {
95+
char* buffer = FlatObject::relocatePointer(oldFlatBufferPtr, mFlatBufferPtr, obj.mCalibSplinesqTot[i].getFlatBufferPtr());
96+
mCalibSplinesqTot[i].cloneFromObject(obj.mCalibSplinesqTot[i], buffer);
97+
}
98+
}
99+
100+
void TPCdEdxCalibrationSplines::moveBufferTo(char* newFlatBufferPtr)
101+
{
102+
/// See FlatObject for description
103+
char* oldFlatBufferPtr = mFlatBufferPtr;
104+
FlatObject::moveBufferTo(newFlatBufferPtr);
105+
char* currFlatBufferPtr = mFlatBufferPtr;
106+
mFlatBufferPtr = oldFlatBufferPtr;
107+
setActualBufferAddress(currFlatBufferPtr);
108+
}
109+
#endif
110+
111+
void TPCdEdxCalibrationSplines::destroy()
112+
{
113+
/// See FlatObject for description
114+
for (int i = 0; i < mFSplines; i++) {
115+
mCalibSplinesqMax[i].destroy();
116+
mCalibSplinesqTot[i].destroy();
117+
}
118+
FlatObject::destroy();
119+
}
120+
121+
void TPCdEdxCalibrationSplines::setActualBufferAddress(char* actualFlatBufferPtr)
122+
{
123+
/// See FlatObject for description
124+
125+
FlatObject::setActualBufferAddress(actualFlatBufferPtr);
126+
int offset = 0;
127+
for (int i = 0; i < mFSplines; i++) {
128+
offset = alignSize(offset, mCalibSplinesqMax[i].getBufferAlignmentBytes());
129+
mCalibSplinesqMax[i].setActualBufferAddress(mFlatBufferPtr + offset);
130+
offset += mCalibSplinesqMax[i].getFlatBufferSize();
131+
}
132+
for (int i = 0; i < mFSplines; i++) {
133+
offset = alignSize(offset, mCalibSplinesqTot[i].getBufferAlignmentBytes());
134+
mCalibSplinesqTot[i].setActualBufferAddress(mFlatBufferPtr + offset);
135+
offset += mCalibSplinesqTot[i].getFlatBufferSize();
136+
}
137+
}
138+
139+
void TPCdEdxCalibrationSplines::setFutureBufferAddress(char* futureFlatBufferPtr)
140+
{
141+
/// See FlatObject for description
142+
143+
for (int i = 0; i < mFSplines; i++) {
144+
char* buffer = relocatePointer(mFlatBufferPtr, futureFlatBufferPtr, mCalibSplinesqMax[i].getFlatBufferPtr());
145+
mCalibSplinesqMax[i].setFutureBufferAddress(buffer);
146+
}
147+
for (int i = 0; i < mFSplines; i++) {
148+
char* buffer = relocatePointer(mFlatBufferPtr, futureFlatBufferPtr, mCalibSplinesqTot[i].getFlatBufferPtr());
149+
mCalibSplinesqTot[i].setFutureBufferAddress(buffer);
150+
}
151+
FlatObject::setFutureBufferAddress(futureFlatBufferPtr);
152+
}
Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
// Copyright CERN and copyright holders of ALICE O2. This software is
2+
// distributed under the terms of the GNU General Public License v3 (GPL
3+
// Version 3), copied verbatim in the file "COPYING".
4+
//
5+
// See http://alice-o2.web.cern.ch/license for full licensing information.
6+
//
7+
// In applying this license CERN does not waive the privileges and immunities
8+
// granted to it by virtue of its status as an Intergovernmental Organization
9+
// or submit itself to any jurisdiction.
10+
11+
/// \file dEdxCalibrationSplines.h
12+
/// \brief Definition of dEdxCalibrationSplines class
13+
///
14+
/// \author Matthias Kleiner <matthias.kleiner@cern.ch>
15+
16+
#ifndef TPCdEdxCalibrationSplines_H
17+
#define TPCdEdxCalibrationSplines_H
18+
19+
#include "FlatObject.h"
20+
#include "Spline2D.h"
21+
22+
namespace GPUCA_NAMESPACE
23+
{
24+
namespace gpu
25+
{
26+
27+
///
28+
/// The dEdxCalibrationSplines class represents the calibration of the dEdx of mostly geometrical effects
29+
///
30+
31+
class TPCdEdxCalibrationSplines : public FlatObject
32+
{
33+
public:
34+
typedef Spline2D<float, 1, 1> SplineType;
35+
36+
/// _____________ Constructors / destructors __________________________
37+
38+
#if !defined(GPUCA_GPUCODE)
39+
/// Default constructor
40+
TPCdEdxCalibrationSplines();
41+
42+
/// Copy constructor
43+
TPCdEdxCalibrationSplines(const TPCdEdxCalibrationSplines&);
44+
45+
/// Assignment operator
46+
TPCdEdxCalibrationSplines& operator=(const TPCdEdxCalibrationSplines&);
47+
48+
void recreate(int nKnotsU1[], int nKnotsU2[]);
49+
#else
50+
/// Disable constructors for the GPU implementation
51+
52+
TPCdEdxCalibrationSplines() CON_DELETE;
53+
TPCdEdxCalibrationSplines(const TPCdEdxCalibrationSplines&) CON_DELETE;
54+
TPCdEdxCalibrationSplines& operator=(const TPCdEdxCalibrationSplines&) CON_DELETE;
55+
#endif
56+
57+
/// Destructor
58+
~TPCdEdxCalibrationSplines() CON_DEFAULT;
59+
60+
/// _____________ FlatObject functionality, see FlatObject class for description ____________
61+
62+
using FlatObject::getBufferAlignmentBytes;
63+
using FlatObject::getClassAlignmentBytes;
64+
65+
#if !defined(GPUCA_GPUCODE)
66+
void cloneFromObject(const TPCdEdxCalibrationSplines& obj, char* newFlatBufferPtr);
67+
void moveBufferTo(char* newBufferPtr);
68+
#endif
69+
70+
using FlatObject::releaseInternalBuffer;
71+
72+
void destroy();
73+
void setActualBufferAddress(char* actualFlatBufferPtr);
74+
void setFutureBufferAddress(char* futureFlatBufferPtr);
75+
76+
/// ______________
77+
78+
/// Gives pointer to a spline
79+
GPUd() const SplineType& getSpline(int chargeType, int region) const;
80+
81+
#if !defined(GPUCA_ALIGPUCODE) && !defined(GPUCA_STANDALONE)
82+
/// sets the splines from an input file
83+
void setSplinesFromFile(TFile& inpf);
84+
#endif
85+
86+
/// returns the number of splines stored in the calibration object
87+
GPUd() unsigned int getFSplines() const
88+
{
89+
return mFSplines;
90+
};
91+
92+
GPUd() float interpolateqMax(const int splineInd, const float angleZ, const float z) const
93+
{
94+
return mCalibSplinesqMax[splineInd].interpolate(angleZ, z);
95+
};
96+
97+
GPUd() float interpolateqTot(const int splineInd, const float angleZ, const float z) const
98+
{
99+
return mCalibSplinesqTot[splineInd].interpolate(angleZ, z);
100+
};
101+
102+
GPUd() SplineType& getSplineqMax(const int splineInd)
103+
{
104+
return mCalibSplinesqMax[splineInd];
105+
};
106+
107+
GPUd() SplineType& getSplineqTot(const int splineInd)
108+
{
109+
return mCalibSplinesqTot[splineInd];
110+
};
111+
112+
/// _______________ IO ________________________
113+
#if !defined(GPUCA_ALIGPUCODE) && !defined(GPUCA_STANDALONE)
114+
/// write a class object to the file
115+
int writeToFile(TFile& outf, const char* name);
116+
117+
/// read a class object from the file
118+
static TPCdEdxCalibrationSplines* readFromFile(TFile& inpf, const char* name);
119+
#endif
120+
121+
private:
122+
constexpr static unsigned int mFSplines = 10; ///< number of splines stored for each type
123+
SplineType mCalibSplinesqMax[mFSplines]; ///< spline objects storage for the splines for qMax
124+
SplineType mCalibSplinesqTot[mFSplines]; ///< spline objects storage for the splines for qTot
125+
126+
ClassDefNV(TPCdEdxCalibrationSplines, 1);
127+
};
128+
129+
#if !defined(GPUCA_ALIGPUCODE) && !defined(GPUCA_STANDALONE)
130+
131+
inline void TPCdEdxCalibrationSplines::setSplinesFromFile(TFile& inpf)
132+
{
133+
FlatObject::startConstruction();
134+
135+
int buffSize = 0;
136+
int offsets1[mFSplines];
137+
int offsets2[mFSplines];
138+
139+
for (int ireg = 0; ireg < mFSplines; ++ireg) {
140+
o2::gpu::Spline2D<float, 1>* splineTmpqMax = o2::gpu::Spline2D<float, 1>::readFromFile(inpf, Form("spline_qMax_region%d", ireg));
141+
mCalibSplinesqMax[ireg] = *splineTmpqMax;
142+
buffSize = alignSize(buffSize, mCalibSplinesqMax[ireg].getBufferAlignmentBytes());
143+
offsets1[ireg] = buffSize;
144+
buffSize += mCalibSplinesqMax[ireg].getFlatBufferSize();
145+
}
146+
147+
for (int ireg = 0; ireg < mFSplines; ++ireg) {
148+
o2::gpu::Spline2D<float, 1>* splineTmpqTot = o2::gpu::Spline2D<float, 1>::readFromFile(inpf, Form("spline_qTot_region%d", ireg));
149+
mCalibSplinesqTot[ireg] = *splineTmpqTot;
150+
buffSize = alignSize(buffSize, mCalibSplinesqTot[ireg].getBufferAlignmentBytes());
151+
offsets2[ireg] = buffSize;
152+
buffSize += mCalibSplinesqTot[ireg].getFlatBufferSize();
153+
}
154+
155+
FlatObject::finishConstruction(buffSize);
156+
157+
for (int i = 0; i < mFSplines; i++) {
158+
mCalibSplinesqMax[i].moveBufferTo(mFlatBufferPtr + offsets1[i]);
159+
}
160+
for (int i = 0; i < mFSplines; i++) {
161+
mCalibSplinesqTot[i].moveBufferTo(mFlatBufferPtr + offsets2[i]);
162+
}
163+
}
164+
165+
#endif
166+
167+
#if !defined(GPUCA_ALIGPUCODE) && !defined(GPUCA_STANDALONE)
168+
169+
TPCdEdxCalibrationSplines* TPCdEdxCalibrationSplines::readFromFile(
170+
TFile& inpf, const char* name)
171+
{
172+
/// read a class object from the file
173+
return FlatObject::readFromFile<TPCdEdxCalibrationSplines>(inpf, name);
174+
}
175+
176+
int TPCdEdxCalibrationSplines::writeToFile(TFile& outf, const char* name)
177+
{
178+
/// write a class object to the file
179+
return FlatObject::writeToFile(*this, outf, name);
180+
}
181+
182+
#endif
183+
184+
} // namespace gpu
185+
} // namespace GPUCA_NAMESPACE
186+
187+
#endif

0 commit comments

Comments
 (0)