ATLAS Offline Software
Loading...
Searching...
No Matches
CoolQuery.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5#ifndef COOLQUERY_H
6#define COOLQUERY_H
7
8// Cool access
9#include "CoolKernel/Exception.h"
10#include "CoolKernel/FolderSpecification.h"
11#include "CoolKernel/IDatabaseSvc.h"
12#include "CoolKernel/IDatabase.h"
13#include "CoolKernel/IFolder.h"
14#include "CoolKernel/IFolderSet.h"
15#include "CoolKernel/IObject.h"
16#include "CoolKernel/IObjectIterator.h"
17#include "CoolKernel/pointers.h"
18#include "CoolApplication/DatabaseSvcFactory.h"
20
21#include "RelationalAccess/IConnectionServiceConfiguration.h"
22#include "RelationalAccess/ConnectionService.h"
23#include "RelationalAccess/ISessionProxy.h"
24#include "RelationalAccess/ITransaction.h"
25#include "RelationalAccess/ISchema.h"
26#include "RelationalAccess/ITable.h"
27#include "RelationalAccess/IQuery.h"
28#include "RelationalAccess/ICursor.h"
29
30// Need this to keep other packages from failing, should be fixed properly
32
33// LumiBlock includes
38
39// stl includes
40#include <iomanip>
41#include <iostream>
42#include <string>
43#include <vector>
44#include <map>
45
46// logger
48
49//================================================
50// Simple class to hold
51
52// Simple class to hold IOV-based data efficiently
53template <class T>
54class IOVData {
55
56 public:
58 clear();
59 }
60
62 clear();
63 }
64
65 IOVData (const IOVData&) = default;
66 IOVData (IOVData&&) = default;
67 IOVData& operator= (const IOVData&) = default;
68 IOVData& operator= (IOVData&&) = default;
69
70 void clear() {
71 data.clear();
72 m_last = data.begin();
73 m_lastData = false;
74 }
75
76 // Main access function, returns value at specific time
77 T getValue(IOVTime time);
78
79 // Useful for LAr calculation, returns list of IOV-data pairs which intersect given range
80 typename std::list<std::pair<IOVRange, T > > getOverlap(const IOVRange& range);
81
82 // Insert element
83 void add(IOVRange range, T val);
84
85 // Data list
86 typename std::list<std::pair<IOVRange, T > > data;
87
88 private:
90
91 // Cant use a map as IOVRange objects have no order
92 typename std::list<std::pair<IOVRange, T > >::iterator m_last;
93
94};
95
96template <class T>
97void IOVData<T>::add(IOVRange range, T val) {
98 data.push_back(std::pair<IOVRange, T>(range, val));
99 m_last = data.begin();
100 m_lastData = false;
101}
102
103template <class T>
105
106 // bool verbose = false;
107 // if (verbose) {
108 // cout << endl << "getValue(" << time << ")" << endl;
109 // cout << "Data Size: " << data.size() << endl;
110 // }
111
112 if (data.empty()) return T(-1);
113
114 typename std::list<std::pair<IOVRange, T> >::iterator it;
115
116 // if (verbose) {
117 // for (it = data.begin(); it != data.end(); it++)
118 // cout << "(" << it->first << ", " << it->second << ")" << endl;
119 // cout << "Last is valid - " << m_lastData << endl;
120 // }
121
122 // Check if previous value is still good
123 if (m_lastData) {
124 // if (verbose) {
125 // cout << "Check previous " << m_last->first << endl;
126 // }
127
128 if ((m_last->first).isInRange(time)) return m_last->second;
129
130 // Previous not good, try next as best guess
131 if (++(m_last) != data.end()) {
132 // if (verbose) cout << "Check next " << m_last->first << endl;
133 if ((m_last->first).isInRange(time)) return m_last->second;
134 }
135 } else {
136 m_last = data.begin();
137 }
138
139 m_lastData = false;
140
141 // OK, suck it up and find the best value by stepping through entire list
142 // Make sure we start on a valid value
143 if ( m_last == data.end() ) --m_last;
144
145 // Step forward looking for a match
146 if (m_last->first.stop() <= time) {
147
148 // if (verbose) cout << "Search upwards" << endl;
149 for (++m_last; m_last != data.end(); ++m_last) {
150 // if (verbose) cout << m_last->first << endl;
151 if ((m_lastData = (m_last->first).isInRange(time))) return m_last->second;
152 }
153
154 } else if ( m_last != data.begin() && m_last->first.start() > time) {
155
156 // if (verbose) cout << "Search downwards" << endl;
157 do {
158 --m_last;
159 // if (verbose) cout << m_last->first << endl;
160 if ((m_lastData = (m_last->first).isInRange(time))) return m_last->second;
161 } while (m_last != data.begin());
162
163 } else {
164
165 if ((m_lastData = m_last->first.isInRange(time))) return m_last->second;
166
167 }
168
169 // Set to valid data if we didn't find anything
170 m_last = data.begin();
171 m_lastData = false;
172
173 // If we got to here, we didn't find it
174 return T(-1);
175}
176
177template <class T>
178std::list<std::pair<IOVRange, T> > IOVData<T>::getOverlap(const IOVRange& range) {
179
180 std::list<std::pair<IOVRange, T> > mydata;
181 mydata.clear();
182
183 // Find first time
184 IOVTime firsttime = range.start();
185 IOVTime lasttime = range.stop();
186
187 // Use this to efficiently set the 'm_last' pointer
188 getValue(firsttime);
189
190 // Pointer to found element
191 typename std::list<std::pair<IOVRange, T> >::iterator elem;
192
193 std::pair<IOVRange, T> val;
194
195 // Loop over elements
196 for (elem = m_last; elem != data.end(); ++elem) {
197
198 val = *elem;
199
200 // Truncate this if necessary
201 if (val.first.start() < firsttime || val.first.stop() > lasttime) {
202 IOVTime iovstart((val.first.start() < firsttime ? firsttime : val.first.start()));
203 IOVTime iovstop((val.first.stop() > lasttime ? lasttime : val.first.stop()));
204 val.first = IOVRange(iovstart, iovstop);
205 }
206 mydata.push_back(val);
207
208 // Check if we are done
209 if (elem->first.isInRange(lasttime)) break;
210 }
211
212 return mydata;
213}
214
215/***************************************
216 * This class serves as a common engine
217 * for Cool Query by fetching
218 * up basic values from COOL for a single
219 * trigger chain, trigger db and lumi db
220 ****************************************/
221
223 public:
224
225 // constructor
226 CoolQuery(const std::string& database, const std::string& triggerchain);
227
228 // destructor
229 ~CoolQuery();
230
231 // Set trigger database
232 void setDb(const std::string& database){m_database = database;}
233
234 // Set trigger
236
237
238 // Opens database connection
239 bool openDbConn();
240
241 // set the "central" IOV range to this time (presumable this comes from some LumiBlockCollection's IOVRange
242 // but one in general can create one such object via e.g.:
243 //
244 // * iovc = new LumiBlockCollection();
245 // iovc->push_back(new IOVRange(IOVTime(runnumber, LBstart), IOVTime(runnumber,LBend)));
246 // LumiBlockCollection::const_iterator i = iovc->begin();
247 //
248 // then use it via
249 //
250 // mycoolquery->setIOV(iovr->start().re_time(), iovr->stop().re_time());
251 //
252 void setIOV(const cool::ValidityKey start, const cool::ValidityKey stop);
253
254 void setIOVForRun(unsigned int runnum);
255
256 // returns HLT channelId of trigger "trigger" in folder "folder_name"
257 cool::ChannelId getHLTChannelId(const std::string& trigger, const std::string& folder_name);
258
259 // returns L1 channelId of trigger "trigger" in folder "folder_name"
260 cool::ChannelId getL1ChannelId(const std::string& trigger, const std::string& folder_name);
261
262 // returns Lumi channelId for lumimethod in folder_name
263 cool::ChannelId getLumiChannelId(const std::string& lumimethod, const std::string& folder_name);
264
265 // utility to indicate whether ChannelID returned by any of the above is valid
266 bool channelIdValid();
267
268 // returns "LowerChainName" of "trigger" in "folder_name" folder
269 std::string getHLTLowerChainName(const std::string& trigger, const std::string& folder_name);
270
271 // handy function to get quickly prescale
272 cool::Int32 getL1PrescaleFromChannelId(const std::string& folder_name, const cool::ChannelId& id );
273
274 // handy function to get quickly prescale
275 cool::Float getHLTPrescaleFromChannelId(const std::string& folder_name, const cool::ChannelId& id );
276
277 // Print list of triggers
278 void printL1Triggers(const std::string& folder_name);
279 void printHLTTriggers(const std::string& folder_name);
280
281 // note this is mainly for trigger dependent variables, counters, prescales, etc.
282 template <class T>
283 std::map<cool::ValidityKey, T> getObjMapFromFolderAtChan(const std::string& obj_name, const std::string& folder_name, const cool::ChannelId& id);
284
285 template <class T>
286 std::map<cool::ValidityKey, T> getTrigObjMapFromFolderByName(const std::string& obj_name, const std::string& folder_name, const std::string& trigger);
287
288 // same but giving an (unordered) map with IOVRange key
289 // template <class T>
290 // unordered_map<IOVRange, T> getTrigObjMapFromFolderByNameIOV(const std::string& obj_name, const std::string& folder_name, const std::string& trigger);
291
292 template <class T>
293 std::map<cool::ValidityKey, T> getLumiIterator(const std::string& luminame, const std::string& folder_name, const std::string& tag, const cool::ChannelId& id );
294
295 // returns numerical 1/2/3 values for trigger "triggername"
296 unsigned int getTriggerLevel(const std::string& triggername);
297
298 // Retrieve all lumi data at once
305
306 std::map<cool::ValidityKey, LumiFolderData>
307 getLumiFolderData(const std::string& folder_name, const std::string& tag, const cool::ChannelId& id );
308
309 // Retrieve all L1 counter data at once
311 cool::UInt63 BeforePrescale;
312 cool::UInt63 AfterPrescale;
313 cool::UInt63 L1Accept; // After L1 veto
314 };
315
316 std::map<cool::ValidityKey, L1CountFolderData>
317 getL1CountFolderData(const std::string& folder_name, const cool::ChannelId& id);
318
319 // Retrieve prescale data into cached data object
320 template <class T>
321 IOVData<T> getIOVData(const std::string& name, const std::string& folder_name, const cool::ChannelId& id, const std::string& tag="");
322
323 private:
324 std::string transConn(const std::string& inconn);
325
326 coral::ConnectionService m_coralsvc;
328 cool::IDatabasePtr m_sourceDbPtr;
329 std::string m_database;
330 std::string m_triggerchain;
331 cool::ValidityKey m_VKstart;
332 cool::ValidityKey m_VKstop;
333
335
337};
338
339/* template <class T> */
340/* unordered_map<IOVRange, T> CoolQuery::getTrigObjMapFromFolderByNameIOV(const std::string& obj_name, const std::string& folder_name, const std::string& trigger){ */
341/* unordered_map<IOVRange, T> test; */
342/* return test; */
343
344/* } */
345
346
347
348//===========================================================================
349template <class T>
350std::map<cool::ValidityKey, T> CoolQuery::getTrigObjMapFromFolderByName(const std::string& obj_name, const std::string& folder_name, const std::string& trigger){
351 // m_logger << Root::kWARNING << "Getting object [" << obj_name << "] from folder [" << folder_name << "], in LB range: " << (m_VKstart >> 32) << ", " << (m_VKstart & 0xFFFFFFFF) << " - " << (m_VKstop >> 32) << ","<< (m_VKstop & 0xFFFFFFFF) << Root::GEndl;
352 std::map<cool::ValidityKey, T> mymap;
353 bool found = false;
354 cool::IFolderPtr folder_ptr = m_sourceDbPtr->getFolder(folder_name);
355 cool::IObjectIteratorPtr obj_itr=folder_ptr->browseObjects(m_VKstart,m_VKstart, cool::ChannelSelection::all());
356 // loop through all triggers
357 while (obj_itr->goToNext()){
358
359 const cool::IRecord& payload=obj_itr->currentRef().payload();
360 // std::cout << "ChainNames: " << payload["ChainName"].data<std::string>() << std::endl;
361
362 if(payload["ChainName"].data<std::string>() == trigger){
363 found = true;
364 const cool::IRecord& payload=obj_itr->currentRef().payload();
365 // std::cout << "Inserting: " << (obj_itr->currentRef().since() >> 32) << " - " << (obj_itr->currentRef().since() & 0xFFFFFF) << ", " << payload[obj_name].data<T>() << std::endl;
366 mymap.insert( std::pair<cool::ValidityKey, T>(obj_itr->currentRef().since() ,payload[obj_name].data<T>()));
367 }
368 }
369
370 if(!found){
371 m_logger << Root::kERROR << "Couldn't find HLT trigger [" << trigger << "] in folder [" << folder_name << "]" << Root::GEndl;
372 }
373
374 return mymap;
375}
376
377
378//===========================================================================
379template <class T>
380std::map<cool::ValidityKey, T> CoolQuery::getObjMapFromFolderAtChan(const std::string& obj_name, const std::string& folder_name, const cool::ChannelId& id){
381 // m_logger << Root::kWARNING << "Getting object [" << obj_name << "] from folder [" << folder_name << "], in channel: " << id << ", in LB range: " << (m_VKstart >> 32) << ", " << (m_VKstart & 0xFFFFFFFF) << " - " << (m_VKstop >> 32) << ","<< (m_VKstop & 0xFFFFFFFF) << Root::GEndl;
382 std::map<cool::ValidityKey, T> mymap;
383 cool::IFolderPtr folder_ptr = m_sourceDbPtr->getFolder(folder_name);
384 cool::ChannelSelection chsel(id);
385 if(folder_ptr->existsChannel(id)){
386 cool::IObjectIteratorPtr itr = folder_ptr->browseObjects(m_VKstart, m_VKstop,chsel);
387 while (itr->goToNext()) {
388 const cool::IRecord& payload=itr->currentRef().payload();
389 // std::cout << "Inserting: " << (itr->currentRef().since() >> 32) << " - " << (itr->currentRef().since() & 0xFFFFFF) << ", " << payload[obj_name].data<T>() << std::endl;
390 mymap.insert( std::pair<cool::ValidityKey, T>(itr->currentRef().since() ,payload[obj_name].data<T>()));
391 }
392 }else{
393 m_logger << Root::kWARNING << "Channel " << id << " does not exist in database." << Root::GEndl;
394/* const std::map<cool::ChannelId,std::string> list = folder_ptr->listChannelsWithNames(); */
395 }
396 return mymap;
397}
398
399
400//===========================================================================
401template <class T>
402std::map<cool::ValidityKey, T> CoolQuery::getLumiIterator(const std::string& luminame, const std::string& folder_name, const std::string& tag, const cool::ChannelId& id ){
403
404 std::map<cool::ValidityKey, T> mymap;
405 cool::IFolderPtr folder_ptr = m_sourceDbPtr->getFolder(folder_name);
406 // m_logger << Root::kWARNING << "Getting from database " << m_database << " tag " << tag << Root::GEndl;
407 if(folder_ptr->existsChannel(id) && folder_ptr->existsUserTag(tag)){
408 cool::IObjectIteratorPtr itr = folder_ptr->browseObjects(m_VKstart, m_VKstop, id, tag);
409 while (itr->goToNext()) {
410 const cool::IRecord& payload=itr->currentRef().payload();
411 mymap.insert( std::pair<cool::ValidityKey, T>(itr->currentRef().since() ,payload[luminame].data<T>()));
412 }
413 }else if(folder_ptr->existsChannel(id) && !folder_ptr->existsUserTag(tag)){
414 // ok, tag doesn't exist, still try to use an untagged way of accessing data
415 mymap = CoolQuery::getObjMapFromFolderAtChan<T>(luminame, folder_name,id);
416 }else{
417 m_logger << Root::kWARNING << "Lumi tag " << tag << " does not exist, or Lumi channel id " << id << " does not exist in database." << Root::GEndl;
418 }
419 return mymap;
420
421}
422
423//===========================================================================
424template <class T>
426CoolQuery::getIOVData(const std::string& obj_name, const std::string& folder_name, const cool::ChannelId& id, const std::string& tag) {
427
428 IOVData<T> mydata;
429
430 cool::IFolderPtr folder_ptr = m_sourceDbPtr->getFolder(folder_name);
431 cool::ChannelSelection chsel(id);
432 if(!folder_ptr->existsChannel(id)){
433 m_logger << Root::kWARNING << "Channel " << id << " does not exist in database " << folder_name << "!" << Root::GEndl;
434 return mydata;
435 }
436
437 // Try with or without tag
438 cool::IObjectIteratorPtr itr;
439 if (folder_ptr->existsUserTag(tag)) {
440 itr = folder_ptr->browseObjects(m_VKstart, m_VKstop, id, tag);
441 } else {
442 itr = folder_ptr->browseObjects(m_VKstart, m_VKstop, id);
443 }
444
445 while (itr->goToNext()) {
446 IOVTime since, until;
447 since.setRETime(itr->currentRef().since());
448 until.setRETime(itr->currentRef().until());
449
450 IOVRange range(since, until);
451
452 const cool::IRecord& payload=itr->currentRef().payload();
453
454 mydata.add( range, payload[obj_name].data<T>() );
455 }
456
457 return mydata;
458}
459
460
461
462#endif //> COOLQUERY_H
463
464
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
Validity Range object.
Basic time unit for IOVSvc.
void setDb(const std::string &database)
Definition CoolQuery.h:232
cool::ChannelId getHLTChannelId(const std::string &trigger, const std::string &folder_name)
void setIOV(const cool::ValidityKey start, const cool::ValidityKey stop)
Definition CoolQuery.cxx:96
IOVData< T > getIOVData(const std::string &name, const std::string &folder_name, const cool::ChannelId &id, const std::string &tag="")
Definition CoolQuery.h:426
CoolQuery(const std::string &database, const std::string &triggerchain)
Definition CoolQuery.cxx:9
std::map< cool::ValidityKey, L1CountFolderData > getL1CountFolderData(const std::string &folder_name, const cool::ChannelId &id)
void setTrigger(const std::string &triggerchain)
Definition CoolQuery.h:235
unsigned int getTriggerLevel(const std::string &triggername)
Definition CoolQuery.cxx:79
coral::ConnectionService m_coralsvc
Definition CoolQuery.h:326
cool::IDatabasePtr m_sourceDbPtr
Definition CoolQuery.h:328
Root::TMsgLogger m_logger
Definition CoolQuery.h:334
bool m_valid
Definition CoolQuery.h:336
cool::Float getHLTPrescaleFromChannelId(const std::string &folder_name, const cool::ChannelId &id)
void setIOVForRun(unsigned int runnum)
ReplicaSorter * m_repsort
Definition CoolQuery.h:327
void printHLTTriggers(const std::string &folder_name)
std::map< cool::ValidityKey, T > getTrigObjMapFromFolderByName(const std::string &obj_name, const std::string &folder_name, const std::string &trigger)
Definition CoolQuery.h:350
std::map< cool::ValidityKey, LumiFolderData > getLumiFolderData(const std::string &folder_name, const std::string &tag, const cool::ChannelId &id)
cool::ValidityKey m_VKstart
Definition CoolQuery.h:331
cool::Int32 getL1PrescaleFromChannelId(const std::string &folder_name, const cool::ChannelId &id)
void printL1Triggers(const std::string &folder_name)
std::string m_triggerchain
Definition CoolQuery.h:330
bool openDbConn()
Definition CoolQuery.cxx:30
cool::ChannelId getL1ChannelId(const std::string &trigger, const std::string &folder_name)
std::string transConn(const std::string &inconn)
Definition CoolQuery.cxx:68
cool::ChannelId getLumiChannelId(const std::string &lumimethod, const std::string &folder_name)
std::string m_database
Definition CoolQuery.h:329
bool channelIdValid()
std::map< cool::ValidityKey, T > getLumiIterator(const std::string &luminame, const std::string &folder_name, const std::string &tag, const cool::ChannelId &id)
Definition CoolQuery.h:402
std::string getHLTLowerChainName(const std::string &trigger, const std::string &folder_name)
cool::ValidityKey m_VKstop
Definition CoolQuery.h:332
std::map< cool::ValidityKey, T > getObjMapFromFolderAtChan(const std::string &obj_name, const std::string &folder_name, const cool::ChannelId &id)
Definition CoolQuery.h:380
void clear()
Definition CoolQuery.h:70
void add(IOVRange range, T val)
Definition CoolQuery.h:97
IOVData & operator=(const IOVData &)=default
T getValue(IOVTime time)
Definition CoolQuery.h:104
std::list< std::pair< IOVRange, T > > getOverlap(const IOVRange &range)
Definition CoolQuery.h:178
std::list< std::pair< IOVRange, T > >::iterator m_last
Definition CoolQuery.h:92
IOVData(IOVData &&)=default
std::list< std::pair< IOVRange, T > > data
Definition CoolQuery.h:86
IOVData()
Definition CoolQuery.h:57
~IOVData()
Definition CoolQuery.h:61
bool m_lastData
Definition CoolQuery.h:89
IOVData(const IOVData &)=default
Validity Range object.
Definition IOVRange.h:30
Basic time unit for IOVSvc.
Definition IOVTime.h:33
static std::vector< std::string > triggerchain
Definition iLumiCalc.h:34
@ kERROR
Definition TMsgLogger.h:42
@ kWARNING
Definition TMsgLogger.h:41