10 #include <FairLogger.h>
12 #include <Math/Point2D.h>
16 #include <TMathBase.h>
18 #include <boost/multi_array/base.hpp>
19 #include <boost/multi_array/extent_gen.hpp>
20 #include <boost/multi_array/multi_array_ref.hpp>
21 #include <boost/multi_array/subarray.hpp>
29 #undef BOOST_MULTI_ARRAY_NO_GENERATORS
30 #define BOOST_MULTI_ARRAY_NO_GENERATORS
36 constexpr
auto cRED =
"\033[1;31m";
42 AtPadCoord.resize(boost::extents[10240][3][2]);
44 std::cout <<
" ATTPC Map initialized " << std::endl;
45 std::cout <<
" ATTPC Pad Coordinates container initialized " << std::endl;
54 std::ofstream coordmap;
55 coordmap.open(
"coordmap.txt");
58 for (
index i = 0; i != 10240; ++i) {
60 for (
index j = 0; j != 3; ++j) {
61 for (
index k = 0; k != 2; ++k) {
62 std::cout <<
" ATTPC Triangular pad coordinates - Pad Index : " << i <<
" X(" << j <<
") - Y(" << k
68 coordmap << std::endl;
78 LOG(error) <<
"Skipping generation of pad plane because it was already parsed!";
82 std::cout <<
" ATTPC Map : Generating the map geometry of the ATTPC " << std::endl;
84 Float_t pads_in_half_hex = 0;
85 Float_t pads_in_hex = 0;
86 Float_t row_length = 0;
87 Float_t pads_in_half_row = 0;
88 Int_t pads_out_half_hex = 0;
89 Int_t pads_in_row = 0;
91 Float_t pad_x_off = 0;
92 Float_t pad_y_off = 0;
93 Float_t tmp_pad_x_off = 0;
94 Float_t tmp_pad_y_off = 0;
96 Float_t small_z_spacing = 2 * 25.4 / 1000.;
97 Float_t small_tri_side = 184. * 25.4 / 1000.;
98 Double_t umega_radius = 10826.772 * 25.4 / 1000.;
99 Float_t beam_image_radius = 4842.52 * 25.4 / 1000.;
101 Int_t pad_index_aux = 0;
103 Float_t small_x_spacing = 2. * small_z_spacing / TMath::Sqrt(3.);
104 Float_t small_y_spacing = small_x_spacing * TMath::Sqrt(3.);
105 Float_t dotted_s_tri_side = 4. * small_x_spacing + small_tri_side;
106 Float_t dotted_s_tri_hi = dotted_s_tri_side * TMath::Sqrt(3.) / 2.;
107 Float_t dotted_l_tri_side = 2. * dotted_s_tri_side;
108 Float_t dotted_l_tri_hi = dotted_l_tri_side * TMath::Sqrt(3.) / 2.;
109 Float_t large_x_spacing = small_x_spacing;
110 Float_t large_y_spacing = small_y_spacing;
111 Float_t large_tri_side = dotted_l_tri_side - 4. * large_x_spacing;
112 Float_t large_tri_hi = dotted_l_tri_side * TMath::Sqrt(3.) / 2.;
114 Float_t row_len_s = pow(2, TMath::Ceil(TMath::Log(beam_image_radius / dotted_s_tri_side) / TMath::Log(2.0)));
115 Float_t row_len_l = TMath::Floor(umega_radius / dotted_l_tri_hi);
120 for (Int_t j = 0; j < row_len_l; j++) {
121 pads_in_half_hex = 0;
124 row_length = TMath::Abs(sqrt(pow(umega_radius, 2) - pow((j * dotted_l_tri_hi + dotted_l_tri_hi / 2.), 2)));
126 if (j < row_len_s / 2.) {
128 pads_in_half_hex = (2 * row_len_s - 2 * j) / 4.;
129 pads_in_hex = 2 * row_len_s - 1. - 2. * j;
133 pads_in_half_row = row_length / dotted_l_tri_side;
134 pads_out_half_hex =
static_cast<Int_t
>(TMath::Nint(2 * (pads_in_half_row - pads_in_half_hex)));
135 pads_in_row = 2 * pads_out_half_hex + 4 * pads_in_half_hex - 1;
139 for (Int_t i = 0; i < pads_in_row; i++) {
145 if (((pads_in_row - 1) / 2) % 2 == 1)
152 pad_x_off = -(pads_in_half_hex + pads_out_half_hex / 2.) * dotted_l_tri_side + i * dotted_l_tri_side / 2. +
153 2. * large_x_spacing + xoff;
155 if (i < pads_out_half_hex || i > (pads_in_hex + pads_out_half_hex - 1) || j > (row_len_s / 2. - 1)) {
157 pad_y_off = j * dotted_l_tri_hi + large_y_spacing + yoff;
159 pad_y_off += large_tri_hi;
161 fill_coord(pad_index, pad_x_off, pad_y_off, large_tri_side, ort);
167 pad_y_off = j * dotted_l_tri_hi + large_y_spacing + yoff;
169 pad_y_off = j * dotted_l_tri_hi + 2 * dotted_s_tri_hi - small_y_spacing + yoff;
170 fill_coord(pad_index, pad_x_off, pad_y_off, small_tri_side, ort);
173 tmp_pad_x_off = pad_x_off + dotted_s_tri_side / 2.;
174 tmp_pad_y_off = pad_y_off + ort * dotted_s_tri_hi - 2 * ort * small_y_spacing;
175 fill_coord(pad_index, tmp_pad_x_off, tmp_pad_y_off, small_tri_side, -ort);
178 tmp_pad_y_off = pad_y_off + ort * dotted_s_tri_hi;
179 fill_coord(pad_index, tmp_pad_x_off, tmp_pad_y_off, small_tri_side, ort);
182 tmp_pad_x_off = pad_x_off + dotted_s_tri_side;
183 fill_coord(pad_index, tmp_pad_x_off, pad_y_off, small_tri_side, ort);
191 for (Int_t i = 0; i < pad_index; i++) {
192 for (Int_t j = 0; j < 3; j++) {
200 std::cout <<
"created pads: " << pad_index + pad_index_aux << std::endl;
225 AtPadCoord[pindex][1][0] = padxoff + triside / 2.;
226 AtPadCoord[pindex][1][1] = padyoff + fort * triside * TMath::Sqrt(3.) / 2.;
235 LOG(error) <<
" AtTpcMap::CalcPadCenter Error : Pad plane has not been generated or parsed ";
236 return {-9999, -9999};
239 LOG(debug) <<
" AtTpcMap::CalcPadCenter Error : Pad not found";
240 return {-9999, -9999};