ATTPCROOT  0.3.0-alpha
A ROOT-based framework for analyzing data from active target detectors
AtGadgetIIMap.cxx
Go to the documentation of this file.
1 #include "AtGadgetIIMap.h"
2 
3 #include <FairLogger.h>
4 
5 #include <Math/Point2D.h>
6 #include <Rtypes.h>
7 #include <TH2Poly.h>
8 #include <TString.h>
9 
10 #include <boost/multi_array/base.hpp>
11 #include <boost/multi_array/extent_gen.hpp>
12 #include <boost/multi_array/multi_array_ref.hpp>
13 #include <boost/multi_array/subarray.hpp>
14 
15 #include <algorithm>
16 #include <cstdlib>
17 #include <fstream> // IWYU pragma: keep
18 #include <iostream>
19 #include <string>
20 #include <vector>
21 
22 constexpr auto cRED = "\033[1;31m";
23 constexpr auto cYELLOW = "\033[1;33m";
24 constexpr auto cNORMAL = "\033[0m";
25 
27 
29 {
30  AtPadCoord.resize(boost::extents[1024][4][2]);
31  std::fill(AtPadCoord.data(), AtPadCoord.data() + AtPadCoord.num_elements(), 0);
32  std::cout << " GADGETII Map initialized " << std::endl;
33  std::cout << " GADGETII Pad Coordinates container initialized " << std::endl;
35  fNumberPads = 1012;
36 }
37 
39 
41 
43 {
44  if (fPadPlane) {
45  LOG(error) << "Skipping generation of pad plane, it is already parsed!";
46  return;
47  }
48 
49  Float_t pad_size = 2.2; // mm
50  Float_t pad_spacing = 0.001; // mm
51 
52  std::vector<int> pads_per_row{18, 18, 18, 17, 17, 17, 17, 16, 16, 15, 15, 14, 13, 12, 11, 9, 7, 3};
53 
54  int pad_num = 0;
55 
56  for (auto irow = 0; irow < pads_per_row.size(); ++irow) {
57 
58  for (auto ipad = 0; ipad < pads_per_row[irow]; ++ipad) {
59  AtPadCoord[ipad + pad_num][0][0] = ipad * pad_size;
60  AtPadCoord[ipad + pad_num][0][1] = -irow * pad_size;
61  AtPadCoord[ipad + pad_num][1][0] = ipad * pad_size + pad_size;
62  AtPadCoord[ipad + pad_num][1][1] = -irow * pad_size;
63  AtPadCoord[ipad + pad_num][2][0] = ipad * pad_size + pad_size;
64  AtPadCoord[ipad + pad_num][2][1] = -pad_size - irow * pad_size;
65  AtPadCoord[ipad + pad_num][3][0] = ipad * pad_size;
66  AtPadCoord[ipad + pad_num][3][1] = -pad_size - irow * pad_size;
67  }
68 
69  std::cout << " Row " << irow << " Number of pads " << pad_num << "\n";
70  pad_num += pads_per_row[irow];
71  }
72 
73  // Veto Pads
74  AtPadCoord[pad_num][0][0] = 22.0;
75  AtPadCoord[pad_num][0][1] = -34.0;
76  AtPadCoord[pad_num][1][0] = 22.0;
77  AtPadCoord[pad_num][1][1] = -36.0;
78  AtPadCoord[pad_num][2][0] = 24.0;
79  AtPadCoord[pad_num][2][1] = -36.0;
80  AtPadCoord[pad_num][3][0] = 24.0;
81  AtPadCoord[pad_num][3][1] = -34.0;
82 
83  pad_num += 1;
84 
85  AtPadCoord[pad_num][0][0] = 34.0;
86  AtPadCoord[pad_num][0][1] = -22.0;
87  AtPadCoord[pad_num][1][0] = 36.0;
88  AtPadCoord[pad_num][1][1] = -22.0;
89  AtPadCoord[pad_num][2][0] = 36.0;
90  AtPadCoord[pad_num][2][1] = -24.0;
91  AtPadCoord[pad_num][3][0] = 34.0;
92  AtPadCoord[pad_num][3][1] = -24.0;
93 
94  pad_num += 1;
95 
96  for (auto irow = 0; irow < pads_per_row.size(); ++irow) {
97 
98  for (auto ipad = 0; ipad < pads_per_row[irow]; ++ipad) {
99  AtPadCoord[ipad + pad_num][0][0] = -ipad * pad_size;
100  AtPadCoord[ipad + pad_num][0][1] = -irow * pad_size;
101  AtPadCoord[ipad + pad_num][1][0] = -ipad * pad_size - pad_size;
102  AtPadCoord[ipad + pad_num][1][1] = -irow * pad_size;
103  AtPadCoord[ipad + pad_num][2][0] = -ipad * pad_size - pad_size;
104  AtPadCoord[ipad + pad_num][2][1] = -pad_size - irow * pad_size;
105  AtPadCoord[ipad + pad_num][3][0] = -ipad * pad_size;
106  AtPadCoord[ipad + pad_num][3][1] = -pad_size - irow * pad_size;
107  }
108 
109  std::cout << " Row " << irow << " Number of pads " << pad_num << "\n";
110  pad_num += pads_per_row[irow];
111  }
112 
113  // Veto Pads
114  AtPadCoord[pad_num][0][0] = -22.0;
115  AtPadCoord[pad_num][0][1] = -34.0;
116  AtPadCoord[pad_num][1][0] = -22.0;
117  AtPadCoord[pad_num][1][1] = -36.0;
118  AtPadCoord[pad_num][2][0] = -24.0;
119  AtPadCoord[pad_num][2][1] = -36.0;
120  AtPadCoord[pad_num][3][0] = -24.0;
121  AtPadCoord[pad_num][3][1] = -34.0;
122 
123  pad_num += 1;
124 
125  AtPadCoord[pad_num][0][0] = -34.0;
126  AtPadCoord[pad_num][0][1] = -22.0;
127  AtPadCoord[pad_num][1][0] = -36.0;
128  AtPadCoord[pad_num][1][1] = -22.0;
129  AtPadCoord[pad_num][2][0] = -36.0;
130  AtPadCoord[pad_num][2][1] = -24.0;
131  AtPadCoord[pad_num][3][0] = -34.0;
132  AtPadCoord[pad_num][3][1] = -24.0;
133 
134  pad_num += 1;
135 
136  for (auto irow = 0; irow < pads_per_row.size(); ++irow) {
137 
138  for (auto ipad = 0; ipad < pads_per_row[irow]; ++ipad) {
139  AtPadCoord[ipad + pad_num][0][0] = -ipad * pad_size;
140  AtPadCoord[ipad + pad_num][0][1] = irow * pad_size;
141  AtPadCoord[ipad + pad_num][1][0] = -ipad * pad_size - pad_size;
142  AtPadCoord[ipad + pad_num][1][1] = irow * pad_size;
143  AtPadCoord[ipad + pad_num][2][0] = -ipad * pad_size - pad_size;
144  AtPadCoord[ipad + pad_num][2][1] = pad_size + irow * pad_size;
145  AtPadCoord[ipad + pad_num][3][0] = -ipad * pad_size;
146  AtPadCoord[ipad + pad_num][3][1] = pad_size + irow * pad_size;
147  }
148 
149  std::cout << " Row " << irow << " Number of pads " << pad_num << "\n";
150  pad_num += pads_per_row[irow];
151  }
152 
153  // Veto Pads
154  AtPadCoord[pad_num][0][0] = -22.0;
155  AtPadCoord[pad_num][0][1] = 34.0;
156  AtPadCoord[pad_num][1][0] = -22.0;
157  AtPadCoord[pad_num][1][1] = 36.0;
158  AtPadCoord[pad_num][2][0] = -24.0;
159  AtPadCoord[pad_num][2][1] = 36.0;
160  AtPadCoord[pad_num][3][0] = -24.0;
161  AtPadCoord[pad_num][3][1] = 34.0;
162 
163  pad_num += 1;
164 
165  AtPadCoord[pad_num][0][0] = -34.0;
166  AtPadCoord[pad_num][0][1] = 22.0;
167  AtPadCoord[pad_num][1][0] = -36.0;
168  AtPadCoord[pad_num][1][1] = 22.0;
169  AtPadCoord[pad_num][2][0] = -36.0;
170  AtPadCoord[pad_num][2][1] = 24.0;
171  AtPadCoord[pad_num][3][0] = -34.0;
172  AtPadCoord[pad_num][3][1] = 24.0;
173 
174  pad_num += 1;
175 
176  for (auto irow = 0; irow < pads_per_row.size(); ++irow) {
177 
178  for (auto ipad = 0; ipad < pads_per_row[irow]; ++ipad) {
179  AtPadCoord[ipad + pad_num][0][0] = ipad * pad_size;
180  AtPadCoord[ipad + pad_num][0][1] = irow * pad_size;
181  AtPadCoord[ipad + pad_num][1][0] = ipad * pad_size + pad_size;
182  AtPadCoord[ipad + pad_num][1][1] = irow * pad_size;
183  AtPadCoord[ipad + pad_num][2][0] = ipad * pad_size + pad_size;
184  AtPadCoord[ipad + pad_num][2][1] = pad_size + irow * pad_size;
185  AtPadCoord[ipad + pad_num][3][0] = ipad * pad_size;
186  AtPadCoord[ipad + pad_num][3][1] = pad_size + irow * pad_size;
187  }
188 
189  std::cout << " Row " << irow << " Number of pads " << pad_num << "\n";
190  pad_num += pads_per_row[irow];
191  }
192 
193  // Veto Pads
194  AtPadCoord[pad_num][0][0] = 22.0;
195  AtPadCoord[pad_num][0][1] = 34.0;
196  AtPadCoord[pad_num][1][0] = 22.0;
197  AtPadCoord[pad_num][1][1] = 36.0;
198  AtPadCoord[pad_num][2][0] = 24.0;
199  AtPadCoord[pad_num][2][1] = 36.0;
200  AtPadCoord[pad_num][3][0] = 24.0;
201  AtPadCoord[pad_num][3][1] = 34.0;
202 
203  pad_num += 1;
204 
205  AtPadCoord[pad_num][0][0] = 34.0;
206  AtPadCoord[pad_num][0][1] = 22.0;
207  AtPadCoord[pad_num][1][0] = 36.0;
208  AtPadCoord[pad_num][1][1] = 22.0;
209  AtPadCoord[pad_num][2][0] = 36.0;
210  AtPadCoord[pad_num][2][1] = 24.0;
211  AtPadCoord[pad_num][3][0] = 34.0;
212  AtPadCoord[pad_num][3][1] = 24.0;
213 
214  pad_num += 1;
215 
216  std::cout << " Total pads " << pad_num << "\n";
217 
218  // fPadInd = pad_num;
219  kIsParsed = true;
220 
221  fPadPlane = new TH2Poly(); // NOLINT
222  for (auto ipad = 0; ipad < pad_num; ++ipad) {
223  Double_t px[] = {AtPadCoord[ipad][0][0], AtPadCoord[ipad][1][0], AtPadCoord[ipad][2][0], AtPadCoord[ipad][3][0],
224  AtPadCoord[ipad][0][0]};
225  Double_t py[] = {AtPadCoord[ipad][0][1], AtPadCoord[ipad][1][1], AtPadCoord[ipad][2][1], AtPadCoord[ipad][3][1],
226  AtPadCoord[ipad][0][1]};
227  fPadPlane->AddBin(5, px, py);
228  }
229 
230  fPadPlane->SetName("GADGETII_Plane");
231  fPadPlane->SetTitle("GADGETII_Plane");
232  fPadPlane->ChangePartition(500, 500);
233 }
234 
236 {
237 
238  if (!kIsParsed) {
239  LOG(error) << " AtGadgetMap::CalcPadCenter Error : Pad plane has not been generated or parsed";
240  return {-9999, -9999};
241  }
242 
243  if (PadRef == -1) { // Boost multi_array crashes with a negative index
244  LOG(debug) << " AtGadgetMap::CalcPadCenter Error : Pad not found";
245  return {-9999, -9999};
246  }
247 
248  Float_t x = (AtPadCoord[PadRef][0][0] + AtPadCoord[PadRef][1][0]) / 2.0;
249  Float_t y = (AtPadCoord[PadRef][1][1] + AtPadCoord[PadRef][2][1]) / 2.0;
250  return {x, y};
251 }
252 
254 {
255  TString dir = getenv("VMCWORKDIR");
256  TString mapFile = "GADGETII_BinToPad_08232021.txt"; // hardcoded for now
257  TString mapFileWithPath = dir + "/scripts/" + mapFile;
258 
259  std::ifstream file;
260  // file.exceptions(std::ifstream::failbit | std::ifstream::badbit);
261 
262  try {
263 
264  file.open(mapFileWithPath.Data());
265 
266  while (!file.eof()) {
267 
268  std::string line;
269  std::getline(file, line);
270 
271  Int_t pad = 0, bin = 0; // Energy, cross section, placeholder
272 
273  // read with default seperator (space) seperated elements
274  std::istringstream isxs(line);
275 
276  isxs >> pad >> bin;
277 
278  std::cout << " Pad " << pad << " - Bin " << bin << "\n";
279 
280  fBinToPadTable.emplace(bin, pad);
281  }
282 
283  } catch (...) {
284  std::cout << " AtGadgetIIMap::SetBinToPadMap : Error when reading " << mapFileWithPath.Data() << "!" << cNORMAL
285  << std::endl;
286  }
287 }
288 
289 /*Int_t AtGadgetIIMap::BinToPad(Int_t binval)
290 {
291 
292 
293 
294  fBinToPadTableIt = fBinToPadTable.find(binval);
295 
296  if (fBinToPadTableIt != fBinToPadTable.end()) {
297  std::cout << "Element Found - ";
298  std::cout << fBinToPadTableIt->first << "::" << fBinToPadTableIt->second << std::endl;
299  return fBinToPadTableIt->second;
300  } else {
301  std::cout << "Element Not Found" << std::endl;
302  return -1;
303  }
304  }*/
305 
AtMap
Definition: AtMap.h:33
AtGadgetIIMap.h
AtGadgetIIMap::CalcPadCenter
ROOT::Math::XYPoint CalcPadCenter(Int_t PadRef) override
Definition: AtGadgetIIMap.cxx:235
AtGadgetIIMap::AtGadgetIIMap
AtGadgetIIMap()
Definition: AtGadgetIIMap.cxx:28
ClassImp
ClassImp(AtFindVertex)
XYPoint
ROOT::Math::XYPoint XYPoint
Definition: AtPatternCircle2D.cxx:16
cYELLOW
constexpr auto cYELLOW
Definition: AtGadgetIIMap.cxx:23
AtGadgetIIMap::~AtGadgetIIMap
~AtGadgetIIMap()
XYPoint
ROOT::Math::XYPoint XYPoint
Definition: AtGadgetIIMap.cxx:26
AtMap::AtPadCoord
multiarray AtPadCoord
Definition: AtMap.h:41
AtMap::fNumberPads
UInt_t fNumberPads
Definition: AtMap.h:48
AtMap::kIsParsed
Bool_t kIsParsed
Definition: AtMap.h:43
AtGadgetIIMap
Definition: AtGadgetIIMap.h:22
y
const double * y
Definition: lmcurve.cxx:20
AtGadgetIIMap::SetBinToPadMap
void SetBinToPadMap()
Definition: AtGadgetIIMap.cxx:253
cNORMAL
constexpr auto cNORMAL
Definition: AtGadgetIIMap.cxx:24
AtGadgetIIMap::Dump
void Dump() override
Definition: AtGadgetIIMap.cxx:40
cRED
constexpr auto cRED
Definition: AtGadgetIIMap.cxx:22
AtMap::fPadPlane
TH2Poly * fPadPlane
Definition: AtMap.h:47
AtGadgetIIMap::GeneratePadPlane
void GeneratePadPlane() override
Definition: AtGadgetIIMap.cxx:42