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
5#include "NswDcsDbAlg.h"
6
9#include <string>
10#include <regex>
11#include "nlohmann/json.hpp"
13#include "GeoModelKernel/throwExcept.h"
14
15namespace Muon{
16// Initialize
19
20 // retrievals
21 ATH_MSG_DEBUG( "initializing " << name() );
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 readCdo{readKey, ctx};
115 if(!readCdo.isValid()){
116 ATH_MSG_ERROR("Null pointer to the read conditions object");
117 return StatusCode::FAILURE;
118 }
119 writeHandle.addDependency(readCdo);
120 ATH_MSG_DEBUG("Size of CondAttrListCollection " << readKey.fullKey() << " readCdo->size()= " << readCdo->size());
121 ATH_MSG_DEBUG("Range of input is " << readCdo.getRange() << ", range of output is " << writeHandle.getRange());
122
123 // iterate through data
125 unsigned int nChns = 0;
126 for(itr = readCdo->begin(); itr != readCdo->end(); ++itr) {
127
128 // channel ID and name
129 const unsigned int chanNum = itr->first;
130 const std::string& chanName = readCdo->chanName(chanNum);
131 if(chanName.empty()){
132 ATH_MSG_DEBUG("Channel number "<< chanNum <<"has empty name");
133 continue;
134 }
135 Identifier channelId{0};
136 bool isOK = false;
137 bool found = buildChannelIdForHv(channelId, tech, chanName, isOK);
138 if(!found){
139 if(!isOK){
140 ATH_MSG_ERROR("Could not identify valid channelId for channel "<<chanNum<<" with name "<< chanName<<"!");
141 THROW_EXCEPTION("NswDcsDbAlg: Could not identify valid channelId for HV channel");
142 }
143 continue;
144 }
145
146 // payload
147 const coral::AttributeList& atr = itr->second;
148
150 dcs_data.standbyVolt = *(static_cast<const float*>((atr["v0Set"]).addressOfData()));
151 dcs_data.readyVolt = *(static_cast<const float*>((atr["v1Set"]).addressOfData()));
152 dcs_data.fsmState = MuonCond::getFsmStateEnum(*(static_cast<const std::string*>((atr["fsmCurrentState"]).addressOfData())));
153 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())));
154
155 writeCdo->setDataHv(tech, channelId, dcs_data);
156 ++nChns;
157 }
158 ATH_MSG_VERBOSE("Retrieved data for "<<nChns<<" channels.");
159
160 return StatusCode::SUCCESS;
161}
162
163
164// loadTDaqData
165StatusCode
166NswDcsDbAlg::loadTDaqData(const EventContext& ctx, const readKey_t& readKey, const DcsTechType tech, writeHandleDcs_t& writeHandle, NswDcsDbData* writeCdo) const {
167 // set up read handle
168 SG::ReadCondHandle readCdo{readKey, ctx};
169 if(!readCdo.isValid()){
170 ATH_MSG_ERROR("Null pointer to the read conditions object");
171 return StatusCode::FAILURE;
172 }
173 writeHandle.addDependency(readCdo);
174 ATH_MSG_DEBUG("Size of CondAttrListCollection " << readKey.fullKey() << " readCdo->size()= " << readCdo->size());
175 ATH_MSG_DEBUG("Range of input is " << readCdo.getRange() << ", range of output is " << writeHandle.getRange());
176
177 // iterate through data
179 for(itr = readCdo->begin(); itr != readCdo->end(); ++itr) {
180
181 // retrieve data
182 const coral::AttributeList& atr = itr->second;
183 std::string data = *(static_cast<const std::string *>((atr["data_array"]).addressOfData()));
184
185 // unwrap the json and process the data
186 nlohmann::json jx = nlohmann::json::parse(data);
187 unsigned int nLB = 0;
188
189 // loop over lumi blocks and channels
190 for (auto &yy : jx["holes"].items()) {
191 nlohmann::json jt = yy.value();
192
193 // channel ID and name
194 Identifier channelId{0};
195 bool isOK = false;
196 uint elink{0};
197 bool found = buildChannelIdForTDaq(channelId, elink, tech, jt["channelName"], isOK);
198 if(!found){
199 if(!isOK)
200 ATH_MSG_DEBUG("Could not identify valid channelId for channel "<<jt["channelId"]<<" with name "<< jt["channelName"]<<"! Skipping...");
201 continue;
202 }
203 // write data
204 int channelDead = jt["channelDead"];
205 writeCdo->setDataTDaq(tech, channelId, jt["hole_iovSince"], jt["hole_iovUntil"], elink, channelDead );
206 ATH_MSG_VERBOSE(m_idHelperSvc->toString(channelId)<<" " << jt["channelName"] << " " << jt["hole_iovSince"]<<" " <<jt["hole_iovUntil"]<<" " << elink<<" "<<channelDead );
207 ++nLB;
208 }
209 ATH_MSG_VERBOSE("Retrieved data for "<<nLB<<" entries (combinations of lumi block and channel).");
210 }
211
212 return StatusCode::SUCCESS;
213}
214
215StatusCode NswDcsDbAlg::loadELTXData(const EventContext& ctx, const readKey_t& readKey, const DcsTechType tech, writeHandleDcs_t& writeHandle, NswDcsDbData* writeCdo) const {
216
217 // set up read handle
218 SG::ReadCondHandle readCdo{readKey, ctx};
219 if(!readCdo.isValid()){
220 ATH_MSG_ERROR("Null pointer to the read conditions object");
221 return StatusCode::FAILURE;
222 }
223 writeHandle.addDependency(readCdo);
224 ATH_MSG_DEBUG("Size of CondAttrListCollection " << readKey.fullKey() << " readCdo->size()= " << readCdo->size());
225 ATH_MSG_DEBUG("Range of input is " << readCdo.getRange() << ", range of output is " << writeHandle.getRange());
226
227 // This code is under development so lets mute unused variable warnings for now
228 (void) writeCdo;
229 (void) tech;
230
231 // iterate through data
233 for(itr = readCdo->begin(); itr != readCdo->end(); ++itr) {
234
235 // channel ID and name
236 const unsigned int chanNum = itr->first;
237 const std::string& chanName = readCdo->chanName(chanNum);
238 if(chanName.empty()){
239 ATH_MSG_DEBUG("Channel number "<< chanNum <<"has empty name");
240 continue;
241 }
242 const coral::AttributeList& atr = itr->second;
243 bool online = *(static_cast<const bool*>((atr["online"]).addressOfData()));
244 ATH_MSG_DEBUG("found SCA " << chanName << " with status " << atr["online"] << " " << online);
245 if(online) continue; // we only want to record things that are dead
246 Identifier channelId{};
247 bool isOk{false};
248 if(!buildChannelIdForEltx(channelId, tech, chanName, isOk)){
249 continue;
250 }
251 ATH_MSG_DEBUG(__FILE__<<":"<<__LINE__<<" "<<m_idHelperSvc->toString(channelId));
252 writeCdo->setDataEltx(tech, channelId);
253 }
254 return StatusCode::SUCCESS;
255
256}
257
258
259// buildChannelIdForHv
260bool
261NswDcsDbAlg::buildChannelIdForHv(Identifier& channelId, const DcsTechType tech0, const std::string& chanName, bool& isOK) const {
262
263 // prepare regex
264 std::regex reMMG("^([A-Za-z]{1})([0-9]{2})_ML([0-9])P([0-9])_(IP|HO)R([0-9])__HV");
265 std::regex reMMD("^([A-Za-z]{1})([0-9]{2})_DRIFT_(IP|HO)R([0-9])__HV");
266 std::regex reSTG("^([A-Za-z]{1})([0-9]{2})_ML([0-9])_(IP|HO)R([0-9])__HV");
267 std::regex re;
268 DcsTechType tech = DcsTechType::MMG;
269
270 // match regex
271 if(std::regex_match(chanName, reMMG)) {
272 re = reMMG;
273 tech = DcsTechType::MMG;
274 }
275 else if(std::regex_match(chanName, reMMD)) {
276 re = reMMD;
277 tech = DcsTechType::MMD;
278 }
279 else if(std::regex_match(chanName, reSTG)) {
280 re = reSTG;
281 tech = DcsTechType::STG;
282 }
283 else {
284 ATH_MSG_ERROR("Could not identify channel with name "<<chanName);
285 isOK = false;
286 return false;
287 }
288
289 // sanity check
290 if(tech0!=tech) {
291 isOK = true; // need to distinguish error in parsing and simple difference between required technologies
292 return false;
293 }
294
295 // build channel Id
296 bool isValid{false};
297 std::smatch m;
298 std::regex_match(chanName, m, re);
299
300 // copy to vec of strings
301 std::vector<std::string> res;
302 for(unsigned int i=0; i<m.size(); ++i) res.push_back(m[i].str());
303
304 // MMG Channel
305 if(tech==DcsTechType::MMG){
306 int wheel = res[1]=="A"? 1 : -1;
307 int sector = std::stoi(res[2]);
308 const std::string stationName = sector%2==0 ? "MMS" : "MML";
309 int stationEta = wheel*std::stoi(res[6]);
310 int stationPhi = (sector-1)/2+1;
311 int multiLayer = res[5]=="IP" ? 1 : 2;
312 int gasGap = std::stoi(res[3]);
313 int pcb = std::stoi(res[4]);
314 Identifier chnlId = m_idHelperSvc->mmIdHelper().pcbID(stationName, stationEta, stationPhi, multiLayer, gasGap, pcb, isValid);
315 if(!isValid){
316 ATH_MSG_DEBUG("Could not extract valid channelId for MMG channel "<<chanName);
317 ATH_MSG_DEBUG("Fields: "<< wheel << " "<<sector<<" " << stationName<< " " << stationEta<<" "<<stationPhi<<" "<<multiLayer);
318 isOK = false;
319 return false;
320 }
321 channelId = chnlId;
322 }
323
324 // MMG Drift Channel
325 else if(tech==DcsTechType::MMD){
326 int wheel = res[1]=="A"? 1 : -1;
327 int sector = std::stoi(res[2]);
328 const std::string stationName = sector%2==0 ? "MMS" : "MML";
329 int stationEta = wheel*std::stoi(res[4]);
330 int stationPhi = (sector-1)/2+1;
331 int multiLayer = res[3]=="IP" ? 1 : 2;
332 Identifier modId = m_idHelperSvc->mmIdHelper().elementID(stationName, stationEta, stationPhi, isValid);
333 if(!isValid){
334 ATH_MSG_DEBUG("Could not extract valid elementId for MMGD channel "<<chanName);
335 ATH_MSG_DEBUG("Fields: "<< wheel << " "<<sector<<" " << stationName<< " " << stationEta<<" "<<stationPhi<<" "<<multiLayer);
336 isOK = false;
337 return false;
338 }
339 Identifier chnlId = m_idHelperSvc->mmIdHelper().multilayerID(modId, multiLayer, isValid);
340 if(!isValid){
341 ATH_MSG_DEBUG("Could not extract valid multilayerId for MMG channel "<<chanName);
342 ATH_MSG_DEBUG("Fields: "<< wheel << " "<<sector<<" " << stationName<< " " << stationEta<<" "<<stationPhi<<" "<<multiLayer);
343 isOK = false;
344 //return false;
345 }
346 channelId = chnlId;
347 }
348
349 // STG
350 else if(tech==DcsTechType::STG){
351 int wheel = res[1]=="A"? 1 : -1;
352 int sector = std::stoi(res[2]);
353 const std::string stationName = sector%2==0 ? "STS" : "STL";
354 int radius = std::stoi(res[5]);
355 int stationEta = wheel*(radius<=2 ? 1 : radius-1);
356 int stationPhi = (sector-1)/2+1;
357 int multiLayer = res[4]=="IP" ? 1 : 2;
358 int gasGap = std::stoi(res[3]);
359 Identifier chnlId = m_idHelperSvc->stgcIdHelper().hvID(stationName, stationEta, stationPhi, multiLayer, gasGap, radius == 1 /*radius 1 is the inner hv section*/ , isValid);
360 if(!isValid){
361 ATH_MSG_DEBUG("Could not extract valid channelId for STG channel "<<chanName);
362 ATH_MSG_DEBUG("Fields: "<< wheel << " "<<sector<<" " << stationName<< " " << stationEta<<" "<<stationPhi<<" "<<multiLayer);
363 isOK = false;
364 return false;
365 }
366 channelId = chnlId;
367 }
368
369 return true;
370}
371
372
373// buildChannelIdForTDaq
374bool
375NswDcsDbAlg::buildChannelIdForTDaq(Identifier& channelId, uint& elink ,const DcsTechType tech0, const std::string& chanName, bool& isOK) const {
376
377 // prepare regex
378 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})");
379 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})");
380 std::regex reSTGTrigProc("^ELink-sTGC-A/V0/L1A/TrigProc/");
381 std::regex reSTGPadTrig("^ELink-sTGC-A/V0/L1A/PadTrig/");
382
383 std::regex re;
384 DcsTechType tech = DcsTechType::MMG;
385
386 // match regex
387 if(std::regex_match(chanName, reMMG)) {
388 re = reMMG;
389 tech = DcsTechType::MMG;
390 }
391 else if(std::regex_match(chanName, reSTG)) {
392 re = reSTG;
393 tech = DcsTechType::STG;
394 } else if(std::regex_match(chanName, reSTGPadTrig) || std::regex_match(chanName, reSTGTrigProc)){ // those are trigger elinks that are not needed in athena
395 isOK = true;
396 return false;
397 }
398 else {
399 ATH_MSG_DEBUG("Could not identify channel with name "<<chanName);
400 isOK = false;
401 return false;
402 }
403
404 // sanity check
405 if(tech0!=tech) {
406 isOK = true; // need to distinguish error in parsing and simple difference between required technologies
407 return false;
408 }
409
410 // build channel Id
411 bool isValid{false};
412 std::smatch m;
413 std::regex_match(chanName, m, re);
414
415 // copy to vec of strings
416 std::vector<std::string> res;
417 for(unsigned int i=0; i<m.size(); ++i) res.push_back(m[i].str());
418
419 // MMG Channel
420 if(tech==DcsTechType::MMG){
421 int wheel = res[1]=="A"? 1 : -1;
422 int sector = std::stoi(res[3])+1; // elx counts from 0 athena from 1 -->need a +1
423 int stationName = sector%2==0 ? 55 : 56;
424 /*
425 res[4] -> L
426 res[5] -> R
427 res[6] -> E
428 */
429 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
430 int stationPhi = (sector-1)/2+1;
431 int multiLayer = std::stoi(res[4])< 4 ? 1 : 2; // layers 0-3 are on multilayer 1 and layers 4-7 are on multilayer 2
432 int gasGap = (std::stoi(res[4])%4) + 1; // identifies layer within multilayer --> counts from 0-3; +1 because athena counts from 1-4
433 int radius = std::stoi(res[5]);
434 Identifier chnlId = m_idHelperSvc->mmIdHelper().febID(stationName, stationEta, stationPhi, multiLayer, gasGap, radius, isValid);
435 elink = std::stoi(res[6]);
436 if(!isValid){
437 ATH_MSG_DEBUG("Could not extract valid channelId for MMG channel "<<chanName);
438 ATH_MSG_DEBUG("Fields: "<< wheel << " "<<sector<<" " << stationName<< " " << stationEta<<" "<<stationPhi<<" "<<multiLayer<<" " << gasGap<<" " << radius<<" " << elink);
439 isOK = false;
440 return false;
441 }
442 channelId = chnlId;
443 }
444
445 // STG
446 else if(tech==DcsTechType::STG){
447 int wheel = res[1]=="A"? 1 : -1;
448 int sector = std::stoi(res[4]) + 1;
449 std::string stationName = sector%2==0 ? "STS" : "STL";
450
451 /*
452 res[3] -> Strip/Pad
453 res[5] -> L
454 res[6] -> R
455 res[7] -> E
456 */
457
458 int radius = std::stoi(res[6]);
459 int stationEta = wheel*(radius+1);
460 int stationPhi = (sector-1)/2+1;
461 int multiLayer = (std::stoi(res[5]) < 4 ? 1 : 2);
462 int gasGap = ((std::stoi(res[5]))%4)+1;
464 Identifier chnlId = m_idHelperSvc->stgcIdHelper().febID(stationName, stationEta, stationPhi, multiLayer, gasGap, channelType, isValid);
465 if(!isValid){
466 ATH_MSG_DEBUG("Could not extract valid channelId for STG channel "<<chanName);
467 ATH_MSG_DEBUG("Fields: "<< wheel << " "<<sector<<" " << stationName<< " " << stationEta<<" "<<stationPhi<<" "<<multiLayer<<" " << gasGap<<" " << radius<<" " << elink);
468 isOK = false;
469 return false;
470 }
471 channelId = chnlId;
472 elink = std::stoi(res[7]);
473 }
474
475 return true;
476}
477
478// buildChannelIdForElx
479bool
480NswDcsDbAlg::buildChannelIdForEltx(Identifier& channelId, const DcsTechType tech, const std::string& chanName, bool& isOK) const {
481
482 // prepare regex
483 std::regex re("^(A|C)_([0-9]{2})_L([0-9])_B([0-9]{2})");
484
485
486 // match regex
487 if(!std::regex_match(chanName, re)) {
488 ATH_MSG_WARNING("Could not identify channel with name "<<chanName);
489 isOK = false;
490 return false;
491 }
492
493 // build channel Id
494 bool isValid{false};
495 std::smatch m;
496 std::regex_match(chanName, m, re);
497
498 // copy to vec of strings
499 std::vector<std::string> res;
500 for(unsigned int i=0; i<m.size(); ++i) res.push_back(m[i].str());
501
502 //extract field common to MM and stgc
503 int wheel = res[1]=="A"? 1 : -1;
504 int sector = std::stoi(res[2])+1;
505 int board = std::stoi(res[4]);
506 int layer = std::stoi(res[3]);
507 int stationPhi = (sector-1)/2+1;
508 int multiLayer = layer< 5 ? 1 : 2; // layers 1-4 are on multilayer 1 and layers 5-8 are on multilayer 2
509 int gasGap = ((layer-1)%4) + 1; // identifies layer within multilayer
510
511
512 // MMG Channel
513 if(tech==DcsTechType::MMG){
514 int stationName = sector%2==0 ? 56 : 55;
515
516 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
517 int radius{0};
518 if(board%4==0){
519 radius = 2*(board/4);
520 } else if (board%4==3) {
521 radius = 2*(board/4) + 1;
522 } else { // not a readout board
523 isOK = true;
524 return false;
525 }
526
527 int stationEta = wheel*(radius<10? 1 : 2); // boards 0-9 are on the first quad, boards 10-15 on the second one
528 Identifier chnlId = m_idHelperSvc->mmIdHelper().febID(stationName, stationEta, stationPhi, multiLayer, gasGap, radius, isValid);
529 if(!isValid){
530 ATH_MSG_WARNING("Could not extract valid channelId for MMG channel "<<chanName);
531 ATH_MSG_WARNING("Fields: "<< wheel << " "<<sector<<" " << stationName<< " " << stationEta<<" "<<stationPhi<<" "<<multiLayer<<" " << gasGap<<" " << radius<<" " << board);
532 isOK = false;
533 return false;
534 }
535 channelId = chnlId;
536 } else if(tech==DcsTechType::STG){
537 int stationName = sector%2==0 ? 58 : 57;
538 board -= 1; // count from 0 while input counts from one
539 uint radius = board/2;
540 int stationEta = wheel*(radius+1);
541 uint channelType{0};
542 if(board>=6){ // not a STG readout board
543 isOK = true;
544 return false;
545 }
546 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
547 if(board%2==0){
549 } else {
551 }
552 } 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
553 if(board%2==0){
555 } else {
557 }
558 }
559 Identifier chnlId = m_idHelperSvc->stgcIdHelper().febID(stationName, stationEta, stationPhi, multiLayer, gasGap, channelType ,isValid);
560 if(!isValid){
561 ATH_MSG_WARNING("Could not extract valid channelId for STG channel "<<chanName);
562 ATH_MSG_WARNING("Fields: "<< wheel << " "<<sector<<" " << stationName<< " " << stationEta<<" "<<stationPhi<<" "<<multiLayer<<" " << gasGap<<" " << radius<<" " << board << " " << channelType);
563 isOK = false;
564 return false;
565 }
566 channelId = chnlId;
567 }
568 return true;
569}
570}
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
ChanAttrListMap::const_iterator const_iterator
static EventIDRange infiniteMixed()
Produces an mixed EventIDRange that is infinite in Time and RunLumi.
readKey_t m_readKey_stg_eltx
Definition NswDcsDbAlg.h:66
NswDcsDbData::DcsTechType DcsTechType
Definition NswDcsDbAlg.h:42
virtual StatusCode initialize() override
readKey_t m_readKey_mmg_eltx
Definition NswDcsDbAlg.h:65
readKey_t m_readKey_stg_hv
Definition NswDcsDbAlg.h:60
Gaudi::Property< bool > m_loadEltx
Definition NswDcsDbAlg.h:69
StatusCode loadHvData(const EventContext &ctx, const readKey_t &readKey, const DcsTechType tech, writeHandleDcs_t &writeHandle, NswDcsDbData *writeCdo) const
bool buildChannelIdForEltx(Identifier &channelId, const DcsTechType tech0, const std::string &chanName, bool &isOK) const
virtual StatusCode execute(const EventContext &) const override
SG::ReadCondHandleKey< CondAttrListCollection > readKey_t
Definition NswDcsDbAlg.h:36
writeKey_t m_writeKey
Definition NswDcsDbAlg.h:57
readKey_t m_readKey_mmg_tdaq
Definition NswDcsDbAlg.h:62
bool buildChannelIdForHv(Identifier &channelId, const DcsTechType tech0, const std::string &chanName, bool &isOK) const
StatusCode loadELTXData(const EventContext &ctx, const readKey_t &readKey, const DcsTechType tech, writeHandleDcs_t &writeHandle, NswDcsDbData *writeCdo) const
SG::WriteCondHandle< NswDcsDbData > writeHandleDcs_t
Definition NswDcsDbAlg.h:38
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Definition NswDcsDbAlg.h:55
StatusCode loadTDaqData(const EventContext &ctx, const readKey_t &readKey, const DcsTechType tech, writeHandleDcs_t &writeHandle, NswDcsDbData *writeCdo) const
SG::ReadCondHandleKey< MuonGM::MuonDetectorManager > m_muonManagerKey
Definition NswDcsDbAlg.h:71
readKey_t m_readKey_mmg_hv
Definition NswDcsDbAlg.h:59
readKey_t m_readKey_stg_tdaq
Definition NswDcsDbAlg.h:63
bool buildChannelIdForTDaq(Identifier &channelId, uint &elink, const DcsTechType tech0, const std::string &chanName, bool &isOK) const
Gaudi::Property< bool > m_loadTdaq
Definition NswDcsDbAlg.h:68
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 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
::StatusCode StatusCode
StatusCode definition for legacy code.
DcsFsmState getFsmStateEnum(const std::string &fsmState)
Definition Defs.cxx:8
NRpcCablingAlg reads raw condition data and writes derived condition data to the condition store.
#define THROW_EXCEPTION(MESSAGE)
Definition throwExcept.h:10