17#ifndef ALICEO2_GPUCOMMON_TPCFASTTRANSFORMATION_TPCFASTSPACECHARGECORRECTION_H
18#define ALICEO2_GPUCOMMON_TPCFASTTRANSFORMATION_TPCFASTSPACECHARGECORRECTION_H
25#ifndef GPUCA_GPUCODE_DEVICE
57 float splineScalingWithZ{0.f};
60 void set(
float y0_,
float yScale_,
float z0_,
float zScale_,
float zOut_,
float zReadout_)
63 this->yScale = yScale_;
65 this->zScale = zScale_;
68 this->splineScalingWithZ = fabs(zReadout_ - zOut_) > 1.f ? 1.f / (zReadout_ - zOut_) : 0.f;
73 float getZ0()
const {
return z0; }
76 GPUdi() float getSpineScaleForZ(
float z)
const
78 return 1.f - GPUCommonMath::Clamp((
z - zOut) * splineScalingWithZ, 0.f, 1.f);
82 GPUdi()
void convLocalToGridUntruncated(
int sector,
float y,
float z,
float&
u,
float&
v,
float&
s)
const
87 u = (
y -
y0) * yScale;
88 v = (
z - z0) * zScale;
89 s = getSpineScaleForZ(
z);
193 GPUd()
float* getCorrectionData(int32_t sector, int32_t
row, int32_t
iSpline = 0);
205 GPUd()
float* getCorrectionDataInvX(int32_t sector, int32_t
row);
217 GPUd()
float* getCorrectionDataInvYZ(int32_t sector, int32_t
row);
226 GPUdi()
void getCorrectionLocal(int32_t sector, int32_t
row,
float y,
float z,
float&
dx,
float&
dy,
float& dz)
const;
238 GPUd()
void convLocalToGrid(int32_t sector, int32_t
row,
float y,
float z,
float&
u,
float&
v,
float& s)
const;
242 GPUd()
void convGridToLocal(int32_t sector, int32_t
row,
float u,
float v,
float&
y,
float&
z)
const;
246 GPUd()
void convRealLocalToGrid(int32_t sector, int32_t
row,
float y,
float z,
float&
u,
float&
v,
float& s)
const;
250 GPUd()
void convGridToRealLocal(int32_t sector, int32_t
row,
float u,
float v,
float&
y,
float&
z)
const;
252 GPUd()
bool isLocalInsideGrid(int32_t sector, int32_t
row,
float y,
float z)
const;
253 GPUd()
bool isRealLocalInsideGrid(int32_t sector, int32_t
row,
float y,
float z)
const;
267 return mRowInfos[
row];
273 return mRowInfos[
row];
276#if !defined(GPUCA_GPUCODE)
279 GPUh() double testInverse(
bool prn = 0);
284 void relocateBufferPointers(
const char* oldBuffer,
char* newBuffer);
286 void releaseConstructionMemory();
288 static constexpr float kMaxCorrection = 100.f;
300 int32_t mNumberOfScenarios;
308 char* mCorrectionData[3];
310 size_t mSectorDataSizeBytes[3];
315 int32_t mClassVersion{3};
326GPUdi() const TPCFastSpaceChargeCorrection::SplineType& TPCFastSpaceChargeCorrection::getSplineForRow(int32_t
row)
const
329 return mScenarioPtr[getRowInfo(
row).splineScenarioID];
332GPUdi() TPCFastSpaceChargeCorrection::SplineType& TPCFastSpaceChargeCorrection::getSplineForRow(int32_t
row)
335 return mScenarioPtr[getRowInfo(
row).splineScenarioID];
338GPUdi() float* TPCFastSpaceChargeCorrection::getCorrectionData(int32_t sector, int32_t
row, int32_t iSpline)
341 size_t offset = sector * mSectorDataSizeBytes[iSpline] + getRowInfo(
row).dataOffsetBytes[iSpline];
342 return reinterpret_cast<float*
>(mCorrectionData[iSpline] +
offset);
345GPUdi() const
float* TPCFastSpaceChargeCorrection::getCorrectionData(int32_t sector, int32_t
row, int32_t iSpline)
const
348 size_t offset = sector * mSectorDataSizeBytes[iSpline] + getRowInfo(
row).dataOffsetBytes[iSpline];
349 return reinterpret_cast<const float*
>(mCorrectionData[iSpline] +
offset);
352GPUdi() TPCFastSpaceChargeCorrection::SplineTypeInvX& TPCFastSpaceChargeCorrection::getSplineInvXforRow(int32_t
row)
355 return reinterpret_cast<SplineTypeInvX&
>(getSplineForRow(
row));
358GPUdi() const TPCFastSpaceChargeCorrection::SplineTypeInvX& TPCFastSpaceChargeCorrection::getSplineInvXforRow(int32_t
row)
const
361 return reinterpret_cast<const SplineTypeInvX&
>(getSplineForRow(
row));
364GPUdi() float* TPCFastSpaceChargeCorrection::getCorrectionDataInvX(int32_t sector, int32_t
row)
367 return getCorrectionData(sector,
row, 1);
370GPUdi() const
float* TPCFastSpaceChargeCorrection::getCorrectionDataInvX(int32_t sector, int32_t
row)
const
373 return getCorrectionData(sector,
row, 1);
376GPUdi() TPCFastSpaceChargeCorrection::SplineTypeInvYZ& TPCFastSpaceChargeCorrection::getSplineInvYZforRow(int32_t
row)
379 return reinterpret_cast<SplineTypeInvYZ&
>(getSplineForRow(
row));
382GPUdi() const TPCFastSpaceChargeCorrection::SplineTypeInvYZ& TPCFastSpaceChargeCorrection::getSplineInvYZforRow(int32_t
row)
const
385 return reinterpret_cast<const SplineTypeInvYZ&
>(getSplineForRow(
row));
388GPUdi() float* TPCFastSpaceChargeCorrection::getCorrectionDataInvYZ(int32_t sector, int32_t
row)
391 return getCorrectionData(sector,
row, 2);
394GPUdi() const
float* TPCFastSpaceChargeCorrection::getCorrectionDataInvYZ(int32_t sector, int32_t
row)
const
397 return getCorrectionData(sector,
row, 2);
400GPUdi()
void TPCFastSpaceChargeCorrection::convLocalToGrid(int32_t sector, int32_t
row,
float y,
float z,
float& u,
float&
v,
float& s)
const
404 const SplineType& spline = getSplineForRow(
row);
405 getRowInfo(
row).gridMeasured.convLocalToGridUntruncated(sector,
y,
z, u,
v, s);
407 u = GPUCommonMath::Clamp(u, 0.f, (
float)spline.getGridX1().getUmax());
408 v = GPUCommonMath::Clamp(
v, 0.f, (
float)spline.getGridX2().getUmax());
411GPUdi() bool TPCFastSpaceChargeCorrection::isLocalInsideGrid(int32_t sector, int32_t
row,
float y,
float z)
const
415 getRowInfo(
row).gridMeasured.convLocalToGridUntruncated(sector,
y,
z, u,
v, s);
416 const auto& spline = getSplineForRow(
row);
418 if (u < 0.f || u > (
float)spline.getGridX1().getUmax() ||
419 v < 0.f || v > (
float)spline.getGridX2().getUmax()) {
425GPUdi() bool TPCFastSpaceChargeCorrection::isRealLocalInsideGrid(int32_t sector, int32_t
row,
float y,
float z)
const
429 getRowInfo(
row).gridReal.convLocalToGridUntruncated(sector,
y,
z, u,
v, s);
430 const auto& spline = getSplineForRow(
row);
432 if (u < 0.f || u > (
float)spline.getGridX1().getUmax() ||
433 v < 0.f || v > (
float)spline.getGridX2().getUmax()) {
439GPUdi()
void TPCFastSpaceChargeCorrection::convGridToLocal(int32_t sector, int32_t
row,
float gridU,
float gridV,
float&
y,
float&
z)
const
442 getRowInfo(
row).gridMeasured.convGridToLocal(sector, gridU, gridV,
y,
z);
445GPUdi()
void TPCFastSpaceChargeCorrection::convRealLocalToGrid(int32_t sector, int32_t
row,
float y,
float z,
float& u,
float&
v,
float& s)
const
448 const SplineType& spline = getSplineForRow(
row);
449 getRowInfo(
row).gridReal.convLocalToGridUntruncated(sector,
y,
z, u,
v, s);
451 u = GPUCommonMath::Clamp(u, 0.f, (
float)spline.getGridX1().getUmax());
452 v = GPUCommonMath::Clamp(
v, 0.f, (
float)spline.getGridX2().getUmax());
455GPUdi()
void TPCFastSpaceChargeCorrection::convGridToRealLocal(int32_t sector, int32_t
row,
float gridU,
float gridV,
float&
y,
float&
z)
const
458 getRowInfo(
row).gridReal.convGridToLocal(sector, gridU, gridV,
y,
z);
461GPUdi()
void TPCFastSpaceChargeCorrection::getCorrectionLocal(int32_t sector, int32_t
row,
float y,
float z,
float& dx,
float& dy,
float& dz)
const
463 const SplineType& spline = getSplineForRow(
row);
464 const float* splineData = getCorrectionData(sector,
row);
467 convLocalToGrid(sector,
row,
y,
z, u,
v, s);
470 spline.interpolateAtU(splineData, u,
v, dxyz);
472 if (CAMath::Abs(dxyz[0]) > kMaxCorrection || CAMath::Abs(dxyz[1]) > kMaxCorrection || CAMath::Abs(dxyz[2]) > kMaxCorrection) {
481GPUdi() float TPCFastSpaceChargeCorrection::getCorrectionXatRealYZ(int32_t sector, int32_t
row,
float realY,
float realZ)
const
484 convRealLocalToGrid(sector,
row, realY, realZ, u,
v, s);
486 getSplineInvXforRow(
row).interpolateAtU(getCorrectionDataInvX(sector,
row), u,
v, &dx);
487 if (CAMath::Abs(dx) > kMaxCorrection) {
493GPUdi()
void TPCFastSpaceChargeCorrection::getCorrectionYZatRealYZ(int32_t sector, int32_t
row,
float realY,
float realZ,
float&
y,
float&
z)
const
496 convRealLocalToGrid(sector,
row, realY, realZ, u,
v, s);
498 getSplineInvYZforRow(
row).interpolateAtU(getCorrectionDataInvYZ(sector,
row), u,
v, dyz);
499 if (CAMath::Abs(dyz[0]) > kMaxCorrection || CAMath::Abs(dyz[1]) > kMaxCorrection) {
Definition of FlatObject class.
Definition of Spline2D class.
char * releaseInternalBuffer()
_____________ Methods for making the data buffer external __________________________
static constexpr size_t getBufferAlignmentBytes()
Gives minimal alignment in bytes required for the flat buffer.
void startConstruction()
_____________ Construction _________
static constexpr size_t getClassAlignmentBytes()
GPUCA_GPUCODE.
Forward declaration — specializations below select ClassDefNV based on FlatBase.
Spline2D< float, 2 > SplineTypeInvYZ
Spline2D< float, 3 > SplineTypeXYZ
void moveBufferTo(char *newBufferPtr)
GPUd() const SplineType &getSplineForRow(int32_t row) const
Gives const pointer to a spline.
GPUd() void setNoCorrection()
_______________ Initialization interface ________________________
TPCFastSpaceChargeCorrection()
_____________ Constructors / destructors __________________________
void setSplineScenario(int32_t scenarioIndex, const SplineType &spline)
Sets approximation scenario.
TPCFastSpaceChargeCorrection & operator=(const TPCFastSpaceChargeCorrection &)=delete
Assignment operator: disabled to avoid ambiguity. Use cloneTo[In/Ex]ternalBuffer() instead.
int32_t float float realZ
GPUdi() const RowInfo &getRowInfo(int32_t row) const
Gives TPC row info.
void setRowScenarioID(int32_t iRow, int32_t iScenario)
Initializes a TPC row.
void print() const
Print method.
~TPCFastSpaceChargeCorrection()
Destructor.
GPUdi() void setTimeStamp(int64_t v)
Sets the time stamp of the current calibaration.
void finishConstruction()
Finishes construction: puts everything to the flat buffer, releases temporary memory.
Spline2D< float, 3, NoFlatObject > SlimSplineTypeXYZ
Slim variants (NoFlatObject base) for use in TPCFastTransformPOD.
GPUh() double testInverse(bool prn=0)
int32_t float float float & dx
int32_t float float float float & v
int32_t float float float float & dy
int32_t float float float & u
void setFutureBufferAddress(char *futureFlatBufferPtr)
TPCFastSpaceChargeCorrection(const TPCFastSpaceChargeCorrection &)=delete
Copy constructor: disabled to avoid ambiguity. Use cloneTo[In/Ex]ternalBuffer() instead.
void constructWithNoCorrection(const TPCFastTransformGeo &geo)
Spline2D< float, 1 > SplineTypeInvX
int64_t getTimeStamp() const
Gives the time stamp of the current calibaration parameters.
void setActualBufferAddress(char *actualFlatBufferPtr)
Moving the class with its external buffer to another location.
void cloneFromObject(const TPCFastSpaceChargeCorrection &obj, char *newFlatBufferPtr)
Construction interface.
GPUdi() RowInfo &getRowInfo(int32_t row)
Gives TPC row info.
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLuint GLfloat GLfloat y0
GLdouble GLdouble GLdouble z
void set(float y0_, float yScale_, float z0_, float zScale_, float zOut_, float zReadout_)
GPUdi() float getSpineScaleForZ(float z) const
GridInfo gridReal
grid info for the real coordinates
GridInfo gridMeasured
grid info for the measured coordinates
int32_t splineScenarioID
scenario index (which of Spline2D splines to use)
size_t dataOffsetBytes[3]
offset for the spline data withing a TPC sector