Project
Loading...
Searching...
No Matches
PadResponse.cxx
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
12#include "TRDBase/PadResponse.h"
13
14using namespace o2::trd;
15using namespace o2::trd::constants;
16
17void PadResponse::samplePRF()
18{
19 //
20 // Samples the pad response function
21 //
22
23 constexpr int kPRFbin = 61; // arbitraty value - need documentation/ref.
24 constexpr float prf[NLAYER][kPRFbin] = {
25 {2.9037e-02, 3.3608e-02, 3.9020e-02, 4.5292e-02,
26 5.2694e-02, 6.1362e-02, 7.1461e-02, 8.3362e-02,
27 9.7063e-02, 1.1307e-01, 1.3140e-01, 1.5235e-01,
28 1.7623e-01, 2.0290e-01, 2.3294e-01, 2.6586e-01,
29 3.0177e-01, 3.4028e-01, 3.8077e-01, 4.2267e-01,
30 4.6493e-01, 5.0657e-01, 5.4655e-01, 5.8397e-01,
31 6.1767e-01, 6.4744e-01, 6.7212e-01, 6.9188e-01,
32 7.0627e-01, 7.1499e-01, 7.1851e-01, 7.1499e-01,
33 7.0627e-01, 6.9188e-01, 6.7212e-01, 6.4744e-01,
34 6.1767e-01, 5.8397e-01, 5.4655e-01, 5.0657e-01,
35 4.6493e-01, 4.2267e-01, 3.8077e-01, 3.4028e-01,
36 3.0177e-01, 2.6586e-01, 2.3294e-01, 2.0290e-01,
37 1.7623e-01, 1.5235e-01, 1.3140e-01, 1.1307e-01,
38 9.7063e-02, 8.3362e-02, 7.1461e-02, 6.1362e-02,
39 5.2694e-02, 4.5292e-02, 3.9020e-02, 3.3608e-02,
40 2.9037e-02},
41 {2.5478e-02, 2.9695e-02, 3.4655e-02, 4.0454e-02,
42 4.7342e-02, 5.5487e-02, 6.5038e-02, 7.6378e-02,
43 8.9696e-02, 1.0516e-01, 1.2327e-01, 1.4415e-01,
44 1.6794e-01, 1.9516e-01, 2.2573e-01, 2.5959e-01,
45 2.9694e-01, 3.3719e-01, 3.7978e-01, 4.2407e-01,
46 4.6889e-01, 5.1322e-01, 5.5569e-01, 5.9535e-01,
47 6.3141e-01, 6.6259e-01, 6.8882e-01, 7.0983e-01,
48 7.2471e-01, 7.3398e-01, 7.3761e-01, 7.3398e-01,
49 7.2471e-01, 7.0983e-01, 6.8882e-01, 6.6259e-01,
50 6.3141e-01, 5.9535e-01, 5.5569e-01, 5.1322e-01,
51 4.6889e-01, 4.2407e-01, 3.7978e-01, 3.3719e-01,
52 2.9694e-01, 2.5959e-01, 2.2573e-01, 1.9516e-01,
53 1.6794e-01, 1.4415e-01, 1.2327e-01, 1.0516e-01,
54 8.9696e-02, 7.6378e-02, 6.5038e-02, 5.5487e-02,
55 4.7342e-02, 4.0454e-02, 3.4655e-02, 2.9695e-02,
56 2.5478e-02},
57 {2.2363e-02, 2.6233e-02, 3.0782e-02, 3.6140e-02,
58 4.2535e-02, 5.0157e-02, 5.9197e-02, 6.9900e-02,
59 8.2707e-02, 9.7811e-02, 1.1548e-01, 1.3601e-01,
60 1.5998e-01, 1.8739e-01, 2.1840e-01, 2.5318e-01,
61 2.9182e-01, 3.3373e-01, 3.7837e-01, 4.2498e-01,
62 4.7235e-01, 5.1918e-01, 5.6426e-01, 6.0621e-01,
63 6.4399e-01, 6.7700e-01, 7.0472e-01, 7.2637e-01,
64 7.4206e-01, 7.5179e-01, 7.5551e-01, 7.5179e-01,
65 7.4206e-01, 7.2637e-01, 7.0472e-01, 6.7700e-01,
66 6.4399e-01, 6.0621e-01, 5.6426e-01, 5.1918e-01,
67 4.7235e-01, 4.2498e-01, 3.7837e-01, 3.3373e-01,
68 2.9182e-01, 2.5318e-01, 2.1840e-01, 1.8739e-01,
69 1.5998e-01, 1.3601e-01, 1.1548e-01, 9.7811e-02,
70 8.2707e-02, 6.9900e-02, 5.9197e-02, 5.0157e-02,
71 4.2535e-02, 3.6140e-02, 3.0782e-02, 2.6233e-02,
72 2.2363e-02},
73 {1.9635e-02, 2.3167e-02, 2.7343e-02, 3.2293e-02,
74 3.8224e-02, 4.5335e-02, 5.3849e-02, 6.4039e-02,
75 7.6210e-02, 9.0739e-02, 1.0805e-01, 1.2841e-01,
76 1.5216e-01, 1.7960e-01, 2.1099e-01, 2.4671e-01,
77 2.8647e-01, 3.2996e-01, 3.7660e-01, 4.2547e-01,
78 4.7536e-01, 5.2473e-01, 5.7215e-01, 6.1632e-01,
79 6.5616e-01, 6.9075e-01, 7.1939e-01, 7.4199e-01,
80 7.5838e-01, 7.6848e-01, 7.7227e-01, 7.6848e-01,
81 7.5838e-01, 7.4199e-01, 7.1939e-01, 6.9075e-01,
82 6.5616e-01, 6.1632e-01, 5.7215e-01, 5.2473e-01,
83 4.7536e-01, 4.2547e-01, 3.7660e-01, 3.2996e-01,
84 2.8647e-01, 2.4671e-01, 2.1099e-01, 1.7960e-01,
85 1.5216e-01, 1.2841e-01, 1.0805e-01, 9.0739e-02,
86 7.6210e-02, 6.4039e-02, 5.3849e-02, 4.5335e-02,
87 3.8224e-02, 3.2293e-02, 2.7343e-02, 2.3167e-02,
88 1.9635e-02},
89 {1.7224e-02, 2.0450e-02, 2.4286e-02, 2.8860e-02,
90 3.4357e-02, 4.0979e-02, 4.8966e-02, 5.8612e-02,
91 7.0253e-02, 8.4257e-02, 1.0102e-01, 1.2094e-01,
92 1.4442e-01, 1.7196e-01, 2.0381e-01, 2.4013e-01,
93 2.8093e-01, 3.2594e-01, 3.7450e-01, 4.2563e-01,
94 4.7796e-01, 5.2991e-01, 5.7974e-01, 6.2599e-01,
95 6.6750e-01, 7.0344e-01, 7.3329e-01, 7.5676e-01,
96 7.7371e-01, 7.8410e-01, 7.8793e-01, 7.8410e-01,
97 7.7371e-01, 7.5676e-01, 7.3329e-01, 7.0344e-01,
98 6.6750e-01, 6.2599e-01, 5.7974e-01, 5.2991e-01,
99 4.7796e-01, 4.2563e-01, 3.7450e-01, 3.2594e-01,
100 2.8093e-01, 2.4013e-01, 2.0381e-01, 1.7196e-01,
101 1.4442e-01, 1.2094e-01, 1.0102e-01, 8.4257e-02,
102 7.0253e-02, 5.8612e-02, 4.8966e-02, 4.0979e-02,
103 3.4357e-02, 2.8860e-02, 2.4286e-02, 2.0450e-02,
104 1.7224e-02},
105 {1.5096e-02, 1.8041e-02, 2.1566e-02, 2.5793e-02,
106 3.0886e-02, 3.7044e-02, 4.4515e-02, 5.3604e-02,
107 6.4668e-02, 7.8109e-02, 9.4364e-02, 1.1389e-01,
108 1.3716e-01, 1.6461e-01, 1.9663e-01, 2.3350e-01,
109 2.7527e-01, 3.2170e-01, 3.7214e-01, 4.2549e-01,
110 4.8024e-01, 5.3460e-01, 5.8677e-01, 6.3512e-01,
111 6.7838e-01, 7.1569e-01, 7.4655e-01, 7.7071e-01,
112 7.8810e-01, 7.9871e-01, 8.0255e-01, 7.9871e-01,
113 7.8810e-01, 7.7071e-01, 7.4655e-01, 7.1569e-01,
114 6.7838e-01, 6.3512e-01, 5.8677e-01, 5.3460e-01,
115 4.8024e-01, 4.2549e-01, 3.7214e-01, 3.2170e-01,
116 2.7527e-01, 2.3350e-01, 1.9663e-01, 1.6461e-01,
117 1.3716e-01, 1.1389e-01, 9.4364e-02, 7.8109e-02,
118 6.4668e-02, 5.3604e-02, 4.4515e-02, 3.7044e-02,
119 3.0886e-02, 2.5793e-02, 2.1566e-02, 1.8041e-02,
120 1.5096e-02}};
121
122 // More sampling precision with linear interpolation
123 std::array<float, kPRFbin> pad{};
124 int sPRFbin = kPRFbin;
125 float sPRFwid = (mPRFhi - mPRFlo) / ((float)sPRFbin);
126 for (int iPad = 0; iPad < sPRFbin; iPad++) {
127 pad[iPad] = ((float)iPad + 0.5) * sPRFwid + mPRFlo;
128 }
129
130 mPRFwid = (mPRFhi - mPRFlo) / ((float)mPRFbin);
131 mPRFpad = ((int)(1.0 / mPRFwid));
132
133 int ipos1;
134 int ipos2;
135 float diff;
136
137 for (int iLayer = 0; iLayer < NLAYER; ++iLayer) {
138 for (int iBin = 0; iBin < mPRFbin; ++iBin) {
139 float bin = (((float)iBin) + 0.5) * mPRFwid + mPRFlo;
140 ipos1 = ipos2 = 0;
141 diff = 0;
142 do {
143 diff = bin - pad[ipos2++];
144 } while ((diff > 0) && (ipos2 < kPRFbin));
145 if (ipos2 == kPRFbin) {
146 mPRFsmp[iLayer * mPRFbin + iBin] = prf[iLayer][ipos2 - 1];
147 } else if (ipos2 == 1) {
148 mPRFsmp[iLayer * mPRFbin + iBin] = prf[iLayer][ipos2 - 1];
149 } else {
150 --ipos2;
151 if (ipos2 >= kPRFbin) {
152 ipos2 = kPRFbin - 1;
153 }
154 ipos1 = ipos2 - 1;
155 mPRFsmp[iLayer * mPRFbin + iBin] = prf[iLayer][ipos2] + diff * (prf[iLayer][ipos2] - prf[iLayer][ipos1]) / sPRFwid;
156 }
157 }
158 }
159}
160
161int PadResponse::getPRF(double signal, double dist, int layer, double* pad) const
162{
163 //
164 // Applies the pad response
165 //
166 int iBin = ((int)((-dist - mPRFlo) / mPRFwid));
167 int iOff = layer * mPRFbin;
168
169 int iBin0 = iBin - mPRFpad + iOff;
170 int iBin1 = iBin + iOff;
171 int iBin2 = iBin + mPRFpad + iOff;
172
173 pad[0] = 0;
174 pad[1] = 0;
175 pad[2] = 0;
176
177 if ((iBin1 >= 0) && (iBin1 < (mPRFbin * NLAYER))) {
178 if (iBin0 >= 0) {
179 pad[0] = signal * mPRFsmp[iBin0];
180 }
181 pad[1] = signal * mPRFsmp[iBin1];
182 if (iBin2 < (mPRFbin * NLAYER)) {
183 pad[2] = signal * mPRFsmp[iBin2];
184 }
185 return 1;
186 } else {
187 return 0;
188 }
189}
int getPRF(double, double, int, double *) const
GLenum GLuint GLint GLint layer
Definition glcorearb.h:1310
constexpr int NLAYER
the number of layers
Definition Constants.h:27