00001 #ifndef RecoLuminosity_LumiProducer_Lumi2DB_H
00002 #define RecoLuminosity_LumiProducer_Lumi2DB_H
00003 #include "RelationalAccess/ConnectionService.h"
00004 #include "CoralBase/AttributeList.h"
00005 #include "CoralBase/Attribute.h"
00006 #include "CoralBase/AttributeSpecification.h"
00007 #include "CoralBase/Blob.h"
00008 #include "CoralBase/Exception.h"
00009 #include "RelationalAccess/ISessionProxy.h"
00010 #include "RelationalAccess/ITransaction.h"
00011 #include "RelationalAccess/ITypeConverter.h"
00012 #include "RelationalAccess/ISchema.h"
00013 #include "RelationalAccess/ITable.h"
00014 #include "RelationalAccess/ITableDataEditor.h"
00015 #include "RelationalAccess/IBulkOperation.h"
00016 #include "RecoLuminosity/LumiProducer/interface/LumiRawDataStructures.h"
00017 #include "RecoLuminosity/LumiProducer/interface/DataPipe.h"
00018 #include "RecoLuminosity/LumiProducer/interface/ConstantDef.h"
00019 #include "RecoLuminosity/LumiProducer/interface/LumiNames.h"
00020 #include "RecoLuminosity/LumiProducer/interface/idDealer.h"
00021 #include "RecoLuminosity/LumiProducer/interface/Exception.h"
00022 #include "RecoLuminosity/LumiProducer/interface/DBConfig.h"
00023 #include "RecoLuminosity/LumiProducer/interface/RevisionDML.h"
00024 #include <iostream>
00025 #include <cstring>
00026 #include <cstdlib>
00027 #include <memory>
00028 #include <algorithm>
00029 #include <map>
00030 #include "TFile.h"
00031 #include "TTree.h"
00032 namespace lumi{
00033 class Lumi2DB : public DataPipe{
00034 public:
00035 const static unsigned int COMMITLSINTERVAL=500;
00036 Lumi2DB(const std::string& dest);
00037 virtual unsigned long long retrieveData( unsigned int );
00038 virtual const std::string dataType() const;
00039 virtual const std::string sourceType() const;
00040 virtual ~Lumi2DB();
00041
00042 struct LumiSource{
00043 unsigned int run;
00044 unsigned int firstsection;
00045 char version[8];
00046 char datestr[9];
00047 };
00048 struct PerBXData{
00049
00050 float lumivalue;
00051 float lumierr;
00052 short lumiquality;
00053 };
00054 struct PerLumiData{
00055 float dtnorm;
00056 float lhcnorm;
00057 float instlumi;
00058 float instlumierror;
00059 short instlumiquality;
00060 short lumisectionquality;
00061 short cmsalive;
00062 std::string beammode;
00063 float beamenergy;
00064 short nlivebx;
00065 short* bxindex;
00066 float* beamintensity_1;
00067 float* beamintensity_2;
00068 unsigned int cmslsnr;
00069 unsigned int lumilsnr;
00070 unsigned int startorbit;
00071 unsigned int numorbit;
00072 std::vector<PerBXData> bxET;
00073 std::vector<PerBXData> bxOCC1;
00074 std::vector<PerBXData> bxOCC2;
00075 };
00076 struct beamData{
00077 float energy;
00078 std::string mode;
00079 short nlivebx;
00080 short* bxindex;
00081 float* beamintensity_1;
00082 float* beamintensity_2;
00083 };
00084 typedef std::vector<PerLumiData> LumiResult;
00085 bool hasStableBeam( lumi::Lumi2DB::LumiResult::iterator lumiBeg,lumi::Lumi2DB::LumiResult::iterator lumiEnd );
00086 private:
00087 void parseSourceString(lumi::Lumi2DB::LumiSource& result)const;
00088 void retrieveBeamIntensity(HCAL_HLX::DIP_COMBINED_DATA* dataPtr, Lumi2DB::beamData&b)const;
00089 void writeAllLumiData(coral::ISessionProxy* session,unsigned int irunnumber,const std::string& ilumiversion,LumiResult::iterator lumiBeg,LumiResult::iterator lumiEnd);
00090 unsigned int writeAllLumiDataToSchema2(coral::ISessionProxy* session,const std::string& source,unsigned int runnumber,float bgev,unsigned int ncollidingbunches,LumiResult::iterator lumiBeg,LumiResult::iterator lumiEnd);
00091 void writeBeamIntensityOnly(coral::ISessionProxy* session,unsigned int irunnumber,const std::string& ilumiversion,LumiResult::iterator lumiBeg,LumiResult::iterator lumiEnd);
00092 bool isLumiDataValid(LumiResult::iterator lumiBeg,LumiResult::iterator lumiEnd);
00093 float applyCalibration(float varToCalibrate) const;
00094 void cleanTemporaryMemory( lumi::Lumi2DB::LumiResult::iterator lumiBeg,lumi::Lumi2DB::LumiResult::iterator lumiEnd);
00095 };
00096 }
00097
00098
00099
00100
00101 float
00102 lumi::Lumi2DB::applyCalibration(float varToCalibrate)const{
00103 return float(varToCalibrate)*m_norm;
00104 }
00105 bool
00106 lumi::Lumi2DB::hasStableBeam( lumi::Lumi2DB::LumiResult::iterator lumiBeg,lumi::Lumi2DB::LumiResult::iterator lumiEnd ){
00107
00108
00109
00110 lumi::Lumi2DB::LumiResult::iterator lumiIt;
00111 int nStable=0;
00112 for(lumiIt=lumiBeg;lumiIt!=lumiEnd;++lumiIt){
00113 if(lumiIt->beammode=="STABLE BEAMS"){
00114 ++nStable;
00115 }
00116 }
00117 if(nStable==0){
00118 return false;
00119 }
00120 return true;
00121 }
00122 bool
00123 lumi::Lumi2DB::isLumiDataValid(lumi::Lumi2DB::LumiResult::iterator lumiBeg,lumi::Lumi2DB::LumiResult::iterator lumiEnd){
00124
00125
00126
00127 lumi::Lumi2DB::LumiResult::iterator lumiIt;
00128 int nBad=0;
00129 for(lumiIt=lumiBeg;lumiIt!=lumiEnd;++lumiIt){
00130
00131 if(lumiIt->instlumi<=0.5e-8){
00132 ++nBad;
00133 }
00134 }
00135 if(nBad==std::distance(lumiBeg,lumiEnd)){
00136 return false;
00137 }
00138 return true;
00139 }
00140 void
00141 lumi::Lumi2DB::writeBeamIntensityOnly(
00142 coral::ISessionProxy* session,
00143 unsigned int irunnumber,
00144 const std::string& ilumiversion,
00145 lumi::Lumi2DB::LumiResult::iterator lumiBeg,
00146 lumi::Lumi2DB::LumiResult::iterator lumiEnd
00147 ){
00148 coral::AttributeList inputData;
00149 inputData.extend("bxindex",typeid(coral::Blob));
00150 inputData.extend("beamintensity_1",typeid(coral::Blob));
00151 inputData.extend("beamintensity_2",typeid(coral::Blob));
00152 inputData.extend("runnum",typeid(unsigned int));
00153 inputData.extend("startorbit",typeid(unsigned int));
00154 inputData.extend("lumiversion",typeid(std::string));
00155 coral::Blob& bxindex = inputData["bxindex"].data<coral::Blob>();
00156 coral::Blob& beamintensity_1 = inputData["beamintensity_1"].data<coral::Blob>();
00157 coral::Blob& beamintensity_2 = inputData["beamintensity_2"].data<coral::Blob>();
00158 unsigned int& runnumber = inputData["runnum"].data<unsigned int>();
00159 unsigned int& startorbit = inputData["startorbit"].data<unsigned int>();
00160 std::string& lumiversion = inputData["lumiversion"].data<std::string>();
00161
00162 lumi::Lumi2DB::LumiResult::const_iterator lumiIt;
00163 coral::IBulkOperation* summaryUpdater=0;
00164 unsigned int totallumils=std::distance(lumiBeg,lumiEnd);
00165 unsigned int lumiindx=0;
00166 unsigned int comittedls=0;
00167 std::string setClause("CMSBXINDEXBLOB=:bxindex,BEAMINTENSITYBLOB_1=:beamintensity_1,BEAMINTENSITYBLOB_2=:beamintensity_2");
00168 std::string condition("RUNNUM=:runnum AND STARTORBIT=:startorbit AND LUMIVERSION=:lumiversion");
00169 runnumber=irunnumber;
00170 lumiversion=ilumiversion;
00171 for(lumiIt=lumiBeg;lumiIt!=lumiEnd;++lumiIt,++lumiindx){
00172 if(!session->transaction().isActive()){
00173 session->transaction().start(false);
00174 }
00175 startorbit=lumiIt->startorbit;
00176
00177 short nlivebx=lumiIt->nlivebx;
00178 if(nlivebx!=0){
00179 bxindex.resize(sizeof(short)*nlivebx);
00180 beamintensity_1.resize(sizeof(float)*nlivebx);
00181 beamintensity_2.resize(sizeof(float)*nlivebx);
00182 void* bxindex_StartAddress = bxindex.startingAddress();
00183 void* beamIntensity1_StartAddress = beamintensity_1.startingAddress();
00184 void* beamIntensity2_StartAddress = beamintensity_2.startingAddress();
00185 std::memmove(bxindex_StartAddress,lumiIt->bxindex,sizeof(short)*nlivebx);
00186 std::memmove(beamIntensity1_StartAddress,lumiIt->beamintensity_1,sizeof(float)*nlivebx);
00187 std::memmove(beamIntensity2_StartAddress,lumiIt->beamintensity_2,sizeof(float)*nlivebx);
00188 ::free(lumiIt->bxindex);
00189 ::free(lumiIt->beamintensity_1);
00190 ::free(lumiIt->beamintensity_2);
00191 }else{
00192 bxindex.resize(0);
00193 beamintensity_1.resize(0);
00194 beamintensity_2.resize(0);
00195 }
00196 coral::ITable& summarytable=session->nominalSchema().tableHandle(LumiNames::lumisummaryTableName());
00197 summaryUpdater=summarytable.dataEditor().bulkUpdateRows(setClause,condition,inputData,totallumils);
00198 summaryUpdater->processNextIteration();
00199 summaryUpdater->flush();
00200 ++comittedls;
00201 if(comittedls==Lumi2DB::COMMITLSINTERVAL){
00202 std::cout<<"\t committing in LS chunck "<<comittedls<<std::endl;
00203 delete summaryUpdater;
00204 summaryUpdater=0;
00205 session->transaction().commit();
00206 comittedls=0;
00207 std::cout<<"\t committed "<<std::endl;
00208 }else if( lumiindx==(totallumils-1) ){
00209 std::cout<<"\t committing at the end"<<std::endl;
00210 delete summaryUpdater; summaryUpdater=0;
00211 session->transaction().commit();
00212 std::cout<<"\t done"<<std::endl;
00213 }
00214 }
00215 }
00216 void
00217 lumi::Lumi2DB::writeAllLumiData(
00218 coral::ISessionProxy* session,
00219 unsigned int irunnumber,
00220 const std::string& ilumiversion,
00221 lumi::Lumi2DB::LumiResult::iterator lumiBeg,
00222 lumi::Lumi2DB::LumiResult::iterator lumiEnd ){
00223 coral::AttributeList summaryData;
00224 coral::AttributeList detailData;
00225 summaryData.extend("LUMISUMMARY_ID",typeid(unsigned long long));
00226 summaryData.extend("RUNNUM",typeid(unsigned int));
00227 summaryData.extend("CMSLSNUM",typeid(unsigned int));
00228 summaryData.extend("LUMILSNUM",typeid(unsigned int));
00229 summaryData.extend("LUMIVERSION",typeid(std::string));
00230 summaryData.extend("DTNORM",typeid(float));
00231 summaryData.extend("LHCNORM",typeid(float));
00232 summaryData.extend("INSTLUMI",typeid(float));
00233 summaryData.extend("INSTLUMIERROR",typeid(float));
00234 summaryData.extend("INSTLUMIQUALITY",typeid(short));
00235 summaryData.extend("LUMISECTIONQUALITY",typeid(short));
00236 summaryData.extend("CMSALIVE",typeid(short));
00237 summaryData.extend("STARTORBIT",typeid(unsigned int));
00238 summaryData.extend("NUMORBIT",typeid(unsigned int));
00239 summaryData.extend("BEAMENERGY",typeid(float));
00240 summaryData.extend("BEAMSTATUS",typeid(std::string));
00241 summaryData.extend("CMSBXINDEXBLOB",typeid(coral::Blob));
00242 summaryData.extend("BEAMINTENSITYBLOB_1",typeid(coral::Blob));
00243 summaryData.extend("BEAMINTENSITYBLOB_2",typeid(coral::Blob));
00244
00245 detailData.extend("LUMIDETAIL_ID",typeid(unsigned long long));
00246 detailData.extend("LUMISUMMARY_ID",typeid(unsigned long long));
00247 detailData.extend("BXLUMIVALUE",typeid(coral::Blob));
00248 detailData.extend("BXLUMIERROR",typeid(coral::Blob));
00249 detailData.extend("BXLUMIQUALITY",typeid(coral::Blob));
00250 detailData.extend("ALGONAME",typeid(std::string));
00251
00252 unsigned long long& lumisummary_id=summaryData["LUMISUMMARY_ID"].data<unsigned long long>();
00253 unsigned int& lumirunnum = summaryData["RUNNUM"].data<unsigned int>();
00254 std::string& lumiversion = summaryData["LUMIVERSION"].data<std::string>();
00255 float& dtnorm = summaryData["DTNORM"].data<float>();
00256 float& lhcnorm = summaryData["LHCNORM"].data<float>();
00257 float& instlumi = summaryData["INSTLUMI"].data<float>();
00258 float& instlumierror = summaryData["INSTLUMIERROR"].data<float>();
00259 short& instlumiquality = summaryData["INSTLUMIQUALITY"].data<short>();
00260 short& lumisectionquality = summaryData["LUMISECTIONQUALITY"].data<short>();
00261 short& alive = summaryData["CMSALIVE"].data<short>();
00262 unsigned int& lumilsnr = summaryData["LUMILSNUM"].data<unsigned int>();
00263 unsigned int& cmslsnr = summaryData["CMSLSNUM"].data<unsigned int>();
00264 unsigned int& startorbit = summaryData["STARTORBIT"].data<unsigned int>();
00265 unsigned int& numorbit = summaryData["NUMORBIT"].data<unsigned int>();
00266 float& beamenergy = summaryData["BEAMENERGY"].data<float>();
00267 std::string& beamstatus = summaryData["BEAMSTATUS"].data<std::string>();
00268 coral::Blob& bxindex = summaryData["CMSBXINDEXBLOB"].data<coral::Blob>();
00269 coral::Blob& beamintensity_1 = summaryData["BEAMINTENSITYBLOB_1"].data<coral::Blob>();
00270 coral::Blob& beamintensity_2 = summaryData["BEAMINTENSITYBLOB_2"].data<coral::Blob>();
00271
00272 unsigned long long& lumidetail_id=detailData["LUMIDETAIL_ID"].data<unsigned long long>();
00273 unsigned long long& d2lumisummary_id=detailData["LUMISUMMARY_ID"].data<unsigned long long>();
00274 coral::Blob& bxlumivalue=detailData["BXLUMIVALUE"].data<coral::Blob>();
00275 coral::Blob& bxlumierror=detailData["BXLUMIERROR"].data<coral::Blob>();
00276 coral::Blob& bxlumiquality=detailData["BXLUMIQUALITY"].data<coral::Blob>();
00277 std::string& algoname=detailData["ALGONAME"].data<std::string>();
00278
00279 lumi::Lumi2DB::LumiResult::const_iterator lumiIt;
00280 coral::IBulkOperation* summaryInserter=0;
00281 coral::IBulkOperation* detailInserter=0;
00282
00283
00284 unsigned int totallumils=std::distance(lumiBeg,lumiEnd);
00285 unsigned int lumiindx=0;
00286 std::map< unsigned long long,std::vector<unsigned long long> > idallocationtable;
00287 std::cout<<"\t allocating total lumisummary ids "<<totallumils<<std::endl;
00288 std::cout<<"\t allocating total lumidetail ids "<<totallumils*lumi::N_LUMIALGO<<std::endl;
00289
00290 session->transaction().start(false);
00291 lumi::idDealer idg(session->nominalSchema());
00292 unsigned long long lumisummaryID = idg.generateNextIDForTable(LumiNames::lumisummaryTableName(),totallumils)-totallumils;
00293 unsigned long long lumidetailID=idg.generateNextIDForTable(LumiNames::lumidetailTableName(),totallumils*lumi::N_LUMIALGO)-totallumils*lumi::N_LUMIALGO;
00294 session->transaction().commit();
00295 for(lumiIt=lumiBeg;lumiIt!=lumiEnd;++lumiIt,++lumiindx,++lumisummaryID){
00296 std::vector< unsigned long long > allIDs;
00297 allIDs.reserve(1+lumi::N_LUMIALGO);
00298 allIDs.push_back(lumisummaryID);
00299 for( unsigned int j=0; j<lumi::N_LUMIALGO; ++j, ++lumidetailID){
00300 allIDs.push_back(lumidetailID);
00301 }
00302 idallocationtable.insert(std::make_pair(lumiindx,allIDs));
00303 }
00304 std::cout<<"\t all ids allocated"<<std::endl;
00305 lumiindx=0;
00306 unsigned int comittedls=0;
00307 for(lumiIt=lumiBeg;lumiIt!=lumiEnd;++lumiIt,++lumiindx){
00308 if(!session->transaction().isActive()){
00309 session->transaction().start(false);
00310 coral::ITable& summarytable=session->nominalSchema().tableHandle(LumiNames::lumisummaryTableName());
00311 summaryInserter=summarytable.dataEditor().bulkInsert(summaryData,totallumils);
00312 coral::ITable& detailtable=session->nominalSchema().tableHandle(LumiNames::lumidetailTableName());
00313 detailInserter=detailtable.dataEditor().bulkInsert(detailData,totallumils*lumi::N_LUMIALGO);
00314 }
00315 lumisummary_id=idallocationtable[lumiindx][0];
00316 lumirunnum = irunnumber;
00317 lumiversion = ilumiversion;
00318 dtnorm = lumiIt->dtnorm;
00319 lhcnorm = lumiIt->lhcnorm;
00320
00321
00322 instlumi = applyCalibration(lumiIt->instlumi);
00323 instlumierror = applyCalibration(lumiIt->instlumierror);
00324 instlumiquality = lumiIt->instlumiquality;
00325 lumisectionquality = lumiIt->lumisectionquality;
00326 alive = lumiIt->cmsalive;
00327 cmslsnr = lumiIt->cmslsnr;
00328
00329 lumilsnr = lumiIt->lumilsnr;
00330 startorbit = lumiIt->startorbit;
00331 numorbit = lumiIt->numorbit;
00332 beamenergy = lumiIt->beamenergy;
00333 beamstatus = lumiIt->beammode;
00334 short nlivebx=lumiIt->nlivebx;
00335
00336 if(nlivebx!=0){
00337 bxindex.resize(sizeof(short)*nlivebx);
00338 beamintensity_1.resize(sizeof(float)*nlivebx);
00339 beamintensity_2.resize(sizeof(float)*nlivebx);
00340 void* bxindex_StartAddress = bxindex.startingAddress();
00341 void* beamIntensity1_StartAddress = beamintensity_1.startingAddress();
00342 void* beamIntensity2_StartAddress = beamintensity_2.startingAddress();
00343 std::memmove(bxindex_StartAddress,lumiIt->bxindex,sizeof(short)*nlivebx);
00344 std::memmove(beamIntensity1_StartAddress,lumiIt->beamintensity_1,sizeof(float)*nlivebx);
00345 std::memmove(beamIntensity2_StartAddress,lumiIt->beamintensity_2,sizeof(float)*nlivebx);
00346
00347
00348
00349 }else{
00350 bxindex.resize(0);
00351 beamintensity_1.resize(0);
00352 beamintensity_2.resize(0);
00353 }
00354
00355 summaryInserter->processNextIteration();
00356 summaryInserter->flush();
00357 unsigned int algoindx=1;
00358 for( unsigned int j=0; j<lumi:: N_LUMIALGO; ++j,++algoindx ){
00359 d2lumisummary_id=idallocationtable[lumiindx].at(0);
00360 lumidetail_id=idallocationtable[lumiindx].at(algoindx);
00361 std::vector<PerBXData>::const_iterator bxIt;
00362 std::vector<PerBXData>::const_iterator bxBeg;
00363 std::vector<PerBXData>::const_iterator bxEnd;
00364 if(j==0) {
00365 algoname=std::string("ET");
00366 bxBeg=lumiIt->bxET.begin();
00367 bxEnd=lumiIt->bxET.end();
00368 }
00369 if(j==1) {
00370 algoname=std::string("OCC1");
00371 bxBeg=lumiIt->bxOCC1.begin();
00372 bxEnd=lumiIt->bxOCC1.end();
00373 }
00374 if(j==2) {
00375 algoname=std::string("OCC2");
00376 bxBeg=lumiIt->bxOCC2.begin();
00377 bxEnd=lumiIt->bxOCC2.end();
00378 }
00379 float lumivalue[lumi::N_BX]={0.0};
00380 float lumierror[lumi::N_BX]={0.0};
00381 int lumiquality[lumi::N_BX]={0};
00382 bxlumivalue.resize(sizeof(float)*lumi::N_BX);
00383 bxlumierror.resize(sizeof(float)*lumi::N_BX);
00384 bxlumiquality.resize(sizeof(short)*lumi::N_BX);
00385 void* bxlumivalueStartAddress=bxlumivalue.startingAddress();
00386 void* bxlumierrorStartAddress=bxlumierror.startingAddress();
00387 void* bxlumiqualityStartAddress=bxlumiquality.startingAddress();
00388 unsigned int k=0;
00389 for( bxIt=bxBeg;bxIt!=bxEnd;++bxIt,++k ){
00390 lumivalue[k]=bxIt->lumivalue;
00391 lumierror[k]=bxIt->lumierr;
00392 lumiquality[k]=bxIt->lumiquality;
00393 }
00394 std::memmove(bxlumivalueStartAddress,lumivalue,sizeof(float)*lumi::N_BX);
00395 std::memmove(bxlumierrorStartAddress,lumierror,sizeof(float)*lumi::N_BX);
00396 std::memmove(bxlumiqualityStartAddress,lumiquality,sizeof(short)*lumi::N_BX);
00397 detailInserter->processNextIteration();
00398 }
00399 detailInserter->flush();
00400 ++comittedls;
00401 if(comittedls==Lumi2DB::COMMITLSINTERVAL){
00402 std::cout<<"\t committing in LS chunck "<<comittedls<<std::endl;
00403 delete summaryInserter;
00404 summaryInserter=0;
00405 delete detailInserter;
00406 detailInserter=0;
00407 session->transaction().commit();
00408 comittedls=0;
00409 std::cout<<"\t committed "<<std::endl;
00410 }else if( lumiindx==(totallumils-1) ){
00411 std::cout<<"\t committing at the end"<<std::endl;
00412 delete summaryInserter; summaryInserter=0;
00413 delete detailInserter; detailInserter=0;
00414 session->transaction().commit();
00415 std::cout<<"\t done"<<std::endl;
00416 }
00417 }
00418 }
00419
00420 unsigned int
00421 lumi::Lumi2DB::writeAllLumiDataToSchema2(
00422 coral::ISessionProxy* session,
00423 const std::string& source,
00424 unsigned int irunnumber,
00425 float bgev,
00426 unsigned int ncollidingbunches,
00427 lumi::Lumi2DB::LumiResult::iterator lumiBeg,
00428 lumi::Lumi2DB::LumiResult::iterator lumiEnd ){
00430
00432 std::cout<<"writeAllLumiDataToSchema2"<<std::endl;
00433 coral::AttributeList summaryData;
00434 summaryData.extend("DATA_ID",typeid(unsigned long long));
00435 summaryData.extend("RUNNUM",typeid(unsigned int));
00436 summaryData.extend("LUMILSNUM",typeid(unsigned int));
00437 summaryData.extend("CMSLSNUM",typeid(unsigned int));
00438 summaryData.extend("INSTLUMI",typeid(float));
00439 summaryData.extend("INSTLUMIERROR",typeid(float));
00440 summaryData.extend("INSTLUMIQUALITY",typeid(short));
00441 summaryData.extend("BEAMSTATUS",typeid(std::string));
00442 summaryData.extend("BEAMENERGY",typeid(float));
00443 summaryData.extend("NUMORBIT",typeid(unsigned int));
00444 summaryData.extend("STARTORBIT",typeid(unsigned int));
00445 summaryData.extend("CMSBXINDEXBLOB",typeid(coral::Blob));
00446 summaryData.extend("BEAMINTENSITYBLOB_1",typeid(coral::Blob));
00447 summaryData.extend("BEAMINTENSITYBLOB_2",typeid(coral::Blob));
00448 summaryData.extend("BXLUMIVALUE_OCC1",typeid(coral::Blob));
00449 summaryData.extend("BXLUMIERROR_OCC1",typeid(coral::Blob));
00450 summaryData.extend("BXLUMIQUALITY_OCC1",typeid(coral::Blob));
00451 summaryData.extend("BXLUMIVALUE_OCC2",typeid(coral::Blob));
00452 summaryData.extend("BXLUMIERROR_OCC2",typeid(coral::Blob));
00453 summaryData.extend("BXLUMIQUALITY_OCC2",typeid(coral::Blob));
00454 summaryData.extend("BXLUMIVALUE_ET",typeid(coral::Blob));
00455 summaryData.extend("BXLUMIERROR_ET",typeid(coral::Blob));
00456 summaryData.extend("BXLUMIQUALITY_ET",typeid(coral::Blob));
00457
00458 unsigned long long& data_id=summaryData["DATA_ID"].data<unsigned long long>();
00459 unsigned int& lumirunnum = summaryData["RUNNUM"].data<unsigned int>();
00460 unsigned int& lumilsnr = summaryData["LUMILSNUM"].data<unsigned int>();
00461 unsigned int& cmslsnr = summaryData["CMSLSNUM"].data<unsigned int>();
00462 float& instlumi = summaryData["INSTLUMI"].data<float>();
00463 float& instlumierror = summaryData["INSTLUMIERROR"].data<float>();
00464 short& instlumiquality = summaryData["INSTLUMIQUALITY"].data<short>();
00465 std::string& beamstatus = summaryData["BEAMSTATUS"].data<std::string>();
00466 float& beamenergy = summaryData["BEAMENERGY"].data<float>();
00467 unsigned int& numorbit = summaryData["NUMORBIT"].data<unsigned int>();
00468 unsigned int& startorbit = summaryData["STARTORBIT"].data<unsigned int>();
00469 coral::Blob& bxindex = summaryData["CMSBXINDEXBLOB"].data<coral::Blob>();
00470 coral::Blob& beamintensity_1 = summaryData["BEAMINTENSITYBLOB_1"].data<coral::Blob>();
00471 coral::Blob& beamintensity_2 = summaryData["BEAMINTENSITYBLOB_2"].data<coral::Blob>();
00472 coral::Blob& bxlumivalue_et=summaryData["BXLUMIVALUE_ET"].data<coral::Blob>();
00473 coral::Blob& bxlumierror_et=summaryData["BXLUMIERROR_ET"].data<coral::Blob>();
00474 coral::Blob& bxlumiquality_et=summaryData["BXLUMIQUALITY_ET"].data<coral::Blob>();
00475 coral::Blob& bxlumivalue_occ1=summaryData["BXLUMIVALUE_OCC1"].data<coral::Blob>();
00476 coral::Blob& bxlumierror_occ1=summaryData["BXLUMIERROR_OCC1"].data<coral::Blob>();
00477 coral::Blob& bxlumiquality_occ1=summaryData["BXLUMIQUALITY_OCC1"].data<coral::Blob>();
00478 coral::Blob& bxlumivalue_occ2=summaryData["BXLUMIVALUE_OCC2"].data<coral::Blob>();
00479 coral::Blob& bxlumierror_occ2=summaryData["BXLUMIERROR_OCC2"].data<coral::Blob>();
00480 coral::Blob& bxlumiquality_occ2=summaryData["BXLUMIQUALITY_OCC2"].data<coral::Blob>();
00481
00482 lumi::Lumi2DB::LumiResult::const_iterator lumiIt;
00483 coral::IBulkOperation* summaryInserter=0;
00484
00485 unsigned int totallumils=std::distance(lumiBeg,lumiEnd);
00486 unsigned int lumiindx=0;
00487 unsigned int comittedls=0;
00488
00489 unsigned long long branch_id=3;
00490 std::string branch_name("DATA");
00491 lumi::RevisionDML revisionDML;
00492 lumi::RevisionDML::LumiEntry lumirundata;
00493 std::stringstream op;
00494 op<<irunnumber;
00495 std::string runnumberStr=op.str();
00496 session->transaction().start(false);
00497 lumirundata.entry_name=runnumberStr;
00498 lumirundata.source=source;
00499 lumirundata.runnumber=irunnumber;
00500 lumirundata.bgev=bgev;
00501 lumirundata.ncollidingbunches=ncollidingbunches;
00502 lumirundata.data_id=0;
00503 lumirundata.entry_id=revisionDML.getEntryInBranchByName(session->nominalSchema(),lumi::LumiNames::lumidataTableName(),runnumberStr,branch_name);
00504
00505 if(lumirundata.entry_id==0){
00506 revisionDML.bookNewEntry(session->nominalSchema(),LumiNames::lumidataTableName(),lumirundata);
00507 std::cout<<"it's a new run lumirundata revision_id "<<lumirundata.revision_id<<" entry_id "<<lumirundata.entry_id<<" data_id "<<lumirundata.data_id<<std::endl;
00508 revisionDML.addEntry(session->nominalSchema(),LumiNames::lumidataTableName(),lumirundata,branch_id,branch_name);
00509 std::cout<<"added entry "<<std::endl;
00510 }else{
00511 revisionDML.bookNewRevision(session->nominalSchema(),LumiNames::lumidataTableName(),lumirundata);
00512 std::cout<<"lumirundata revision_id "<<lumirundata.revision_id<<" entry_id "<<lumirundata.entry_id<<" data_id "<<lumirundata.data_id<<std::endl;
00513 revisionDML.addRevision(session->nominalSchema(),LumiNames::lumidataTableName(),lumirundata,branch_id,branch_name);
00514 }
00515 revisionDML.insertLumiRunData(session->nominalSchema(),lumirundata);
00516 for(lumiIt=lumiBeg;lumiIt!=lumiEnd;++lumiIt,++lumiindx){
00517 if(!session->transaction().isActive()){
00518 session->transaction().start(false);
00519 coral::ITable& summarytable=session->nominalSchema().tableHandle(LumiNames::lumisummaryv2TableName());
00520 summaryInserter=summarytable.dataEditor().bulkInsert(summaryData,totallumils);
00521 }else{
00522 if(lumiIt==lumiBeg){
00523 coral::ITable& summarytable=session->nominalSchema().tableHandle(LumiNames::lumisummaryv2TableName());
00524 summaryInserter=summarytable.dataEditor().bulkInsert(summaryData,totallumils);
00525 }
00526 }
00527 data_id = lumirundata.data_id;
00528 lumirunnum = irunnumber;
00529 lumilsnr = lumiIt->lumilsnr;
00530 cmslsnr = lumiIt->cmslsnr;
00531 instlumi = lumiIt->instlumi;
00532 instlumierror = lumiIt->instlumierror;
00533 instlumiquality = lumiIt->instlumiquality;
00534 beamstatus = lumiIt->beammode;
00535 beamenergy = lumiIt->beamenergy;
00536 numorbit = lumiIt->numorbit;
00537 startorbit = lumiIt->startorbit;
00538 short nlivebx=lumiIt->nlivebx;
00539
00540 if(nlivebx!=0){
00541 bxindex.resize(sizeof(short)*nlivebx);
00542 beamintensity_1.resize(sizeof(float)*nlivebx);
00543 beamintensity_2.resize(sizeof(float)*nlivebx);
00544 void* bxindex_StartAddress = bxindex.startingAddress();
00545 void* beamIntensity1_StartAddress = beamintensity_1.startingAddress();
00546 void* beamIntensity2_StartAddress = beamintensity_2.startingAddress();
00547 std::memmove(bxindex_StartAddress,lumiIt->bxindex,sizeof(short)*nlivebx);
00548 std::memmove(beamIntensity1_StartAddress,lumiIt->beamintensity_1,sizeof(float)*nlivebx);
00549 std::memmove(beamIntensity2_StartAddress,lumiIt->beamintensity_2,sizeof(float)*nlivebx);
00550
00551
00552
00553 }else{
00554 bxindex.resize(0);
00555 beamintensity_1.resize(0);
00556 beamintensity_2.resize(0);
00557 }
00558 for( unsigned int j=0; j<lumi:: N_LUMIALGO; ++j ){
00559 std::vector<PerBXData>::const_iterator bxIt;
00560 std::vector<PerBXData>::const_iterator bxBeg;
00561 std::vector<PerBXData>::const_iterator bxEnd;
00562 if(j==0) {
00563
00564 bxBeg=lumiIt->bxET.begin();
00565 bxEnd=lumiIt->bxET.end();
00566 float lumivalue[lumi::N_BX]={0.0};
00567 float lumierror[lumi::N_BX]={0.0};
00568 int lumiquality[lumi::N_BX]={0};
00569 bxlumivalue_et.resize(sizeof(float)*lumi::N_BX);
00570 bxlumierror_et.resize(sizeof(float)*lumi::N_BX);
00571 bxlumiquality_et.resize(sizeof(short)*lumi::N_BX);
00572 void* bxlumivalueStartAddress=bxlumivalue_et.startingAddress();
00573 void* bxlumierrorStartAddress=bxlumierror_et.startingAddress();
00574 void* bxlumiqualityStartAddress=bxlumiquality_et.startingAddress();
00575 unsigned int k=0;
00576 for( bxIt=bxBeg;bxIt!=bxEnd;++bxIt,++k ){
00577 lumivalue[k]=bxIt->lumivalue;
00578 lumierror[k]=bxIt->lumierr;
00579 lumiquality[k]=bxIt->lumiquality;
00580 }
00581 std::memmove(bxlumivalueStartAddress,lumivalue,sizeof(float)*lumi::N_BX);
00582 std::memmove(bxlumierrorStartAddress,lumierror,sizeof(float)*lumi::N_BX);
00583 std::memmove(bxlumiqualityStartAddress,lumiquality,sizeof(short)*lumi::N_BX);
00584 }
00585 if(j==1) {
00586
00587 bxBeg=lumiIt->bxOCC1.begin();
00588 bxEnd=lumiIt->bxOCC1.end();
00589 float lumivalue[lumi::N_BX]={0.0};
00590 float lumierror[lumi::N_BX]={0.0};
00591 int lumiquality[lumi::N_BX]={0};
00592 bxlumivalue_occ1.resize(sizeof(float)*lumi::N_BX);
00593 bxlumierror_occ1.resize(sizeof(float)*lumi::N_BX);
00594 bxlumiquality_occ1.resize(sizeof(short)*lumi::N_BX);
00595 void* bxlumivalueStartAddress=bxlumivalue_occ1.startingAddress();
00596 void* bxlumierrorStartAddress=bxlumierror_occ1.startingAddress();
00597 void* bxlumiqualityStartAddress=bxlumiquality_occ1.startingAddress();
00598 unsigned int k=0;
00599 for( bxIt=bxBeg;bxIt!=bxEnd;++bxIt,++k ){
00600 lumivalue[k]=bxIt->lumivalue;
00601 lumierror[k]=bxIt->lumierr;
00602 lumiquality[k]=bxIt->lumiquality;
00603 }
00604 std::memmove(bxlumivalueStartAddress,lumivalue,sizeof(float)*lumi::N_BX);
00605 std::memmove(bxlumierrorStartAddress,lumierror,sizeof(float)*lumi::N_BX);
00606 std::memmove(bxlumiqualityStartAddress,lumiquality,sizeof(short)*lumi::N_BX);
00607 }
00608 if(j==2) {
00609
00610 bxBeg=lumiIt->bxOCC2.begin();
00611 bxEnd=lumiIt->bxOCC2.end();
00612 float lumivalue[lumi::N_BX]={0.0};
00613 float lumierror[lumi::N_BX]={0.0};
00614 int lumiquality[lumi::N_BX]={0};
00615 bxlumivalue_occ2.resize(sizeof(float)*lumi::N_BX);
00616 bxlumierror_occ2.resize(sizeof(float)*lumi::N_BX);
00617 bxlumiquality_occ2.resize(sizeof(short)*lumi::N_BX);
00618 void* bxlumivalueStartAddress=bxlumivalue_occ2.startingAddress();
00619 void* bxlumierrorStartAddress=bxlumierror_occ2.startingAddress();
00620 void* bxlumiqualityStartAddress=bxlumiquality_occ2.startingAddress();
00621 unsigned int k=0;
00622 for( bxIt=bxBeg;bxIt!=bxEnd;++bxIt,++k ){
00623 lumivalue[k]=bxIt->lumivalue;
00624 lumierror[k]=bxIt->lumierr;
00625 lumiquality[k]=bxIt->lumiquality;
00626 }
00627 std::memmove(bxlumivalueStartAddress,lumivalue,sizeof(float)*lumi::N_BX);
00628 std::memmove(bxlumierrorStartAddress,lumierror,sizeof(float)*lumi::N_BX);
00629 std::memmove(bxlumiqualityStartAddress,lumiquality,sizeof(short)*lumi::N_BX);
00630 }
00631 }
00632 summaryInserter->processNextIteration();
00633 summaryInserter->flush();
00634 ++comittedls;
00635 if(comittedls==Lumi2DB::COMMITLSINTERVAL){
00636 std::cout<<"\t committing in LS chunck "<<comittedls<<std::endl;
00637 delete summaryInserter;
00638 summaryInserter=0;
00639 session->transaction().commit();
00640 comittedls=0;
00641 std::cout<<"\t committed "<<std::endl;
00642 }else if( lumiindx==(totallumils-1) ){
00643 std::cout<<"\t committing at the end"<<std::endl;
00644 delete summaryInserter; summaryInserter=0;
00645 session->transaction().commit();
00646 std::cout<<"\t done"<<std::endl;
00647 }
00648 }
00649 return lumirundata.data_id;
00650 }
00651
00652 void lumi::Lumi2DB::cleanTemporaryMemory( lumi::Lumi2DB::LumiResult::iterator lumiBeg,
00653 lumi::Lumi2DB::LumiResult::iterator lumiEnd){
00654 lumi::Lumi2DB::LumiResult::const_iterator lumiIt;
00655 for(lumiIt=lumiBeg;lumiIt!=lumiEnd;++lumiIt){
00656 ::free(lumiIt->bxindex);
00657 ::free(lumiIt->beamintensity_1);
00658 ::free(lumiIt->beamintensity_2);
00659 }
00660
00661 }
00662 lumi::Lumi2DB::Lumi2DB(const std::string& dest):DataPipe(dest){}
00663 void
00664 lumi::Lumi2DB::parseSourceString(lumi::Lumi2DB::LumiSource& result)const{
00665
00666 if(m_source.length()==0) throw lumi::Exception("lumi source is not set","parseSourceString","Lumi2DB");
00667
00668 size_t tempIndex = m_source.find_last_of(".");
00669 size_t nameLength = m_source.length();
00670 std::string FileSuffix= m_source.substr(tempIndex+1,nameLength - tempIndex);
00671 std::string::size_type lastPos=m_source.find_first_not_of("_",0);
00672 std::string::size_type pos = m_source.find_first_of("_",lastPos);
00673 std::vector<std::string> pieces;
00674 while( std::string::npos != pos || std::string::npos != lastPos){
00675 pieces.push_back(m_source.substr(lastPos,pos-lastPos));
00676 lastPos=m_source.find_first_not_of("_",pos);
00677 pos=m_source.find_first_of("_",lastPos);
00678 }
00679 if( pieces[1]!="LUMI" || pieces[2]!="RAW" || FileSuffix!="root"){
00680 throw lumi::Exception("not lumi raw data file CMS_LUMI_RAW","parseSourceString","Lumi2DB");
00681 }
00682 std::strcpy(result.datestr,pieces[3].c_str());
00683 std::strcpy(result.version,pieces[5].c_str());
00684
00685 result.run = atoi(pieces[4].c_str());
00686
00687 result.firstsection = atoi(pieces[5].c_str());
00688
00689 }
00690
00691 void
00692 lumi::Lumi2DB::retrieveBeamIntensity(HCAL_HLX::DIP_COMBINED_DATA* dataPtr, Lumi2DB::beamData&b)const{
00693 if(dataPtr==0){
00694 std::cout<<"HCAL_HLX::DIP_COMBINED_DATA* dataPtr=0"<<std::endl;
00695 b.bxindex=0;
00696 b.beamintensity_1=0;
00697 b.beamintensity_2=0;
00698 b.nlivebx=0;
00699 }else{
00700 b.bxindex=(short*)::malloc(sizeof(short)*lumi::N_BX);
00701 b.beamintensity_1=(float*)::malloc(sizeof(float)*lumi::N_BX);
00702 b.beamintensity_2=(float*)::malloc(sizeof(float)*lumi::N_BX);
00703
00704 short a=0;
00705 for(unsigned int i=0;i<lumi::N_BX;++i){
00706 if( i==0 ){
00707 if(dataPtr->Beam[0].averageBunchIntensities[0]>0 || dataPtr->Beam[1].averageBunchIntensities[0]>0 ){
00708 b.bxindex[a]=0;
00709 b.beamintensity_1[a]=dataPtr->Beam[0].averageBunchIntensities[0];
00710 b.beamintensity_2[a]=dataPtr->Beam[1].averageBunchIntensities[0];
00711 ++a;
00712 }
00713 continue;
00714 }
00715 if(dataPtr->Beam[0].averageBunchIntensities[i-1]>0 || dataPtr->Beam[1].averageBunchIntensities[i-1]>0){
00716 b.bxindex[a]=i;
00717 b.beamintensity_1[a]=dataPtr->Beam[0].averageBunchIntensities[i-1];
00718 b.beamintensity_2[a]=dataPtr->Beam[1].averageBunchIntensities[i-1];
00719 ++a;
00720
00721
00722
00723 }
00724 }
00725 b.nlivebx=a;
00726 }
00727 }
00731 unsigned long long
00732 lumi::Lumi2DB::retrieveData( unsigned int runnumber){
00733 lumi::Lumi2DB::LumiResult lumiresult;
00734
00735 lumi::Lumi2DB::LumiSource filenamecontent;
00736 unsigned int lumidataid=0;
00737 try{
00738 parseSourceString(filenamecontent);
00739 }catch(const lumi::Exception& er){
00740 std::cout<<er.what()<<std::endl;
00741 throw er;
00742 }
00743 if( filenamecontent.run!=runnumber ){
00744 throw lumi::Exception("runnumber in file name does not match requested run number","retrieveData","Lumi2DB");
00745 }
00746 TFile* source=TFile::Open(m_source.c_str(),"READ");
00747 TTree *hlxtree = (TTree*)source->Get("HLXData");
00748 if(!hlxtree){
00749 throw lumi::Exception(std::string("non-existing HLXData "),"retrieveData","Lumi2DB");
00750 }
00751
00752 std::auto_ptr<HCAL_HLX::LUMI_SECTION> localSection(new HCAL_HLX::LUMI_SECTION);
00753 HCAL_HLX::LUMI_SECTION_HEADER* lumiheader = &(localSection->hdr);
00754 HCAL_HLX::LUMI_SUMMARY* lumisummary = &(localSection->lumiSummary);
00755 HCAL_HLX::LUMI_DETAIL* lumidetail = &(localSection->lumiDetail);
00756
00757 hlxtree->SetBranchAddress("Header.",&lumiheader);
00758 hlxtree->SetBranchAddress("Summary.",&lumisummary);
00759 hlxtree->SetBranchAddress("Detail.",&lumidetail);
00760
00761 size_t nentries=hlxtree->GetEntries();
00762 unsigned int nstablebeam=0;
00763 float bgev=0.0;
00764
00765 std::map<unsigned int, Lumi2DB::beamData> dipmap;
00766 TTree *diptree= (TTree*)source->Get("DIPCombined");
00767 if(diptree){
00768
00769 std::auto_ptr<HCAL_HLX::DIP_COMBINED_DATA> dipdata(new HCAL_HLX::DIP_COMBINED_DATA);
00770 diptree->SetBranchAddress("DIPCombined.",&dipdata);
00771 size_t ndipentries=diptree->GetEntries();
00772 for(size_t i=0;i<ndipentries;++i){
00773 diptree->GetEntry(i);
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783 beamData b;
00784
00785
00786
00787 unsigned int dipls=dipdata->sectionNumber;
00788 if (std::string(dipdata->beamMode).empty()){
00789 b.mode="N/A";
00790 }else{
00791 b.mode=dipdata->beamMode;
00792 }
00793 b.energy=dipdata->Energy;
00794 if(b.mode=="STABLE BEAMS"){
00795 ++nstablebeam;
00796 bgev+=b.energy;
00797 }
00798 this->retrieveBeamIntensity(dipdata.get(),b);
00799 dipmap.insert(std::make_pair(dipls,b));
00800 }
00801 }else{
00802 for(size_t i=0;i<nentries;++i){
00803 beamData b;
00804 b.mode="N/A";
00805 b.energy=0.0;
00806 this->retrieveBeamIntensity(0,b);
00807 dipmap.insert(std::make_pair(i,b));
00808 }
00809 }
00810
00811
00812 size_t ncmslumi=0;
00813 std::cout<<"processing total lumi lumisection "<<nentries<<std::endl;
00814
00815
00816
00817
00818
00819
00820 unsigned int ncollidingbunches=0;
00821 for(size_t i=0;i<nentries;++i){
00822 lumi::Lumi2DB::PerLumiData h;
00823 h.cmsalive=1;
00824 hlxtree->GetEntry(i);
00825
00826 if( !lumiheader->bCMSLive && i!=0){
00827 std::cout<<"\t non-CMS LS "<<lumiheader->sectionNumber<<" ";
00828 h.cmsalive=0;
00829 }
00830 ++ncmslumi;
00831 if(ncmslumi==1){
00832 ncollidingbunches=lumiheader->numBunches;
00833 }
00834 h.bxET.reserve(lumi::N_BX);
00835 h.bxOCC1.reserve(lumi::N_BX);
00836 h.bxOCC2.reserve(lumi::N_BX);
00837
00838
00839
00840 h.lumilsnr=lumiheader->sectionNumber;
00841 std::map<unsigned int , Lumi2DB::beamData >::iterator beamIt=dipmap.find(h.lumilsnr);
00842 if ( beamIt!=dipmap.end() ){
00843 h.beammode=beamIt->second.mode;
00844 h.beamenergy=beamIt->second.energy;
00845 h.nlivebx=beamIt->second.nlivebx;
00846 if(h.nlivebx!=0){
00847 h.bxindex=(short*)malloc(sizeof(short)*h.nlivebx);
00848 h.beamintensity_1=(float*)malloc(sizeof(float)*h.nlivebx);
00849 h.beamintensity_2=(float*)malloc(sizeof(float)*h.nlivebx);
00850 if(h.bxindex==0 || h.beamintensity_1==0 || h.beamintensity_2==0){
00851 std::cout<<"malloc failed"<<std::endl;
00852 }
00853
00854
00855
00856
00857 std::memmove(h.bxindex,beamIt->second.bxindex,sizeof(short)*h.nlivebx);
00858 std::memmove(h.beamintensity_1,beamIt->second.beamintensity_1,sizeof(float)*h.nlivebx);
00859 std::memmove(h.beamintensity_2,beamIt->second.beamintensity_2,sizeof(float)*h.nlivebx);
00860
00861 ::free(beamIt->second.bxindex);beamIt->second.bxindex=0;
00862 ::free(beamIt->second.beamintensity_1);beamIt->second.beamintensity_1=0;
00863 ::free(beamIt->second.beamintensity_2);beamIt->second.beamintensity_2=0;
00864 }else{
00865
00866 h.bxindex=0;
00867 h.beamintensity_1=0;
00868 h.beamintensity_2=0;
00869 }
00870 }else{
00871 h.beammode="N/A";
00872 h.beamenergy=0.0;
00873 h.nlivebx=0;
00874 h.bxindex=0;
00875 h.beamintensity_1=0;
00876 h.beamintensity_2=0;
00877 }
00878 h.startorbit=lumiheader->startOrbit;
00879 h.numorbit=lumiheader->numOrbits;
00880 if(h.cmsalive==0){
00881 h.cmslsnr=0;
00882 }else{
00883 h.cmslsnr=ncmslumi;
00884 }
00885 h.instlumi=lumisummary->InstantLumi;
00886
00887 h.instlumierror=lumisummary->InstantLumiErr;
00888 h.lumisectionquality=lumisummary->InstantLumiQlty;
00889 h.dtnorm=lumisummary->DeadTimeNormalization;
00890 h.lhcnorm=lumisummary->LHCNormalization;
00891
00892
00893 for(size_t i=0;i<lumi::N_BX;++i){
00894 lumi::Lumi2DB::PerBXData bET;
00895 lumi::Lumi2DB::PerBXData bOCC1;
00896 lumi::Lumi2DB::PerBXData bOCC2;
00897
00898 bET.lumivalue=lumidetail->ETLumi[i];
00899 bET.lumierr=lumidetail->ETLumiErr[i];
00900 bET.lumiquality=lumidetail->ETLumiQlty[i];
00901 h.bxET.push_back(bET);
00902
00903
00904
00905 bOCC1.lumivalue=lumidetail->OccLumi[0][i];
00906 bOCC1.lumierr=lumidetail->OccLumiErr[0][i];
00913 bOCC1.lumiquality=lumidetail->OccLumiQlty[0][i];
00914 h.bxOCC1.push_back(bOCC1);
00915
00916
00917 bOCC2.lumivalue=lumidetail->OccLumi[1][i];
00918 bOCC2.lumierr=lumidetail->OccLumiErr[1][i];
00919 bOCC2.lumiquality=lumidetail->OccLumiQlty[1][i];
00920 h.bxOCC2.push_back(bOCC2);
00921 }
00922 lumiresult.push_back(h);
00923 }
00924 std::cout<<std::endl;
00925 if(nstablebeam!=0){
00926 bgev=bgev/nstablebeam;
00927 }
00928 std::cout<<"avg stable beam energy "<<bgev<<std::endl;
00929 if( !m_novalidate && !isLumiDataValid(lumiresult.begin(),lumiresult.end()) ){
00930 throw lumi::invalidDataException("all lumi values are <0.5e-08","isLumiDataValid","Lumi2DB");
00931 }
00932 if( !m_nocheckingstablebeam && !hasStableBeam(lumiresult.begin(),lumiresult.end()) ){
00933 throw lumi::noStableBeamException("no LS has STABLE BEAMS","hasStableBeam","Lumi2DB");
00934 }
00935 coral::ConnectionService* svc=new coral::ConnectionService;
00936 lumi::DBConfig dbconf(*svc);
00937 if(!m_authpath.empty()){
00938 dbconf.setAuthentication(m_authpath);
00939 }
00940 coral::ISessionProxy* session=svc->connect(m_dest,coral::Update);
00941 coral::ITypeConverter& tpc=session->typeConverter();
00942 tpc.setCppTypeForSqlType("unsigned int","NUMBER(10)");
00943
00944
00945
00946 try{
00947 const std::string lversion(filenamecontent.version);
00948 if(m_mode==std::string("beamintensity_only")){
00949 std::cout<<"writing beam intensity only to old lumisummary table "<<std::endl;
00950 writeBeamIntensityOnly(session,runnumber,lversion,lumiresult.begin(),lumiresult.end());
00951 std::cout<<"done"<<std::endl;
00952 }else{
00953 if(m_mode=="loadoldschema"){
00954 std::cout<<"writing all lumi data to old lumisummary table "<<std::endl;
00955 writeAllLumiData(session,runnumber,lversion,lumiresult.begin(),lumiresult.end());
00956 std::cout<<"done"<<std::endl;
00957 }
00958 }
00959 std::cout<<"writing all lumi data to lumisummary_V2 table "<<std::endl;
00960 lumidataid=writeAllLumiDataToSchema2(session,m_source,runnumber,bgev,ncollidingbunches,lumiresult.begin(),lumiresult.end());
00961 std::cout<<"done"<<std::endl;
00962 cleanTemporaryMemory(lumiresult.begin(),lumiresult.end());
00963 delete session;
00964 delete svc;
00965 }catch( const coral::Exception& er){
00966 std::cout<<"database error "<<er.what()<<std::endl;
00967 session->transaction().rollback();
00968 delete session;
00969 delete svc;
00970 throw er;
00971 }
00972 return lumidataid;
00973 }
00974 const std::string lumi::Lumi2DB::dataType() const{
00975 return "LUMI";
00976 }
00977 const std::string lumi::Lumi2DB::sourceType() const{
00978 return "DB";
00979 }
00980 lumi::Lumi2DB::~Lumi2DB(){}
00981
00982 #include "RecoLuminosity/LumiProducer/interface/DataPipeFactory.h"
00983 DEFINE_EDM_PLUGIN(lumi::DataPipeFactory,lumi::Lumi2DB,"Lumi2DB");
00984 #endif