ATLAS Offline Software
Loading...
Searching...
No Matches
TrigMonRoi.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3*/
4
5// C/C++
6#include <algorithm>
7#include <iostream>
8#include <sstream>
9
12
13namespace RoiBits
14{
15 const uint32_t maskId = 0x000000ff;
16 const uint32_t maskType = 0x00000f00;
17 const uint32_t maskL1 = 0x000ff000;
18 //const uint32_t maskFree = 0xfff00000;
19
20 const uint32_t shiftId = 0;
21 const uint32_t shiftType = 8;
22 const uint32_t shiftL1 = 12;
23 //const uint32_t shiftFree = 20;
24}
25
26//--------------------------------------------------------------------------------------
28 :m_word(1, 0)
29{
30}
31
32//--------------------------------------------------------------------------------------
33TrigMonRoi::TrigMonRoi(uint32_t roi_word)
34 :m_word(1, 0)
35{
36 //
37 // Set RoiId to uknown state
38 //
39 m_word[0] = roi_word;
40}
41
42//--------------------------------------------------------------------------------------
44{
45 //
46 // Set roi type
47 //
48 if(m_word.size() < 2) return;
49
51}
52
53//--------------------------------------------------------------------------------------
54void TrigMonRoi::setRoiId(unsigned int id)
55{
56 //
57 // Set roi type
58 //
59 if(m_word.size() < 2) return;
60
61 if(id < 256) {
62 m_word[1] |= (id << RoiBits::shiftId);
63 }
64 else {
65 if(m_word.size()<3){
66 m_word.push_back(id);
67 }
68 else{
69 m_word[2]=id;
70 }
71 }
72}
73
74//--------------------------------------------------------------------------------------
75void TrigMonRoi::setNL1th(unsigned int lt)
76{
77 //
78 // Set roi type
79 //
80 if(m_word.size() < 2) return;
81
82 if(lt < 256) {
83 m_word[1] |= (lt << RoiBits::shiftL1);
84 }
85 else {
86 REPORT_MESSAGE_WITH_CONTEXT(MSG::ERROR, "TrigMonRoi")
87 << "setL1thresholds error! Value is out of range: " << lt;
88 }
89}
90
91//--------------------------------------------------------------------------------------
92void TrigMonRoi::setEtaPhi(float eta, float phi)
93{
94 //
95 // Add eta and phi coordinatesat key=0 and key=1
96 //
97 if(std::count(m_var_key.begin(), m_var_key.end(), 0) == 0 &&
98 std::count(m_var_key.begin(), m_var_key.end(), 1) == 0) {
99 m_var_key.push_back(0);
100 m_var_val.push_back(eta);
101
102 m_var_key.push_back(1);
103 m_var_val.push_back(phi);
104 }
105}
106
107//--------------------------------------------------------------------------------------
108void TrigMonRoi::setRoIArea(float eta_width, float phi_width)
109{
110 //
111 // Add eta and phi coordinatesat key=0 and key=1
112 //
113 if(std::count(m_var_key.begin(), m_var_key.end(), 2) == 0) {
114
115 // Assuming the area is an ellipse - approximate
116 //float area = 3.14159*eta_width*phi_width;
117
118 // Chainging to square area, assume supplied are full width
119 float area = eta_width * phi_width;
120
121 m_var_key.push_back(2);
122 m_var_val.push_back(area);
123 }
124}
125
126//--------------------------------------------------------------------------------------
128{
129 //
130 // Store variable as int and float, reserve 0-9 keys
131 //
132 if(var.getKey() > 9) {
133 m_var_key.push_back(var.getKey());
134 m_var_val.push_back(var.getData());
135 } else {
136 REPORT_MESSAGE_WITH_CONTEXT(MSG::ERROR, "TrigMonRoi")
137 << "Cannot add a var with key < 9 (internal use only)";
138 }
139}
140
141//--------------------------------------------------------------------------------------
143{
144 //
145 // Return RoI type assigned by HLT
146 //
147 if(m_word.size() < 2) return kNone;
148
149 const unsigned int val = (m_word[1] & RoiBits::maskType) >> RoiBits::shiftType;
150
151 switch (val) {
152 case 1: return kMuon;
153 case 2: return kEmTau;
154 case 3: return kJet;
155 case 4: return kJetEt;
156 case 5: return kEnergy;
157 default: break;
158 }
159
160 return kNone;
161}
162
163//--------------------------------------------------------------------------------------
164uint32_t TrigMonRoi::getRoiId() const
165{
166 //
167 // Return RoI id assigned by HLT
168 //
169 if(m_word.size() < 2) return Trig::getRoiId_Unknown();
170
171 // For 2012 data
172 if(m_word.size() == 3) return m_word[2];
173
174 return (m_word[1] & RoiBits::maskId) >> RoiBits::shiftId;
175}
176
177//--------------------------------------------------------------------------------------
179{
180 //
181 // Search for eta value at key=0
182 //
183
184 if(m_var_key.size() == m_var_val.size()) {
185 for(unsigned int i = 0; i < m_var_key.size(); ++i) {
186 if(m_var_key[i] == 0) return m_var_val[i];
187 }
188 }
189
190 return -9999.0;
191}
192
193//--------------------------------------------------------------------------------------
195{
196 //
197 // Search for phi value at key=1
198 //
199
200 if(m_var_key.size() == m_var_val.size()) {
201 for(unsigned int i = 0; i < m_var_key.size(); ++i) {
202 if(m_var_key[i] == 1) return m_var_val[i];
203 }
204 }
205
206 return -9999.0;
207}
208
209//--------------------------------------------------------------------------------------
211{
212 //
213 // Search for phi value at key=2
214 //
215
216 if(m_var_key.size() == m_var_val.size()) {
217 for(unsigned int i = 0; i < m_var_key.size(); ++i) {
218 if(m_var_key[i] == 2) return m_var_val[i];
219 }
220 }
221
222 return -9999.0;
223}
224
225//--------------------------------------------------------------------------------------
226uint8_t TrigMonRoi::getNL1th() const
227{
228 //
229 // Return number of L1 thresholds assigned by HLT
230 //
231 if(m_word.size() < 2) return 0;
232
233 return (m_word[1] & RoiBits::maskL1) >> RoiBits::shiftL1;
234}
235
236//--------------------------------------------------------------------------------------
237const std::vector<TrigMonVar> TrigMonRoi::getVar() const
238{
239 //
240 // Build variables on a fly and return vector by value
241 //
242 std::vector<TrigMonVar> var;
243
244 if(m_var_key.size() == m_var_val.size()) {
245 //
246 // Iterate over keys abd values
247 //
248 var.reserve(m_var_key.size());
249
250 for(unsigned int i = 0; i < m_var_key.size(); ++i) {
251 var.push_back(TrigMonVar(m_var_key[i], m_var_val[i]));
252 }
253 }
254
255 return var;
256}
257
258float TrigMonRoi::getVarVal( const uint32_t key ) const
259{
260 for(unsigned int i = 0; i < m_var_key.size(); ++i) {
261 if (m_var_key.at(i) == key) return m_var_val.at(i);
262 }
263 return 0.;
264}
265
266
267//--------------------------------------------------------------------------------------
268void TrigMonRoi::print(std::ostream &os)
269{
270 os << str(*this) << std::endl;
271}
272
273//--------------------------------------------------------------------------------------
274std::string str(const TrigMonRoi &o)
275{
276 std::stringstream s;
277 s << "TrigMonRoi: id=" << o.getRoiId() << " word=" << o.getRoiWord();
278
279 return s.str();
280}
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
Helpers for checking error return status codes and reporting errors.
#define REPORT_MESSAGE_WITH_CONTEXT(LVL, CONTEXT_NAME)
Report a message, with an explicitly specified context name.
double area(double R)
std::vector< float > m_var_val
Definition TrigMonRoi.h:79
void setRoiId(unsigned int id)
uint8_t getNL1th() const
uint32_t getRoiId() const
float getEta() const
float getPhi() const
std::vector< uint32_t > m_word
Definition TrigMonRoi.h:77
std::vector< uint16_t > m_var_key
Definition TrigMonRoi.h:78
float getRoIArea() const
const std::vector< TrigMonVar > getVar() const
void setNL1th(unsigned int lt)
uint32_t getRoiWord() const
Definition TrigMonRoi.h:53
void setEtaPhi(float eta, float phi)
void print(std::ostream &os=std::cout)
std::vector< float > & getVarVal()
Definition TrigMonRoi.h:65
Type getRoiType() const
void setRoIArea(float eta_width, float phi_width)
void addVar(const TrigMonVar &var)
void setType(Type type)
const uint32_t shiftId
const uint32_t maskId
const uint32_t shiftType
const uint32_t shiftL1
const uint32_t maskL1
const uint32_t maskType
uint8_t getRoiId_Unknown()
Definition TrigMonRoi.h:89