HighLAND
SubDetId.cxx
1 #include "SubDetId.hxx"
2 #include <iostream>
3 #include <bitset>
4 
5 const unsigned long SubDetId::DetMask[] = {
6  1<<SubDetId::kFGD1,
7  1<<SubDetId::kFGD2,
8  1<<SubDetId::kTPC1,
9  1<<SubDetId::kTPC2,
10  1<<SubDetId::kTPC3,
11  1<<SubDetId::kP0D,
12  1<<SubDetId::kDSECAL,
13  1<<SubDetId::kTopTECAL,
14  1<<SubDetId::kBottomTECAL,
15  1<<SubDetId::kLeftTECAL,
16  1<<SubDetId::kRightTECAL,
17  1<<SubDetId::kTopPECAL,
18  1<<SubDetId::kBottomPECAL,
19  1<<SubDetId::kLeftPECAL,
20  1<<SubDetId::kRightPECAL,
21  1<<SubDetId::kTopSMRD,
22  1<<SubDetId::kBottomSMRD,
23  1<<SubDetId::kLeftSMRD,
24  1<<SubDetId::kRightSMRD,
25  1<<SubDetId::kInvalidSubdetector,
26  1<<SubDetId::kTPC | SubDetId::MakeMask(SubDetId::kTPC3, SubDetId::kTPC1),
27  1<<SubDetId::kFGD | SubDetId::MakeMask(SubDetId::kFGD2, SubDetId::kFGD1),
28  1<<SubDetId::kECAL | SubDetId::MakeMask(SubDetId::kRightPECAL, SubDetId::kDSECAL),
29  1<<SubDetId::kTECAL | SubDetId::MakeMask(SubDetId::kRightTECAL, SubDetId::kTopTECAL),
30  1<<SubDetId::kPECAL | SubDetId::MakeMask(SubDetId::kRightPECAL, SubDetId::kTopPECAL),
31  1<<SubDetId::kSMRD | SubDetId::MakeMask(SubDetId::kRightSMRD, SubDetId::kTopSMRD),
32  1<<SubDetId::kTRACKER | SubDetId::MakeMask(SubDetId::kTPC3, SubDetId::kFGD1),
33  1<<SubDetId::kInvalid
34 };
35 
36 void SubDetId::SetDetectorUsed(unsigned long &BitField, SubDetId::SubDetEnum det){
37  BitField = BitField | 1<<det;
38 }
39 
40 bool SubDetId::GetDetectorUsed(unsigned long BitField, SubDetId::SubDetEnum det){
41  return BitField & DetMask[det];
42 }
43 
44 bool SubDetId::GetDetectorUsed(unsigned long BitField, SubDetId_h det){
45  return BitField & DetMask[det];
46 }
47 
48 
49 bool SubDetId::GetDetectorArrayUsed(unsigned long BitField, SubDetId::SubDetEnum dets[], int nDet){
50 
51  bool passed = 1;
52 
53  for(int i = 0; i < nDet; ++i){
54  if(!(BitField & DetMask[dets[i]])){
55  passed = 0;
56  }
57  }
58  return passed;
59 }
60 
61 bool SubDetId::GetDetectorArrayUsed(unsigned long BitField, SubDetId_h dets[], int nDet){
62 
63  bool passed = 1;
64 
65  for(int i = 0; i < nDet; ++i){
66  if(!(BitField & DetMask[dets[i]])){
67  passed = 0;
68  }
69  }
70  return passed;
71 }
72 
73 
74 int SubDetId::GetTPC(unsigned long BitField){
75  if (BitField & DetMask[SubDetId::kTPC2]) return 2;
76  else if (BitField & DetMask[SubDetId::kTPC3]) return 3;
77  else if (BitField & DetMask[SubDetId::kTPC1]) return 1;
78  else return -1;
79 }
80 
81 void SubDetId::SetDetectorSystemFields(unsigned long &BitField){
82  for(int i = SubDetId::kFGD1; i < SubDetId::kInvalidSubdetector; ++i){ //loop through sub-detectors list
83  if (GetDetectorUsed(BitField, static_cast<SubDetId::SubDetEnum>(i))){
84  // FGD
85  if (i == SubDetId::kFGD1 || i == SubDetId::kFGD2)
86  SetDetectorUsed(BitField, SubDetId::kFGD);
87  // TPC
88  else if (i == SubDetId::kTPC1 || i == SubDetId::kTPC2 || i == SubDetId::kTPC3)
89  SetDetectorUsed(BitField, SubDetId::kTPC);
90  // P0D (for consistency)
91  else if (i == SubDetId::kP0D) continue;
92  //ECal
93  else if (i >= SubDetId::kDSECAL && i <= SubDetId::kRightPECAL){
94  SetDetectorUsed(BitField, SubDetId::kECAL);
95  //TECal
96  if (i >= SubDetId::kTopTECAL && i <= SubDetId::kRightTECAL) SetDetectorUsed(BitField, SubDetId::kTECAL);
97  //PECal
98  else if(i >= SubDetId::kTopPECAL && i <= SubDetId::kRightPECAL) SetDetectorUsed(BitField, SubDetId::kPECAL);
99  }
100  //SMRD
101  else if (i >= SubDetId::kTopSMRD && i <= SubDetId::kRightSMRD) SetDetectorUsed(BitField, SubDetId::kSMRD);
102  }
103  }
104 }
105 int SubDetId::NumberOfSetBits(unsigned long v){
106  int c; // c accumulates the total bits set in v
107  for (c = 0; v; c++){
108  v &= v - 1; // clear the least significant bit set
109  }
110  return c;
111 }
112 
113 int SubDetId::GetNSegmentsInDet(unsigned long BitField, SubDetId::SubDetEnum det){
114  return NumberOfSetBits(BitField & DetMask[det]);
115 }
116 
117 bool SubDetId::TrackUsesOnlyDet(unsigned long BitField, SubDetId::SubDetEnum det){
118  BitField = BitField & MakeMask(SubDetId::kRightSMRD, SubDetId::kFGD1);
119  return !(BitField & ~DetMask[det]);
120 }
121 
123  return (det <= SubDetId::kTPC3 && det >= SubDetId::kTPC1);
124 }
125 
127  return (det <= SubDetId::kFGD2 && det >= SubDetId::kFGD1);
128 }
129 
131  return (det <= SubDetId::kRightPECAL && det >= SubDetId::kDSECAL);
132 }
133 
135  return (det <= SubDetId::kRightTECAL && det >= SubDetId::kTopTECAL);
136 }
137 
139  return (det <= SubDetId::kRightPECAL && det >= SubDetId::kTopPECAL);
140 }
141 
143  return (det <= SubDetId::kRightSMRD && det >= SubDetId::kTopSMRD);
144 }
145 
147  return (det ==kP0D);
148 }
149 
150 bool SubDetId::HasTECALDetector(unsigned long BitField){
151  if(BitField & DetMask[SubDetId::kTECAL]) return true;
152  return false;
153 }
154 
155 bool SubDetId::HasPECALDetector(unsigned long BitField){
156  if(BitField & DetMask[SubDetId::kPECAL]) return true;
157  return false;
158 }
159 
160 bool SubDetId::HasSMRDDetector(unsigned long BitField){
161  if(BitField & DetMask[SubDetId::kSMRD]) return true;
162  return false;
163 }
164 
166 
167  BitField = BitField & MakeMask(SubDetId::kRightSMRD, SubDetId::kFGD1);
168  int nBits = NumberOfSetBits(BitField);
169  if(nBits!=1){
170  std::cout << " Error: Track contains multiple subdetectors, cannot find a single subdetector enum to return." << std::endl;
171  return SubDetId::kInvalid;
172  }
173  BitField = BitField | (BitField-1);
174  nBits = NumberOfSetBits(BitField);
175  return static_cast<SubDetId::SubDetEnum>(nBits-1);
176 }
177 
static bool TrackUsesOnlyDet(unsigned long BitFIeld, SubDetId::SubDetEnum det)
Check whether a track only uses a specified subdetector or detector system.
Definition: SubDetId.cxx:117
static bool IsFGDDetector(SubDetId::SubDetEnum det)
Check if a detector enumeration refers to a FGD or not.
Definition: SubDetId.cxx:126
static bool HasPECALDetector(unsigned long BitField)
Check if a detector bit field has a P0D ECAL or not.
Definition: SubDetId.cxx:155
static int GetNSegmentsInDet(unsigned long BitFIeld, SubDetId::SubDetEnum det)
Definition: SubDetId.cxx:113
static bool IsP0DDetector(SubDetId::SubDetEnum det)
Check if a detector enumeration refers to a SMRDP0D or not.
Definition: SubDetId.cxx:146
static void SetDetectorSystemFields(unsigned long &BitField)
Definition: SubDetId.cxx:81
static bool GetDetectorUsed(unsigned long BitField, SubDetId::SubDetEnum det)
Method to see if a certain subdetector or subdetector system is used.
Definition: SubDetId.cxx:40
static bool IsPECALDetector(SubDetId::SubDetEnum det)
Check if a detector enumeration refers to a P0D ECAL or not.
Definition: SubDetId.cxx:138
static bool HasSMRDDetector(unsigned long BitField)
Check if a detector bit field has a SMRD or not.
Definition: SubDetId.cxx:160
static void SetDetectorUsed(unsigned long &BitField, SubDetId::SubDetEnum det)
Method to set a certain subdetector or subdetector system to used used.
Definition: SubDetId.cxx:36
static bool IsTPCDetector(SubDetId::SubDetEnum det)
Check if a detector enumeration refers to a TPC or not.
Definition: SubDetId.cxx:122
static bool IsECALDetector(SubDetId::SubDetEnum det)
Check if a detector enumeration refers to a ECAL or not.
Definition: SubDetId.cxx:130
SubDetEnum
Enumeration of all detector systems and subdetectors.
Definition: SubDetId.hxx:25
static SubDetId::SubDetEnum GetSubdetectorEnum(unsigned long BitField)
Get the single subdetector that this track is from.
Definition: SubDetId.cxx:165
static bool IsTECALDetector(SubDetId::SubDetEnum det)
Check if a detector enumeration refers to a Tracker ECAL or not.
Definition: SubDetId.cxx:134
static bool HasTECALDetector(unsigned long BitField)
Check if a detector bit field has a Tracker ECAL or not.
Definition: SubDetId.cxx:150
static int GetTPC(unsigned long BitField)
Definition: SubDetId.cxx:74
static bool IsSMRDDetector(SubDetId::SubDetEnum det)
Check if a detector enumeration refers to a SMRD or not.
Definition: SubDetId.cxx:142