ATLAS Offline Software
Loading...
Searching...
No Matches
EvenPhiCMA.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "GaudiKernel/MsgStream.h"
7
11
12#include <fstream>
13#include <stdexcept>
14
15using namespace RPC_CondCabling;
16
20
21bool EvenPhiCMA::inversion() const { return m_inversion; }
22
24 m_inversion = false;
26
27 // Set the memory for storing the cabling data
28 if (!pivot_station()) {
31 }
32 if (!lowPt_station()) {
35 }
36 if (!highPt_station()) {
39 }
40}
41
51
52EvenPhiCMA::~EvenPhiCMA() = default;
53
55 if (this != &cma) {
57 m_pivot_WORs.clear();
59 m_lowPt_WORs.clear();
61 m_highPt_WORs.clear();
63
64 m_inversion = cma.inversion();
65 }
66 return *this;
67}
68
70 if (pivot_station()) // Check and connect strips with Pivot matrix channels
71 {
72 WORlink::iterator found = m_pivot_WORs.find(pivot_start_ch());
73 WiredOR* wor = (*found).second;
74
77
78 int start = pivot_start_st();
79 int stop = pivot_stop_st();
80 int max_st = wor->give_max_phi_strips();
81
82 int first_ch_cabled = 32;
83 int last_ch_cabled = -1;
84
85 std::vector<int> multiplicity(max_st);
86
87 for (int i = 0; i < m_pivot_rpc_read; ++i) {
88 const RPCchamber* rpc = wor->connected_rpc(i);
89 int rpc_st = rpc->phi_strips();
90 int cham = rpc->number();
91 int local_strip = start - (max_st - rpc_st);
92 int final_strip = stop - (max_st - rpc_st);
93
94 int chs = (id().Ixx_index() == 0) ? pivot_channels - abs(stop - start) - 1 : 0;
95 chs += (local_strip >= 0) ? 0 : abs(local_strip) + 1;
96 if (chs >= pivot_channels) {
97 REPORT_MESSAGE_WITH_CONTEXT(MSG::ERROR, "EvenPhiCMA") << noMoreChannels("Pivot");
98 return false;
99 }
100 if (chs <= first_ch_cabled) first_ch_cabled = chs;
101
102 if (local_strip <= 0) local_strip = 1;
103 do {
104 if (chs == pivot_channels) {
105 REPORT_MESSAGE_WITH_CONTEXT(MSG::ERROR, "EvenPhiCMA") << noMoreChannels("Pivot");
106 return false;
107 }
108 if (local_strip > 0 && local_strip <= rpc_st) {
109 if (rpc->ijk_phiReadout() == 1) {
110 m_pivot[i][0][chs] = cham * 100 + local_strip - 1;
111 m_pivot[i][1][chs] = 10000 + cham * 100 + local_strip - 1;
112 } else {
113 m_pivot[i][1][chs] = cham * 100 + local_strip - 1;
114 m_pivot[i][0][chs] = 10000 + cham * 100 + local_strip - 1;
115 }
116 multiplicity[local_strip - 1 + (max_st - rpc_st)] = 1;
117 }
118 ++chs;
119 } while (++local_strip <= final_strip);
120
121 if (chs - 1 >= last_ch_cabled) last_ch_cabled = chs - 1;
122 if (chs > m_active_pivot_chs) m_active_pivot_chs = chs;
123 }
124 wor->add_even_read_mul(multiplicity);
125
126 // Set first and last connectors code
127 int code = pivot_station() * 100000 + 1 * 100000000;
128 int ch = 0;
129
130 // first_ch_cabled and last_ch_cabled are initialized with "out-of-bound" values
131 // of the m_pivot array; proper values should be assigned during the loop;
132 // the init values though are "misused" for certain conditions, too, therefore
133 // they cannot be changed; but the following if should NEVER fire.
134 if (first_ch_cabled >= pivot_channels || last_ch_cabled < 0) {
135 std::ostringstream disp;
136 disp << "EvenPhiCMA::cable_CMA_channels - out of bound array indices (m_pivot)! Values:"
137 << first_ch_cabled << ", " << last_ch_cabled
138 << " at " << __FILE__ << ":" << __LINE__ ;
139 throw std::runtime_error(disp.str());
140 }
141
142 for (ch = 0; ch < m_pivot_rpc_read; ++ch)
143 if (m_pivot[ch][0][first_ch_cabled] >= 0) break;
144 if (ch == m_pivot_rpc_read) --ch;
145 m_first_pivot_code = code + m_pivot[ch][0][first_ch_cabled];
146
147 for (ch = 0; ch < m_pivot_rpc_read; ++ch)
148 if (m_pivot[ch][0][last_ch_cabled] >= 0) break;
149 if (ch == m_pivot_rpc_read) --ch;
150 m_last_pivot_code = code + m_pivot[ch][0][last_ch_cabled];
151 }
152
153 if (lowPt_station() && lowPt_start_ch() != -1) { // Check and connect strips with Low Pt matrix channels
154 for (int i = lowPt_start_ch(); i <= lowPt_stop_ch(); ++i) {
155 WORlink::iterator found = m_lowPt_WORs.find(i);
156 m_lowPt_rpc_read += (*found).second->RPCacquired();
157 }
158
160
161 int start = lowPt_start_st();
162 int stop = lowPt_stop_st();
163 int max_st = get_max_strip_readout(lowPt_station());
164
165 int first_ch_cabled = 64;
166 int last_ch_cabled = -1;
167
168 int r = 0;
169
170 for (int w = lowPt_start_ch(); w <= lowPt_stop_ch(); ++w) {
171 WORlink::iterator found = m_lowPt_WORs.find(w);
172 WiredOR* wor = (*found).second;
173 std::vector<int> multiplicity(wor->give_max_phi_strips(),0);
174
175 for (int i = 0; i < wor->RPCacquired(); ++i) {
176 const RPCchamber* rpc = wor->connected_rpc(i);
177
178 int rpc_st = rpc->phi_strips();
179 int cham = rpc->number();
180 int local_strip = start - (max_st - rpc_st);
181 int final_strip = stop - (max_st - rpc_st);
182
183 int chs = (id().Ixx_index() == 0) ? 40 - max_st / 2 : 0;
184
185 bool isBME = false;
186 char E = rpc->chamber_name()[2];
187 // E='A';
188 if (E == 'E') isBME = true;
189
190 if (isBME && id().Ixx_index() == 1) {
191 // ok for sector 24 (side C [and side A], cm1, ijk=2 and 3)
192 chs = 8;
193 local_strip = 1;
194 final_strip = 32;
195 }
196 if (isBME && id().Ixx_index() == 0) {
197 // ok for sector 24 (side C [and side A], cm0, ijk=2 and 3)
198 chs = 24;
199 local_strip = 1;
200 final_strip = 32;
201 }
202
203 chs += (local_strip >= 0) ? 0 : abs(local_strip) + 1;
204
205 if (chs >= confirm_channels) {
206 REPORT_MESSAGE_WITH_CONTEXT(MSG::ERROR, "EvenPhiCMA") << noMoreChannels("Low Pt");
207 return false;
208 }
209 if (chs <= first_ch_cabled) first_ch_cabled = chs;
210
211 if (local_strip <= 0) local_strip = 1;
212 do {
213 if (chs == confirm_channels) {
214 REPORT_MESSAGE_WITH_CONTEXT(MSG::ERROR, "EvenPhiCMA") << noMoreChannels("Low Pt");
215 return false;
216 }
217 if (local_strip > 0 && local_strip <= rpc_st) {
218 if (rpc->ijk_phiReadout() == 1) {
219 m_lowPt[r][0][chs] = cham * 100 + local_strip - 1;
220 m_lowPt[r][1][chs] = 10000 + cham * 100 + local_strip - 1;
221 } else {
222 m_lowPt[r][1][chs] = cham * 100 + local_strip - 1;
223 m_lowPt[r][0][chs] = 10000 + cham * 100 + local_strip - 1;
224 }
225 if (max_st > wor->give_max_phi_strips()) {
226 multiplicity[local_strip - 1] = 1;
227 } else {
228 multiplicity[local_strip - 1 + (max_st - rpc_st)] = 1;
229 }
230 }
231 ++chs;
232 } while (++local_strip <= final_strip);
233
234 ++r;
235 if (chs - 1 >= last_ch_cabled) last_ch_cabled = chs - 1;
236 if (chs > m_active_lowPt_chs) m_active_lowPt_chs = chs;
237 }
238
239 wor->add_even_read_mul(multiplicity);
240
241 // Set first and last connectors code
242 int code = lowPt_station() * 100000 + 1 * 100000000;
243 int ch = 0;
244
245 // first_ch_cabled and last_ch_cabled are initialized with "out-of-bound" values
246 // of the m_lowPt array; proper values should be assigned during the loop;
247 // the init values though are "misused" for certain conditions, too, therefore
248 // they cannot be changed; but the following if should NEVER fire.
249 if (first_ch_cabled >= confirm_channels || last_ch_cabled < 0) {
250 std::ostringstream disp;
251 disp << "EvenPhiCMA::cable_CMA_channels - out of bound array indices (m_lowPt)! Values:"
252 << first_ch_cabled << ", " << last_ch_cabled
253 << " at " << __FILE__ << ":" << __LINE__ ;
254 throw std::runtime_error(disp.str());
255 }
256
257 for (ch = 0; ch < m_lowPt_rpc_read; ++ch)
258 if (m_lowPt[ch][0][first_ch_cabled] >= 0) break;
259 if (ch == m_lowPt_rpc_read) --ch;
260 m_first_lowPt_code = code + m_lowPt[ch][0][first_ch_cabled];
261
262 for (ch = 0; ch < m_lowPt_rpc_read; ++ch)
263 if (m_lowPt[ch][0][last_ch_cabled] >= 0) break;
264 if (ch == m_lowPt_rpc_read) --ch;
265 m_last_lowPt_code = code + m_lowPt[ch][0][last_ch_cabled];
266 }
267 }
268
269 if (highPt_station() && highPt_start_ch() != -1) { // Check and connect strips with High Pt matrix channels
270 for (int i = highPt_start_ch(); i <= highPt_stop_ch(); ++i) {
271 WORlink::iterator found = m_highPt_WORs.find(i);
272 m_highPt_rpc_read += (*found).second->RPCacquired();
273 }
274
276
277 int start = highPt_start_st();
278 int stop = highPt_stop_st();
280
281 int first_ch_cabled = 64;
282 int last_ch_cabled = -1;
283
284 int r = 0;
285
286 for (int w = highPt_start_ch(); w <= highPt_stop_ch(); ++w) {
287 WORlink::iterator found = m_highPt_WORs.find(w);
288 WiredOR* wor = (*found).second;
289 std::vector<int> multiplicity(wor->give_max_phi_strips(),0);
290
291
292 for (int i = 0; i < wor->RPCacquired(); ++i) {
293 const RPCchamber* rpc = wor->connected_rpc(i);
294
295 int rpc_st = rpc->phi_strips();
296 int cham = rpc->number();
297 int local_strip = start - (max_st - rpc_st);
298 int final_strip = stop - (max_st - rpc_st);
299
300 int chs = (id().Ixx_index() == 0) ? 40 - max_st / 2 : 0;
301
302 char L = rpc->chamber_name()[2];
303 int sEta = rpc->stationEta();
304
305 bool isBOE = false;
306 if (abs(sEta) == 8 && L == 'L') isBOE = true;
307 if (isBOE && id().Ixx_index() == 1) {
308 chs = 0;
309 local_strip = 13;
310 final_strip = 64;
311 }
312
313 if (isBOE && id().Ixx_index() == 0) {
314 chs = 4;
315 final_strip = 52;
316 local_strip = 1;
317 }
318
319 chs += (local_strip >= 0) ? 0 : abs(local_strip) + 1;
320 if (chs >= confirm_channels) {
321 REPORT_MESSAGE_WITH_CONTEXT(MSG::ERROR, "EvenPhiCMA") << noMoreChannels("High Pt");
322 return false;
323 }
324 if (chs <= first_ch_cabled) first_ch_cabled = chs;
325
326 if (local_strip <= 0) local_strip = 1;
327 do {
328 if (chs == confirm_channels) {
329 REPORT_MESSAGE_WITH_CONTEXT(MSG::ERROR, "EvenPhiCMA") << noMoreChannels("High Pt");
330 return false;
331 }
332 bool skipChannel = false;
333 if (isBOE && id().Ixx_index() == 1 && ((chs > 3 && chs < 8) || (chs > 39 && chs < 44))) skipChannel = true;
334 if (isBOE && id().Ixx_index() == 0 && ((chs > 19 && chs < 24) || (chs > 55 && chs < 60))) skipChannel = true;
335 if (skipChannel) {
336 --local_strip;
337 } else {
338 if (local_strip > 0 && local_strip <= rpc_st) {
339 if (rpc->ijk_phiReadout() == 1) {
340 m_highPt[r][0][chs] = cham * 100 + local_strip - 1;
341 m_highPt[r][1][chs] = 10000 + cham * 100 + local_strip - 1;
342 } else {
343 m_highPt[r][1][chs] = cham * 100 + local_strip - 1;
344 m_highPt[r][0][chs] = 10000 + cham * 100 + local_strip - 1;
345 }
346 }
347 if (max_st > wor->give_max_phi_strips()) {
348 multiplicity[local_strip - 1] = 1;
349 } else {
350 multiplicity[local_strip - 1 + (max_st - rpc_st)] = 1;
351 }
352 }
353 ++chs;
354 } while (++local_strip <= final_strip);
355
356 ++r;
357 if (chs - 1 >= last_ch_cabled) last_ch_cabled = chs - 1;
359 }
360
361 wor->add_even_read_mul(multiplicity);
362
363 // Set first and last connectors code
364 int code = highPt_station() * 100000 + 1 * 100000000;
365 int ch = 0;
366
367 // first_ch_cabled and last_ch_cabled are initialized with "out-of-bound" values
368 // of the m_highPt array; proper values should be assigned during the loop;
369 // the init values though are "misused" for certain conditions, too, therefore
370 // they cannot be changed; but the following if should NEVER fire.
371 if (first_ch_cabled >= confirm_channels || last_ch_cabled < 0) {
372 std::ostringstream disp;
373 disp << "EvenPhiCMA::cable_CMA_channels - out of bound array indices (m_highPt)! Values:"
374 << first_ch_cabled << ", " << last_ch_cabled
375 << " at " << __FILE__ << ":" << __LINE__ ;
376 throw std::runtime_error(disp.str());
377 }
378
379 for (ch = 0; ch < m_highPt_rpc_read; ++ch)
380 if (m_highPt[ch][0][first_ch_cabled] >= 0) break;
381 if (ch == m_highPt_rpc_read) --ch;
382 m_first_highPt_code = code + m_highPt[ch][0][first_ch_cabled];
383
384 for (ch = 0; ch < m_highPt_rpc_read; ++ch)
385 if (m_highPt[ch][0][last_ch_cabled] >= 0) break;
386 if (ch == m_highPt_rpc_read) --ch;
387 m_last_highPt_code = code + m_highPt[ch][0][last_ch_cabled];
388 }
389 }
390
391 return true;
392}
393
395 if (pivot_station()) // Check and connect Pivot plane chambers
396 {
397 for (int i = pivot_start_ch(); i <= pivot_stop_ch(); ++i) {
398 WiredOR* wor = setup.find_wor(pivot_station(), i);
399 if (wor) {
400 wor->add_cma(this);
401 m_pivot_WORs.insert(WORlink::value_type(i, wor));
402 } else {
403 REPORT_MESSAGE_WITH_CONTEXT(MSG::ERROR, "EvenPhiCMA") << no_connection_error("WOR", i);
404 return false;
405 }
406 }
407 }
408 if (lowPt_station()) // Check and connect Low Pt plane chambers
409 {
410 std::list<const EtaCMA*> CMAs = setup.find_eta_CMAs_in_PAD(id().PAD_index());
411 if (CMAs.empty()) {
412 REPORT_MESSAGE_WITH_CONTEXT(MSG::ERROR, "EvenPhiCMA") << "have no Eta matrix into PAD!";
413 return false;
414 }
415
416 // get last CMA fake
417 const EtaCMA* cmaFake = CMAs.back();
418
419 // remove fake CMAs
420 std::list<const EtaCMA*>::iterator cm = CMAs.begin();
421 while (cm != CMAs.end()) {
422 if (!(*cm)->pivot_station() || (*cm)->lowPt_start_ch() == -1) cm = CMAs.erase(cm);
423 ++cm;
424 }
425
426 int start_ch = (CMAs.size()) ? CMAs.front()->lowPt_start_ch() : cmaFake->lowPt_start_ch();
427 int stop_ch = (CMAs.size()) ? CMAs.back()->lowPt_stop_ch() : cmaFake->lowPt_stop_ch();
428
429 if (start_ch != -1 && stop_ch != -1) {
430 RPCchamber* start = setup.find_chamber(lowPt_station(), start_ch);
431 RPCchamber* stop = setup.find_chamber(lowPt_station(), stop_ch);
432
433 if (start->readoutWORs().empty()) {
434 REPORT_MESSAGE_WITH_CONTEXT(MSG::ERROR, "EvenPhiCMA") << no_wor_readout(start->number(), lowPt_station());
435 return false;
436 }
437 if (stop->readoutWORs().empty()) {
438 REPORT_MESSAGE_WITH_CONTEXT(MSG::ERROR, "EvenPhiCMA") << no_wor_readout(stop->number(), lowPt_station());
439 return false;
440 }
441
442 m_lowPt_start_ch = start->readoutWORs().front()->number();
443 m_lowPt_stop_ch = stop->readoutWORs().front()->number();
444 int max = 0;
445
446 for (int i = lowPt_start_ch(); i <= lowPt_stop_ch(); ++i) {
447 WiredOR* wor = setup.find_wor(lowPt_station(), i);
448 if (wor) {
449 wor->add_cma(this);
450 m_lowPt_WORs.insert(WORlink::value_type(i, wor));
451 if (wor->give_max_phi_strips() > max) max = wor->give_max_phi_strips();
452 } else {
453 REPORT_MESSAGE_WITH_CONTEXT(MSG::ERROR, "EvenPhiCMA") << no_connection_error("WOR", i);
454 return false;
455 }
456 }
457
459 }
460 }
461 if (highPt_station()) // Check and connect High Pt plane chambers
462 {
463 std::list<const EtaCMA*> CMAs = setup.find_eta_CMAs_in_PAD(id().PAD_index());
464 if (CMAs.empty()) {
465 REPORT_MESSAGE_WITH_CONTEXT(MSG::ERROR, "EvenPhiCMA") << "have no Eta matrix into PAD!";
466 return false;
467 }
468
469 // get last CMA fake
470 const EtaCMA* cmaFake = CMAs.back();
471
472 // remove fake CMAs
473 std::list<const EtaCMA*>::iterator cm = CMAs.begin();
474 while (cm != CMAs.end()) {
475 if (!(*cm)->pivot_station() || (*cm)->highPt_start_ch() == -1) cm = CMAs.erase(cm);
476 ++cm;
477 }
478
479 int start_ch = (CMAs.size()) ? CMAs.front()->highPt_start_ch() : cmaFake->highPt_start_ch();
480 int stop_ch = (CMAs.size()) ? CMAs.back()->highPt_stop_ch() : cmaFake->highPt_stop_ch();
481
482 if (start_ch != -1 && stop_ch != -1) {
483 RPCchamber* start = setup.find_chamber(highPt_station(), start_ch);
484 RPCchamber* stop = setup.find_chamber(highPt_station(), stop_ch);
485
486 if (start->readoutWORs().empty()) {
487 REPORT_MESSAGE_WITH_CONTEXT(MSG::ERROR, "EvenPhiCMA") << no_wor_readout(start->number(), highPt_station());
488 return false;
489 }
490 if (stop->readoutWORs().empty()) {
491 REPORT_MESSAGE_WITH_CONTEXT(MSG::ERROR, "EvenPhiCMA") << no_wor_readout(stop->number(), highPt_station());
492 return false;
493 }
494
495 m_highPt_start_ch = start->readoutWORs().front()->number();
496 m_highPt_stop_ch = stop->readoutWORs().front()->number();
497 int max = 0;
498
499 for (int i = highPt_start_ch(); i <= highPt_stop_ch(); ++i) {
500 WiredOR* wor = setup.find_wor(highPt_station(), i);
501 if (wor) {
502 wor->add_cma(this);
503 m_highPt_WORs.insert(WORlink::value_type(i, wor));
504 if (wor->give_max_phi_strips() > max) max = wor->give_max_phi_strips();
505 } else {
506 REPORT_MESSAGE_WITH_CONTEXT(MSG::ERROR, "EvenPhiCMA") << no_connection_error("WOR", i);
507 return false;
508 }
509 }
511 }
512 }
513 return true;
514}
515
517 if (stat == lowPt_station()) {
518 if (id().Ixx_index() == 0) {
520 m_lowPt_stop_st = confirm_channels - (40 - max / 2);
522 } else if (id().Ixx_index() == 1) {
524 m_lowPt_start_st = max - confirm_channels + 1 + (40 - max / 2);
526 }
527
528 } else if (stat == highPt_station()) {
529 if (id().Ixx_index() == 0) {
533 } else if (id().Ixx_index() == 1) {
535 m_highPt_start_st = max - confirm_channels + 1 + (40 - max / 2);
537 }
538 }
539}
540
542 int max = 0;
543 if (stat == pivot_station()) {
544 EvenPhiCMA::WORlink::const_iterator it = m_pivot_WORs.begin();
545 while (it != m_pivot_WORs.end()) {
546 max = (max > (*it).second->give_max_phi_strips()) ? max : (*it).second->give_max_phi_strips();
547 ++it;
548 }
549 } else if (stat == lowPt_station()) {
550 EvenPhiCMA::WORlink::const_iterator it = m_lowPt_WORs.begin();
551 while (it != m_lowPt_WORs.end()) {
552 max = (max > (*it).second->give_max_phi_strips()) ? max : (*it).second->give_max_phi_strips();
553 ++it;
554 }
555 } else if (stat == highPt_station()) {
556 EvenPhiCMA::WORlink::const_iterator it = m_highPt_WORs.begin();
557 while (it != m_highPt_WORs.end()) {
558 max = (max > (*it).second->give_max_phi_strips()) ? max : (*it).second->give_max_phi_strips();
559 ++it;
560 }
561 }
562 return max;
563}
564
566 EvenPhiCMA* prev = setup.previousCMA(*this);
567 if (prev && pivot_station()) {
568 if (pivot_start_ch() == prev->pivot_stop_ch()) {
569 if (!(pivot_start_st() == prev->pivot_stop_st() + 1)) {
570 REPORT_MESSAGE_WITH_CONTEXT(MSG::ERROR, "EvenPhiCMA") << two_obj_error_message("strips mismatch", prev);
571 return false;
572 }
573
574 } else if (!(pivot_start_ch() == prev->pivot_stop_ch() + 1)) {
575 REPORT_MESSAGE_WITH_CONTEXT(MSG::ERROR, "EvenPhiCMA") << two_obj_error_message("chambers mismatch", prev);
576 return false;
577 } else {
578 }
579 } else {
580 }
581
582 if (!connect(setup)) return false;
583 if (!cable_CMA_channels()) return false;
584
585 // invert the strip cabling if needed
586 // if( !doInversion(setup) ) return false;
587
588 // olny 1 repository allowed so far
589 std::string LVL1_configuration_repository;
590 LVL1_configuration_repository = "ATLAS.data";
591
592 // Read the program file if exist
593 SectorLogicSetup::SECTORlist sectors = setup.sectors();
594 SectorLogicSetup::SECTORlist::const_iterator it = sectors.begin();
595
596 char s_tag[4];
597 sprintf(s_tag, "s%02d", *it);
598
599 char t_tag[3];
600 sprintf(t_tag, "t%1d", id().PAD_index());
601
602 char c_tag[4] = {'_', 'c', '0', '\0'};
603 if (id().phi_index() == 1) c_tag[2] = '1';
604
605 std::ifstream CMAprogLow;
606 std::istringstream CMAprogLow_COOL;
607 char name[200];
608 for (int i = 0; i < 200; ++i) name[i] = '\0';
609
610 // LB retrieve pointer to the map of the trigger roads
611 const std::map<std::string, std::string>* p_trigroads = setup.GetPtoTrigRoads();
612
613 // Read trigger configurations from files
614 if (p_trigroads == nullptr) {
615 while (!CMAprogLow.is_open() && it != sectors.end()) {
616 std::ostringstream namestr;
617 for (int i = 0; i < 200; ++i) name[i] = '\0';
618
619 if ((*it) % 2 == 0) // load only the Phi program of the Even sectors
620 {
621 std::string dir;
622 dir = setup.online_database();
623 namestr << dir << "/" << s_tag << "_" << t_tag << "_pl" << c_tag << ".txt" << std::ends; // M.C. search for local files
624
625 namestr.str().copy(name, namestr.str().length(), 0);
626 name[namestr.str().length()] = 0;
627
628 CMAprogLow.open(name);
629 if (!CMAprogLow.is_open()) CMAprogLow.clear();
630 namestr.clear();
631 }
632 ++it;
633 }
634 }
635 // Trigger configuration loaded from COOL
636 else {
637 while (CMAprogLow_COOL.str().empty() && it != sectors.end()) {
638 std::ostringstream namestr;
639 for (int i = 0; i < 200; ++i) name[i] = '\0';
640
641 if ((*it) % 2 == 0) // load only the Phi program of the Even sectors
642 {
643 namestr << s_tag << "_" << t_tag << "_pl" << c_tag << ".txt" << std::ends;
644 namestr.str().copy(name, namestr.str().length(), 0);
645 name[namestr.str().length()] = 0;
646 std::map<std::string, std::string>::const_iterator itc;
647 itc = p_trigroads->find(name);
648 if (itc != p_trigroads->end()) {
649 if (log.level() <= MSG::VERBOSE) {
650 log << MSG::VERBOSE << "EvenPhiCMA low: key " << name << "found in the Trigger Road Map --> OK"
651 << ", EvenPhiCMA low: key " << itc->second.c_str() << endmsg;
652 }
653 CMAprogLow_COOL.str(itc->second.c_str());
654 if (log.level() <= MSG::VERBOSE) {
655 log << MSG::VERBOSE << "LBTAG-CMAPROGLOWO " << CMAprogLow_COOL.str() << endmsg;
656 }
657 }
658 }
659 ++it;
660 namestr.clear();
661 }
662 }
663 if (CMAprogLow.is_open()) {
664 std::unique_ptr<CMAprogram> program = std::make_unique<CMAprogram>(CMAprogLow, true);
665 if (program->check()) {
666 m_lowPt_program = std::move(program);
667 if (setup.cosmic()) {
668 m_lowPt_program->open_threshold(0);
669 m_lowPt_program->open_threshold(1);
670 }
671 for (unsigned int i = 0; i < 3; ++i) {
672 if (!m_lowPt_program->hasProgrammed(i)) {
673 if (log.level() <= MSG::DEBUG) {
674 log << MSG::DEBUG << s_tag << ": " << id() << ": low-pt: has threshold " << i
675 << " not programmed." << endmsg;
676 }
677 }
678 }
679 }
680 CMAprogLow.close();
681 } else if (!CMAprogLow_COOL.str().empty()) {
682 std::unique_ptr<CMAprogram> program = std::make_unique<CMAprogram>(CMAprogLow_COOL, true);
683 if (program->check()) {
684 m_lowPt_program = std::move(program);
685 if (setup.cosmic()) {
686 m_lowPt_program->open_threshold(0);
687 m_lowPt_program->open_threshold(1);
688 }
689 for (unsigned int i = 0; i < 3; ++i) {
690 if (!m_lowPt_program->hasProgrammed(i)) {
691 if (log.level() <= MSG::DEBUG) {
692 log << MSG::DEBUG << s_tag << ": " << id() << ": low-pt: has threshold " << i
693 << " not programmed." << endmsg;
694 }
695 }
696 }
697 }
698 CMAprogLow_COOL.str("");
699 } else if (name[0] != '\0') {
700 if (log.level() <= MSG::DEBUG) {
701 log << MSG::DEBUG << name << " not found! Putting a dummy configuration" << endmsg;
702 }
703 m_lowPt_program = std::make_unique<CMAprogram>();
704 m_lowPt_program->open_threshold(0);
705 }
706
707 std::ifstream CMAprogHigh;
708 std::istringstream CMAprogHigh_COOL;
709
710 it = sectors.begin();
711
712 if (p_trigroads == nullptr) {
713 while (!CMAprogHigh.is_open() && it != sectors.end()) {
714 std::ostringstream namestr;
715 for (int i = 0; i < 200; ++i) name[i] = '\0';
716
717 if ((*it) % 2 == 0) // load only the Phi program of the Even sectors
718 {
719 std::string dir;
720 dir = setup.online_database();
721 namestr << dir << "/" << s_tag << "_" << t_tag << "_ph" << c_tag << ".txt" << std::ends;
722
723 namestr.str().copy(name, namestr.str().length(), 0);
724 name[namestr.str().length()] = 0;
725
726 CMAprogHigh.open(name);
727 if (!CMAprogHigh.is_open()) CMAprogHigh.clear();
728 namestr.clear();
729 }
730 ++it;
731 }
732 }
733 // Trigger configuration loaded from COOL
734 else {
735 it = sectors.begin();
736 while (CMAprogHigh_COOL.str().empty() && it != sectors.end()) {
737 std::ostringstream namestr;
738 for (int i = 0; i < 200; ++i) name[i] = '\0';
739
740 if ((*it) % 2 == 0) // load only the Phi program of the Even sectors
741 {
742 namestr << s_tag << "_" << t_tag << "_ph" << c_tag << ".txt" << std::ends;
743 namestr.str().copy(name, namestr.str().length(), 0);
744 name[namestr.str().length()] = 0;
745 std::map<std::string, std::string>::const_iterator itc;
746 itc = p_trigroads->find(name);
747 if (itc != p_trigroads->end()) {
748 if (log.level() <= MSG::VERBOSE) {
749 log << MSG::VERBOSE << "EvenPhiCMA high: key " << name << "found in the Trigger Road Map --> OK"
750 << ", EvenPhiCMA high: key " << itc->second.c_str() << endmsg;
751 }
752 CMAprogHigh_COOL.str(itc->second.c_str());
753 if (log.level() <= MSG::DEBUG) {
754 log << MSG::DEBUG << "CMAPROGHIGH " << CMAprogHigh_COOL.str() << endmsg;
755 }
756 }
757 }
758 ++it;
759 namestr.clear();
760 }
761 }
762
763 if (CMAprogHigh.is_open()) {
764 std::unique_ptr<CMAprogram> program = std::make_unique<CMAprogram>(CMAprogHigh, true);
765 if (program->check()) {
766 m_highPt_program = std::move(program);
767 if (setup.cosmic()) {
768 m_highPt_program->open_threshold(0);
769 m_highPt_program->open_threshold(1);
770 }
771 for (unsigned int i = 0; i < 3; ++i) {
772 if (!m_highPt_program->hasProgrammed(i)) {
773 if (log.level() <= MSG::DEBUG) {
774 log << MSG::DEBUG << s_tag << ": " << id() << ": high-pt: has threshold " << i
775 << " not programmed." << endmsg;
776 }
777 }
778 }
779 }
780 CMAprogHigh.close();
781 } else if (!CMAprogHigh_COOL.str().empty()) {
782 std::unique_ptr<CMAprogram> program = std::make_unique<CMAprogram>(CMAprogHigh_COOL, true);
783 if (program->check()) {
784 m_highPt_program = std::move(program);
785 if (setup.cosmic()) {
786 m_highPt_program->open_threshold(0);
787 m_highPt_program->open_threshold(1);
788 }
789 for (unsigned int i = 0; i < 3; ++i) {
790 if (!m_highPt_program->hasProgrammed(i)) {
791 if (log.level() <= MSG::DEBUG) {
792 log << MSG::DEBUG << s_tag << ": " << id() << ": high-pt: has threshold " << i
793 << " not programmed." << endmsg;
794 }
795 }
796 }
797 }
798 CMAprogHigh_COOL.str("");
799 } else if (name[0] != '\0') {
800 if (log.level() <= MSG::DEBUG) {
801 log << MSG::DEBUG << name << " not found! Putting a dummy configuration" << endmsg;
802 }
803 m_highPt_program = std::make_unique<CMAprogram>();
804 m_highPt_program->open_threshold(0);
805 }
806
807 return true;
808}
809
811 SectorLogicSetup::SECTORlist Sectors = setup.sectors();
812 SectorLogicSetup::SECTORlist::const_iterator it = Sectors.begin();
813 int sector = *it;
814
815 WORlink::const_iterator wor;
816 if (lowPt_station() && lowPt_number_co() != -1) {
817 wor = m_lowPt_WORs.begin();
818 WiredOR::RPClink Linked = (*wor).second->RPCread();
819 WiredOR::RPClink::const_iterator link = Linked.begin();
820 if ((*link).second->inversion(sector)) { m_inversion = true; }
821 }
822
823 if (pivot_station()) {
824 wor = m_pivot_WORs.begin();
825 WiredOR::RPClink Linked = (*wor).second->RPCread();
826 WiredOR::RPClink::const_iterator link = Linked.begin();
827 if ((*link).second->inversion(sector)) { m_inversion = true; }
828 }
829
830 if (highPt_station() && highPt_number_co() != -1) {
831 wor = m_highPt_WORs.begin();
832 WiredOR::RPClink Linked = (*wor).second->RPCread();
833 WiredOR::RPClink::const_iterator link = Linked.begin();
834 if ((*link).second->inversion(sector)) { m_inversion = true; }
835 }
836
837 if (m_inversion) m_id->inversion();
838
839 return true;
840}
#define endmsg
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.
#define max(a, b)
Definition cfImp.cxx:41
const std::string & name() const
Definition BaseObject.h:23
int Ixx_index() const
int highPt_number_co() const
std::string no_wor_readout(int, int)
int pivot_stop_st() const
int pivot_stop_ch() const
int highPt_stop_st() const
CMAconfiguration m_conf_type
int pivot_station() const
static constexpr int confirm_channels
int(* m_lowPt)[2][confirm_channels]
int(* m_pivot)[2][pivot_channels]
CMAparameters & operator=(const CMAparameters &)
int pivot_start_st() const
int highPt_start_st() const
unsigned int m_last_pivot_code
unsigned int m_last_lowPt_code
int lowPt_stop_st() const
const CMAidentity & id() const
int lowPt_start_st() const
int lowPt_number_co() const
unsigned int m_first_pivot_code
std::string two_obj_error_message(const std::string &, CMAparameters *)
int lowPt_stop_ch() const
int highPt_station() const
std::string noMoreChannels(const std::string &stat)
int lowPt_station() const
void create_highPt_map(int)
unsigned int m_first_highPt_code
std::unique_ptr< CMAprogram > m_lowPt_program
std::unique_ptr< CMAidentity > m_id
int highPt_stop_ch() const
int highPt_start_ch() const
unsigned int m_last_highPt_code
int lowPt_start_ch() const
void create_pivot_map(int)
void create_lowPt_map(int)
std::unique_ptr< CMAprogram > m_highPt_program
unsigned int m_first_lowPt_code
CMAparameters(const parseParams &parse)
int(* m_highPt)[2][confirm_channels]
int pivot_start_ch() const
static constexpr int pivot_channels
std::string no_connection_error(const std::string &, int) const
int number() const
bool setup(SectorLogicSetup &, MsgStream &)
bool connect(SectorLogicSetup &)
void get_confirm_strip_boundaries(int, int)
const WORlink & pivot_WORs() const
const WORlink & lowPt_WORs() const
const WORlink & highPt_WORs() const
bool doInversion(SectorLogicSetup &)
std::map< int, WiredOR *, std::less< int > > WORlink
Definition EvenPhiCMA.h:22
EvenPhiCMA(const parseParams &parse)
EvenPhiCMA & operator=(const EvenPhiCMA &)
const std::string & chamber_name() const
void add_even_read_mul(ReadoutCh &)
Definition WiredOR.cxx:60
std::map< int, const RPCchamber *, std::less< int > > RPClink
Definition WiredOR.h:28
int RPCacquired() const
Definition WiredOR.h:89
const RPCchamber * connected_rpc(int) const
Definition WiredOR.cxx:48
void add_cma(const CMAparameters *)
Definition WiredOR.cxx:58
int give_max_phi_strips() const
Definition WiredOR.cxx:34
int r
Definition globals.cxx:22