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