ATTPCROOT  0.3.0-alpha
A ROOT-based framework for analyzing data from active target detectors
AtEDistortionModel.cxx
Go to the documentation of this file.
1 #include "AtEDistortionModel.h"
2 
3 #include <FairLogger.h>
4 
5 #include <Math/Point2D.h>
6 #include <Math/Point2Dfwd.h> // for XYPoint
7 #include <Math/Point3D.h> // for PositionVector3D
8 #include <Math/Point3Dfwd.h> // for RhoZPhiPoint, XYZPoint
9 #include <Math/Vector2D.h>
10 #include <Math/Vector2Dfwd.h> // for XYVector
11 #include <Math/Vector3D.h>
12 #include <Math/Vector3Dfwd.h> // for XYZVector
13 
14 #include "TMath.h"
15 
16 #include <cassert> // for assert
17 #include <iostream>
18 #include <memory> // for allocator
19 
24 
26 
28 {
29 
30  if (fDistortionMap->size() == 0) {
31  LOG(error) << " Warning! Correction map is empty. No correction applied...";
32  return input;
33  }
34 
35  LOG(debug) << " Input point : " << input.X() << " " << input.Y() << " " << input.Z();
36 
37  Double_t inputRad = TMath::Sqrt(TMath::Power(input.X(), 2) + TMath::Power(input.Y(), 2));
38  Double_t inputAng = TMath::ATan2(input.Y(), input.X());
39  Double_t inputZ = input.Z();
40  // TODO:
41  // inputRad = input.Rho();
42  // inputAng = input.Phi();
43 
44  inputZ = inputZ < 0 ? 0 : inputZ;
45  inputZ = inputZ > 1000 ? 1000 : inputZ;
46 
47  auto [zcorr, radcorr, tracorr] = GetCorrectionFactors((Int_t)inputRad, (Int_t)inputZ);
48 
49  Double_t outputRad = TMath::Sqrt(TMath::Power(inputRad + radcorr, 2) + TMath::Power(tracorr, 2));
50  Double_t outputAng = inputAng + TMath::ATan2(tracorr, inputRad + radcorr);
51 
52  XYZPoint output;
53  output.SetX(outputRad * TMath::Cos(outputAng));
54  output.SetY(outputRad * TMath::Sin(outputAng));
55  output.SetZ(input.Z() - zcorr);
56  // TODO:
57  // output.SetRho(outputRad)
58  // output.SetPhi(outputAng)
59 
60  LOG(debug) << " Output point : " << output.X() << " " << output.Y() << " " << output.Z();
61 
62  return output;
63 }
64 
66 {
67  return {};
68 }
69 
70 Bool_t
71 AtEDistortionModel::SetCorrectionMaps(const std::string &zlut, const std::string &radlut, const std::string &tralut)
72 {
73 
74  fZLUT.open(zlut, std::ifstream::in);
75  fRadLUT.open(radlut, std::ifstream::in);
76  fTraLUT.open(tralut, std::ifstream::in);
77 
78  if (!fZLUT.fail() && !fRadLUT.fail() && !fTraLUT.fail()) {
79 
80  SetBufferMap(fZLUT, fZMap.get());
81  SetBufferMap(fRadLUT, fRadMap.get());
82  SetBufferMap(fTraLUT, fTraMap.get());
83 
84  SetGlobalMap(fZMap.get(), fRadMap.get(), fTraMap.get());
85 
86  return kTRUE;
87 
88  } else {
89 
90  std::cerr << " AtEDistortionModel::SetCorrectionMaps - Error! Missing LUT "
91  << "\n";
92  std::cerr << zlut << "\n";
93  std::cerr << radlut << "\n";
94  std::cerr << tralut << "\n";
95  return kFALSE;
96  }
97 }
98 
99 std::tuple<Double_t, Double_t, Double_t>
100 AtEDistortionModel::GetCorrectionFactors(const Int_t &radius, const Int_t &zpos)
101 {
102 
103  if (fDistortionMap->size() == 0) {
104  // LOG(error) << " Warning! Correction map is empty. ";
105  return std::make_tuple(0, 0, 0);
106  }
107 
108  EFieldMapRef ref{radius, zpos};
109  if (fDistortionMap->find(ref) == fDistortionMap->end()) {
110  // LOG(error) << " Correction factor not found. ";
111  return std::make_tuple(0, 0, 0);
112  } else {
113  auto corr = fDistortionMap->at(ref);
114  return std::make_tuple(corr._zcorr, corr._radcorr, corr._tracorr);
115  }
116 }
117 
118 void AtEDistortionModel::SetBufferMap(std::ifstream &lut, BufferMap *map)
119 {
120 
121  Int_t radiusCnt = 0;
122 
123  while (!lut.eof()) {
124 
125  std::string line;
126  std::getline(lut, line, '\r');
127  Int_t radius;
128  Double_t value;
129  std::istringstream buffer(line);
130  Int_t cnt = 0;
131 
132  // N.B. e20009 correction files have an extra parameter at the beginning of each line. That parameter is the
133  // radius in mm buffer >> radius;
134  radius = radiusCnt;
135 
136  while (buffer >> value) {
137 
138  EFieldMapRef ref{radius, cnt};
139  map->emplace(ref, value);
140  ++cnt;
141  }
142 
143  ++radiusCnt;
144  }
145 }
146 
147 void AtEDistortionModel::SetGlobalMap(BufferMap *zmap, BufferMap *radmap, BufferMap *tramap)
148 {
149 
150  LOG(info) << " Z map size : " << zmap->size();
151  LOG(info) << " Rad map size : " << radmap->size();
152  LOG(info) << " Tra map size : " << tramap->size();
153 
154  // NB: This is not a necessary condition but it works for the present case
155  assert((zmap->size() == radmap->size()) && (radmap->size() == tramap->size()));
156 
157  for (const auto &[key, zcorr] : *zmap) {
158  auto radcorr = radmap->at(key);
159  auto tracorr = tramap->at(key);
160  EFieldCorr corr{zcorr, radcorr, tracorr};
161  fDistortionMap->emplace(key, corr);
162  LOG(debug) << key << " " << zcorr << " " << radcorr << " " << tracorr;
163  }
164 
165  auto hashT = fDistortionMap->hash_function();
166  EFieldMapRef hashRef{200, 200};
167 
168  std::cout << " Global map size : " << fDistortionMap->size() << "\n";
169  std::cout << " Hash value for (200,200) : " << hashT(hashRef) << "\n";
170 }
171 
172 std::ostream &operator<<(std::ostream &os, const EFieldMapRef &t)
173 {
174  os << " " << t._rad << " - " << t._zpos << " ";
175  return os;
176 }
177 
178 bool operator<(const EFieldMapRef &l, const EFieldMapRef &r)
179 {
181 }
182 
183 bool operator==(const EFieldMapRef &l, const EFieldMapRef &r)
184 {
185  return l._rad == r._rad && l._zpos == r._zpos;
186 }
XYVector
ROOT::Math::XYVector XYVector
Definition: AtEDistortionModel.cxx:23
operator==
bool operator==(const EFieldMapRef &l, const EFieldMapRef &r)
Definition: AtEDistortionModel.cxx:183
EFieldMapRef
Definition: AtEDistortionModel.h:24
XYZVector
ROOT::Math::XYZVector XYZVector
Definition: AtEDistortionModel.cxx:21
AtEDistortionModel.h
AtEDistortionModel::ApplySpaceCharge
virtual XYZPoint ApplySpaceCharge(const XYZPoint &reverseInputPosition) override
Using model add space charge effect.
Definition: AtEDistortionModel.cxx:65
XYZVector
ROOT::Math::XYZVector XYZVector
Definition: AtFindVertex.h:20
EFieldMapRef::_rad
Int_t _rad
Definition: AtEDistortionModel.h:25
EFieldMapRef::_zpos
Int_t _zpos
radius integer value
Definition: AtEDistortionModel.h:26
XYPoint
ROOT::Math::XYPoint XYPoint
Definition: AtPatternCircle2D.cxx:16
XYZPoint
ROOT::Math::XYZPoint XYZPoint
Definition: AtEDistortionModel.cxx:20
XYZPoint
ROOT::Math::XYZPoint XYZPoint
Definition: AtPatternCircle2D.h:18
AtSpaceChargeModel::XYZPoint
ROOT::Math::XYZPoint XYZPoint
Definition: AtSpaceChargeModel.h:11
AtSpaceChargeModel
Definition: AtSpaceChargeModel.h:9
operator<<
std::ostream & operator<<(std::ostream &os, const EFieldMapRef &t)
Definition: AtEDistortionModel.cxx:172
EFieldCorr
Definition: AtEDistortionModel.h:18
std::hash< EFieldMapRef >
Definition: AtEDistortionModel.h:35
AtEDistortionModel::SetCorrectionMaps
Bool_t SetCorrectionMaps(const std::string &zlut, const std::string &radlut, const std::string &tralut)
Definition: AtEDistortionModel.cxx:71
BufferMap
std::unordered_map< EFieldMapRef, Double_t > BufferMap
Definition: AtEDistortionModel.h:41
operator<
bool operator<(const EFieldMapRef &l, const EFieldMapRef &r)
Definition: AtEDistortionModel.cxx:178
XYPoint
ROOT::Math::XYPoint XYPoint
Definition: AtEDistortionModel.cxx:22
AtEDistortionModel::AtEDistortionModel
AtEDistortionModel()
Definition: AtEDistortionModel.cxx:25
AtEDistortionModel::GetCorrectionFactors
std::tuple< Double_t, Double_t, Double_t > GetCorrectionFactors(const Int_t &radius, const Int_t &zpos)
Set the mapping files via file path.
Definition: AtEDistortionModel.cxx:100
AtEDistortionModel::CorrectSpaceCharge
virtual XYZPoint CorrectSpaceCharge(const XYZPoint &directInputPosition) override
Using model correct for space charge.
Definition: AtEDistortionModel.cxx:27