ATLAS Offline Software
Loading...
Searching...
No Matches
CoolQuery.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 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
340
341
342//===========================================================================
343template <class T>
344std::map<cool::ValidityKey, T> CoolQuery::getTrigObjMapFromFolderByName(const std::string& obj_name, const std::string& folder_name, const std::string& trigger){
345 // 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;
346 std::map<cool::ValidityKey, T> mymap;
347 bool found = false;
348 cool::IFolderPtr folder_ptr = m_sourceDbPtr->getFolder(folder_name);
349 cool::IObjectIteratorPtr obj_itr=folder_ptr->browseObjects(m_VKstart,m_VKstart, cool::ChannelSelection::all());
350 // loop through all triggers
351 while (obj_itr->goToNext()){
352
353 const cool::IRecord& payload=obj_itr->currentRef().payload();
354 // std::cout << "ChainNames: " << payload["ChainName"].data<std::string>() << std::endl;
355
356 if(payload["ChainName"].data<std::string>() == trigger){
357 found = true;
358 const cool::IRecord& payload=obj_itr->currentRef().payload();
359 // std::cout << "Inserting: " << (obj_itr->currentRef().since() >> 32) << " - " << (obj_itr->currentRef().since() & 0xFFFFFF) << ", " << payload[obj_name].data<T>() << std::endl;
360 mymap.insert( std::pair<cool::ValidityKey, T>(obj_itr->currentRef().since() ,payload[obj_name].data<T>()));
361 }
362 }
363
364 if(!found){
365 m_logger << Root::kERROR << "Couldn't find HLT trigger [" << trigger << "] in folder [" << folder_name << "]" << Root::GEndl;
366 }
367
368 return mymap;
369}
370
371
372//===========================================================================
373template <class T>
374std::map<cool::ValidityKey, T> CoolQuery::getObjMapFromFolderAtChan(const std::string& obj_name, const std::string& folder_name, const cool::ChannelId& id){
375 // 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;
376 std::map<cool::ValidityKey, T> mymap;
377 cool::IFolderPtr folder_ptr = m_sourceDbPtr->getFolder(folder_name);
378 cool::ChannelSelection chsel(id);
379 if(folder_ptr->existsChannel(id)){
380 cool::IObjectIteratorPtr itr = folder_ptr->browseObjects(m_VKstart, m_VKstop,chsel);
381 while (itr->goToNext()) {
382 const cool::IRecord& payload=itr->currentRef().payload();
383 // std::cout << "Inserting: " << (itr->currentRef().since() >> 32) << " - " << (itr->currentRef().since() & 0xFFFFFF) << ", " << payload[obj_name].data<T>() << std::endl;
384 mymap.insert( std::pair<cool::ValidityKey, T>(itr->currentRef().since() ,payload[obj_name].data<T>()));
385 }
386 }else{
387 m_logger << Root::kWARNING << "Channel " << id << " does not exist in database." << Root::GEndl;
388/* const std::map<cool::ChannelId,std::string> list = folder_ptr->listChannelsWithNames(); */
389 }
390 return mymap;
391}
392
393
394//===========================================================================
395template <class T>
396std::map<cool::ValidityKey, T> CoolQuery::getLumiIterator(const std::string& luminame, const std::string& folder_name, const std::string& tag, const cool::ChannelId& id ){
397
398 std::map<cool::ValidityKey, T> mymap;
399 cool::IFolderPtr folder_ptr = m_sourceDbPtr->getFolder(folder_name);
400 // m_logger << Root::kWARNING << "Getting from database " << m_database << " tag " << tag << Root::GEndl;
401 if(folder_ptr->existsChannel(id) && folder_ptr->existsUserTag(tag)){
402 cool::IObjectIteratorPtr itr = folder_ptr->browseObjects(m_VKstart, m_VKstop, id, tag);
403 while (itr->goToNext()) {
404 const cool::IRecord& payload=itr->currentRef().payload();
405 mymap.insert( std::pair<cool::ValidityKey, T>(itr->currentRef().since() ,payload[luminame].data<T>()));
406 }
407 }else if(folder_ptr->existsChannel(id) && !folder_ptr->existsUserTag(tag)){
408 // ok, tag doesn't exist, still try to use an untagged way of accessing data
409 mymap = CoolQuery::getObjMapFromFolderAtChan<T>(luminame, folder_name,id);
410 }else{
411 m_logger << Root::kWARNING << "Lumi tag " << tag << " does not exist, or Lumi channel id " << id << " does not exist in database." << Root::GEndl;
412 }
413 return mymap;
414
415}
416
417//===========================================================================
418template <class T>
420CoolQuery::getIOVData(const std::string& obj_name, const std::string& folder_name, const cool::ChannelId& id, const std::string& tag) {
421
422 IOVData<T> mydata;
423
424 cool::IFolderPtr folder_ptr = m_sourceDbPtr->getFolder(folder_name);
425 cool::ChannelSelection chsel(id);
426 if(!folder_ptr->existsChannel(id)){
427 m_logger << Root::kWARNING << "Channel " << id << " does not exist in database " << folder_name << "!" << Root::GEndl;
428 return mydata;
429 }
430
431 // Try with or without tag
432 cool::IObjectIteratorPtr itr;
433 if (folder_ptr->existsUserTag(tag)) {
434 itr = folder_ptr->browseObjects(m_VKstart, m_VKstop, id, tag);
435 } else {
436 itr = folder_ptr->browseObjects(m_VKstart, m_VKstop, id);
437 }
438
439 while (itr->goToNext()) {
440 IOVTime since, until;
441 since.setRETime(itr->currentRef().since());
442 until.setRETime(itr->currentRef().until());
443
444 IOVRange range(since, until);
445
446 const cool::IRecord& payload=itr->currentRef().payload();
447
448 mydata.add( range, payload[obj_name].data<T>() );
449 }
450
451 return mydata;
452}
453
454
455
456#endif //> COOLQUERY_H
457
458
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
IOVData< T > getIOVData(const std::string &name, const std::string &folder_name, const cool::ChannelId &id, const std::string &tag={})
Definition CoolQuery.h:420
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:94
CoolQuery(const std::string &database, const std::string &triggerchain)
Definition CoolQuery.cxx:24
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:77
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)
Definition CoolQuery.cxx:99
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:344
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:45
cool::ChannelId getL1ChannelId(const std::string &trigger, const std::string &folder_name)
std::string transConn(const std::string &inconn)
Definition CoolQuery.cxx:66
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:396
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:374
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