316 const DataT rSpacing = GridProp::getGridSpacingR(nRPoints);
317 const DataT zSpacing =
side == Side::A ? GridProp::getGridSpacingZ(nZPoints) : -GridProp::getGridSpacingZ(nZPoints);
319 std::uniform_real_distribution<DataT> uniR(-rSpacing / 2, rSpacing / 2);
320 std::uniform_real_distribution<DataT> uniPhi(-phiSpacing / 2, phiSpacing / 2);
322 std::vector<std::vector<float>> phiPosOut(nPhiPoints);
323 std::vector<std::vector<float>> rPosOut(nPhiPoints);
324 std::vector<std::vector<float>> zPosOut(nPhiPoints);
325 std::vector<std::vector<int>> iPhiOut(nPhiPoints);
326 std::vector<std::vector<int>> iROut(nPhiPoints);
327 std::vector<std::vector<int>> iZOut(nPhiPoints);
328 std::vector<std::vector<float>> densityOut(nPhiPoints);
329 std::vector<std::vector<float>> potentialOut(nPhiPoints);
330 std::vector<std::vector<float>> eZOut(nPhiPoints);
331 std::vector<std::vector<float>> eROut(nPhiPoints);
332 std::vector<std::vector<float>> ePhiOut(nPhiPoints);
333 std::vector<std::vector<float>> distZOut(nPhiPoints);
334 std::vector<std::vector<float>> distROut(nPhiPoints);
335 std::vector<std::vector<float>> distRPhiOut(nPhiPoints);
336 std::vector<std::vector<float>> corrZOut(nPhiPoints);
337 std::vector<std::vector<float>> corrROut(nPhiPoints);
338 std::vector<std::vector<float>> corrRPhiOut(nPhiPoints);
339 std::vector<std::vector<float>> lcorrZOut(nPhiPoints);
340 std::vector<std::vector<float>> lcorrROut(nPhiPoints);
341 std::vector<std::vector<float>> lcorrRPhiOut(nPhiPoints);
342 std::vector<std::vector<float>> ldistZOut(nPhiPoints);
343 std::vector<std::vector<float>> ldistROut(nPhiPoints);
344 std::vector<std::vector<float>> ldistRPhiOut(nPhiPoints);
345 std::vector<std::vector<float>> xOut(nPhiPoints);
346 std::vector<std::vector<float>> yOut(nPhiPoints);
347 std::vector<std::vector<float>> bROut(nPhiPoints);
348 std::vector<std::vector<float>> bZOut(nPhiPoints);
349 std::vector<std::vector<float>> bPhiOut(nPhiPoints);
350 std::vector<std::vector<LocalPosition3D>> lPosOut(nPhiPoints);
351 std::vector<std::vector<int>> sectorOut(nPhiPoints);
352 std::vector<std::vector<size_t>> globalIdxOut(nPhiPoints);
353 std::vector<std::vector<bool>> isOnPadPlane(nPhiPoints);
355#pragma omp parallel for num_threads(sNThreads)
356 for (
int iPhi = 0; iPhi < nPhiPoints; ++iPhi) {
357 const int nPoints = nZPoints * nRPoints;
358 phiPosOut[iPhi].reserve(nPoints);
359 rPosOut[iPhi].reserve(nPoints);
360 zPosOut[iPhi].reserve(nPoints);
361 iPhiOut[iPhi].reserve(nPoints);
362 iROut[iPhi].reserve(nPoints);
363 iZOut[iPhi].reserve(nPoints);
364 densityOut[iPhi].reserve(nPoints);
365 potentialOut[iPhi].reserve(nPoints);
366 eZOut[iPhi].reserve(nPoints);
367 eROut[iPhi].reserve(nPoints);
368 ePhiOut[iPhi].reserve(nPoints);
369 distZOut[iPhi].reserve(nPoints);
370 distROut[iPhi].reserve(nPoints);
371 distRPhiOut[iPhi].reserve(nPoints);
372 corrZOut[iPhi].reserve(nPoints);
373 corrROut[iPhi].reserve(nPoints);
374 corrRPhiOut[iPhi].reserve(nPoints);
375 lcorrZOut[iPhi].reserve(nPoints);
376 lcorrROut[iPhi].reserve(nPoints);
377 lcorrRPhiOut[iPhi].reserve(nPoints);
378 ldistZOut[iPhi].reserve(nPoints);
379 ldistROut[iPhi].reserve(nPoints);
380 ldistRPhiOut[iPhi].reserve(nPoints);
381 xOut[iPhi].reserve(nPoints);
382 yOut[iPhi].reserve(nPoints);
383 bROut[iPhi].reserve(nPoints);
384 bZOut[iPhi].reserve(nPoints);
385 bPhiOut[iPhi].reserve(nPoints);
386 lPosOut[iPhi].reserve(nPoints);
387 sectorOut[iPhi].reserve(nPoints);
388 globalIdxOut[iPhi].reserve(nPoints);
389 isOnPadPlane[iPhi].reserve(nPoints);
391 std::mt19937 rng(std::random_device{}());
392 DataT phiPos = iPhi * phiSpacing;
393 for (
int iR = 0; iR < nRPoints; ++iR) {
394 DataT rPos = getRMin(
side) + iR * rSpacing;
395 for (
int iZ = 0; iZ < nZPoints; ++iZ) {
396 DataT zPos = getZMin(
side) + iZ * zSpacing;
398 phiPos += uniPhi(rng);
399 o2::math_utils::detail::bringTo02PiGen<DataT>(phiPos);
403 DataT density = getDensityCyl(zPos, rPos, phiPos,
side);
404 DataT potential = getPotentialCyl(zPos, rPos, phiPos,
side);
409 getDistortionsCyl(zPos, rPos, phiPos,
side, distZ, distR, distRPhi);
414 getLocalDistortionsCyl(zPos, rPos, phiPos,
side, ldistZ, ldistR, ldistRPhi);
422 const DataT zDistorted = zPos + distZ;
423 const DataT radiusDistorted = rPos + distR;
424 const DataT phiDistorted = regulatePhi(phiPos + distRPhi / rPos,
side);
425 getCorrectionsCyl(zDistorted, radiusDistorted, phiDistorted,
side, corrZ, corrR, corrRPhi);
426 corrRPhi *= rPos / radiusDistorted;
431 getLocalCorrectionsCyl(zPos, rPos, phiPos,
side, lcorrZ, lcorrR, lcorrRPhi);
437 getElectricFieldsCyl(zPos, rPos, phiPos,
side, eZ, eR, ePhi);
440 const float x = getXFromPolar(rPos, phiPos);
441 const float y = getYFromPolar(rPos, phiPos);
444 const float bR = mBField.evalFieldR(zPos, rPos, phiPos);
445 const float bZ = mBField.evalFieldZ(zPos, rPos, phiPos);
446 const float bPhi = mBField.evalFieldPhi(zPos, rPos, phiPos);
449 unsigned char secNum = std::floor(phiPos /
SECPHIWIDTH);
453 phiPosOut[iPhi].emplace_back(phiPos);
454 rPosOut[iPhi].emplace_back(rPos);
455 zPosOut[iPhi].emplace_back(zPos);
456 iPhiOut[iPhi].emplace_back(iPhi);
457 iROut[iPhi].emplace_back(iR);
458 iZOut[iPhi].emplace_back(iZ);
459 if (mDensity[
side].getNDataPoints()) {
460 densityOut[iPhi].emplace_back(density);
462 if (mPotential[
side].getNDataPoints()) {
463 potentialOut[iPhi].emplace_back(potential);
465 if (mElectricFieldEr[
side].getNDataPoints()) {
466 eZOut[iPhi].emplace_back(eZ);
467 eROut[iPhi].emplace_back(eR);
468 ePhiOut[iPhi].emplace_back(ePhi);
470 if (mGlobalDistdR[
side].getNDataPoints()) {
471 distZOut[iPhi].emplace_back(distZ);
472 distROut[iPhi].emplace_back(distR);
473 distRPhiOut[iPhi].emplace_back(distRPhi);
475 if (mGlobalCorrdR[
side].getNDataPoints()) {
476 corrZOut[iPhi].emplace_back(corrZ);
477 corrROut[iPhi].emplace_back(corrR);
478 corrRPhiOut[iPhi].emplace_back(corrRPhi);
480 if (mLocalCorrdR[
side].getNDataPoints()) {
481 lcorrZOut[iPhi].emplace_back(lcorrZ);
482 lcorrROut[iPhi].emplace_back(lcorrR);
483 lcorrRPhiOut[iPhi].emplace_back(lcorrRPhi);
485 if (mLocalDistdR[
side].getNDataPoints()) {
486 ldistZOut[iPhi].emplace_back(ldistZ);
487 ldistROut[iPhi].emplace_back(ldistR);
488 ldistRPhiOut[iPhi].emplace_back(ldistRPhi);
490 xOut[iPhi].emplace_back(
x);
491 yOut[iPhi].emplace_back(
y);
492 bROut[iPhi].emplace_back(bR);
493 bZOut[iPhi].emplace_back(bZ);
494 bPhiOut[iPhi].emplace_back(bPhi);
495 lPosOut[iPhi].emplace_back(lPos);
496 sectorOut[iPhi].emplace_back(sector);
497 const size_t idx = (iZ + nZPoints * (iR + iPhi * nRPoints));
498 globalIdxOut[iPhi].emplace_back(idx);
500 const float xDist = getXFromPolar(radiusDistorted, phiDistorted);
501 const float yDist = getYFromPolar(radiusDistorted, phiDistorted);
504 isOnPadPlane[iPhi].emplace_back(digiPadPos.
isValid());
509 if (ROOT::IsImplicitMTEnabled() && (ROOT::GetThreadPoolSize() != sNThreads)) {
510 ROOT::DisableImplicitMT();
512 ROOT::EnableImplicitMT(sNThreads);
513 ROOT::RDataFrame dFrame(nPhiPoints);
516 auto dfStore = dFrame.DefineSlotEntry(
"x", [&xOut = xOut](
unsigned int, ULong64_t
entry) {
return xOut[
entry]; });
517 dfStore = dfStore.DefineSlotEntry(
"y", [&yOut = yOut](
unsigned int, ULong64_t
entry) {
return yOut[
entry]; });
518 dfStore = dfStore.DefineSlotEntry(
"phi", [&phiPosOut = phiPosOut](
unsigned int, ULong64_t
entry) {
return phiPosOut[
entry]; });
519 dfStore = dfStore.DefineSlotEntry(
"r", [&rPosOut = rPosOut](
unsigned int, ULong64_t
entry) {
return rPosOut[
entry]; });
520 dfStore = dfStore.DefineSlotEntry(
"z", [&zPosOut = zPosOut](
unsigned int, ULong64_t
entry) {
return zPosOut[
entry]; });
521 dfStore = dfStore.DefineSlotEntry(
"iPhi", [&iPhiOut = iPhiOut](
unsigned int, ULong64_t
entry) {
return iPhiOut[
entry]; });
522 dfStore = dfStore.DefineSlotEntry(
"iR", [&iROut = iROut](
unsigned int, ULong64_t
entry) {
return iROut[
entry]; });
523 dfStore = dfStore.DefineSlotEntry(
"iZ", [&iZOut = iZOut](
unsigned int, ULong64_t
entry) {
return iZOut[
entry]; });
524 dfStore = dfStore.DefineSlotEntry(
"lPos", [&lPosOut = lPosOut](
unsigned int, ULong64_t
entry) {
return lPosOut[
entry]; });
525 dfStore = dfStore.DefineSlotEntry(
"sector", [§orOut = sectorOut](
unsigned int, ULong64_t
entry) {
return sectorOut[
entry]; });
526 dfStore = dfStore.DefineSlotEntry(
"scdensity", [&densityOut = densityOut](
unsigned int, ULong64_t
entry) {
return densityOut[
entry]; });
527 dfStore = dfStore.DefineSlotEntry(
"potential", [&potentialOut = potentialOut](
unsigned int, ULong64_t
entry) {
return potentialOut[
entry]; });
528 dfStore = dfStore.DefineSlotEntry(
"eZ", [&eZOut = eZOut](
unsigned int, ULong64_t
entry) {
return eZOut[
entry]; });
529 dfStore = dfStore.DefineSlotEntry(
"eR", [&eROut = eROut](
unsigned int, ULong64_t
entry) {
return eROut[
entry]; });
530 dfStore = dfStore.DefineSlotEntry(
"ePhi", [&ePhiOut = ePhiOut](
unsigned int, ULong64_t
entry) {
return ePhiOut[
entry]; });
531 dfStore = dfStore.DefineSlotEntry(
"distZ", [&distZOut = distZOut](
unsigned int, ULong64_t
entry) {
return distZOut[
entry]; });
532 dfStore = dfStore.DefineSlotEntry(
"distR", [&distROut = distROut](
unsigned int, ULong64_t
entry) {
return distROut[
entry]; });
533 dfStore = dfStore.DefineSlotEntry(
"distRPhi", [&distRPhiOut = distRPhiOut](
unsigned int, ULong64_t
entry) {
return distRPhiOut[
entry]; });
534 dfStore = dfStore.DefineSlotEntry(
"corrZ", [&corrZOut = corrZOut](
unsigned int, ULong64_t
entry) {
return corrZOut[
entry]; });
535 dfStore = dfStore.DefineSlotEntry(
"corrR", [&corrROut = corrROut](
unsigned int, ULong64_t
entry) {
return corrROut[
entry]; });
536 dfStore = dfStore.DefineSlotEntry(
"corrRPhi", [&corrRPhiOut = corrRPhiOut](
unsigned int, ULong64_t
entry) {
return corrRPhiOut[
entry]; });
537 dfStore = dfStore.DefineSlotEntry(
"lcorrZ", [&lcorrZOut = lcorrZOut](
unsigned int, ULong64_t
entry) {
return lcorrZOut[
entry]; });
538 dfStore = dfStore.DefineSlotEntry(
"lcorrR", [&lcorrROut = lcorrROut](
unsigned int, ULong64_t
entry) {
return lcorrROut[
entry]; });
539 dfStore = dfStore.DefineSlotEntry(
"lcorrRPhi", [&lcorrRPhiOut = lcorrRPhiOut](
unsigned int, ULong64_t
entry) {
return lcorrRPhiOut[
entry]; });
540 dfStore = dfStore.DefineSlotEntry(
"ldistZ", [&ldistZOut = ldistZOut](
unsigned int, ULong64_t
entry) {
return ldistZOut[
entry]; });
541 dfStore = dfStore.DefineSlotEntry(
"ldistR", [&ldistROut = ldistROut](
unsigned int, ULong64_t
entry) {
return ldistROut[
entry]; });
542 dfStore = dfStore.DefineSlotEntry(
"ldistRPhi", [&ldistRPhiOut = ldistRPhiOut](
unsigned int, ULong64_t
entry) {
return ldistRPhiOut[
entry]; });
543 dfStore = dfStore.DefineSlotEntry(
"bR", [&bROut = bROut](
unsigned int, ULong64_t
entry) {
return bROut[
entry]; });
544 dfStore = dfStore.DefineSlotEntry(
"bZ", [&bZOut = bZOut](
unsigned int, ULong64_t
entry) {
return bZOut[
entry]; });
545 dfStore = dfStore.DefineSlotEntry(
"bPhi", [&bPhiOut = bPhiOut](
unsigned int, ULong64_t
entry) {
return bPhiOut[
entry]; });
546 dfStore = dfStore.DefineSlotEntry(
"globalIndex", [&globalIdxOut = globalIdxOut](
unsigned int, ULong64_t
entry) {
return globalIdxOut[
entry]; });
547 dfStore = dfStore.DefineSlotEntry(
"isOnPadPlane", [&isOnPadPlane = isOnPadPlane](
unsigned int, ULong64_t
entry) {
return isOnPadPlane[
entry]; });
548 dfStore.Snapshot(
"tree", outFileName);
556 const DataT zSpacing = (
side == Side::A) ? GridProp::getGridSpacingZ(nZPoints) : -GridProp::getGridSpacingZ(nZPoints);
560 std::vector<std::vector<float>> phiPosOut(nZPoints);
561 std::vector<std::vector<float>> rPosOut(nZPoints);
562 std::vector<std::vector<float>> zPosOut(nZPoints);
563 std::vector<std::vector<int>> rowOut(nZPoints);
564 std::vector<std::vector<float>> lxOut(nZPoints);
565 std::vector<std::vector<float>> lyOut(nZPoints);
566 std::vector<std::vector<float>> xOut(nZPoints);
567 std::vector<std::vector<float>> yOut(nZPoints);
568 std::vector<std::vector<float>> corrZOut(nZPoints);
569 std::vector<std::vector<float>> corrROut(nZPoints);
570 std::vector<std::vector<float>> corrRPhiOut(nZPoints);
571 std::vector<std::vector<float>> erOut(nZPoints);
572 std::vector<std::vector<float>> ezOut(nZPoints);
573 std::vector<std::vector<float>> ephiOut(nZPoints);
574 std::vector<std::vector<float>> potentialOut(nZPoints);
575 std::vector<std::vector<int>> izOut(nZPoints);
576 std::vector<std::vector<size_t>> globalIdxOut(nZPoints);
578#pragma omp parallel for num_threads(sNThreads)
579 for (
int iZ = 0; iZ < nZPoints; ++iZ) {
580 phiPosOut[iZ].reserve(nPads);
581 rPosOut[iZ].reserve(nPads);
582 zPosOut[iZ].reserve(nPads);
583 corrZOut[iZ].reserve(nPads);
584 corrROut[iZ].reserve(nPads);
585 corrRPhiOut[iZ].reserve(nPads);
586 rowOut[iZ].reserve(nPads);
587 lxOut[iZ].reserve(nPads);
588 lyOut[iZ].reserve(nPads);
589 xOut[iZ].reserve(nPads);
590 yOut[iZ].reserve(nPads);
591 erOut[iZ].reserve(nPads);
592 ezOut[iZ].reserve(nPads);
593 ephiOut[iZ].reserve(nPads);
594 izOut[iZ].reserve(nPads);
595 potentialOut[iZ].reserve(nPads);
596 globalIdxOut[iZ].reserve(nPads);
598 DataT zPos = getZMin(
side) + iZ * zSpacing;
604 auto lx = padcentre.X();
605 auto ly = padcentre.Y();
608 auto x = globalPos.X();
609 auto y = globalPos.Y();
611 auto r = getRadiusFromCartesian(
x,
y);
612 auto phi = getPhiFromCartesian(
x,
y);
616 getCorrectionsCyl(zPos,
r, phi,
side, corrZ, corrR, corrRPhi);
621 getElectricFieldsCyl(zPos,
r, phi,
side, eZ, eR, ePhi);
623 potentialOut[iZ].emplace_back(getPotentialCyl(zPos,
r, phi,
side));
624 erOut[iZ].emplace_back(eR);
625 ezOut[iZ].emplace_back(eZ);
626 ephiOut[iZ].emplace_back(ePhi);
627 phiPosOut[iZ].emplace_back(phi);
628 rPosOut[iZ].emplace_back(
r);
629 zPosOut[iZ].emplace_back(zPos);
630 corrZOut[iZ].emplace_back(corrZ);
631 corrROut[iZ].emplace_back(corrR);
632 corrRPhiOut[iZ].emplace_back(corrRPhi);
634 lxOut[iZ].emplace_back(lx);
635 lyOut[iZ].emplace_back(ly);
636 xOut[iZ].emplace_back(
x);
637 yOut[iZ].emplace_back(
y);
638 izOut[iZ].emplace_back(iZ);
640 globalIdxOut[iZ].emplace_back(idx);
646 if (ROOT::IsImplicitMTEnabled() && (ROOT::GetThreadPoolSize() != sNThreads)) {
647 ROOT::DisableImplicitMT();
649 ROOT::EnableImplicitMT(sNThreads);
650 ROOT::RDataFrame dFrame(nZPoints);
653 auto dfStore = dFrame.DefineSlotEntry(
"phi", [&phiPosOut = phiPosOut](
unsigned int, ULong64_t
entry) {
return phiPosOut[
entry]; });
654 dfStore = dfStore.DefineSlotEntry(
"r", [&rPosOut = rPosOut](
unsigned int, ULong64_t
entry) {
return rPosOut[
entry]; });
655 dfStore = dfStore.DefineSlotEntry(
"z", [&zPosOut = zPosOut](
unsigned int, ULong64_t
entry) {
return zPosOut[
entry]; });
656 dfStore = dfStore.DefineSlotEntry(
"iz", [&izOut = izOut](
unsigned int, ULong64_t
entry) {
return izOut[
entry]; });
657 dfStore = dfStore.DefineSlotEntry(
"corrZ", [&corrZOut = corrZOut](
unsigned int, ULong64_t
entry) {
return corrZOut[
entry]; });
658 dfStore = dfStore.DefineSlotEntry(
"corrR", [&corrROut = corrROut](
unsigned int, ULong64_t
entry) {
return corrROut[
entry]; });
659 dfStore = dfStore.DefineSlotEntry(
"corrRPhi", [&corrRPhiOut = corrRPhiOut](
unsigned int, ULong64_t
entry) {
return corrRPhiOut[
entry]; });
660 dfStore = dfStore.DefineSlotEntry(
"row", [&rowOut = rowOut](
unsigned int, ULong64_t
entry) {
return rowOut[
entry]; });
661 dfStore = dfStore.DefineSlotEntry(
"lx", [&lxOut = lxOut](
unsigned int, ULong64_t
entry) {
return lxOut[
entry]; });
662 dfStore = dfStore.DefineSlotEntry(
"ly", [&lyOut = lyOut](
unsigned int, ULong64_t
entry) {
return lyOut[
entry]; });
663 dfStore = dfStore.DefineSlotEntry(
"x", [&xOut = xOut](
unsigned int, ULong64_t
entry) {
return xOut[
entry]; });
664 dfStore = dfStore.DefineSlotEntry(
"y", [&yOut = yOut](
unsigned int, ULong64_t
entry) {
return yOut[
entry]; });
665 dfStore = dfStore.DefineSlotEntry(
"er", [&erOut = erOut](
unsigned int, ULong64_t
entry) {
return erOut[
entry]; });
666 dfStore = dfStore.DefineSlotEntry(
"ez", [&ezOut = ezOut](
unsigned int, ULong64_t
entry) {
return ezOut[
entry]; });
667 dfStore = dfStore.DefineSlotEntry(
"ephi", [&ephiOut = ephiOut](
unsigned int, ULong64_t
entry) {
return ephiOut[
entry]; });
668 dfStore = dfStore.DefineSlotEntry(
"potential", [&potentialOut = potentialOut](
unsigned int, ULong64_t
entry) {
return potentialOut[
entry]; });
669 dfStore = dfStore.DefineSlotEntry(
"globalIndex", [&globalIdxOut = globalIdxOut](
unsigned int, ULong64_t
entry) {
return globalIdxOut[
entry]; });
670 dfStore.Snapshot(
"tree", outFileName);
674template <
typename DataT>
677 if (!mElectricFieldEr[
side].getNDataPoints()) {
678 LOGP(info,
"============== E-Fields are not set! returning ==============");
681 const std::string sideName = getSideName(
side);
682 const int er = mElectricFieldEr[
side].writeToFile(file, option, fmt::format(
"fieldEr_side{}", sideName), sNThreads);
683 const int ez = mElectricFieldEz[
side].writeToFile(file,
"UPDATE", fmt::format(
"fieldEz_side{}", sideName), sNThreads);
684 const int ephi = mElectricFieldEphi[
side].writeToFile(file,
"UPDATE", fmt::format(
"fieldEphi_side{}", sideName), sNThreads);
685 dumpMetaData(file,
"UPDATE",
false);
686 return er + ez + ephi;
689template <
typename DataT>
692 const std::string sideName = getSideName(
side);
693 std::string_view treeEr{fmt::format(
"fieldEr_side{}", sideName)};
694 if (!checkGridFromFile(file, treeEr)) {
697 initContainer(mElectricFieldEr[
side],
true);
698 initContainer(mElectricFieldEz[
side],
true);
699 initContainer(mElectricFieldEphi[
side],
true);
700 mElectricFieldEr[
side].initFromFile(file, treeEr, sNThreads);
701 mElectricFieldEz[
side].initFromFile(file, fmt::format(
"fieldEz_side{}", sideName), sNThreads);
702 mElectricFieldEphi[
side].initFromFile(file, fmt::format(
"fieldEphi_side{}", sideName), sNThreads);
706template <
typename DataT>
709 if (!mGlobalDistdR[
side].getNDataPoints()) {
710 LOGP(info,
"============== global distortions are not set! returning ==============");
713 const std::string sideName = getSideName(
side);
714 const int er = mGlobalDistdR[
side].writeToFile(file, option, fmt::format(
"distR_side{}", sideName), sNThreads);
715 const int ez = mGlobalDistdZ[
side].writeToFile(file,
"UPDATE", fmt::format(
"distZ_side{}", sideName), sNThreads);
716 const int ephi = mGlobalDistdRPhi[
side].writeToFile(file,
"UPDATE", fmt::format(
"distRphi_side{}", sideName), sNThreads);
717 dumpMetaData(file,
"UPDATE",
false);
718 return er + ez + ephi;
721template <
typename DataT>
724 const std::string sideName = getSideName(
side);
725 std::string_view
tree{fmt::format(
"distR_side{}", sideName)};
726 if (!checkGridFromFile(file,
tree)) {
729 initContainer(mGlobalDistdR[
side],
true);
730 initContainer(mGlobalDistdZ[
side],
true);
731 initContainer(mGlobalDistdRPhi[
side],
true);
732 mGlobalDistdR[
side].initFromFile(file,
tree, sNThreads);
733 mGlobalDistdZ[
side].initFromFile(file, fmt::format(
"distZ_side{}", sideName), sNThreads);
734 mGlobalDistdRPhi[
side].initFromFile(file, fmt::format(
"distRphi_side{}", sideName), sNThreads);
738template <
typename DataT>
741 if (!mGlobalCorrdR[
side].getNDataPoints()) {
742 LOGP(info,
"============== global corrections are not set! returning ==============");
745 const std::string sideName = getSideName(
side);
746 const int er = mGlobalCorrdR[
side].writeToFile(file, option, fmt::format(
"corrR_side{}", sideName), sNThreads);
747 const int ez = mGlobalCorrdZ[
side].writeToFile(file,
"UPDATE", fmt::format(
"corrZ_side{}", sideName), sNThreads);
748 const int ephi = mGlobalCorrdRPhi[
side].writeToFile(file,
"UPDATE", fmt::format(
"corrRPhi_side{}", sideName), sNThreads);
749 dumpMetaData(file,
"UPDATE",
false);
750 return er + ez + ephi;
753template <
typename DataT>
756 const std::string sideName = getSideName(
side);
757 const std::string_view treename{fmt::format(
"corrR_side{}", getSideName(
side))};
758 if (!checkGridFromFile(file, treename)) {
762 initContainer(mGlobalCorrdR[
side],
true);
763 initContainer(mGlobalCorrdZ[
side],
true);
764 initContainer(mGlobalCorrdRPhi[
side],
true);
765 mGlobalCorrdR[
side].initFromFile(file, treename, sNThreads);
766 mGlobalCorrdZ[
side].initFromFile(file, fmt::format(
"corrZ_side{}", sideName), sNThreads);
767 mGlobalCorrdRPhi[
side].initFromFile(file, fmt::format(
"corrRPhi_side{}", sideName), sNThreads);
771template <
typename DataT>
774 if (!mLocalCorrdR[
side].getNDataPoints()) {
775 LOGP(info,
"============== local corrections are not set! returning ==============");
778 const std::string sideName = getSideName(
side);
779 const int lCorrdR = mLocalCorrdR[
side].writeToFile(file, option, fmt::format(
"lcorrR_side{}", sideName), sNThreads);
780 const int lCorrdZ = mLocalCorrdZ[
side].writeToFile(file,
"UPDATE", fmt::format(
"lcorrZ_side{}", sideName), sNThreads);
781 const int lCorrdRPhi = mLocalCorrdRPhi[
side].writeToFile(file,
"UPDATE", fmt::format(
"lcorrRPhi_side{}", sideName), sNThreads);
782 dumpMetaData(file,
"UPDATE",
false);
783 return lCorrdR + lCorrdZ + lCorrdRPhi;
786template <
typename DataT>
789 const std::string sideName = getSideName(
side);
790 const std::string_view treename{fmt::format(
"lcorrR_side{}", getSideName(
side))};
791 if (!checkGridFromFile(file, treename)) {
794 initContainer(mLocalCorrdR[
side],
true);
795 initContainer(mLocalCorrdZ[
side],
true);
796 initContainer(mLocalCorrdRPhi[
side],
true);
797 const bool lCorrdR = mLocalCorrdR[
side].initFromFile(file, treename, sNThreads);
798 const bool lCorrdZ = mLocalCorrdZ[
side].initFromFile(file, fmt::format(
"lcorrZ_side{}", sideName), sNThreads);
799 const bool lCorrdRPhi = mLocalCorrdRPhi[
side].initFromFile(file, fmt::format(
"lcorrRPhi_side{}", sideName), sNThreads);
803template <
typename DataT>
806 if (!mLocalDistdR[
side].getNDataPoints()) {
807 LOGP(info,
"============== local distortions are not set! returning ==============");
810 const std::string sideName = getSideName(
side);
811 const int lDistdR = mLocalDistdR[
side].writeToFile(file, option, fmt::format(
"ldistR_side{}", sideName), sNThreads);
812 const int lDistdZ = mLocalDistdZ[
side].writeToFile(file,
"UPDATE", fmt::format(
"ldistZ_side{}", sideName), sNThreads);
813 const int lDistdRPhi = mLocalDistdRPhi[
side].writeToFile(file,
"UPDATE", fmt::format(
"ldistRPhi_side{}", sideName), sNThreads);
814 dumpMetaData(file,
"UPDATE",
false);
815 return lDistdR + lDistdZ + lDistdRPhi;
818template <
typename DataT>
821 if (!mLocalVecDistdR[
side].getNDataPoints()) {
822 LOGP(info,
"============== local distortion vectors are not set! returning ==============");
825 const std::string sideName = getSideName(
side);
826 const int lVecDistdR = mLocalVecDistdR[
side].writeToFile(file, option, fmt::format(
"lvecdistR_side{}", sideName), sNThreads);
827 const int lVecDistdZ = mLocalVecDistdZ[
side].writeToFile(file,
"UPDATE", fmt::format(
"lvecdistZ_side{}", sideName), sNThreads);
828 const int lVecDistdRPhi = mLocalVecDistdRPhi[
side].writeToFile(file,
"UPDATE", fmt::format(
"lvecdistRPhi_side{}", sideName), sNThreads);
829 dumpMetaData(file,
"UPDATE",
false);
830 return lVecDistdR + lVecDistdZ + lVecDistdRPhi;
833template <
typename DataT>
836 const std::string sideName = getSideName(
side);
837 const std::string_view treename{fmt::format(
"ldistR_side{}", getSideName(
side))};
838 if (!checkGridFromFile(file, treename)) {
841 initContainer(mLocalDistdR[
side],
true);
842 initContainer(mLocalDistdZ[
side],
true);
843 initContainer(mLocalDistdRPhi[
side],
true);
844 const bool lDistdR = mLocalDistdR[
side].initFromFile(file, treename, sNThreads);
845 const bool lDistdZ = mLocalDistdZ[
side].initFromFile(file, fmt::format(
"ldistZ_side{}", sideName), sNThreads);
846 const bool lDistdRPhi = mLocalDistdRPhi[
side].initFromFile(file, fmt::format(
"ldistRPhi_side{}", sideName), sNThreads);
850template <
typename DataT>
853 const std::string sideName = getSideName(
side);
854 const std::string_view treename{fmt::format(
"lvecdistR_side{}", getSideName(
side))};
855 if (!checkGridFromFile(file, treename)) {
858 initContainer(mLocalVecDistdR[
side],
true);
859 initContainer(mLocalVecDistdZ[
side],
true);
860 initContainer(mLocalVecDistdRPhi[
side],
true);
861 const bool lVecDistdR = mLocalVecDistdR[
side].initFromFile(file, treename, sNThreads);
862 const bool lVecDistdZ = mLocalVecDistdZ[
side].initFromFile(file, fmt::format(
"lvecdistZ_side{}", sideName), sNThreads);
863 const bool lVecDistdRPhi = mLocalVecDistdRPhi[
side].initFromFile(file, fmt::format(
"lvecdistRPhi_side{}", sideName), sNThreads);
867template <
typename DataT>
870 if (!mPotential[
side].getNDataPoints()) {
871 LOGP(info,
"============== potential not set! returning ==============");
874 int status = mPotential[
side].writeToFile(file, option, fmt::format(
"potential_side{}", getSideName(
side)), sNThreads);
875 dumpMetaData(file,
"UPDATE",
false);
879template <
typename DataT>
882 const std::string_view treename{fmt::format(
"potential_side{}", getSideName(
side))};
883 if (!checkGridFromFile(file, treename)) {
886 initContainer(mPotential[
side],
true);
887 mPotential[
side].initFromFile(file, treename, sNThreads);
891template <
typename DataT>
894 if (!mDensity[
side].getNDataPoints()) {
895 LOGP(info,
"============== space charge density are not set! returning ==============");
898 int status = mDensity[
side].writeToFile(file, option, fmt::format(
"density_side{}", getSideName(
side)), sNThreads);
899 dumpMetaData(file,
"UPDATE",
false);
903template <
typename DataT>
906 const std::string_view treename{fmt::format(
"density_side{}", getSideName(
side))};
907 if (!checkGridFromFile(file, treename)) {
910 initContainer(mDensity[
side],
true);
911 mDensity[
side].initFromFile(file, treename, sNThreads);
915template <
typename DataT>
918 if (option ==
"RECREATE") {
920 gSystem->Unlink(file.data());
922 dumpElectricFields(file,
side,
"UPDATE");
923 dumpPotential(file,
side,
"UPDATE");
924 dumpDensity(file,
side,
"UPDATE");
925 dumpGlobalDistortions(file,
side,
"UPDATE");
926 dumpGlobalCorrections(file,
side,
"UPDATE");
927 dumpLocalCorrections(file,
side,
"UPDATE");
928 dumpLocalDistortions(file,
side,
"UPDATE");
929 dumpLocalDistCorrVectors(file,
side,
"UPDATE");
932template <
typename DataT>
939template <
typename DataT>
942 TFile
f(file.data(), option.data());
943 if (!overwriteExisting &&
f.GetListOfKeys()->Contains(
"meta")) {
949 std::vector<float>
params{
static_cast<float>(mC0),
static_cast<float>(mC1),
static_cast<float>(mC2)};
950 auto helperA = mGrid3D[Side::A].getHelper();
951 auto helperC = mGrid3D[Side::C].getHelper();
954 ROOT::RDataFrame dFrame(1);
955 auto dfStore = dFrame.DefineSlotEntry(
"paramsC", [&
params =
params](
unsigned int, ULong64_t
entry) {
return params; });
956 dfStore = dfStore.DefineSlotEntry(
"grid_A", [&helperA = helperA](
unsigned int, ULong64_t
entry) {
return helperA; });
957 dfStore = dfStore.DefineSlotEntry(
"grid_C", [&helperC = helperC](
unsigned int, ULong64_t
entry) {
return helperC; });
958 dfStore = dfStore.DefineSlotEntry(
"BField", [field = mBField.getBField()](
unsigned int, ULong64_t
entry) { return field; });
959 dfStore = dfStore.DefineSlotEntry(
"metaInf", [meta = mMeta](
unsigned int, ULong64_t
entry) {
return meta; });
962 ROOT::RDF::RSnapshotOptions opt;
964 opt.fOverwriteIfExists =
true;
965 dfStore.Snapshot(
"meta", file, {
"paramsC",
"grid_A",
"grid_C",
"BField",
"metaInf"}, opt);
968template <
typename DataT>
976 TFile
f(file.data(),
"READ");
977 if (!
f.GetListOfKeys()->Contains(
"meta")) {
986 mGrid3D[Side::A] =
RegularGrid3D<DataT>(gridA.zmin, gridA.rmin, gridA.phimin, gridA.spacingZ, gridA.spacingR, gridA.spacingPhi, gridA.params);
987 mGrid3D[Side::C] =
RegularGrid3D<DataT>(gridC.zmin, gridC.rmin, gridC.phimin, gridC.spacingZ, gridC.spacingR, gridC.spacingPhi, gridC.params);
988 mBField.setBField(field);
991 ROOT::RDataFrame dFrame(
"meta", file);
992 dFrame.Foreach(readMeta, {
"paramsC",
"grid_A",
"grid_C",
"BField"});
994 const auto&
cols = dFrame.GetColumnNames();
995 if (std::find(
cols.begin(),
cols.end(),
"metaInf") !=
cols.end()) {
996 auto readMetaInf = [&mMeta = mMeta](
const SCMetaData& meta) {
999 dFrame.Foreach(readMetaInf, {
"metaInf"});
1002 LOGP(info,
"Setting meta data: mC0={} mC1={} mC2={}", mC0, mC1, mC2);
1003 mReadMetaData =
true;
1006template <
typename DataT>
1009 setDensityFromFile(file,
side);
1010 setPotentialFromFile(file,
side);
1011 setElectricFieldsFromFile(file,
side);
1012 setLocalDistortionsFromFile(file,
side);
1013 setLocalCorrectionsFromFile(file,
side);
1014 setGlobalDistortionsFromFile(file,
side);
1015 setGlobalCorrectionsFromFile(file,
side);
1016 setLocalDistCorrVectorsFromFile(file,
side);
1019template <
typename DataT>
1022 setFromFile(file, Side::A);
1023 setFromFile(file, Side::C);
1030template void o2::tpc::DataContainer3D<float>::dumpSlice(std::string_view, std::string_view, std::string_view, std::string_view, std::pair<unsigned short, unsigned short>, std::pair<unsigned short, unsigned short>, std::pair<unsigned short, unsigned short>,
const int);
1031template void o2::tpc::DataContainer3D<float>::dumpInterpolation(std::string_view, std::string_view, std::string_view, std::string_view, std::pair<float, float>, std::pair<float, float>, std::pair<float, float>,
const int,
const int,
const int,
const int);
1058template void o2::tpc::DataContainer3D<double>::dumpSlice(std::string_view, std::string_view, std::string_view, std::string_view, std::pair<unsigned short, unsigned short>, std::pair<unsigned short, unsigned short>, std::pair<unsigned short, unsigned short>,
const int);
1059template void o2::tpc::DataContainer3D<double>::dumpInterpolation(std::string_view, std::string_view, std::string_view, std::string_view, std::pair<float, float>, std::pair<float, float>, std::pair<float, float>,
const int,
const int,
const int,
const int);