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 += 
","; }
 
   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 += 
","; }
 
  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 ));