CbmRoot
Loading...
Searching...
No Matches
HitFactory2D.cxx
Go to the documentation of this file.
1/* Copyright (C) 2024 Facility for Antiproton and Ion Research in Europe, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Dominik Smith [committer], Alexandru Bercuci */
4
5#include "HitFactory2D.h"
6
8
9#include <numeric>
10
11using std::endl;
12using std::vector;
13
14namespace cbm::algo::trd
15{
16
17 //_______________________________________________________________________________
18 std::pair<double, double> HitFactory2D::CorrectPosition(double dx, double dy, const double xcorr,
19 const double padSizeX, const double padSizeY)
20 {
21 dx -= xcorr;
23 dy = dx - dy;
25
26 const double ycorr = GetYcorr(dy) / padSizeY;
27 dy += ycorr;
29 dx *= padSizeX;
30 dy *= padSizeY;
31 return std::make_pair(dx, dy);
32 }
33
34
35 //_______________________________________________________________________________
36 std::pair<double, double> HitFactory2D::GetDxDy(const int n0)
37 {
38 double dx, dy;
39 switch (n0) {
40 case 1:
41 if (IsMaxTilt()) { // T
42 dx = -0.5;
43 dy = 0;
44 }
45 else { // R
46 dx = 0.5;
47 dy = 0;
48 }
49 break;
50 case 2:
51 if (IsOpenLeft() && IsOpenRight()) { // RT
52 dx = viM == 1 ? 0. : -1;
53 dy = -0.5;
54 }
55 else { // TR
56 dx = 0.;
57 dy = 0.5;
58 }
59 break;
60 case 3:
61 if (IsMaxTilt() && !IsSymmHit()) { // TRT asymm
62 dx = viM == 1 ? 0. : -1;
63 dy = GetYoffset();
64 }
65 else if (!IsMaxTilt() && IsSymmHit()) { // TRT symm
66 dx = 0.;
67 dy = GetYoffset();
68 }
69 else if (IsMaxTilt() && IsSymmHit()) { // RTR symm
70 dx = GetXoffset();
71 dy = 0.;
72 }
73 else if (!IsMaxTilt() && !IsSymmHit()) { // RTR asymm
74 dx = GetXoffset();
75 dy = viM == 1 ? -0.5 : 0.5;
76 }
77 break;
78 default:
79 dx = GetXoffset();
80 dy = GetYoffset();
81 break;
82 }
84 return std::make_pair(dx, dy);
85 }
86
87 //_______________________________________________________________________________
88 double HitFactory2D::GetXoffset(int n0) const
89 {
90 double dx(0.), R(0.);
91 int n(n0 ? n0 : fSignal.size());
92 for (int ir(0); ir < n; ir++) {
93 if (fSignal[ir].xe > 0) continue; // select rectangular coupling
94 R += fSignal[ir].s;
95 dx += fSignal[ir].s * fSignal[ir].x;
96 }
97 if (std::abs(R) > 0) return dx / R;
98 //L_(debug) << "HitFactory2D::GetXoffset : Null total charge for hit size " << n;
99 return 0.;
100 }
101
102 //_______________________________________________________________________________
103 double HitFactory2D::GetYoffset(int n0) const
104 {
105 double dy(0.), T(0.);
106 int n(n0 ? n0 : fSignal.size());
107 for (int it(0); it < n; it++) {
108 if (fSignal[it].xe > 0) { // select tilted coupling
109 T += fSignal[it].s;
110 dy += fSignal[it].s * fSignal[it].x;
111 }
112 }
113 if (std::abs(T) > 0) return dy / T;
114 // L_(debug) << "HitFactory2D::GetYoffset : Null total charge for hit size " << n;
115 //if (CWRITE(1))
116 return 0.;
117 }
118
119 //_______________________________________________________________________________
121 {
125 if (dx >= -0.5 && dx < 0.5) return;
126 int ishift = int(dx - 0.5) + (dx > 0.5 ? 1 : 0);
127 if (vcM + ishift < 0)
128 ishift = -vcM;
129 else if (vcM + ishift >= nCols)
130 ishift = nCols - vcM - 1;
131
132 dx -= ishift;
133 vcM += ishift;
134 for (uint idx(0); idx < fSignal.size(); idx++)
135 fSignal[idx].x -= ishift;
136 }
137
138 //_______________________________________________________________________________
140 {
144 if (dy >= -0.5 && dy < 0.5) return;
145 int ishift = int(dy - 0.5) + (dy > 0.5 ? 1 : 0);
146 dy -= ishift;
147 }
148
149 //_______________________________________________________________________________
151 {
157 int n0(fSignal.size() - 2);
158 if ((n0 == 5 && ((IsMaxTilt() && IsSymmHit()) || (!IsMaxTilt() && !IsSymmHit()))) || // TRTRT symm/asymm
159 n0 == 4 || (n0 == 3 && ((IsMaxTilt() && IsSymmHit()) || (!IsMaxTilt() && !IsSymmHit()))))
160 return 1; // RTR symm/asymm
161 else if (n0 > 5 && HasOvf())
162 return 2;
163 return 0;
164 }
165
166 //_______________________________________________________________________________
168 {
169 int a0m = std::abs(a0);
170 uint8_t xmap = vyM & 0xff;
171 if (a0m == 2 && IsBiasXleft() && IsBiasXright() && !IsBiasXmid())
172 return 0;
173 else if (a0m == 3 && ((IsBiasXleft() && IsBiasXright()) || xmap == 116 || xmap == 149 || xmap == 208))
174 return 1;
175 else if (!IsBiasXleft()
176 && (a0m == 2
177 || (a0m == 3 && ((!IsBiasXright() && IsBiasXmid()) || xmap == 209 || xmap == 212 || xmap == 145))))
178 return 2;
179 else if (!IsBiasXright()
180 && (a0m == 2 || (a0m == 3 && ((!IsBiasXleft() && IsBiasXmid()) || xmap == 112 || xmap == 117))))
181 return 3;
182 else
183 return -1;
184 }
185
186 //_______________________________________________________________________________
187 double HitFactory2D::GetXcorr(double dxIn, int typ, int cls) const
188 {
194 if (typ < 0 || typ > 2) {
195 //L_(error)<< GetName() << "::GetXcorr : type in-param "<<typ<<" out of range.";
196 return 0;
197 }
198 double dx = std::abs(dxIn);
199 int ii = std::max(0, Nint(dx / fgCorrXdx) - 1), i0; // i1;
200
201 if (ii < 0 || ii > NBINSCORRX) {
202 // L_(debug) << GetName() << "::GetXcorr : LUT idx " << ii << " out of range for dx=" << dxIn;
203 return 0;
204 }
205 if (dx < fgCorrXdx * ii) {
206 i0 = std::max(0, ii - 1);
207 /*i1=ii;*/
208 }
209 else {
210 i0 = ii;
211 /*i1=TMath::Min(NBINSCORRX-1,ii+1);*/
212 }
213
214 float* xval = &fgCorrXval[typ][i0];
215 if (cls == 1)
216 xval = &fgCorrRcXval[typ][i0];
217 else if (cls == 2)
218 xval = &fgCorrRcXbiasXval[typ][i0];
219 double DDx = (xval[1] - xval[0]), a = DDx / fgCorrXdx, b = xval[0] - DDx * (i0 + 0.5);
220 return (dxIn > 0 ? 1 : -1) * b + a * dxIn;
221 }
222
223 //_______________________________________________________________________________
224 double HitFactory2D::GetYcorr(double dy, int /* cls*/) const
225 {
229 float fdy(1.), yoff(0.);
230 int n0(fSignal.size() - 2);
231 switch (n0) {
232 case 3:
233 fdy = fgCorrYval[0][0];
234 yoff = fgCorrYval[0][1];
235 if (IsMaxTilt() && IsSymmHit()) {
236 fdy = 0.;
237 yoff = (dy > 0 ? -1 : 1) * 1.56;
238 }
239 else if (!IsMaxTilt() && !IsSymmHit()) {
240 fdy = 0.;
241 yoff = (dy > 0 ? -1 : 1) * 1.06;
242 }
243 else if (!IsMaxTilt() && IsSymmHit()) {
244 fdy = 2.114532;
245 yoff = -0.263;
246 }
247 else /*if(IsMaxTilt()&&!IsSymmHit())*/ {
248 fdy = 2.8016010;
249 yoff = -1.38391;
250 }
251 break;
252 case 4:
253 fdy = fgCorrYval[1][0];
254 yoff = fgCorrYval[1][1];
255 if ((!IsMaxTilt() && IsLeftHit()) || (IsMaxTilt() && !IsLeftHit())) yoff *= -1;
256 break;
257 case 5:
258 case 7:
259 case 9:
260 case 11:
261 fdy = fgCorrYval[2][0];
262 yoff = fgCorrYval[2][1];
263 break;
264 case 6:
265 case 8:
266 case 10:
267 fdy = fgCorrYval[3][0];
268 yoff = fgCorrYval[3][1];
269 if ((!IsMaxTilt() && IsLeftHit()) || (IsMaxTilt() && !IsLeftHit())) yoff *= -1;
270 break;
271 }
272 return dy * fdy + yoff;
273 }
274
275 //_______________________________________________________________________________
277 {
278 int nR = fSignal.size() - 1 - viM;
279 return (nR % 2 && IsMaxTilt()) || (!(nR % 2) && !IsMaxTilt());
280 }
281
282 float HitFactory2D::fgCorrXdx = 0.01;
284 {-0.001, -0.001, -0.002, -0.002, -0.003, -0.003, -0.003, -0.004, -0.004, -0.006, -0.006, -0.006, -0.007,
285 -0.007, -0.008, -0.008, -0.008, -0.009, -0.009, -0.011, -0.011, -0.011, -0.012, -0.012, -0.012, -0.012,
286 -0.013, -0.013, -0.013, -0.013, -0.014, -0.014, -0.014, -0.014, -0.014, -0.016, -0.016, -0.016, -0.016,
287 -0.017, -0.017, -0.017, -0.018, -0.018, -0.018, -0.018, -0.018, 0.000, 0.000, 0.000},
288 {0.467, 0.430, 0.396, 0.364, 0.335, 0.312, 0.291, 0.256, 0.234, 0.219, 0.207, 0.191, 0.172,
289 0.154, 0.147, 0.134, 0.123, 0.119, 0.109, 0.122, 0.113, 0.104, 0.093, 0.087, 0.079, 0.073,
290 0.067, 0.063, 0.058, 0.053, 0.049, 0.046, 0.042, 0.038, 0.036, 0.032, 0.029, 0.027, 0.024,
291 0.022, 0.019, 0.017, 0.014, 0.013, 0.011, 0.009, 0.007, 0.004, 0.003, 0.001},
292 {0.001, 0.001, 0.001, 0.001, 0.002, 0.002, 0.001, 0.002, 0.004, 0.003, 0.002, 0.002, 0.002,
293 0.002, 0.002, 0.002, 0.003, 0.004, 0.003, 0.004, 0.004, 0.007, 0.003, 0.004, 0.002, 0.002,
294 -0.011, -0.011, -0.012, -0.012, -0.012, -0.013, -0.013, -0.013, -0.014, -0.014, -0.014, -0.016, -0.016,
295 -0.016, -0.017, -0.017, -0.017, -0.018, -0.018, -0.018, -0.019, 0.029, 0.018, 0.001}};
296 float HitFactory2D::fgCorrYval[NBINSCORRY][2] = {{2.421729, 0.},
297 {0.629389, -0.215285},
298 {0.23958, 0.},
299 {0.151913, 0.054404}};
301 {-0.00050, -0.00050, -0.00150, -0.00250, -0.00250, -0.00350, -0.00450, -0.00450, -0.00550, -0.00650,
302 -0.00650, -0.00750, -0.00850, -0.00850, -0.00850, -0.00950, -0.00950, -0.00950, -0.01050, -0.01150,
303 -0.01150, -0.01150, -0.01250, -0.01250, -0.01250, -0.01250, -0.01350, -0.01350, -0.01350, -0.01350,
304 -0.01450, -0.01450, -0.01450, -0.01550, -0.01550, -0.01550, -0.01550, -0.01650, -0.01650, -0.01550,
305 -0.01650, -0.01614, -0.01620, -0.01624, -0.01626, -0.01627, -0.01626, -0.01624, -0.01620, -0.01615},
306 {0.36412, 0.34567, 0.32815, 0.31152, 0.29574, 0.28075, 0.26652, 0.25302, 0.24020, 0.22803,
307 0.21647, 0.21400, 0.19400, 0.18520, 0.17582, 0.16600, 0.14600, 0.13800, 0.14280, 0.14200,
308 0.13400, 0.12600, 0.12200, 0.11000, 0.10200, 0.09400, 0.09000, 0.08600, 0.08200, 0.07400,
309 0.07000, 0.06600, 0.06600, 0.06200, 0.05800, 0.05400, 0.05400, 0.05000, 0.04600, 0.04600,
310 0.04200, 0.03800, 0.03800, 0.03400, 0.03400, 0.03000, 0.03000, 0.02600, 0.02200, 0.02200}};
312 {0.00100, 0.00260, 0.00540, 0.00740, 0.00900, 0.01060, 0.01300, 0.01460, 0.01660, 0.01900,
313 0.02060, 0.02260, 0.02420, 0.02700, 0.02860, 0.02980, 0.03220, 0.03340, 0.03540, 0.03620,
314 0.03820, 0.04020, 0.04180, 0.04340, 0.04460, 0.04620, 0.04740, 0.04941, 0.05088, 0.05233,
315 0.05375, 0.05515, 0.05653, 0.05788, 0.05921, 0.06052, 0.06180, 0.06306, 0.06430, 0.06551,
316 0.06670, 0.06786, 0.06901, 0.07012, 0.07122, 0.07229, 0.07334, 0.07436, 0.07536, 0.07634},
317 {0.00100, 0.00380, 0.00780, 0.00900, 0.01220, 0.01460, 0.01860, 0.01940, 0.02260, 0.02540,
318 0.02820, 0.03060, 0.03220, 0.03660, 0.03980, 0.04094, 0.04420, 0.04620, 0.04824, 0.04980,
319 0.05298, 0.05532, 0.05740, 0.05991, 0.06217, 0.06500, 0.06540, 0.06900, 0.07096, 0.07310,
320 0.07380, 0.07729, 0.07935, 0.08139, 0.08340, 0.08538, 0.08734, 0.08928, 0.08900, 0.09307,
321 0.09493, 0.09340, 0.09858, 0.09620, 0.09740, 0.10386, 0.09980, 0.10726, 0.10892, 0.11056},
322 {0.00011, 0.00140, 0.00340, 0.00420, 0.00500, 0.00620, 0.00820, 0.00860, 0.01060, 0.01100,
323 0.01220, 0.01340, 0.01500, 0.01540, 0.01700, 0.01820, 0.01900, 0.02060, 0.02180, 0.02260,
324 0.02340, 0.02420, 0.02500, 0.02500, 0.02660, 0.02740, 0.02820, 0.02900, 0.03020, 0.03180,
325 0.03300, 0.03260, 0.03380, 0.03460, 0.03500, 0.03580, 0.03780, 0.03820, 0.03860, 0.03900,
326 0.04100, 0.04180, 0.04060, 0.04300, 0.04340, 0.04340, 0.04380, 0.04460, 0.04580, 0.04540}};
327
328} // namespace cbm::algo::trd
#define NBINSCORRY
#define NBINSCORRX
static float fgCorrYval[NBINSCORRY][2]
discretized correction LUT
void RecenterYoffset(double &dy)
Shift graph representation to [-0.5, 0.5].
std::pair< double, double > GetDxDy(const int n0)
std::pair< double, double > CorrectPosition(double dx, double dy, const double xcorr, const double padSizeX, const double padSizeY)
Shift graph representation to [-0.5, 0.5].
static float fgCorrXval[3][NBINSCORRX]
step of the discretized correction LUT
int Nint(T x) const
discretized correction LUT
double GetYoffset(int n0=0) const
uint16_t vyM
index of maximum signal in the projection
static float fgCorrRcXbiasXval[3][NBINSCORRX]
discretized correction LUT
double GetYcorr(double dy, int cls=0) const
y position correction based on LUT
std::vector< signal > fSignal
uint8_t vcM
start time of current hit [clk]
int GetHitRcClass(int a0) const
Hit classification wrt signal bias.
double GetXoffset(int n0=0) const
int GetHitClass() const
Hit classification wrt center pad.
double GetXcorr(double dx, int typ, int cls=0) const
static float fgCorrRcXval[2][NBINSCORRX]
discretized correction params