CbmRoot
Loading...
Searching...
No Matches
CbmRichPmt.cxx
Go to the documentation of this file.
1/* Copyright (C) 2015-2020 GSI/JINR-LIT, Darmstadt/Dubna
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Semen Lebedev, Andrey Lebedev [committer] */
4
5/*
6 * CbmRichPmt.cxx
7 *
8 * Created on: Dec 16, 2015
9 * Author: slebedev
10 */
11
12#include "CbmRichPmt.h"
13
14#include "CbmRichGeoManager.h" // for CbmRichGeoManager
15#include "CbmRichPmtType.h" // for CbmRichPmtTypeEnum, CbmRichPmtTypeCer...
16#include "CbmRichRecGeoPar.h" // for CbmRichRecGeoPar
17
18#include <Logger.h> // for LOG, Logger
19
20#include <TAxis.h> // for TAxis
21#include <TGraph.h> // for TGraph
22#include <TRandom.h> // for TRandom, gRandom
23
24#include <cstddef> // for size_t
25#include <utility> // for pair
26
27using namespace std;
28
29const Double_t CbmRichPmt::c = 2.998E8; // speed of light
30const Double_t CbmRichPmt::h = 6.626E-34; // Planck constant
31const Double_t CbmRichPmt::e = 1.6022E-19; // elementary charge
32
34
36
37Double_t CbmRichPmt::getLambda(Double_t momentum)
38{
39 Double_t refractiveIndex = CbmRichGeoManager::GetInstance().fGP->fNRefrac;
40 Double_t lambda = c / refractiveIndex * h / e / momentum; // wavelength in nm
41 return lambda;
42}
43
45{
46 map<CbmRichPmtTypeEnum, CbmRichPmtQEData*>::iterator it = fPmtDataMap.find(detType);
47 if (it == fPmtDataMap.end()) {
48 LOG(error) << "CbmRichPmt::isPhotonDetected - Wrong detector type :" << detType;
49 ;
50 return false;
51 }
52
53 CbmRichPmtQEData* pmtData = it->second;
54 if (nullptr == pmtData) {
55 LOG(error) << "CbmRichPmt::isPhotonDetected - data is nullptr for detType :" << detType;
56 return false;
57 }
58
60 Double_t lambda = c / fRefractiveIndex * h / e / momentum; // wavelength in nm
61
62 if (lambda >= pmtData->fLambdaMin && lambda < pmtData->fLambdaMax) {
63 Int_t ilambda = (Int_t)((lambda - pmtData->fLambdaMin) / pmtData->fLambdaStep);
64 Double_t rand = gRandom->Rndm();
65 if (ilambda < 0 || static_cast<size_t>(ilambda) >= pmtData->fEfficiency.size()) {
66 LOG(error) << "CbmRichPmt::isPhotonDetected ilambda out of range.";
67 return false;
68 }
69 else {
70 if (pmtData->fEfficiency[ilambda] * fCollectionEfficiency > rand) return true;
71 }
72 }
73 return false;
74}
75
77{
78 map<CbmRichPmtTypeEnum, CbmRichPmtQEData*>::iterator it = fPmtDataMap.find(detType);
79 if (it == fPmtDataMap.end()) {
80 LOG(info) << "HRich700Pmt::getQEGraph - Wrong detector type :" << detType;
81 return nullptr;
82 }
83 CbmRichPmtQEData* pmtData = it->second;
84 if (nullptr == pmtData) {
85 LOG(info) << "CbmRichPmt::getQEGraph - data is nullptr for detType :" << detType;
86 return nullptr;
87 }
88
89 const Int_t n = pmtData->fEfficiency.size();
90 Double_t x[n], y[n];
91 for (Int_t i = 0; i < n; i++) {
92 x[i] = pmtData->fLambdaMin + i * pmtData->fLambdaStep;
93 y[i] = pmtData->fEfficiency[i];
94 }
95 TGraph* gr = new TGraph(n, x, y);
96 gr->GetXaxis()->SetTitle("Wavelangth [nm]");
97 gr->GetYaxis()->SetTitle("QE");
98 gr->SetTitle("");
99 return gr;
100}
101
103{
104 for (map<CbmRichPmtTypeEnum, CbmRichPmtQEData*>::iterator it = fPmtDataMap.begin(); it != fPmtDataMap.end(); it++) {
105 if (nullptr != it->second) { delete it->second; }
106 }
107 fPmtDataMap.clear();
108}
109
111{
112 // See CbmRichPmtType.h for on details about each Pmt detector type
113
114 LOG(debug) << "CbmRichPmt init QE";
115
116
117 ClearMap();
118
119 {
122 data->fLambdaMin = 170.;
123 data->fLambdaMax = 800.;
124 data->fLambdaStep = 10.;
125
126 data->fEfficiency = {
127 0., 0.0373, 0.0768, 0.104238, 0.130168, 0.162537, 0.196098, 0.219972,
128 0.238386, 0.257846, 0.27616, 0.300536, 0.315942, 0.323639, 0.327806, 0.329745,
129 0.330278, 0.330734, 0.330734, 0.327052, 0.325578, 0.320677, 0.316751, 0.309921,
130 0.301695, 0.294525, 0.284986, 0.272276, 0.255125, 0.23644, 0.223164, 0.210214,
131 0.200552, 0.183554, 0.14927, 0.118152, 0.10057, 0.0880096, 0.0707358, 0.0612509,
132 0.0527653, 0.0464113, 0.0378286, 0.0296114, 0.022314, 0.0150159, 0.00877741, 0.003258,
133 0.00178254, 0.00248491, 0.00353476, 0.00327258, 0.00367864, 0.00352639, 0.00288406, 0.00317378,
134 0.00255156, 0.0024984, 0.00256586, 0.00174571, 0.00201436, 0.00212824, 0.00221443, 0.00254726};
135
136 fPmtDataMap.insert(pair<CbmRichPmtTypeEnum, CbmRichPmtQEData*>(data->fDetectorType, data));
137 }
138
139 {
142 data->fLambdaMin = 170.;
143 data->fLambdaMax = 800.;
144 data->fLambdaStep = 10.;
145
146 data->fEfficiency = {
147 0.15, 0.1873, 0.2268, 0.281283, 0.319146, 0.318419, 0.322942, 0.310789,
148 0.296113, 0.308306, 0.320059, 0.33156, 0.338313, 0.332637, 0.335656, 0.334134,
149 0.332542, 0.329217, 0.329217, 0.329065, 0.324032, 0.317459, 0.306133, 0.307902,
150 0.300078, 0.293836, 0.28501, 0.27188, 0.254544, 0.237351, 0.225093, 0.213887,
151 0.203469, 0.184299, 0.149514, 0.120047, 0.105304, 0.0954967, 0.0765149, 0.0673676,
152 0.0601531, 0.0536015, 0.0442024, 0.0359242, 0.0276292, 0.0193571, 0.0113956, 0.00387145,
153 0.00455862, 0.00264693, 0.00440582, 0.00444134, 0.00523567, 0.00505885, 0.00397938, 0.00436081,
154 0.0035522, 0.00354125, 0.00355477, 0.00232293, 0.0030541, 0.00306825, 0.00311562, 0.00358131};
155
156 fPmtDataMap.insert(pair<CbmRichPmtTypeEnum, CbmRichPmtQEData*>(data->fDetectorType, data));
157 }
158
159 {
162 data->fLambdaMin = 100.;
163 data->fLambdaMax = 700.;
164 data->fLambdaStep = 20.;
165
166 data->fEfficiency = {0.216, 0.216, 0.216, 0.216, 0.216, 0.216, 0.216, 0.216, 0.216, 0.216,
167 0.216, 0.227, 0.23, 0.227, 0.216, 0.2, 0.176, 0.15, 0.138, 0.1,
168 0.082, 0.06, 0.044, 0.032, 0.022, 0.015, 0.01, 0.006, 0.004};
169
170 fPmtDataMap.insert(pair<CbmRichPmtTypeEnum, CbmRichPmtQEData*>(data->fDetectorType, data));
171 }
172
173 {
176 data->fLambdaMin = 130.;
177 data->fLambdaMax = 210.;
178 data->fLambdaStep = 10.;
179
180 data->fEfficiency = {0.45, 0.4, 0.35, 0.32, 0.25, 0.2, 0.1, 0.03};
181
182 fPmtDataMap.insert(pair<CbmRichPmtTypeEnum, CbmRichPmtQEData*>(data->fDetectorType, data));
183 }
184
185 {
188 data->fLambdaMin = 260.;
189 data->fLambdaMax = 740.;
190 data->fLambdaStep = 20.;
191
192
193 data->fEfficiency = {0.06, 0.12, 0.2, 0.22, 0.22, 0.22, 0.21, 0.2, 0.18, 0.16, 0.14, 0.11,
194 0.1, 0.06, 0.047, 0.03, 0.021, 0.012, 0.006, 0.0023, 0.0008, 0.00022, 0.00007, 0.00002};
195
196 fPmtDataMap.insert(pair<CbmRichPmtTypeEnum, CbmRichPmtQEData*>(data->fDetectorType, data));
197 }
198
199 {
202 data->fLambdaMin = 200.;
203 data->fLambdaMax = 640.;
204 data->fLambdaStep = 20.;
205
206 data->fEfficiency = {0.095, 0.13, 0.16, 0.2, 0.23, 0.24, 0.25, 0.25, 0.24, 0.24, 0.23,
207 0.22, 0.2, 0.16, 0.14, 0.1, 0.065, 0.045, 0.02, 0.017, 0.007, 0.0033};
208
209 fPmtDataMap.insert(pair<CbmRichPmtTypeEnum, CbmRichPmtQEData*>(data->fDetectorType, data));
210 }
211
212 {
215 data->fLambdaMin = 160.;
216 data->fLambdaMax = 640.;
217 data->fLambdaStep = 20.;
218
219 data->fEfficiency = {0.1, 0.2, 0.2, 0.2, 0.2, 0.2, 0.23, 0.24, 0.25, 0.25, 0.24, 0.24,
220 0.23, 0.22, 0.2, 0.16, 0.14, 0.1, 0.065, 0.045, 0.02, 0.017, 0.007, 0.0033};
221
222 fPmtDataMap.insert(pair<CbmRichPmtTypeEnum, CbmRichPmtQEData*>(data->fDetectorType, data));
223 }
224
225 {
228 data->fLambdaMin = 160.;
229 data->fLambdaMax = 700.;
230 data->fLambdaStep = 10.;
231
232 data->fEfficiency = {0.0, 0.0, 0.0324, 0.0586, 0.0945, 0.1061, 0.1265, 0.1482, 0.1668, 0.1887, 0.2093,
233 0.2134, 0.2303, 0.2482, 0.2601, 0.2659, 0.2702, 0.283, 0.2863, 0.2863, 0.2884, 0.286,
234 0.2811, 0.2802, 0.272, 0.2638, 0.2562, 0.2472, 0.2368, 0.2218, 0.2032, 0.186, 0.1735,
235 0.1661, 0.1483, 0.121, 0.0959, 0.0782, 0.0647, 0.0538, 0.0372, 0.0296, 0.0237, 0.0176,
236 0.0123, 0.0083, 0.005, 0.003, 0.0017, 0.0008, 0.0006, 0.0003, 0.0003, 0.0002, 0.0001};
237
238 fPmtDataMap.insert(pair<CbmRichPmtTypeEnum, CbmRichPmtQEData*>(data->fDetectorType, data));
239 }
240
241 {
244 data->fLambdaMin = 180.;
245 data->fLambdaMax = 640.;
246 data->fLambdaStep = 10.;
247
248 data->fEfficiency = {0.178, 0.200, 0.218, 0.222, 0.226, 0.228, 0.214, 0.210, 0.229, 0.231, 0.244, 0.253,
249 0.259, 0.263, 0.266, 0.277, 0.280, 0.274, 0.275, 0.270, 0.264, 0.263, 0.254, 0.246,
250 0.239, 0.229, 0.219, 0.207, 0.193, 0.179, 0.161, 0.149, 0.135, 0.117, 0.103, 0.082,
251 0.065, 0.056, 0.036, 0.030, 0.024, 0.018, 0.013, 0.009, 0.006, 0.004, 0.002};
252
253 fPmtDataMap.insert(pair<CbmRichPmtTypeEnum, CbmRichPmtQEData*>(data->fDetectorType, data));
254 }
255
256 {
259 data->fLambdaMin = 180.;
260 data->fLambdaMax = 640.;
261 data->fLambdaStep = 10.;
262
263 data->fEfficiency = {0.202, 0.207, 0.210, 0.214, 0.218, 0.219, 0.206, 0.202, 0.220, 0.222, 0.235, 0.243,
264 0.249, 0.253, 0.256, 0.266, 0.270, 0.264, 0.265, 0.260, 0.254, 0.253, 0.244, 0.237,
265 0.229, 0.221, 0.210, 0.199, 0.186, 0.172, 0.155, 0.143, 0.129, 0.113, 0.099, 0.079,
266 0.063, 0.054, 0.035, 0.028, 0.023, 0.018, 0.013, 0.009, 0.006, 0.004, 0.002};
267
268 fPmtDataMap.insert(pair<CbmRichPmtTypeEnum, CbmRichPmtQEData*>(data->fDetectorType, data));
269 }
270
271 {
274 data->fLambdaMin = 180.;
275 data->fLambdaMax = 640.;
276 data->fLambdaStep = 10.;
277
278
279 data->fEfficiency = {0.060, 0.080, 0.096, 0.109, 0.130, 0.152, 0.172, 0.194, 0.214, 0.218, 0.235, 0.253,
280 0.265, 0.271, 0.275, 0.288, 0.291, 0.292, 0.294, 0.292, 0.287, 0.286, 0.278, 0.269,
281 0.262, 0.252, 0.242, 0.227, 0.208, 0.178, 0.170, 0.155, 0.129, 0.102, 0.083, 0.069,
282 0.058, 0.041, 0.033, 0.027, 0.020, 0.015, 0.010, 0.006, 0.004, 0.002, 0.001};
283
284 fPmtDataMap.insert(pair<CbmRichPmtTypeEnum, CbmRichPmtQEData*>(data->fDetectorType, data));
285 }
286
287 {
290 data->fLambdaMin = 180.;
291 data->fLambdaMax = 640.;
292 data->fLambdaStep = 10.;
293
294 data->fEfficiency = {0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.315, 0.344,
295 0.366, 0.378, 0.384, 0.400, 0.403, 0.404, 0.407, 0.403, 0.396, 0.395, 0.383, 0.370,
296 0.359, 0.347, 0.331, 0.310, 0.285, 0.263, 0.244, 0.232, 0.213, 0.182, 0.151, 0.126,
297 0.106, 0.092, 0.069, 0.060, 0.051, 0.042, 0.034, 0.026, 0.019, 0.014, 0.009};
298
299 fPmtDataMap.insert(pair<CbmRichPmtTypeEnum, CbmRichPmtQEData*>(data->fDetectorType, data));
300 }
301
302 {
305 data->fLambdaMin = 180.;
306 data->fLambdaMax = 640.;
307 data->fLambdaStep = 10.;
308
309 data->fEfficiency = {0.239, 0.294, 0.332, 0.351, 0.352, 0.338, 0.303, 0.286, 0.307, 0.307, 0.324, 0.340,
310 0.354, 0.364, 0.371, 0.390, 0.389, 0.392, 0.395, 0.393, 0.388, 0.388, 0.378, 0.367,
311 0.358, 0.347, 0.333, 0.310, 0.384, 0.265, 0.248, 0.238, 0.220, 0.188, 0.150, 0.123,
312 0.104, 0.089, 0.068, 0.058, 0.050, 0.041, 0.033, 0.025, 0.018, 0.013, 0.008};
313
314 fPmtDataMap.insert(pair<CbmRichPmtTypeEnum, CbmRichPmtQEData*>(data->fDetectorType, data));
315 }
316
317 {
320 data->fLambdaMin = 180.;
321 data->fLambdaMax = 640.;
322 data->fLambdaStep = 10.;
323
324 data->fEfficiency = {0.037, 0.063, 0.103, 0.110, 0.131, 0.153, 0.172, 0.195, 0.215, 0.217, 0.232, 0.249,
325 0.261, 0.267, 0.271, 0.285, 0.286, 0.285, 0.287, 0.285, 0.280, 0.279, 0.272, 0.264,
326 0.256, 0.248, 0.239, 0.223, 0.204, 0.189, 0.177, 0.170, 0.155, 0.130, 0.105, 0.087,
327 0.073, 0.060, 0.041, 0.033, 0.027, 0.020, 0.015, 0.010, 0.006, 0.004, 0.003};
328
329 fPmtDataMap.insert(pair<CbmRichPmtTypeEnum, CbmRichPmtQEData*>(data->fDetectorType, data));
330 }
331
332 {
335 data->fLambdaMin = 180.;
336 data->fLambdaMax = 640.;
337 data->fLambdaStep = 10.;
338
339 data->fEfficiency = {0.202, 0.240, 0.269, 0.277, 0.279, 0.273, 0.245, 0.228, 0.243, 0.243, 0.253, 0.259,
340 0.262, 0.263, 0.265, 0.278, 0.279, 0.281, 0.283, 0.281, 0.277, 0.275, 0.267, 0.260,
341 0.253, 0.245, 0.234, 0.219, 0.201, 0.187, 0.175, 0.167, 0.150, 0.124, 0.098, 0.080,
342 0.066, 0.055, 0.040, 0.033, 0.026, 0.020, 0.014, 0.010, 0.006, 0.004, 0.002};
343
344 fPmtDataMap.insert(pair<CbmRichPmtTypeEnum, CbmRichPmtQEData*>(data->fDetectorType, data));
345 }
346
347 {
350 data->fLambdaMin = 180.;
351 data->fLambdaMax = 640.;
352 data->fLambdaStep = 10.;
353
354 data->fEfficiency = {0.007, 0.040, 0.085, 0.103, 0.130, 0.160, 0.186, 0.215, 0.244, 0.256, 0.281, 0.310,
355 0.332, 0.344, 0.355, 0.376, 0.382, 0.386, 0.390, 0.390, 0.387, 0.386, 0.376, 0.365,
356 0.356, 0.345, 0.328, 0.302, 0.278, 0.257, 0.241, 0.227, 0.191, 0.153, 0.128, 0.112,
357 0.098, 0.085, 0.064, 0.055, 0.047, 0.039, 0.030, 0.023, 0.017, 0.011, 0.007};
358
359 fPmtDataMap.insert(pair<CbmRichPmtTypeEnum, CbmRichPmtQEData*>(data->fDetectorType, data));
360 }
361
362 {
365 data->fLambdaMin = 180.;
366 data->fLambdaMax = 640.;
367 data->fLambdaStep = 10.;
368
369 data->fEfficiency = {0.241, 0.304, 0.351, 0.364, 0.368, 0.357, 0.311, 0.279, 0.299, 0.304, 0.321, 0.329,
370 0.336, 0.342, 0.350, 0.370, 0.374, 0.379, 0.383, 0.384, 0.381, 0.382, 0.372, 0.362,
371 0.354, 0.344, 0.327, 0.300, 0.275, 0.259, 0.244, 0.231, 0.195, 0.155, 0.130, 0.113,
372 0.097, 0.083, 0.065, 0.055, 0.046, 0.038, 0.030, 0.022, 0.016, 0.011, 0.007};
373
374 fPmtDataMap.insert(pair<CbmRichPmtTypeEnum, CbmRichPmtQEData*>(data->fDetectorType, data));
375 }
376
377 {
380 data->fLambdaMin = 160.;
381 data->fLambdaMax = 640.;
382 data->fLambdaStep = 20.;
383
384 data->fEfficiency = {0.99, 0.99, 0.99, 0.99, 0.99, 0.99, 0.99, 0.99, 0.99, 0.99, 0.99, 0.99,
385 0.99, 0.99, 0.99, 0.99, 0.99, 0.99, 0.99, 0.99, 0.99, 0.99, 0.99, 0.99};
386
387 fPmtDataMap.insert(pair<CbmRichPmtTypeEnum, CbmRichPmtQEData*>(data->fDetectorType, data));
388 }
389}
ClassImp(CbmConverterManager)
Char_t * gr
CbmRichPmtTypeEnum
@ CbmRichPmtTypeCern11H8500_10
@ CbmRichPmtTypeCern12H8500_15
@ CbmRichPmtTypeH8500_03
@ CbmRichPmtTypeCern11H8500_11
@ CbmRichPmtTypeCern12H10966A_18
@ CbmRichPmtTypeCern11H8500_12
@ CbmRichPmtTypeCern11H8500_6
@ CbmRichPmtTypeCsi
@ CbmRichPmtTypeIdeal
@ CbmRichPmtTypeProtvino
@ CbmRichPmtTypeCern12H8500_16
@ CbmRichPmtTypeR11265_14
@ CbmRichPmtTypeCosy17NoWls
@ CbmRichPmtTypeR11265_13
@ CbmRichPmtTypeCosy17WithWls
@ CbmRichPmtTypeH8500
@ CbmRichPmtTypeH8500WithWls
@ CbmRichPmtTypeCern12H10966A_17
RICH geometry parameters for the reconstruction. This class is used for convinient storing of the bas...
int Int_t
bool Bool_t
CbmRichRecGeoPar * fGP
static CbmRichGeoManager & GetInstance()
std::vector< Double_t > fEfficiency
Definition CbmRichPmt.h:32
CbmRichPmtTypeEnum fDetectorType
Definition CbmRichPmt.h:28
Double_t fLambdaMax
Definition CbmRichPmt.h:30
Double_t fLambdaStep
Definition CbmRichPmt.h:31
Double_t fLambdaMin
Definition CbmRichPmt.h:29
virtual ~CbmRichPmt()
std::map< CbmRichPmtTypeEnum, CbmRichPmtQEData * > fPmtDataMap
Definition CbmRichPmt.h:59
void InitQE()
static Double_t getLambda(Double_t momentum)
static const Double_t h
Definition CbmRichPmt.h:62
TGraph * getQEGraph(CbmRichPmtTypeEnum detType)
static const Double_t c
Definition CbmRichPmt.h:61
Bool_t isPhotonDetected(CbmRichPmtTypeEnum detType, Double_t momentum)
static const Double_t e
Definition CbmRichPmt.h:63
void ClearMap()
Double_t fCollectionEfficiency
Definition CbmRichPmt.h:58
Double_t fRefractiveIndex
Definition CbmRichPmt.h:64
Hash for CbmL1LinkKey.