Project
Loading...
Searching...
No Matches
SpaceCharge.h
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
18
19#ifndef ALICEO2_TPC_SPACECHARGE_H_
20#define ALICEO2_TPC_SPACECHARGE_H_
21
28#include "DataFormatsTPC/Defs.h"
29
30class TH3;
31class TH3D;
32class TH3F;
33class TH2F;
34
35namespace o2
36{
37
38namespace parameters
39{
40class GRPMagField;
41}
42
43namespace utils
44{
45class TreeStreamRedirector;
46}
47
48namespace tpc
49{
50
51class Sector;
52
53template <class T>
54class CalDet;
55
57enum class SCDistortionType : int {
58 SCDistortionsConstant = 0, // space-charge distortions constant over time
59 SCDistortionsRealistic = 1 // realistic evolution of space-charge distortions over time
60};
61
66
71template <typename DataT = double>
73{
78 using TH3DataT = std::conditional_t<std::is_same<DataT, double>::value, TH3D, TH3F>; // datatype for TH3 (TH3F for DataT==float and TH3D for DataT==double)
79
80 public:
88 SpaceCharge(const int bfield, const unsigned short nZVertices = 129, const unsigned short nRVertices = 129, const unsigned short nPhiVertices = 360, const bool initBuffers = false);
89
92
95
98
101 Simpson = 1,
102 Root = 2,
104 };
105
106 enum class Type {
107 Distortions = 0,
108 Corrections = 1
109 };
110
111 enum class GlobalDistType {
112 Standard = 0,
113 Fast = 1,
114 None = 2
115 };
116
121
122 enum class MisalignmentType {
125 RodShift
126 };
127
128 enum class FCType {
129 IFC,
130 OFC
131 };
132
135 void fillChargeDensityFromHisto(const TH3& hisSCDensity3D);
136
140 void fillChargeDensityFromHisto(const TH3& hisSCDensity3D_A, const TH3& hisSCDensity3D_C);
141
146 void fillChargeDensityFromHisto(const char* file, const char* nameA, const char* nameC);
147
150 void fillChargeDensityFromCalDet(const std::vector<CalDet<float>>& calSCDensity3D);
151
157 static void convertIDCsToCharge(std::vector<CalDet<float>>& idcZero, const CalDet<float>& mapIBF, const float ionDriftTimeMS = 200, const bool normToPadArea = true);
158
164 void fillChargeFromIDCs(std::vector<CalDet<float>>& idcZero, const CalDet<float>& mapIBF, const float ionDriftTimeMS = 200, const bool normToPadArea = true);
165
169 void fillChargeFromCalDet(const std::vector<CalDet<float>>& calCharge3D);
170
174 void fillChargeDensityFromFile(TFile& fInp, const char* name);
175
178 void calculateDistortionsCorrections(const o2::tpc::Side side, const bool calcVectors = false);
179
182 void setChargeDensityFromFormula(const AnalyticalFields<DataT>& formulaStruct);
183
187
191 void addBoundaryPotential(const SpaceCharge<DataT>& other, const Side side, const float scaling = 1);
192
194 void resetBoundaryPotentialToZeroInRangeZ(float zMin, float zMax, const Side side);
195
198 void setPotentialFromFormula(const AnalyticalFields<DataT>& formulaStruct);
199
203 void mirrorPotential(const Side sideRef, const Side sideMirrored);
204
208
210 void setSimNSector(const int nSectors);
211
213 static void unsetSimNSector();
214
218 void setDefaultStaticDistortionsGEMFrameChargeUp(const Side side, const DataT deltaPotential = 1000);
219
223 void setPotentialBoundaryGEMFrameAlongR(const std::function<DataT(DataT)>& potentialFunc, const Side side);
224
228 void setPotentialBoundaryGEMFrameIROCBottomAlongPhi(const std::function<DataT(DataT)>& potentialFunc, const Side side) { setPotentialBoundaryGEMFrameAlongPhi(potentialFunc, GEMstack::IROCgem, true, side); }
229
233 void setPotentialBoundaryGEMFrameIROCTopAlongPhi(const std::function<DataT(DataT)>& potentialFunc, const Side side) { setPotentialBoundaryGEMFrameAlongPhi(potentialFunc, GEMstack::IROCgem, false, side); }
234
238 void setPotentialBoundaryGEMFrameOROC1BottomAlongPhi(const std::function<DataT(DataT)>& potentialFunc, const Side side) { setPotentialBoundaryGEMFrameAlongPhi(potentialFunc, GEMstack::OROC1gem, true, side); }
239
243 void setPotentialBoundaryGEMFrameOROC1TopAlongPhi(const std::function<DataT(DataT)>& potentialFunc, const Side side) { setPotentialBoundaryGEMFrameAlongPhi(potentialFunc, GEMstack::OROC1gem, false, side); }
244
248 void setPotentialBoundaryGEMFrameOROC2BottomAlongPhi(const std::function<DataT(DataT)>& potentialFunc, const Side side) { setPotentialBoundaryGEMFrameAlongPhi(potentialFunc, GEMstack::OROC2gem, true, side); }
249
253 void setPotentialBoundaryGEMFrameOROC2TopAlongPhi(const std::function<DataT(DataT)>& potentialFunc, const Side side) { setPotentialBoundaryGEMFrameAlongPhi(potentialFunc, GEMstack::OROC2gem, false, side); }
254
258 void setPotentialBoundaryGEMFrameOROC3BottomAlongPhi(const std::function<DataT(DataT)>& potentialFunc, const Side side) { setPotentialBoundaryGEMFrameAlongPhi(potentialFunc, GEMstack::OROC3gem, true, side); }
259
263 void setPotentialBoundaryGEMFrameOROC3TopAlongPhi(const std::function<DataT(DataT)>& potentialFunc, const Side side) { setPotentialBoundaryGEMFrameAlongPhi(potentialFunc, GEMstack::OROC3gem, false, side); }
264
268 void setPotentialBoundaryGEMFrameOROC3ToOFCPhi(const std::function<DataT(DataT)>& potentialFunc, const Side side) { setPotentialBoundaryGEMFrameAlongPhi(potentialFunc, GEMstack::OROC3gem, false, side, true); }
269
271 void setPotentialBoundaryGEMFrameIROCToIFCPhi(const std::function<DataT(DataT)>& potentialFunc, const Side side) { setPotentialBoundaryGEMFrameAlongPhi(potentialFunc, GEMstack::IROCgem, true, side, true); }
272
276 void setPotentialBoundaryInnerRadius(const std::function<DataT(DataT)>& potentialFunc, const Side side);
277
281 void setPotentialBoundaryOuterRadius(const std::function<DataT(DataT)>& potentialFunc, const Side side);
282
287 void poissonSolver(const Side side, const DataT stoppingConvergence = 1e-6, const int symmetry = 0);
288
292 void poissonSolver(const DataT stoppingConvergence = 1e-6, const int symmetry = 0);
293
296 void calcEField(const Side side);
297
300 void setEFieldFromFormula(const AnalyticalFields<DataT>& formulaStruct);
301
305 void scaleChargeDensity(const DataT scalingFactor, const Side side) { mDensity[side] *= scalingFactor; }
306
309 void scaleChargeDensitySector(const float scalingFactor, const Sector sector);
310
312 void scaleChargeDensityStack(const float scalingFactor, const Sector sector, const GEMstack stack);
313
317 void scalePotential(const DataT scalingFactor, const Side side) { mPotential[side] *= scalingFactor; }
318
321 void addChargeDensity(const SpaceCharge<DataT>& otherSC);
322
324 void addGlobalCorrections(const SpaceCharge<DataT>& otherSC, const Side side);
325
330 void downSampleObject(const int nZNew, const int nRNew, const int nPhiNew);
331
335 template <typename ElectricFields = AnalyticalFields<DataT>>
336 void calcLocalDistortionsCorrections(const Type type, const ElectricFields& formulaStruct);
337
340 template <typename ElectricFields = AnalyticalFields<DataT>>
341 void calcLocalDistortionCorrectionVector(const ElectricFields& formulaStruct);
342
347 template <typename ElectricFields = AnalyticalFields<DataT>>
349
353 template <typename Fields = AnalyticalFields<DataT>>
354 void calcGlobalCorrections(const Fields& formulaStruct, const int type = 3);
355
358
362 template <typename Fields = AnalyticalFields<DataT>>
363 void calcGlobalDistortions(const Fields& formulaStruct, const int maxIterations = 3 * sSteps * 129);
364
365 void init();
366
375 void calcGlobalDistWithGlobalCorrIterative(const DistCorrInterpolator<DataT>& globCorr, const int maxIter = 100, const DataT approachZ = 1, const DataT approachR = 1, const DataT approachPhi = 1, const DataT diffCorr = 50e-6, const SpaceCharge<DataT>* scSCale = nullptr, float scale = 0);
376
380 void calcGlobalDistWithGlobalCorrIterative(const Side side, const SpaceCharge<DataT>* scSCale = nullptr, float scale = 0, const int maxIter = 100, const DataT approachZ = 1, const DataT approachR = 1, const DataT approachPhi = 1, const DataT diffCorr = 50e-6);
381 void calcGlobalDistWithGlobalCorrIterative(const SpaceCharge<DataT>* scSCale = nullptr, float scale = 0, const int maxIter = 100, const DataT approachZ = 1, const DataT approachR = 1, const DataT approachPhi = 1, const DataT diffCorr = 50e-6);
382
386 void calcGlobalCorrWithGlobalDistIterative(const Side side, const SpaceCharge<DataT>* scSCale = nullptr, float scale = 0, const int maxIter = 100, const DataT approachZ = 1, const DataT approachR = 1, const DataT approachPhi = 1, const DataT diffCorr = 50e-6);
387 void calcGlobalCorrWithGlobalDistIterative(const SpaceCharge<DataT>* scSCale = nullptr, float scale = 0, const int maxIter = 100, const DataT approachZ = 1, const DataT approachR = 1, const DataT approachPhi = 1, const DataT diffCorr = 50e-6);
388
393 void calcGlobalDistWithGlobalCorrIterativeLinearCartesian(const Side side, const SpaceCharge<DataT>* scSCale = nullptr, float scale = 0, const int maxIter = 100, const DataT approachX = 1, const DataT approachY = 1, const DataT approachZ = 1, const DataT diffCorr = 50e-6);
394 void calcGlobalDistWithGlobalCorrIterativeLinearCartesian(const SpaceCharge<DataT>* scSCale = nullptr, float scale = 0, const int maxIter = 100, const DataT approachX = 1, const DataT approachY = 1, const DataT approachZ = 1, const DataT diffCorr = 50e-6);
395
400 void calcGlobalCorrWithGlobalDistIterativeLinearCartesian(const Side side, const SpaceCharge<DataT>* scSCale = nullptr, float scale = 0, const int maxIter = 100, const DataT approachX = 1, const DataT approachY = 1, const DataT approachZ = 1, const DataT diffCorr = 50e-6);
401 void calcGlobalCorrWithGlobalDistIterativeLinearCartesian(const SpaceCharge<DataT>* scSCale = nullptr, float scale = 0, const int maxIter = 100, const DataT approachX = 1, const DataT approachY = 1, const DataT approachZ = 1, const DataT diffCorr = 50e-6);
402
404 unsigned short getNZVertices() const { return mParamGrid.NZVertices; }
405
407 unsigned short getNRVertices() const { return mParamGrid.NRVertices; }
408
410 unsigned short getNPhiVertices() const { return mParamGrid.NPhiVertices; }
411
413 auto getC0() const { return mC0; }
414
416 auto getC1() const { return mC1; }
417
419 auto getC2() const { return mC2; }
420
422 int getBField() const { return mBField.getBField(); }
423
424 const auto& getPotential(const Side side) const& { return mPotential[side]; }
425
427 void setPotential(int iz, int ir, int iphi, Side side, float val);
428
433 DataT getDensityCyl(const DataT z, const DataT r, const DataT phi, const Side side) const;
434
436 std::vector<float> getDensityCyl(const std::vector<DataT>& z, const std::vector<DataT>& r, const std::vector<DataT>& phi, const Side side) const;
437
442 DataT getPotentialCyl(const DataT z, const DataT r, const DataT phi, const Side side) const;
443
445 std::vector<float> getPotentialCyl(const std::vector<DataT>& z, const std::vector<DataT>& r, const std::vector<DataT>& phi, const Side side) const;
446
454 void getElectricFieldsCyl(const DataT z, const DataT r, const DataT phi, const Side side, DataT& eZ, DataT& eR, DataT& ePhi) const;
455
463 void getLocalCorrectionsCyl(const DataT z, const DataT r, const DataT phi, const Side side, DataT& lcorrZ, DataT& lcorrR, DataT& lcorrRPhi) const;
464
472 void getLocalCorrectionsCyl(const std::vector<DataT>& z, const std::vector<DataT>& r, const std::vector<DataT>& phi, const Side side, std::vector<DataT>& lcorrZ, std::vector<DataT>& lcorrR, std::vector<DataT>& lcorrRPhi) const;
473
481 void getCorrectionsCyl(const DataT z, const DataT r, const DataT phi, const Side side, DataT& corrZ, DataT& corrR, DataT& corrRPhi) const;
482
490 void getCorrectionsCyl(const std::vector<DataT>& z, const std::vector<DataT>& r, const std::vector<DataT>& phi, const Side side, std::vector<DataT>& corrZ, std::vector<DataT>& corrR, std::vector<DataT>& corrRPhi) const;
491
499 void getCorrections(const DataT x, const DataT y, const DataT z, const Side side, DataT& corrX, DataT& corrY, DataT& corrZ) const;
500
508 void getCorrectionsAnalytical(const DataT x, const DataT y, const DataT z, const Side side, DataT& corrX, DataT& corrY, DataT& corrZ) const { getDistortionsCorrectionsAnalytical(x, y, z, side, corrX, corrY, corrZ, false); }
509
517 void getLocalDistortionsCyl(const DataT z, const DataT r, const DataT phi, const Side side, DataT& ldistZ, DataT& ldistR, DataT& ldistRPhi) const;
518
526 void getLocalDistortionsCyl(const std::vector<DataT>& z, const std::vector<DataT>& r, const std::vector<DataT>& phi, const Side side, std::vector<DataT>& ldistZ, std::vector<DataT>& ldistR, std::vector<DataT>& ldistRPhi) const;
527
535 void getLocalDistortionVectorCyl(const DataT z, const DataT r, const DataT phi, const Side side, DataT& lvecdistZ, DataT& lvecdistR, DataT& lvecdistRPhi) const;
536
544 void getLocalDistortionVectorCyl(const std::vector<DataT>& z, const std::vector<DataT>& r, const std::vector<DataT>& phi, const Side side, std::vector<DataT>& lvecdistZ, std::vector<DataT>& lvecdistR, std::vector<DataT>& lvecdistRPhi) const;
545
553 void getLocalCorrectionVectorCyl(const DataT z, const DataT r, const DataT phi, const Side side, DataT& lveccorrZ, DataT& lveccorrR, DataT& lveccorrRPhi) const;
554
562 void getLocalCorrectionVectorCyl(const std::vector<DataT>& z, const std::vector<DataT>& r, const std::vector<DataT>& phi, const Side side, std::vector<DataT>& lveccorrZ, std::vector<DataT>& lveccorrR, std::vector<DataT>& lveccorrRPhi) const;
563
571 void getDistortionsCyl(const DataT z, const DataT r, const DataT phi, const Side side, DataT& distZ, DataT& distR, DataT& distRPhi) const;
572
580 void getDistortionsCyl(const std::vector<DataT>& z, const std::vector<DataT>& r, const std::vector<DataT>& phi, const Side side, std::vector<DataT>& distZ, std::vector<DataT>& distR, std::vector<DataT>& distRPhi) const;
581
589 void getDistortions(const DataT x, const DataT y, const DataT z, const Side side, DataT& distX, DataT& distY, DataT& distZ) const;
590
598 void getDistortionsAnalytical(const DataT x, const DataT y, const DataT z, const Side side, DataT& distX, DataT& distY, DataT& distZ) const { getDistortionsCorrectionsAnalytical(x, y, z, side, distX, distY, distZ, true); }
599
601 void setDistortionsCorrectionsAnalytical(const AnalyticalDistCorr<DataT>& formula) { mAnaDistCorr = formula; }
602
604 const auto& getDistortionsCorrectionsAnalytical() const& { return mAnaDistCorr; }
605
607 void setUseAnalyticalDistCorr(const bool useAna) { mUseAnaDistCorr = useAna; }
608
610 bool getUseAnalyticalDistCorr() const { return mUseAnaDistCorr; }
611
613 static DataT getRadiusFromCartesian(const DataT x, const DataT y) { return std::sqrt(x * x + y * y); }
614
616 static DataT getPhiFromCartesian(const DataT x, const DataT y) { return std::atan2(y, x); }
617
619 static DataT getXFromPolar(const DataT r, const DataT phi) { return r * std::cos(phi); }
620
622 static DataT getYFromPolar(const DataT r, const DataT phi) { return r * std::sin(phi); }
623
627
632 void distortElectron(GlobalPosition3D& point, const SpaceCharge<DataT>* scSCale = nullptr, float scale = 0) const;
633
639 void setDistortionLookupTables(const DataContainer& distdZ, const DataContainer& distdR, const DataContainer& distdRPhi, const Side side);
640
644 void setFromFile(std::string_view file, const Side side);
645
648 void setFromFile(std::string_view file);
649
651 DataT getGridSpacingR(const Side side) const { return mGrid3D[side].getSpacingR(); }
652
654 DataT getGridSpacingZ(const Side side) const { return mGrid3D[side].getSpacingZ(); }
655
657 DataT getGridSpacingPhi(const Side side) const { return mGrid3D[side].getSpacingPhi(); }
658
661
663 DataT getRMin(const Side side) const { return mGrid3D[side].getGridMinR(); }
664
666 DataT getZMin(const Side side) const { return mGrid3D[side].getGridMinZ(); }
667
669 DataT getPhiMin(const Side side) const { return mGrid3D[side].getGridMinPhi(); }
670
672 DataT getRMax(const Side side) const { return mGrid3D[side].getGridMaxR(); };
673
675 DataT getZMax(const Side side) const { return mGrid3D[side].getGridMaxZ(); }
676
678 DataT getPhiMax(const Side side) const { return mGrid3D[side].getGridMaxPhi(); }
679
680 // get side of TPC for z coordinate TODO rewrite this
681 static Side getSide(const DataT z) { return ((z >= 0) ? Side::A : Side::C); }
682
684 const RegularGrid& getGrid3D(const Side side) const { return mGrid3D[side]; }
685
689
693
697
701
705
711 DataT getLocalDistR(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mLocalDistdR[side](iz, ir, iphi); }
712
718 DataT getLocalDistZ(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mLocalDistdZ[side](iz, ir, iphi); }
719
725 DataT getLocalDistRPhi(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mLocalDistdRPhi[side](iz, ir, iphi); }
726
732 DataT getLocalVecDistR(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mLocalVecDistdR[side](iz, ir, iphi); }
733
739 DataT getLocalVecDistZ(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mLocalVecDistdZ[side](iz, ir, iphi); }
740
746 DataT getLocalVecDistRPhi(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mLocalVecDistdRPhi[side](iz, ir, iphi); }
747
753 DataT getLocalCorrR(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mLocalCorrdR[side](iz, ir, iphi); }
754
760 DataT getLocalCorrZ(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mLocalCorrdZ[side](iz, ir, iphi); }
761
767 DataT getLocalCorrRPhi(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mLocalCorrdRPhi[side](iz, ir, iphi); }
768
774 DataT getLocalVecCorrR(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return -mLocalVecDistdR[side](iz, ir, iphi); }
775
781 DataT getLocalVecCorrZ(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return -mLocalVecDistdZ[side](iz, ir, iphi); }
782
788 DataT getLocalVecCorrRPhi(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return -mLocalVecDistdRPhi[side](iz, ir, iphi); }
789
795 DataT getGlobalDistR(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mGlobalDistdR[side](iz, ir, iphi); }
796
802 DataT getGlobalDistZ(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mGlobalDistdZ[side](iz, ir, iphi); }
803
809 DataT getGlobalDistRPhi(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mGlobalDistdRPhi[side](iz, ir, iphi); }
810
816 DataT getGlobalCorrR(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mGlobalCorrdR[side](iz, ir, iphi); }
817
823 DataT getGlobalCorrZ(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mGlobalCorrdZ[side](iz, ir, iphi); }
824
830 DataT getGlobalCorrRPhi(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mGlobalCorrdRPhi[side](iz, ir, iphi); }
831
837 DataT getEr(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mElectricFieldEr[side](iz, ir, iphi); }
838
844 DataT getEz(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mElectricFieldEz[side](iz, ir, iphi); }
845
851 DataT getEphi(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mElectricFieldEphi[side](iz, ir, iphi); }
852
858 DataT getDensity(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mDensity[side](iz, ir, iphi); }
859
865 DataT getPotential(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mPotential[side](iz, ir, iphi); }
866
868 static int getStepWidth() { return 1 / sSteps; }
869
872 DataT getPhiVertex(const size_t indexPhi, const Side side) const { return mGrid3D[side].getPhiVertex(indexPhi); }
873
876 DataT getRVertex(const size_t indexR, const Side side) const { return mGrid3D[side].getRVertex(indexR); }
877
880 DataT getZVertex(const size_t indexZ, const Side side) const { return mGrid3D[side].getZVertex(indexZ); }
881
885 void setOmegaTauT1T2(const DataT omegaTau = 0.32f, const DataT t1 = 1, const DataT t2 = 1);
886
889 void setC0C1(const DataT c0, const DataT c1)
890 {
891 mC0 = c0;
892 mC1 = c1;
893 }
894
896 void setC2(const DataT c2) { mC0 = c2; }
897
900 void initBField(const int field);
901
903 void setSimExBMisalignment(const bool simExBMisalignment) { mSimExBMisalignment = simExBMisalignment; }
904
906 bool getSimExBMisalignment() const { return mSimExBMisalignment; }
907
909 void setSimEDistortions(const bool simEDistortions) { mSimEDistortions = simEDistortions; }
910
912 bool getSimEDistortions() const { return mSimEDistortions; }
913
916 static void setNStep(const int nSteps) { sSteps = nSteps; }
917
918 static int getNStep() { return sSteps; }
919
921 static int getNThreads() { return sNThreads; }
922
924 static void setNThreads(const int nThreads) { sNThreads = nThreads; }
925
928 static void setNumericalIntegrationStrategy(const IntegrationStrategy strategy) { sNumericalIntegrationStrategy = strategy; }
929 static IntegrationStrategy getNumericalIntegrationStrategy() { return sNumericalIntegrationStrategy; }
930
931 static void setGlobalDistType(const GlobalDistType globalDistType) { sGlobalDistType = globalDistType; }
932 static GlobalDistType getGlobalDistType() { return sGlobalDistType; }
933
934 static void setGlobalDistCorrMethod(const GlobalDistCorrMethod globalDistCorrMethod) { sGlobalDistCorrCalcMethod = globalDistCorrMethod; }
935 static GlobalDistCorrMethod getGlobalDistCorrMethod() { return sGlobalDistCorrCalcMethod; }
936
937 static void setSimpsonNIteratives(const int nIter) { sSimpsonNIteratives = nIter; }
938 static int getSimpsonNIteratives() { return sSimpsonNIteratives; }
939
942 static void setSCDistortionType(SCDistortionType distortionType) { sSCDistortionType = distortionType; }
944 static SCDistortionType getSCDistortionType() { return sSCDistortionType; }
945
946 void setUseInitialSCDensity(const bool useInitialSCDensity) { mUseInitialSCDensity = useInitialSCDensity; }
947
952 void dumpToFile(std::string_view file, const Side side, std::string_view option) const;
953
956 void dumpToFile(std::string_view file) const;
957
962 void dumpMetaData(std::string_view file, std::string_view option, const bool overwriteExisting = false) const;
963
966 void readMetaData(std::string_view file);
967
985 void dumpToTree(const char* outFileName, const Side side, const int nZPoints = 50, const int nRPoints = 150, const int nPhiPoints = 180, const bool randomize = false) const;
986
991 void dumpToTree(const char* outFileName, const o2::tpc::Sector& sector, const int nZPoints = 50) const;
992
997 int dumpElectricFields(std::string_view file, const Side side, std::string_view option) const;
998
1002 void setElectricFieldsFromFile(std::string_view file, const Side side);
1003
1008 int dumpPotential(std::string_view file, const Side side, std::string_view option) const;
1009
1013 void setPotentialFromFile(std::string_view file, const Side side);
1014
1021 void fillPotential(const DataT potential, const size_t iz, const size_t ir, const size_t iphi, const Side side) { mPotential[side](iz, ir, iphi) = potential; }
1022
1027 int dumpDensity(std::string_view file, const Side side, std::string_view option) const;
1028
1032 void setDensityFromFile(std::string_view file, const Side side);
1033
1040 void fillDensity(const DataT density, const size_t iz, const size_t ir, const size_t iphi, const Side side) { mDensity[side](iz, ir, iphi) = density; }
1041
1043 void averageDensityPerSector(const Side side);
1044
1049 int dumpGlobalDistortions(std::string_view file, const Side side, std::string_view option) const;
1050
1053 int dumpAnalyticalCorrectionsDistortions(TFile& outf) const;
1054
1057 void setAnalyticalCorrectionsDistortionsFromFile(std::string_view inpf);
1058
1062 void setGlobalDistortionsFromFile(std::string_view file, const Side side);
1063
1067 template <typename DataTIn = DataT>
1068 void setGlobalDistortionsFromFile(TFile& inpf, const Side side);
1069
1074 int dumpGlobalCorrections(std::string_view file, const Side side, std::string_view option) const;
1075
1079 int dumpGlobalCorrections(TFile& outf, const Side side) const;
1080
1084 void setGlobalCorrectionsFromFile(std::string_view file, const Side side);
1085
1089 template <typename DataTIn = DataT>
1090 void setGlobalCorrectionsFromFile(TFile& inpf, const Side side);
1091
1096 int dumpLocalCorrections(std::string_view file, const Side side, std::string_view option) const;
1097
1101 void setLocalCorrectionsFromFile(std::string_view file, const Side side);
1102
1107 int dumpLocalDistortions(std::string_view file, const Side side, std::string_view option) const;
1108
1113 int dumpLocalDistCorrVectors(std::string_view file, const Side side, std::string_view option) const;
1114
1118 void setLocalDistortionsFromFile(std::string_view file, const Side side);
1119
1123 void setLocalDistCorrVectorsFromFile(std::string_view file, const Side side);
1124
1127 DataT regulateZ(const DataT posZ, const Side side) const { return mGrid3D[side].clampToGrid(posZ, 0); }
1128
1130 DataT regulateR(const DataT posR, const Side side) const;
1131
1133 DataT regulatePhi(const DataT posPhi, const Side side) const { return mGrid3D[side].clampToGridCircular(posPhi, 2); }
1134
1140 std::vector<std::pair<std::vector<o2::math_utils::Point3D<float>>, std::array<DataT, 3>>> calculateElectronDriftPath(const std::vector<GlobalPosition3D>& elePos, const int nSamplingPoints, const std::string_view outFile = "electron_tracks.root") const;
1141
1148 static void makeElectronDriftPathGif(const char* inpFile, TH2F& hBorder, const int type = 0, const int gifSpeed = 2, const int maxsamplingpoints = 100, const char* outName = "electron_drift_path");
1149
1152 static void normalizeHistoQVEps0(TH3& histoIonsPhiRZ);
1153
1155 static int getOMPMaxThreads();
1156
1161 bool checkGridFromFile(std::string_view file, std::string_view tree);
1162
1165 void setDeltaVoltageCopperRodShiftIFC(const float deltaPot, const Side side, const int sector) { initRodAlignmentVoltages(MisalignmentType::RodShift, FCType::IFC, sector, side, deltaPot); }
1166
1169 void setDeltaVoltageCopperRodShiftOFC(const float deltaPot, const Side side, const int sector) { initRodAlignmentVoltages(MisalignmentType::RodShift, FCType::OFC, sector, side, deltaPot); }
1170
1173 void setDeltaVoltageStripsShiftIFC(const float deltaPot, const Side side, const int sector) { initRodAlignmentVoltages(MisalignmentType::ShiftedClip, FCType::IFC, sector, side, deltaPot); }
1174
1177 void setDeltaVoltageStripsShiftOFC(const float deltaPot, const Side side, const int sector) { initRodAlignmentVoltages(MisalignmentType::ShiftedClip, FCType::OFC, sector, side, deltaPot); }
1178
1182 void setDeltaVoltageRotatedClipIFC(const float deltaPot, const Side side, const int sector) { initRodAlignmentVoltages(MisalignmentType::RotatedClip, FCType::IFC, sector, side, deltaPot); }
1183
1187 void setDeltaVoltageRotatedClipOFC(const float deltaPot, const Side side, const int sector) { initRodAlignmentVoltages(MisalignmentType::RotatedClip, FCType::OFC, sector, side, deltaPot); }
1188
1194 void setIFCChargeUpRisingPot(const float deltaPot, const float zMaxDeltaPot, const int type, const float zStart, const float offs, const Side side);
1195
1201 void setIFCChargeUpFallingPot(const float deltaPot, const float zMaxDeltaPot, const int type, const float zEnd, const float offs, const Side side);
1202
1205 void setGlobalCorrections(const std::function<void(int sector, DataT gx, DataT gy, DataT gz, DataT& gCx, DataT& gCy, DataT& gCz)>& gCorr, const Side side);
1206
1209 void setGlobalDistortions(const std::function<void(int sector, DataT gx, DataT gy, DataT gz, DataT& gCx, DataT& gCy, DataT& gCz)>& gDist, const Side side);
1210
1215 void setROCMisalignmentShiftZ(const int sector, const int type, const float potential);
1216
1222 void setROCMisalignmentRotationAlongX(const int sector, const int type, const float potentialMin, const float potentialMax);
1223
1229 void setROCMisalignmentRotationAlongY(const int sector, const int type, const float potentialMin, const float potentialMax);
1230
1234 void subtractGlobalCorrections(const SpaceCharge<DataT>& otherSC, const Side side);
1235
1238 void subtractGlobalDistortions(const SpaceCharge<DataT>& otherSC, const Side side);
1239
1242 void scaleCorrections(const float scaleFac, const Side side);
1243
1245 void setMetaData(const SCMetaData& meta) { mMeta = meta; }
1246 const auto& getMetaData() const { return mMeta; }
1247 void printMetaData() const { mMeta.print(); }
1248 float getMeanLumi() const { return mMeta.meanLumi; }
1249 void setMeanLumi(float lumi) { mMeta.meanLumi = lumi; }
1251
1256 float getDCAr(float tgl, const int nPoints, const float phi, float rStart = -1, o2::utils::TreeStreamRedirector* pcstream = nullptr) const;
1257
1259 size_t getNearestPhiVertex(const DataT phi, const Side side) const { return std::round(phi / getGridSpacingPhi(side)); }
1260
1262 size_t getNearestRVertex(const DataT r, const Side side) const { return std::round((r - getRMin(side)) / getGridSpacingR(side) + 0.5); }
1263
1265 size_t getPhiBinsGapFrame(const Side side) const;
1266
1267 private:
1268 ParamSpaceCharge mParamGrid{};
1269 inline static int sNThreads{getOMPMaxThreads()};
1270 inline static IntegrationStrategy sNumericalIntegrationStrategy{IntegrationStrategy::SimpsonIterative};
1271 inline static int sSimpsonNIteratives{3};
1272 inline static int sSteps{1};
1273 inline static GlobalDistType sGlobalDistType{GlobalDistType::Fast};
1274 inline static GlobalDistCorrMethod sGlobalDistCorrCalcMethod{GlobalDistCorrMethod::LocalDistCorr};
1275 inline static SCDistortionType sSCDistortionType{SCDistortionType::SCDistortionsConstant};
1276
1277 DataT mC0 = 0;
1278 DataT mC1 = 0;
1279 DataT mC2 = 0;
1280 static constexpr int FNSIDES = SIDES;
1281 bool mUseInitialSCDensity{false};
1282 bool mInitLookUpTables{false};
1283 bool mSimExBMisalignment{false};
1284 bool mSimEDistortions{true};
1285 bool mReadMetaData{false};
1287
1288 DataContainer mLocalDistdR[FNSIDES]{};
1289 DataContainer mLocalDistdZ[FNSIDES]{};
1290 DataContainer mLocalDistdRPhi[FNSIDES]{};
1291 DataContainer mLocalVecDistdR[FNSIDES]{};
1292 DataContainer mLocalVecDistdZ[FNSIDES]{};
1293 DataContainer mLocalVecDistdRPhi[FNSIDES]{};
1294 DataContainer mLocalCorrdR[FNSIDES]{};
1295 DataContainer mLocalCorrdZ[FNSIDES]{};
1296 DataContainer mLocalCorrdRPhi[FNSIDES]{};
1297 DataContainer mGlobalDistdR[FNSIDES]{};
1298 DataContainer mGlobalDistdZ[FNSIDES]{};
1299 DataContainer mGlobalDistdRPhi[FNSIDES]{};
1300 DataContainer mGlobalCorrdR[FNSIDES]{};
1301 DataContainer mGlobalCorrdZ[FNSIDES]{};
1302 DataContainer mGlobalCorrdRPhi[FNSIDES]{};
1303 DataContainer mDensity[FNSIDES]{};
1304 DataContainer mPotential[FNSIDES]{};
1305 DataContainer mElectricFieldEr[FNSIDES]{};
1306 DataContainer mElectricFieldEz[FNSIDES]{};
1307 DataContainer mElectricFieldEphi[FNSIDES]{};
1308
1309 TriCubic mInterpolatorPotential[FNSIDES]{{mPotential[Side::A], mGrid3D[Side::A]}, {mPotential[Side::C], mGrid3D[Side::C]}};
1310 TriCubic mInterpolatorDensity[FNSIDES]{{mDensity[Side::A], mGrid3D[Side::A]}, {mDensity[Side::C], mGrid3D[Side::C]}};
1311 DistCorrInterpolator<DataT> mInterpolatorGlobalCorr[FNSIDES]{{mGlobalCorrdR[Side::A], mGlobalCorrdZ[Side::A], mGlobalCorrdRPhi[Side::A], mGrid3D[Side::A], Side::A}, {mGlobalCorrdR[Side::C], mGlobalCorrdZ[Side::C], mGlobalCorrdRPhi[Side::C], mGrid3D[Side::C], Side::C}};
1312 DistCorrInterpolator<DataT> mInterpolatorLocalCorr[FNSIDES]{{mLocalCorrdR[Side::A], mLocalCorrdZ[Side::A], mLocalCorrdRPhi[Side::A], mGrid3D[Side::A], Side::A}, {mLocalCorrdR[Side::C], mLocalCorrdZ[Side::C], mLocalCorrdRPhi[Side::C], mGrid3D[Side::C], Side::C}};
1313 DistCorrInterpolator<DataT> mInterpolatorGlobalDist[FNSIDES]{{mGlobalDistdR[Side::A], mGlobalDistdZ[Side::A], mGlobalDistdRPhi[Side::A], mGrid3D[Side::A], Side::A}, {mGlobalDistdR[Side::C], mGlobalDistdZ[Side::C], mGlobalDistdRPhi[Side::C], mGrid3D[Side::C], Side::C}};
1314 DistCorrInterpolator<DataT> mInterpolatorLocalDist[FNSIDES]{{mLocalDistdR[Side::A], mLocalDistdZ[Side::A], mLocalDistdRPhi[Side::A], mGrid3D[Side::A], Side::A}, {mLocalDistdR[Side::C], mLocalDistdZ[Side::C], mLocalDistdRPhi[Side::C], mGrid3D[Side::C], Side::C}};
1315 DistCorrInterpolator<DataT> mInterpolatorLocalVecDist[FNSIDES]{{mLocalVecDistdR[Side::A], mLocalVecDistdZ[Side::A], mLocalVecDistdRPhi[Side::A], mGrid3D[Side::A], Side::A}, {mLocalVecDistdR[Side::C], mLocalVecDistdZ[Side::C], mLocalVecDistdRPhi[Side::C], mGrid3D[Side::C], Side::C}};
1316 NumericalFields<DataT> mInterpolatorEField[FNSIDES]{{mElectricFieldEr[Side::A], mElectricFieldEz[Side::A], mElectricFieldEphi[Side::A], mGrid3D[Side::A], Side::A}, {mElectricFieldEr[Side::C], mElectricFieldEz[Side::C], mElectricFieldEphi[Side::C], mGrid3D[Side::C], Side::C}};
1317 AnalyticalDistCorr<DataT> mAnaDistCorr;
1318 bool mUseAnaDistCorr{false};
1319 BField mBField{};
1320 SCMetaData mMeta{};
1321
1324 bool isCloseToZero(const DataT valA, const DataT valB) const { return std::abs(valA + valB) < static_cast<DataT>(0.01); }
1325
1326 static int getSign(const Side side) { return side == Side::C ? -1 : 1; }
1327
1329 DataT getInvSpacingZ(const Side side) const { return mGrid3D[side].getInvSpacingZ(); }
1330
1332 DataT getInvSpacingR(const Side side) const { return mGrid3D[side].getInvSpacingR(); }
1333
1335 DataT getInvSpacingPhi(const Side side) const { return mGrid3D[side].getInvSpacingPhi(); }
1336
1338 DataT getRMinSim(const Side side) const { return getRMin(side) - 4 * getGridSpacingR(side); }
1339
1341 DataT getRMaxSim(const Side side) const { return getRMax(side) + 2 * getGridSpacingR(side); }
1342
1343 std::string getSideName(const Side side) const { return side == Side::A ? "A" : "C"; }
1344
1346 template <typename Fields = AnalyticalFields<DataT>>
1347 void calcDistCorr(const DataT p1r, const DataT p1phi, const DataT p1z, const DataT p2z, DataT& ddR, DataT& ddPhi, DataT& ddZ, const Fields& formulaStruct, const bool localDistCorr, const Side side) const;
1348
1350 void langevinCylindricalE(DataT& ddR, DataT& ddPhi, DataT& ddZ, const DataT radius, const DataT localIntErOverEz, const DataT localIntEPhiOverEz, const DataT localIntDeltaEz) const;
1351
1353 void langevinCylindricalB(DataT& ddR, DataT& ddPhi, const DataT radius, const DataT localIntBrOverBz, const DataT localIntBPhiOverBz) const;
1354
1356 template <typename Fields = AnalyticalFields<DataT>>
1357 void integrateEFieldsRoot(const DataT p1r, const DataT p1phi, const DataT p1z, const DataT p2z, DataT& localIntErOverEz, DataT& localIntEPhiOverEz, DataT& localIntDeltaEz, const Fields& formulaStruct, const DataT ezField, const Side side) const;
1358
1360 template <typename Fields = AnalyticalFields<DataT>>
1361 void integrateEFieldsTrapezoidal(const DataT p1r, const DataT p1phi, const DataT p1z, const DataT p2z, DataT& localIntErOverEz, DataT& localIntEPhiOverEz, DataT& localIntDeltaEz, const Fields& formulaStruct, const DataT ezField, const Side side) const;
1362
1364 template <typename Fields = AnalyticalFields<DataT>>
1365 void integrateEFieldsSimpson(const DataT p1r, const DataT p1phi, const DataT p1z, const DataT p2z, DataT& localIntErOverEz, DataT& localIntEPhiOverEz, DataT& localIntDeltaEz, const Fields& formulaStruct, const DataT ezField, const Side side) const;
1366
1368 template <typename Fields = AnalyticalFields<DataT>>
1369 void integrateEFieldsSimpsonIterative(const DataT p1r, const DataT p2r, const DataT p1phi, const DataT p2phi, const DataT p1z, const DataT p2z, DataT& localIntErOverEz, DataT& localIntEPhiOverEz, DataT& localIntDeltaEz, const Fields& formulaStruct, const DataT ezField, const Side side) const;
1370
1372 void processGlobalDistCorr(const DataT radius, const DataT phi, const DataT z0Tmp, const DataT z1Tmp, DataT& ddR, DataT& ddPhi, DataT& ddZ, const AnalyticalFields<DataT>& formulaStruct) const { calcDistCorr(radius, phi, z0Tmp, z1Tmp, ddR, ddPhi, ddZ, formulaStruct, false, formulaStruct.getSide()); }
1373
1375 void processGlobalDistCorr(const DataT radius, const DataT phi, const DataT z0Tmp, const DataT z1Tmp, DataT& ddR, DataT& ddPhi, DataT& ddZ, const NumericalFields<DataT>& formulaStruct) const { calcDistCorr(radius, phi, z0Tmp, z1Tmp, ddR, ddPhi, ddZ, formulaStruct, false, formulaStruct.getSide()); }
1376
1378 void processGlobalDistCorr(const DataT radius, const DataT phi, const DataT z0Tmp, [[maybe_unused]] const DataT z1Tmp, DataT& ddR, DataT& ddPhi, DataT& ddZ, const DistCorrInterpolator<DataT>& localDistCorr) const
1379 {
1380 ddR = localDistCorr.evaldR(z0Tmp, radius, phi);
1381 ddZ = localDistCorr.evaldZ(z0Tmp, radius, phi);
1382 ddPhi = localDistCorr.evaldRPhi(z0Tmp, radius, phi) / radius;
1383 }
1384
1386 void dumpElectronTracksToTree(const std::vector<std::pair<std::vector<o2::math_utils::Point3D<float>>, std::array<DataT, 3>>>& electronTracks, const int nSamplingPoints, const char* outFile) const;
1387
1389 void setPotentialBoundaryGEMFrameAlongPhi(const std::function<DataT(DataT)>& potentialFunc, const GEMstack stack, const bool bottom, const Side side, const bool outerFrame = false);
1390
1391 void getDistortionsCorrectionsAnalytical(const DataT x, const DataT y, const DataT z, const Side side, DataT& distX, DataT& distY, DataT& distZ, const bool dist) const;
1392
1393 void setBFields(o2::parameters::GRPMagField& magField);
1394
1395 void initContainer(DataContainer& data, const bool initMem = true);
1396
1397 void initAllBuffers();
1398
1399 void setBoundaryFromIndices(const std::function<DataT(DataT)>& potentialFunc, const std::vector<std::pair<size_t, float>>& indices, const Side side);
1400
1402 std::vector<std::pair<size_t, float>> getPotentialBoundaryGEMFrameAlongRIndices(const Side side) const;
1403
1405 std::vector<std::pair<size_t, float>> getPotentialBoundaryGEMFrameAlongPhiIndices(const GEMstack stack, const bool bottom, const Side side, const bool outerFrame, const bool noGap = false) const;
1406
1407 void setROCMisalignment(int stackType, int misalignmentType, int sector, const float potMin, const float potMax);
1408 void fillROCMisalignment(const std::vector<std::pair<size_t, float>>& indicesTop, const std::vector<std::pair<size_t, float>>& indicesBottom, int sector, int misalignmentType, const std::pair<float, float>& deltaPotPar);
1409
1411 void initRodAlignmentVoltages(const MisalignmentType misalignmentType, const FCType fcType, const int sector, const Side side, const float deltaPot);
1412
1413 void calcGlobalDistCorrIterative(const DistCorrInterpolator<DataT>& globCorr, const int maxIter, const DataT approachZ, const DataT approachR, const DataT approachPhi, const DataT diffCorr, const SpaceCharge<DataT>* scSCale, float scale, const Type type);
1414 void calcGlobalDistCorrIterativeLinearCartesian(const DistCorrInterpolator<DataT>& globCorr, const int maxIter, const DataT approachX, const DataT approachY, const DataT approachZ, const DataT diffCorr, const SpaceCharge<DataT>* scSCale, float scale, const Type type);
1415
1416 void setGlobalDistCorr(const Type type, const std::function<void(int sector, DataT gx, DataT gy, DataT gz, DataT& gCx, DataT& gCy, DataT& gCz)>& gFunc, const Side side);
1417
1418 ClassDefNV(SpaceCharge, 6);
1419};
1420
1421} // namespace tpc
1422} // namespace o2
1423
1424#endif
This class provides a simple method to store values on a large 3-Dim grid with ROOT io functionality.
float float float & zMax
float float & zMin
uint32_t side
Definition RawData.h:0
uint32_t stack
Definition RawData.h:1
Definition of RegularGrid3D class.
This file provides all necesseray classes which are used during the calcution of the distortions and ...
Definition of TriCubic class.
struct for containing simple analytical distortions (as function of local coordinates) and the result...
DataT clampToGridCircular(DataT pos, const unsigned int dim) const
DataT getGridMinZ() const
DataT getRVertex(const size_t vertexY) const
DataT getGridMinPhi() const
DataT getGridMaxPhi() const
DataT getPhiVertex(const size_t vertexZ) const
DataT getGridMinR() const
DataT getInvSpacingR() const
DataT getInvSpacingZ() const
DataT getSpacingPhi() const
DataT getSpacingR() const
DataT getInvSpacingPhi() const
DataT getSpacingZ() const
DataT getGridMaxZ() const
DataT getZVertex(const size_t vertexX) const
DataT clampToGrid(const DataT pos, const unsigned int dim) const
DataT getGridMaxR() const
void setOmegaTauT1T2(const DataT omegaTau=0.32f, const DataT t1=1, const DataT t2=1)
void setC2(const DataT c2)
DataT getLocalDistRPhi(const size_t iz, const size_t ir, const size_t iphi, const Side side) const
DataT getGlobalCorrR(const size_t iz, const size_t ir, const size_t iphi, const Side side) const
void setPotentialBoundaryGEMFrameOROC1TopAlongPhi(const std::function< DataT(DataT)> &potentialFunc, const Side side)
DataT getZMin(const Side side) const
Get min z position which is used during the calaculations.
void getDistortionsCyl(const DataT z, const DataT r, const DataT phi, const Side side, DataT &distZ, DataT &distR, DataT &distRPhi) const
void addChargeDensity(const SpaceCharge< DataT > &otherSC)
void fillDensity(const DataT density, const size_t iz, const size_t ir, const size_t iphi, const Side side)
SpaceCharge & operator=(SpaceCharge &&)=default
move assignment
DataT getLocalCorrRPhi(const size_t iz, const size_t ir, const size_t iphi, const Side side) const
void dumpToTree(const char *outFileName, const Side side, const int nZPoints=50, const int nRPoints=150, const int nPhiPoints=180, const bool randomize=false) const
size_t getNearestPhiVertex(const DataT phi, const Side side) const
DataT getLocalCorrR(const size_t iz, const size_t ir, const size_t iphi, const Side side) const
void correctElectron(GlobalPosition3D &point)
void initBField(const int field)
static GlobalDistType getGlobalDistType()
void setPotentialBoundaryGEMFrameIROCBottomAlongPhi(const std::function< DataT(DataT)> &potentialFunc, const Side side)
DataT regulateR(const DataT posR, const Side side) const
set r coordinate between 'RMIN - 4 * GRIDSPACINGR' and 'RMAX + 2 * GRIDSPACINGR'. the r coordinate is...
size_t getPhiBinsGapFrame(const Side side) const
void setROCMisalignmentRotationAlongX(const int sector, const int type, const float potentialMin, const float potentialMax)
int dumpGlobalDistortions(std::string_view file, const Side side, std::string_view option) const
void addGlobalCorrections(const SpaceCharge< DataT > &otherSC, const Side side)
add global corrections from other space charge object
void setPotentialBoundaryInnerRadius(const std::function< DataT(DataT)> &potentialFunc, const Side side)
DataT getEz(const size_t iz, const size_t ir, const size_t iphi, const Side side) const
DataT getRMin(const Side side) const
Get inner radius of tpc.
void setLocalCorrectionsFromFile(std::string_view file, const Side side)
static void setNumericalIntegrationStrategy(const IntegrationStrategy strategy)
static Side getSide(const DataT z)
DataT getEphi(const size_t iz, const size_t ir, const size_t iphi, const Side side) const
void setPotentialBoundaryGEMFrameAlongR(const std::function< DataT(DataT)> &potentialFunc, const Side side)
void setDistortionsCorrectionsAnalytical(const AnalyticalDistCorr< DataT > &formula)
set distortions and corrections by an analytical formula
static constexpr DataT getEzField(const Side side)
Get constant electric field.
DataT getGlobalDistR(const size_t iz, const size_t ir, const size_t iphi, const Side side) const
static DataT getXFromPolar(const DataT r, const DataT phi)
convert radius and phi coordinates from polar coordinates to x cartesian coordinates
void setDeltaVoltageStripsShiftIFC(const float deltaPot, const Side side, const int sector)
DataT getPhiMin(const Side side) const
Get min phi.
void calcGlobalDistWithGlobalCorrIterative(const DistCorrInterpolator< DataT > &globCorr, const int maxIter=100, const DataT approachZ=1, const DataT approachR=1, const DataT approachPhi=1, const DataT diffCorr=50e-6, const SpaceCharge< DataT > *scSCale=nullptr, float scale=0)
DataT getLocalCorrZ(const size_t iz, const size_t ir, const size_t iphi, const Side side) const
int dumpLocalCorrections(std::string_view file, const Side side, std::string_view option) const
void setGlobalDistortionsFromFile(std::string_view file, const Side side)
bool checkGridFromFile(std::string_view file, std::string_view tree)
void setSimNSector(const int nSectors)
simulate N sectors
void setGlobalCorrectionsFromFile(std::string_view file, const Side side)
void setMetaData(const SCMetaData &meta)
setting meta data for this object
void getCorrectionsAnalytical(const DataT x, const DataT y, const DataT z, const Side side, DataT &corrX, DataT &corrY, DataT &corrZ) const
void setPotentialBoundaryGEMFrameIROCTopAlongPhi(const std::function< DataT(DataT)> &potentialFunc, const Side side)
bool getSimExBMisalignment() const
DataT getPotentialCyl(const DataT z, const DataT r, const DataT phi, const Side side) const
static int getNThreads()
get the number of threads used for some of the calculations
void setROCMisalignmentRotationAlongY(const int sector, const int type, const float potentialMin, const float potentialMax)
DataT regulatePhi(const DataT posPhi, const Side side) const
set phi coordinate between min phi max phi
int dumpDensity(std::string_view file, const Side side, std::string_view option) const
void setIFCChargeUpRisingPot(const float deltaPot, const float zMaxDeltaPot, const int type, const float zStart, const float offs, const Side side)
bool getUseAnalyticalDistCorr() const
bool getSimEDistortions() const
void getLocalDistortionVectorCyl(const DataT z, const DataT r, const DataT phi, const Side side, DataT &lvecdistZ, DataT &lvecdistR, DataT &lvecdistRPhi) const
SpaceCharge(SpaceCharge &&)=default
default move constructor
DataT getLocalDistR(const size_t iz, const size_t ir, const size_t iphi, const Side side) const
int dumpPotential(std::string_view file, const Side side, std::string_view option) const
void scalePotential(const DataT scalingFactor, const Side side)
void printMetaData() const
DataT regulateZ(const DataT posZ, const Side side) const
unsigned short getNPhiVertices() const
void setDefaultStaticDistortionsGEMFrameChargeUp(const Side side, const DataT deltaPotential=1000)
DataT getLocalVecCorrZ(const size_t iz, const size_t ir, const size_t iphi, const Side side) const
void setAnalyticalCorrectionsDistortionsFromFile(std::string_view inpf)
void fillChargeFromCalDet(const std::vector< CalDet< float > > &calCharge3D)
const auto & getPotential(const Side side) const &
void setPotentialBoundaryGEMFrameOROC1BottomAlongPhi(const std::function< DataT(DataT)> &potentialFunc, const Side side)
DataT getGlobalCorrZ(const size_t iz, const size_t ir, const size_t iphi, const Side side) const
const RegularGrid & getGrid3D(const Side side) const
Get the grid object.
void setPotentialBoundaryFromFormula(const AnalyticalFields< DataT > &formulaStruct)
void calcGlobalCorrWithGlobalDistIterativeLinearCartesian(const Side side, const SpaceCharge< DataT > *scSCale=nullptr, float scale=0, const int maxIter=100, const DataT approachX=1, const DataT approachY=1, const DataT approachZ=1, const DataT diffCorr=50e-6)
static void setGlobalDistType(const GlobalDistType globalDistType)
void setUseInitialSCDensity(const bool useInitialSCDensity)
void calcGlobalCorrWithGlobalDistIterative(const Side side, const SpaceCharge< DataT > *scSCale=nullptr, float scale=0, const int maxIter=100, const DataT approachZ=1, const DataT approachR=1, const DataT approachPhi=1, const DataT diffCorr=50e-6)
DataT getDensity(const size_t iz, const size_t ir, const size_t iphi, const Side side) const
void setDeltaVoltageStripsShiftOFC(const float deltaPot, const Side side, const int sector)
DataT getGlobalDistRPhi(const size_t iz, const size_t ir, const size_t iphi, const Side side) const
@ ShiftedClip
shifted copper rod clip
@ RotatedClip
rotated mylar strips from FC
void calcLocalDistortionsCorrections(const Type type, const ElectricFields &formulaStruct)
@ LocalDistCorr
using local dis/corr interpolator for calculation of global distortions/corrections
@ ElectricalField
using electric field for calculation of global distortions/corrections
int dumpGlobalCorrections(std::string_view file, const Side side, std::string_view option) const
IntegrationStrategy
numerical integration strategys
@ SimpsonIterative
simpon integration, but using an iterative method to approximate the drift path. No straight electron...
@ Trapezoidal
trapezoidal integration (https://en.wikipedia.org/wiki/Trapezoidal_rule). straight electron drift lin...
@ Root
Root integration. straight electron drift line assumed: z0->z1, r0->r0, phi0->phi0.
@ Simpson
simpon integration. see: https://en.wikipedia.org/wiki/Simpson%27s_rule. straight electron drift line...
DataT getGridSpacingR(const Side side) const
Get grid spacing in r direction.
static int getStepWidth()
Get the step width which is used for the calculation of the correction/distortions in units of the z-...
DistCorrInterpolator< DataT > getGlobalCorrInterpolator(const Side side) const
DistCorrInterpolator< DataT > getLocalCorrInterpolator(const Side side) const
DataT getLocalDistZ(const size_t iz, const size_t ir, const size_t iphi, const Side side) const
void setEFieldFromFormula(const AnalyticalFields< DataT > &formulaStruct)
static void setNThreads(const int nThreads)
set the number of threads used for some of the calculations
void subtractGlobalDistortions(const SpaceCharge< DataT > &otherSC, const Side side)
int dumpLocalDistCorrVectors(std::string_view file, const Side side, std::string_view option) const
DataT getGlobalDistZ(const size_t iz, const size_t ir, const size_t iphi, const Side side) const
void addBoundaryPotential(const SpaceCharge< DataT > &other, const Side side, const float scaling=1)
void getCorrections(const DataT x, const DataT y, const DataT z, const Side side, DataT &corrX, DataT &corrY, DataT &corrZ) const
int getBField() const
void fillPotential(const DataT potential, const size_t iz, const size_t ir, const size_t iphi, const Side side)
DataT getGlobalCorrRPhi(const size_t iz, const size_t ir, const size_t iphi, const Side side) const
static void normalizeHistoQVEps0(TH3 &histoIonsPhiRZ)
float getMeanLumi() const
void getDistortions(const DataT x, const DataT y, const DataT z, const Side side, DataT &distX, DataT &distY, DataT &distZ) const
void calcLocalDistortionsCorrectionsRK4(const Type type, const Side side)
void mirrorPotential(const Side sideRef, const Side sideMirrored)
static int getOMPMaxThreads()
int dumpAnalyticalCorrectionsDistortions(TFile &outf) const
static void unsetSimNSector()
unsetting simulation of one sector
DistCorrInterpolator< DataT > getLocalDistInterpolator(const Side side) const
void getLocalCorrectionsCyl(const DataT z, const DataT r, const DataT phi, const Side side, DataT &lcorrZ, DataT &lcorrR, DataT &lcorrRPhi) const
void fillChargeFromIDCs(std::vector< CalDet< float > > &idcZero, const CalDet< float > &mapIBF, const float ionDriftTimeMS=200, const bool normToPadArea=true)
void scaleChargeDensityStack(const float scalingFactor, const Sector sector, const GEMstack stack)
scaling the space-charge density for given stack
void calcGlobalDistortions(const Fields &formulaStruct, const int maxIterations=3 *sSteps *129)
void setPotentialBoundaryGEMFrameOROC3ToOFCPhi(const std::function< DataT(DataT)> &potentialFunc, const Side side)
void scaleChargeDensity(const DataT scalingFactor, const Side side)
DataT getGridSpacingPhi(const Side side) const
Get grid spacing in phi direction.
void dumpMetaData(std::string_view file, std::string_view option, const bool overwriteExisting=false) const
static void convertIDCsToCharge(std::vector< CalDet< float > > &idcZero, const CalDet< float > &mapIBF, const float ionDriftTimeMS=200, const bool normToPadArea=true)
@ Fast
interpolation of global corrections (use the global corrections to apply an iterative approach to obt...
@ Standard
classical method (start calculation of global distortion at each voxel in the tpc and follow electron...
size_t getNearestRVertex(const DataT r, const Side side) const
void getDistortionsAnalytical(const DataT x, const DataT y, const DataT z, const Side side, DataT &distX, DataT &distY, DataT &distZ) const
const auto & getDistortionsCorrectionsAnalytical() const &
NumericalFields< DataT > getElectricFieldsInterpolator(const Side side) const
void setDeltaVoltageCopperRodShiftOFC(const float deltaPot, const Side side, const int sector)
void subtractGlobalCorrections(const SpaceCharge< DataT > &otherSC, const Side side)
void getCorrectionsCyl(const DataT z, const DataT r, const DataT phi, const Side side, DataT &corrZ, DataT &corrR, DataT &corrRPhi) const
void setDensityFromFile(std::string_view file, const Side side)
void setUseAnalyticalDistCorr(const bool useAna)
setting usage of the analytical formula for the distortions and corrections
void getLocalDistortionsCyl(const DataT z, const DataT r, const DataT phi, const Side side, DataT &ldistZ, DataT &ldistR, DataT &ldistRPhi) const
void dumpToFile(std::string_view file, const Side side, std::string_view option) const
DataT getGridSpacingZ(const Side side) const
Get grid spacing in z direction.
void fillChargeDensityFromCalDet(const std::vector< CalDet< float > > &calSCDensity3D)
void setGlobalDistortions(const std::function< void(int sector, DataT gx, DataT gy, DataT gz, DataT &gCx, DataT &gCy, DataT &gCz)> &gDist, const Side side)
DataT getEr(const size_t iz, const size_t ir, const size_t iphi, const Side side) const
static void setSCDistortionType(SCDistortionType distortionType)
void scaleCorrections(const float scaleFac, const Side side)
static int getNStep()
int dumpLocalDistortions(std::string_view file, const Side side, std::string_view option) const
unsigned short getNRVertices() const
void setMeanLumi(float lumi)
DataT getPhiMax(const Side side) const
Get max phi.
void setC0C1(const DataT c0, const DataT c1)
DataT getLocalVecDistZ(const size_t iz, const size_t ir, const size_t iphi, const Side side) const
void setDistortionLookupTables(const DataContainer &distdZ, const DataContainer &distdR, const DataContainer &distdRPhi, const Side side)
static void setGlobalDistCorrMethod(const GlobalDistCorrMethod globalDistCorrMethod)
void setPotentialBoundaryOuterRadius(const std::function< DataT(DataT)> &potentialFunc, const Side side)
void setIFCChargeUpFallingPot(const float deltaPot, const float zMaxDeltaPot, const int type, const float zEnd, const float offs, const Side side)
void calcGlobalDistWithGlobalCorrIterativeLinearCartesian(const Side side, const SpaceCharge< DataT > *scSCale=nullptr, float scale=0, const int maxIter=100, const DataT approachX=1, const DataT approachY=1, const DataT approachZ=1, const DataT diffCorr=50e-6)
void setSimExBMisalignment(const bool simExBMisalignment)
enable/disable calculation of distortions due to ExB misalignment
void calcGlobalCorrectionsEField(const Side side, const int type=3)
calculate the global corrections using the electric fields (interface for python)
static void makeElectronDriftPathGif(const char *inpFile, TH2F &hBorder, const int type=0, const int gifSpeed=2, const int maxsamplingpoints=100, const char *outName="electron_drift_path")
void setElectricFieldsFromFile(std::string_view file, const Side side)
static DataT getYFromPolar(const DataT r, const DataT phi)
convert radius and phi coordinates from polar coordinates to y cartesian coordinate
static void setSimpsonNIteratives(const int nIter)
DataT getPhiVertex(const size_t indexPhi, const Side side) const
void calcEField(const Side side)
void setPotentialFromFile(std::string_view file, const Side side)
void fillChargeDensityFromHisto(const TH3 &hisSCDensity3D)
void setPotentialBoundaryGEMFrameOROC3TopAlongPhi(const std::function< DataT(DataT)> &potentialFunc, const Side side)
void getLocalCorrectionVectorCyl(const DataT z, const DataT r, const DataT phi, const Side side, DataT &lveccorrZ, DataT &lveccorrR, DataT &lveccorrRPhi) const
void setPotentialBoundaryGEMFrameOROC2TopAlongPhi(const std::function< DataT(DataT)> &potentialFunc, const Side side)
void setPotential(int iz, int ir, int iphi, Side side, float val)
setting the potential directly for given vertex
void setFromFile(std::string_view file, const Side side)
void setSimEDistortions(const bool simEDistortions)
calculate distortions due to electric fields (space charge, boundary potential...)
DataT getLocalVecCorrR(const size_t iz, const size_t ir, const size_t iphi, const Side side) const
static int getSimpsonNIteratives()
SpaceCharge()
constructor for empty object. Can be used when buffers are loaded from file
void setDeltaVoltageCopperRodShiftIFC(const float deltaPot, const Side side, const int sector)
void setChargeDensityFromFormula(const AnalyticalFields< DataT > &formulaStruct)
void setDeltaVoltageRotatedClipOFC(const float deltaPot, const Side side, const int sector)
void averageDensityPerSector(const Side side)
average the sc density across all sectors per side
void setDeltaVoltageRotatedClipIFC(const float deltaPot, const Side side, const int sector)
DataT getDensityCyl(const DataT z, const DataT r, const DataT phi, const Side side) const
DataT getLocalVecCorrRPhi(const size_t iz, const size_t ir, const size_t iphi, const Side side) const
void getElectricFieldsCyl(const DataT z, const DataT r, const DataT phi, const Side side, DataT &eZ, DataT &eR, DataT &ePhi) const
float getDCAr(float tgl, const int nPoints, const float phi, float rStart=-1, o2::utils::TreeStreamRedirector *pcstream=nullptr) const
DistCorrInterpolator< DataT > getGlobalDistInterpolator(const Side side) const
DataT getZMax(const Side side) const
Get max z.
void setROCMisalignmentShiftZ(const int sector, const int type, const float potential)
void calculateDistortionsCorrections(const o2::tpc::Side side, const bool calcVectors=false)
void calcGlobalCorrections(const Fields &formulaStruct, const int type=3)
static IntegrationStrategy getNumericalIntegrationStrategy()
void setGlobalCorrections(const std::function< void(int sector, DataT gx, DataT gy, DataT gz, DataT &gCx, DataT &gCy, DataT &gCz)> &gCorr, const Side side)
void setPotentialBoundaryGEMFrameIROCToIFCPhi(const std::function< DataT(DataT)> &potentialFunc, const Side side)
setting the potential from the IROC to the inner field cage
static SCDistortionType getSCDistortionType()
Get the space-charge distortions model.
const auto & getMetaData() const
DataT getLocalVecDistR(const size_t iz, const size_t ir, const size_t iphi, const Side side) const
void setPotentialBoundaryGEMFrameOROC3BottomAlongPhi(const std::function< DataT(DataT)> &potentialFunc, const Side side)
static GlobalDistCorrMethod getGlobalDistCorrMethod()
void calcLocalDistortionCorrectionVector(const ElectricFields &formulaStruct)
DataT getRVertex(const size_t indexR, const Side side) const
static DataT getRadiusFromCartesian(const DataT x, const DataT y)
convert x and y coordinates from cartesian to the radius in polar coordinates
void setPotentialFromFormula(const AnalyticalFields< DataT > &formulaStruct)
void setLocalDistCorrVectorsFromFile(std::string_view file, const Side side)
void distortElectron(GlobalPosition3D &point, const SpaceCharge< DataT > *scSCale=nullptr, float scale=0) const
DataT getPotential(const size_t iz, const size_t ir, const size_t iphi, const Side side) const
unsigned short getNZVertices() const
void setPotentialBoundaryGEMFrameOROC2BottomAlongPhi(const std::function< DataT(DataT)> &potentialFunc, const Side side)
static DataT getPhiFromCartesian(const DataT x, const DataT y)
convert x and y coordinates from cartesian to phi in polar coordinates
void readMetaData(std::string_view file)
void resetBoundaryPotentialToZeroInRangeZ(float zMin, float zMax, const Side side)
setting the boundary potential to 0 for z<zMin and z>zMax
void downSampleObject(const int nZNew, const int nRNew, const int nPhiNew)
DataT getLocalVecDistRPhi(const size_t iz, const size_t ir, const size_t iphi, const Side side) const
int dumpElectricFields(std::string_view file, const Side side, std::string_view option) const
DataT getRMax(const Side side) const
Get max r.
void setLocalDistortionsFromFile(std::string_view file, const Side side)
static void setNStep(const int nSteps)
void scaleChargeDensitySector(const float scalingFactor, const Sector sector)
DataT getZVertex(const size_t indexZ, const Side side) const
std::vector< std::pair< std::vector< o2::math_utils::Point3D< float > >, std::array< DataT, 3 > > > calculateElectronDriftPath(const std::vector< GlobalPosition3D > &elePos, const int nSamplingPoints, const std::string_view outFile="electron_tracks.root") const
void fillChargeDensityFromFile(TFile &fInp, const char *name)
void poissonSolver(const Side side, const DataT stoppingConvergence=1e-6, const int symmetry=0)
GLint GLenum GLint x
Definition glcorearb.h:403
GLuint const GLchar * name
Definition glcorearb.h:781
GLint GLint GLsizei GLint GLenum GLenum type
Definition glcorearb.h:275
GLboolean * data
Definition glcorearb.h:298
GLsizei GLenum const void * indices
Definition glcorearb.h:400
GLint GLint bottom
Definition glcorearb.h:1979
GLuint GLfloat * val
Definition glcorearb.h:1582
GLboolean r
Definition glcorearb.h:1233
GLdouble GLdouble GLdouble z
Definition glcorearb.h:843
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t1
Definition glcorearb.h:5034
GEMstack
TPC GEM stack types.
Definition Defs.h:53
@ IROCgem
Definition Defs.h:53
@ OROC1gem
Definition Defs.h:54
@ OROC3gem
Definition Defs.h:56
@ OROC2gem
Definition Defs.h:55
constexpr unsigned char SIDES
Definition Defs.h:41
Side
TPC readout sidE.
Definition Defs.h:35
@ A
Definition Defs.h:35
@ C
Definition Defs.h:36
SCDistortionType
Enumerator for setting the space-charge distortion mode.
Definition SpaceCharge.h:57
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
Common utility functions.
Marks an empty item in the context.
static constexpr DataT PHIMIN
min phi coordinate
static constexpr DataT ZMIN
min z coordinate
static constexpr DataT getGridSpacingR(const unsigned int nR)
static constexpr DataT getGridSpacingZ(const unsigned int nZ)
static constexpr DataT getGridSpacingPhi(const unsigned int nPhi)
static constexpr DataT RMIN
min radius
unsigned short NZVertices
NRVertices number of vertices in z direction.
unsigned short NPhiVertices
NZVertices number of vertices in r direction.
float meanLumi
mean lumi the sc object corresponds to
VectorOfTObjectPtrs other
o2::InteractionRecord ir(0, 0)
std::unique_ptr< TTree > tree((TTree *) flIn.Get(std::string(o2::base::NameConf::CTFTREENAME).c_str()))
LumiInfo lumi