14 #include <CoralBase/Attribute.h>
15 #include <CoralBase/AttributeList.h>
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"
35 #include "boost/lexical_cast.hpp"
41 string join(
const vector<int> &
v) {
45 if(
first) {
first =
false; }
else { joined +=
","; }
46 joined += boost::lexical_cast<string,int>(
id);
59 }
else if(
data.id()!=0 ) {
62 TRG_MSG_ERROR(
"Can not load CaloInfo which has no id or SMK specified");
63 throw runtime_error(
"Can not load CaloInfo, no SMK or Id specified");
69 unsigned int schema = triggerDBSchemaVersion();
73 unique_ptr<coral::IQuery>
q(m_session.nominalSchema().newQuery());
74 q->addToTableList(
"L1_CALO_INFO",
"L1CI" );
75 q->setRowCacheSize( 5 );
79 bindList.extend<
int>(
"Id");
82 q->addToTableList(
"SUPER_MASTER_TABLE",
"SMT" );
83 q->addToTableList(
"L1_MASTER_TABLE",
"L1M" );
84 cond =
"SMT.SMT_ID = :Id";
85 cond +=
" AND SMT.SMT_L1_MASTER_TABLE_ID = L1M.L1MT_ID";
86 cond +=
" AND L1CI.L1CI_ID = L1M.L1MT_CALO_INFO_ID";
87 bindList[0].data<
int>() =
data.smk();
89 cond =
"L1CI.L1CI_ID = :Id";
90 bindList[0].data<
int>() =
data.id();
92 q->setCondition( cond, bindList );
96 attList.extend<std::string>(
"L1CI.L1CI_NAME" );
97 attList.extend<
int>(
"L1CI.L1CI_VERSION" );
99 attList.extend<std::string>(
"L1CI.L1CI_GLOBAL_SCALE" );
101 attList.extend<
float>(
"L1CI.L1CI_GLOBAL_EM_SCALE" );
102 attList.extend<
float>(
"L1CI.L1CI_GLOBAL_JET_SCALE" );
105 attList.extend<
int>(
"L1CI.L1CI_XS_SIGMA_SCALE" );
106 attList.extend<
int>(
"L1CI.L1CI_XS_SIGMA_OFFSET" );
107 attList.extend<
int>(
"L1CI.L1CI_XS_XE_MIN" );
108 attList.extend<
int>(
"L1CI.L1CI_XS_XE_MAX" );
109 attList.extend<
int>(
"L1CI.L1CI_XS_TESQRT_MIN" );
110 attList.extend<
int>(
"L1CI.L1CI_XS_TESQRT_MAX" );
114 std::stringstream helpstring;
115 helpstring <<
"L1CI.L1CI_JET_WEIGHT" <<
index;
116 attList.extend<
int>( helpstring.str() );
120 attList.extend<
int>(
"L1CI.L1CI_MIN_TOB_EM" );
121 attList.extend<
int>(
"L1CI.L1CI_MIN_TOB_TAU" );
122 attList.extend<
int>(
"L1CI.L1CI_MIN_TOB_JETS" );
123 attList.extend<
int>(
"L1CI.L1CI_MIN_TOB_JETL" );
124 attList.extend<
int>(
"L1CI.L1CI_ISO_HA_EM" );
125 attList.extend<
int>(
"L1CI.L1CI_ISO_EM_EM" );
126 attList.extend<
int>(
"L1CI.L1CI_ISO_EM_TAU" );
132 coral::ICursor&
cursor =
q->execute();
141 throw std::runtime_error(
"CaloInfoLoader >> CaloInfo not available" );
146 data.setName (
row[
"L1CI.L1CI_NAME"].data<std::string>() );
147 data.setVersion (
row[
"L1CI.L1CI_VERSION"].data<int>() );
150 data.setGlobalScale(
row[
"L1CI.L1CI_GLOBAL_SCALE"].data<float>());
152 data.setGlobalScale( boost::lexical_cast<float,std::string>(
row[
"L1CI.L1CI_GLOBAL_SCALE"].data<std::string>()));
154 data.setGlobalEmScale(
row[
"L1CI.L1CI_GLOBAL_EM_SCALE"].data<float>() );
155 data.setGlobalJetScale(
row[
"L1CI.L1CI_GLOBAL_JET_SCALE"].data<float>() );
159 std::stringstream helpstring;
160 helpstring <<
"L1CI.L1CI_JET_WEIGHT" <<
index;
161 data.addJetWeight(
static_cast<int>(
row[helpstring.str()].data<
int>()) );
165 int XSSigmaScale =
row[
"L1CI.L1CI_XS_SIGMA_SCALE"].data<
int>();
166 int XSSigmaOffset =
row[
"L1CI.L1CI_XS_SIGMA_OFFSET"].data<
int>();
167 int XEmin =
row[
"L1CI.L1CI_XS_XE_MIN"].data<
int>();
168 int XEmax =
row[
"L1CI.L1CI_XS_XE_MAX"].data<
int>();
169 int TESqrtMin =
row[
"L1CI.L1CI_XS_TESQRT_MIN"].data<
int>();
170 int TESqrtMax =
row[
"L1CI.L1CI_XS_TESQRT_MAX"].data<
int>();
171 data.metSigParam().setValues( XSSigmaScale, XSSigmaOffset,
172 XEmin, XEmax, TESqrtMin, TESqrtMax);
175 vector<int> mintobIDs;
176 vector<int> isoparIDs;
178 mintobIDs.push_back(
row[
"L1CI.L1CI_MIN_TOB_EM"].data<int>());
179 mintobIDs.push_back(
row[
"L1CI.L1CI_MIN_TOB_TAU"].data<int>());
180 mintobIDs.push_back(
row[
"L1CI.L1CI_MIN_TOB_JETS"].data<int>());
181 mintobIDs.push_back(
row[
"L1CI.L1CI_MIN_TOB_JETL"].data<int>());
182 isoparIDs.push_back(
row[
"L1CI.L1CI_ISO_HA_EM"].data<int>());
183 isoparIDs.push_back(
row[
"L1CI.L1CI_ISO_EM_EM"].data<int>());
184 isoparIDs.push_back(
row[
"L1CI.L1CI_ISO_EM_TAU"].data<int>());
190 throw std::runtime_error(
"Too many CaloInfo objects" );
194 loadMinTobInfo(
data, mintobIDs);
195 loadIsolationInfo(
data, isoparIDs);
200 catch(
const coral::Exception&
e ) {
202 m_session.transaction().rollback();
212 unique_ptr<coral::IQuery>
q(m_session.nominalSchema().tableHandle(
"L1_CALO_MIN_TOB" ).newQuery());
213 q->setRowCacheSize( 4 );
215 string cond(
"L1CMT_ID IN (");
217 for(
int id : mintobIDs) {
218 if(
first) {
first =
false; }
else { cond +=
","; }
219 cond += boost::lexical_cast<string,int>(
id);
225 attList.extend<
int>(
"L1CMT_ID" );
226 attList.extend<
string>(
"L1CMT_THR_TYPE" );
227 attList.extend<
int>(
"L1CMT_WINDOW" );
228 attList.extend<
int>(
"L1CMT_PT_MIN" );
229 attList.extend<
int>(
"L1CMT_ETA_MIN" );
230 attList.extend<
int>(
"L1CMT_ETA_MAX" );
231 attList.extend<
int>(
"L1CMT_PRIORITY" );
234 coral::ICursor&
cursor =
q->execute();
240 string thrtype =
row[
"L1CMT_THR_TYPE"].data<
string>();
241 int window =
row[
"L1CMT_WINDOW"].data<
int>();
242 int ptmin =
row[
"L1CMT_PT_MIN"].data<
int>();
243 int etamin =
row[
"L1CMT_ETA_MIN"].data<
int>();
244 int etamax =
row[
"L1CMT_ETA_MAX"].data<
int>();
248 TRG_MSG_ERROR(
"MinTOBPt " << thrtype <<
" with pt " <<
ptmin <<
" which is less than 0");
249 throw runtime_error(
"PTMin of MinTOBPt found to be less than 0");
253 throw runtime_error(
"Priority of MinTOBPt found to be less than 0");
259 data.setMinTobEM(mintob);
260 }
else if(thrtype==
"TAU") {
261 data.setMinTobTau(mintob);
262 }
else if(thrtype==
"JETS") {
263 data.setMinTobJetSmall(mintob);
264 data.setJetWindowSizeSmall(window);
265 }
else if(thrtype==
"JETL") {
266 data.setMinTobJetLarge(mintob);
267 data.setJetWindowSizeLarge(window);
270 throw runtime_error(
"MinTOBPt with unknown threshold type");
284 map<string,vector<int>>
m;
287 unique_ptr<coral::IQuery>
q(m_session.nominalSchema().tableHandle(
"L1_CALO_ISOLATION" ).newQuery());
288 q->setRowCacheSize( 3 );
290 string cond(
"L1CIS_ID IN (" +
join(isoparIDs) +
")" );
294 attList.extend<
string>(
"L1CIS_THR_TYPE" );
295 attList.extend<
int>(
"L1CIS_PAR1_ID" );
296 attList.extend<
int>(
"L1CIS_PAR2_ID" );
297 attList.extend<
int>(
"L1CIS_PAR3_ID" );
298 attList.extend<
int>(
"L1CIS_PAR4_ID" );
299 attList.extend<
int>(
"L1CIS_PAR5_ID" );
302 coral::ICursor&
cursor =
q->execute();
308 string thrtype =
row[
"L1CIS_THR_TYPE"].data<
string>();
310 vector<int> & idbytype =
m[thrtype];
312 idbytype.push_back(
row[
"L1CIS_PAR1_ID"].data<int>() );
313 idbytype.push_back(
row[
"L1CIS_PAR2_ID"].data<int>() );
314 idbytype.push_back(
row[
"L1CIS_PAR3_ID"].data<int>() );
315 idbytype.push_back(
row[
"L1CIS_PAR4_ID"].data<int>() );
316 idbytype.push_back(
row[
"L1CIS_PAR5_ID"].data<int>() );
325 for(
const auto & isolation :
m ) {
327 unique_ptr<coral::IQuery>
q(m_session.nominalSchema().tableHandle(
"L1_CALO_ISOPARAM" ).newQuery());
328 q->setRowCacheSize( 5 );
330 const string & thrtype = isolation.first;
331 const vector<int> & isoparIds = isolation.second;
333 string cond(
"L1CIP_ID IN (" +
join(isoparIds) +
")" );
337 attList.extend<
int>(
"L1CIP_ID" );
338 attList.extend<
int>(
"L1CIP_ISO_BIT" );
339 attList.extend<
int>(
"L1CIP_OFFSET" );
340 attList.extend<
int>(
"L1CIP_SLOPE" );
341 attList.extend<
int>(
"L1CIP_MIN_CUT" );
342 attList.extend<
int>(
"L1CIP_UPPER_LIMIT" );
343 attList.extend<
int>(
"L1CIP_ETA_MIN" );
344 attList.extend<
int>(
"L1CIP_ETA_MAX" );
345 attList.extend<
int>(
"L1CIP_PRIORITY" );
348 coral::ICursor&
cursor =
q->execute();
354 unsigned int id = (
unsigned int)
row[
"L1CIP_ID"].data<int>();
356 for(
unsigned int parId : isoparIds) {
361 int isobit =
row[
"L1CIP_ISO_BIT"].data<
int>();
362 int offset =
row[
"L1CIP_OFFSET"].data<
int>();
363 int slope =
row[
"L1CIP_SLOPE"].data<
int>();
364 int mincut =
row[
"L1CIP_MIN_CUT"].data<
int>();
365 int upperlimit =
row[
"L1CIP_UPPER_LIMIT"].data<
int>();
366 int etamin =
row[
"L1CIP_ETA_MIN"].data<
int>();
367 int etamax =
row[
"L1CIP_ETA_MAX"].data<
int>();
372 if(
pos!=(
unsigned int)isobit) {
373 TRG_MSG_ERROR(thrtype <<
" isolation bit " << isobit <<
" does not match the position it should have " <<
pos);
374 throw runtime_error(
"Isolation bit not matching");
376 data.setIsolation(thrtype,
pos,
IsolationParam( thrtype, isobit,
offset, slope, mincut, upperlimit,
etamin, etamax,
priority ));