ATLAS Offline Software
Loading...
Searching...
No Matches
CaloInfoLoader.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
3*/
4
6//
7//NAME: CaloInfoLoader.cpp
8//PACKAGE: TrigConfStorage
9//
11
12#include "./CaloInfoLoader.h"
13
14#include <CoralBase/Attribute.h>
15#include <CoralBase/AttributeList.h>
16
17#include "RelationalAccess/SchemaException.h"
18#include "RelationalAccess/ITransaction.h"
19#include "RelationalAccess/ITable.h"
20#include "RelationalAccess/ISchema.h"
21#include "RelationalAccess/ICursor.h"
22#include "RelationalAccess/IQuery.h"
23
25
26#include "./DBHelper.h"
27
28#include <iostream>
29#include <stdexcept>
30#include <sstream>
31#include <typeinfo>
32#include <iterator>
33#include <map>
34#include <string>
35
36using namespace std;
37
38namespace {
39
40 string join(const vector<int> & v) {
41 string joined("");
42 bool first=true;
43 for(int id : v) {
44 if(first) { first = false; } else { joined += ","; }
45 joined += std::to_string(id);
46 }
47 return joined;
48 }
49
50}
51
52
53bool
55
56 if(data.smk()!=0) {
57 TRG_MSG_INFO("Loading CaloInfo for SMK " << data.smk());
58 } else if( data.id()!=0 ) {
59 TRG_MSG_INFO("Loading CaloInfo with ID = " << data.id());
60 } else {
61 TRG_MSG_ERROR("Can not load CaloInfo which has no id or SMK specified");
62 throw runtime_error("Can not load CaloInfo, no SMK or Id specified");
63 }
64
65
66
67 try {
68 unsigned int schema = triggerDBSchemaVersion();
69
71
72 unique_ptr<coral::IQuery> q(m_session.nominalSchema().newQuery());
73 q->addToTableList( "L1_CALO_INFO", "L1CI" );
74 q->setRowCacheSize( 5 );
75
76 //Bind list
77 coral::AttributeList bindList;
78 bindList.extend<int>("Id");
79 std::string cond("");
80 if(data.smk()!=0) {
81 q->addToTableList( "SUPER_MASTER_TABLE", "SMT" );
82 q->addToTableList( "L1_MASTER_TABLE", "L1M" );
83 cond = "SMT.SMT_ID = :Id";
84 cond += " AND SMT.SMT_L1_MASTER_TABLE_ID = L1M.L1MT_ID";
85 cond += " AND L1CI.L1CI_ID = L1M.L1MT_CALO_INFO_ID";
86 bindList[0].data<int>() = data.smk();
87 } else {
88 cond = "L1CI.L1CI_ID = :Id";
89 bindList[0].data<int>() = data.id();
90 }
91 q->setCondition( cond, bindList );
92
93 //Output data and types
94 coral::AttributeList attList;
95 attList.extend<std::string>( "L1CI.L1CI_NAME" );
96 attList.extend<int>( "L1CI.L1CI_VERSION" );
97 if(isRun1()) {
98 attList.extend<std::string>( "L1CI.L1CI_GLOBAL_SCALE" );
99 } else {
100 attList.extend<float>( "L1CI.L1CI_GLOBAL_EM_SCALE" );
101 attList.extend<float>( "L1CI.L1CI_GLOBAL_JET_SCALE" );
102 }
103 if(isRun2() || (isRun1() && schema>=10)) {
104 attList.extend<int>( "L1CI.L1CI_XS_SIGMA_SCALE" );
105 attList.extend<int>( "L1CI.L1CI_XS_SIGMA_OFFSET" );
106 attList.extend<int>( "L1CI.L1CI_XS_XE_MIN" );
107 attList.extend<int>( "L1CI.L1CI_XS_XE_MAX" );
108 attList.extend<int>( "L1CI.L1CI_XS_TESQRT_MIN" );
109 attList.extend<int>( "L1CI.L1CI_XS_TESQRT_MAX" );
110 }
111 if(isRun1()) {
112 for(unsigned int index = 1; index <= 12 ;index++) {
113 std::stringstream helpstring;
114 helpstring << "L1CI.L1CI_JET_WEIGHT" << index;
115 attList.extend<int>( helpstring.str() );
116 }
117 }
118 if(isRun2()) {
119 attList.extend<int>( "L1CI.L1CI_MIN_TOB_EM" );
120 attList.extend<int>( "L1CI.L1CI_MIN_TOB_TAU" );
121 attList.extend<int>( "L1CI.L1CI_MIN_TOB_JETS" );
122 attList.extend<int>( "L1CI.L1CI_MIN_TOB_JETL" );
123 attList.extend<int>( "L1CI.L1CI_ISO_HA_EM" );
124 attList.extend<int>( "L1CI.L1CI_ISO_EM_EM" );
125 attList.extend<int>( "L1CI.L1CI_ISO_EM_TAU" );
126 }
127
128
129 fillQuery(q.get(),attList);
130
131 coral::ICursor& cursor = q->execute();
132
133 if(!cursor.next()) {
134 if(data.smk()!=0) {
135 TRG_MSG_ERROR("No CaloInfo exists for SMK " << data.smk());
136 } else {
137 TRG_MSG_ERROR("No CaloInfo exists with ID " << data.id());
138 }
140 throw std::runtime_error( "CaloInfoLoader >> CaloInfo not available" );
141 }
142
143 // fill the object with data
144 const coral::AttributeList& row = cursor.currentRow();
145 data.setName ( row["L1CI.L1CI_NAME"].data<std::string>() );
146 data.setVersion ( row["L1CI.L1CI_VERSION"].data<int>() );
147 if(isRun1()) {
148 if(schema <= 6)
149 data.setGlobalScale( row["L1CI.L1CI_GLOBAL_SCALE"].data<float>());
150 else
151 data.setGlobalScale( std::stof(row["L1CI.L1CI_GLOBAL_SCALE"].data<std::string>()));
152 } else {
153 data.setGlobalEmScale( row["L1CI.L1CI_GLOBAL_EM_SCALE"].data<float>() );
154 data.setGlobalJetScale( row["L1CI.L1CI_GLOBAL_JET_SCALE"].data<float>() );
155 }
156 if(isRun1()) {
157 for(unsigned int index = 1; index <= 12 ;index++) {
158 std::stringstream helpstring;
159 helpstring << "L1CI.L1CI_JET_WEIGHT" << index;
160 data.addJetWeight( static_cast<int>(row[helpstring.str()].data<int>()) );
161 }
162 }
163 if(isRun2() || (isRun1() && schema>=10)) {
164 int XSSigmaScale = row["L1CI.L1CI_XS_SIGMA_SCALE"].data<int>();
165 int XSSigmaOffset = row["L1CI.L1CI_XS_SIGMA_OFFSET"].data<int>();
166 int XEmin = row["L1CI.L1CI_XS_XE_MIN"].data<int>();
167 int XEmax = row["L1CI.L1CI_XS_XE_MAX"].data<int>();
168 int TESqrtMin = row["L1CI.L1CI_XS_TESQRT_MIN"].data<int>();
169 int TESqrtMax = row["L1CI.L1CI_XS_TESQRT_MAX"].data<int>();
170 data.metSigParam().setValues( XSSigmaScale, XSSigmaOffset,
171 XEmin, XEmax, TESqrtMin, TESqrtMax);
172 }
173
174 vector<int> mintobIDs;
175 vector<int> isoparIDs;
176 if(isRun2()) {
177 mintobIDs.push_back(row["L1CI.L1CI_MIN_TOB_EM"].data<int>());
178 mintobIDs.push_back(row["L1CI.L1CI_MIN_TOB_TAU"].data<int>());
179 mintobIDs.push_back(row["L1CI.L1CI_MIN_TOB_JETS"].data<int>());
180 mintobIDs.push_back(row["L1CI.L1CI_MIN_TOB_JETL"].data<int>());
181 isoparIDs.push_back(row["L1CI.L1CI_ISO_HA_EM"].data<int>());
182 isoparIDs.push_back(row["L1CI.L1CI_ISO_EM_EM"].data<int>());
183 isoparIDs.push_back(row["L1CI.L1CI_ISO_EM_TAU"].data<int>());
184 }
185
186 // check for uniqness of CaloInfo object
187 if ( cursor.next() ) {
188 TRG_MSG_ERROR("More than one CaloInfo exists " );
189 throw std::runtime_error( "Too many CaloInfo objects" );
190 }
191
192 if(isRun2()) {
193 loadMinTobInfo(data, mintobIDs);
194 loadIsolationInfo(data, isoparIDs);
195 }
196
198 }
199 catch( const coral::Exception& e ) {
200 TRG_MSG_ERROR("Coral::Exception: " << e.what());
201 m_session.transaction().rollback();
202 throw;
203 }
204 return true;
205}
206
207
208void
209TrigConf::CaloInfoLoader::loadMinTobInfo( CaloInfo& data, const vector<int> & mintobIDs ) {
210
211 unique_ptr<coral::IQuery> q(m_session.nominalSchema().tableHandle( "L1_CALO_MIN_TOB" ).newQuery());
212 q->setRowCacheSize( 4 );
213
214 string cond("L1CMT_ID IN (");
215 bool first=true;
216 for(int id : mintobIDs) {
217 if(first) { first = false; } else { cond += ","; }
218 cond += std::to_string(id);
219 }
220 cond += ")";
221 q->setCondition( cond, coral::AttributeList() );
222
223 coral::AttributeList attList;
224 attList.extend<int>( "L1CMT_ID" );
225 attList.extend<string>( "L1CMT_THR_TYPE" );
226 attList.extend<int>( "L1CMT_WINDOW" );
227 attList.extend<int>( "L1CMT_PT_MIN" );
228 attList.extend<int>( "L1CMT_ETA_MIN" );
229 attList.extend<int>( "L1CMT_ETA_MAX" );
230 attList.extend<int>( "L1CMT_PRIORITY" );
231 fillQuery(q.get(),attList);
232
233 coral::ICursor& cursor = q->execute();
234
235 while ( cursor.next() ) {
236
237 const coral::AttributeList& row = cursor.currentRow();
238
239 string thrtype = row["L1CMT_THR_TYPE"].data<string>();
240 int window = row["L1CMT_WINDOW"].data<int>();
241 int ptmin = row["L1CMT_PT_MIN"].data<int>();
242 int etamin = row["L1CMT_ETA_MIN"].data<int>();
243 int etamax = row["L1CMT_ETA_MAX"].data<int>();
244 int priority = row["L1CMT_PRIORITY"].data<int>();
245
246 if(ptmin<0) {
247 TRG_MSG_ERROR("MinTOBPt " << thrtype << " with pt " << ptmin << " which is less than 0");
248 throw runtime_error("PTMin of MinTOBPt found to be less than 0");
249 }
250 if(priority<0) {
251 TRG_MSG_ERROR("MinTOBPt " << thrtype << " with priority " << priority << " which is less than 0");
252 throw runtime_error("Priority of MinTOBPt found to be less than 0");
253 }
254
255 MinTOBPt mintob((unsigned int)ptmin, etamin, etamax, (unsigned int) priority);
256
257 if(thrtype=="EM") {
258 data.setMinTobEM(mintob);
259 } else if(thrtype=="TAU") {
260 data.setMinTobTau(mintob);
261 } else if(thrtype=="JETS") {
262 data.setMinTobJetSmall(mintob);
263 data.setJetWindowSizeSmall(window);
264 } else if(thrtype=="JETL") {
265 data.setMinTobJetLarge(mintob);
266 data.setJetWindowSizeLarge(window);
267 } else {
268 TRG_MSG_ERROR("Unknown threshold type " << thrtype);
269 throw runtime_error("MinTOBPt with unknown threshold type");
270 }
271
272 }
273
274}
275
276
277
278void
280
281 // first get a map of threshold type to isolation parameterizations
282
283 map<string,vector<int>> m;
284
285 {
286 unique_ptr<coral::IQuery> q(m_session.nominalSchema().tableHandle( "L1_CALO_ISOLATION" ).newQuery());
287 q->setRowCacheSize( 3 );
288
289 string cond( "L1CIS_ID IN (" + join(isoparIDs) + ")" );
290 q->setCondition( cond, coral::AttributeList() );
291
292 coral::AttributeList attList;
293 attList.extend<string>( "L1CIS_THR_TYPE" );
294 attList.extend<int>( "L1CIS_PAR1_ID" );
295 attList.extend<int>( "L1CIS_PAR2_ID" );
296 attList.extend<int>( "L1CIS_PAR3_ID" );
297 attList.extend<int>( "L1CIS_PAR4_ID" );
298 attList.extend<int>( "L1CIS_PAR5_ID" );
299 fillQuery(q.get(),attList);
300
301 coral::ICursor& cursor = q->execute();
302
303 while ( cursor.next() ) {
304
305 const coral::AttributeList& row = cursor.currentRow();
306
307 string thrtype = row["L1CIS_THR_TYPE"].data<string>();
308
309 vector<int> & idbytype = m[thrtype];
310
311 idbytype.push_back( row["L1CIS_PAR1_ID"].data<int>() );
312 idbytype.push_back( row["L1CIS_PAR2_ID"].data<int>() );
313 idbytype.push_back( row["L1CIS_PAR3_ID"].data<int>() );
314 idbytype.push_back( row["L1CIS_PAR4_ID"].data<int>() );
315 idbytype.push_back( row["L1CIS_PAR5_ID"].data<int>() );
316
317 }
318
319 }
320
321 // second get the individual parameterizations
322
323 {
324 for( const auto & isolation : m ) {
325
326 unique_ptr<coral::IQuery> q(m_session.nominalSchema().tableHandle( "L1_CALO_ISOPARAM" ).newQuery());
327 q->setRowCacheSize( 5 );
328
329 const string & thrtype = isolation.first;
330 const vector<int> & isoparIds = isolation.second;
331
332 string cond( "L1CIP_ID IN (" + join(isoparIds) + ")" );
333 q->setCondition( cond, coral::AttributeList() );
334
335 coral::AttributeList attList;
336 attList.extend<int>( "L1CIP_ID" );
337 attList.extend<int>( "L1CIP_ISO_BIT" );
338 attList.extend<int>( "L1CIP_OFFSET" );
339 attList.extend<int>( "L1CIP_SLOPE" );
340 attList.extend<int>( "L1CIP_MIN_CUT" );
341 attList.extend<int>( "L1CIP_UPPER_LIMIT" );
342 attList.extend<int>( "L1CIP_ETA_MIN" );
343 attList.extend<int>( "L1CIP_ETA_MAX" );
344 attList.extend<int>( "L1CIP_PRIORITY" );
345 fillQuery(q.get(),attList);
346
347 coral::ICursor& cursor = q->execute();
348
349 while ( cursor.next() ) {
350
351 const coral::AttributeList& row = cursor.currentRow();
352
353 unsigned int id = (unsigned int)row["L1CIP_ID"].data<int>();
354 unsigned int pos=1; // the position of this paramerization
355 for(unsigned int parId : isoparIds) {
356 if(id==parId) break;
357 ++pos;
358 }
359
360 int isobit = row["L1CIP_ISO_BIT"].data<int>();
361 int offset = row["L1CIP_OFFSET"].data<int>();
362 int slope = row["L1CIP_SLOPE"].data<int>();
363 int mincut = row["L1CIP_MIN_CUT"].data<int>();
364 int upperlimit = row["L1CIP_UPPER_LIMIT"].data<int>();
365 int etamin = row["L1CIP_ETA_MIN"].data<int>();
366 int etamax = row["L1CIP_ETA_MAX"].data<int>();
367 int priority = row["L1CIP_PRIORITY"].data<int>();
368
369
370 if(isobit>0) {
371 if(pos!=(unsigned int)isobit) {
372 TRG_MSG_ERROR(thrtype << " isolation bit " << isobit << " does not match the position it should have " << pos);
373 throw runtime_error("Isolation bit not matching");
374 }
375 data.setIsolation(thrtype, pos, IsolationParam( thrtype, isobit, offset, slope, mincut, upperlimit, etamin, etamax, priority ));
376 } else {
377 data.setIsolation(thrtype, pos, IsolationParam());
378 }
379
380
381 }
382
383 cursor.close();
384 }
385 }
386}
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
void loadMinTobInfo(CaloInfo &data, const std::vector< int > &mintobIDs)
void loadIsolationInfo(CaloInfo &data, const std::vector< int > &isoparIDs)
virtual bool load(CaloInfo &data) override
void commitSession()
commit session if not already done
Definition DBLoader.cxx:45
coral::ISessionProxy & m_session
CORAL interface to database session.
Definition DBLoader.h:68
unsigned int triggerDBSchemaVersion()
Definition DBLoader.cxx:76
void startSession()
start session if not already active
Definition DBLoader.cxx:35
bool first
Definition DeMoScan.py:534
std::string join(const std::vector< std::string > &v, const char c=',')
void fillQuery(coral::IQuery *q, coral::AttributeList &attList)
Definition DBHelper.cxx:13
Definition index.py:1
STL namespace.