ATLAS Offline Software
Loading...
Searching...
No Matches
CoolQuery.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include <limits.h>
7
8namespace{
9 const std::string chainNameStr{"ChainName"};
10 const std::string chainCounterStr{"ChainCounter"};
11 const std::string itemNameStr{"ItemName"};
12 const std::string prescaleStr{"Prescale"};
13 const std::string lvl1PrescaleStr{"Lvl1Prescale"};
14 const std::string lowerChainNameStr{"LowerChainName"};
15 const std::string validStr{"Valid"};
16 const std::string beforePrescaleStr{"BeforePrescale"};
17 const std::string afterPrescaleStr{"AfterPrescale"};
18 const std::string l1AcceptStr{"L1Accept"};
19 const std::string lbAvInstLumiStr{"LBAvInstLumi"};
20 const std::string lbAvEvtsPerBXStr{"LBAvEvtsPerBX"};
21}
22
23//===========================================================================
24CoolQuery::CoolQuery(const std::string& database, const std::string& triggerchain):
25 m_repsort(0),
26 m_database(database),
28 m_VKstart(0),
29 m_VKstop(0),
30 m_logger( "CoolQuery" ),
31 m_valid(false)
32{
33
34}
35
36//===========================================================================
38 if ( m_sourceDbPtr.use_count()>0 && m_sourceDbPtr->isOpen() ) {
39 m_logger << Root::kINFO << "Closing database '" << m_sourceDbPtr->databaseName() << Root::GEndl;
40 m_sourceDbPtr->closeDatabase();
41 }
42}
43
44//===========================================================================
46 m_logger << Root::kINFO << "Trying to connect to database " << m_database << "..." << Root::GEndl;
47 cool::IDatabaseSvc& databasesvc = cool::DatabaseSvcFactory::databaseService();
48 try {
50 coral::IConnectionServiceConfiguration& csconfig=m_coralsvc.configuration();
51 csconfig.setReplicaSortingAlgorithm(*m_repsort);
52
53 m_sourceDbPtr = databasesvc.openDatabase(m_database,true);// true --> readonly
54 // m_sourceCoraPtr=corasvc.openDatabase(m_database,true);// true --> readonly
55 //std::cout << "....database connections open OK" << std::endl;
56 return true;
57 }
58 catch (std::exception&e) {
59 m_logger << Root::kERROR << "Problem opening CORAL database: " << e.what() << Root::GEndl;
60 return false;
61 }
62 return false;
63}
64
65//===========================================================================
66std::string CoolQuery::transConn(const std::string& inconn) {
67 // translate simple connection string (no slash) to mycool.db with given
68 // instance name, all others are left alone
69 if (inconn.find('/')==std::string::npos) {
70 return "sqlite://X;schema=mycool.db;dbname="+inconn;
71 } else {
72 return inconn;
73 }
74}
75
76//===========================================================================
77unsigned int CoolQuery::getTriggerLevel(const std::string& triggername){
78
79 size_t found = triggername.find_first_of('_');
80 if(found != std::string::npos){
81 std::string s_lvl = triggername.substr(0,found);
82 if(s_lvl == "EF") return 3;
83 if(s_lvl == "L2") return 2;
84 if(s_lvl == "L1") return 1;
85 if(s_lvl == "HLT") return 2;
86 }
87
88 // Indicate no valid trigger name passed
89 return 0;
90
91}
92
93//===========================================================================
94void CoolQuery::setIOV(const cool::ValidityKey start, const cool::ValidityKey stop){
95 m_VKstart = start;
96 m_VKstop = stop;
97}
98
99void CoolQuery::setIOVForRun(unsigned int runnum) {
100 cool::ValidityKey run = runnum;
101 m_VKstart = (run << 32);
102 m_VKstop = ((run+1) << 32) - 1;
103}
104
105cool::Int32 CoolQuery::getL1PrescaleFromChannelId(const std::string& folder_name, const cool::ChannelId& id ){
106
107 cool::IFolderPtr folder_ptr = m_sourceDbPtr->getFolder(folder_name);
108 cool::IObjectIteratorPtr itr = folder_ptr->browseObjects(m_VKstart, m_VKstop,id);
109
110 // Need to iterate once to get to first valid record, do it this way to avoid Coverity warning
111 if (itr->goToNext()) {
112 const cool::IRecord& payload=itr->currentRef().payload();
113 return payload[lvl1PrescaleStr].data<cool::Int32>();
114 }
115
116 // Nonsense value
117 return UINT_MAX;
118
119}
120
121cool::Float CoolQuery::getHLTPrescaleFromChannelId(const std::string& folder_name, const cool::ChannelId& id ){
122
123 cool::IFolderPtr folder_ptr = m_sourceDbPtr->getFolder(folder_name);
124 cool::IObjectIteratorPtr itr = folder_ptr->browseObjects(m_VKstart, m_VKstop,id);
125
126 // Need to iterate once to get to first valid record, do it this way to avoid Coverity warning
127 if (itr->goToNext()) {
128 const cool::IRecord& payload=itr->currentRef().payload();
129 return payload[prescaleStr].data<cool::Float>();
130 }
131
132 // Nonsense value
133 return -1.;
134
135}
136
137cool::ChannelId CoolQuery::getL1ChannelId(const std::string& trigger, const std::string& folder_name){
138 m_valid = false;
139
140 if (trigger == "") return UINT_MAX;
141
142 cool::IFolderPtr folder_ptr = m_sourceDbPtr->getFolder(folder_name);
143 cool::IObjectIteratorPtr obj_itr=folder_ptr->browseObjects(m_VKstart,m_VKstart, cool::ChannelSelection::all());
144 // loop through all triggers
145 while (obj_itr->goToNext()){
146 const cool::IRecord& payload=obj_itr->currentRef().payload();
147 // find the L1 trigger chain
148 if(payload[itemNameStr].data<std::string>() == trigger){
149 m_valid = true;
150 return obj_itr->currentRef().channelId();
151 }
152 }
153 if(!m_valid){
154 m_logger << Root::kERROR << "Couldn't find L1 trigger [" << trigger << "] in folder [" << folder_name << "]" << Root::GEndl;
155 }
156 // Nonsense value
157 return UINT_MAX;
158}
159
160//===========================================================================
161cool::ChannelId CoolQuery::getLumiChannelId(const std::string& lumimethod, const std::string& folder_name){
162 m_valid = false;
163 if (lumimethod == "") return UINT_MAX;
164 cool::IFolderPtr folder_ptr = m_sourceDbPtr->getFolder(folder_name);
165 if(folder_ptr->existsChannel(lumimethod)){
166 m_valid = true;
167 return folder_ptr->channelId(lumimethod);
168 }else{
169 m_logger << Root::kWARNING << "Couldn't find lumimethod: " << lumimethod << " in COOL database!" << Root::GEndl;
170 }
171 // Nonsense value
172 return UINT_MAX;
173}
174
175//===========================================================================
176cool::ChannelId CoolQuery::getHLTChannelId(const std::string& trigger, const std::string& folder_name){
177 m_valid = false;
178 if (trigger == "") return UINT_MAX;
179 cool::IFolderPtr folder_ptr = m_sourceDbPtr->getFolder(folder_name);
180 cool::IObjectIteratorPtr obj_itr=folder_ptr->browseObjects(m_VKstart,m_VKstart, cool::ChannelSelection::all());
181 // loop through all triggers
182 // loop through all triggers
183 while (obj_itr->goToNext()){
184 const cool::IRecord& payload=obj_itr->currentRef().payload();
185 if(payload[chainNameStr].data<std::string>() == trigger){
186 m_valid = true;
187 return payload[chainCounterStr].data<cool::UInt32>();
188 }
189 }
190 if(!m_valid){
191 m_logger << Root::kERROR << "Couldn't find HLT trigger [" << trigger << "] in folder [" << folder_name << "]" << Root::GEndl;
192 }
193 // Nonsense value
194 return UINT_MAX;
195}
196
197void
198CoolQuery::printL1Triggers(const std::string& folder_name) {
199 m_logger << Root::kINFO << "Listing available triggers [triggername(prescale, chanid)]: " << Root::GEndl;
200 cool::IFolderPtr folder_ptr = m_sourceDbPtr->getFolder(folder_name);
201 cool::IObjectIteratorPtr obj_itr=folder_ptr->browseObjects(m_VKstart,m_VKstart, cool::ChannelSelection::all());
202 while (obj_itr->goToNext()){
203 const cool::IRecord& payload=obj_itr->currentRef().payload();
204 m_logger << Root::kINFO << payload[itemNameStr].data<std::string>() << "(" << this->getL1PrescaleFromChannelId("/TRIGGER/LVL1/Prescales",this->getL1ChannelId(payload[itemNameStr].data<std::string>(), folder_name)) << ", " << obj_itr->currentRef().channelId() << "), ";
205 }
206 m_logger << Root::kINFO << Root::GEndl;
207}
208
209void
210CoolQuery::printHLTTriggers(const std::string& folder_name) {
211
212 m_logger << Root::kINFO << "Listing available triggers [triggername(prescale, chanid)]: " << Root::GEndl;
213
214 cool::IFolderPtr folder_ptr = m_sourceDbPtr->getFolder(folder_name);
215 cool::IObjectIteratorPtr obj_itr2=folder_ptr->browseObjects(m_VKstart,m_VKstart, cool::ChannelSelection::all());
216 while (obj_itr2->goToNext()){
217 const cool::IRecord& payload2=obj_itr2->currentRef().payload();
218 m_logger << Root::kINFO << payload2[chainNameStr].data<std::string>() << "(" << payload2[prescaleStr].data<cool::Float>() << ", " << payload2[chainCounterStr].data<cool::UInt32>() << "), ";
219 }
220 m_logger << Root::kINFO << Root::GEndl;
221}
222
223bool
227
228//===========================================================================
229std::string CoolQuery::getHLTLowerChainName(const std::string& trigger, const std::string& folder_name){
230 bool found = false;
231 cool::IFolderPtr folder_ptr = m_sourceDbPtr->getFolder(folder_name);
232 cool::IObjectIteratorPtr obj_itr=folder_ptr->browseObjects(m_VKstart,m_VKstart, cool::ChannelSelection::all());
233 // loop through all triggers
234 while (obj_itr->goToNext()){
235 const cool::IRecord& payload=obj_itr->currentRef().payload();
236 if(payload[chainNameStr].data<std::string>() == trigger){
237 found = true;
238 return payload[lowerChainNameStr].data<std::string>();
239
240 }
241 }
242 if (!found) {
243 m_logger << Root::kERROR << "Couldn't find HLT trigger [" << trigger << "] in folder [" << folder_name << "]" << Root::GEndl;
244 }
245
246 return "";
247
248}
249
250//===========================================================================
251std::map<cool::ValidityKey, CoolQuery::LumiFolderData>
252CoolQuery::getLumiFolderData(const std::string& folder_name, const std::string& tag, const cool::ChannelId& id ){
253
254 std::map<cool::ValidityKey, LumiFolderData> mymap;
255 LumiFolderData folderData;
256
257 cool::IFolderPtr folder_ptr = m_sourceDbPtr->getFolder(folder_name);
258 if (!folder_ptr->existsChannel(id)) {
259 m_logger << Root::kWARNING << "Lumi channel id " << id << " does not exist in database " << folder_name << "!" << Root::GEndl;
260 return mymap;
261 }
262
263 cool::IObjectIteratorPtr itr;
264 if(folder_ptr->existsUserTag(tag)) {
265 itr = folder_ptr->browseObjects(m_VKstart, m_VKstop, id, tag);
266 } else {
267 // Try without specifying tag
268 itr = folder_ptr->browseObjects(m_VKstart, m_VKstop, id);
269 }
270
271 while (itr->goToNext()) {
272 const cool::IRecord& payload=itr->currentRef().payload();
273 folderData.LBAvInstLumi = payload[lbAvInstLumiStr].data<float>();
274 folderData.LBAvEvtsPerBX = payload[lbAvEvtsPerBXStr].data<float>();
275 folderData.Valid = payload[validStr].data<cool::UInt32>();
276 mymap.insert( std::pair<cool::ValidityKey, LumiFolderData>(itr->currentRef().since(), folderData));
277 }
278
279 return mymap;
280
281}
282
283//===========================================================================
284std::map<cool::ValidityKey, CoolQuery::L1CountFolderData>
285CoolQuery::getL1CountFolderData(const std::string& folder_name, const cool::ChannelId& id ){
286
287 std::map<cool::ValidityKey, L1CountFolderData> mymap;
288 L1CountFolderData folderData;
289
290 cool::IFolderPtr folder_ptr = m_sourceDbPtr->getFolder(folder_name);
291 if (!folder_ptr->existsChannel(id)) {
292 m_logger << Root::kWARNING << "Lumi channel id " << id << " does not exist in database " << folder_name << "!" << Root::GEndl;
293 return mymap;
294 }
295
296 cool::IObjectIteratorPtr itr;
297
298 itr = folder_ptr->browseObjects(m_VKstart, m_VKstop, id);
299
300 while (itr->goToNext()) {
301 const cool::IRecord& payload=itr->currentRef().payload();
302 folderData.BeforePrescale = payload[beforePrescaleStr].data<cool::UInt63>();
303 folderData.AfterPrescale = payload[afterPrescaleStr].data<cool::UInt63>();
304 folderData.L1Accept = payload[l1AcceptStr].data<cool::UInt63>();
305 mymap.insert( std::pair<cool::ValidityKey, L1CountFolderData>(itr->currentRef().since(), folderData));
306 }
307
308 return mymap;
309
310}
311
312
313
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
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)
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, 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::string getHLTLowerChainName(const std::string &trigger, const std::string &folder_name)
cool::ValidityKey m_VKstop
Definition CoolQuery.h:332
static std::vector< std::string > triggerchain
Definition iLumiCalc.h:34
@ kERROR
Definition TMsgLogger.h:42
@ kWARNING
Definition TMsgLogger.h:41
@ kINFO
Definition TMsgLogger.h:40
int run(int argc, char *argv[])