133 if (mClassVersion == 4) {
136 size_t scSize =
sizeof(
SplineType) * mNumberOfScenarios;
140 size_t scBufferOffset =
alignSize(scSize, SplineType::getBufferAlignmentBytes());
141 size_t scBufferSize = 0;
143 for (int32_t
i = 0;
i < mNumberOfScenarios;
i++) {
145 sp.setActualBufferAddress(
mFlatBufferPtr + scBufferOffset + scBufferSize);
146 scBufferSize =
alignSize(scBufferSize + sp.getFlatBufferSize(), sp.getBufferAlignmentBytes());
148 size_t bufferSize = scBufferOffset + scBufferSize;
149 for (int32_t is = 0; is < 3; is++) {
150 bufferSize =
alignSize(bufferSize, SplineType::getParameterAlignmentBytes());
151 mCorrectionData[is] =
reinterpret_cast<char*
>(
mFlatBufferPtr + bufferSize);
157 if (mClassVersion != 3) {
158 LOG(fatal) <<
"TPCFastSpaceChargeCorrection::setActualBufferAddress() called with class version " << mClassVersion <<
". This is not supported.";
164 struct RowInfoVersion3 {
165 int32_t splineScenarioID{0};
166 size_t dataOffsetBytes[3]{0};
169 struct RowActiveAreaVersion3 {
170 float maxDriftLengthCheb[5]{0.f};
177 struct SectorRowInfoVersion3 {
179 float gridCorrU0{0.f};
180 float gridCorrV0{0.f};
181 float scaleCorrUtoGrid{0.f};
182 float scaleCorrVtoGrid{0.f};
183 RowActiveAreaVersion3 activeArea;
188 size_t oldRowsOffset = 0;
189 size_t oldRowsSize =
sizeof(RowInfoVersion3) * mGeo.getNumberOfRows();
191 size_t oldSectorRowsOffset = oldRowsOffset + oldRowsSize;
192 size_t oldSectorRowsSize =
sizeof(SectorRowInfoVersion3) * mGeo.getNumberOfRows() * mGeo.
getNumberOfSectors();
194 size_t oldScenariosOffset =
alignSize(oldSectorRowsOffset + oldSectorRowsSize, SplineType::getClassAlignmentBytes());
195 size_t scenariosSize =
sizeof(
SplineType) * mNumberOfScenarios;
201 auto* oldRowInfos =
reinterpret_cast<RowInfoVersion3*
>(
mFlatBufferPtr + oldRowsOffset);
202 auto* oldSectorRowInfos =
reinterpret_cast<SectorRowInfoVersion3*
>(
mFlatBufferPtr + oldSectorRowsOffset);
206 for (int32_t iRow = 0; iRow < mGeo.getNumberOfRows(); iRow++) {
207 RowInfoVersion3& oldRowInfo = oldRowInfos[iRow];
208 SectorRowInfoVersion3& oldSectorRowInfo = oldSectorRowInfos[mGeo.getNumberOfRows() *
iSector + iRow];
211 const auto& spline = oldScenarioPtr[oldRowInfo.splineScenarioID];
213 RowInfo& newRowInfo = getRowInfo(iRow);
216 for (int32_t is = 0; is < 3; is++) {
221 float y0 = mGeo.getRowInfo(iRow).yMin;
222 float yScale = spline.getGridX1().getUmax() / mGeo.getRowInfo(iRow).getYwidth();
223 float zOut = mGeo.getTPCzLength() - oldSectorRowInfo.gridV0;
225 float zScale = spline.getGridX2().getUmax() / (zOut - z0);
235 memmove((
void*)mScenarioPtr, (
const void*)oldScenarioPtr, scenariosSize);
237 size_t oldScenariosBufferOffset =
alignSize(oldScenariosOffset + scenariosSize, SplineType::getBufferAlignmentBytes());
238 size_t scenariosBufferOffset =
alignSize(scenariosSize, SplineType::getBufferAlignmentBytes());
240 size_t oldScenariosBufferSize = 0;
241 size_t scenariosBufferSize = 0;
242 for (int32_t
i = 0;
i < mNumberOfScenarios;
i++) {
244 char* oldAddress =
mFlatBufferPtr + oldScenariosBufferOffset + oldScenariosBufferSize;
245 char* newAddress =
mFlatBufferPtr + scenariosBufferOffset + scenariosBufferSize;
246 memmove(newAddress, oldAddress, sp.getFlatBufferSize());
247 sp.setActualBufferAddress(newAddress);
248 oldScenariosBufferSize =
alignSize(oldScenariosBufferSize + sp.getFlatBufferSize(), sp.getBufferAlignmentBytes());
249 scenariosBufferSize =
alignSize(scenariosBufferSize + sp.getFlatBufferSize(), sp.getBufferAlignmentBytes());
252 size_t oldBufferSize = oldScenariosBufferOffset + oldScenariosBufferSize;
253 size_t bufferSize = scenariosBufferOffset + scenariosBufferSize;
257 for (int32_t is = 0; is < 3; is++) {
258 size_t oldCorrectionDataOffset =
alignSize(oldBufferSize, SplineType::getParameterAlignmentBytes());
259 size_t correctionDataOffset =
alignSize(bufferSize, SplineType::getParameterAlignmentBytes());
260 mCorrectionData[is] =
reinterpret_cast<char*
>(
mFlatBufferPtr + correctionDataOffset);
262 oldBufferSize = oldCorrectionDataOffset + mSectorDataSizeBytes[is] * mGeo.
getNumberOfSectors();
263 bufferSize = correctionDataOffset + mSectorDataSizeBytes[is] * mGeo.
getNumberOfSectors();
271 for (int32_t iRow = 0; iRow < mGeo.getNumberOfRows(); iRow++) {
273 RowInfo& rowInfo = getRowInfo(iRow);
276 int nSplineDimensions[3] = {3, 1, 2};
279 int nDim = nSplineDimensions[
iSpline];
280 int nKnotParameters = 4 * nDim;
284 auto swapKnots = [&](
int i1,
int j1,
int i2,
int j2) {
285 auto k1 = spline.getKnotIndex(i1, j1);
286 auto k2 = spline.getKnotIndex(i2, j2);
287 for (
int ipar = 0; ipar < nKnotParameters; ipar++) {
288 std::swap(
data[nKnotParameters * k1 + ipar],
data[nKnotParameters * k2 + ipar]);
294 for (int32_t
i = 0;
i < spline.getGridX1().getNumberOfKnots();
i++) {
295 for (int32_t
j = 0;
j < spline.getGridX2().getNumberOfKnots() / 2;
j++) {
296 swapKnots(
i,
j,
i, spline.getGridX2().getNumberOfKnots() - 1 -
j);
300 for (int32_t
i = 0;
i < spline.getGridX1().getNumberOfKnots() / 2;
i++) {
301 for (int32_t
j = 0;
j < spline.getGridX2().getNumberOfKnots();
j++) {
302 swapKnots(
i,
j, spline.getGridX1().getNumberOfKnots() - 1 -
i, spline.getGridX2().getNumberOfKnots() - 1 -
j);
309 for (int32_t iKnot = 0; iKnot < spline.getNumberOfKnots(); iKnot++) {
311 for (
int iDim = 0; iDim < nDim; iDim++) {
313 data[nKnotParameters * iKnot + nDim * 1 + iDim] *= -1;
314 data[nKnotParameters * iKnot + nDim * 3 + iDim] *= -1;
316 data[nKnotParameters * iKnot + nDim * 1 + iDim] *= -1;
317 data[nKnotParameters * iKnot + nDim * 2 + iDim] *= -1;
323 data[nKnotParameters * iKnot + nDim * 0 + 2] *= -1;
324 data[nKnotParameters * iKnot + nDim * 1 + 2] *= -1;
325 data[nKnotParameters * iKnot + nDim * 2 + 2] *= -1;
326 data[nKnotParameters * iKnot + nDim * 3 + 2] *= -1;
328 data[nKnotParameters * iKnot + nDim * 0 + 1] *= -1;
329 data[nKnotParameters * iKnot + nDim * 1 + 1] *= -1;
330 data[nKnotParameters * iKnot + nDim * 2 + 1] *= -1;
331 data[nKnotParameters * iKnot + nDim * 3 + 1] *= -1;
335 data[nKnotParameters * iKnot + nDim * 0 + 1] *= -1;
336 data[nKnotParameters * iKnot + nDim * 1 + 1] *= -1;
337 data[nKnotParameters * iKnot + nDim * 2 + 1] *= -1;
338 data[nKnotParameters * iKnot + nDim * 3 + 1] *= -1;
340 data[nKnotParameters * iKnot + nDim * 0 + 0] *= -1;
341 data[nKnotParameters * iKnot + nDim * 1 + 0] *= -1;
342 data[nKnotParameters * iKnot + nDim * 2 + 0] *= -1;
343 data[nKnotParameters * iKnot + nDim * 3 + 0] *= -1;
485 for (int32_t
j = 0;
j < mGeo.getNumberOfRows();
j++) {
487 assert(
row.splineScenarioID >= 0);
488 assert(
row.splineScenarioID < mNumberOfScenarios);
491 for (int32_t
i = 0;
i < mNumberOfScenarios;
i++) {
498 size_t scSize =
sizeof(
SplineType) * mNumberOfScenarios;
500 size_t scBufferOffsets[mNumberOfScenarios];
502 scBufferOffsets[0] =
alignSize(scOffset + scSize, SplineType::getBufferAlignmentBytes());
503 size_t scBufferSize = 0;
504 for (int32_t
i = 0;
i < mNumberOfScenarios;
i++) {
506 scBufferOffsets[
i] = scBufferOffsets[0] + scBufferSize;
507 scBufferSize =
alignSize(scBufferSize + sp.getFlatBufferSize(), sp.getBufferAlignmentBytes());
509 size_t bufferSize = scBufferOffsets[0] + scBufferSize;
510 size_t correctionDataOffset[3];
511 for (int32_t is = 0; is < 3; is++) {
512 bufferSize =
alignSize(bufferSize, SplineType::getParameterAlignmentBytes());
513 correctionDataOffset[is] = bufferSize;
514 mSectorDataSizeBytes[is] = 0;
515 for (int32_t
j = 0;
j < mGeo.getNumberOfRows();
j++) {
517 row.dataOffsetBytes[is] = mSectorDataSizeBytes[is];
518 const SplineType& spline = mConstructionScenarios[
row.splineScenarioID];
521 mSectorDataSizeBytes[is] += splineXYZ.getSizeOfParameters();
522 }
else if (is == 1) {
524 mSectorDataSizeBytes[is] += splineInvX.getSizeOfParameters();
525 }
else if (is == 2) {
527 mSectorDataSizeBytes[is] += splineInvYZ.getSizeOfParameters();
529 mSectorDataSizeBytes[is] =
alignSize(mSectorDataSizeBytes[is], SplineType::getParameterAlignmentBytes());
538 for (int32_t
i = 0;
i < mNumberOfScenarios;
i++) {
545 for (int32_t is = 0; is < 3; is++) {
546 mCorrectionData[is] =
reinterpret_cast<char*
>(
mFlatBufferPtr + correctionDataOffset[is]);
548 releaseConstructionMemory();
559 for (int32_t
row = 0;
row < mGeo.getNumberOfRows();
row++) {
560 const SplineType& spline = getSplineForRow(
row);
561 RowInfo& info = getRowInfo(
row);
562 float y0 = mGeo.getRowInfo(
row).getYmin();
563 float yScale = spline.getGridX1().getUmax() / mGeo.getRowInfo(
row).getYwidth();
565 float zScale = spline.getGridX2().getUmax() / mGeo.getTPCzLength();
566 info.gridMeasured.set(
y0, yScale, z0, zScale, mGeo.getTPCzLength(), mGeo.getTPCzLength());
567 info.gridReal = info.gridMeasured;
570 for (int32_t sector = 0; sector < mGeo.getNumberOfSectors(); sector++) {
571 for (int32_t
row = 0;
row < mGeo.getNumberOfRows();
row++) {
572 for (int32_t is = 0; is < 3; is++) {
573 float*
data = getCorrectionData(sector,
row, is);
576 nPar = getSplineForRow(
row).getNumberOfParameters();
577 }
else if (is == 1) {
578 nPar = getSplineInvXforRow(
row).getNumberOfParameters();
579 }
else if (is == 2) {
580 nPar = getSplineInvYZforRow(
row).getNumberOfParameters();
582 for (int32_t
i = 0;
i < nPar;
i++) {