ATLAS Offline Software
Loading...
Searching...
No Matches
HitMapBuilder.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
5// PixelCalibAlgs
6#include "HitMapBuilder.h"
8
9// Gaudi
10#include "GaudiKernel/ITHistSvc.h"
14
15// geometry
17
18// standard library
19#include <string>
20#include <sstream>
21#include <fstream>
22
23
26
27std::string HitMapBuilder::getDCSIDFromPosition(int barrel_ec, int layer, int modPhi, int module_eta) {
28 for (unsigned int ii = 0; ii < m_pixelMapping.size(); ii++) {
29 if (m_pixelMapping[ii].second.size() != 4) {
30 ATH_MSG_FATAL("getDCSIDFromPosition: Vector size is not 4!");
31 return std::string("Error!");
32 }
33 if (m_pixelMapping[ii].second[0] != barrel_ec) continue;
34 if (m_pixelMapping[ii].second[1] != layer) continue;
35 if (m_pixelMapping[ii].second[2] != modPhi) continue;
36 if (m_pixelMapping[ii].second[3] != module_eta) continue;
37 return m_pixelMapping[ii].first;
38 }
39 ATH_MSG_FATAL("DCS ID is not found!");
40 return std::string("Error!");
41}
42
43const std::string HitMapBuilder::histoSuffix(const int bec, const int layer) {
44 std::ostringstream out;
45 switch (bec) {
46 case 0:
47 if (layer==0) out << "IBL";
48 else out << "B" << layer-1;
49 break;
50 case +2: out << "Disk" << layer+1 << "A"; break;
51 case -2: out << "Disk" << layer+1 << "C"; break;
52 case +4: out << "DBM" << layer+1 << "A"; break;
53 case -4: out << "DBM" << layer+1 << "C"; break;
54 default: break;
55 }
56 return out.str();
57}
58
59std::vector<std::string>& HitMapBuilder::splitter(const std::string &str, char delim, std::vector<std::string> &elems) {
60 std::stringstream ss(str);
61 std::string item;
62 while (std::getline(ss, item, delim)) {
63 elems.push_back(item);
64 }
65 return elems;
66}
67
68std::vector<std::string> HitMapBuilder::splitter(const std::string &str, char delim) {
69 std::vector<std::string> elems;
70 splitter(str, delim, elems);
71 return elems;
72}
73
74//=========================================================
75//
76// initialize
77//
78//=========================================================
80 ATH_MSG_INFO("Initializing HitMapBuilder");
81
82 ATH_CHECK(m_pixelRDOKey.initialize());
83
84 // retrieve THistSvc
85 StatusCode sc = m_tHistSvc.retrieve();
86 if (!sc.isSuccess()) {
87 ATH_MSG_FATAL("Unable to retrieve THistSvc");
88 return StatusCode::FAILURE;
89 }
90 // retrieve PixelDetectorManager
91 sc = detStore()->retrieve(m_pixman,"Pixel");
92 if (!sc.isSuccess()) {
93 ATH_MSG_FATAL("Unable to retrieve PixelDetectorManager");
94 return StatusCode::FAILURE;
95 }
96
97 // retrieve PixelID helper
98 sc = detStore()->retrieve(m_pixelID, "PixelID");
99 if (!sc.isSuccess()) {
100 ATH_MSG_FATAL("Unable to retrieve PixelID helper");
101 return StatusCode::FAILURE;
102 }
103
104 // resize vectors of histograms
105 const Identifier::size_type maxHash = m_pixelID->wafer_hash_max();
106 ATH_MSG_DEBUG("PixelID maxHash = " << maxHash);
107 m_occupancyMaps.resize(maxHash+m_nIblFes);
109 m_TOTdistributions.resize(maxHash+m_nIblFes);
111 m_occupancyLB.resize(maxHash+m_nIblFes);
112
113 // Resize vector of variables
116
117 return (registerHistograms());
118}
119
120
122 const std::string mapFile = "PixelMapping_Run2.dat";
123
124 std::vector<std::string> paths = splitter(std::getenv("DATAPATH"), ':');
125 bool found(false);
126 for (const auto& x : paths) {
127 std::ifstream infile((x+"/"+mapFile).c_str());
128 if (infile.is_open()) {
129 ATH_MSG_INFO("Mapping file '" << mapFile << "' found in " << x);
130
131 int tmp_barrel_ec; int tmp_layer; int tmp_modPhi; int tmp_module_eta; std::string tmp_module_name;
132 std::vector<int> tmp_position;
133 tmp_position.resize(4);
134 while(infile >> tmp_barrel_ec >> tmp_layer >> tmp_modPhi >> tmp_module_eta >> tmp_module_name) {
135 tmp_position[0] = tmp_barrel_ec;
136 tmp_position[1] = tmp_layer;
137 tmp_position[2] = tmp_modPhi;
138 tmp_position[3] = tmp_module_eta;
139 m_pixelMapping.push_back(std::make_pair(tmp_module_name, tmp_position));
140 }
141
142 found=true;
143 infile.close();
144 break;
145 }
146 }
147
148 if (!found) {
149 ATH_MSG_FATAL("Mapping file '" << mapFile << "' not found in DATAPATH !!!");
150 return StatusCode::FAILURE;
151 }
152
153 // Register event histogram
154 m_nEventsHist = std::make_unique<TH1F>("NEvents", "NEvents;;# events", 1, 0, 1);
155 m_nEventsLBHist = std::make_unique<TH1F>("NEventsLB", "NEventsLB;LB;# events", m_hist_lbMax, -0.5, m_hist_lbMax+0.5);
156
157 // Regist TDirectory first
158 // HARD CODING, TODO do in a smarter way
159 std::vector<std::pair<int, int>> temp_bec_layer{std::make_pair(2, 3), std::make_pair(-2, 3), std::make_pair(0, 4)};
160 std::vector<std::string> temp_dir{"Occupancy2d", "OccupancyLb", "ToT"};
161 for (auto const& bl : temp_bec_layer) {
162 for (int l=0; l<bl.second; l++) {
163 for (auto const& d: temp_dir) {
164 std::string temp_str = "/histfile/All/" + d + "/" + histoSuffix(bl.first, l) + "/" + d + histoSuffix(bl.first, l);
165 std::unique_ptr<TH1F>temp_h1d = std::make_unique<TH1F>((d+histoSuffix(bl.first, l)).c_str(), (d+histoSuffix(bl.first, l)).c_str(), 1, 0, 1);
166 ATH_CHECK(m_tHistSvc->regHist(temp_str.c_str(), std::move(temp_h1d)));
167 ATH_CHECK(m_tHistSvc->deReg(temp_str));
168 }
169 }
170 }
171
172 for (InDetDD::SiDetectorElementCollection::const_iterator iter=m_pixman->getDetectorElementBegin(); iter!=m_pixman->getDetectorElementEnd(); ++iter) {
173 const InDetDD::SiDetectorElement* element = *iter;
174 if (!element) continue;
175
176 Identifier ident = element->identify();
177 if (!m_pixelID->is_pixel(ident)) continue;
178
179 int bec = m_pixelID->barrel_ec(ident);
180 int layer = m_pixelID->layer_disk(ident);
181 int modPhi = m_pixelID->phi_module(ident);
182 int modEta = m_pixelID->eta_module(ident);
183 int modHash = m_pixelID->wafer_hash(ident);
184 const Identifier::size_type maxHash = m_pixelID->wafer_hash_max();
185
186 if (abs(bec) == 4) continue; // Skip DBM
187
188 int iblFeHash = -99;
189 // Use special fe chip index for IBL
190 // {0..3}: 3D C, C8_2, C8_1, C7_2, C7_1
191 // {4..15}: 2D C, C6_2, C6_1, ..., C1_2, C1_1
192 // {16..27}: 2D A, A1_1, A1_2, ..., A6_1, A6_2
193 // {28..31}: 3D A, A7_1, A7_2, A8_1, A8_2
194 if (bec == 0 && layer == 0) {
195 if (modEta <= -7) iblFeHash = modPhi*32 + (modEta+10); // 3D C
196 else if (-6<=modEta && modEta<=5) iblFeHash = modPhi*32 + ((modEta+6)*2+4); // 2D
197 else iblFeHash = modPhi*32 + (modEta+22); // 3D A
198 // iblFeHash, here, is even
199 }
200
201 std::string onlineID = getDCSIDFromPosition(bec,layer,modPhi,modEta);
202
203 std::ostringstream name;
204 std::string axisTitle;
205
206 // Construct IBL Planar later
207 std::string LBCategory;
208 std::string occ2dDir = "Occupancy2d";
209 std::string occLBDir = "OccupancyLb";
210 std::string totDir = "ToT";
211
212 // Category: All
213 LBCategory = "All";
214 if (bec == 0 && layer == 0 && -6 <= modEta && modEta <= 5) { // IBL 2D
215 for (unsigned chipId=0; chipId<=1; chipId++) { // FE chips in double module
216 int ibl2dHash;
217 if (chipId) {
218 if (modEta <= -1) ibl2dHash = maxHash + iblFeHash; // C side, '_2'
219 else ibl2dHash = maxHash + iblFeHash + chipId; // A side, '_2'
220 }
221 else {
222 if (modEta <= -1) ibl2dHash = maxHash + iblFeHash + 1; // C side, '_1'
223 else ibl2dHash = maxHash + iblFeHash; // A side, '_1'
224 }
225 std::string histTitle = onlineID + "_" + std::to_string(chipId+1);
226 // Occupancy Map
227 axisTitle = ";pixel_eta;pixel_phi;# hits/pixel/event";
228 m_occupancyMaps[ibl2dHash] = std::make_unique<TH2F>(histTitle.c_str(), (histTitle+axisTitle).c_str(), 80, -0.5, 79.5, 336, -0.5, 335.5);
229 name << "/histfile/" << LBCategory << "/" << occ2dDir << "/" << histoSuffix(bec,layer) << "/" << onlineID << "_" << chipId+1;
230 name.str(""); name.clear();
231 m_occupancyMaps[ibl2dHash]->SetOption("colz");
232
233 // Occupancy vs. LB
234 axisTitle = ";LB;# hits/pixel/event";
235 m_occupancyLB[ibl2dHash] = std::make_unique<TH1F>(histTitle.c_str(), (histTitle+axisTitle).c_str(), m_hist_lbMax, -0.5, m_hist_lbMax-0.5);
236 name << "/histfile/" << LBCategory << "/" << occLBDir << "/" << histoSuffix(bec,layer) << "/" << onlineID << "_" << chipId+1;
237 name.str(""); name.clear();
238
239 // ToT
240 axisTitle = ";ToT;# hits";
241 m_TOTdistributions[ibl2dHash] = std::make_unique<TH1F>(histTitle.c_str(), (histTitle+axisTitle).c_str(), 19, -0.5, 18.5);
242 name << "/histfile/" << LBCategory << "/" << totDir << "/" << histoSuffix(bec,layer) << "/" << onlineID << "_" << chipId+1;
243 name.str(""); name.clear();
244 }
245 }
246 else { // None IBL 2D
247 // Occupancy Map
248 axisTitle = ";pixel_eta;pixel_phi;# hits/pixel/event";
249 if (bec == 0 && layer == 0) {
250 m_occupancyMaps[modHash] = std::make_unique<TH2F>(onlineID.c_str(), (onlineID+axisTitle).c_str(), 80, -0.5, 79.5, 336, -0.5, 335.5); // IBL 3D
251 }
252 else {
253 m_occupancyMaps[modHash] = std::make_unique<TH2F>(onlineID.c_str(), (onlineID+axisTitle).c_str(), 144, -0.5, 143.5, 328, -0.5, 327.5);
254 }
255 name << "/histfile/" << LBCategory << "/" << occ2dDir << "/" << histoSuffix(bec,layer) << "/" << onlineID;
256 name.str(""); name.clear();
257 m_occupancyMaps[modHash].get()->SetOption("colz");
258
259 // Occupancy vs. LB
260 axisTitle = ";LB;# hits/pixel/event";
261 m_occupancyLB[modHash] = std::make_unique<TH1F>(onlineID.c_str(), (onlineID+axisTitle).c_str(), m_hist_lbMax, -0.5, m_hist_lbMax-0.5);
262 name << "/histfile/" << LBCategory << "/" << occLBDir << "/" << histoSuffix(bec,layer) << "/" << onlineID;
263 name.str(""); name.clear();
264
265 // ToT
266 axisTitle = ";ToT;# hits";
267 if (bec == 0 && layer == 0) {
268 m_TOTdistributions[modHash] = std::make_unique<TH1F>(onlineID.c_str(), (onlineID+axisTitle).c_str(), 19, -0.5, 18.5); // IBL 3D
269 }
270 else {
271 m_TOTdistributions[modHash] = std::make_unique<TH1F>(onlineID.c_str(), (onlineID+axisTitle).c_str(), 256, -0.5, 255.5);
272 }
273 name << "/histfile/" << LBCategory << "/" << totDir << "/" << histoSuffix(bec,layer) << "/" << onlineID;
274 name.str(""); name.clear();
275 } // End of if ibl 2d
276
277 // Category: LB1-100, 101-200, ...
278 if (0 <= iblFeHash) { // IBL
279 for (int i=0; i<m_perLB_n; i++) {
280 LBCategory = "LB" + std::to_string(m_perLB_min+m_perLB_step*i+1) + "-" + std::to_string(m_perLB_min+m_perLB_step*(i+1));
281 if (-6 <= modEta && modEta <= 5) { // IBL 2D
282 for (int chipId=0; chipId<=1; chipId++) { // FE chips in double module
283 int ibl2dHash;
284 if (chipId) {
285 if (modEta <= -1) ibl2dHash = m_nIblFes*i + iblFeHash; // C side, '_2'
286 else ibl2dHash = m_nIblFes*i + iblFeHash + chipId; // A side, '_2'
287 }
288 else {
289 if (modEta <= -1) ibl2dHash = m_nIblFes*i + iblFeHash + 1; // C side, '_1'
290 else ibl2dHash = m_nIblFes*i + iblFeHash; // A side, '_1'
291 }
292 std::string histTitle = onlineID + "_" + std::to_string(chipId+1);
293 // Occupancy Map
294 axisTitle = ";pixel_eta;pixel_phi;# hits/pixel/event";
295 m_occupancyMapsIBL2dLB[ibl2dHash] = std::make_unique<TH2F>(histTitle.c_str(), (histTitle+axisTitle).c_str(), 80, -0.5, 79.5, 336, -0.5, 335.5);
296 name << "/histfile/" << LBCategory << "/" << occ2dDir << "/" << histoSuffix(bec,layer) << "/" << histTitle;
297 name.str(""); name.clear();
298 m_occupancyMapsIBL2dLB[ibl2dHash]->SetOption("colz");
299
300 // ToT
301 axisTitle = ";ToT;# hits";
302 m_TOTdistributionsIBL2dLB[ibl2dHash] = std::make_unique<TH1F>(histTitle.c_str(), (histTitle+axisTitle).c_str(), 19, -0.5, 18.5);
303 name << "/histfile/" << LBCategory << "/" << totDir << "/" << histoSuffix(bec,layer) << "/" << histTitle;
304 name.str(""); name.clear();
305 }
306 }
307 else { // IBL 3D
308 int ibl2dHash = m_nIblFes*i + iblFeHash;
309 // Occupancy Map
310 axisTitle = ";pixel_eta;pixel_phi;# hits/pixel/event";
311 m_occupancyMapsIBL2dLB[ibl2dHash] = std::make_unique<TH2F>(onlineID.c_str(), (onlineID+axisTitle).c_str(), 80, -0.5, 79.5, 336, -0.5, 335.5);
312 name << "/histfile/" << LBCategory << "/" << occ2dDir << "/" << histoSuffix(bec,layer) << "/" << onlineID;
313 name.str(""); name.clear();
314 m_occupancyMapsIBL2dLB[ibl2dHash]->SetOption("colz");
315
316 // ToT
317 axisTitle = ";ToT;# hits";
318 m_TOTdistributionsIBL2dLB[ibl2dHash] = std::make_unique<TH1F>(onlineID.c_str(), (onlineID+axisTitle).c_str(), 19, -0.5, 18.5);
319 name << "/histfile/" << LBCategory << "/" << totDir << "/" << histoSuffix(bec,layer) << "/" << onlineID;
320 name.str(""); name.clear();
321 } // End of if ibl 2d
322 } // End of loop of category: LB
323 } // End of if IBL
324 } // end loop in detector elements
325
326 return StatusCode::SUCCESS;
327}
328
329//=========================================================
330//
331// execute
332//
333//=========================================================
335 ATH_MSG_DEBUG( "Executing HitMapBuilder" );
336
337 const EventContext& ctx = Gaudi::Hive::currentContext();
338
339 // check LB is in allowed range
340 int LB = static_cast<int>(ctx.eventID().lumi_block());
341 if ((LB < m_evt_lbMin) || (m_evt_lbMax >= m_evt_lbMin && LB > m_evt_lbMax)) {
342 ATH_MSG_VERBOSE("Event in lumiblock " << LB << " not in selected range [" << m_evt_lbMin << "," << m_evt_lbMax << "] => skipped");
343 return StatusCode::SUCCESS;
344 }
345
346 // Get max LB range
347 if (m_LBrange_max < LB) m_LBrange_max = LB;
348
349// retrieve PixelRDO container
351 ATH_MSG_DEBUG( "Pixel RDO container retrieved" );
352 // loop in RDO container
353 for (const auto pPixelRDOCollection: *pixelRDOs) {
354 if (pPixelRDOCollection) {
355 Identifier moduleID = pPixelRDOCollection->identify();
356 IdentifierHash modHash = m_pixelID->wafer_hash(moduleID);
357 ATH_MSG_VERBOSE("moduleID, modHash = " << moduleID << " , " << modHash);
358
359 for (DataVector<PixelRDORawData>::const_iterator rdo=pPixelRDOCollection->begin(); rdo!=pPixelRDOCollection->end(); ++rdo) {
360 Identifier rdoID = (*rdo)->identify();
361 int bec = m_pixelID->barrel_ec(rdoID);
362 //
363 if (std::abs(bec) == 4) continue; // Skip DBM
364 //
365 unsigned int pixel_eta = m_pixelID->eta_index(rdoID);
366 unsigned int pixel_phi = m_pixelID->phi_index(rdoID);
367 int layer = m_pixelID->layer_disk(rdoID);
368 int modPhi = m_pixelID->phi_module(rdoID);
369 int modEta = m_pixelID->eta_module(rdoID);
370 const Identifier::size_type maxHash = m_pixelID->wafer_hash_max();
371
372
373
374 int iblFeHash = -99;
375 if (bec==0 && layer==0) { // IBL FE order: {0..3}: 3D C, {4..15}: 2D C, {16..27}: 2D A, {28..31}: 3D A
376 if (modEta <= -7) iblFeHash = modPhi*32 + (modEta+10); // 3D C
377 else if (-6<=modEta && modEta<=5) iblFeHash = modPhi*32 + ((modEta+6)*2+4); // 2D
378 else iblFeHash = modPhi*32 + (modEta+22); // 3D A
379 if (pixel_eta/80) iblFeHash++; // For 2D, C side '_1', or A side '_2' for pixel_eta 80~159
380 }
381
382 int TOT = (*rdo)->getToT(); // it returns a 8 bits "word"
383
384 // Category: All
385 if (bec == 0 && layer == 0 && -6 <= modEta && modEta <= 5) { // IBL 2D
386 int ibl2dHash = maxHash + iblFeHash;
387 m_occupancyMaps[ibl2dHash]->Fill(pixel_eta%80, pixel_phi);
388 m_occupancyLB[ibl2dHash]->Fill(LB);
389 m_TOTdistributions[ibl2dHash]->Fill(TOT);
390 }
391 else { // None IBL 2D
392 m_occupancyMaps[modHash]->Fill(pixel_eta, pixel_phi);
393 m_occupancyLB[modHash]->Fill(LB);
394 m_TOTdistributions[modHash]->Fill(TOT);
395 }
396
397 // Category: LB
398 if (0 <= iblFeHash) { // IBL
399 for (int i=0; i<m_perLB_n; i++) {
400 if ((m_perLB_min+m_perLB_step*i < LB) && (LB <= m_perLB_min+m_perLB_step*(i+1))) { // LB
401 int ibl2dHash = m_nIblFes*i + iblFeHash;
402 m_occupancyMapsIBL2dLB[ibl2dHash]->Fill(pixel_eta%80, pixel_phi);
403 m_TOTdistributionsIBL2dLB[ibl2dHash]->Fill(TOT);
404 }
405 }
406 }
407 }
408 }
409 }
410 m_nEvents++;
411 m_nEventsHist->Fill(0.5);
412 m_nEventsLBHist->Fill(LB);
413
414 m_nEventsLB[LB]++;
416
417 return StatusCode::SUCCESS;
418}
419
420//=========================================================
421//
422// finalize
423//
424//=========================================================
426 ATH_MSG_INFO("Finalizing HitMapBuilder");
427
428 ATH_CHECK(m_tHistSvc->regHist("/histfile/NEvents", std::move(m_nEventsHist)));
429 ATH_CHECK(m_tHistSvc->regHist("/histfile/NEventsLB", std::move(m_nEventsLBHist)));
430
431 //
432 // loop in detector elements
433 //
434 for (InDetDD::SiDetectorElementCollection::const_iterator iter=m_pixman->getDetectorElementBegin(); iter!=m_pixman->getDetectorElementEnd(); ++iter) {
435 const InDetDD::SiDetectorElement* element = *iter;
436 if (element == 0) continue;
437
438 Identifier ident = element->identify();
439 if (!m_pixelID->is_pixel(ident)) continue;
440
441 int bec = m_pixelID->barrel_ec (ident);
442 int layer = m_pixelID->layer_disk(ident);
443 int modPhi = m_pixelID->phi_module(ident);
444 int modEta = m_pixelID->eta_module(ident);
445 int modHash = m_pixelID->wafer_hash(ident);
446 const Identifier::size_type maxHash = m_pixelID->wafer_hash_max();
447
448 if (abs(bec) == 4) continue; // Skip DBM
449
450 int iblFeHash = -99;
451 if (bec==0 && layer==0) { // IBL FE order: {0..3}: 3D C, {4..15}: 2D C, {16..27}: 2D A, {28..31}: 3D A
452 if (modEta <= -7) iblFeHash = modPhi*32 + (modEta+10); // 3D C
453 else if (-6<=modEta && modEta<=5) iblFeHash = modPhi*32 + ((modEta+6)*2+4); // 2D
454 else iblFeHash = modPhi*32 + (modEta+22); // 3D A
455 }
456
457 // Divide by events for Occupancy Map
458 // Category: All
459 if (bec == 0 && layer == 0 && -6 <= modEta && modEta <= 5) { // IBL 2D
460 int ibl2dHash = maxHash + iblFeHash;
461 for (int chipId=0; chipId<2; chipId++) { // 2 Fes in double module
462 //yosuke m_occupancyMaps[ibl2dHash+chipId]->Scale(1.0/(m_nEvents));
463 // Occupancy LB
464 int entries = m_occupancyLB[ibl2dHash+chipId]->GetEntries();
465 for (int lb=0; lb<m_hist_lbMax; lb++) {
466 if (m_nEventsLB[lb] == 0) continue;
467 m_occupancyLB[ibl2dHash+chipId]->SetBinContent(lb+1, m_occupancyLB[ibl2dHash+chipId]->GetBinContent(lb+1)/(m_nEventsLB[lb]*m_fei4bPixels)); // Also divide by fei4 pixels
468 }
469 m_occupancyLB[ibl2dHash+chipId]->SetEntries(entries);
470 m_occupancyLB[ibl2dHash+chipId]->SetBins(m_LBrange_max+100, -0.5, m_LBrange_max+99.5);
471 }
472 }
473 else { // None IBL 2D
474 //yosuke m_occupancyMaps[modHash]->Scale(1.0/(m_nEvents));
475 // Occupancy LB
476 int entries = m_occupancyLB[modHash]->GetEntries();
477 for (int lb=0; lb<m_hist_lbMax; lb++) {
478 if (m_nEventsLB[lb] == 0) continue;
479 if (0 <= iblFeHash) m_occupancyLB[modHash]->SetBinContent(lb+1, m_occupancyLB[modHash]->GetBinContent(lb+1)/(m_nEventsLB[lb]*m_fei4bPixels)); // IBL 3D, divide by fei4 pixels
480 else m_occupancyLB[modHash]->SetBinContent(lb+1, m_occupancyLB[modHash]->GetBinContent(lb+1)/(m_nEventsLB[lb]*m_pixModPixels)); // Pixel module, divide by pixel module pixels
481 }
482 m_occupancyLB[modHash]->SetEntries(entries);
483 m_occupancyLB[modHash]->SetBins(m_LBrange_max+100, -0.5, m_LBrange_max+99.5);
484 }
485
486 std::string onlineID = getDCSIDFromPosition(bec,layer,modPhi,modEta);
487
488 std::ostringstream name;
489 std::string axisTitle;
490
491 // Construct IBL Planar later
492 std::string LBCategory;
493 std::string occ2dDir = "Occupancy2d";
494 std::string occLBDir = "OccupancyLb";
495 std::string totDir = "ToT";
496
497 // Category: All
498 LBCategory = "All";
499 if (bec == 0 && layer == 0 && -6 <= modEta && modEta <= 5) { // IBL 2D
500 for (unsigned chipId=0; chipId<=1; chipId++) { // FE chips in double module
501 int ibl2dHash;
502 if (chipId) {
503 if (modEta <= -1) ibl2dHash = maxHash + iblFeHash; // C side, '_2'
504 else ibl2dHash = maxHash + iblFeHash + chipId; // A side, '_2'
505 }
506 else {
507 if (modEta <= -1) ibl2dHash = maxHash + iblFeHash + 1; // C side, '_1'
508 else ibl2dHash = maxHash + iblFeHash; // A side, '_1'
509 }
510 // Occupancy Map
511 axisTitle = ";pixel_eta;pixel_phi;# hits/pixel/event";
512 name << "/histfile/" << LBCategory << "/" << occ2dDir << "/" << histoSuffix(bec,layer) << "/" << onlineID << "_" << chipId+1;
513 ATH_CHECK(m_tHistSvc->regHist(name.str(), std::move(m_occupancyMaps[ibl2dHash])));
514 name.str(""); name.clear();
515
516 // Occupancy vs. LB
517 axisTitle = ";LB;# hits/pixel/event";
518 name << "/histfile/" << LBCategory << "/" << occLBDir << "/" << histoSuffix(bec,layer) << "/" << onlineID << "_" << chipId+1;
519 ATH_CHECK(m_tHistSvc->regHist(name.str(), std::move(m_occupancyLB[ibl2dHash])));
520 name.str(""); name.clear();
521
522 // ToT
523 axisTitle = ";ToT;# hits";
524 name << "/histfile/" << LBCategory << "/" << totDir << "/" << histoSuffix(bec,layer) << "/" << onlineID << "_" << chipId+1;
525 ATH_CHECK(m_tHistSvc->regHist(name.str(), std::move(m_TOTdistributions[ibl2dHash])));
526 name.str(""); name.clear();
527 }
528 }
529 else { // None IBL 2D
530 // Occupancy Map
531 axisTitle = ";pixel_eta;pixel_phi;# hits/pixel/event";
532 name << "/histfile/" << LBCategory << "/" << occ2dDir << "/" << histoSuffix(bec,layer) << "/" << onlineID;
533 ATH_CHECK(m_tHistSvc->regHist(name.str(), std::move(m_occupancyMaps[modHash])));
534 name.str(""); name.clear();
535
536 // Occupancy vs. LB
537 axisTitle = ";LB;# hits/pixel/event";
538 name << "/histfile/" << LBCategory << "/" << occLBDir << "/" << histoSuffix(bec,layer) << "/" << onlineID;
539 ATH_CHECK(m_tHistSvc->regHist(name.str(), std::move(m_occupancyLB[modHash])));
540 name.str(""); name.clear();
541
542 // ToT
543 axisTitle = ";ToT;# hits";
544 name << "/histfile/" << LBCategory << "/" << totDir << "/" << histoSuffix(bec,layer) << "/" << onlineID;
545 ATH_CHECK(m_tHistSvc->regHist(name.str(), std::move(m_TOTdistributions[modHash])));
546 name.str(""); name.clear();
547 } // End of if ibl 2d
548
549 // Category: LB1-100, 101-200, ...
550 if (0 <= iblFeHash) { // IBL
551 for (int i=0; i<m_perLB_n; i++) {
552 LBCategory = "LB" + std::to_string(m_perLB_min+m_perLB_step*i+1) + "-" + std::to_string(m_perLB_min+m_perLB_step*(i+1));
553 if (-6 <= modEta && modEta <= 5) { // IBL 2D
554 for (int chipId=0; chipId<=1; chipId++) { // FE chips in double module
555 int ibl2dHash;
556 if (chipId) {
557 if (modEta <= -1) ibl2dHash = m_nIblFes*i + iblFeHash; // C side, '_2'
558 else ibl2dHash = m_nIblFes*i + iblFeHash + chipId; // A side, '_2'
559 }
560 else {
561 if (modEta <= -1) ibl2dHash = m_nIblFes*i + iblFeHash + 1; // C side, '_1'
562 else ibl2dHash = m_nIblFes*i + iblFeHash; // A side, '_1'
563 }
564 std::string histTitle = onlineID + "_" + std::to_string(chipId+1);
565 // Occupancy Map
566 axisTitle = ";pixel_eta;pixel_phi;# hits/pixel/event";
567 name << "/histfile/" << LBCategory << "/" << occ2dDir << "/" << histoSuffix(bec,layer) << "/" << histTitle;
568 ATH_CHECK(m_tHistSvc->regHist(name.str(), std::move(m_occupancyMapsIBL2dLB[ibl2dHash])));
569 name.str(""); name.clear();
570
571 // ToT
572 axisTitle = ";ToT;# hits";
573 name << "/histfile/" << LBCategory << "/" << totDir << "/" << histoSuffix(bec,layer) << "/" << histTitle;
574 ATH_CHECK(m_tHistSvc->regHist(name.str(), std::move(m_TOTdistributionsIBL2dLB[ibl2dHash])));
575 name.str(""); name.clear();
576 }
577 }
578 else { // IBL 3D
579 int ibl2dHash = m_nIblFes*i + iblFeHash;
580 // Occupancy Map
581 axisTitle = ";pixel_eta;pixel_phi;# hits/pixel/event";
582 name << "/histfile/" << LBCategory << "/" << occ2dDir << "/" << histoSuffix(bec,layer) << "/" << onlineID;
583 ATH_CHECK(m_tHistSvc->regHist(name.str(), std::move(m_occupancyMapsIBL2dLB[ibl2dHash])));
584 name.str(""); name.clear();
585
586 // ToT
587 axisTitle = ";ToT;# hits";
588 name << "/histfile/" << LBCategory << "/" << totDir << "/" << histoSuffix(bec,layer) << "/" << onlineID;
589 ATH_CHECK(m_tHistSvc->regHist(name.str(), std::move(m_TOTdistributionsIBL2dLB[ibl2dHash])));
590 name.str(""); name.clear();
591 } // End of if ibl 2d
592 } // End of loop of category: LB
593 } // End of if IBL
594 } // end loop in detector elements
595
596 return StatusCode::SUCCESS;
597
598} // end finalize
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
static Double_t ss
static Double_t sc
This is an Identifier helper class for the Pixel subdetector.
#define x
const ServiceHandle< StoreGateSvc > & detStore() const
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
std::vector< std::unique_ptr< TH1F > > m_occupancyLB
const std::string histoSuffix(const int bec, const int layer)
Gaudi::Property< int > m_evt_lbMax
const PixelID * m_pixelID
const int m_pixModPixels
SG::ReadHandleKey< PixelRDO_Container > m_pixelRDOKey
StatusCode registerHistograms()
std::string getDCSIDFromPosition(int bec, int layer, int modPhi, int modEta)
std::vector< std::unique_ptr< TH1F > > m_TOTdistributions
std::vector< std::unique_ptr< TH2F > > m_occupancyMapsIBL2dLB
StatusCode execute()
const int m_perLB_step
std::vector< std::pair< std::string, std::vector< int > > > m_pixelMapping
std::vector< double > m_nEventsLB
StatusCode finalize()
const int m_perLB_n
Gaudi::Property< int > m_evt_lbMin
ServiceHandle< ITHistSvc > m_tHistSvc
StatusCode initialize()
std::unique_ptr< TH1F > m_nEventsLBHist
std::vector< std::unique_ptr< TH1F > > m_TOTdistributionsIBL2dLB
const InDetDD::PixelDetectorManager * m_pixman
const int m_perLB_min
std::vector< std::unique_ptr< TH2F > > m_occupancyMaps
std::unique_ptr< TH1F > m_nEventsHist
const int m_fei4bPixels
std::vector< double > m_nEventsLBCategory
Gaudi::Property< int > m_hist_lbMax
std::vector< std::string > & splitter(const std::string &str, char delim, std::vector< std::string > &elems)
const unsigned int m_nIblFes
This is a "hash" representation of an Identifier.
Class to hold geometrical description of a silicon detector element.
virtual Identifier identify() const override final
identifier of this detector element (inline)
int lb
Definition globals.cxx:23
double entries
Definition listroot.cxx:49