ATLAS Offline Software
Loading...
Searching...
No Matches
ASCIICondDbSvc.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "ASCIICondDbSvc.h"
7
8#include <boost/tokenizer.hpp>
9#include <boost/algorithm/string.hpp>
10#include <boost/regex.hpp>
11
12#include <fstream>
13
14const std::string r_t("\\[([0-9]+),([0-9]+)\\]");
15const std::string r_r = "\\s*\\{" + r_t + "-" + r_t + "\\}\\s*";
16const std::string r_e = "\\s*\\{" + r_t + "-" + r_t + "\\}=([0-9]+)\\s*";
17const std::string r_ef = "\\s*\\{" + r_t + "-" + r_t + "\\}=(-*[0-9]*\\.*[0-9]*)\\s*";
18const boost::regex rr(r_r);
19const boost::regex re(r_e);
20const boost::regex ref(r_ef);
21
22
23//---------------------------------------------------------------------------
24
25ASCIICondDbSvc::ASCIICondDbSvc( const std::string& name, ISvcLocator* svcLoc ):
26 base_class(name,svcLoc)
27{}
28
29//---------------------------------------------------------------------------
30
31StatusCode
33
34 // Initialise mother class in order to print DEBUG messages during initialize()
35 StatusCode sc(AthService::initialize());
36 msg().setLevel( m_outputLevel.value() );
37
38 if (!sc.isSuccess()) {
39 warning () << "Base class could not be initialized" << endmsg;
40 return StatusCode::FAILURE;
41 }
42
43 if (m_file == "") {
44 ATH_MSG_DEBUG("db file not set");
45 return StatusCode::SUCCESS;
46 }
47
48 if (readDbFile(m_file).isFailure()) {
49 return StatusCode::FAILURE;
50 }
51
52 std::ostringstream ost;
53 ost << " Printing CondDB registry";
54 for (const auto& e : m_registry) {
55 ost << std::endl << " - id: " << e.first << " r:";
56 for (const IOVEntryT<IASCIICondDbSvc::dbData_t>& r : e.second) {
57 ost << " " << r.range() << " :: " << *r.objPtr();
58 }
59 }
60
61 ATH_MSG_DEBUG( ost.str() );
62
63 return StatusCode::SUCCESS;
64
65}
66//---------------------------------------------------------------------------
67
68StatusCode
69ASCIICondDbSvc::readDbFile(const std::string& fname) {
70
71 StatusCode sc(StatusCode::SUCCESS);
72
73 ATH_MSG_DEBUG("reading cond db from \"" << fname << "\"");
74
75 std::ifstream ifs (fname);
76 std::string line;
77 if(ifs.is_open()) {
78
79 typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
80 boost::char_separator<char> sep(" ");
81
83
84 while( getline (ifs, line) ) {
85
86 // ignore anything after a "#" and blank lines
87 size_t fh = line.find("#");
88 if(fh != std::string::npos)
89 line.erase(fh,line.length()-fh);
90 if (line.length() == 0) continue;
91
92 tokenizer tokens(line, sep);
93 auto it = tokens.begin();
94
95 std::string dbKey = *it;
96
97 ++it;
98
99 while (it != tokens.end()) {
100 if (parse(ie,*it)) {
101 m_registry[dbKey].push_back( ie );
102 } else {
103 error() << "while reading " << fname << " problem parsing " << *it
104 << " in line\n" << line << endmsg;
105 sc = StatusCode::FAILURE;
106 }
107 ++it;
108 }
109 }
110 ifs.close();
111 } else {
112 error() << "unable to open file " << (std::string) m_file << endmsg;
113 sc = StatusCode::FAILURE;
114 }
115
116 return sc;
117
118}
119//---------------------------------------------------------------------------
120
121void
123
124 std::ostringstream ost;
125 dump(ost);
126
127 info() << ost.str() << endmsg;
128
129}
130
131
132//---------------------------------------------------------------------------
133
134void
135ASCIICondDbSvc::dump(std::ostringstream& ost) const {
136
137 std::lock_guard<std::mutex> lock(m_lock);
138
139 ost << "ASCIICondDbSvc::dump()";
140
141 ost << "\n";
142
143}
144
145//---------------------------------------------------------------------------
146
147StatusCode
149
150 ATH_MSG_DEBUG( "ASCIICondDbSvc::finalize()" );
151
152 if (msgLvl(MSG::DEBUG)) {
153 std::ostringstream ost;
154 dump(ost);
155
156 ATH_MSG_DEBUG( ost.str() );
157 }
158
159 for ( auto e : m_registry ) {
160 for ( auto ie : e.second ) {
161 delete ie.objPtr();
162 ie.setPtr(0);
163 }
164 }
165
166
167 return StatusCode::SUCCESS;
168
169}
170
171//---------------------------------------------------------------------------
172
173bool
174ASCIICondDbSvc::parse(EventIDRange& t, const std::string& s) {
175
176 boost::smatch m;
177 boost::regex_match(s,m,rr);
178
179 // for (auto res : m) {
180 // cout << " - " << res << endl;
181 // }
182
183 if (m.size() != 5) { return false; }
184
185 // set run# and timestamp
186 EventIDBase start(std::stoi(m[1]), EventIDBase::UNDEFEVT, std::stoi(m[2]));
187 EventIDBase end(std::stoi(m[3]), EventIDBase::UNDEFEVT, std::stoi(m[4]));
188
189 start.set_lumi_block(m_lbn);
190 end.set_lumi_block(m_lbn);
191
192 t = EventIDRange(start, end);
193
194 return true;
195
196}
197
198//---------------------------------------------------------------------------
199
200bool
202
203 boost::smatch m;
204 boost::regex_match(s,m,ref);
205
206 if (m.size() != 6) { return false; }
207
208 // set run#, lumi and timestamp
209 // EventIDBase start(std::stoi(m[1]), EventIDBase::UNDEFEVT, std::stoi(m[2]));
210 // EventIDBase end(std::stoi(m[3]), EventIDBase::UNDEFEVT, std::stoi(m[4]));
211 // start.set_lumi_block(m_lbn);
212 // end.set_lumi_block(m_lbn);
213
214 // set lumi and Timestamp
215 EventIDBase start(0, EventIDBase::UNDEFEVT,
216 std::stoi(m[2]));
217 EventIDBase end(EventIDBase::UNDEFNUM, EventIDBase::UNDEFEVT,
218 std::stoi(m[4]));
219 start.set_lumi_block(std::stoi(m[1]));
220 end.set_lumi_block(std::stoi(m[3]));
221
222 // Set Run/Lumi
223 // EventIDBase start(std::stoi(m[1]), EventIDBase::UNDEFEVT);
224 // EventIDBase end(std::stoi(m[3]), EventIDBase::UNDEFEVT);
225 // start.set_lumi_block(std::stoi(m[2]));
226 // end.set_lumi_block(std::stoi(m[4]));
227
228 ie.setRange(EventIDRange(start,end));
229
230 IASCIICondDbSvc::dbData_t *v = new IASCIICondDbSvc::dbData_t( std::stof(m[5]) );
231 ie.setPtr(v);
232
233 return true;
234
235}
236
237//---------------------------------------------------------------------------
238
239StatusCode
240ASCIICondDbSvc::getRange(const std::string& dbKey , const EventContext& ctx,
241 EventIDRange& rng, IASCIICondDbSvc::dbData_t& val) const {
242
243 std::lock_guard<std::mutex> lock(m_lock);
244
245 registry_t::const_iterator itr = m_registry.find(dbKey);
246
247 if (itr == m_registry.end()) {
248 error() << "getRange: no dbKey " << dbKey << " found in registry"
249 << endmsg;
250 return StatusCode::FAILURE;
251 }
252
253 for (const IOVEntryT<IASCIICondDbSvc::dbData_t>& e : itr->second) {
254 debug() << "compare " << e.range() << " with " << ctx.eventID()
255 << endmsg;
256 if (e.range().isInRange(EventIDBase(ctx.eventID()))) {
257 rng = e.range();
258 val = *(e.objPtr());
259 return StatusCode::SUCCESS;
260 }
261 }
262
263 error() << "getRange: no range for Time " << ctx.eventID()
264 << " found for dbKey " << dbKey << endmsg;
265
266 return StatusCode::FAILURE;
267}
const std::string r_e
const boost::regex ref(r_ef)
const boost::regex rr(r_r)
const std::string r_t("\\[([0-9]+),([0-9]+)\\]")
const boost::regex re(r_e)
const std::string r_ef
const std::string r_r
#define endmsg
#define ATH_MSG_DEBUG(x)
Hold mappings of ranges to condition objects.
static Double_t sc
const bool debug
virtual StatusCode getRange(const std::string &, const EventContext &, EventIDRange &, IASCIICondDbSvc::dbData_t &) const override
Gaudi::Property< unsigned int > m_lbn
virtual StatusCode finalize() override
Gaudi::Property< std::string > m_file
virtual StatusCode initialize() override
ASCIICondDbSvc(const std::string &name, ISvcLocator *svc)
registry_t m_registry
std::mutex m_lock
bool parse(EventIDRange &t, const std::string &s)
StatusCode readDbFile(const std::string &)
virtual void dump() const override
int r
Definition globals.cxx:22
MsgStream & msg
Definition testRead.cxx:32