Project
Loading...
Searching...
No Matches
TPCFastSpaceChargeCorrection.cxx
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
18#include "GPUCommonLogger.h"
19
20#if !defined(GPUCA_GPUCODE)
21#include <iostream>
22#include <cmath>
23#include "Spline2DHelper.h"
24#endif
25
26using namespace o2::gpu;
27
29
31 : FlatObject(),
32 mConstructionRowInfos(nullptr),
33 mConstructionScenarios(nullptr),
34 mNumberOfScenarios(0),
35 mScenarioPtr(nullptr),
36 mRowInfoPtr(nullptr),
37 mSliceRowInfoPtr(nullptr),
38 mTimeStamp(-1),
39 mSplineData{nullptr, nullptr, nullptr},
40 mSliceDataSizeBytes{0, 0, 0}
41{
42 // Default Constructor: creates an empty uninitialized object
43}
44
50
51void TPCFastSpaceChargeCorrection::releaseConstructionMemory()
52{
53// release temporary arrays
54#if !defined(GPUCA_GPUCODE)
55 delete[] mConstructionRowInfos;
56 delete[] mConstructionScenarios;
57#endif
58 mConstructionRowInfos = nullptr;
59 mConstructionScenarios = nullptr;
60}
61
63{
64 releaseConstructionMemory();
65 mConstructionRowInfos = nullptr;
66 mConstructionScenarios = nullptr;
67 mNumberOfScenarios = 0;
68 mRowInfoPtr = nullptr;
69 mSliceRowInfoPtr = nullptr;
70 mScenarioPtr = nullptr;
71 mTimeStamp = -1;
72 for (int32_t is = 0; is < 3; is++) {
73 mSplineData[is] = nullptr;
74 mSliceDataSizeBytes[is] = 0;
75 }
77}
78
79void TPCFastSpaceChargeCorrection::relocateBufferPointers(const char* oldBuffer, char* newBuffer)
80{
81 mRowInfoPtr = FlatObject::relocatePointer(oldBuffer, newBuffer, mRowInfoPtr);
82 mSliceRowInfoPtr = FlatObject::relocatePointer(oldBuffer, newBuffer, mSliceRowInfoPtr);
83 mScenarioPtr = FlatObject::relocatePointer(oldBuffer, newBuffer, mScenarioPtr);
84
85 for (int32_t i = 0; i < mNumberOfScenarios; i++) {
86 SplineType& sp = mScenarioPtr[i];
87 char* newSplineBuf = relocatePointer(oldBuffer, newBuffer, sp.getFlatBufferPtr());
88 sp.setActualBufferAddress(newSplineBuf);
89 }
90 mSplineData[0] = relocatePointer(oldBuffer, newBuffer, mSplineData[0]);
91 mSplineData[1] = relocatePointer(oldBuffer, newBuffer, mSplineData[1]);
92 mSplineData[2] = relocatePointer(oldBuffer, newBuffer, mSplineData[2]);
93}
94
96{
100
101 const char* oldFlatBufferPtr = obj.mFlatBufferPtr;
102
103 FlatObject::cloneFromObject(obj, newFlatBufferPtr);
104
105 releaseConstructionMemory();
106
107 mNumberOfScenarios = obj.mNumberOfScenarios;
108
109 mGeo = obj.mGeo;
110
111 mTimeStamp = obj.mTimeStamp;
112
113 for (int32_t i = 0; i < TPCFastTransformGeo::getNumberOfSlices(); ++i) {
114 mSliceInfo[i] = obj.mSliceInfo[i];
115 }
116
117 mSliceDataSizeBytes[0] = obj.mSliceDataSizeBytes[0];
118 mSliceDataSizeBytes[1] = obj.mSliceDataSizeBytes[1];
119 mSliceDataSizeBytes[2] = obj.mSliceDataSizeBytes[2];
120
121 // variable-size data
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];
128
129 relocateBufferPointers(oldFlatBufferPtr, mFlatBufferPtr);
130}
131
133{
135
136 const char* oldFlatBufferPtr = mFlatBufferPtr;
137 FlatObject::moveBufferTo(newFlatBufferPtr);
138 relocateBufferPointers(oldFlatBufferPtr, mFlatBufferPtr);
139}
140
142{
144
145 FlatObject::setActualBufferAddress(actualFlatBufferPtr);
146
147 size_t rowsOffset = 0;
148 size_t rowsSize = sizeof(RowInfo) * mGeo.getNumberOfRows();
149
150 mRowInfoPtr = reinterpret_cast<RowInfo*>(mFlatBufferPtr + rowsOffset);
151
152 size_t sliceRowsOffset = rowsOffset + rowsSize;
153 size_t sliceRowsSize = sizeof(SliceRowInfo) * mGeo.getNumberOfRows() * mGeo.getNumberOfSlices();
154
155 mSliceRowInfoPtr = reinterpret_cast<SliceRowInfo*>(mFlatBufferPtr + sliceRowsOffset);
156
157 size_t scOffset = alignSize(sliceRowsOffset + sliceRowsSize, SplineType::getClassAlignmentBytes());
158 size_t scSize = sizeof(SplineType) * mNumberOfScenarios;
159
160 mScenarioPtr = reinterpret_cast<SplineType*>(mFlatBufferPtr + scOffset);
161
162 size_t scBufferOffset = alignSize(scOffset + scSize, SplineType::getBufferAlignmentBytes());
163 size_t scBufferSize = 0;
164
165 for (int32_t i = 0; i < mNumberOfScenarios; i++) {
166 SplineType& sp = mScenarioPtr[i];
167 sp.setActualBufferAddress(mFlatBufferPtr + scBufferOffset + scBufferSize);
168 scBufferSize = alignSize(scBufferSize + sp.getFlatBufferSize(), sp.getBufferAlignmentBytes());
169 }
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();
175 }
176}
177
179{
186
187 char* oldBuffer = mFlatBufferPtr;
188 char* newBuffer = futureFlatBufferPtr;
189
190 mRowInfoPtr = relocatePointer(oldBuffer, newBuffer, mRowInfoPtr);
191 mSliceRowInfoPtr = relocatePointer(oldBuffer, newBuffer, mSliceRowInfoPtr);
192
193 for (int32_t i = 0; i < mNumberOfScenarios; i++) {
194 SplineType& sp = mScenarioPtr[i];
195 char* newSplineBuf = relocatePointer(oldBuffer, newBuffer, sp.getFlatBufferPtr());
196 sp.setFutureBufferAddress(newSplineBuf);
197 }
198 mScenarioPtr = relocatePointer(oldBuffer, newBuffer, mScenarioPtr);
199 mSplineData[0] = relocatePointer(oldBuffer, newBuffer, mSplineData[0]);
200 mSplineData[1] = relocatePointer(oldBuffer, newBuffer, mSplineData[1]);
201 mSplineData[2] = relocatePointer(oldBuffer, newBuffer, mSplineData[2]);
202
203 FlatObject::setFutureBufferAddress(futureFlatBufferPtr);
204}
205
207{
208 LOG(info) << " TPC Correction: ";
209 mGeo.print();
210 LOG(info) << " mNumberOfScenarios = " << mNumberOfScenarios;
211 LOG(info) << " mTimeStamp = " << mTimeStamp;
212 LOG(info) << " mSliceDataSizeBytes = " << mSliceDataSizeBytes[0] << " " << mSliceDataSizeBytes[1] << " " << mSliceDataSizeBytes[2];
213 if (mRowInfoPtr) {
214 LOG(info) << " TPC rows: ";
215 for (int32_t i = 0; i < mGeo.getNumberOfRows(); i++) {
216 RowInfo& r = mRowInfoPtr[i];
217 LOG(info) << " tpc row " << i << ": splineScenarioID = " << r.splineScenarioID << " dataOffsetBytes = " << r.dataOffsetBytes;
218 }
219 }
220 if (mScenarioPtr) {
221 for (int32_t i = 0; i < mNumberOfScenarios; i++) {
222 LOG(info) << " SplineScenario " << i << ": ";
223 mScenarioPtr[i].print();
224 }
225 }
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 << ": ";
231 const SplineType& spline = getSpline(is, ir);
232 const float* d = getSplineData(is, ir);
233 int32_t k = 0;
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] << " ";
237 }
238 LOG(info) << "";
239 }
240 }
241 // LOG(info) << "inverse correction: slice " << slice
242 // << " dx " << maxDslice[0] << " du " << maxDslice[1] << " dv " << maxDslice[2] ;
243 }
244 }
245}
246
247#if !defined(GPUCA_GPUCODE) && !defined(GPUCA_STANDALONE)
248
249void TPCFastSpaceChargeCorrection::startConstruction(const TPCFastTransformGeo& geo, int32_t numberOfSplineScenarios)
250{
252
254
255 assert((geo.isConstructed()) && (numberOfSplineScenarios > 0));
256
257 mGeo = geo;
258 mNumberOfScenarios = numberOfSplineScenarios;
259
260 releaseConstructionMemory();
261
262#if !defined(GPUCA_GPUCODE)
263 mConstructionRowInfos = new RowInfo[mGeo.getNumberOfRows()];
264 mConstructionScenarios = new SplineType[mNumberOfScenarios];
265#endif
266
267 assert(mConstructionRowInfos != nullptr);
268 assert(mConstructionScenarios != nullptr);
269
270 for (int32_t i = 0; i < mGeo.getNumberOfRows(); i++) {
271 mConstructionRowInfos[i].splineScenarioID = -1;
272 }
273
274 for (int32_t i = 0; i < mNumberOfScenarios; i++) {
275 mConstructionScenarios[i].destroy();
276 }
277
278 mTimeStamp = -1;
279
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;
286 }
287}
288
289void TPCFastSpaceChargeCorrection::setRowScenarioID(int32_t iRow, int32_t iScenario)
290{
293 assert(iRow >= 0 && iRow < mGeo.getNumberOfRows() && iScenario >= 0 && iScenario < mNumberOfScenarios);
294
295 RowInfo& row = mConstructionRowInfos[iRow];
296 row.splineScenarioID = iScenario;
297 for (int32_t s = 0; s < 3; s++) {
298 row.dataOffsetBytes[s] = 0;
299 }
300}
301
302void TPCFastSpaceChargeCorrection::setSplineScenario(int32_t scenarioIndex, const SplineType& spline)
303{
306 assert(scenarioIndex >= 0 && scenarioIndex < mNumberOfScenarios);
307 assert(spline.isConstructed());
308 SplineType& sp = mConstructionScenarios[scenarioIndex];
309 sp.cloneFromObject(spline, nullptr); // clone to internal buffer container
310}
311
313{
315
317
318 for (int32_t i = 0; i < mGeo.getNumberOfRows(); i++) {
319 assert(mConstructionRowInfos[i].splineScenarioID >= 0);
320 }
321 for (int32_t i = 0; i < mNumberOfScenarios; i++) {
322 assert(mConstructionScenarios[i].isConstructed());
323 }
324
325 // organize memory for the flat buffer and caculate its size
326
327 size_t rowsOffset = 0;
328 size_t rowsSize = sizeof(RowInfo) * mGeo.getNumberOfRows();
329
330 size_t sliceRowsOffset = rowsSize;
331 size_t sliceRowsSize = sizeof(SliceRowInfo) * mGeo.getNumberOfRows() * mGeo.getNumberOfSlices();
332
333 size_t scOffset = alignSize(sliceRowsOffset + sliceRowsSize, SplineType::getClassAlignmentBytes());
334 size_t scSize = sizeof(SplineType) * mNumberOfScenarios;
335
336 size_t scBufferOffsets[mNumberOfScenarios];
337
338 scBufferOffsets[0] = alignSize(scOffset + scSize, SplineType::getBufferAlignmentBytes());
339 size_t scBufferSize = 0;
340 for (int32_t i = 0; i < mNumberOfScenarios; i++) {
341 SplineType& sp = mConstructionScenarios[i];
342 scBufferOffsets[i] = scBufferOffsets[0] + scBufferSize;
343 scBufferSize = alignSize(scBufferSize + sp.getFlatBufferSize(), sp.getBufferAlignmentBytes());
344 }
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++) {
351 RowInfo& row = mConstructionRowInfos[i];
352 SplineType& spline = mConstructionScenarios[row.splineScenarioID];
353 row.dataOffsetBytes[is] = alignSize(mSliceDataSizeBytes[is], SplineType::getParameterAlignmentBytes());
354 mSliceDataSizeBytes[is] = row.dataOffsetBytes[is] + spline.getSizeOfParameters();
355 }
356 mSliceDataSizeBytes[is] = alignSize(mSliceDataSizeBytes[is], SplineType::getParameterAlignmentBytes());
357 bufferSize = sliceDataOffset[is] + mSliceDataSizeBytes[is] * mGeo.getNumberOfSlices();
358 }
359
361
362 mRowInfoPtr = reinterpret_cast<RowInfo*>(mFlatBufferPtr + rowsOffset);
363 for (int32_t i = 0; i < mGeo.getNumberOfRows(); i++) {
364 mRowInfoPtr[i] = mConstructionRowInfos[i];
365 }
366
367 mSliceRowInfoPtr = reinterpret_cast<SliceRowInfo*>(mFlatBufferPtr + sliceRowsOffset);
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.;
371 mSliceRowInfoPtr[s * mGeo.getNumberOfRows() + r].scaleCorrUtoGrid = 0.;
372 mSliceRowInfoPtr[s * mGeo.getNumberOfRows() + r].scaleCorrVtoGrid = 0.;
373 }
374 }
375
376 mScenarioPtr = reinterpret_cast<SplineType*>(mFlatBufferPtr + scOffset);
377
378 for (int32_t i = 0; i < mNumberOfScenarios; i++) {
379 SplineType& sp0 = mConstructionScenarios[i];
380 SplineType& sp1 = mScenarioPtr[i];
381 new (&sp1) SplineType(); // first, call a constructor
382 sp1.cloneFromObject(sp0, mFlatBufferPtr + scBufferOffsets[i]);
383 }
384
385 for (int32_t is = 0; is < 3; is++) {
386 mSplineData[is] = reinterpret_cast<char*>(mFlatBufferPtr + sliceDataOffset[is]);
387 }
388 releaseConstructionMemory();
389
390 mTimeStamp = -1;
391
392 setNoCorrection();
393}
394
396{
397 // initialise all corrections to 0.
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);
404
405 for (int32_t is = 0; is < 3; is++) {
406 float* data = getSplineData(slice, row, is);
407 int32_t nPar = spline.getNumberOfParameters();
408 if (is == 1) {
409 nPar = nPar / 3;
410 }
411 if (is == 2) {
412 nPar = nPar * 2 / 3;
413 }
414 for (int32_t i = 0; i < nPar; i++) {
415 data[i] = 0.f;
416 }
417 }
418
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;
423 }
424 area.maxDriftLengthCheb[0] = vLength;
425 area.cuMin = mGeo.convPadToU(row, 0.f);
426 area.cuMax = -area.cuMin;
427 area.vMax = vLength;
428 area.cvMax = vLength;
429 info.gridV0 = 0.f;
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;
434 } // row
435 } // slice
436}
437
439{
440 const int32_t nCorrectionScenarios = 1;
441 startConstruction(geo, nCorrectionScenarios);
442 for (int32_t row = 0; row < geo.getNumberOfRows(); row++) {
444 }
445 {
447 spline.recreate(2, 2);
448 setSplineScenario(0, spline);
449 }
451 setNoCorrection();
452}
453
454double TPCFastSpaceChargeCorrection::testInverse(bool prn)
455{
456 if (prn) {
457 LOG(info) << "Test inverse transform ";
458 }
459
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;
465
466 double maxDtpc[3] = {0, 0, 0};
467 double maxD = 0;
468
469 for (int32_t slice = 0; slice < mGeo.getNumberOfSlices(); slice++) {
470 if (prn) {
471 LOG(info) << "check inverse transform for slice " << slice;
472 }
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) {
485 float dx, du, dv;
486 getCorrection(slice, row, u, v, dx, du, dv);
487 double cx = x + dx;
488 double cu = u + du;
489 double cv = v + dv;
490 double r2 = cx * cx + cu * cu;
491 if (cv < 0 || cv > vLength || r2 < tpcR2min || r2 > tpcR2max) {
492 continue;
493 }
494 float nx, nu, nv;
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])) {
500 maxDrow[i] = d[i];
501 }
502 }
503
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;
509 }
510 }
511 }
512 if (0 && prn) {
513 LOG(info) << "slice " << slice << " row " << row
514 << " dx " << maxDrow[0] << " du " << maxDrow[1] << " dv " << maxDrow[2];
515 }
516 for (int32_t i = 0; i < 3; i++) {
517 if (fabs(maxDslice[i]) < fabs(maxDrow[i])) {
518 maxDslice[i] = maxDrow[i];
519 }
520 if (fabs(maxDtpc[i]) < fabs(maxDrow[i])) {
521 maxDtpc[i] = maxDrow[i];
522 }
523 if (fabs(maxD) < fabs(maxDrow[i])) {
524 maxD = maxDrow[i];
525 }
526 }
527 }
528 if (prn) {
529 LOG(info) << "inverse correction: slice " << slice
530 << " dx " << maxDslice[0] << " du " << maxDslice[1] << " dv " << maxDslice[2];
531 }
532 } // slice
533
534 LOG(info) << "Test inverse TPC correction. max deviations: "
535 << " dx " << maxDtpc[0] << " du " << maxDtpc[1] << " dv " << maxDtpc[2] << " cm";
536
537 return maxD;
538}
539
540#endif // GPUCA_GPUCODE
int32_t i
uint32_t j
Definition RawData.h:0
Definition of Spline2DHelper class.
ClassImp(TPCFastSpaceChargeCorrection)
Definition of TPCFastSpaceChargeCorrection class.
GPUCA_GPUCODE.
Definition FlatObject.h:176
void setFutureBufferAddress(char *futureFlatBufferPtr)
Definition FlatObject.h:557
uint32_t mConstructionMask
mask for constructed object members, first two bytes are used by this class
Definition FlatObject.h:323
void destroy()
_______________ Utilities _______________________________________________
Definition FlatObject.h:349
static size_t alignSize(size_t sizeBytes, size_t alignmentBytes)
_______________ Generic utilities _______________________________________________
Definition FlatObject.h:277
bool isConstructed() const
Tells if the object is constructed.
Definition FlatObject.h:262
static T * relocatePointer(const char *oldBase, char *newBase, const T *ptr)
Relocates a pointer inside a buffer to the new buffer address.
Definition FlatObject.h:285
void setActualBufferAddress(char *actualFlatBufferPtr)
_____________ Methods for moving the class with its external buffer to another location _____________...
Definition FlatObject.h:547
void startConstruction()
_____________ Construction _________
Definition FlatObject.h:342
void moveBufferTo(char *newBufferPtr)
Definition FlatObject.h:396
void finishConstruction(int32_t flatBufferSize)
Definition FlatObject.h:358
void cloneFromObject(const FlatObject &obj, char *newFlatBufferPtr)
Definition FlatObject.h:373
@ InProgress
construction started: temporary memory is reserved
Definition FlatObject.h:319
TPCFastSpaceChargeCorrection()
_____________ Constructors / destructors __________________________
void setSplineScenario(int32_t scenarioIndex, const SplineType &spline)
Sets approximation scenario.
void setRowScenarioID(int32_t iRow, int32_t iScenario)
Initializes a TPC row.
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.
bool isConstructed() const
Is the object constructed.
void print() const
Print method.
GLint GLenum GLint x
Definition glcorearb.h:403
const GLdouble * v
Definition glcorearb.h:832
GLboolean * data
Definition glcorearb.h:298
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLfloat v0
Definition glcorearb.h:811
GLfloat GLfloat v1
Definition glcorearb.h:812
GLboolean r
Definition glcorearb.h:1233
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)
std::vector< int > row