ATLAS Offline Software
Loading...
Searching...
No Matches
NswDcsDbAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
6
9#include <string>
10#include <regex>
11#include "nlohmann/json.hpp"
13#include "GeoModelKernel/throwExcept.h"
14
15// Initialize
16StatusCode
18
19 // retrievals
20 ATH_MSG_DEBUG( "initializing " << name() );
21 ATH_CHECK(m_condSvc .retrieve());
22 ATH_CHECK(m_idHelperSvc.retrieve());
23
24 // initialize read keys
25 ATH_CHECK(m_readKey_mmg_hv.initialize(!m_readKey_mmg_hv.empty() && m_idHelperSvc->hasMM() ));
26 ATH_CHECK(m_readKey_stg_hv.initialize(!m_readKey_stg_hv.empty() && m_idHelperSvc->hasSTGC() ));
27 ATH_CHECK(m_readKey_mmg_tdaq.initialize(!m_readKey_mmg_tdaq.empty() && m_loadTdaq && m_idHelperSvc->hasMM() ));
28 ATH_CHECK(m_readKey_stg_tdaq.initialize(!m_readKey_stg_tdaq.empty() && m_loadTdaq && m_idHelperSvc->hasSTGC() ));
29 ATH_CHECK(m_readKey_mmg_eltx.initialize(!m_readKey_mmg_eltx.empty() && m_loadEltx && m_idHelperSvc->hasMM() ));
30 ATH_CHECK(m_readKey_stg_eltx.initialize(!m_readKey_stg_eltx.empty() && m_loadEltx && m_idHelperSvc->hasSTGC() ));
31
32 // write key for time/charge data
33 ATH_CHECK(m_writeKey.initialize());
34
35 CHECK(m_muonManagerKey.initialize());
36
37 ATH_MSG_INFO("NswDcsAlg is using tdaq "<< m_loadTdaq << " and eltx " << m_loadEltx);
38
39 return StatusCode::SUCCESS;
40}
41
42// execute
43StatusCode
44NswDcsDbAlg::execute(const EventContext& ctx) const {
45
46 ATH_MSG_DEBUG( "execute " << name() );
47
48 // set up write handles
50 if (wrHdl.isValid()) {
51 ATH_MSG_DEBUG("CondHandle " << wrHdl.fullKey() << " is already valid."
52 << " In theory this should not be called, but may happen"
53 << " if multiple concurrent events are being processed out of order.");
54 return StatusCode::SUCCESS;
55 }
57 ATH_MSG_DEBUG("Range of time/charge output is " << wrHdl.getRange());
58
60 if (!detMgr.isValid()) {
62 "Failed to retrieve the detector manager from the conditions store "
63 << m_muonManagerKey.fullKey());
64 return StatusCode::FAILURE;
65 }
66 wrHdl.addDependency(detMgr);
67 std::unique_ptr<NswDcsDbData> wrCdo{std::make_unique<NswDcsDbData>(m_idHelperSvc.get(), detMgr.cptr())};
68
69 // load HV data
70 if(!m_readKey_mmg_hv.empty()){
71 ATH_CHECK(loadHvData(ctx, m_readKey_mmg_hv, DcsTechType::MMG, wrHdl, wrCdo.get()));
72 ATH_CHECK(loadHvData(ctx, m_readKey_mmg_hv, DcsTechType::MMD, wrHdl, wrCdo.get()));
73 }
74 if(!m_readKey_stg_hv.empty()){
75 ATH_CHECK(loadHvData(ctx, m_readKey_stg_hv, DcsTechType::STG, wrHdl, wrCdo.get()));
76 }
77
78 // load TDAQ data
79 if(m_loadTdaq){
80 if(!m_readKey_mmg_tdaq.empty()) {
81 ATH_CHECK(loadTDaqData(ctx, m_readKey_mmg_tdaq, DcsTechType::MMG, wrHdl, wrCdo.get()));
82 }
83 if(!m_readKey_stg_tdaq.empty()) {
84 ATH_CHECK(loadTDaqData(ctx, m_readKey_stg_tdaq, DcsTechType::STG, wrHdl, wrCdo.get()));
85 }
86 }
87 if(m_loadEltx){
88 if(!m_readKey_mmg_eltx.empty()) {
89 ATH_CHECK(loadELTXData(ctx, m_readKey_mmg_eltx, DcsTechType::MMG, wrHdl, wrCdo.get()));
90 }
91 if(!m_readKey_stg_eltx.empty()) {
92 ATH_CHECK(loadELTXData(ctx, m_readKey_stg_eltx, DcsTechType::STG, wrHdl, wrCdo.get()));
93 }
94 }
95
96 // insert/write data
97 if (wrHdl.record(std::move(wrCdo)).isFailure()) {
98 ATH_MSG_FATAL("Could not record " << wrHdl.key()
99 << " with EventRange " << wrHdl.getRange()
100 << " into Conditions Store");
101 return StatusCode::FAILURE;
102 }
103 ATH_MSG_DEBUG("Recorded new " << wrHdl.key() << " with range " << wrHdl.getRange() << " into Conditions Store");
104
105 return StatusCode::SUCCESS;
106
107}
108
109// loadHvData
110StatusCode
111NswDcsDbAlg::loadHvData(const EventContext& ctx, const readKey_t& readKey, const DcsTechType tech, writeHandleDcs_t& writeHandle, NswDcsDbData* writeCdo) const {
112
113 // set up read handle
114 SG::ReadCondHandle<CondAttrListCollection> readHandle{readKey, ctx};
115 const CondAttrListCollection* readCdo{*readHandle};
116 if(!readCdo){
117 ATH_MSG_ERROR("Null pointer to the read conditions object");
118 return StatusCode::FAILURE;
119 }
120 writeHandle.addDependency(readHandle);
121 ATH_MSG_DEBUG("Size of CondAttrListCollection " << readHandle.fullKey() << " readCdo->size()= " << readCdo->size());
122 ATH_MSG_DEBUG("Range of input is " << readHandle.getRange() << ", range of output is " << writeHandle.getRange());
123
124 // iterate through data
126 unsigned int nChns = 0;
127 for(itr = readCdo->begin(); itr != readCdo->end(); ++itr) {
128
129 // channel ID and name
130 const unsigned int chanNum = itr->first;
131 const std::string& chanName = readCdo->chanName(chanNum);
132 if(chanName.empty()){
133 ATH_MSG_DEBUG("Channel number "<< chanNum <<"has empty name");
134 continue;
135 }
136 Identifier channelId{0};
137 bool isOK = false;
138 bool found = buildChannelIdForHv(channelId, tech, chanName, isOK);
139 if(!found){
140 if(!isOK){
141 ATH_MSG_ERROR("Could not identify valid channelId for channel "<<chanNum<<" with name "<< chanName<<"!");
142 THROW_EXCEPTION("NswDcsDbAlg: Could not identify valid channelId for HV channel");
143 }
144 continue;
145 }
146
147 // payload
148 const coral::AttributeList& atr = itr->second;
149
151 dcs_data.standbyVolt = *(static_cast<const float*>((atr["v0Set"]).addressOfData()));
152 dcs_data.readyVolt = *(static_cast<const float*>((atr["v1Set"]).addressOfData()));
153 dcs_data.fsmState = MuonCond::getFsmStateEnum(*(static_cast<const std::string*>((atr["fsmCurrentState"]).addressOfData())));
154 ATH_MSG_DEBUG("channel " << chanName << " has fsm state " << *(static_cast<const std::string*>((atr["fsmCurrentState"]).addressOfData()))<< " has v0 state " << *(static_cast<const float*>( (atr["v0Set"]).addressOfData()))<< " has v1 " << *(static_cast<const float*>((atr["v1Set"]).addressOfData())));
155
156 writeCdo->setDataHv(tech, channelId, dcs_data);
157 ++nChns;
158 }
159 ATH_MSG_VERBOSE("Retrieved data for "<<nChns<<" channels.");
160
161 return StatusCode::SUCCESS;
162}
163
164
165// loadTDaqData
166StatusCode
167NswDcsDbAlg::loadTDaqData(const EventContext& ctx, const readKey_t& readKey, const DcsTechType tech, writeHandleDcs_t& writeHandle, NswDcsDbData* writeCdo) const {
168 // set up read handle
169 SG::ReadCondHandle<CondAttrListCollection> readHandle{readKey, ctx};
170 const CondAttrListCollection* readCdo{*readHandle};
171 if(!readCdo){
172 ATH_MSG_ERROR("Null pointer to the read conditions object");
173 return StatusCode::FAILURE;
174 }
175 writeHandle.addDependency(readHandle);
176 ATH_MSG_DEBUG("Size of CondAttrListCollection " << readHandle.fullKey() << " readCdo->size()= " << readCdo->size());
177 ATH_MSG_DEBUG("Range of input is " << readHandle.getRange() << ", range of output is " << writeHandle.getRange());
178
179 // iterate through data
181 for(itr = readCdo->begin(); itr != readCdo->end(); ++itr) {
182
183 // retrieve data
184 const coral::AttributeList& atr = itr->second;
185 std::string data = *(static_cast<const std::string *>((atr["data_array"]).addressOfData()));
186
187 // unwrap the json and process the data
188 nlohmann::json jx = nlohmann::json::parse(data);
189 unsigned int nLB = 0;
190
191 // loop over lumi blocks and channels
192 for (auto &yy : jx["holes"].items()) {
193 nlohmann::json jt = yy.value();
194
195 // channel ID and name
196 Identifier channelId{0};
197 bool isOK = false;
198 uint elink{0};
199 bool found = buildChannelIdForTDaq(channelId, elink, tech, jt["channelName"], isOK);
200 if(!found){
201 if(!isOK)
202 ATH_MSG_DEBUG("Could not identify valid channelId for channel "<<jt["channelId"]<<" with name "<< jt["channelName"]<<"! Skipping...");
203 continue;
204 }
205 // write data
206 int channelDead = jt["channelDead"];
207 writeCdo->setDataTDaq(tech, channelId, jt["hole_iovSince"], jt["hole_iovUntil"], elink, channelDead );
208 ATH_MSG_VERBOSE(m_idHelperSvc->toString(channelId)<<" " << jt["channelName"] << " " << jt["hole_iovSince"]<<" " <<jt["hole_iovUntil"]<<" " << elink<<" "<<channelDead );
209 ++nLB;
210 }
211 ATH_MSG_VERBOSE("Retrieved data for "<<nLB<<" entries (combinations of lumi block and channel).");
212 }
213
214 return StatusCode::SUCCESS;
215}
216
217StatusCode NswDcsDbAlg::loadELTXData(const EventContext& ctx, const readKey_t& readKey, const DcsTechType tech, writeHandleDcs_t& writeHandle, NswDcsDbData* writeCdo) const {
218
219 // set up read handle
220 SG::ReadCondHandle<CondAttrListCollection> readHandle{readKey, ctx};
221 const CondAttrListCollection* readCdo{*readHandle};
222 if(!readCdo){
223 ATH_MSG_ERROR("Null pointer to the read conditions object");
224 return StatusCode::FAILURE;
225 }
226 writeHandle.addDependency(readHandle);
227 ATH_MSG_DEBUG("Size of CondAttrListCollection " << readHandle.fullKey() << " readCdo->size()= " << readCdo->size());
228 ATH_MSG_DEBUG("Range of input is " << readHandle.getRange() << ", range of output is " << writeHandle.getRange());
229
230 // This code is under development so lets mute unused variable warnings for now
231 (void) writeCdo;
232 (void) tech;
233
234 // iterate through data
236 for(itr = readCdo->begin(); itr != readCdo->end(); ++itr) {
237
238 // channel ID and name
239 const unsigned int chanNum = itr->first;
240 const std::string& chanName = readCdo->chanName(chanNum);
241 if(chanName.empty()){
242 ATH_MSG_DEBUG("Channel number "<< chanNum <<"has empty name");
243 continue;
244 }
245 const coral::AttributeList& atr = itr->second;
246 bool online = *(static_cast<const bool*>((atr["online"]).addressOfData()));
247 ATH_MSG_DEBUG("found SCA " << chanName << " with status " << atr["online"] << " " << online);
248 if(online) continue; // we only want to record things that are dead
249 Identifier channelId{};
250 bool isOk{false};
251 if(!buildChannelIdForEltx(channelId, tech, chanName, isOk)){
252 continue;
253 }
254 ATH_MSG_DEBUG(__FILE__<<":"<<__LINE__<<" "<<m_idHelperSvc->toString(channelId));
255 writeCdo->setDataEltx(tech, channelId);
256 }
257 return StatusCode::SUCCESS;
258
259}
260
261
262// buildChannelIdForHv
263bool
264NswDcsDbAlg::buildChannelIdForHv(Identifier& channelId, const DcsTechType tech0, const std::string& chanName, bool& isOK) const {
265
266 // prepare regex
267 std::regex reMMG("^([A-Za-z]{1})([0-9]{2})_ML([0-9])P([0-9])_(IP|HO)R([0-9])__HV");
268 std::regex reMMD("^([A-Za-z]{1})([0-9]{2})_DRIFT_(IP|HO)R([0-9])__HV");
269 std::regex reSTG("^([A-Za-z]{1})([0-9]{2})_ML([0-9])_(IP|HO)R([0-9])__HV");
270 std::regex re;
271 DcsTechType tech = DcsTechType::MMG;
272
273 // match regex
274 if(std::regex_match(chanName, reMMG)) {
275 re = reMMG;
276 tech = DcsTechType::MMG;
277 }
278 else if(std::regex_match(chanName, reMMD)) {
279 re = reMMD;
280 tech = DcsTechType::MMD;
281 }
282 else if(std::regex_match(chanName, reSTG)) {
283 re = reSTG;
284 tech = DcsTechType::STG;
285 }
286 else {
287 ATH_MSG_ERROR("Could not identify channel with name "<<chanName);
288 isOK = false;
289 return false;
290 }
291
292 // sanity check
293 if(tech0!=tech) {
294 isOK = true; // need to distinguish error in parsing and simple difference between required technologies
295 return false;
296 }
297
298 // build channel Id
299 bool isValid{false};
300 std::smatch m;
301 std::regex_match(chanName, m, re);
302
303 // copy to vec of strings
304 std::vector<std::string> res;
305 for(unsigned int i=0; i<m.size(); ++i) res.push_back(m[i].str());
306
307 // MMG Channel
308 if(tech==DcsTechType::MMG){
309 int wheel = res[1]=="A"? 1 : -1;
310 int sector = std::stoi(res[2]);
311 const std::string stationName = sector%2==0 ? "MMS" : "MML";
312 int stationEta = wheel*std::stoi(res[6]);
313 int stationPhi = (sector-1)/2+1;
314 int multiLayer = res[5]=="IP" ? 1 : 2;
315 int gasGap = std::stoi(res[3]);
316 int pcb = std::stoi(res[4]);
317 Identifier chnlId = m_idHelperSvc->mmIdHelper().pcbID(stationName, stationEta, stationPhi, multiLayer, gasGap, pcb, isValid);
318 if(!isValid){
319 ATH_MSG_DEBUG("Could not extract valid channelId for MMG channel "<<chanName);
320 ATH_MSG_DEBUG("Fields: "<< wheel << " "<<sector<<" " << stationName<< " " << stationEta<<" "<<stationPhi<<" "<<multiLayer);
321 isOK = false;
322 return false;
323 }
324 channelId = chnlId;
325 }
326
327 // MMG Drift Channel
328 else if(tech==DcsTechType::MMD){
329 int wheel = res[1]=="A"? 1 : -1;
330 int sector = std::stoi(res[2]);
331 const std::string stationName = sector%2==0 ? "MMS" : "MML";
332 int stationEta = wheel*std::stoi(res[4]);
333 int stationPhi = (sector-1)/2+1;
334 int multiLayer = res[3]=="IP" ? 1 : 2;
335 Identifier modId = m_idHelperSvc->mmIdHelper().elementID(stationName, stationEta, stationPhi, isValid);
336 if(!isValid){
337 ATH_MSG_DEBUG("Could not extract valid elementId for MMGD channel "<<chanName);
338 ATH_MSG_DEBUG("Fields: "<< wheel << " "<<sector<<" " << stationName<< " " << stationEta<<" "<<stationPhi<<" "<<multiLayer);
339 isOK = false;
340 return false;
341 }
342 Identifier chnlId = m_idHelperSvc->mmIdHelper().multilayerID(modId, multiLayer, isValid);
343 if(!isValid){
344 ATH_MSG_DEBUG("Could not extract valid multilayerId for MMG channel "<<chanName);
345 ATH_MSG_DEBUG("Fields: "<< wheel << " "<<sector<<" " << stationName<< " " << stationEta<<" "<<stationPhi<<" "<<multiLayer);
346 isOK = false;
347 //return false;
348 }
349 channelId = chnlId;
350 }
351
352 // STG
353 else if(tech==DcsTechType::STG){
354 int wheel = res[1]=="A"? 1 : -1;
355 int sector = std::stoi(res[2]);
356 const std::string stationName = sector%2==0 ? "STS" : "STL";
357 int radius = std::stoi(res[5]);
358 int stationEta = wheel*(radius<=2 ? 1 : radius-1);
359 int stationPhi = (sector-1)/2+1;
360 int multiLayer = res[4]=="IP" ? 1 : 2;
361 int gasGap = std::stoi(res[3]);
362 Identifier chnlId = m_idHelperSvc->stgcIdHelper().hvID(stationName, stationEta, stationPhi, multiLayer, gasGap, radius == 1 /*radius 1 is the inner hv section*/ , isValid);
363 if(!isValid){
364 ATH_MSG_DEBUG("Could not extract valid channelId for STG channel "<<chanName);
365 ATH_MSG_DEBUG("Fields: "<< wheel << " "<<sector<<" " << stationName<< " " << stationEta<<" "<<stationPhi<<" "<<multiLayer);
366 isOK = false;
367 return false;
368 }
369 channelId = chnlId;
370 }
371
372 return true;
373}
374
375
376// buildChannelIdForTDaq
377bool
378NswDcsDbAlg::buildChannelIdForTDaq(Identifier& channelId, uint& elink ,const DcsTechType tech0, const std::string& chanName, bool& isOK) const {
379
380 // prepare regex
381 std::regex reMMG("^ELink-MM-(A|C)/V([0-9]{1})/L1A/Strip/S([0-9]{1,2})/L([0-9]{1})/R([0-9]{1,2})/E([0-9]{1})");
382 std::regex reSTG("^ELink-sTGC-(A|C)/V([0-9]{1})/L1A/(Strip|Pad)/S([0-9]{1,2})/L([0-9]{1})/R([0-9]{1})/E([0-9]{1})");
383 std::regex reSTGTrigProc("^ELink-sTGC-A/V0/L1A/TrigProc/");
384 std::regex reSTGPadTrig("^ELink-sTGC-A/V0/L1A/PadTrig/");
385
386 std::regex re;
387 DcsTechType tech = DcsTechType::MMG;
388
389 // match regex
390 if(std::regex_match(chanName, reMMG)) {
391 re = reMMG;
392 tech = DcsTechType::MMG;
393 }
394 else if(std::regex_match(chanName, reSTG)) {
395 re = reSTG;
396 tech = DcsTechType::STG;
397 } else if(std::regex_match(chanName, reSTGPadTrig) || std::regex_match(chanName, reSTGTrigProc)){ // those are trigger elinks that are not needed in athena
398 isOK = true;
399 return false;
400 }
401 else {
402 ATH_MSG_DEBUG("Could not identify channel with name "<<chanName);
403 isOK = false;
404 return false;
405 }
406
407 // sanity check
408 if(tech0!=tech) {
409 isOK = true; // need to distinguish error in parsing and simple difference between required technologies
410 return false;
411 }
412
413 // build channel Id
414 bool isValid{false};
415 std::smatch m;
416 std::regex_match(chanName, m, re);
417
418 // copy to vec of strings
419 std::vector<std::string> res;
420 for(unsigned int i=0; i<m.size(); ++i) res.push_back(m[i].str());
421
422 // MMG Channel
423 if(tech==DcsTechType::MMG){
424 int wheel = res[1]=="A"? 1 : -1;
425 int sector = std::stoi(res[3])+1; // elx counts from 0 athena from 1 -->need a +1
426 int stationName = sector%2==0 ? 55 : 56;
427 /*
428 res[4] -> L
429 res[5] -> R
430 res[6] -> E
431 */
432 int stationEta = wheel*(std::stoi(res[5])<10? 1 : 2); // boards 0-9 are und the first quad, boards 10-15 und the second one
433 int stationPhi = (sector-1)/2+1;
434 int multiLayer = std::stoi(res[4])< 4 ? 1 : 2; // layers 0-3 are on multilayer 1 and layers 4-7 are on multilayer 2
435 int gasGap = (std::stoi(res[4])%4) + 1; // identifies layer within multilayer --> counts from 0-3; +1 because athena counts from 1-4
436 int radius = std::stoi(res[5]);
437 Identifier chnlId = m_idHelperSvc->mmIdHelper().febID(stationName, stationEta, stationPhi, multiLayer, gasGap, radius, isValid);
438 elink = std::stoi(res[6]);
439 if(!isValid){
440 ATH_MSG_DEBUG("Could not extract valid channelId for MMG channel "<<chanName);
441 ATH_MSG_DEBUG("Fields: "<< wheel << " "<<sector<<" " << stationName<< " " << stationEta<<" "<<stationPhi<<" "<<multiLayer<<" " << gasGap<<" " << radius<<" " << elink);
442 isOK = false;
443 return false;
444 }
445 channelId = chnlId;
446 }
447
448 // STG
449 else if(tech==DcsTechType::STG){
450 int wheel = res[1]=="A"? 1 : -1;
451 int sector = std::stoi(res[4]) + 1;
452 std::string stationName = sector%2==0 ? "STS" : "STL";
453
454 /*
455 res[3] -> Strip/Pad
456 res[5] -> L
457 res[6] -> R
458 res[7] -> E
459 */
460
461 int radius = std::stoi(res[6]);
462 int stationEta = wheel*(radius+1);
463 int stationPhi = (sector-1)/2+1;
464 int multiLayer = (std::stoi(res[5]) < 4 ? 1 : 2);
465 int gasGap = ((std::stoi(res[5]))%4)+1;
467 Identifier chnlId = m_idHelperSvc->stgcIdHelper().febID(stationName, stationEta, stationPhi, multiLayer, gasGap, channelType, isValid);
468 if(!isValid){
469 ATH_MSG_DEBUG("Could not extract valid channelId for STG channel "<<chanName);
470 ATH_MSG_DEBUG("Fields: "<< wheel << " "<<sector<<" " << stationName<< " " << stationEta<<" "<<stationPhi<<" "<<multiLayer<<" " << gasGap<<" " << radius<<" " << elink);
471 isOK = false;
472 return false;
473 }
474 channelId = chnlId;
475 elink = std::stoi(res[7]);
476 }
477
478 return true;
479}
480
481// buildChannelIdForElx
482bool
483NswDcsDbAlg::buildChannelIdForEltx(Identifier& channelId, const DcsTechType tech, const std::string& chanName, bool& isOK) const {
484
485 // prepare regex
486 std::regex re("^(A|C)_([0-9]{2})_L([0-9])_B([0-9]{2})");
487
488
489 // match regex
490 if(!std::regex_match(chanName, re)) {
491 ATH_MSG_WARNING("Could not identify channel with name "<<chanName);
492 isOK = false;
493 return false;
494 }
495
496 // build channel Id
497 bool isValid{false};
498 std::smatch m;
499 std::regex_match(chanName, m, re);
500
501 // copy to vec of strings
502 std::vector<std::string> res;
503 for(unsigned int i=0; i<m.size(); ++i) res.push_back(m[i].str());
504
505 //extract field common to MM and stgc
506 int wheel = res[1]=="A"? 1 : -1;
507 int sector = std::stoi(res[2])+1;
508 int board = std::stoi(res[4]);
509 int layer = std::stoi(res[3]);
510 int stationPhi = (sector-1)/2+1;
511 int multiLayer = layer< 5 ? 1 : 2; // layers 1-4 are on multilayer 1 and layers 5-8 are on multilayer 2
512 int gasGap = ((layer-1)%4) + 1; // identifies layer within multilayer
513
514
515 // MMG Channel
516 if(tech==DcsTechType::MMG){
517 int stationName = sector%2==0 ? 56 : 55;
518
519 board -= (layer%2==1 ? 1 : 2); // for odd layers (counting 1-8 here) the first board is on position 1 for even ones on position 2. https://mattermost.web.cern.ch/files/i84ghkjsfbrzje7c3kr5h7ccdy/public?h=xs3cQQ38yZJDrct75eY73G9d1deOaEtJCHmk2Qcni4s
520 int radius{0};
521 if(board%4==0){
522 radius = 2*(board/4);
523 } else if (board%4==3) {
524 radius = 2*(board/4) + 1;
525 } else { // not a readout board
526 isOK = true;
527 return false;
528 }
529
530 int stationEta = wheel*(radius<10? 1 : 2); // boards 0-9 are on the first quad, boards 10-15 on the second one
531 Identifier chnlId = m_idHelperSvc->mmIdHelper().febID(stationName, stationEta, stationPhi, multiLayer, gasGap, radius, isValid);
532 if(!isValid){
533 ATH_MSG_WARNING("Could not extract valid channelId for MMG channel "<<chanName);
534 ATH_MSG_WARNING("Fields: "<< wheel << " "<<sector<<" " << stationName<< " " << stationEta<<" "<<stationPhi<<" "<<multiLayer<<" " << gasGap<<" " << radius<<" " << board);
535 isOK = false;
536 return false;
537 }
538 channelId = chnlId;
539 } else if(tech==DcsTechType::STG){
540 int stationName = sector%2==0 ? 58 : 57;
541 board -= 1; // count from 0 while input counts from one
542 uint radius = board/2;
543 int stationEta = wheel*(radius+1);
544 uint channelType{0};
545 if(board>=6){ // not a STG readout board
546 isOK = true;
547 return false;
548 }
549 else if((layer&1)==1){// for odd layers (counting 1-8 here) the boards on even positions are reading the strips. https://mattermost.web.cern.ch/files/bdh8wwjzf7yiiggtad3u8bttrr/public?h=2fFnVki1EUefrMEa3tb8AZkTiC-tF3L11qdq43dBbJc
550 if(board%2==0){
552 } else {
554 }
555 } else if(layer%1==0){// for even layers (counting 1-8 here) the boards on even positions are reading the pads and wires. https://mattermost.web.cern.ch/files/taro34muwpb18pqgiufhwf5a5c/public?h=3YlA-w0NfEuCV2JIGUjiWwpnpDlxvIaEkzrTXWfo71M
556 if(board%2==0){
558 } else {
560 }
561 }
562 Identifier chnlId = m_idHelperSvc->stgcIdHelper().febID(stationName, stationEta, stationPhi, multiLayer, gasGap, channelType ,isValid);
563 if(!isValid){
564 ATH_MSG_WARNING("Could not extract valid channelId for STG channel "<<chanName);
565 ATH_MSG_WARNING("Fields: "<< wheel << " "<<sector<<" " << stationName<< " " << stationEta<<" "<<stationPhi<<" "<<multiLayer<<" " << gasGap<<" " << radius<<" " << board << " " << channelType);
566 isOK = false;
567 return false;
568 }
569 channelId = chnlId;
570 }
571 return true;
572}
const boost::regex re(r_e)
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
bool isValid(const T &p)
Av: we implement here an ATLAS-sepcific convention: all particles which are 99xxxxx are fine.
Definition AtlasPID.h:878
This file defines the class for a collection of AttributeLists where each one is associated with a ch...
#define CHECK(...)
Evaluate an expression and check for errors.
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
std::pair< std::vector< unsigned int >, bool > res
unsigned int uint
This class is a collection of AttributeLists where each one is associated with a channel number.
const_iterator end() const
const_iterator begin() const
Access to Chan/AttributeList pairs via iterators.
const std::string & chanName(ChanNum chanNum) const
find name for particular channel
size_type size() const
number of Chan/AttributeList pairs
ChanAttrListMap::const_iterator const_iterator
static EventIDRange infiniteMixed()
Produces an mixed EventIDRange that is infinite in Time and RunLumi.
bool buildChannelIdForHv(Identifier &channelId, const DcsTechType tech0, const std::string &chanName, bool &isOK) const
Gaudi::Property< bool > m_loadTdaq
Definition NswDcsDbAlg.h:77
bool buildChannelIdForEltx(Identifier &channelId, const DcsTechType tech0, const std::string &chanName, bool &isOK) const
bool buildChannelIdForTDaq(Identifier &channelId, uint &elink, const DcsTechType tech0, const std::string &chanName, bool &isOK) const
readKey_t m_readKey_stg_eltx
Definition NswDcsDbAlg.h:75
StatusCode loadELTXData(const EventContext &ctx, const readKey_t &readKey, const DcsTechType tech, writeHandleDcs_t &writeHandle, NswDcsDbData *writeCdo) const
readKey_t m_readKey_mmg_tdaq
Definition NswDcsDbAlg.h:71
SG::ReadCondHandleKey< MuonGM::MuonDetectorManager > m_muonManagerKey
Definition NswDcsDbAlg.h:80
StatusCode loadHvData(const EventContext &ctx, const readKey_t &readKey, const DcsTechType tech, writeHandleDcs_t &writeHandle, NswDcsDbData *writeCdo) const
readKey_t m_readKey_stg_hv
Definition NswDcsDbAlg.h:69
SG::ReadCondHandleKey< CondAttrListCollection > readKey_t
Definition NswDcsDbAlg.h:44
virtual StatusCode execute(const EventContext &) const override
virtual StatusCode initialize() override
SG::WriteCondHandle< NswDcsDbData > writeHandleDcs_t
Definition NswDcsDbAlg.h:46
readKey_t m_readKey_stg_tdaq
Definition NswDcsDbAlg.h:72
Gaudi::Property< bool > m_loadEltx
Definition NswDcsDbAlg.h:78
ServiceHandle< ICondSvc > m_condSvc
Definition NswDcsDbAlg.h:63
readKey_t m_readKey_mmg_hv
Definition NswDcsDbAlg.h:68
NswDcsDbData::DcsTechType DcsTechType
Definition NswDcsDbAlg.h:50
readKey_t m_readKey_mmg_eltx
Definition NswDcsDbAlg.h:74
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Definition NswDcsDbAlg.h:64
StatusCode loadTDaqData(const EventContext &ctx, const readKey_t &readKey, const DcsTechType tech, writeHandleDcs_t &writeHandle, NswDcsDbData *writeCdo) const
writeKey_t m_writeKey
Definition NswDcsDbAlg.h:66
MuonCond::DcsConstants DcsConstants
void setDataHv(const DcsTechType tech, const Identifier &chnlId, DcsConstants constants)
void setDataTDaq(const DcsTechType tech, const Identifier &chnlId, uint64_t timeSince, uint64_t timeUntil, unsigned int elink, bool permanentlyDisabled)
void setDataEltx(const DcsTechType tech, const Identifier &chnlId)
const DataObjID & fullKey() const
const EventIDRange & getRange()
const_pointer_type cptr()
const std::string & key() const
void addDependency(const EventIDRange &range)
const EventIDRange & getRange() const
StatusCode record(const EventIDRange &range, T *t)
record handle, with explicit range DEPRECATED
const DataObjID & fullKey() const
DcsFsmState getFsmStateEnum(const std::string &fsmState)
Definition Defs.cxx:8
#define THROW_EXCEPTION(MESSAGE)
Definition throwExcept.h:10