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
207 void setSimOneSector();
208
210 static void unsetSimOneSector();
211
215 void setDefaultStaticDistortionsGEMFrameChargeUp(const Side side, const DataT deltaPotential = 1000);
216
220 void setPotentialBoundaryGEMFrameAlongR(const std::function<DataT(DataT)>& potentialFunc, const Side side);
221
225 void setPotentialBoundaryGEMFrameIROCBottomAlongPhi(const std::function<DataT(DataT)>& potentialFunc, const Side side) { setPotentialBoundaryGEMFrameAlongPhi(potentialFunc, GEMstack::IROCgem, true, side); }
226
230 void setPotentialBoundaryGEMFrameIROCTopAlongPhi(const std::function<DataT(DataT)>& potentialFunc, const Side side) { setPotentialBoundaryGEMFrameAlongPhi(potentialFunc, GEMstack::IROCgem, false, side); }
231
235 void setPotentialBoundaryGEMFrameOROC1BottomAlongPhi(const std::function<DataT(DataT)>& potentialFunc, const Side side) { setPotentialBoundaryGEMFrameAlongPhi(potentialFunc, GEMstack::OROC1gem, true, side); }
236
240 void setPotentialBoundaryGEMFrameOROC1TopAlongPhi(const std::function<DataT(DataT)>& potentialFunc, const Side side) { setPotentialBoundaryGEMFrameAlongPhi(potentialFunc, GEMstack::OROC1gem, false, side); }
241
245 void setPotentialBoundaryGEMFrameOROC2BottomAlongPhi(const std::function<DataT(DataT)>& potentialFunc, const Side side) { setPotentialBoundaryGEMFrameAlongPhi(potentialFunc, GEMstack::OROC2gem, true, side); }
246
250 void setPotentialBoundaryGEMFrameOROC2TopAlongPhi(const std::function<DataT(DataT)>& potentialFunc, const Side side) { setPotentialBoundaryGEMFrameAlongPhi(potentialFunc, GEMstack::OROC2gem, false, side); }
251
255 void setPotentialBoundaryGEMFrameOROC3BottomAlongPhi(const std::function<DataT(DataT)>& potentialFunc, const Side side) { setPotentialBoundaryGEMFrameAlongPhi(potentialFunc, GEMstack::OROC3gem, true, side); }
256
260 void setPotentialBoundaryGEMFrameOROC3TopAlongPhi(const std::function<DataT(DataT)>& potentialFunc, const Side side) { setPotentialBoundaryGEMFrameAlongPhi(potentialFunc, GEMstack::OROC3gem, false, side); }
261
265 void setPotentialBoundaryGEMFrameOROC3ToOFCPhi(const std::function<DataT(DataT)>& potentialFunc, const Side side) { setPotentialBoundaryGEMFrameAlongPhi(potentialFunc, GEMstack::OROC3gem, false, side, true); }
266
268 void setPotentialBoundaryGEMFrameIROCToIFCPhi(const std::function<DataT(DataT)>& potentialFunc, const Side side) { setPotentialBoundaryGEMFrameAlongPhi(potentialFunc, GEMstack::IROCgem, true, side, true); }
269
273 void setPotentialBoundaryInnerRadius(const std::function<DataT(DataT)>& potentialFunc, const Side side);
274
278 void setPotentialBoundaryOuterRadius(const std::function<DataT(DataT)>& potentialFunc, const Side side);
279
284 void poissonSolver(const Side side, const DataT stoppingConvergence = 1e-6, const int symmetry = 0);
285
289 void poissonSolver(const DataT stoppingConvergence = 1e-6, const int symmetry = 0);
290
293 void calcEField(const Side side);
294
297 void setEFieldFromFormula(const AnalyticalFields<DataT>& formulaStruct);
298
302 void scaleChargeDensity(const DataT scalingFactor, const Side side) { mDensity[side] *= scalingFactor; }
303
306 void scaleChargeDensitySector(const float scalingFactor, const Sector sector);
307
309 void scaleChargeDensityStack(const float scalingFactor, const Sector sector, const GEMstack stack);
310
313 void addChargeDensity(const SpaceCharge<DataT>& otherSC);
314
318 template <typename ElectricFields = AnalyticalFields<DataT>>
319 void calcLocalDistortionsCorrections(const Type type, const ElectricFields& formulaStruct);
320
323 template <typename ElectricFields = AnalyticalFields<DataT>>
324 void calcLocalDistortionCorrectionVector(const ElectricFields& formulaStruct);
325
330 template <typename ElectricFields = AnalyticalFields<DataT>>
332
336 template <typename Fields = AnalyticalFields<DataT>>
337 void calcGlobalCorrections(const Fields& formulaStruct, const int type = 3);
338
341
345 template <typename Fields = AnalyticalFields<DataT>>
346 void calcGlobalDistortions(const Fields& formulaStruct, const int maxIterations = 3 * sSteps * 129);
347
348 void init();
349
358 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);
359
363 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);
364 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);
365
369 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);
370 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);
371
376 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);
377 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);
378
383 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);
384 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);
385
387 unsigned short getNZVertices() const { return mParamGrid.NZVertices; }
388
390 unsigned short getNRVertices() const { return mParamGrid.NRVertices; }
391
393 unsigned short getNPhiVertices() const { return mParamGrid.NPhiVertices; }
394
396 auto getC0() const { return mC0; }
397
399 auto getC1() const { return mC1; }
400
402 auto getC2() const { return mC2; }
403
405 int getBField() const { return mBField.getBField(); }
406
407 const auto& getPotential(const Side side) const& { return mPotential[side]; }
408
410 void setPotential(int iz, int ir, int iphi, Side side, float val);
411
416 DataT getDensityCyl(const DataT z, const DataT r, const DataT phi, const Side side) const;
417
422 DataT getPotentialCyl(const DataT z, const DataT r, const DataT phi, const Side side) const;
423
425 std::vector<float> getPotentialCyl(const std::vector<DataT>& z, const std::vector<DataT>& r, const std::vector<DataT>& phi, const Side side) const;
426
434 void getElectricFieldsCyl(const DataT z, const DataT r, const DataT phi, const Side side, DataT& eZ, DataT& eR, DataT& ePhi) const;
435
443 void getLocalCorrectionsCyl(const DataT z, const DataT r, const DataT phi, const Side side, DataT& lcorrZ, DataT& lcorrR, DataT& lcorrRPhi) const;
444
452 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;
453
461 void getCorrectionsCyl(const DataT z, const DataT r, const DataT phi, const Side side, DataT& corrZ, DataT& corrR, DataT& corrRPhi) const;
462
470 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;
471
479 void getCorrections(const DataT x, const DataT y, const DataT z, const Side side, DataT& corrX, DataT& corrY, DataT& corrZ) const;
480
488 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); }
489
497 void getLocalDistortionsCyl(const DataT z, const DataT r, const DataT phi, const Side side, DataT& ldistZ, DataT& ldistR, DataT& ldistRPhi) const;
498
506 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;
507
515 void getLocalDistortionVectorCyl(const DataT z, const DataT r, const DataT phi, const Side side, DataT& lvecdistZ, DataT& lvecdistR, DataT& lvecdistRPhi) const;
516
524 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;
525
533 void getLocalCorrectionVectorCyl(const DataT z, const DataT r, const DataT phi, const Side side, DataT& lveccorrZ, DataT& lveccorrR, DataT& lveccorrRPhi) const;
534
542 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;
543
551 void getDistortionsCyl(const DataT z, const DataT r, const DataT phi, const Side side, DataT& distZ, DataT& distR, DataT& distRPhi) const;
552
560 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;
561
569 void getDistortions(const DataT x, const DataT y, const DataT z, const Side side, DataT& distX, DataT& distY, DataT& distZ) const;
570
578 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); }
579
581 void setDistortionsCorrectionsAnalytical(const AnalyticalDistCorr<DataT>& formula) { mAnaDistCorr = formula; }
582
584 const auto& getDistortionsCorrectionsAnalytical() const& { return mAnaDistCorr; }
585
587 void setUseAnalyticalDistCorr(const bool useAna) { mUseAnaDistCorr = useAna; }
588
590 bool getUseAnalyticalDistCorr() const { return mUseAnaDistCorr; }
591
593 static DataT getRadiusFromCartesian(const DataT x, const DataT y) { return std::sqrt(x * x + y * y); }
594
596 static DataT getPhiFromCartesian(const DataT x, const DataT y) { return std::atan2(y, x); }
597
599 static DataT getXFromPolar(const DataT r, const DataT phi) { return r * std::cos(phi); }
600
602 static DataT getYFromPolar(const DataT r, const DataT phi) { return r * std::sin(phi); }
603
607
612 void distortElectron(GlobalPosition3D& point, const SpaceCharge<DataT>* scSCale = nullptr, float scale = 0) const;
613
619 void setDistortionLookupTables(const DataContainer& distdZ, const DataContainer& distdR, const DataContainer& distdRPhi, const Side side);
620
624 void setFromFile(std::string_view file, const Side side);
625
628 void setFromFile(std::string_view file);
629
631 DataT getGridSpacingR(const Side side) const { return mGrid3D[side].getSpacingR(); }
632
634 DataT getGridSpacingZ(const Side side) const { return mGrid3D[side].getSpacingZ(); }
635
637 DataT getGridSpacingPhi(const Side side) const { return mGrid3D[side].getSpacingPhi(); }
638
641
643 DataT getRMin(const Side side) const { return mGrid3D[side].getGridMinR(); }
644
646 DataT getZMin(const Side side) const { return mGrid3D[side].getGridMinZ(); }
647
649 DataT getPhiMin(const Side side) const { return mGrid3D[side].getGridMinPhi(); }
650
652 DataT getRMax(const Side side) const { return mGrid3D[side].getGridMaxR(); };
653
655 DataT getZMax(const Side side) const { return mGrid3D[side].getGridMaxZ(); }
656
658 DataT getPhiMax(const Side side) const { return mGrid3D[side].getGridMaxPhi(); }
659
660 // get side of TPC for z coordinate TODO rewrite this
661 static Side getSide(const DataT z) { return ((z >= 0) ? Side::A : Side::C); }
662
664 const RegularGrid& getGrid3D(const Side side) const { return mGrid3D[side]; }
665
669
673
677
681
685
691 DataT getLocalDistR(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mLocalDistdR[side](iz, ir, iphi); }
692
698 DataT getLocalDistZ(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mLocalDistdZ[side](iz, ir, iphi); }
699
705 DataT getLocalDistRPhi(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mLocalDistdRPhi[side](iz, ir, iphi); }
706
712 DataT getLocalVecDistR(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mLocalVecDistdR[side](iz, ir, iphi); }
713
719 DataT getLocalVecDistZ(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mLocalVecDistdZ[side](iz, ir, iphi); }
720
726 DataT getLocalVecDistRPhi(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mLocalVecDistdRPhi[side](iz, ir, iphi); }
727
733 DataT getLocalCorrR(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mLocalCorrdR[side](iz, ir, iphi); }
734
740 DataT getLocalCorrZ(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mLocalCorrdZ[side](iz, ir, iphi); }
741
747 DataT getLocalCorrRPhi(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mLocalCorrdRPhi[side](iz, ir, iphi); }
748
754 DataT getLocalVecCorrR(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return -mLocalVecDistdR[side](iz, ir, iphi); }
755
761 DataT getLocalVecCorrZ(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return -mLocalVecDistdZ[side](iz, ir, iphi); }
762
768 DataT getLocalVecCorrRPhi(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return -mLocalVecDistdRPhi[side](iz, ir, iphi); }
769
775 DataT getGlobalDistR(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mGlobalDistdR[side](iz, ir, iphi); }
776
782 DataT getGlobalDistZ(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mGlobalDistdZ[side](iz, ir, iphi); }
783
789 DataT getGlobalDistRPhi(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mGlobalDistdRPhi[side](iz, ir, iphi); }
790
796 DataT getGlobalCorrR(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mGlobalCorrdR[side](iz, ir, iphi); }
797
803 DataT getGlobalCorrZ(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mGlobalCorrdZ[side](iz, ir, iphi); }
804
810 DataT getGlobalCorrRPhi(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mGlobalCorrdRPhi[side](iz, ir, iphi); }
811
817 DataT getEr(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mElectricFieldEr[side](iz, ir, iphi); }
818
824 DataT getEz(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mElectricFieldEz[side](iz, ir, iphi); }
825
831 DataT getEphi(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mElectricFieldEphi[side](iz, ir, iphi); }
832
838 DataT getDensity(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mDensity[side](iz, ir, iphi); }
839
845 DataT getPotential(const size_t iz, const size_t ir, const size_t iphi, const Side side) const { return mPotential[side](iz, ir, iphi); }
846
848 static int getStepWidth() { return 1 / sSteps; }
849
852 DataT getPhiVertex(const size_t indexPhi, const Side side) const { return mGrid3D[side].getPhiVertex(indexPhi); }
853
856 DataT getRVertex(const size_t indexR, const Side side) const { return mGrid3D[side].getRVertex(indexR); }
857
860 DataT getZVertex(const size_t indexZ, const Side side) const { return mGrid3D[side].getZVertex(indexZ); }
861
865 void setOmegaTauT1T2(const DataT omegaTau = 0.32f, const DataT t1 = 1, const DataT t2 = 1);
866
869 void setC0C1(const DataT c0, const DataT c1)
870 {
871 mC0 = c0;
872 mC1 = c1;
873 }
874
876 void setC2(const DataT c2) { mC0 = c2; }
877
880 void initBField(const int field);
881
883 void setSimExBMisalignment(const bool simExBMisalignment) { mSimExBMisalignment = simExBMisalignment; }
884
886 bool getSimExBMisalignment() const { return mSimExBMisalignment; }
887
889 void setSimEDistortions(const bool simEDistortions) { mSimEDistortions = simEDistortions; }
890
892 bool getSimEDistortions() const { return mSimEDistortions; }
893
896 static void setNStep(const int nSteps) { sSteps = nSteps; }
897
898 static int getNStep() { return sSteps; }
899
901 static int getNThreads() { return sNThreads; }
902
904 static void setNThreads(const int nThreads) { sNThreads = nThreads; }
905
908 static void setNumericalIntegrationStrategy(const IntegrationStrategy strategy) { sNumericalIntegrationStrategy = strategy; }
909 static IntegrationStrategy getNumericalIntegrationStrategy() { return sNumericalIntegrationStrategy; }
910
911 static void setGlobalDistType(const GlobalDistType globalDistType) { sGlobalDistType = globalDistType; }
912 static GlobalDistType getGlobalDistType() { return sGlobalDistType; }
913
914 static void setGlobalDistCorrMethod(const GlobalDistCorrMethod globalDistCorrMethod) { sGlobalDistCorrCalcMethod = globalDistCorrMethod; }
915 static GlobalDistCorrMethod getGlobalDistCorrMethod() { return sGlobalDistCorrCalcMethod; }
916
917 static void setSimpsonNIteratives(const int nIter) { sSimpsonNIteratives = nIter; }
918 static int getSimpsonNIteratives() { return sSimpsonNIteratives; }
919
922 static void setSCDistortionType(SCDistortionType distortionType) { sSCDistortionType = distortionType; }
924 static SCDistortionType getSCDistortionType() { return sSCDistortionType; }
925
926 void setUseInitialSCDensity(const bool useInitialSCDensity) { mUseInitialSCDensity = useInitialSCDensity; }
927
932 void dumpToFile(std::string_view file, const Side side, std::string_view option) const;
933
936 void dumpToFile(std::string_view file) const;
937
942 void dumpMetaData(std::string_view file, std::string_view option, const bool overwriteExisting = false) const;
943
946 void readMetaData(std::string_view file);
947
965 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;
966
971 void dumpToTree(const char* outFileName, const o2::tpc::Sector& sector, const int nZPoints = 50) const;
972
977 int dumpElectricFields(std::string_view file, const Side side, std::string_view option) const;
978
982 void setElectricFieldsFromFile(std::string_view file, const Side side);
983
988 int dumpPotential(std::string_view file, const Side side, std::string_view option) const;
989
993 void setPotentialFromFile(std::string_view file, const Side side);
994
1001 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; }
1002
1007 int dumpDensity(std::string_view file, const Side side, std::string_view option) const;
1008
1012 void setDensityFromFile(std::string_view file, const Side side);
1013
1020 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; }
1021
1023 void averageDensityPerSector(const Side side);
1024
1029 int dumpGlobalDistortions(std::string_view file, const Side side, std::string_view option) const;
1030
1033 int dumpAnalyticalCorrectionsDistortions(TFile& outf) const;
1034
1037 void setAnalyticalCorrectionsDistortionsFromFile(std::string_view inpf);
1038
1042 void setGlobalDistortionsFromFile(std::string_view file, const Side side);
1043
1047 template <typename DataTIn = DataT>
1048 void setGlobalDistortionsFromFile(TFile& inpf, const Side side);
1049
1054 int dumpGlobalCorrections(std::string_view file, const Side side, std::string_view option) const;
1055
1059 int dumpGlobalCorrections(TFile& outf, const Side side) const;
1060
1064 void setGlobalCorrectionsFromFile(std::string_view file, const Side side);
1065
1069 template <typename DataTIn = DataT>
1070 void setGlobalCorrectionsFromFile(TFile& inpf, const Side side);
1071
1076 int dumpLocalCorrections(std::string_view file, const Side side, std::string_view option) const;
1077
1081 void setLocalCorrectionsFromFile(std::string_view file, const Side side);
1082
1087 int dumpLocalDistortions(std::string_view file, const Side side, std::string_view option) const;
1088
1093 int dumpLocalDistCorrVectors(std::string_view file, const Side side, std::string_view option) const;
1094
1098 void setLocalDistortionsFromFile(std::string_view file, const Side side);
1099
1103 void setLocalDistCorrVectorsFromFile(std::string_view file, const Side side);
1104
1107 DataT regulateZ(const DataT posZ, const Side side) const { return mGrid3D[side].clampToGrid(posZ, 0); }
1108
1110 DataT regulateR(const DataT posR, const Side side) const;
1111
1113 DataT regulatePhi(const DataT posPhi, const Side side) const { return mGrid3D[side].clampToGridCircular(posPhi, 2); }
1114
1120 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;
1121
1128 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");
1129
1132 static void normalizeHistoQVEps0(TH3& histoIonsPhiRZ);
1133
1135 static int getOMPMaxThreads();
1136
1141 bool checkGridFromFile(std::string_view file, std::string_view tree);
1142
1145 void setDeltaVoltageCopperRodShiftIFC(const float deltaPot, const Side side, const int sector) { initRodAlignmentVoltages(MisalignmentType::RodShift, FCType::IFC, sector, side, deltaPot); }
1146
1149 void setDeltaVoltageCopperRodShiftOFC(const float deltaPot, const Side side, const int sector) { initRodAlignmentVoltages(MisalignmentType::RodShift, FCType::OFC, sector, side, deltaPot); }
1150
1153 void setDeltaVoltageStripsShiftIFC(const float deltaPot, const Side side, const int sector) { initRodAlignmentVoltages(MisalignmentType::ShiftedClip, FCType::IFC, sector, side, deltaPot); }
1154
1157 void setDeltaVoltageStripsShiftOFC(const float deltaPot, const Side side, const int sector) { initRodAlignmentVoltages(MisalignmentType::ShiftedClip, FCType::OFC, sector, side, deltaPot); }
1158
1162 void setDeltaVoltageRotatedClipIFC(const float deltaPot, const Side side, const int sector) { initRodAlignmentVoltages(MisalignmentType::RotatedClip, FCType::IFC, sector, side, deltaPot); }
1163
1167 void setDeltaVoltageRotatedClipOFC(const float deltaPot, const Side side, const int sector) { initRodAlignmentVoltages(MisalignmentType::RotatedClip, FCType::OFC, sector, side, deltaPot); }
1168
1174 void setIFCChargeUpRisingPot(const float deltaPot, const float zMaxDeltaPot, const int type, const float zStart, const float offs, const Side side);
1175
1181 void setIFCChargeUpFallingPot(const float deltaPot, const float zMaxDeltaPot, const int type, const float zEnd, const float offs, const Side side);
1182
1185 void setGlobalCorrections(const std::function<void(int sector, DataT gx, DataT gy, DataT gz, DataT& gCx, DataT& gCy, DataT& gCz)>& gCorr, const Side side);
1186
1191 void setROCMisalignmentShiftZ(const int sector, const int type, const float potential);
1192
1198 void setROCMisalignmentRotationAlongX(const int sector, const int type, const float potentialMin, const float potentialMax);
1199
1205 void setROCMisalignmentRotationAlongY(const int sector, const int type, const float potentialMin, const float potentialMax);
1206
1210 void subtractGlobalCorrections(const SpaceCharge<DataT>& otherSC, const Side side);
1211
1214 void subtractGlobalDistortions(const SpaceCharge<DataT>& otherSC, const Side side);
1215
1218 void scaleCorrections(const float scaleFac, const Side side);
1219
1221 void setMetaData(const SCMetaData& meta) { mMeta = meta; }
1222 const auto& getMetaData() const { return mMeta; }
1223 void printMetaData() const { mMeta.print(); }
1224 float getMeanLumi() const { return mMeta.meanLumi; }
1225 void setMeanLumi(float lumi) { mMeta.meanLumi = lumi; }
1227
1232 float getDCAr(float tgl, const int nPoints, const float phi, o2::utils::TreeStreamRedirector* pcstream = nullptr) const;
1233
1234 private:
1235 ParamSpaceCharge mParamGrid{};
1236 inline static int sNThreads{getOMPMaxThreads()};
1237 inline static IntegrationStrategy sNumericalIntegrationStrategy{IntegrationStrategy::SimpsonIterative};
1238 inline static int sSimpsonNIteratives{3};
1239 inline static int sSteps{1};
1240 inline static GlobalDistType sGlobalDistType{GlobalDistType::Fast};
1241 inline static GlobalDistCorrMethod sGlobalDistCorrCalcMethod{GlobalDistCorrMethod::LocalDistCorr};
1242 inline static SCDistortionType sSCDistortionType{SCDistortionType::SCDistortionsConstant};
1243
1244 DataT mC0 = 0;
1245 DataT mC1 = 0;
1246 DataT mC2 = 0;
1247 static constexpr int FNSIDES = SIDES;
1248 bool mUseInitialSCDensity{false};
1249 bool mInitLookUpTables{false};
1250 bool mSimExBMisalignment{false};
1251 bool mSimEDistortions{true};
1252 bool mReadMetaData{false};
1254
1255 DataContainer mLocalDistdR[FNSIDES]{};
1256 DataContainer mLocalDistdZ[FNSIDES]{};
1257 DataContainer mLocalDistdRPhi[FNSIDES]{};
1258 DataContainer mLocalVecDistdR[FNSIDES]{};
1259 DataContainer mLocalVecDistdZ[FNSIDES]{};
1260 DataContainer mLocalVecDistdRPhi[FNSIDES]{};
1261 DataContainer mLocalCorrdR[FNSIDES]{};
1262 DataContainer mLocalCorrdZ[FNSIDES]{};
1263 DataContainer mLocalCorrdRPhi[FNSIDES]{};
1264 DataContainer mGlobalDistdR[FNSIDES]{};
1265 DataContainer mGlobalDistdZ[FNSIDES]{};
1266 DataContainer mGlobalDistdRPhi[FNSIDES]{};
1267 DataContainer mGlobalCorrdR[FNSIDES]{};
1268 DataContainer mGlobalCorrdZ[FNSIDES]{};
1269 DataContainer mGlobalCorrdRPhi[FNSIDES]{};
1270 DataContainer mDensity[FNSIDES]{};
1271 DataContainer mPotential[FNSIDES]{};
1272 DataContainer mElectricFieldEr[FNSIDES]{};
1273 DataContainer mElectricFieldEz[FNSIDES]{};
1274 DataContainer mElectricFieldEphi[FNSIDES]{};
1275
1276 TriCubic mInterpolatorPotential[FNSIDES]{{mPotential[Side::A], mGrid3D[Side::A]}, {mPotential[Side::C], mGrid3D[Side::C]}};
1277 TriCubic mInterpolatorDensity[FNSIDES]{{mDensity[Side::A], mGrid3D[Side::A]}, {mDensity[Side::C], mGrid3D[Side::C]}};
1278 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}};
1279 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}};
1280 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}};
1281 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}};
1282 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}};
1283 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}};
1284 AnalyticalDistCorr<DataT> mAnaDistCorr;
1285 bool mUseAnaDistCorr{false};
1286 BField mBField{};
1287 SCMetaData mMeta{};
1288
1291 bool isCloseToZero(const DataT valA, const DataT valB) const { return std::abs(valA + valB) < static_cast<DataT>(0.01); }
1292
1293 static int getSign(const Side side) { return side == Side::C ? -1 : 1; }
1294
1296 DataT getInvSpacingZ(const Side side) const { return mGrid3D[side].getInvSpacingZ(); }
1297
1299 DataT getInvSpacingR(const Side side) const { return mGrid3D[side].getInvSpacingR(); }
1300
1302 DataT getInvSpacingPhi(const Side side) const { return mGrid3D[side].getInvSpacingPhi(); }
1303
1305 DataT getRMinSim(const Side side) const { return getRMin(side) - 4 * getGridSpacingR(side); }
1306
1308 DataT getRMaxSim(const Side side) const { return getRMax(side) + 2 * getGridSpacingR(side); }
1309
1310 std::string getSideName(const Side side) const { return side == Side::A ? "A" : "C"; }
1311
1313 template <typename Fields = AnalyticalFields<DataT>>
1314 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;
1315
1317 void langevinCylindricalE(DataT& ddR, DataT& ddPhi, DataT& ddZ, const DataT radius, const DataT localIntErOverEz, const DataT localIntEPhiOverEz, const DataT localIntDeltaEz) const;
1318
1320 void langevinCylindricalB(DataT& ddR, DataT& ddPhi, const DataT radius, const DataT localIntBrOverBz, const DataT localIntBPhiOverBz) const;
1321
1323 template <typename Fields = AnalyticalFields<DataT>>
1324 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;
1325
1327 template <typename Fields = AnalyticalFields<DataT>>
1328 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;
1329
1331 template <typename Fields = AnalyticalFields<DataT>>
1332 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;
1333
1335 template <typename Fields = AnalyticalFields<DataT>>
1336 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;
1337
1339 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()); }
1340
1342 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()); }
1343
1345 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
1346 {
1347 ddR = localDistCorr.evaldR(z0Tmp, radius, phi);
1348 ddZ = localDistCorr.evaldZ(z0Tmp, radius, phi);
1349 ddPhi = localDistCorr.evaldRPhi(z0Tmp, radius, phi) / radius;
1350 }
1351
1353 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;
1354
1356 size_t getNearestPhiVertex(const DataT phi, const Side side) const { return std::round(phi / getGridSpacingPhi(side)); }
1357
1359 size_t getNearestRVertex(const DataT r, const Side side) const { return std::round((r - getRMin(side)) / getGridSpacingR(side) + 0.5); }
1360
1362 size_t getPhiBinsGapFrame(const Side side) const;
1363
1365 void setPotentialBoundaryGEMFrameAlongPhi(const std::function<DataT(DataT)>& potentialFunc, const GEMstack stack, const bool bottom, const Side side, const bool outerFrame = false);
1366
1367 void getDistortionsCorrectionsAnalytical(const DataT x, const DataT y, const DataT z, const Side side, DataT& distX, DataT& distY, DataT& distZ, const bool dist) const;
1368
1369 void setBFields(o2::parameters::GRPMagField& magField);
1370
1371 void initContainer(DataContainer& data, const bool initMem = true);
1372
1373 void initAllBuffers();
1374
1375 void setBoundaryFromIndices(const std::function<DataT(DataT)>& potentialFunc, const std::vector<size_t>& indices, const Side side);
1376
1378 std::vector<size_t> getPotentialBoundaryGEMFrameAlongRIndices(const Side side) const;
1379
1381 std::vector<size_t> getPotentialBoundaryGEMFrameAlongPhiIndices(const GEMstack stack, const bool bottom, const Side side, const bool outerFrame, const bool noGap = false) const;
1382
1383 void setROCMisalignment(int stackType, int misalignmentType, int sector, const float potMin, const float potMax);
1384 void fillROCMisalignment(const std::vector<size_t>& indicesTop, const std::vector<size_t>& indicesBottom, int sector, int misalignmentType, const std::pair<float, float>& deltaPotPar);
1385
1387 void initRodAlignmentVoltages(const MisalignmentType misalignmentType, const FCType fcType, const int sector, const Side side, const float deltaPot);
1388
1389 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);
1390 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);
1391
1392 ClassDefNV(SpaceCharge, 6);
1393};
1394
1395} // namespace tpc
1396} // namespace o2
1397
1398#endif
This class provides a simple method to store values on a large 3-Dim grid with ROOT io functionality.
bool const GPUTPCGMMerger::trackCluster * c1
bool const GPUTPCGMMerger::trackCluster const clcomparestruct * c2
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
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...
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 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 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 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
float getDCAr(float tgl, const int nPoints, const float phi, o2::utils::TreeStreamRedirector *pcstream=nullptr) 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
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...
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)
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
static void unsetSimOneSector()
unsetting simulation of one sector
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
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
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