ATLAS Offline Software
SCT_TdaqEnabledCondAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
8 
9 #include <memory>
10 
11 SCT_TdaqEnabledCondAlg::SCT_TdaqEnabledCondAlg(const std::string& name, ISvcLocator* pSvcLocator)
12  : ::AthReentrantAlgorithm(name, pSvcLocator)
13 {
14 }
15 
17 {
18  ATH_MSG_DEBUG("initialize " << name());
19 
20  // SCT cabling tool
21  ATH_CHECK(m_cablingTool.retrieve());
22 
23  // Read Cond Handle
25 
26  // Write Cond Handle
28 
29  return StatusCode::SUCCESS;
30 }
31 
32 StatusCode SCT_TdaqEnabledCondAlg::execute(const EventContext& ctx) const
33 {
34  ATH_MSG_DEBUG("execute " << name());
35 
36  // Write Cond Handle
38 
39  // Do we have a valid Write Cond Handle for current time?
40  if (writeHandle.isValid()) {
41  ATH_MSG_DEBUG("CondHandle " << writeHandle.fullKey() << " is already valid."
42  << ". In theory this should not be called, but may happen"
43  << " if multiple concurrent events are being processed out of order.");
44  return StatusCode::SUCCESS;
45  }
46 
47  // Construct the output Cond Object and fill it in
48  std::unique_ptr<SCT_TdaqEnabledCondData> writeCdo{std::make_unique<SCT_TdaqEnabledCondData>()};
49  // clear structures before filling
50  writeCdo->clear();
51 
52  // Define validity of the output cond obbject and record it
53  EventIDRange rangeW;
54 
55  // check whether we expect valid data at this time
56  if (unfilledRun(ctx)) {
57  EventIDBase unfilledStart{0, 0, 0, 0}; // run 0, event 0, timestamp 0, timestamp_ns 0
58  EventIDBase unfilledStop{s_earliestRunForFolder, 0, s_earliestTimeStampForFolder, 0}; // run 119253, event 0, timestamp 1245064619, timestamp_ns 0
59  EventIDRange unfilledRange{unfilledStart, unfilledStop};
60  rangeW = unfilledRange;
61  writeCdo->setNoneBad(true);
62  writeCdo->setFilled(true);
63  } else {
64  // Read Cond Handle
66  const CondAttrListCollection* readCdo{*readHandle};
67  if (readCdo==nullptr) {
68  ATH_MSG_FATAL("Null pointer to the read conditions object");
69  return StatusCode::FAILURE;
70  }
71 
72  ATH_MSG_INFO("Size of CondAttrListCollection readCdo->size()= " << readCdo->size());
73 
74  CondAttrListCollection::const_iterator attrList{readCdo->begin()};
76  // CondAttrListCollection doesnt support C++11 type loops, no generic 'begin'
77  for (; attrList!=end; ++attrList) {
78  // A CondAttrListCollection is a map of ChanNum and AttributeList
79  CondAttrListCollection::ChanNum channelNumber{attrList->first};
80  const CondAttrListCollection::AttributeList &payload{attrList->second};
81  const std::string &enabled{payload["class"].data<std::string>()};
82  const std::string& chanName{readCdo->chanName(channelNumber)};
83  unsigned int rodNumber{parseChannelName(chanName)};
84  // range check on the rod channel number has been removed, since it refers both to existing channel names
85  // which can be rods in slots 1-128 but also historical names which have since been removed
86  if (SCT_OnlineId::rodIdInRange(rodNumber)) {
87  if ((not enabled.empty()) and (not writeCdo->setGoodRod(rodNumber))) {
88  ATH_MSG_WARNING("Set insertion failed for rod "<<rodNumber);
89  }
90  } else {
91  ATH_MSG_WARNING("Names in "<<m_readKey.key()<<" should be of the form ROL-SCT-BA-00-210000 this channel, number "<<channelNumber<<", is: "<<chanName);
92  }
93  }
94 
95  if (writeCdo->getGoodRods().size()>s_NRODS) {
96  ATH_MSG_FATAL("The number of rods declared as good appears to be greater than the permissible number of rods ("<<s_NRODS<<")");
97  writeCdo->setFilled(false);
98  return StatusCode::FAILURE;
99  }
100 
101  long unsigned int nBad{s_NRODS-writeCdo->getGoodRods().size()};
102  std::string howMany{inWords(nBad)};
103  ATH_MSG_DEBUG(howMany << " declared bad in the database.");
104 
105  // provide short-cut for no rods bad (hopefully the most common case)
106  writeCdo->setNoneBad(nBad==0);
107  if (writeCdo->isNoneBad()) {
108  writeCdo->setFilled(true);
109  } else {
110  // now find the modules which belong to those rods...
111  // const int modulesPerRod(48);
112  std::vector<IdentifierHash> tmpIdVec{0};
113  tmpIdVec.reserve(s_modulesPerRod);
114  for (const auto& thisRod : writeCdo->getGoodRods()) {
115  tmpIdVec.clear();
116  m_cablingTool->getHashesForRod(tmpIdVec, thisRod, ctx);
117  writeCdo->setGoodModules(tmpIdVec);
118  }
119  writeCdo->setFilled(true);
120  }
121 
122  if (not readHandle.range(rangeW)) {
123  ATH_MSG_FATAL("Failed to retrieve validity range for " << readHandle.key());
124  return StatusCode::FAILURE;
125  }
126  }
127 
128  if (writeHandle.record(rangeW, std::move(writeCdo)).isFailure()) {
129  ATH_MSG_FATAL("Could not record SCT_TdaqEnabledCondData " << writeHandle.key()
130  << " with EventRange " << rangeW
131  << " into Conditions Store");
132  return StatusCode::FAILURE;
133  }
134  ATH_MSG_INFO("recorded new CDO " << writeHandle.key() << " with range " << rangeW << " into Conditions Store");
135 
136  return StatusCode::SUCCESS;
137 }
138 
140 {
141  ATH_MSG_DEBUG("finalize " << name());
142  return StatusCode::SUCCESS;
143 }
144 
145 bool SCT_TdaqEnabledCondAlg::unfilledRun(const EventContext& ctx) const {
146  const unsigned int runNumber{ctx.eventID().run_number()};
147  const bool noDataExpected{runNumber < s_earliestRunForFolder};
148  if (noDataExpected) ATH_MSG_INFO("This run occurred before the /TDAQ/EnabledResources/ATLAS/SCT/Robins folder was filled in COOL; assuming the SCT is all ok.");
149  return noDataExpected;
150 }
151 
152 //parse a rod channel name to a rod number, names are of the format 'ROL-SCT-BA-00-210000'
153 //October 2014: names can now also be of format 'ROL-SCT-B-00-210100'
154 unsigned int SCT_TdaqEnabledCondAlg::parseChannelName(const std::string &chanNameString) {
155  unsigned int result{0};
156  const long unsigned int length{chanNameString.size()};
157  if (length < 19) return result; //very rough check on sanity of string, should use regex
158  //get the last six numbers, these are in hex
159  std::istringstream iss{chanNameString.substr(length-6, 6)};
160  iss.exceptions(std::ios_base::badbit|std::ios_base::failbit);
161  try{
162  iss>>std::hex>>result;
163  } catch (const std::ios_base::failure&){ //bad conversion to int
164  std::cerr<<"Bad conversion of last 6 digits of "<<chanNameString<<" to a hex number"<<std::endl;
165  throw(std::ios_base::failure("stringToInt failure in SCT_TdaqEnabledSvc"));
166  }
167  return result;
168 }
169 
170 std::string SCT_TdaqEnabledCondAlg::inWords(const unsigned int aNumber) {
171  switch (aNumber){
172  case 0:
173  return std::string("No SCT rods were");
174  break;
175  case 1:
176  return std::string("One SCT rod was");
177  break;
178  default:
179  return std::to_string(aNumber) + " SCT rods were"; //C++11
180  break;
181  }
182 }
183 
184 const unsigned int SCT_TdaqEnabledCondAlg::s_NRODS{128};
185 const unsigned int SCT_TdaqEnabledCondAlg::s_modulesPerRod{48};
186 const unsigned int SCT_TdaqEnabledCondAlg::s_earliestRunForFolder{119253};
187 const unsigned int SCT_TdaqEnabledCondAlg::s_earliestTimeStampForFolder{1245064619}; // 20090615T111659 UTC for run 119253
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
get_generator_info.result
result
Definition: get_generator_info.py:21
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
SCT_TdaqEnabledCondAlg::s_earliestRunForFolder
static const unsigned int s_earliestRunForFolder
Definition: SCT_TdaqEnabledCondAlg.h:43
SCT_TdaqEnabledCondAlg::s_earliestTimeStampForFolder
static const unsigned int s_earliestTimeStampForFolder
Definition: SCT_TdaqEnabledCondAlg.h:44
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
CondAttrListCollection
This class is a collection of AttributeLists where each one is associated with a channel number....
Definition: CondAttrListCollection.h:52
SCT_TdaqEnabledCondAlg::s_NRODS
static const unsigned int s_NRODS
Definition: SCT_TdaqEnabledCondAlg.h:41
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:93
SCT_OnlineId::rodIdInRange
static bool rodIdInRange(std::uint32_t r)
Is the rod in range?
Definition: SCT_OnlineId.cxx:93
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:83
SCT_TdaqEnabledCondAlg::finalize
virtual StatusCode finalize() override final
Definition: SCT_TdaqEnabledCondAlg.cxx:139
SCT_TdaqEnabledCondAlg::execute
virtual StatusCode execute(const EventContext &ctx) const override final
Definition: SCT_TdaqEnabledCondAlg.cxx:32
SCT_TdaqEnabledCondAlg::m_writeKey
SG::WriteCondHandleKey< SCT_TdaqEnabledCondData > m_writeKey
Definition: SCT_TdaqEnabledCondAlg.h:36
SCT_TdaqEnabledCondAlg::initialize
virtual StatusCode initialize() override final
Definition: SCT_TdaqEnabledCondAlg.cxx:16
SCT_TdaqEnabledCondAlg::SCT_TdaqEnabledCondAlg
SCT_TdaqEnabledCondAlg(const std::string &name, ISvcLocator *pSvcLocator)
Definition: SCT_TdaqEnabledCondAlg.cxx:11
SCT_TdaqEnabledCondAlg::m_readKey
SG::ReadCondHandleKey< CondAttrListCollection > m_readKey
Definition: SCT_TdaqEnabledCondAlg.h:35
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
SCT_TdaqEnabledCondAlg::s_modulesPerRod
static const unsigned int s_modulesPerRod
Definition: SCT_TdaqEnabledCondAlg.h:42
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
CondAttrListCollection::ChanNum
unsigned int ChanNum
Definition: CondAttrListCollection.h:55
SCT_TdaqEnabledCondAlg::inWords
static std::string inWords(const unsigned int aNumber)
Definition: SCT_TdaqEnabledCondAlg.cxx:170
SCT_TdaqEnabledCondAlg::unfilledRun
bool unfilledRun(const EventContext &ctx) const
Definition: SCT_TdaqEnabledCondAlg.cxx:145
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
IdentifierHash.h
SCT_TdaqEnabledCondAlg.h
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
PixelModuleFeMask_create_db.payload
string payload
Definition: PixelModuleFeMask_create_db.py:69
DeMoAtlasDataLoss.runNumber
string runNumber
Definition: DeMoAtlasDataLoss.py:64
SCT_TdaqEnabledCondAlg::parseChannelName
static unsigned int parseChannelName(const std::string &chanNameString)
Definition: SCT_TdaqEnabledCondAlg.cxx:154
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
CondAttrListCollection::const_iterator
ChanAttrListMap::const_iterator const_iterator
Definition: CondAttrListCollection.h:63
SCT_TdaqEnabledCondAlg::m_cablingTool
ToolHandle< ISCT_CablingTool > m_cablingTool
Definition: SCT_TdaqEnabledCondAlg.h:37
ReadBchFromCool.nBad
nBad
Definition: ReadBchFromCool.py:455
CondAttrListCollection::AttributeList
coral::AttributeList AttributeList
Definition: CondAttrListCollection.h:56
SG::WriteCondHandle
Definition: WriteCondHandle.h:26
length
double length(const pvec &v)
Definition: FPGATrackSimLLPDoubletHoughTransformTool.cxx:26