ATLAS Offline Software
Loading...
Searching...
No Matches
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
11SCT_TdaqEnabledCondAlg::SCT_TdaqEnabledCondAlg(const std::string& name, ISvcLocator* pSvcLocator)
12 : ::AthCondAlgorithm(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
24 ATH_CHECK(m_readKey.initialize());
25
26 // Write Cond Handle
27 ATH_CHECK(m_writeKey.initialize());
28
29 return StatusCode::SUCCESS;
30}
31
32StatusCode 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
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
145bool 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'
154unsigned 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
170std::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
184const unsigned int SCT_TdaqEnabledCondAlg::s_NRODS{128};
185const unsigned int SCT_TdaqEnabledCondAlg::s_modulesPerRod{48};
186const unsigned int SCT_TdaqEnabledCondAlg::s_earliestRunForFolder{119253};
187const unsigned int SCT_TdaqEnabledCondAlg::s_earliestTimeStampForFolder{1245064619}; // 20090615T111659 UTC for run 119253
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
double length(const pvec &v)
Base class for conditions algorithms.
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
coral::AttributeList AttributeList
static bool rodIdInRange(std::uint32_t r)
Is the rod in range?
static unsigned int parseChannelName(const std::string &chanNameString)
static const unsigned int s_modulesPerRod
static const unsigned int s_NRODS
static const unsigned int s_earliestRunForFolder
ToolHandle< ISCT_CablingTool > m_cablingTool
virtual StatusCode execute(const EventContext &ctx) const override final
SG::ReadCondHandleKey< CondAttrListCollection > m_readKey
virtual StatusCode finalize() override final
SCT_TdaqEnabledCondAlg(const std::string &name, ISvcLocator *pSvcLocator)
SG::WriteCondHandleKey< SCT_TdaqEnabledCondData > m_writeKey
virtual StatusCode initialize() override final
bool unfilledRun(const EventContext &ctx) const
static std::string inWords(const unsigned int aNumber)
static const unsigned int s_earliestTimeStampForFolder
bool range(EventIDRange &r)
const std::string & key() const
const std::string & key() const
StatusCode record(const EventIDRange &range, T *t)
record handle, with explicit range DEPRECATED
const DataObjID & fullKey() const