mirror of
https://github.com/gwm17/Mask.git
synced 2024-11-22 10:18:50 -05:00
Modified DeadChannels such that there is now a Sabre and Anasen version. Implemented in AnasenEfficiency. Small changes to StripDetector.
This commit is contained in:
parent
3cd32f29c4
commit
ca7ae04f23
290
etc/AnasenDeadChannels.txt
Normal file
290
etc/AnasenDeadChannels.txt
Normal file
|
@ -0,0 +1,290 @@
|
||||||
|
6 FQQQ 1 RING NONE 6
|
||||||
|
16 FQQQ 0 RING NONE 0
|
||||||
|
17 FQQQ 0 RING NONE 1
|
||||||
|
18 FQQQ 0 RING NONE 2
|
||||||
|
19 FQQQ 0 RING NONE 3
|
||||||
|
20 FQQQ 0 RING NONE 4
|
||||||
|
23 FQQQ 0 RING NONE 7
|
||||||
|
24 FQQQ 0 RING NONE 8
|
||||||
|
27 FQQQ 0 RING NONE 11
|
||||||
|
28 FQQQ 0 RING NONE 12
|
||||||
|
29 FQQQ 0 RING NONE 13
|
||||||
|
30 FQQQ 0 RING NONE 14
|
||||||
|
32 FQQQ 1 WEDGE NONE 15
|
||||||
|
37 FQQQ 1 WEDGE NONE 10
|
||||||
|
38 FQQQ 1 WEDGE NONE 9
|
||||||
|
40 FQQQ 1 WEDGE NONE 7
|
||||||
|
48 FQQQ 0 WEDGE NONE 15
|
||||||
|
49 FQQQ 0 WEDGE NONE 14
|
||||||
|
50 FQQQ 0 WEDGE NONE 13
|
||||||
|
51 FQQQ 0 WEDGE NONE 12
|
||||||
|
52 FQQQ 0 WEDGE NONE 11
|
||||||
|
59 FQQQ 0 WEDGE NONE 4
|
||||||
|
64 FQQQ 2 RING NONE 0
|
||||||
|
65 FQQQ 2 RING NONE 1
|
||||||
|
66 FQQQ 2 RING NONE 2
|
||||||
|
67 FQQQ 2 RING NONE 3
|
||||||
|
68 FQQQ 2 RING NONE 4
|
||||||
|
69 FQQQ 2 RING NONE 5
|
||||||
|
70 FQQQ 2 RING NONE 6
|
||||||
|
71 FQQQ 2 RING NONE 7
|
||||||
|
72 FQQQ 2 RING NONE 8
|
||||||
|
73 FQQQ 2 RING NONE 9
|
||||||
|
74 FQQQ 2 RING NONE 10
|
||||||
|
75 FQQQ 2 RING NONE 11
|
||||||
|
76 FQQQ 2 RING NONE 12
|
||||||
|
77 FQQQ 2 RING NONE 13
|
||||||
|
78 FQQQ 2 RING NONE 14
|
||||||
|
79 FQQQ 2 RING NONE 15
|
||||||
|
80 FQQQ 3 RING NONE 0
|
||||||
|
81 FQQQ 3 RING NONE 1
|
||||||
|
82 FQQQ 3 RING NONE 2
|
||||||
|
83 FQQQ 3 RING NONE 3
|
||||||
|
84 FQQQ 3 RING NONE 4
|
||||||
|
85 FQQQ 3 RING NONE 5
|
||||||
|
86 FQQQ 3 RING NONE 6
|
||||||
|
87 FQQQ 3 RING NONE 7
|
||||||
|
88 FQQQ 3 RING NONE 8
|
||||||
|
89 FQQQ 3 RING NONE 9
|
||||||
|
90 FQQQ 3 RING NONE 10
|
||||||
|
91 FQQQ 3 RING NONE 11
|
||||||
|
92 FQQQ 3 RING NONE 12
|
||||||
|
93 FQQQ 3 RING NONE 13
|
||||||
|
94 FQQQ 3 RING NONE 14
|
||||||
|
95 FQQQ 3 RING NONE 15
|
||||||
|
96 FQQQ 2 WEDGE NONE 15
|
||||||
|
97 FQQQ 2 WEDGE NONE 14
|
||||||
|
98 FQQQ 2 WEDGE NONE 13
|
||||||
|
99 FQQQ 2 WEDGE NONE 12
|
||||||
|
100 FQQQ 2 WEDGE NONE 11
|
||||||
|
101 FQQQ 2 WEDGE NONE 10
|
||||||
|
102 FQQQ 2 WEDGE NONE 9
|
||||||
|
103 FQQQ 2 WEDGE NONE 8
|
||||||
|
104 FQQQ 2 WEDGE NONE 7
|
||||||
|
105 FQQQ 2 WEDGE NONE 6
|
||||||
|
106 FQQQ 2 WEDGE NONE 5
|
||||||
|
107 FQQQ 2 WEDGE NONE 4
|
||||||
|
108 FQQQ 2 WEDGE NONE 3
|
||||||
|
109 FQQQ 2 WEDGE NONE 2
|
||||||
|
110 FQQQ 2 WEDGE NONE 1
|
||||||
|
111 FQQQ 2 WEDGE NONE 0
|
||||||
|
114 FQQQ 3 WEDGE NONE 13
|
||||||
|
127 FQQQ 3 WEDGE NONE 0
|
||||||
|
128 BARREL1B B FRONT DOWN 7
|
||||||
|
129 BARREL1B B FRONT UP 6
|
||||||
|
130 BARREL1B B FRONT DOWN 5
|
||||||
|
131 BARREL1B B FRONT UP 4
|
||||||
|
132 BARREL1B B FRONT UP 3
|
||||||
|
133 BARREL1B B FRONT DOWN 2
|
||||||
|
134 BARREL1B B FRONT UP 1
|
||||||
|
135 BARREL1B B FRONT DOWN 0
|
||||||
|
136 BARREL1B A FRONT DOWN 7
|
||||||
|
137 BARREL1B A FRONT UP 6
|
||||||
|
138 BARREL1B A FRONT DOWN 5
|
||||||
|
139 BARREL1B A FRONT UP 4
|
||||||
|
140 BARREL1B A FRONT UP 3
|
||||||
|
141 BARREL1B A FRONT DOWN 2
|
||||||
|
142 BARREL1B A FRONT UP 1
|
||||||
|
143 BARREL1B A FRONT DOWN 0
|
||||||
|
144 BARREL1B C FRONT DOWN 7
|
||||||
|
145 BARREL1B C FRONT UP 6
|
||||||
|
168 BARREL1B E FRONT DOWN 7
|
||||||
|
169 BARREL1B E FRONT UP 6
|
||||||
|
170 BARREL1B E FRONT DOWN 5
|
||||||
|
171 BARREL1B E FRONT UP 4
|
||||||
|
172 BARREL1B E FRONT UP 3
|
||||||
|
173 BARREL1B E FRONT DOWN 2
|
||||||
|
174 BARREL1B E FRONT UP 1
|
||||||
|
175 BARREL1B E FRONT DOWN 0
|
||||||
|
176 BARREL1A B FRONT DOWN 7
|
||||||
|
177 BARREL1A B FRONT UP 6
|
||||||
|
178 BARREL1A B FRONT DOWN 5
|
||||||
|
179 BARREL1A B FRONT UP 4
|
||||||
|
180 BARREL1A B FRONT UP 3
|
||||||
|
181 BARREL1A B FRONT DOWN 2
|
||||||
|
182 BARREL1A B FRONT UP 1
|
||||||
|
183 BARREL1A B FRONT DOWN 0
|
||||||
|
184 BARREL1A A FRONT DOWN 7
|
||||||
|
185 BARREL1A A FRONT UP 6
|
||||||
|
186 BARREL1A A FRONT DOWN 5
|
||||||
|
187 BARREL1A A FRONT UP 4
|
||||||
|
188 BARREL1A A FRONT UP 3
|
||||||
|
189 BARREL1A A FRONT DOWN 2
|
||||||
|
190 BARREL1A A FRONT UP 1
|
||||||
|
191 BARREL1A A FRONT DOWN 0
|
||||||
|
192 BQQQ 3 RING NONE 0
|
||||||
|
193 BQQQ 3 RING NONE 1
|
||||||
|
194 BQQQ 3 RING NONE 2
|
||||||
|
195 BQQQ 3 RING NONE 3
|
||||||
|
196 BQQQ 3 RING NONE 4
|
||||||
|
197 BQQQ 3 RING NONE 5
|
||||||
|
198 BQQQ 3 RING NONE 6
|
||||||
|
199 BQQQ 3 RING NONE 7
|
||||||
|
200 BQQQ 3 RING NONE 8
|
||||||
|
201 BQQQ 3 RING NONE 9
|
||||||
|
202 BQQQ 3 RING NONE 10
|
||||||
|
203 BQQQ 3 RING NONE 11
|
||||||
|
204 BQQQ 3 RING NONE 12
|
||||||
|
205 BQQQ 3 RING NONE 13
|
||||||
|
206 BQQQ 3 RING NONE 14
|
||||||
|
207 BQQQ 3 RING NONE 15
|
||||||
|
208 BQQQ 2 RING NONE 0
|
||||||
|
209 BQQQ 2 RING NONE 1
|
||||||
|
210 BQQQ 2 RING NONE 2
|
||||||
|
211 BQQQ 2 RING NONE 3
|
||||||
|
212 BQQQ 2 RING NONE 4
|
||||||
|
213 BQQQ 2 RING NONE 5
|
||||||
|
214 BQQQ 2 RING NONE 6
|
||||||
|
215 BQQQ 2 RING NONE 7
|
||||||
|
216 BQQQ 2 RING NONE 8
|
||||||
|
217 BQQQ 2 RING NONE 9
|
||||||
|
218 BQQQ 2 RING NONE 10
|
||||||
|
219 BQQQ 2 RING NONE 11
|
||||||
|
220 BQQQ 2 RING NONE 12
|
||||||
|
221 BQQQ 2 RING NONE 13
|
||||||
|
222 BQQQ 2 RING NONE 14
|
||||||
|
223 BQQQ 2 RING NONE 15
|
||||||
|
224 BARREL2A B FRONT DOWN 7
|
||||||
|
225 BARREL2A B FRONT UP 6
|
||||||
|
226 BARREL2A B FRONT DOWN 5
|
||||||
|
227 BARREL2A B FRONT UP 4
|
||||||
|
228 BARREL2A B FRONT UP 3
|
||||||
|
229 BARREL2A B FRONT DOWN 2
|
||||||
|
230 BARREL2A B FRONT UP 1
|
||||||
|
231 BARREL2A B FRONT DOWN 0
|
||||||
|
232 BARREL2A A FRONT DOWN 7
|
||||||
|
233 BARREL2A A FRONT UP 6
|
||||||
|
234 BARREL2A A FRONT DOWN 5
|
||||||
|
235 BARREL2A A FRONT UP 4
|
||||||
|
236 BARREL2A A FRONT UP 3
|
||||||
|
237 BARREL2A A FRONT DOWN 2
|
||||||
|
238 BARREL2A A FRONT UP 1
|
||||||
|
239 BARREL2A A FRONT DOWN 0
|
||||||
|
240 BARREL2A F FRONT DOWN 7
|
||||||
|
241 BARREL2A F FRONT UP 6
|
||||||
|
242 BARREL2A F FRONT DOWN 5
|
||||||
|
243 BARREL2A F FRONT UP 4
|
||||||
|
244 BARREL2A F FRONT UP 3
|
||||||
|
245 BARREL2A F FRONT DOWN 2
|
||||||
|
246 BARREL2A F FRONT UP 1
|
||||||
|
247 BARREL2A F FRONT DOWN 0
|
||||||
|
248 BARREL2A E FRONT DOWN 7
|
||||||
|
249 BARREL2A E FRONT UP 6
|
||||||
|
250 BARREL2A E FRONT DOWN 5
|
||||||
|
251 BARREL2A E FRONT UP 4
|
||||||
|
252 BARREL2A E FRONT UP 3
|
||||||
|
253 BARREL2A E FRONT DOWN 2
|
||||||
|
254 BARREL2A E FRONT UP 1
|
||||||
|
255 BARREL2A E FRONT DOWN 0
|
||||||
|
265 BQQQ 1 RING NONE 9
|
||||||
|
266 BQQQ 1 RING NONE 10
|
||||||
|
304 BARREL2B B FRONT DOWN 7
|
||||||
|
305 BARREL2B B FRONT UP 6
|
||||||
|
306 BARREL2B B FRONT DOWN 5
|
||||||
|
307 BARREL2B B FRONT UP 4
|
||||||
|
308 BARREL2B B FRONT UP 3
|
||||||
|
309 BARREL2B B FRONT DOWN 2
|
||||||
|
310 BARREL2B B FRONT UP 1
|
||||||
|
311 BARREL2B B FRONT DOWN 0
|
||||||
|
312 BARREL2B A FRONT DOWN 7
|
||||||
|
313 BARREL2B A FRONT UP 6
|
||||||
|
314 BARREL2B A FRONT DOWN 5
|
||||||
|
315 BARREL2B A FRONT UP 4
|
||||||
|
316 BARREL2B A FRONT UP 3
|
||||||
|
317 BARREL2B A FRONT DOWN 2
|
||||||
|
318 BARREL2B A FRONT UP 1
|
||||||
|
319 BARREL2B A FRONT DOWN 0
|
||||||
|
334 BARREL1B F BACK NONE 1
|
||||||
|
335 BARREL1B F BACK NONE 0
|
||||||
|
343 BARREL1A D BACK NONE 0
|
||||||
|
347 BARREL1A E BACK NONE 0
|
||||||
|
358 BARREL2B F FRONT UP 1
|
||||||
|
359 BARREL2B F FRONT DOWN 0
|
||||||
|
368 BARREL2A C FRONT DOWN 7
|
||||||
|
369 BARREL2A C FRONT UP 6
|
||||||
|
370 BARREL2A C FRONT DOWN 5
|
||||||
|
371 BARREL2A C FRONT UP 4
|
||||||
|
372 BARREL2A C FRONT UP 3
|
||||||
|
373 BARREL2A C FRONT DOWN 2
|
||||||
|
374 BARREL2A C FRONT UP 1
|
||||||
|
375 BARREL2A C FRONT DOWN 0
|
||||||
|
376 BARREL2A D FRONT DOWN 7
|
||||||
|
377 BARREL2A D FRONT UP 6
|
||||||
|
378 BARREL2A D FRONT DOWN 5
|
||||||
|
379 BARREL2A D FRONT UP 4
|
||||||
|
380 BARREL2A D FRONT UP 3
|
||||||
|
381 BARREL2A D FRONT DOWN 2
|
||||||
|
382 BARREL2A D FRONT UP 1
|
||||||
|
383 BARREL2A D FRONT DOWN 0
|
||||||
|
386 BARREL2B C BACK NONE 1
|
||||||
|
394 BARREL2B E BACK NONE 1
|
||||||
|
398 BARREL2B F BACK NONE 1
|
||||||
|
402 BARREL2A C BACK NONE 1
|
||||||
|
406 BARREL2A D BACK NONE 1
|
||||||
|
408 BARREL2A E BACK NONE 3
|
||||||
|
409 BARREL2A E BACK NONE 2
|
||||||
|
410 BARREL2A E BACK NONE 1
|
||||||
|
411 BARREL2A E BACK NONE 0
|
||||||
|
412 BARREL2A F BACK NONE 3
|
||||||
|
413 BARREL2A F BACK NONE 2
|
||||||
|
414 BARREL2A F BACK NONE 1
|
||||||
|
415 BARREL2A F BACK NONE 0
|
||||||
|
416 BARREL1A F FRONT DOWN 7
|
||||||
|
417 BARREL1A F FRONT UP 6
|
||||||
|
418 BARREL1A F FRONT DOWN 5
|
||||||
|
419 BARREL1A F FRONT UP 4
|
||||||
|
420 BARREL1A F FRONT UP 3
|
||||||
|
421 BARREL1A F FRONT DOWN 2
|
||||||
|
422 BARREL1A F FRONT UP 1
|
||||||
|
423 BARREL1A F FRONT DOWN 0
|
||||||
|
424 BARREL1A E FRONT DOWN 7
|
||||||
|
425 BARREL1A E FRONT UP 6
|
||||||
|
426 BARREL1A E FRONT DOWN 5
|
||||||
|
427 BARREL1A E FRONT UP 4
|
||||||
|
428 BARREL1A E FRONT UP 3
|
||||||
|
429 BARREL1A E FRONT DOWN 2
|
||||||
|
430 BARREL1A E FRONT UP 1
|
||||||
|
431 BARREL1A E FRONT DOWN 0
|
||||||
|
432 BARREL1A C FRONT DOWN 7
|
||||||
|
433 BARREL1A C FRONT UP 6
|
||||||
|
434 BARREL1A C FRONT DOWN 5
|
||||||
|
435 BARREL1A C FRONT UP 4
|
||||||
|
436 BARREL1A C FRONT UP 3
|
||||||
|
437 BARREL1A C FRONT DOWN 2
|
||||||
|
438 BARREL1A C FRONT UP 1
|
||||||
|
439 BARREL1A C FRONT DOWN 0
|
||||||
|
440 BARREL1A D FRONT DOWN 7
|
||||||
|
441 BARREL1A D FRONT UP 6
|
||||||
|
442 BARREL1A D FRONT DOWN 5
|
||||||
|
443 BARREL1A D FRONT UP 4
|
||||||
|
444 BARREL1A D FRONT UP 3
|
||||||
|
445 BARREL1A D FRONT DOWN 2
|
||||||
|
446 BARREL1A D FRONT UP 1
|
||||||
|
447 BARREL1A D FRONT DOWN 0
|
||||||
|
448 BARREL2A A BACK NONE 3
|
||||||
|
449 BARREL2A A BACK NONE 2
|
||||||
|
450 BARREL2A A BACK NONE 1
|
||||||
|
451 BARREL2A A BACK NONE 0
|
||||||
|
454 BARREL2A B BACK NONE 1
|
||||||
|
457 BARREL1A A BACK NONE 2
|
||||||
|
461 BARREL1A B BACK NONE 2
|
||||||
|
462 BARREL1A B BACK NONE 1
|
||||||
|
463 BARREL1A B BACK NONE 0
|
||||||
|
464 BARREL2B A BACK NONE 3
|
||||||
|
465 BARREL2B A BACK NONE 2
|
||||||
|
466 BARREL2B A BACK NONE 1
|
||||||
|
467 BARREL2B A BACK NONE 0
|
||||||
|
468 BARREL2B B BACK NONE 3
|
||||||
|
469 BARREL2B B BACK NONE 2
|
||||||
|
470 BARREL2B B BACK NONE 1
|
||||||
|
471 BARREL2B B BACK NONE 0
|
||||||
|
472 BARREL1B A BACK NONE 3
|
||||||
|
473 BARREL1B A BACK NONE 2
|
||||||
|
474 BARREL1B A BACK NONE 1
|
||||||
|
475 BARREL1B A BACK NONE 0
|
||||||
|
476 BARREL1B B BACK NONE 3
|
||||||
|
477 BARREL1B B BACK NONE 2
|
||||||
|
478 BARREL1B B BACK NONE 1
|
||||||
|
479 BARREL1B B BACK NONE 0
|
||||||
|
528 BQQQ 3 WEDGE NONE 15
|
||||||
|
537 BQQQ 3 WEDGE NONE 6
|
|
@ -1,30 +1,30 @@
|
||||||
For SX3's: det id | mid rho | mid z | mid phi | name
|
For SX3's: det id | mid rho | mid z | mid phi | name
|
||||||
For QQQ's: det id | mid phi | z | name
|
For QQQ's: det id | mid phi | z | name
|
||||||
0 5.49779 0 QQQ_0
|
0 2.30659 0 QQQ_0
|
||||||
1 0.785398 0.8028 QQQ_1
|
1 7.01897 0.8028 QQQ_1
|
||||||
2 2.35619 0 QQQ_2
|
2 5.44818 0 QQQ_2
|
||||||
3 3.92699 0 QQQ_3
|
3 3.87738 0 QQQ_3
|
||||||
6 8.90601 6.25 0.785795 R1a_A
|
6 8.90601 6.25 5.49739 R1a_A
|
||||||
7 8.89871 6.25 0.262014 R1a_B
|
7 8.89871 6.25 6.02117 R1a_B
|
||||||
8 8.90354 6.25 6.02132 R1a_C
|
8 8.90354 6.25 0.261868 R1a_C
|
||||||
9 8.90247 6.25 5.49779 R1a_D
|
9 8.90247 6.25 0.785398 R1a_D
|
||||||
10 8.90354 6.25 4.97426 R1a_E
|
10 8.90354 6.25 1.30893 R1a_E
|
||||||
11 8.90354 6.25 4.45052 R1a_F
|
11 8.90354 6.25 1.83266 R1a_F
|
||||||
12 8.90247 6.25 3.92699 R1b_A
|
12 8.90247 6.25 2.35619 R1b_A
|
||||||
13 8.90354 6.25 3.40346 R1b_B
|
13 8.90354 6.25 2.87972 R1b_B
|
||||||
14 8.90354 6.25 2.87972 R1b_C
|
14 8.90354 6.25 3.40346 R1b_C
|
||||||
15 8.90247 6.25 2.35619 R1b_D
|
15 8.90247 6.25 3.92699 R1b_D
|
||||||
16 8.90354 6.25 1.83266 R1b_E
|
16 8.90354 6.25 4.45052 R1b_E
|
||||||
17 8.90354 6.25 1.30893 R1b_F
|
17 8.90354 6.25 4.97426 R1b_F
|
||||||
18 8.90601 18.65 0.785795 R2a_A
|
18 8.90601 18.65 5.49739 R2a_A
|
||||||
19 8.89871 18.65 0.262014 R2a_B
|
19 8.89871 18.65 6.02117 R2a_B
|
||||||
20 8.90354 18.65 6.02132 R2a_C
|
20 8.90354 18.65 0.261868 R2a_C
|
||||||
21 8.90247 18.65 5.49779 R2a_D
|
21 8.90247 18.65 0.785398 R2a_D
|
||||||
22 8.90354 18.65 4.97426 R2a_E
|
22 8.90354 18.65 1.30893 R2a_E
|
||||||
23 8.90354 18.65 4.45052 R2a_F
|
23 8.90354 18.65 1.83266 R2a_F
|
||||||
24 8.90247 18.65 3.92699 R2b_A
|
24 8.90247 18.65 2.35619 R2b_A
|
||||||
25 8.90354 18.65 3.40346 R2b_B
|
25 8.90354 18.65 2.87972 R2b_B
|
||||||
26 8.90354 18.65 2.87972 R2b_C
|
26 8.90354 18.65 3.40346 R2b_C
|
||||||
27 8.90247 18.65 2.35619 R2b_D
|
27 8.90247 18.65 3.92699 R2b_D
|
||||||
28 8.90354 18.65 1.83266 R2b_E
|
28 8.90354 18.65 4.45052 R2b_E
|
||||||
29 8.90354 18.65 1.30893 R2b_F
|
29 8.90354 18.65 4.97426 R2b_F
|
||||||
|
|
53
include/AnasenDeadChannelMap.h
Normal file
53
include/AnasenDeadChannelMap.h
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
#ifndef ANASENDEADCHANNELMAP_H
|
||||||
|
#define ANASENDEADCHANNELMAP_H
|
||||||
|
|
||||||
|
#include <unordered_map>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
enum class AnasenDetectorType
|
||||||
|
{
|
||||||
|
Barrel1,
|
||||||
|
Barrel2,
|
||||||
|
FQQQ,
|
||||||
|
BQQQ
|
||||||
|
};
|
||||||
|
|
||||||
|
enum AnasenDetectorSide
|
||||||
|
{
|
||||||
|
Front=0,
|
||||||
|
Back=1
|
||||||
|
};
|
||||||
|
|
||||||
|
class AnasenDeadChannelMap
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
AnasenDeadChannelMap();
|
||||||
|
AnasenDeadChannelMap(const std::string& filename);
|
||||||
|
~AnasenDeadChannelMap();
|
||||||
|
void LoadMapfile(const std::string& filename);
|
||||||
|
inline const bool IsValid() const { return valid_flag; }
|
||||||
|
const bool IsDead(AnasenDetectorType type, int detIndex, int channel, AnasenDetectorSide side) const;
|
||||||
|
private:
|
||||||
|
void InitMap();
|
||||||
|
int ConvertStringTypeIndexToOffset(const std::string& type, const std::string& index, const std::string& side);
|
||||||
|
bool valid_flag;
|
||||||
|
std::unordered_map<int, bool> dcMap;
|
||||||
|
|
||||||
|
/*
|
||||||
|
global channel calculated as
|
||||||
|
detTypeOffset + detIndex*total + detSideOffset + channel
|
||||||
|
*/
|
||||||
|
|
||||||
|
const int nfronts_sx3 = 4;
|
||||||
|
const int nfronts_qqq = 16;
|
||||||
|
const int nchannels_sx3 = 8;
|
||||||
|
const int nchannels_qqq = 32;
|
||||||
|
|
||||||
|
const int barrel1_offset = 0;
|
||||||
|
const int barrel2_offset = 12*nchannels_sx3;
|
||||||
|
const int fqqq_offset = barrel2_offset + 12*nchannels_sx3;
|
||||||
|
const int bqqq_offset = fqqq_offset + 4*nchannels_qqq;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -9,6 +9,7 @@
|
||||||
#include "Target.h"
|
#include "Target.h"
|
||||||
#include "Nucleus.h"
|
#include "Nucleus.h"
|
||||||
#include "MaskFile.h"
|
#include "MaskFile.h"
|
||||||
|
#include "AnasenDeadChannelMap.h"
|
||||||
|
|
||||||
struct DetectorResult {
|
struct DetectorResult {
|
||||||
bool detectFlag = false;
|
bool detectFlag = false;
|
||||||
|
@ -24,6 +25,7 @@ public:
|
||||||
void CalculateEfficiency(const std::string& inputname, const std::string& outputname, const std::string& statsname) override;
|
void CalculateEfficiency(const std::string& inputname, const std::string& outputname, const std::string& statsname) override;
|
||||||
void DrawDetectorSystem(const std::string& filename) override;
|
void DrawDetectorSystem(const std::string& filename) override;
|
||||||
double RunConsistencyCheck() override;
|
double RunConsistencyCheck() override;
|
||||||
|
inline void SetDeadChannelMap(const std::string& filename) { dmap.LoadMapfile(filename); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DetectorResult IsRing1(Mask::Nucleus& nucleus);
|
DetectorResult IsRing1(Mask::Nucleus& nucleus);
|
||||||
|
@ -38,6 +40,8 @@ private:
|
||||||
|
|
||||||
Mask::Target det_silicon;
|
Mask::Target det_silicon;
|
||||||
|
|
||||||
|
AnasenDeadChannelMap dmap;
|
||||||
|
|
||||||
/**** ANASEN geometry constants *****/
|
/**** ANASEN geometry constants *****/
|
||||||
const int n_sx3_per_ring = 12;
|
const int n_sx3_per_ring = 12;
|
||||||
const int n_qqq = 4;
|
const int n_qqq = 4;
|
||||||
|
@ -54,7 +58,7 @@ private:
|
||||||
const double qqq_z[4] = {qqq_nom_z, qqq_nom_z, qqq_nom_z, qqq_nom_z};
|
const double qqq_z[4] = {qqq_nom_z, qqq_nom_z, qqq_nom_z, qqq_nom_z};
|
||||||
const double qqq_phi[4] = {5.49779, 0.785398, 2.35619, 3.92699};
|
const double qqq_phi[4] = {5.49779, 0.785398, 2.35619, 3.92699};
|
||||||
const double ring_rho[12] = {0.0890601, 0.0889871, 0.0890354, 0.0890247, 0.0890354, 0.0890354, 0.0890247, 0.0890354, 0.0890354, 0.0890247, 0.0890354, 0.0890354};
|
const double ring_rho[12] = {0.0890601, 0.0889871, 0.0890354, 0.0890247, 0.0890354, 0.0890354, 0.0890247, 0.0890354, 0.0890354, 0.0890247, 0.0890354, 0.0890354};
|
||||||
const double ring_phi[12] = {0.785795, 0.262014, 6.02132, 5.49779, 4.97426, 4.45052, 3.92699, 3.40346, 2.87972, 2.35619, 1.83266, 1.30893};
|
const double ring_phi[12] = {4.97426, 5.49739, 6.02132, 0.261868, 0.785398, 1.30893, 1.83266, 2.35619, 2.87972, 3.40346, 3.92699, 4.45052};
|
||||||
/*************************/
|
/*************************/
|
||||||
|
|
||||||
static constexpr double threshold = 0.6; //MeV
|
static constexpr double threshold = 0.6; //MeV
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
Class implementing geometry for QQQDetector where the detector is perpendicular to the beam axis.
|
Class implementing geometry for QQQDetector where the detector is perpendicular to the beam axis.
|
||||||
Detector is first generated centered on the x-axis (phi=0)
|
Detector is first generated centered on the x-axis (phi=0)
|
||||||
|
|
||||||
Coordinate convention : +z is downstream, -z is upstream. +y is vertically up in the lab.
|
Coordinate convention : +z is downstream, -z is upstream. +y is vertically down in the lab.
|
||||||
*/
|
*/
|
||||||
#ifndef QQQDETECTOR_H
|
#ifndef QQQDETECTOR_H
|
||||||
#define QQQDETECTOR_H
|
#define QQQDETECTOR_H
|
||||||
|
|
|
@ -1,16 +1,17 @@
|
||||||
#ifndef DEADCHANNELMAP_H
|
#ifndef SABREDEADCHANNELMAP_H
|
||||||
#define DEADCHANNELMAP_H
|
#define SABREDEADCHANNELMAP_H
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
|
||||||
class DeadChannelMap {
|
class SabreDeadChannelMap
|
||||||
|
{
|
||||||
public:
|
public:
|
||||||
DeadChannelMap();
|
SabreDeadChannelMap();
|
||||||
DeadChannelMap(std::string& name);
|
SabreDeadChannelMap(const std::string& name);
|
||||||
~DeadChannelMap();
|
~SabreDeadChannelMap();
|
||||||
void LoadMapfile(std::string& name);
|
void LoadMapfile(const std::string& name);
|
||||||
bool IsDead(int det, int channel, int ringwedgeFlag);
|
bool IsDead(int det, int channel, int ringwedgeFlag);
|
||||||
bool IsValid() { return validFlag; };
|
bool IsValid() { return validFlag; };
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
#include "DetectorEfficiency.h"
|
#include "DetectorEfficiency.h"
|
||||||
#include "SabreDetector.h"
|
#include "SabreDetector.h"
|
||||||
#include "Target.h"
|
#include "Target.h"
|
||||||
#include "DeadChannelMap.h"
|
#include "SabreDeadChannelMap.h"
|
||||||
#include "Nucleus.h"
|
#include "Nucleus.h"
|
||||||
|
|
||||||
class SabreEfficiency : public DetectorEfficiency {
|
class SabreEfficiency : public DetectorEfficiency {
|
||||||
|
@ -23,7 +23,7 @@ private:
|
||||||
|
|
||||||
Mask::Target deadlayer;
|
Mask::Target deadlayer;
|
||||||
Mask::Target sabre_eloss;
|
Mask::Target sabre_eloss;
|
||||||
DeadChannelMap dmap;
|
SabreDeadChannelMap dmap;
|
||||||
|
|
||||||
//Sabre constants
|
//Sabre constants
|
||||||
const double INNER_R = 0.0326;
|
const double INNER_R = 0.0326;
|
||||||
|
|
|
@ -2,12 +2,12 @@
|
||||||
#define __STRIP_DETECTOR_H
|
#define __STRIP_DETECTOR_H
|
||||||
|
|
||||||
// +z is along beam axis
|
// +z is along beam axis
|
||||||
// +y is vertically "upward" in the lab frame
|
// +y is vertically "downward" in the lab frame
|
||||||
|
|
||||||
//angles must be in radians, but distances can be whatever
|
//angles must be in radians, but distances can be whatever
|
||||||
//PROVIDED all input distances are the same
|
//PROVIDED all input distances are the same
|
||||||
|
|
||||||
//Front strips from lowest y to highest y
|
//Front strips from largest y to smallest y
|
||||||
|
|
||||||
//Back strips from lowest z to highest z
|
//Back strips from lowest z to highest z
|
||||||
|
|
||||||
|
@ -19,6 +19,13 @@
|
||||||
#include "Rotation.h"
|
#include "Rotation.h"
|
||||||
#include "RandomGenerator.h"
|
#include "RandomGenerator.h"
|
||||||
|
|
||||||
|
struct StripHit
|
||||||
|
{
|
||||||
|
int front_strip_index=-1;
|
||||||
|
int back_strip_index=-1;
|
||||||
|
double front_ratio=0.0;
|
||||||
|
};
|
||||||
|
|
||||||
class StripDetector {
|
class StripDetector {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -34,7 +41,7 @@ public:
|
||||||
inline void TurnOffRandomizedCoordinates() { rndmFlag = false; }
|
inline void TurnOffRandomizedCoordinates() { rndmFlag = false; }
|
||||||
|
|
||||||
Mask::Vec3 GetHitCoordinates(int front_stripch, double front_strip_ratio);
|
Mask::Vec3 GetHitCoordinates(int front_stripch, double front_strip_ratio);
|
||||||
std::pair<int,double> GetChannelRatio(double theta, double phi);
|
StripHit GetChannelRatio(double theta, double phi);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
inline bool ValidChannel(int f) { return ((f >= 0 && f < num_strips) ? true : false); };
|
inline bool ValidChannel(int f) { return ((f >= 0 && f < num_strips) ? true : false); };
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
----------Data Information----------
|
----------Data Information----------
|
||||||
OutputFile: /media/gordon/ANASENData/MaskData/Kinematics/7Bedp_870keV_beam_50CD2_test.mask
|
OutputFile: /data1/gwm17/7BeNov2021/sim/7Bedp_1100keV_beam_50CD2.mask
|
||||||
----------Reaction Information----------
|
----------Reaction Information----------
|
||||||
ReactionType: TwoStepRxn
|
ReactionType: TwoStepRxn
|
||||||
Z A (order is target, projectile, ejectile, break1, break3(if pure decay is target, ejectile))
|
Z A (order is target, projectile, ejectile, break1, break3(if pure decay is target, ejectile))
|
||||||
1 2
|
1 2
|
||||||
4 7
|
4 7
|
||||||
1 1
|
1 1
|
||||||
2 4
|
2 4
|
||||||
----------Target Information----------
|
----------Target Information----------
|
||||||
NumberOfLayers: 1
|
NumberOfLayers: 1
|
||||||
begin_layer
|
begin_layer
|
||||||
|
@ -18,7 +18,7 @@ begin_layer
|
||||||
end_layer
|
end_layer
|
||||||
----------Sampling Information----------
|
----------Sampling Information----------
|
||||||
NumberOfSamples: 100000
|
NumberOfSamples: 100000
|
||||||
BeamMeanEnergy(MeV): 0.87 BeamEnergySigma(MeV): 0.0
|
BeamMeanEnergy(MeV): 1.1 BeamEnergySigma(MeV): 0.0
|
||||||
EjectileThetaType(0=Lab,1=CM): 1
|
EjectileThetaType(0=Lab,1=CM): 1
|
||||||
EjectileThetaMin(deg): 0.0 EjectileThetaMax(deg): 180.0
|
EjectileThetaMin(deg): 0.0 EjectileThetaMax(deg): 180.0
|
||||||
EjectilePhiMin(deg): 0.0 EjectilePhiMax(deg): 360.0
|
EjectilePhiMin(deg): 0.0 EjectilePhiMax(deg): 360.0
|
||||||
|
|
133
src/Detectors/AnasenDeadChannelMap.cpp
Normal file
133
src/Detectors/AnasenDeadChannelMap.cpp
Normal file
|
@ -0,0 +1,133 @@
|
||||||
|
#include "AnasenDeadChannelMap.h"
|
||||||
|
#include <fstream>
|
||||||
|
#include <iostream>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
AnasenDeadChannelMap::AnasenDeadChannelMap() :
|
||||||
|
valid_flag(false)
|
||||||
|
{
|
||||||
|
InitMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
AnasenDeadChannelMap::AnasenDeadChannelMap(const std::string& filename) :
|
||||||
|
valid_flag(false)
|
||||||
|
{
|
||||||
|
InitMap();
|
||||||
|
LoadMapfile(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
AnasenDeadChannelMap::~AnasenDeadChannelMap() {}
|
||||||
|
|
||||||
|
void AnasenDeadChannelMap::InitMap()
|
||||||
|
{
|
||||||
|
for(int i=0; i<(bqqq_offset+4.0*nchannels_qqq); i++)
|
||||||
|
dcMap[i] = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int AnasenDeadChannelMap::ConvertStringTypeIndexToOffset(const std::string& type, const std::string& index, const std::string& side)
|
||||||
|
{
|
||||||
|
int channel_offset=0;
|
||||||
|
if(type == "BARREL1B")
|
||||||
|
channel_offset += 6*nchannels_sx3;
|
||||||
|
else if (type == "BARREL2A")
|
||||||
|
channel_offset += barrel2_offset;
|
||||||
|
else if (type == "BARREL2B")
|
||||||
|
channel_offset += barrel2_offset + 6*nchannels_sx3;
|
||||||
|
else if (type == "FQQQ")
|
||||||
|
channel_offset += fqqq_offset;
|
||||||
|
else if (type == "BQQQ")
|
||||||
|
channel_offset += bqqq_offset;
|
||||||
|
|
||||||
|
if(index == "B")
|
||||||
|
channel_offset += nchannels_sx3;
|
||||||
|
else if(index == "C")
|
||||||
|
channel_offset += 2.0*nchannels_sx3;
|
||||||
|
else if(index == "D")
|
||||||
|
channel_offset += 3.0*nchannels_sx3;
|
||||||
|
else if(index == "E")
|
||||||
|
channel_offset += 4.0*nchannels_sx3;
|
||||||
|
else if(index == "F")
|
||||||
|
channel_offset += 5.0*nchannels_sx3;
|
||||||
|
else if(index == "1")
|
||||||
|
channel_offset += nchannels_qqq;
|
||||||
|
else if(index == "2")
|
||||||
|
channel_offset += 2.0*nchannels_qqq;
|
||||||
|
else if(index == "3")
|
||||||
|
channel_offset += 3.0*nchannels_qqq;
|
||||||
|
|
||||||
|
if(side == "BACK")
|
||||||
|
channel_offset += nfronts_sx3;
|
||||||
|
else if(side == "WEDGE")
|
||||||
|
channel_offset += nfronts_qqq;
|
||||||
|
|
||||||
|
return channel_offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AnasenDeadChannelMap::LoadMapfile(const std::string& filename)
|
||||||
|
{
|
||||||
|
valid_flag = false;
|
||||||
|
std::ifstream input(filename);
|
||||||
|
if(!input.is_open())
|
||||||
|
{
|
||||||
|
std::cerr<<"Unable to open input file at AnasenDeadChannelMap::LoadMapfile(). Exiting."<<std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string junk;
|
||||||
|
std::string type, side, index;
|
||||||
|
int channel;
|
||||||
|
|
||||||
|
int dead_channel;
|
||||||
|
while(input>>junk)
|
||||||
|
{
|
||||||
|
input>>type>>index>>side>>junk>>channel;
|
||||||
|
|
||||||
|
if(side == "FRONT")
|
||||||
|
{
|
||||||
|
channel = std::floor(channel/2.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
dead_channel = ConvertStringTypeIndexToOffset(type, index, side) + channel;
|
||||||
|
|
||||||
|
dcMap[dead_channel] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
valid_flag = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const bool AnasenDeadChannelMap::IsDead(AnasenDetectorType type, int detIndex, int channel, AnasenDetectorSide side) const
|
||||||
|
{
|
||||||
|
int channel_index=-1;
|
||||||
|
switch(type)
|
||||||
|
{
|
||||||
|
case AnasenDetectorType::Barrel1:
|
||||||
|
{
|
||||||
|
channel_index = detIndex*nchannels_sx3 + side*nfronts_sx3 + channel;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case AnasenDetectorType::Barrel2:
|
||||||
|
{
|
||||||
|
channel_index = barrel2_offset + detIndex*nchannels_sx3 + side*nfronts_sx3 + channel;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case AnasenDetectorType::FQQQ:
|
||||||
|
{
|
||||||
|
channel_index = fqqq_offset + detIndex*nchannels_qqq + side*nfronts_qqq + channel;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case AnasenDetectorType::BQQQ:
|
||||||
|
{
|
||||||
|
channel_index = bqqq_offset + detIndex*nchannels_qqq + side*nfronts_qqq + channel;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
auto data = dcMap.find(channel_index);
|
||||||
|
if(data == dcMap.end())
|
||||||
|
{
|
||||||
|
std::cerr<<"Bad channel index "<<channel_index<<" at AnasenDeadChannelMap::IsDead()"<<std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return data->second;
|
||||||
|
}
|
|
@ -158,7 +158,7 @@ double AnasenEfficiency::RunConsistencyCheck() {
|
||||||
for(auto& point : r1_points) {
|
for(auto& point : r1_points) {
|
||||||
for(auto& sx3 : m_Ring1) {
|
for(auto& sx3 : m_Ring1) {
|
||||||
auto result = sx3.GetChannelRatio(point.GetTheta(), point.GetPhi());
|
auto result = sx3.GetChannelRatio(point.GetTheta(), point.GetPhi());
|
||||||
coords = sx3.GetHitCoordinates(result.first, result.second);
|
coords = sx3.GetHitCoordinates(result.front_strip_index, result.front_ratio);
|
||||||
if(IsDoubleEqual(point.GetX(), coords.GetX()) && IsDoubleEqual(point.GetY(), coords.GetY()) && IsDoubleEqual(point.GetZ(), coords.GetZ())) {
|
if(IsDoubleEqual(point.GetX(), coords.GetX()) && IsDoubleEqual(point.GetY(), coords.GetY()) && IsDoubleEqual(point.GetZ(), coords.GetZ())) {
|
||||||
count++;
|
count++;
|
||||||
break;
|
break;
|
||||||
|
@ -168,7 +168,7 @@ double AnasenEfficiency::RunConsistencyCheck() {
|
||||||
for(auto& point : r2_points) {
|
for(auto& point : r2_points) {
|
||||||
for(auto& sx3 : m_Ring2) {
|
for(auto& sx3 : m_Ring2) {
|
||||||
auto result = sx3.GetChannelRatio(point.GetTheta(), point.GetPhi());
|
auto result = sx3.GetChannelRatio(point.GetTheta(), point.GetPhi());
|
||||||
coords = sx3.GetHitCoordinates(result.first, result.second);
|
coords = sx3.GetHitCoordinates(result.front_strip_index, result.front_ratio);
|
||||||
if(IsDoubleEqual(point.GetX(), coords.GetX()) && IsDoubleEqual(point.GetY(), coords.GetY()) && IsDoubleEqual(point.GetZ(), coords.GetZ())) {
|
if(IsDoubleEqual(point.GetX(), coords.GetX()) && IsDoubleEqual(point.GetY(), coords.GetY()) && IsDoubleEqual(point.GetZ(), coords.GetZ())) {
|
||||||
count++;
|
count++;
|
||||||
break;
|
break;
|
||||||
|
@ -205,14 +205,15 @@ double AnasenEfficiency::RunConsistencyCheck() {
|
||||||
DetectorResult AnasenEfficiency::IsRing1(Mask::Nucleus& nucleus) {
|
DetectorResult AnasenEfficiency::IsRing1(Mask::Nucleus& nucleus) {
|
||||||
|
|
||||||
DetectorResult observation;
|
DetectorResult observation;
|
||||||
//Mask::Vec3 coords;
|
|
||||||
double thetaIncident;
|
double thetaIncident;
|
||||||
for(auto& sx3 : m_Ring1) {
|
for(int i=0; i<n_sx3_per_ring; i++) {
|
||||||
auto result = sx3.GetChannelRatio(nucleus.GetTheta(), nucleus.GetPhi());
|
auto result = m_Ring1[i].GetChannelRatio(nucleus.GetTheta(), nucleus.GetPhi());
|
||||||
if(result.first != -1) {
|
if(result.front_strip_index != -1 /*&& !dmap.IsDead(AnasenDetectorType::Barrel1, i, result.front_strip_index, AnasenDetectorSide::Front)*/
|
||||||
|
&& !dmap.IsDead(AnasenDetectorType::Barrel1, i, result.back_strip_index, AnasenDetectorSide::Back))
|
||||||
|
{
|
||||||
observation.detectFlag = true;
|
observation.detectFlag = true;
|
||||||
observation.direction = sx3.GetHitCoordinates(result.first, result.second);
|
observation.direction = m_Ring1[i].GetHitCoordinates(result.front_strip_index, result.front_ratio);
|
||||||
thetaIncident = std::acos(observation.direction.Dot(sx3.GetNormRotated())/observation.direction.GetR());
|
thetaIncident = std::acos(observation.direction.Dot(m_Ring1[i].GetNormRotated())/observation.direction.GetR());
|
||||||
if(thetaIncident > M_PI/2.0)
|
if(thetaIncident > M_PI/2.0)
|
||||||
thetaIncident = M_PI - thetaIncident;
|
thetaIncident = M_PI - thetaIncident;
|
||||||
|
|
||||||
|
@ -229,12 +230,14 @@ DetectorResult AnasenEfficiency::IsRing2(Mask::Nucleus& nucleus) {
|
||||||
|
|
||||||
DetectorResult observation;
|
DetectorResult observation;
|
||||||
double thetaIncident;
|
double thetaIncident;
|
||||||
for(auto& sx3 : m_Ring2) {
|
for(int i=0; i<n_sx3_per_ring; i++) {
|
||||||
auto result = sx3.GetChannelRatio(nucleus.GetTheta(), nucleus.GetPhi());
|
auto result = m_Ring2[i].GetChannelRatio(nucleus.GetTheta(), nucleus.GetPhi());
|
||||||
if(result.first != -1) {
|
if(result.front_strip_index != -1 /*&& !dmap.IsDead(AnasenDetectorType::Barrel2, i, result.front_strip_index, AnasenDetectorSide::Front)*/
|
||||||
|
&& !dmap.IsDead(AnasenDetectorType::Barrel2, i, result.back_strip_index, AnasenDetectorSide::Back))
|
||||||
|
{
|
||||||
observation.detectFlag = true;
|
observation.detectFlag = true;
|
||||||
observation.direction = sx3.GetHitCoordinates(result.first, result.second);
|
observation.direction = m_Ring2[i].GetHitCoordinates(result.front_strip_index, result.front_ratio);
|
||||||
thetaIncident = std::acos(observation.direction.Dot(sx3.GetNormRotated())/observation.direction.GetR());
|
thetaIncident = std::acos(observation.direction.Dot(m_Ring2[i].GetNormRotated())/observation.direction.GetR());
|
||||||
if(thetaIncident > M_PI/2.0)
|
if(thetaIncident > M_PI/2.0)
|
||||||
thetaIncident = M_PI - thetaIncident;
|
thetaIncident = M_PI - thetaIncident;
|
||||||
|
|
||||||
|
@ -251,12 +254,14 @@ DetectorResult AnasenEfficiency::IsQQQ(Mask::Nucleus& nucleus) {
|
||||||
|
|
||||||
DetectorResult observation;
|
DetectorResult observation;
|
||||||
double thetaIncident;
|
double thetaIncident;
|
||||||
for(auto& qqq : m_forwardQQQs) {
|
for(int i=0; i<n_qqq; i++) {
|
||||||
auto result = qqq.GetTrajectoryRingWedge(nucleus.GetTheta(), nucleus.GetPhi());
|
auto result = m_forwardQQQs[i].GetTrajectoryRingWedge(nucleus.GetTheta(), nucleus.GetPhi());
|
||||||
if(result.first != -1) {
|
if(result.first != -1 /*&& !dmap.IsDead(AnasenDetectorType::FQQQ, i, result.first, AnasenDetectorSide::Front)*/ &&
|
||||||
|
!dmap.IsDead(AnasenDetectorType::FQQQ, i, result.second, AnasenDetectorSide::Back))
|
||||||
|
{
|
||||||
observation.detectFlag = true;
|
observation.detectFlag = true;
|
||||||
observation.direction = qqq.GetHitCoordinates(result.first, result.second);
|
observation.direction = m_forwardQQQs[i].GetHitCoordinates(result.first, result.second);
|
||||||
thetaIncident = std::acos(observation.direction.Dot(qqq.GetNorm())/observation.direction.GetR());
|
thetaIncident = std::acos(observation.direction.Dot(m_forwardQQQs[i].GetNorm())/observation.direction.GetR());
|
||||||
if(thetaIncident > M_PI/2.0)
|
if(thetaIncident > M_PI/2.0)
|
||||||
thetaIncident = M_PI - thetaIncident;
|
thetaIncident = M_PI - thetaIncident;
|
||||||
|
|
||||||
|
@ -267,12 +272,14 @@ DetectorResult AnasenEfficiency::IsQQQ(Mask::Nucleus& nucleus) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
for(auto& qqq : m_backwardQQQs) {
|
for(int i=0; i<n_qqq; i++) {
|
||||||
auto result = qqq.GetTrajectoryRingWedge(nucleus.GetTheta(), nucleus.GetPhi());
|
auto result = m_backwardQQQs[i].GetTrajectoryRingWedge(nucleus.GetTheta(), nucleus.GetPhi());
|
||||||
if(result.first != -1) {
|
if(result.first != -1 /*&& !dmap.IsDead(AnasenDetectorType::BQQQ, i, result.first, AnasenDetectorSide::Front)*/ &&
|
||||||
|
!dmap.IsDead(AnasenDetectorType::BQQQ, i, result.second, AnasenDetectorSide::Back))
|
||||||
|
{
|
||||||
observation.detectFlag = true;
|
observation.detectFlag = true;
|
||||||
observation.direction = qqq.GetHitCoordinates(result.first, result.second);
|
observation.direction = m_backwardQQQs[i].GetHitCoordinates(result.first, result.second);
|
||||||
thetaIncident = std::acos(observation.direction.Dot(qqq.GetNorm())/observation.direction.GetR());
|
thetaIncident = std::acos(observation.direction.Dot(m_backwardQQQs[i].GetNorm())/observation.direction.GetR());
|
||||||
if(thetaIncident > M_PI/2.0)
|
if(thetaIncident > M_PI/2.0)
|
||||||
thetaIncident = M_PI - thetaIncident;
|
thetaIncident = M_PI - thetaIncident;
|
||||||
|
|
||||||
|
@ -381,6 +388,14 @@ void AnasenEfficiency::CountCoincidences(const Mask::MaskFileData& data, std::ve
|
||||||
}
|
}
|
||||||
|
|
||||||
void AnasenEfficiency::CalculateEfficiency(const std::string& inputname, const std::string& outputname, const std::string& statsname) {
|
void AnasenEfficiency::CalculateEfficiency(const std::string& inputname, const std::string& outputname, const std::string& statsname) {
|
||||||
|
|
||||||
|
if(!dmap.IsValid())
|
||||||
|
{
|
||||||
|
std::cerr<<"Invalid Dead Channel Map at AnasenEfficiency::CalculateEfficiency()! If you want to run with all possible";
|
||||||
|
std::cerr<<"channels active, simply load an empty file."<<std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
std::cout<<"----------ANASEN Efficiency Calculation----------"<<std::endl;
|
std::cout<<"----------ANASEN Efficiency Calculation----------"<<std::endl;
|
||||||
std::cout<<"Loading in output from kinematics simulation: "<<inputname<<std::endl;
|
std::cout<<"Loading in output from kinematics simulation: "<<inputname<<std::endl;
|
||||||
std::cout<<"Running efficiency calculation..."<<std::endl;
|
std::cout<<"Running efficiency calculation..."<<std::endl;
|
||||||
|
|
|
@ -1,68 +0,0 @@
|
||||||
#include "DeadChannelMap.h"
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
DeadChannelMap::DeadChannelMap() :
|
|
||||||
validFlag(false)
|
|
||||||
{
|
|
||||||
int maxchan = 5*24+1*16+7;
|
|
||||||
for(int i=0; i<maxchan; i++) {
|
|
||||||
dcMap[i] = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DeadChannelMap::DeadChannelMap(std::string& name) :
|
|
||||||
validFlag(false)
|
|
||||||
{
|
|
||||||
LoadMapfile(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
DeadChannelMap::~DeadChannelMap() {}
|
|
||||||
|
|
||||||
void DeadChannelMap::LoadMapfile(std::string& name) {
|
|
||||||
std::ifstream input(name);
|
|
||||||
if(!input.is_open()) {
|
|
||||||
std::cerr<<"Unable to load dead channels, file: "<<name<<" could not be opened"<<std::endl;
|
|
||||||
validFlag = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
std::string junk, rw;
|
|
||||||
int detID, channel;
|
|
||||||
int this_channel;
|
|
||||||
|
|
||||||
std::getline(input, junk);
|
|
||||||
while(input>>detID) {
|
|
||||||
input>>rw>>channel;
|
|
||||||
if(rw == "RING") {
|
|
||||||
this_channel = detID*24+RING*16+channel;
|
|
||||||
dcMap[this_channel] = true;
|
|
||||||
} else if(rw == "WEDGE") {
|
|
||||||
this_channel = detID*24+WEDGE*16+channel;
|
|
||||||
dcMap[this_channel] = true;
|
|
||||||
} else {
|
|
||||||
std::cerr<<"Invalid ring/wedge designation at DeadChannelMap"<<std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
validFlag = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DeadChannelMap::IsDead(int detID, int channel, int ringwedgeFlag) {
|
|
||||||
if(!IsValid() || (ringwedgeFlag != 0 && ringwedgeFlag != 1)) {
|
|
||||||
std::cerr<<"Error at DeadChannelMap IsDead(), bad input parameters"<<std::endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int this_channel = detID*24+ringwedgeFlag*16+channel;
|
|
||||||
|
|
||||||
auto iter = dcMap.find(this_channel);
|
|
||||||
if(iter != dcMap.end()) {
|
|
||||||
return iter->second;
|
|
||||||
} else {
|
|
||||||
std::cerr<<"Error at DeadChannelMap IsDead(), invalid channel: "<<this_channel<<std::endl;
|
|
||||||
std::cerr<<"detID: "<<detID<<" ringwedgeFlag: "<<ringwedgeFlag<<" channel: "<<channel<<std::endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -17,7 +17,7 @@ int main(int argc, char** argv) {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
SabreEfficiency sabre;
|
SabreEfficiency sabre;
|
||||||
std::string mapfile = "./etc/DeadChannels.txt";
|
std::string mapfile = "./etc/SabreDeadChannels.txt";
|
||||||
sabre.SetDeadChannelMap(mapfile);
|
sabre.SetDeadChannelMap(mapfile);
|
||||||
sabre.CalculateEfficiency(inputname, outputname, statsname);
|
sabre.CalculateEfficiency(inputname, outputname, statsname);
|
||||||
//std::cout<<"Running consistency check(1=success): "<<sabre.RunConsistencyCheck()<<std::endl;
|
//std::cout<<"Running consistency check(1=success): "<<sabre.RunConsistencyCheck()<<std::endl;
|
||||||
|
@ -26,6 +26,8 @@ int main(int argc, char** argv) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
AnasenEfficiency anasen;
|
AnasenEfficiency anasen;
|
||||||
|
std::string mapfile = "./etc/AnasenDeadChannels.txt";
|
||||||
|
anasen.SetDeadChannelMap(mapfile);
|
||||||
anasen.CalculateEfficiency(inputname, outputname, statsname);
|
anasen.CalculateEfficiency(inputname, outputname, statsname);
|
||||||
//std::cout<<"Running consistency check(1=success): "<<anasen.RunConsistencyCheck()<<std::endl;
|
//std::cout<<"Running consistency check(1=success): "<<anasen.RunConsistencyCheck()<<std::endl;
|
||||||
//anasen.DrawDetectorSystem("/data1/gwm17/TRIUMF_7Bed/simulation/ANASENGeo_centered_target_targetGap_BackQQQ_fixedZ.txt");
|
//anasen.DrawDetectorSystem("/data1/gwm17/TRIUMF_7Bed/simulation/ANASENGeo_centered_target_targetGap_BackQQQ_fixedZ.txt");
|
||||||
|
|
80
src/Detectors/SabreDeadChannelMap.cpp
Normal file
80
src/Detectors/SabreDeadChannelMap.cpp
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
#include "SabreDeadChannelMap.h"
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
SabreDeadChannelMap::SabreDeadChannelMap() :
|
||||||
|
validFlag(false)
|
||||||
|
{
|
||||||
|
int maxchan = 5*24+1*16+7;
|
||||||
|
for(int i=0; i<maxchan; i++)
|
||||||
|
dcMap[i] = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
SabreDeadChannelMap::SabreDeadChannelMap(const std::string& name) :
|
||||||
|
validFlag(false)
|
||||||
|
{
|
||||||
|
LoadMapfile(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
SabreDeadChannelMap::~SabreDeadChannelMap() {}
|
||||||
|
|
||||||
|
void SabreDeadChannelMap::LoadMapfile(const std::string& name)
|
||||||
|
{
|
||||||
|
std::ifstream input(name);
|
||||||
|
if(!input.is_open())
|
||||||
|
{
|
||||||
|
std::cerr<<"Unable to load dead channels, file: "<<name<<" could not be opened"<<std::endl;
|
||||||
|
validFlag = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
std::string junk, rw;
|
||||||
|
int detID, channel;
|
||||||
|
int this_channel;
|
||||||
|
|
||||||
|
std::getline(input, junk);
|
||||||
|
while(input>>detID)
|
||||||
|
{
|
||||||
|
input>>rw>>channel;
|
||||||
|
if(rw == "RING")
|
||||||
|
{
|
||||||
|
this_channel = detID*24+RING*16+channel;
|
||||||
|
dcMap[this_channel] = true;
|
||||||
|
}
|
||||||
|
else if(rw == "WEDGE")
|
||||||
|
{
|
||||||
|
this_channel = detID*24+WEDGE*16+channel;
|
||||||
|
dcMap[this_channel] = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cerr<<"Invalid ring/wedge designation at SabreDeadChannelMap"<<std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
validFlag = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SabreDeadChannelMap::IsDead(int detID, int channel, int ringwedgeFlag)
|
||||||
|
{
|
||||||
|
if(!IsValid() || (ringwedgeFlag != 0 && ringwedgeFlag != 1))
|
||||||
|
{
|
||||||
|
std::cerr<<"Error at SabreDeadChannelMap IsDead(), bad input parameters"<<std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int this_channel = detID*24+ringwedgeFlag*16+channel;
|
||||||
|
|
||||||
|
auto iter = dcMap.find(this_channel);
|
||||||
|
if(iter != dcMap.end())
|
||||||
|
{
|
||||||
|
return iter->second;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cerr<<"Error at SabreDeadChannelMap IsDead(), invalid channel: "<<this_channel<<std::endl;
|
||||||
|
std::cerr<<"detID: "<<detID<<" ringwedgeFlag: "<<ringwedgeFlag<<" channel: "<<channel<<std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -53,8 +53,8 @@ StripDetector::~StripDetector() {}
|
||||||
void StripDetector::CalculateCorners() {
|
void StripDetector::CalculateCorners() {
|
||||||
double y_min, y_max, z_min, z_max;
|
double y_min, y_max, z_min, z_max;
|
||||||
for (int s=0; s<num_strips; s++) {
|
for (int s=0; s<num_strips; s++) {
|
||||||
y_max = -total_width/2.0 + front_strip_width*(s+1);
|
y_max = total_width/2.0 - front_strip_width*s;
|
||||||
y_min = -total_width/2.0 + front_strip_width*s;
|
y_min = total_width/2.0 - front_strip_width*(s+1);
|
||||||
z_max = center_z + length/2.0;
|
z_max = center_z + length/2.0;
|
||||||
z_min = center_z - length/2.0;
|
z_min = center_z - length/2.0;
|
||||||
front_strip_coords[s][2] = Mask::Vec3(center_rho, y_max, z_max);
|
front_strip_coords[s][2] = Mask::Vec3(center_rho, y_max, z_max);
|
||||||
|
@ -104,8 +104,9 @@ Mask::Vec3 StripDetector::GetHitCoordinates(int front_stripch, double front_stri
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<int,double> StripDetector::GetChannelRatio(double theta, double phi) {
|
StripHit StripDetector::GetChannelRatio(double theta, double phi) {
|
||||||
|
|
||||||
|
StripHit hit;
|
||||||
while (phi < 0) phi += 2*M_PI;
|
while (phi < 0) phi += 2*M_PI;
|
||||||
|
|
||||||
//to make the math easier (and the same for each det), rotate the input phi
|
//to make the math easier (and the same for each det), rotate the input phi
|
||||||
|
@ -118,7 +119,7 @@ std::pair<int,double> StripDetector::GetChannelRatio(double theta, double phi) {
|
||||||
double det_max_phi = atan2(total_width/2,center_rho);
|
double det_max_phi = atan2(total_width/2,center_rho);
|
||||||
double det_min_phi = -det_max_phi;
|
double det_min_phi = -det_max_phi;
|
||||||
|
|
||||||
if (phi < det_min_phi || phi > det_max_phi) return std::make_pair(-1,0);
|
if (phi < det_min_phi || phi > det_max_phi) return hit;
|
||||||
|
|
||||||
//for theta it's not so simple, so we have to go through the typical plane-intersect method
|
//for theta it's not so simple, so we have to go through the typical plane-intersect method
|
||||||
//first thing's first: we have a fixed x for the entire detector plane:
|
//first thing's first: we have a fixed x for the entire detector plane:
|
||||||
|
@ -127,18 +128,26 @@ std::pair<int,double> StripDetector::GetChannelRatio(double theta, double phi) {
|
||||||
double yhit = xhit*tan(phi);
|
double yhit = xhit*tan(phi);
|
||||||
double zhit = sqrt(xhit*xhit+yhit*yhit)/tan(theta);
|
double zhit = sqrt(xhit*xhit+yhit*yhit)/tan(theta);
|
||||||
|
|
||||||
int front_ch_hit=-1;
|
|
||||||
double ratio=0;
|
|
||||||
for (int s=0; s<num_strips; s++) {
|
for (int s=0; s<num_strips; s++) {
|
||||||
if (xhit >= front_strip_coords[s][0].GetX() && xhit <= front_strip_coords[s][0].GetX() && //Check min and max x (constant in flat)
|
if (xhit >= front_strip_coords[s][0].GetX() && xhit <= front_strip_coords[s][0].GetX() && //Check min and max x (constant in flat)
|
||||||
yhit >= front_strip_coords[s][1].GetY() && yhit <= front_strip_coords[s][2].GetY() && //Check min and max y
|
yhit >= front_strip_coords[s][1].GetY() && yhit <= front_strip_coords[s][2].GetY() && //Check min and max y
|
||||||
zhit >= front_strip_coords[s][1].GetZ() && zhit <= front_strip_coords[s][0].GetZ()) //Check min and max z
|
zhit >= front_strip_coords[s][1].GetZ() && zhit <= front_strip_coords[s][0].GetZ()) //Check min and max z
|
||||||
{
|
{
|
||||||
front_ch_hit = s;
|
hit.front_strip_index = s;
|
||||||
ratio = (zhit-center_z)/(length/2);
|
hit.front_ratio = (zhit-center_z)/(length/2);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return std::make_pair(front_ch_hit,ratio);
|
for (int s=0; s<num_strips; s++) {
|
||||||
|
if (xhit >= back_strip_coords[s][0].GetX() && xhit <= back_strip_coords[s][0].GetX() && //Check min and max x (constant in flat)
|
||||||
|
yhit >= back_strip_coords[s][1].GetY() && yhit <= back_strip_coords[s][2].GetY() && //Check min and max y
|
||||||
|
zhit >= back_strip_coords[s][1].GetZ() && zhit <= back_strip_coords[s][0].GetZ()) //Check min and max z
|
||||||
|
{
|
||||||
|
hit.back_strip_index = s;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return hit;
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user