20#if !defined(GPUCA_GPUCODE)
32 mConstructionRowInfos(nullptr),
33 mConstructionScenarios(nullptr),
34 mNumberOfScenarios(0),
35 mScenarioPtr(nullptr),
37 mSliceRowInfoPtr(nullptr),
39 mSplineData{nullptr, nullptr, nullptr},
40 mSliceDataSizeBytes{0, 0, 0}
51void TPCFastSpaceChargeCorrection::releaseConstructionMemory()
54#if !defined(GPUCA_GPUCODE)
55 delete[] mConstructionRowInfos;
56 delete[] mConstructionScenarios;
58 mConstructionRowInfos =
nullptr;
59 mConstructionScenarios =
nullptr;
64 releaseConstructionMemory();
65 mConstructionRowInfos =
nullptr;
66 mConstructionScenarios =
nullptr;
67 mNumberOfScenarios = 0;
68 mRowInfoPtr =
nullptr;
69 mSliceRowInfoPtr =
nullptr;
70 mScenarioPtr =
nullptr;
72 for (int32_t is = 0; is < 3; is++) {
73 mSplineData[is] =
nullptr;
74 mSliceDataSizeBytes[is] = 0;
79void TPCFastSpaceChargeCorrection::relocateBufferPointers(
const char* oldBuffer,
char* newBuffer)
85 for (int32_t
i = 0;
i < mNumberOfScenarios;
i++) {
87 char* newSplineBuf =
relocatePointer(oldBuffer, newBuffer, sp.getFlatBufferPtr());
88 sp.setActualBufferAddress(newSplineBuf);
105 releaseConstructionMemory();
107 mNumberOfScenarios = obj.mNumberOfScenarios;
111 mTimeStamp = obj.mTimeStamp;
113 for (int32_t
i = 0;
i < TPCFastTransformGeo::getNumberOfSlices(); ++
i) {
114 mSliceInfo[
i] = obj.mSliceInfo[
i];
117 mSliceDataSizeBytes[0] = obj.mSliceDataSizeBytes[0];
118 mSliceDataSizeBytes[1] = obj.mSliceDataSizeBytes[1];
119 mSliceDataSizeBytes[2] = obj.mSliceDataSizeBytes[2];
122 mRowInfoPtr = obj.mRowInfoPtr;
123 mSliceRowInfoPtr = obj.mSliceRowInfoPtr;
124 mScenarioPtr = obj.mScenarioPtr;
125 mSplineData[0] = obj.mSplineData[0];
126 mSplineData[1] = obj.mSplineData[1];
127 mSplineData[2] = obj.mSplineData[2];
147 size_t rowsOffset = 0;
148 size_t rowsSize =
sizeof(
RowInfo) * mGeo.getNumberOfRows();
152 size_t sliceRowsOffset = rowsOffset + rowsSize;
153 size_t sliceRowsSize =
sizeof(
SliceRowInfo) * mGeo.getNumberOfRows() * mGeo.getNumberOfSlices();
157 size_t scOffset =
alignSize(sliceRowsOffset + sliceRowsSize, SplineType::getClassAlignmentBytes());
158 size_t scSize =
sizeof(
SplineType) * mNumberOfScenarios;
162 size_t scBufferOffset =
alignSize(scOffset + scSize, SplineType::getBufferAlignmentBytes());
163 size_t scBufferSize = 0;
165 for (int32_t
i = 0;
i < mNumberOfScenarios;
i++) {
167 sp.setActualBufferAddress(
mFlatBufferPtr + scBufferOffset + scBufferSize);
168 scBufferSize =
alignSize(scBufferSize + sp.getFlatBufferSize(), sp.getBufferAlignmentBytes());
170 size_t bufferSize = scBufferOffset + scBufferSize;
171 for (int32_t is = 0; is < 3; is++) {
172 size_t sliceDataOffset =
alignSize(bufferSize, SplineType::getParameterAlignmentBytes());
173 mSplineData[is] =
reinterpret_cast<char*
>(
mFlatBufferPtr + sliceDataOffset);
174 bufferSize = sliceDataOffset + mSliceDataSizeBytes[is] * mGeo.getNumberOfSlices();
188 char* newBuffer = futureFlatBufferPtr;
191 mSliceRowInfoPtr =
relocatePointer(oldBuffer, newBuffer, mSliceRowInfoPtr);
193 for (int32_t
i = 0;
i < mNumberOfScenarios;
i++) {
195 char* newSplineBuf =
relocatePointer(oldBuffer, newBuffer, sp.getFlatBufferPtr());
196 sp.setFutureBufferAddress(newSplineBuf);
199 mSplineData[0] =
relocatePointer(oldBuffer, newBuffer, mSplineData[0]);
200 mSplineData[1] =
relocatePointer(oldBuffer, newBuffer, mSplineData[1]);
201 mSplineData[2] =
relocatePointer(oldBuffer, newBuffer, mSplineData[2]);
208 LOG(info) <<
" TPC Correction: ";
210 LOG(info) <<
" mNumberOfScenarios = " << mNumberOfScenarios;
211 LOG(info) <<
" mTimeStamp = " << mTimeStamp;
212 LOG(info) <<
" mSliceDataSizeBytes = " << mSliceDataSizeBytes[0] <<
" " << mSliceDataSizeBytes[1] <<
" " << mSliceDataSizeBytes[2];
214 LOG(info) <<
" TPC rows: ";
215 for (int32_t
i = 0;
i < mGeo.getNumberOfRows();
i++) {
217 LOG(info) <<
" tpc row " <<
i <<
": splineScenarioID = " <<
r.
splineScenarioID <<
" dataOffsetBytes = " <<
r.dataOffsetBytes;
221 for (int32_t
i = 0;
i < mNumberOfScenarios;
i++) {
222 LOG(info) <<
" SplineScenario " <<
i <<
": ";
223 mScenarioPtr[
i].print();
226 if (mRowInfoPtr && mScenarioPtr && mSliceRowInfoPtr) {
227 LOG(info) <<
" Spline Data: ";
228 for (int32_t is = 0; is < mGeo.getNumberOfSlices(); is++) {
229 for (int32_t
ir = 0;
ir < mGeo.getNumberOfRows();
ir++) {
230 LOG(info) <<
"slice " << is <<
" row " <<
ir <<
": ";
232 const float* d = getSplineData(is,
ir);
234 for (int32_t
i = 0;
i < spline.getGridX1().getNumberOfKnots();
i++) {
235 for (int32_t
j = 0;
j < spline.getGridX2().getNumberOfKnots();
j++, k++) {
236 LOG(info) << d[k] <<
" ";
247#if !defined(GPUCA_GPUCODE) && !defined(GPUCA_STANDALONE)
255 assert((geo.
isConstructed()) && (numberOfSplineScenarios > 0));
258 mNumberOfScenarios = numberOfSplineScenarios;
260 releaseConstructionMemory();
262#if !defined(GPUCA_GPUCODE)
263 mConstructionRowInfos =
new RowInfo[mGeo.getNumberOfRows()];
264 mConstructionScenarios =
new SplineType[mNumberOfScenarios];
267 assert(mConstructionRowInfos !=
nullptr);
268 assert(mConstructionScenarios !=
nullptr);
270 for (int32_t
i = 0;
i < mGeo.getNumberOfRows();
i++) {
274 for (int32_t
i = 0;
i < mNumberOfScenarios;
i++) {
275 mConstructionScenarios[
i].destroy();
280 mRowInfoPtr =
nullptr;
281 mSliceRowInfoPtr =
nullptr;
282 mScenarioPtr =
nullptr;
283 for (int32_t s = 0; s < 3; s++) {
284 mSplineData[s] =
nullptr;
285 mSliceDataSizeBytes[s] = 0;
293 assert(iRow >= 0 && iRow < mGeo.getNumberOfRows() && iScenario >= 0 && iScenario < mNumberOfScenarios);
297 for (int32_t s = 0; s < 3; s++) {
298 row.dataOffsetBytes[s] = 0;
306 assert(scenarioIndex >= 0 && scenarioIndex < mNumberOfScenarios);
307 assert(spline.isConstructed());
308 SplineType& sp = mConstructionScenarios[scenarioIndex];
309 sp.cloneFromObject(spline,
nullptr);
318 for (int32_t
i = 0;
i < mGeo.getNumberOfRows();
i++) {
319 assert(mConstructionRowInfos[
i].splineScenarioID >= 0);
321 for (int32_t
i = 0;
i < mNumberOfScenarios;
i++) {
327 size_t rowsOffset = 0;
328 size_t rowsSize =
sizeof(
RowInfo) * mGeo.getNumberOfRows();
330 size_t sliceRowsOffset = rowsSize;
331 size_t sliceRowsSize =
sizeof(
SliceRowInfo) * mGeo.getNumberOfRows() * mGeo.getNumberOfSlices();
333 size_t scOffset =
alignSize(sliceRowsOffset + sliceRowsSize, SplineType::getClassAlignmentBytes());
334 size_t scSize =
sizeof(
SplineType) * mNumberOfScenarios;
336 size_t scBufferOffsets[mNumberOfScenarios];
338 scBufferOffsets[0] =
alignSize(scOffset + scSize, SplineType::getBufferAlignmentBytes());
339 size_t scBufferSize = 0;
340 for (int32_t
i = 0;
i < mNumberOfScenarios;
i++) {
342 scBufferOffsets[
i] = scBufferOffsets[0] + scBufferSize;
343 scBufferSize =
alignSize(scBufferSize + sp.getFlatBufferSize(), sp.getBufferAlignmentBytes());
345 size_t bufferSize = scBufferOffsets[0] + scBufferSize;
346 size_t sliceDataOffset[3];
347 for (int32_t is = 0; is < 3; is++) {
348 sliceDataOffset[is] =
alignSize(bufferSize, SplineType::getParameterAlignmentBytes());
349 mSliceDataSizeBytes[is] = 0;
350 for (int32_t
i = 0;
i < mGeo.getNumberOfRows();
i++) {
352 SplineType& spline = mConstructionScenarios[
row.splineScenarioID];
353 row.dataOffsetBytes[is] =
alignSize(mSliceDataSizeBytes[is], SplineType::getParameterAlignmentBytes());
354 mSliceDataSizeBytes[is] =
row.dataOffsetBytes[is] + spline.getSizeOfParameters();
356 mSliceDataSizeBytes[is] =
alignSize(mSliceDataSizeBytes[is], SplineType::getParameterAlignmentBytes());
357 bufferSize = sliceDataOffset[is] + mSliceDataSizeBytes[is] * mGeo.getNumberOfSlices();
363 for (int32_t
i = 0;
i < mGeo.getNumberOfRows();
i++) {
364 mRowInfoPtr[
i] = mConstructionRowInfos[
i];
368 for (int32_t s = 0; s < mGeo.getNumberOfSlices(); s++) {
369 for (int32_t
r = 0;
r < mGeo.getNumberOfRows();
r++) {
370 mSliceRowInfoPtr[s * mGeo.getNumberOfRows() +
r].
gridCorrU0 = 0.;
378 for (int32_t
i = 0;
i < mNumberOfScenarios;
i++) {
385 for (int32_t is = 0; is < 3; is++) {
386 mSplineData[is] =
reinterpret_cast<char*
>(
mFlatBufferPtr + sliceDataOffset[is]);
388 releaseConstructionMemory();
398 for (int32_t slice = 0; slice < mGeo.getNumberOfSlices(); slice++) {
399 double vLength = (slice < mGeo.getNumberOfSlicesA()) ? mGeo.getTPCzLengthA() : mGeo.getTPCzLengthC();
400 SliceInfo& sliceInfo = getSliceInfo(slice);
401 sliceInfo.vMax = vLength;
402 for (int32_t
row = 0;
row < mGeo.getNumberOfRows();
row++) {
403 const SplineType& spline = getSpline(slice,
row);
405 for (int32_t is = 0; is < 3; is++) {
406 float*
data = getSplineData(slice,
row, is);
407 int32_t nPar = spline.getNumberOfParameters();
414 for (int32_t
i = 0;
i < nPar;
i++) {
419 SliceRowInfo& info = getSliceRowInfo(slice,
row);
420 RowActiveArea& area = info.activeArea;
421 for (int32_t
i = 1;
i < 5;
i++) {
422 area.maxDriftLengthCheb[
i] = 0;
424 area.maxDriftLengthCheb[0] = vLength;
425 area.cuMin = mGeo.convPadToU(
row, 0.f);
426 area.cuMax = -area.cuMin;
428 area.cvMax = vLength;
430 info.gridCorrU0 = area.cuMin;
431 info.gridCorrV0 = info.gridV0;
432 info.scaleCorrUtoGrid = spline.getGridX1().getUmax() / (area.cuMax - area.cuMin);
433 info.scaleCorrVtoGrid = spline.getGridX2().getUmax() / area.cvMax;
440 const int32_t nCorrectionScenarios = 1;
442 for (int32_t
row = 0;
row < geo.getNumberOfRows();
row++) {
447 spline.recreate(2, 2);
454double TPCFastSpaceChargeCorrection::testInverse(
bool prn)
457 LOG(info) <<
"Test inverse transform ";
460 double tpcR2min = mGeo.getRowInfo(0).x - 1.;
461 tpcR2min = tpcR2min * tpcR2min;
462 double tpcR2max = mGeo.getRowInfo(mGeo.getNumberOfRows() - 1).x;
463 tpcR2max = tpcR2max / cos(2 * M_PI / mGeo.getNumberOfSlicesA() / 2) + 1.;
464 tpcR2max = tpcR2max * tpcR2max;
466 double maxDtpc[3] = {0, 0, 0};
469 for (int32_t slice = 0; slice < mGeo.getNumberOfSlices(); slice++) {
471 LOG(info) <<
"check inverse transform for slice " << slice;
473 double vLength = (slice < mGeo.getNumberOfSlicesA()) ? mGeo.getTPCzLengthA() : mGeo.getTPCzLengthC();
474 double maxDslice[3] = {0, 0, 0};
475 for (int32_t
row = 0;
row < mGeo.getNumberOfRows();
row++) {
476 float u0, u1,
v0,
v1;
477 mGeo.convScaledUVtoUV(slice,
row, 0., 0., u0,
v0);
478 mGeo.convScaledUVtoUV(slice,
row, 1., 1., u1,
v1);
479 double x = mGeo.getRowInfo(
row).x;
480 double stepU = (u1 - u0) / 100.;
481 double stepV = (
v1 -
v0) / 100.;
482 double maxDrow[3] = {0, 0, 0};
483 for (
double u = u0;
u < u1;
u += stepU) {
484 for (
double v =
v0;
v <
v1;
v += stepV) {
486 getCorrection(slice,
row,
u,
v,
dx,
du, dv);
490 double r2 = cx * cx +
cu *
cu;
491 if (cv < 0 || cv > vLength || r2 < tpcR2min || r2 > tpcR2max) {
495 getCorrectionInvCorrectedX(slice,
row,
cu,
cv, nx);
496 getCorrectionInvUV(slice,
row,
cu,
cv, nu, nv);
497 double d[3] = {nx - cx, nu -
u, nv -
v};
498 for (int32_t
i = 0;
i < 3;
i++) {
499 if (fabs(d[
i]) > fabs(maxDrow[
i])) {
504 if (0 && prn && fabs(d[0]) + fabs(d[1]) + fabs(d[2]) > 0.1) {
505 LOG(info) << nx - cx <<
" " << nu -
u <<
" " << nv -
v
506 <<
" x,u,v " <<
x <<
", " <<
u <<
", " <<
v
507 <<
" dx,du,dv " << cx -
x <<
", " <<
cu -
u <<
", " <<
cv -
v
508 <<
" nx,nu,nv " << nx -
x <<
", " <<
cu - nu <<
", " <<
cv - nv;
513 LOG(info) <<
"slice " << slice <<
" row " <<
row
514 <<
" dx " << maxDrow[0] <<
" du " << maxDrow[1] <<
" dv " << maxDrow[2];
516 for (int32_t
i = 0;
i < 3;
i++) {
517 if (fabs(maxDslice[
i]) < fabs(maxDrow[
i])) {
518 maxDslice[
i] = maxDrow[
i];
520 if (fabs(maxDtpc[
i]) < fabs(maxDrow[
i])) {
521 maxDtpc[
i] = maxDrow[
i];
523 if (fabs(maxD) < fabs(maxDrow[
i])) {
529 LOG(info) <<
"inverse correction: slice " << slice
530 <<
" dx " << maxDslice[0] <<
" du " << maxDslice[1] <<
" dv " << maxDslice[2];
534 LOG(info) <<
"Test inverse TPC correction. max deviations: "
535 <<
" dx " << maxDtpc[0] <<
" du " << maxDtpc[1] <<
" dv " << maxDtpc[2] <<
" cm";
Definition of Spline2DHelper class.
ClassImp(TPCFastSpaceChargeCorrection)
Definition of TPCFastSpaceChargeCorrection class.
void setFutureBufferAddress(char *futureFlatBufferPtr)
uint32_t mConstructionMask
mask for constructed object members, first two bytes are used by this class
void destroy()
_______________ Utilities _______________________________________________
static size_t alignSize(size_t sizeBytes, size_t alignmentBytes)
_______________ Generic utilities _______________________________________________
bool isConstructed() const
Tells if the object is constructed.
static T * relocatePointer(const char *oldBase, char *newBase, const T *ptr)
Relocates a pointer inside a buffer to the new buffer address.
void setActualBufferAddress(char *actualFlatBufferPtr)
_____________ Methods for moving the class with its external buffer to another location _____________...
void startConstruction()
_____________ Construction _________
void moveBufferTo(char *newBufferPtr)
void finishConstruction(int32_t flatBufferSize)
void cloneFromObject(const FlatObject &obj, char *newFlatBufferPtr)
@ InProgress
construction started: temporary memory is reserved
void moveBufferTo(char *newBufferPtr)
TPCFastSpaceChargeCorrection()
_____________ Constructors / destructors __________________________
Spline2D< float, 3 > SplineType
void setSplineScenario(int32_t scenarioIndex, const SplineType &spline)
Sets approximation scenario.
void setRowScenarioID(int32_t iRow, int32_t iScenario)
Initializes a TPC row.
void print() const
Print method.
~TPCFastSpaceChargeCorrection()
Destructor.
int32_t float float float & dx
void finishConstruction()
Finishes construction: puts everything to the flat buffer, releases temporary memory.
void setFutureBufferAddress(char *futureFlatBufferPtr)
void constructWithNoCorrection(const TPCFastTransformGeo &geo)
void setActualBufferAddress(char *actualFlatBufferPtr)
Moving the class with its external buffer to another location.
void cloneFromObject(const TPCFastSpaceChargeCorrection &obj, char *newFlatBufferPtr)
Construction interface.
int32_t float float float float & du
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GPUd() const expr uint32_t MultivariatePolynomialHelper< Dim
The struct contains necessary info for TPC padrow.
int32_t splineScenarioID
scenario index (which of Spline2D splines to use)
float scaleCorrUtoGrid
scale corrected U to U-grid coordinate
float scaleCorrVtoGrid
scale corrected V to V-grid coordinate
float gridCorrU0
U coordinate of the U-grid start for corrected U.
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
o2::InteractionRecord ir(0, 0)