1
0
Fork 0
mirror of https://github.com/gwm17/Mask.git synced 2024-11-12 21:48: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:
Gordon McCann 2021-12-06 13:19:54 -05:00
parent 3cd32f29c4
commit ca7ae04f23
16 changed files with 673 additions and 147 deletions

290
etc/AnasenDeadChannels.txt Normal file
View 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

View File

@ -1,30 +1,30 @@
For SX3's: det id | mid rho | mid z | mid phi | name
For QQQ's: det id | mid phi | z | name
0 5.49779 0 QQQ_0
1 0.785398 0.8028 QQQ_1
2 2.35619 0 QQQ_2
3 3.92699 0 QQQ_3
6 8.90601 6.25 0.785795 R1a_A
7 8.89871 6.25 0.262014 R1a_B
8 8.90354 6.25 6.02132 R1a_C
9 8.90247 6.25 5.49779 R1a_D
10 8.90354 6.25 4.97426 R1a_E
11 8.90354 6.25 4.45052 R1a_F
12 8.90247 6.25 3.92699 R1b_A
13 8.90354 6.25 3.40346 R1b_B
14 8.90354 6.25 2.87972 R1b_C
15 8.90247 6.25 2.35619 R1b_D
16 8.90354 6.25 1.83266 R1b_E
17 8.90354 6.25 1.30893 R1b_F
18 8.90601 18.65 0.785795 R2a_A
19 8.89871 18.65 0.262014 R2a_B
20 8.90354 18.65 6.02132 R2a_C
21 8.90247 18.65 5.49779 R2a_D
22 8.90354 18.65 4.97426 R2a_E
23 8.90354 18.65 4.45052 R2a_F
24 8.90247 18.65 3.92699 R2b_A
25 8.90354 18.65 3.40346 R2b_B
26 8.90354 18.65 2.87972 R2b_C
27 8.90247 18.65 2.35619 R2b_D
28 8.90354 18.65 1.83266 R2b_E
29 8.90354 18.65 1.30893 R2b_F
0 2.30659 0 QQQ_0
1 7.01897 0.8028 QQQ_1
2 5.44818 0 QQQ_2
3 3.87738 0 QQQ_3
6 8.90601 6.25 5.49739 R1a_A
7 8.89871 6.25 6.02117 R1a_B
8 8.90354 6.25 0.261868 R1a_C
9 8.90247 6.25 0.785398 R1a_D
10 8.90354 6.25 1.30893 R1a_E
11 8.90354 6.25 1.83266 R1a_F
12 8.90247 6.25 2.35619 R1b_A
13 8.90354 6.25 2.87972 R1b_B
14 8.90354 6.25 3.40346 R1b_C
15 8.90247 6.25 3.92699 R1b_D
16 8.90354 6.25 4.45052 R1b_E
17 8.90354 6.25 4.97426 R1b_F
18 8.90601 18.65 5.49739 R2a_A
19 8.89871 18.65 6.02117 R2a_B
20 8.90354 18.65 0.261868 R2a_C
21 8.90247 18.65 0.785398 R2a_D
22 8.90354 18.65 1.30893 R2a_E
23 8.90354 18.65 1.83266 R2a_F
24 8.90247 18.65 2.35619 R2b_A
25 8.90354 18.65 2.87972 R2b_B
26 8.90354 18.65 3.40346 R2b_C
27 8.90247 18.65 3.92699 R2b_D
28 8.90354 18.65 4.45052 R2b_E
29 8.90354 18.65 4.97426 R2b_F

View 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

View File

@ -9,6 +9,7 @@
#include "Target.h"
#include "Nucleus.h"
#include "MaskFile.h"
#include "AnasenDeadChannelMap.h"
struct DetectorResult {
bool detectFlag = false;
@ -24,6 +25,7 @@ public:
void CalculateEfficiency(const std::string& inputname, const std::string& outputname, const std::string& statsname) override;
void DrawDetectorSystem(const std::string& filename) override;
double RunConsistencyCheck() override;
inline void SetDeadChannelMap(const std::string& filename) { dmap.LoadMapfile(filename); }
private:
DetectorResult IsRing1(Mask::Nucleus& nucleus);
@ -38,6 +40,8 @@ private:
Mask::Target det_silicon;
AnasenDeadChannelMap dmap;
/**** ANASEN geometry constants *****/
const int n_sx3_per_ring = 12;
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_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_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

View File

@ -3,7 +3,7 @@
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)
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
#define QQQDETECTOR_H

View File

@ -1,16 +1,17 @@
#ifndef DEADCHANNELMAP_H
#define DEADCHANNELMAP_H
#ifndef SABREDEADCHANNELMAP_H
#define SABREDEADCHANNELMAP_H
#include <string>
#include <iostream>
#include <unordered_map>
class DeadChannelMap {
class SabreDeadChannelMap
{
public:
DeadChannelMap();
DeadChannelMap(std::string& name);
~DeadChannelMap();
void LoadMapfile(std::string& name);
SabreDeadChannelMap();
SabreDeadChannelMap(const std::string& name);
~SabreDeadChannelMap();
void LoadMapfile(const std::string& name);
bool IsDead(int det, int channel, int ringwedgeFlag);
bool IsValid() { return validFlag; };

View File

@ -4,7 +4,7 @@
#include "DetectorEfficiency.h"
#include "SabreDetector.h"
#include "Target.h"
#include "DeadChannelMap.h"
#include "SabreDeadChannelMap.h"
#include "Nucleus.h"
class SabreEfficiency : public DetectorEfficiency {
@ -23,7 +23,7 @@ private:
Mask::Target deadlayer;
Mask::Target sabre_eloss;
DeadChannelMap dmap;
SabreDeadChannelMap dmap;
//Sabre constants
const double INNER_R = 0.0326;

View File

@ -2,12 +2,12 @@
#define __STRIP_DETECTOR_H
// +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
//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
@ -19,6 +19,13 @@
#include "Rotation.h"
#include "RandomGenerator.h"
struct StripHit
{
int front_strip_index=-1;
int back_strip_index=-1;
double front_ratio=0.0;
};
class StripDetector {
public:
@ -34,7 +41,7 @@ public:
inline void TurnOffRandomizedCoordinates() { rndmFlag = false; }
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:
inline bool ValidChannel(int f) { return ((f >= 0 && f < num_strips) ? true : false); };

View File

@ -1,12 +1,12 @@
----------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----------
ReactionType: TwoStepRxn
Z A (order is target, projectile, ejectile, break1, break3(if pure decay is target, ejectile))
1 2
1 2
4 7
1 1
2 4
2 4
----------Target Information----------
NumberOfLayers: 1
begin_layer
@ -18,7 +18,7 @@ begin_layer
end_layer
----------Sampling Information----------
NumberOfSamples: 100000
BeamMeanEnergy(MeV): 0.87 BeamEnergySigma(MeV): 0.0
BeamMeanEnergy(MeV): 1.1 BeamEnergySigma(MeV): 0.0
EjectileThetaType(0=Lab,1=CM): 1
EjectileThetaMin(deg): 0.0 EjectileThetaMax(deg): 180.0
EjectilePhiMin(deg): 0.0 EjectilePhiMax(deg): 360.0

View 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;
}

View File

@ -158,7 +158,7 @@ double AnasenEfficiency::RunConsistencyCheck() {
for(auto& point : r1_points) {
for(auto& sx3 : m_Ring1) {
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())) {
count++;
break;
@ -168,7 +168,7 @@ double AnasenEfficiency::RunConsistencyCheck() {
for(auto& point : r2_points) {
for(auto& sx3 : m_Ring2) {
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())) {
count++;
break;
@ -205,14 +205,15 @@ double AnasenEfficiency::RunConsistencyCheck() {
DetectorResult AnasenEfficiency::IsRing1(Mask::Nucleus& nucleus) {
DetectorResult observation;
//Mask::Vec3 coords;
double thetaIncident;
for(auto& sx3 : m_Ring1) {
auto result = sx3.GetChannelRatio(nucleus.GetTheta(), nucleus.GetPhi());
if(result.first != -1) {
for(int i=0; i<n_sx3_per_ring; i++) {
auto result = m_Ring1[i].GetChannelRatio(nucleus.GetTheta(), nucleus.GetPhi());
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.direction = sx3.GetHitCoordinates(result.first, result.second);
thetaIncident = std::acos(observation.direction.Dot(sx3.GetNormRotated())/observation.direction.GetR());
observation.direction = m_Ring1[i].GetHitCoordinates(result.front_strip_index, result.front_ratio);
thetaIncident = std::acos(observation.direction.Dot(m_Ring1[i].GetNormRotated())/observation.direction.GetR());
if(thetaIncident > M_PI/2.0)
thetaIncident = M_PI - thetaIncident;
@ -229,12 +230,14 @@ DetectorResult AnasenEfficiency::IsRing2(Mask::Nucleus& nucleus) {
DetectorResult observation;
double thetaIncident;
for(auto& sx3 : m_Ring2) {
auto result = sx3.GetChannelRatio(nucleus.GetTheta(), nucleus.GetPhi());
if(result.first != -1) {
for(int i=0; i<n_sx3_per_ring; i++) {
auto result = m_Ring2[i].GetChannelRatio(nucleus.GetTheta(), nucleus.GetPhi());
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.direction = sx3.GetHitCoordinates(result.first, result.second);
thetaIncident = std::acos(observation.direction.Dot(sx3.GetNormRotated())/observation.direction.GetR());
observation.direction = m_Ring2[i].GetHitCoordinates(result.front_strip_index, result.front_ratio);
thetaIncident = std::acos(observation.direction.Dot(m_Ring2[i].GetNormRotated())/observation.direction.GetR());
if(thetaIncident > M_PI/2.0)
thetaIncident = M_PI - thetaIncident;
@ -251,12 +254,14 @@ DetectorResult AnasenEfficiency::IsQQQ(Mask::Nucleus& nucleus) {
DetectorResult observation;
double thetaIncident;
for(auto& qqq : m_forwardQQQs) {
auto result = qqq.GetTrajectoryRingWedge(nucleus.GetTheta(), nucleus.GetPhi());
if(result.first != -1) {
for(int i=0; i<n_qqq; i++) {
auto result = m_forwardQQQs[i].GetTrajectoryRingWedge(nucleus.GetTheta(), nucleus.GetPhi());
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.direction = qqq.GetHitCoordinates(result.first, result.second);
thetaIncident = std::acos(observation.direction.Dot(qqq.GetNorm())/observation.direction.GetR());
observation.direction = m_forwardQQQs[i].GetHitCoordinates(result.first, result.second);
thetaIncident = std::acos(observation.direction.Dot(m_forwardQQQs[i].GetNorm())/observation.direction.GetR());
if(thetaIncident > M_PI/2.0)
thetaIncident = M_PI - thetaIncident;
@ -267,12 +272,14 @@ DetectorResult AnasenEfficiency::IsQQQ(Mask::Nucleus& nucleus) {
}
for(auto& qqq : m_backwardQQQs) {
auto result = qqq.GetTrajectoryRingWedge(nucleus.GetTheta(), nucleus.GetPhi());
if(result.first != -1) {
for(int i=0; i<n_qqq; i++) {
auto result = m_backwardQQQs[i].GetTrajectoryRingWedge(nucleus.GetTheta(), nucleus.GetPhi());
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.direction = qqq.GetHitCoordinates(result.first, result.second);
thetaIncident = std::acos(observation.direction.Dot(qqq.GetNorm())/observation.direction.GetR());
observation.direction = m_backwardQQQs[i].GetHitCoordinates(result.first, result.second);
thetaIncident = std::acos(observation.direction.Dot(m_backwardQQQs[i].GetNorm())/observation.direction.GetR());
if(thetaIncident > M_PI/2.0)
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) {
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<<"Loading in output from kinematics simulation: "<<inputname<<std::endl;
std::cout<<"Running efficiency calculation..."<<std::endl;

View File

@ -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;
}
}

View File

@ -17,7 +17,7 @@ int main(int argc, char** argv) {
/*
SabreEfficiency sabre;
std::string mapfile = "./etc/DeadChannels.txt";
std::string mapfile = "./etc/SabreDeadChannels.txt";
sabre.SetDeadChannelMap(mapfile);
sabre.CalculateEfficiency(inputname, outputname, statsname);
//std::cout<<"Running consistency check(1=success): "<<sabre.RunConsistencyCheck()<<std::endl;
@ -26,6 +26,8 @@ int main(int argc, char** argv) {
try {
AnasenEfficiency anasen;
std::string mapfile = "./etc/AnasenDeadChannels.txt";
anasen.SetDeadChannelMap(mapfile);
anasen.CalculateEfficiency(inputname, outputname, statsname);
//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");

View 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;
}
}

View File

@ -53,8 +53,8 @@ StripDetector::~StripDetector() {}
void StripDetector::CalculateCorners() {
double y_min, y_max, z_min, z_max;
for (int s=0; s<num_strips; s++) {
y_max = -total_width/2.0 + front_strip_width*(s+1);
y_min = -total_width/2.0 + front_strip_width*s;
y_max = 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_min = center_z - length/2.0;
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;
//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_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
//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 zhit = sqrt(xhit*xhit+yhit*yhit)/tan(theta);
int front_ch_hit=-1;
double ratio=0;
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)
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
{
front_ch_hit = s;
ratio = (zhit-center_z)/(length/2);
hit.front_strip_index = s;
hit.front_ratio = (zhit-center_z)/(length/2);
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;
}