ATLAS Offline Software
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
10 RpcCondDbAlg::RpcCondDbAlg(const std::string& name, ISvcLocator* pSvcLocator) :
11  AthReentrantAlgorithm(name, pSvcLocator) {}
12 
13 // Initialize
15  ATH_MSG_DEBUG("initializing " << name());
16  ATH_CHECK(m_idHelperSvc.retrieve());
19  return StatusCode::SUCCESS;
20 }
21 
22 template <class WriteCont>
25  SG::WriteCondHandle<WriteCont>& writeHandle) const {
26  if (key.empty()) {
27  return StatusCode::SUCCESS;
28  }
30  ATH_CHECK(readCondHandle.isValid());
31  writeHandle.addDependency(readCondHandle);
32  return StatusCode::SUCCESS;
33  }
34 
35 // execute
36 StatusCode 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  }
47  writeHandle.addDependency(IOVInfiniteRange::infiniteMixed());
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
60 StatusCode 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 }
PowhegControl_ttHplus_NLO.ss
ss
Definition: PowhegControl_ttHplus_NLO.py:83
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
RpcCondDbData::setGapEfficiency
void setGapEfficiency(Identifier, double)
Definition: RpcCondDbData.cxx:20
CxxUtils::tokenize
std::vector< std::string > tokenize(const std::string &the_str, std::string_view delimiters)
Splits the string into smaller substrings.
Definition: Control/CxxUtils/Root/StringUtils.cxx:15
RpcCondDbAlg.h
IOVInfiniteRange::infiniteMixed
static EventIDRange infiniteMixed()
Produces an mixed EventIDRange that is infinite in Time and RunLumi.
Definition: IOVInfiniteRange.h:55
AthCommonMsg< Gaudi::Algorithm >::msgLvl
bool msgLvl(const MSG::Level lvl) const
Definition: AthCommonMsg.h:30
RpcCondDbAlg::m_writeKey
SG::WriteCondHandleKey< RpcCondDbData > m_writeKey
Definition: RpcCondDbAlg.h:48
python.PyKernel.AttributeList
AttributeList
Definition: PyKernel.py:36
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
SG::VarHandleKey::empty
bool empty() const
Test if the key is blank.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:150
RpcCondDbData::setFracClusterSize1
void setFracClusterSize1(Identifier, double)
Definition: RpcCondDbData.cxx:11
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:83
AthExHiveOpts.Time
Time
Definition: AthExHiveOpts.py:63
RpcCondDbAlg::initialize
virtual StatusCode initialize() override
Definition: RpcCondDbAlg.cxx:14
python.AthDsoLogger.delimiter
delimiter
Definition: AthDsoLogger.py:71
lumiFormat.i
int i
Definition: lumiFormat.py:85
RpcCondDbData
Definition: RpcCondDbData.h:24
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
RpcCondDbData::setFracClusterSize2
void setFracClusterSize2(Identifier, double)
Definition: RpcCondDbData.cxx:14
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
RpcCondDbAlg::loadMcElementStatus
StatusCode loadMcElementStatus(const EventContext &ctx, RpcCondDbData &condData) const
Definition: RpcCondDbAlg.cxx:60
CondAttrListCollection::ChanNum
unsigned int ChanNum
Definition: CondAttrListCollection.h:55
CxxUtils::atof
double atof(std::string_view str)
Converts a string into a double / float.
Definition: Control/CxxUtils/Root/StringUtils.cxx:91
IOVInfiniteRange.h
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
RpcCondDbData::setMeanClusterSize
void setMeanClusterSize(Identifier, double)
Definition: RpcCondDbData.cxx:23
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
RpcCondDbAlg::m_idHelperSvc
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Definition: RpcCondDbAlg.h:46
SG::ReadCondHandleKey< CondAttrListCollection >
RpcCondDbData::setStripTime
void setStripTime(Identifier, const std::vector< double > &)
Definition: RpcCondDbData.cxx:30
RpcCondDbAlg::m_readKey_folder_mc_deadElements
SG::ReadCondHandleKey< CondAttrListCollection > m_readKey_folder_mc_deadElements
Definition: RpcCondDbAlg.h:50
RpcCondDbAlg::addCondDependency
StatusCode addCondDependency(const EventContext &ctx, const SG::ReadCondHandleKey< CondAttrListCollection > &key, SG::WriteCondHandle< WriteCont > &writeHandle) const
Definition: RpcCondDbAlg.cxx:23
RpcCondDbData::setEfficiency
void setEfficiency(Identifier, double)
Definition: RpcCondDbData.cxx:8
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
CondAttrListCollection::const_iterator
ChanAttrListMap::const_iterator const_iterator
Definition: CondAttrListCollection.h:63
DEBUG
#define DEBUG
Definition: page_access.h:11
AthCommonMsg< Gaudi::Algorithm >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
CxxUtils::atoi
int atoi(std::string_view str)
Helper functions to unpack numbers decoded in string into integers and doubles The strings are requir...
Definition: Control/CxxUtils/Root/StringUtils.cxx:85
RpcCondDbData::setFracDeadStrip
void setFracDeadStrip(Identifier, double)
Definition: RpcCondDbData.cxx:17
dqt_zlumi_alleff_HIST.eff
int eff
Definition: dqt_zlumi_alleff_HIST.py:113
eff_panel
std::string eff_panel[4][6]
Definition: default_panels.h:98
SG::WriteCondHandle
Definition: WriteCondHandle.h:26
readCCLHist.float
float
Definition: readCCLHist.py:83
RpcCondDbData::setProjectedTrack
void setProjectedTrack(Identifier, int)
Definition: RpcCondDbData.cxx:26
RpcCondDbAlg::RpcCondDbAlg
RpcCondDbAlg(const std::string &name, ISvcLocator *svc)
Definition: RpcCondDbAlg.cxx:10
RpcCondDbAlg::execute
virtual StatusCode execute(const EventContext &) const override
Definition: RpcCondDbAlg.cxx:36
SG::WriteCondHandle::addDependency
void addDependency(const EventIDRange &range)
Definition: WriteCondHandle.h:275
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
Identifier
Definition: IdentifierFieldParser.cxx:14