ATLAS Offline Software
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 "GeoModelHelpers/throwExcept.h"
14 
15 // Initialize
18 
19  // retrievals
20  ATH_MSG_DEBUG( "initializing " << name() );
22  ATH_CHECK(m_idHelperSvc.retrieve());
23 
24  // initialize read keys
31 
32  // write key for time/charge data
34 
36 
37  ATH_MSG_INFO("NswDcsAlg is using tdaq "<< m_loadTdaq << " and eltx " << m_loadEltx);
38 
39  return StatusCode::SUCCESS;
40 }
41 
42 // execute
44 NswDcsDbAlg::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  }
56  wrHdl.addDependency(EventIDRange(IOVInfiniteRange::infiniteMixed()));
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
110 StatusCode
111 NswDcsDbAlg::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  }
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 
150  NswDcsDbData::DcsConstants dcs_data{};
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
166 StatusCode
167 NswDcsDbAlg::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
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
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 
217 StatusCode 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
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
263 bool
264 NswDcsDbAlg::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;
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
377 bool
378 NswDcsDbAlg::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;
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]);
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;
466  uint channelType = (res[3] == "Pad" ? sTgcIdHelper::sTgcChannelTypes::Pad : sTgcIdHelper::sTgcChannelTypes::Strip);
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
482 bool
483 NswDcsDbAlg::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
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){
551  channelType=sTgcIdHelper::sTgcChannelTypes::Strip;
552  } else {
553  channelType=sTgcIdHelper::sTgcChannelTypes::Pad;
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){
557  channelType=sTgcIdHelper::sTgcChannelTypes::Pad;
558  } else {
559  channelType=sTgcIdHelper::sTgcChannelTypes::Strip;
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 }
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
NswDcsDbAlg::buildChannelIdForEltx
bool buildChannelIdForEltx(Identifier &channelId, const DcsTechType tech0, const std::string &chanName, bool &isOK) const
Definition: NswDcsDbAlg.cxx:483
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
Muon::nsw::STGTPSegments::moduleIDBits::stationPhi
constexpr uint8_t stationPhi
station Phi 1 to 8
Definition: NSWSTGTPDecodeBitmaps.h:158
NswDcsDbData::DcsTechType
DcsTechType
Definition: NswDcsDbData.h:22
dumpTgcDigiDeadChambers.gasGap
list gasGap
Definition: dumpTgcDigiDeadChambers.py:33
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
NswDcsDbData::DcsTechType::STG
@ STG
NswDcsDbData::setDataEltx
void setDataEltx(const DcsTechType tech, const Identifier &chnlId)
Definition: NswDcsDbData.cxx:100
python.SystemOfUnits.m
int m
Definition: SystemOfUnits.py:91
CondAttrListCollection.h
This file defines the class for a collection of AttributeLists where each one is associated with a ch...
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
PlotCalibFromCool.yy
yy
Definition: PlotCalibFromCool.py:714
json
nlohmann::json json
Definition: HistogramDef.cxx:9
dumpTgcDigiDeadChambers.stationName
dictionary stationName
Definition: dumpTgcDigiDeadChambers.py:30
SG::WriteCondHandle::getRange
const EventIDRange & getRange() const
Definition: WriteCondHandle.h:89
parse
std::map< std::string, std::string > parse(const std::string &list)
Definition: egammaLayerRecalibTool.cxx:1054
NswDcsDbAlg::m_idHelperSvc
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Definition: NswDcsDbAlg.h:65
IOVInfiniteRange::infiniteMixed
static EventIDRange infiniteMixed()
Produces an mixed EventIDRange that is infinite in Time and RunLumi.
Definition: IOVInfiniteRange.h:55
python.PyKernel.AttributeList
AttributeList
Definition: PyKernel.py:36
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
isValid
bool isValid(const T &p)
Definition: AtlasPID.h:225
NswDcsDbAlg::buildChannelIdForTDaq
bool buildChannelIdForTDaq(Identifier &channelId, uint &elink, const DcsTechType tech0, const std::string &chanName, bool &isOK) const
Definition: NswDcsDbAlg.cxx:378
THROW_EXCEPTION
#define THROW_EXCEPTION(MSG)
Definition: MMReadoutElement.cxx:48
SG::VarHandleKey::empty
bool empty() const
Test if the key is blank.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:150
CondAttrListCollection
This class is a collection of AttributeLists where each one is associated with a channel number....
Definition: CondAttrListCollection.h:52
NswDcsDbAlg::m_readKey_stg_tdaq
readKey_t m_readKey_stg_tdaq
Definition: NswDcsDbAlg.h:73
MuonCond::DcsConstants::standbyVolt
float standbyVolt
Definition: MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondData/MuonCondData/Defs.h:32
PrepareReferenceFile.regex
regex
Definition: PrepareReferenceFile.py:43
NswDcsDbAlg::buildChannelIdForHv
bool buildChannelIdForHv(Identifier &channelId, const DcsTechType tech0, const std::string &chanName, bool &isOK) const
Definition: NswDcsDbAlg.cxx:264
NswDcsDbAlg::m_writeKey
writeKey_t m_writeKey
Definition: NswDcsDbAlg.h:67
TileSynchronizeBch.online
online
Definition: TileSynchronizeBch.py:88
uint
unsigned int uint
Definition: LArOFPhaseFill.cxx:20
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
checkCoolLatestUpdate.chanNum
chanNum
Definition: checkCoolLatestUpdate.py:27
NswDcsDbData::DcsTechType::MMD
@ MMD
lumiFormat.i
int i
Definition: lumiFormat.py:85
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
res
std::pair< std::vector< unsigned int >, bool > res
Definition: JetGroupProductTest.cxx:14
MuonCond::DcsConstants
Helper struct to cache all dcs constants in a common place of the memory.
Definition: MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondData/MuonCondData/Defs.h:31
NswDcsDbAlg::loadELTXData
StatusCode loadELTXData(const EventContext &ctx, const readKey_t &readKey, const DcsTechType tech, writeHandleDcs_t &writeHandle, NswDcsDbData *writeCdo) const
Definition: NswDcsDbAlg.cxx:217
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
CaloCondBlobAlgs_fillNoiseFromASCII.channelId
channelId
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:122
NswDcsDbAlg::loadHvData
StatusCode loadHvData(const EventContext &ctx, const readKey_t &readKey, const DcsTechType tech, writeHandleDcs_t &writeHandle, NswDcsDbData *writeCdo) const
Definition: NswDcsDbAlg.cxx:111
checkCorrelInHIST.nLB
int nLB
Definition: checkCorrelInHIST.py:21
NswDcsDbData::DcsTechType::MMG
@ MMG
NswDcsDbAlg::m_loadEltx
Gaudi::Property< bool > m_loadEltx
Definition: NswDcsDbAlg.h:79
IOVInfiniteRange.h
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:221
NswDcsDbData::setDataHv
void setDataHv(const DcsTechType tech, const Identifier &chnlId, DcsConstants constants)
Definition: NswDcsDbData.cxx:50
NswDcsDbAlg::m_readKey_mmg_tdaq
readKey_t m_readKey_mmg_tdaq
Definition: NswDcsDbAlg.h:72
NswDcsDbAlg.h
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
TrigJetMonitorAlgorithm.items
items
Definition: TrigJetMonitorAlgorithm.py:79
NswDcsDbData
Definition: NswDcsDbData.h:19
NswDcsDbAlg::m_readKey_mmg_eltx
readKey_t m_readKey_mmg_eltx
Definition: NswDcsDbAlg.h:75
ParticleGun_SamplingFraction.radius
radius
Definition: ParticleGun_SamplingFraction.py:96
NswDcsDbAlg::execute
virtual StatusCode execute(const EventContext &) const override
Definition: NswDcsDbAlg.cxx:44
SG::ReadCondHandleKey< CondAttrListCollection >
NswDcsDbAlg::m_readKey_stg_eltx
readKey_t m_readKey_stg_eltx
Definition: NswDcsDbAlg.h:76
CondAlgsOpts.found
int found
Definition: CondAlgsOpts.py:101
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
CondAttrListCollection::const_iterator
ChanAttrListMap::const_iterator const_iterator
Definition: CondAttrListCollection.h:63
re
const boost::regex re(r_e)
NswDcsDbAlg::m_loadTdaq
Gaudi::Property< bool > m_loadTdaq
Definition: NswDcsDbAlg.h:78
NswDcsDbAlg::m_readKey_mmg_hv
readKey_t m_readKey_mmg_hv
Definition: NswDcsDbAlg.h:69
MuonCond::getFsmStateEnum
DcsFsmState getFsmStateEnum(const std::string &fsmState)
Definition: Defs.cxx:8
NswDcsDbAlg::loadTDaqData
StatusCode loadTDaqData(const EventContext &ctx, const readKey_t &readKey, const DcsTechType tech, writeHandleDcs_t &writeHandle, NswDcsDbData *writeCdo) const
Definition: NswDcsDbAlg.cxx:167
NswDcsDbData::setDataTDaq
void setDataTDaq(const DcsTechType tech, const Identifier &chnlId, uint64_t timeSince, uint64_t timeUntil, unsigned int elink, bool permanentlyDisabled)
Definition: NswDcsDbData.cxx:87
NswDcsDbAlg::initialize
virtual StatusCode initialize() override
Definition: NswDcsDbAlg.cxx:17
NswDcsDbAlg::m_condSvc
ServiceHandle< ICondSvc > m_condSvc
Definition: NswDcsDbAlg.h:64
Muon::nsw::STGTPSegments::moduleIDBits::stationEta
constexpr uint8_t stationEta
1 to 3
Definition: NSWSTGTPDecodeBitmaps.h:156
NswDcsDbAlg::m_muonManagerKey
SG::ReadCondHandleKey< MuonGM::MuonDetectorManager > m_muonManagerKey
Definition: NswDcsDbAlg.h:81
sTgcDigitEffiDump.multiLayer
int multiLayer
Definition: sTgcDigitEffiDump.py:36
SG::WriteCondHandle
Definition: WriteCondHandle.h:26
NswDcsDbAlg::m_readKey_stg_hv
readKey_t m_readKey_stg_hv
Definition: NswDcsDbAlg.h:70
IMuonIdHelperSvc.h
SG::WriteCondHandle::addDependency
void addDependency(const EventIDRange &range)
Definition: WriteCondHandle.h:275
Identifier
Definition: IdentifierFieldParser.cxx:14