ATLAS Offline Software
Loading...
Searching...
No Matches
RpcCondDbAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "RpcCondDbAlg.h"
6
8
9namespace Muon{
10// Initialize
12 ATH_MSG_DEBUG("initializing " << name());
13 ATH_CHECK(m_idHelperSvc.retrieve());
14 ATH_CHECK(m_writeKey.initialize());
16 return StatusCode::SUCCESS;
17}
18
19template <class WriteCont>
20 StatusCode RpcCondDbAlg::addCondDependency(const EventContext& ctx,
22 SG::WriteCondHandle<WriteCont>& writeHandle) const {
23 if (key.empty()) {
24 return StatusCode::SUCCESS;
25 }
26 SG::ReadCondHandle<CondAttrListCollection> readCondHandle{key, ctx};
27 ATH_CHECK(readCondHandle.isValid());
28 writeHandle.addDependency(readCondHandle);
29 return StatusCode::SUCCESS;
30 }
31
32// execute
33StatusCode RpcCondDbAlg::execute(const EventContext& ctx) const {
34 ATH_MSG_DEBUG("execute " << name());
35
36 // launching Write Cond Handle
38 if (writeHandle.isValid()) {
39 ATH_MSG_DEBUG("CondHandle " << writeHandle.fullKey() << " is already valid."
40 << " In theory this should not be called, but may happen"
41 << " if multiple concurrent events are being processed out of order.");
42 return StatusCode::SUCCESS;
43 }
46
47 std::unique_ptr<RpcCondDbData> writeCdo{std::make_unique<RpcCondDbData>()};
48 // data and MC
49 ATH_CHECK(loadMcElementStatus(ctx, *writeCdo));
50
51 ATH_CHECK(writeHandle.record(std::move(writeCdo)));
52 ATH_MSG_DEBUG("Recorded new " << writeHandle.key() << " with range " << writeHandle.getRange() << " into Conditions Store");
53
54 return StatusCode::SUCCESS;
55}
56// loadMcElementStatus
57StatusCode RpcCondDbAlg::loadMcElementStatus(const EventContext& ctx, RpcCondDbData& writeCdo) const {
59 ATH_CHECK(readCdo.isValid());
60
61 ATH_MSG_DEBUG("Size of CondAttrListCollection " << readCdo.fullKey() << " readCdo->size()= " << readCdo->size());
62
64 unsigned int chan_index = 0;
65 unsigned int iFracDeadStrip = 0;
66 for (itr = readCdo->begin(); itr != readCdo->end(); ++itr) {
67 const coral::AttributeList& atr = itr->second;
68 CondAttrListCollection::ChanNum channum = itr->first;
69 Identifier chamberId{channum};
70 try{
71 if (!m_idHelperSvc->rpcIdHelper().valid(chamberId)){
72 ATH_MSG_WARNING("Database contains non-sense");
73 continue;
74 }
75 } catch (const std::exception& e) {
76 ATH_MSG_WARNING("Just forget about the database. It's doomed.");
77 continue;
78 }
79
80
81 std::string eff_panel, striplist, eff;
82
83 eff_panel = *(static_cast<const std::string*>((atr["PanelRes"]).addressOfData()));
84 striplist = *(static_cast<const std::string*>((atr["StripStatus"]).addressOfData()));
85
86 ATH_MSG_DEBUG("-----------------------------entry #" << chan_index);
87 ATH_MSG_DEBUG("channel ID = Panel ID " << channum << " as identif. = " << m_idHelperSvc->toString(chamberId));
88 ATH_MSG_DEBUG("eff_panel load is " << eff_panel);
89 ATH_MSG_DEBUG("striplist load is " << striplist << " " << striplist.size());
90
91 // Efficiencies and Cluster Sizes
92 constexpr std::string_view delimiter{" "};
93 const auto info_panel = CxxUtils::tokenize(eff_panel, delimiter);
94
95 int DBversion = CxxUtils::atoi(info_panel[0]);
96
97 int npanelstrip = CxxUtils::atoi(info_panel[2]);
98
99 double ProjectedTracks = CxxUtils::atof(info_panel[1]);
100 writeCdo.setProjectedTrack(chamberId, ProjectedTracks);
101
102 double Efficiency = CxxUtils::atof(info_panel[3]);
103 writeCdo.setEfficiency(chamberId, Efficiency);
104
105
106 double GapEfficiency = CxxUtils::atof(info_panel[5]);
107 writeCdo.setGapEfficiency(chamberId, GapEfficiency);
108
109 double MeanClusterSize = CxxUtils::atof(info_panel[17]);
110 writeCdo.setMeanClusterSize(chamberId, MeanClusterSize);
111
112 if (DBversion > 2) {
113 double FracClusterSize1 = CxxUtils::atof(info_panel[19]) + CxxUtils::atof(info_panel[20]) * 10000;
114 writeCdo.setFracClusterSize1(chamberId, FracClusterSize1);
115
116 double FracClusterSize2 = CxxUtils::atof(info_panel[21]) + CxxUtils::atof(info_panel[22]) * 10000;
117 writeCdo.setFracClusterSize2(chamberId, FracClusterSize2);
118 } else {
119 if (info_panel.size() > 20) {
120 double FracClusterSize1 = CxxUtils::atof(info_panel[19]);
121 writeCdo.setFracClusterSize1(chamberId, FracClusterSize1);
122
123 double FracClusterSize2 = CxxUtils::atof(info_panel[20]);
124 writeCdo.setFracClusterSize2(chamberId, FracClusterSize2);
125 } else {
126 writeCdo.setFracClusterSize1(chamberId, 0.6);
127 writeCdo.setFracClusterSize2(chamberId, 0.2);
128 ATH_MSG_DEBUG("Panel with incomplete info in the DB, size = " << info_panel.size() << " instead of required >20");
129 ATH_MSG_DEBUG("PanelId = " << channum << " = " << m_idHelperSvc->toString(chamberId));
130 ATH_MSG_DEBUG("Cluster Size 1 and 2 fractions are set to 0.6 and 0.2 for this chamber.");
131 }
132 }
133
134 // strip status
135 // n chars = #strips (status between 0--9)
136 int countdeadstrip = 0;
137 int countdeadstripinfidarea = 0;
138 int countpanelstrip = 0;
139
140 // update for the timing and error on timing
141 // new info strip |status time error_on_time|
142 constexpr std::string_view delimiter_strip{"|"};
143
144
145 const auto info_strip= CxxUtils::tokenize(striplist, delimiter_strip);
146 if (info_strip.size() > 1) {
147 for (unsigned int i = 0; i < info_strip.size(); ++i) {
148 const std::string &ch_strip2 = info_strip[i];
149
150 constexpr std::string_view delimiter_strip2{" "};
151
152 auto info_strip2 = CxxUtils::tokenize(ch_strip2, delimiter_strip2);
153
154 double Time = CxxUtils::atof(info_strip2[1]);
155 double SigmaTime = CxxUtils::atof(info_strip2[2]);
156 const auto &strip_status = info_strip2[0];
157
158
159 Identifier strip_id;
161 stripnum = channum + i * 4;
162 strip_id = channum + i * 4;
163
164 ATH_MSG_DEBUG("strip " << strip_id << " has time " << Time << " and " << SigmaTime);
165
166 writeCdo.setStripTime(strip_id, std::vector<double>{Time, SigmaTime});
167
168 ATH_MSG_VERBOSE("strip #" << i + 1 << " strip_id " << stripnum << " expanded "
169 << m_idHelperSvc->toString(strip_id));
170
171 ++countpanelstrip;
172
173 if (strip_status[0] == '0') {
174 ++countdeadstrip;
175 if (i > 1 && i < info_strip.size() - 2) {
176 // strip in the fiducial area for the efficiency measurement
177 ++countdeadstripinfidarea;
178 }
179 }
180 }
181 } else {
182 ATH_MSG_DEBUG("no timing info");
183
184 for (unsigned int i = 0; i < striplist.size(); i++) {
185 char part_strip = striplist[i];
186
187 char ch_panel = part_strip;
188
189
190 CondAttrListCollection::ChanNum stripnum = channum + i * 4;
191 Identifier strip_id{channum + i * 4};
192
193 ATH_MSG_VERBOSE("strip #" << i + 1 << " info_strip " << part_strip << " strip_id " << stripnum << " expanded "
194 << m_idHelperSvc->toString(strip_id) << " panel = " << ch_panel);
195
196 ++countpanelstrip;
197
198 if (part_strip == '0') {
199 ++countdeadstrip;
200 if (i > 1 && i < striplist.size() - 2) {
201 // strip in the fiducial area for the efficiency measurement
202 ++countdeadstripinfidarea;
203 }
204 }
205 }
206 }
207
208 if (countpanelstrip != npanelstrip)
210 "WARNING (no side effects for this, just a reminder for a proper fix of the DB content) no matching strip number!!! "
211 << countpanelstrip << " != " << npanelstrip << " Identifier: " << channum);
212
213 float FracDeadStripMap = 0;
214 if (countpanelstrip - 4 > 0) FracDeadStripMap = float(countdeadstripinfidarea) / float(countpanelstrip - 4);
215
216 // store in the suitabel maps
217 writeCdo.setFracDeadStrip(chamberId, FracDeadStripMap);
218 ++iFracDeadStrip;
219
220 std::stringstream ss;
221 if (msgLvl(MSG::DEBUG)) {
222 ss << "Size of RPC_PanelFracDeadStripMap " << iFracDeadStrip << "; in panel ";
223 ss << channum << " FracDeadStri(in fid.area) " << FracDeadStripMap << " (incl. borders) ";
224 if (countpanelstrip == 0)
225 ss << "DIVISION BY ZERO IMPOSSIBLE";
226 else
227 ss << float(countdeadstrip) / float(countpanelstrip);
228 ss << " nDeadStrips,InFidArea/nStrips " << countdeadstrip << ",";
229 ss << countdeadstripinfidarea << "/" << countpanelstrip;
230 ATH_MSG_DEBUG(ss.str());
231 }
232
233 ATH_MSG_DEBUG("Efficiency is " << Efficiency << " and fraction is " << FracDeadStripMap << " and thus "
234 << Efficiency - (0.99 - FracDeadStripMap));
235
236 if (msgLvl(MSG::DEBUG) && Efficiency - (0.99 - FracDeadStripMap) > 0. &&
237 (Efficiency < 0.995 || FracDeadStripMap > 0.01) && (Efficiency > 0.005 || FracDeadStripMap < 0.99)) {
238 std::stringstream msg;
239 msg << "WARNING: Inconsistent panel eff.=" << Efficiency << " and 0.99-dead_frac=" << 0.99 - FracDeadStripMap
240 << " nDeadStrips,InFidArea/nStrips " << countdeadstrip << "," << countdeadstripinfidarea << "/" << countpanelstrip
241 << " for panelId=" << m_idHelperSvc->toString(chamberId);
242 if (Efficiency - (0.99 - FracDeadStripMap) > 0.2)
243 msg << " difference >0.2";
244 else if (Efficiency - (0.99 - FracDeadStripMap) > 0.1)
245 msg << " difference >0.1";
246 else if (Efficiency - (0.99 - FracDeadStripMap) > 0.05)
247 msg << " difference >0.05";
248 else if (Efficiency - (0.99 - FracDeadStripMap) > 0.025)
249 msg << " difference >0.025";
250 else if (Efficiency - (0.99 - FracDeadStripMap) > 0.01)
251 msg << " difference >0.01";
252 else
253 msg << " difference >0 but <=0.01";
254 ATH_MSG_DEBUG(msg.str());
255 }
256
257 }
258 return StatusCode::SUCCESS;
259}
260}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(x,...)
static Double_t ss
bool msgLvl(const MSG::Level lvl) const
ChanAttrListMap::const_iterator const_iterator
static EventIDRange infiniteMixed()
Produces an mixed EventIDRange that is infinite in Time and RunLumi.
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
StatusCode addCondDependency(const EventContext &ctx, const SG::ReadCondHandleKey< CondAttrListCollection > &key, SG::WriteCondHandle< WriteCont > &writeHandle) const
StatusCode loadMcElementStatus(const EventContext &ctx, RpcCondDbData &condData) const
SG::WriteCondHandleKey< RpcCondDbData > m_writeKey
virtual StatusCode execute(const EventContext &) const override
SG::ReadCondHandleKey< CondAttrListCollection > m_readKey_folder_mc_deadElements
virtual StatusCode initialize() override
void setEfficiency(Identifier, double)
void setFracDeadStrip(Identifier, double)
void setFracClusterSize1(Identifier, double)
void setProjectedTrack(Identifier, int)
void setGapEfficiency(Identifier, double)
void setMeanClusterSize(Identifier, double)
void setFracClusterSize2(Identifier, double)
void setStripTime(Identifier, const std::vector< double > &)
const DataObjID & fullKey() const
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
std::string eff_panel[4][6]
static const std::string delimiter("/")
double atof(std::string_view str)
Converts a string into a double / float.
std::vector< std::string > tokenize(std::string_view the_str, std::string_view delimiters)
Splits the string into smaller substrings.
int atoi(std::string_view str)
Helper functions to unpack numbers decoded in string into integers and doubles The strings are requir...
NRpcCablingAlg reads raw condition data and writes derived condition data to the condition store.
a structure to hold an efficiency together with a variable number of uncertainties