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 <iostream>
00024 #include <cstring>
00025 #include <cstdlib>
00026 #include <memory>
00027 #include <algorithm>
00028 #include <map>
00029 #include "TFile.h"
00030 #include "TTree.h"
00031 namespace lumi{
00032 class Lumi2DB : public DataPipe{
00033 public:
00034 const static unsigned int COMMITLSINTERVAL=500;
00035 const static unsigned int NORMFACTOR=6370;
00036 Lumi2DB(const std::string& dest);
00037 virtual void retrieveData( unsigned int );
00038 virtual const std::string dataType() const;
00039 virtual const std::string sourceType() const;
00040 virtual ~Lumi2DB();
00041 struct LumiSource{
00042 unsigned int run;
00043 unsigned int firstsection;
00044 char version[8];
00045 char datestr[9];
00046 };
00047 struct PerBXData{
00048
00049 float lumivalue;
00050 float lumierr;
00051 short lumiquality;
00052 };
00053 struct PerLumiData{
00054 float dtnorm;
00055 float lhcnorm;
00056 float instlumi;
00057 float instlumierror;
00058 short instlumiquality;
00059 short lumisectionquality;
00060 short cmsalive;
00061 std::string beammode;
00062 float beamenergy;
00063 short nlivebx;
00064 short* bxindex;
00065 float* beamintensity_1;
00066 float* beamintensity_2;
00067 unsigned int cmslsnr;
00068 unsigned int lumilsnr;
00069 unsigned int startorbit;
00070 unsigned int numorbit;
00071 std::vector<PerBXData> bxET;
00072 std::vector<PerBXData> bxOCC1;
00073 std::vector<PerBXData> bxOCC2;
00074 };
00075 struct beamData{
00076 float energy;
00077 std::string mode;
00078 short nlivebx;
00079 short* bxindex;
00080 float* beamintensity_1;
00081 float* beamintensity_2;
00082 };
00083 typedef std::vector<PerLumiData> LumiResult;
00084 private:
00085 void parseSourceString(lumi::Lumi2DB::LumiSource& result)const;
00086 void retrieveBeamIntensity(HCAL_HLX::DIP_COMBINED_DATA* dataPtr, Lumi2DB::beamData&b)const;
00087 void writeAllLumiData(coral::ISessionProxy* session,unsigned int irunnumber,const std::string& ilumiversion,LumiResult::iterator lumiBeg,LumiResult::iterator lumiEnd);
00088 void writeBeamIntensityOnly(coral::ISessionProxy* session,unsigned int irunnumber,const std::string& ilumiversion,LumiResult::iterator lumiBeg,LumiResult::iterator lumiEnd);
00089 bool isLumiDataValid(LumiResult::iterator lumiBeg,LumiResult::iterator lumiEnd);
00090 float applyCalibration(float varToCalibrate) const;
00091 };
00092 }
00093
00094
00095
00096
00097 float
00098 lumi::Lumi2DB::applyCalibration(float varToCalibrate)const{
00099 return float(varToCalibrate)*float(lumi::Lumi2DB::NORMFACTOR);
00100 }
00101 bool
00102 lumi::Lumi2DB::isLumiDataValid(lumi::Lumi2DB::LumiResult::iterator lumiBeg,lumi::Lumi2DB::LumiResult::iterator lumiEnd){
00103 lumi::Lumi2DB::LumiResult::iterator lumiIt;
00104 int nBad=0;
00105 for(lumiIt=lumiBeg;lumiIt!=lumiEnd;++lumiIt){
00106
00107 if(lumiIt->instlumi<=1.0e-8){
00108 ++nBad;
00109 }
00110 }
00111 if(nBad==std::distance(lumiBeg,lumiEnd)){
00112 return false;
00113 }
00114 return true;
00115 }
00116 void
00117 lumi::Lumi2DB::writeBeamIntensityOnly(
00118 coral::ISessionProxy* session,
00119 unsigned int irunnumber,
00120 const std::string& ilumiversion,
00121 lumi::Lumi2DB::LumiResult::iterator lumiBeg,
00122 lumi::Lumi2DB::LumiResult::iterator lumiEnd
00123 ){
00124 coral::AttributeList inputData;
00125 inputData.extend("bxindex",typeid(coral::Blob));
00126 inputData.extend("beamintensity_1",typeid(coral::Blob));
00127 inputData.extend("beamintensity_2",typeid(coral::Blob));
00128 inputData.extend("runnum",typeid(unsigned int));
00129 inputData.extend("startorbit",typeid(unsigned int));
00130 inputData.extend("lumiversion",typeid(std::string));
00131 coral::Blob& bxindex = inputData["bxindex"].data<coral::Blob>();
00132 coral::Blob& beamintensity_1 = inputData["beamintensity_1"].data<coral::Blob>();
00133 coral::Blob& beamintensity_2 = inputData["beamintensity_2"].data<coral::Blob>();
00134 unsigned int& runnumber = inputData["runnum"].data<unsigned int>();
00135 unsigned int& startorbit = inputData["startorbit"].data<unsigned int>();
00136 std::string& lumiversion = inputData["lumiversion"].data<std::string>();
00137
00138 lumi::Lumi2DB::LumiResult::const_iterator lumiIt;
00139 coral::IBulkOperation* summaryUpdater=0;
00140 unsigned int totallumils=std::distance(lumiBeg,lumiEnd);
00141 unsigned int lumiindx=0;
00142 unsigned int comittedls=0;
00143 std::string setClause("CMSBXINDEXBLOB=:bxindex,BEAMINTENSITYBLOB_1=:beamintensity_1,BEAMINTENSITYBLOB_2=:beamintensity_2");
00144 std::string condition("RUNNUM=:runnum AND STARTORBIT=:startorbit AND LUMIVERSION=:lumiversion");
00145 runnumber=irunnumber;
00146 lumiversion=ilumiversion;
00147 for(lumiIt=lumiBeg;lumiIt!=lumiEnd;++lumiIt,++lumiindx){
00148 if(!session->transaction().isActive()){
00149 session->transaction().start(false);
00150 }
00151 startorbit=lumiIt->startorbit;
00152
00153 short nlivebx=lumiIt->nlivebx;
00154 if(nlivebx!=0){
00155 bxindex.resize(sizeof(short)*nlivebx);
00156 beamintensity_1.resize(sizeof(float)*nlivebx);
00157 beamintensity_2.resize(sizeof(float)*nlivebx);
00158 void* bxindex_StartAddress = bxindex.startingAddress();
00159 void* beamIntensity1_StartAddress = beamintensity_1.startingAddress();
00160 void* beamIntensity2_StartAddress = beamintensity_2.startingAddress();
00161 std::memmove(bxindex_StartAddress,lumiIt->bxindex,sizeof(short)*nlivebx);
00162 std::memmove(beamIntensity1_StartAddress,lumiIt->beamintensity_1,sizeof(float)*nlivebx);
00163 std::memmove(beamIntensity2_StartAddress,lumiIt->beamintensity_2,sizeof(float)*nlivebx);
00164 ::free(lumiIt->bxindex);
00165 ::free(lumiIt->beamintensity_1);
00166 ::free(lumiIt->beamintensity_2);
00167 }else{
00168 bxindex.resize(0);
00169 beamintensity_1.resize(0);
00170 beamintensity_2.resize(0);
00171 }
00172 coral::ITable& summarytable=session->nominalSchema().tableHandle(LumiNames::lumisummaryTableName());
00173 summaryUpdater=summarytable.dataEditor().bulkUpdateRows(setClause,condition,inputData,totallumils);
00174 summaryUpdater->processNextIteration();
00175 summaryUpdater->flush();
00176 ++comittedls;
00177 if(comittedls==Lumi2DB::COMMITLSINTERVAL){
00178 std::cout<<"\t committing in LS chunck "<<comittedls<<std::endl;
00179 delete summaryUpdater;
00180 summaryUpdater=0;
00181 session->transaction().commit();
00182 comittedls=0;
00183 std::cout<<"\t committed "<<std::endl;
00184 }else if( lumiindx==(totallumils-1) ){
00185 std::cout<<"\t committing at the end"<<std::endl;
00186 delete summaryUpdater; summaryUpdater=0;
00187 session->transaction().commit();
00188 std::cout<<"\t done"<<std::endl;
00189 }
00190 }
00191 }
00192 void
00193 lumi::Lumi2DB::writeAllLumiData(
00194 coral::ISessionProxy* session,
00195 unsigned int irunnumber,
00196 const std::string& ilumiversion,
00197 lumi::Lumi2DB::LumiResult::iterator lumiBeg,
00198 lumi::Lumi2DB::LumiResult::iterator lumiEnd ){
00199 coral::AttributeList summaryData;
00200 coral::AttributeList detailData;
00201 summaryData.extend("LUMISUMMARY_ID",typeid(unsigned long long));
00202 summaryData.extend("RUNNUM",typeid(unsigned int));
00203 summaryData.extend("CMSLSNUM",typeid(unsigned int));
00204 summaryData.extend("LUMILSNUM",typeid(unsigned int));
00205 summaryData.extend("LUMIVERSION",typeid(std::string));
00206 summaryData.extend("DTNORM",typeid(float));
00207 summaryData.extend("LHCNORM",typeid(float));
00208 summaryData.extend("INSTLUMI",typeid(float));
00209 summaryData.extend("INSTLUMIERROR",typeid(float));
00210 summaryData.extend("INSTLUMIQUALITY",typeid(short));
00211 summaryData.extend("LUMISECTIONQUALITY",typeid(short));
00212 summaryData.extend("CMSALIVE",typeid(short));
00213 summaryData.extend("STARTORBIT",typeid(unsigned int));
00214 summaryData.extend("NUMORBIT",typeid(unsigned int));
00215 summaryData.extend("BEAMENERGY",typeid(float));
00216 summaryData.extend("BEAMSTATUS",typeid(std::string));
00217 summaryData.extend("CMSBXINDEXBLOB",typeid(coral::Blob));
00218 summaryData.extend("BEAMINTENSITYBLOB_1",typeid(coral::Blob));
00219 summaryData.extend("BEAMINTENSITYBLOB_2",typeid(coral::Blob));
00220
00221 detailData.extend("LUMIDETAIL_ID",typeid(unsigned long long));
00222 detailData.extend("LUMISUMMARY_ID",typeid(unsigned long long));
00223 detailData.extend("BXLUMIVALUE",typeid(coral::Blob));
00224 detailData.extend("BXLUMIERROR",typeid(coral::Blob));
00225 detailData.extend("BXLUMIQUALITY",typeid(coral::Blob));
00226 detailData.extend("ALGONAME",typeid(std::string));
00227
00228 unsigned long long& lumisummary_id=summaryData["LUMISUMMARY_ID"].data<unsigned long long>();
00229 unsigned int& lumirunnum = summaryData["RUNNUM"].data<unsigned int>();
00230 std::string& lumiversion = summaryData["LUMIVERSION"].data<std::string>();
00231 float& dtnorm = summaryData["DTNORM"].data<float>();
00232 float& lhcnorm = summaryData["LHCNORM"].data<float>();
00233 float& instlumi = summaryData["INSTLUMI"].data<float>();
00234 float& instlumierror = summaryData["INSTLUMIERROR"].data<float>();
00235 short& instlumiquality = summaryData["INSTLUMIQUALITY"].data<short>();
00236 short& lumisectionquality = summaryData["LUMISECTIONQUALITY"].data<short>();
00237 short& alive = summaryData["CMSALIVE"].data<short>();
00238 unsigned int& lumilsnr = summaryData["LUMILSNUM"].data<unsigned int>();
00239 unsigned int& cmslsnr = summaryData["CMSLSNUM"].data<unsigned int>();
00240 unsigned int& startorbit = summaryData["STARTORBIT"].data<unsigned int>();
00241 unsigned int& numorbit = summaryData["NUMORBIT"].data<unsigned int>();
00242 float& beamenergy = summaryData["BEAMENERGY"].data<float>();
00243 std::string& beamstatus = summaryData["BEAMSTATUS"].data<std::string>();
00244 coral::Blob& bxindex = summaryData["CMSBXINDEXBLOB"].data<coral::Blob>();
00245 coral::Blob& beamintensity_1 = summaryData["BEAMINTENSITYBLOB_1"].data<coral::Blob>();
00246 coral::Blob& beamintensity_2 = summaryData["BEAMINTENSITYBLOB_2"].data<coral::Blob>();
00247
00248 unsigned long long& lumidetail_id=detailData["LUMIDETAIL_ID"].data<unsigned long long>();
00249 unsigned long long& d2lumisummary_id=detailData["LUMISUMMARY_ID"].data<unsigned long long>();
00250 coral::Blob& bxlumivalue=detailData["BXLUMIVALUE"].data<coral::Blob>();
00251 coral::Blob& bxlumierror=detailData["BXLUMIERROR"].data<coral::Blob>();
00252 coral::Blob& bxlumiquality=detailData["BXLUMIQUALITY"].data<coral::Blob>();
00253 std::string& algoname=detailData["ALGONAME"].data<std::string>();
00254
00255 lumi::Lumi2DB::LumiResult::const_iterator lumiIt;
00256 coral::IBulkOperation* summaryInserter=0;
00257 coral::IBulkOperation* detailInserter=0;
00258
00259
00260 unsigned int totallumils=std::distance(lumiBeg,lumiEnd);
00261 unsigned int lumiindx=0;
00262 std::map< unsigned long long,std::vector<unsigned long long> > idallocationtable;
00263 std::cout<<"\t allocating total lumisummary ids "<<totallumils<<std::endl;
00264 std::cout<<"\t allocating total lumidetail ids "<<totallumils*lumi::N_LUMIALGO<<std::endl;
00265
00266 session->transaction().start(false);
00267 lumi::idDealer idg(session->nominalSchema());
00268 unsigned long long lumisummaryID = idg.generateNextIDForTable(LumiNames::lumisummaryTableName(),totallumils)-totallumils;
00269 unsigned long long lumidetailID=idg.generateNextIDForTable(LumiNames::lumidetailTableName(),totallumils*lumi::N_LUMIALGO)-totallumils*lumi::N_LUMIALGO;
00270 session->transaction().commit();
00271 for(lumiIt=lumiBeg;lumiIt!=lumiEnd;++lumiIt,++lumiindx,++lumisummaryID){
00272 std::vector< unsigned long long > allIDs;
00273 allIDs.reserve(1+lumi::N_LUMIALGO);
00274 allIDs.push_back(lumisummaryID);
00275 for( unsigned int j=0; j<lumi::N_LUMIALGO; ++j, ++lumidetailID){
00276 allIDs.push_back(lumidetailID);
00277 }
00278 idallocationtable.insert(std::make_pair(lumiindx,allIDs));
00279 }
00280 std::cout<<"\t all ids allocated"<<std::endl;
00281 lumiindx=0;
00282 unsigned int comittedls=0;
00283 for(lumiIt=lumiBeg;lumiIt!=lumiEnd;++lumiIt,++lumiindx){
00284 if(!session->transaction().isActive()){
00285 session->transaction().start(false);
00286 coral::ITable& summarytable=session->nominalSchema().tableHandle(LumiNames::lumisummaryTableName());
00287 summaryInserter=summarytable.dataEditor().bulkInsert(summaryData,totallumils);
00288 coral::ITable& detailtable=session->nominalSchema().tableHandle(LumiNames::lumidetailTableName());
00289 detailInserter=detailtable.dataEditor().bulkInsert(detailData,totallumils*lumi::N_LUMIALGO);
00290 }
00291 lumisummary_id=idallocationtable[lumiindx][0];
00292 lumirunnum = irunnumber;
00293 lumiversion = ilumiversion;
00294 dtnorm = lumiIt->dtnorm;
00295 lhcnorm = lumiIt->lhcnorm;
00296
00297
00298 instlumi = applyCalibration(lumiIt->instlumi);
00299 instlumierror = applyCalibration(lumiIt->instlumierror);
00300 instlumiquality = lumiIt->instlumiquality;
00301 lumisectionquality = lumiIt->lumisectionquality;
00302 alive = lumiIt->cmsalive;
00303 cmslsnr = lumiIt->cmslsnr;
00304
00305 lumilsnr = lumiIt->lumilsnr;
00306 startorbit = lumiIt->startorbit;
00307 numorbit = lumiIt->numorbit;
00308 beamenergy = lumiIt->beamenergy;
00309 beamstatus = lumiIt->beammode;
00310
00311 short nlivebx=lumiIt->nlivebx;
00312
00313 if(nlivebx!=0){
00314 bxindex.resize(sizeof(short)*nlivebx);
00315 beamintensity_1.resize(sizeof(float)*nlivebx);
00316 beamintensity_2.resize(sizeof(float)*nlivebx);
00317 void* bxindex_StartAddress = bxindex.startingAddress();
00318 void* beamIntensity1_StartAddress = beamintensity_1.startingAddress();
00319 void* beamIntensity2_StartAddress = beamintensity_2.startingAddress();
00320 std::memmove(bxindex_StartAddress,lumiIt->bxindex,sizeof(short)*nlivebx);
00321 std::memmove(beamIntensity1_StartAddress,lumiIt->beamintensity_1,sizeof(float)*nlivebx);
00322 std::memmove(beamIntensity2_StartAddress,lumiIt->beamintensity_2,sizeof(float)*nlivebx);
00323 ::free(lumiIt->bxindex);
00324 ::free(lumiIt->beamintensity_1);
00325 ::free(lumiIt->beamintensity_2);
00326 }else{
00327 bxindex.resize(0);
00328 beamintensity_1.resize(0);
00329 beamintensity_2.resize(0);
00330 }
00331
00332 summaryInserter->processNextIteration();
00333 summaryInserter->flush();
00334 unsigned int algoindx=1;
00335 for( unsigned int j=0; j<lumi:: N_LUMIALGO; ++j,++algoindx ){
00336 d2lumisummary_id=idallocationtable[lumiindx].at(0);
00337 lumidetail_id=idallocationtable[lumiindx].at(algoindx);
00338 std::vector<PerBXData>::const_iterator bxIt;
00339 std::vector<PerBXData>::const_iterator bxBeg;
00340 std::vector<PerBXData>::const_iterator bxEnd;
00341 if(j==0) {
00342 algoname=std::string("ET");
00343 bxBeg=lumiIt->bxET.begin();
00344 bxEnd=lumiIt->bxET.end();
00345 }
00346 if(j==1) {
00347 algoname=std::string("OCC1");
00348 bxBeg=lumiIt->bxOCC1.begin();
00349 bxEnd=lumiIt->bxOCC1.end();
00350 }
00351 if(j==2) {
00352 algoname=std::string("OCC2");
00353 bxBeg=lumiIt->bxOCC2.begin();
00354 bxEnd=lumiIt->bxOCC2.end();
00355 }
00356 float lumivalue[lumi::N_BX]={0.0};
00357 float lumierror[lumi::N_BX]={0.0};
00358 int lumiquality[lumi::N_BX]={0};
00359 bxlumivalue.resize(sizeof(float)*lumi::N_BX);
00360 bxlumierror.resize(sizeof(float)*lumi::N_BX);
00361 bxlumiquality.resize(sizeof(short)*lumi::N_BX);
00362 void* bxlumivalueStartAddress=bxlumivalue.startingAddress();
00363 void* bxlumierrorStartAddress=bxlumierror.startingAddress();
00364 void* bxlumiqualityStartAddress=bxlumiquality.startingAddress();
00365 unsigned int k=0;
00366 for( bxIt=bxBeg;bxIt!=bxEnd;++bxIt,++k ){
00367 lumivalue[k]=bxIt->lumivalue;
00368 lumierror[k]=bxIt->lumierr;
00369 lumiquality[k]=bxIt->lumiquality;
00370 }
00371 std::memmove(bxlumivalueStartAddress,lumivalue,sizeof(float)*lumi::N_BX);
00372 std::memmove(bxlumierrorStartAddress,lumierror,sizeof(float)*lumi::N_BX);
00373 std::memmove(bxlumiqualityStartAddress,lumiquality,sizeof(short)*lumi::N_BX);
00374 detailInserter->processNextIteration();
00375 }
00376 detailInserter->flush();
00377 ++comittedls;
00378 if(comittedls==Lumi2DB::COMMITLSINTERVAL){
00379 std::cout<<"\t committing in LS chunck "<<comittedls<<std::endl;
00380 delete summaryInserter;
00381 summaryInserter=0;
00382 delete detailInserter;
00383 detailInserter=0;
00384 session->transaction().commit();
00385 comittedls=0;
00386 std::cout<<"\t committed "<<std::endl;
00387 }else if( lumiindx==(totallumils-1) ){
00388 std::cout<<"\t committing at the end"<<std::endl;
00389 delete summaryInserter; summaryInserter=0;
00390 delete detailInserter; detailInserter=0;
00391 session->transaction().commit();
00392 std::cout<<"\t done"<<std::endl;
00393 }
00394 }
00395 }
00396
00397 lumi::Lumi2DB::Lumi2DB(const std::string& dest):DataPipe(dest){}
00398
00399 void
00400 lumi::Lumi2DB::parseSourceString(lumi::Lumi2DB::LumiSource& result)const{
00401
00402 if(m_source.length()==0) throw lumi::Exception("lumi source is not set","parseSourceString","Lumi2DB");
00403
00404 size_t tempIndex = m_source.find_last_of(".");
00405 size_t nameLength = m_source.length();
00406 std::string FileSuffix= m_source.substr(tempIndex+1,nameLength - tempIndex);
00407 std::string::size_type lastPos=m_source.find_first_not_of("_",0);
00408 std::string::size_type pos = m_source.find_first_of("_",lastPos);
00409 std::vector<std::string> pieces;
00410 while( std::string::npos != pos || std::string::npos != lastPos){
00411 pieces.push_back(m_source.substr(lastPos,pos-lastPos));
00412 lastPos=m_source.find_first_not_of("_",pos);
00413 pos=m_source.find_first_of("_",lastPos);
00414 }
00415 if( pieces[1]!="LUMI" || pieces[2]!="RAW" || FileSuffix!="root"){
00416 throw lumi::Exception("not lumi raw data file CMS_LUMI_RAW","parseSourceString","Lumi2DB");
00417 }
00418 std::strcpy(result.datestr,pieces[3].c_str());
00419 std::strcpy(result.version,pieces[5].c_str());
00420
00421 result.run = atoi(pieces[4].c_str());
00422
00423 result.firstsection = atoi(pieces[5].c_str());
00424
00425 }
00426
00427 void
00428 lumi::Lumi2DB::retrieveBeamIntensity(HCAL_HLX::DIP_COMBINED_DATA* dataPtr, Lumi2DB::beamData&b)const{
00429 if(dataPtr==0){
00430 std::cout<<"HCAL_HLX::DIP_COMBINED_DATA* dataPtr=0"<<std::endl;
00431 b.bxindex=0;
00432 b.beamintensity_1=0;
00433 b.beamintensity_2=0;
00434 b.nlivebx=0;
00435 }else{
00436 b.bxindex=(short*)::malloc(sizeof(short)*lumi::N_BX);
00437 b.beamintensity_1=(float*)::malloc(sizeof(float)*lumi::N_BX);
00438 b.beamintensity_2=(float*)::malloc(sizeof(float)*lumi::N_BX);
00439
00440
00441 short a=0;
00442 for(unsigned int i=0;i<lumi::N_BX;++i){
00443 if(i==0 && (dataPtr->Beam[0].averageBunchIntensities[0]>0 || dataPtr->Beam[1].averageBunchIntensities[0]>0) ){
00444 b.bxindex[a]=0;
00445 b.beamintensity_1[a]=dataPtr->Beam[0].averageBunchIntensities[0];
00446 b.beamintensity_2[a]=dataPtr->Beam[1].averageBunchIntensities[0];
00447 ++a;
00448 continue;
00449 }
00450 if(dataPtr->Beam[0].averageBunchIntensities[i-1]>0 || dataPtr->Beam[1].averageBunchIntensities[i-1]>0){
00451 b.bxindex[a]=i;
00452 b.beamintensity_1[a]=dataPtr->Beam[0].averageBunchIntensities[i-1];
00453 b.beamintensity_2[a]=dataPtr->Beam[1].averageBunchIntensities[i-1];
00454 ++a;
00455
00456
00457
00458 }
00459 }
00460 b.nlivebx=a;
00461 }
00462 }
00463 void
00464 lumi::Lumi2DB::retrieveData( unsigned int runnumber){
00465 lumi::Lumi2DB::LumiResult lumiresult;
00466
00467 lumi::Lumi2DB::LumiSource filenamecontent;
00468 try{
00469 parseSourceString(filenamecontent);
00470 }catch(const lumi::Exception& er){
00471 std::cout<<er.what()<<std::endl;
00472 throw er;
00473 }
00474 if( filenamecontent.run!=runnumber ){
00475 throw lumi::Exception("runnumber in file name does not match requested run number","retrieveData","Lumi2DB");
00476 }
00477 TFile* source=TFile::Open(m_source.c_str(),"READ");
00478 TTree *hlxtree = (TTree*)source->Get("HLXData");
00479 if(!hlxtree){
00480 throw lumi::Exception(std::string("non-existing HLXData "),"retrieveData","Lumi2DB");
00481 }
00482
00483 std::auto_ptr<HCAL_HLX::LUMI_SECTION> localSection(new HCAL_HLX::LUMI_SECTION);
00484 HCAL_HLX::LUMI_SECTION_HEADER* lumiheader = &(localSection->hdr);
00485 HCAL_HLX::LUMI_SUMMARY* lumisummary = &(localSection->lumiSummary);
00486 HCAL_HLX::LUMI_DETAIL* lumidetail = &(localSection->lumiDetail);
00487
00488 hlxtree->SetBranchAddress("Header.",&lumiheader);
00489 hlxtree->SetBranchAddress("Summary.",&lumisummary);
00490 hlxtree->SetBranchAddress("Detail.",&lumidetail);
00491
00492 size_t nentries=hlxtree->GetEntries();
00493
00494 std::map<unsigned int, Lumi2DB::beamData> dipmap;
00495 TTree *diptree= (TTree*)source->Get("DIPCombined");
00496 if(diptree){
00497
00498 std::auto_ptr<HCAL_HLX::DIP_COMBINED_DATA> dipdata(new HCAL_HLX::DIP_COMBINED_DATA);
00499 diptree->SetBranchAddress("DIPCombined.",&dipdata);
00500 size_t ndipentries=diptree->GetEntries();
00501 for(size_t i=0;i<ndipentries;++i){
00502 diptree->GetEntry(i);
00503 beamData b;
00504
00505
00506
00507 unsigned int dipls=dipdata->sectionNumber;
00508 if (std::string(dipdata->beamMode).empty()){
00509 b.mode="N/A";
00510 }else{
00511 b.mode=dipdata->beamMode;
00512 }
00513 b.energy=dipdata->Energy;
00514 this->retrieveBeamIntensity(dipdata.get(),b);
00515 dipmap.insert(std::make_pair(dipls,b));
00516 }
00517 }else{
00518 for(size_t i=0;i<nentries;++i){
00519 beamData b;
00520 b.mode="N/A";
00521 b.energy=0.0;
00522 this->retrieveBeamIntensity(0,b);
00523 dipmap.insert(std::make_pair(i,b));
00524 }
00525 }
00526
00527
00528 size_t ncmslumi=0;
00529 std::cout<<"processing total lumi lumisection "<<nentries<<std::endl;
00530
00531
00532
00533
00534
00535
00536 for(size_t i=0;i<nentries;++i){
00537 lumi::Lumi2DB::PerLumiData h;
00538 h.cmsalive=1;
00539 hlxtree->GetEntry(i);
00540
00541 if( !lumiheader->bCMSLive && i!=0){
00542 std::cout<<"\t non-CMS LS "<<lumiheader->sectionNumber<<" ";
00543 h.cmsalive=0;
00544 }
00545 ++ncmslumi;
00546
00547 h.bxET.reserve(lumi::N_BX);
00548 h.bxOCC1.reserve(lumi::N_BX);
00549 h.bxOCC2.reserve(lumi::N_BX);
00550
00551
00552
00553 h.lumilsnr=lumiheader->sectionNumber;
00554 std::map<unsigned int , Lumi2DB::beamData >::iterator beamIt=dipmap.find(h.lumilsnr);
00555 if ( beamIt!=dipmap.end() ){
00556 h.beammode=beamIt->second.mode;
00557 h.beamenergy=beamIt->second.energy;
00558 h.nlivebx=beamIt->second.nlivebx;
00559 if(h.nlivebx!=0){
00560 h.bxindex=(short*)malloc(sizeof(short)*h.nlivebx);
00561 h.beamintensity_1=(float*)malloc(sizeof(float)*h.nlivebx);
00562 h.beamintensity_2=(float*)malloc(sizeof(float)*h.nlivebx);
00563 if(h.bxindex==0 || h.beamintensity_1==0 || h.beamintensity_2==0){
00564 std::cout<<"malloc failed"<<std::endl;
00565 }
00566
00567
00568
00569
00570 std::memmove(h.bxindex,beamIt->second.bxindex,sizeof(short)*h.nlivebx);
00571 std::memmove(h.beamintensity_1,beamIt->second.beamintensity_1,sizeof(float)*h.nlivebx);
00572 std::memmove(h.beamintensity_2,beamIt->second.beamintensity_2,sizeof(float)*h.nlivebx);
00573
00574 ::free(beamIt->second.bxindex);beamIt->second.bxindex=0;
00575 ::free(beamIt->second.beamintensity_1);beamIt->second.beamintensity_1=0;
00576 ::free(beamIt->second.beamintensity_2);beamIt->second.beamintensity_2=0;
00577 }else{
00578
00579 h.bxindex=0;
00580 h.beamintensity_1=0;
00581 h.beamintensity_2=0;
00582 }
00583 }else{
00584 h.beammode="N/A";
00585 h.beamenergy=0.0;
00586 h.nlivebx=0;
00587 h.bxindex=0;
00588 h.beamintensity_1=0;
00589 h.beamintensity_2=0;
00590 }
00591 h.startorbit=lumiheader->startOrbit;
00592 h.numorbit=lumiheader->numOrbits;
00593 if(h.cmsalive==0){
00594 h.cmslsnr=0;
00595 }else{
00596 h.cmslsnr=ncmslumi;
00597 }
00598 h.instlumi=lumisummary->InstantLumi;
00599
00600 h.instlumierror=lumisummary->InstantLumiErr;
00601 h.lumisectionquality=lumisummary->InstantLumiQlty;
00602 h.dtnorm=lumisummary->DeadTimeNormalization;
00603 h.lhcnorm=lumisummary->LHCNormalization;
00604
00605
00606 for(size_t i=0;i<lumi::N_BX;++i){
00607 lumi::Lumi2DB::PerBXData bET;
00608 lumi::Lumi2DB::PerBXData bOCC1;
00609 lumi::Lumi2DB::PerBXData bOCC2;
00610
00611 bET.lumivalue=lumidetail->ETLumi[i];
00612 bET.lumierr=lumidetail->ETLumiErr[i];
00613 bET.lumiquality=lumidetail->ETLumiQlty[i];
00614 h.bxET.push_back(bET);
00615
00616
00617
00618 bOCC1.lumivalue=lumidetail->OccLumi[0][i];
00619 bOCC1.lumierr=lumidetail->OccLumiErr[0][i];
00626 bOCC1.lumiquality=lumidetail->OccLumiQlty[0][i];
00627 h.bxOCC1.push_back(bOCC1);
00628
00629
00630 bOCC2.lumivalue=lumidetail->OccLumi[1][i];
00631 bOCC2.lumierr=lumidetail->OccLumiErr[1][i];
00632 bOCC2.lumiquality=lumidetail->OccLumiQlty[1][i];
00633 h.bxOCC2.push_back(bOCC2);
00634 }
00635 lumiresult.push_back(h);
00636 }
00637 std::cout<<std::endl;
00638 if ( isLumiDataValid(lumiresult.begin(),lumiresult.end()) ){
00639 coral::ConnectionService* svc=new coral::ConnectionService;
00640 lumi::DBConfig dbconf(*svc);
00641 if(!m_authpath.empty()){
00642 dbconf.setAuthentication(m_authpath);
00643 }
00644 coral::ISessionProxy* session=svc->connect(m_dest,coral::Update);
00645 coral::ITypeConverter& tpc=session->typeConverter();
00646 tpc.setCppTypeForSqlType("unsigned int","NUMBER(10)");
00647 try{
00648 const std::string lversion(filenamecontent.version);
00649 if(m_mode==std::string("beamintensity_only")){
00650 writeBeamIntensityOnly(session,runnumber,lversion,lumiresult.begin(),lumiresult.end());
00651 }else{
00652 writeAllLumiData(session,runnumber,lversion,lumiresult.begin(),lumiresult.end());
00653 }
00654 }catch( const coral::Exception& er){
00655 session->transaction().rollback();
00656 delete session;
00657 delete svc;
00658 throw er;
00659 }
00660 delete session;
00661 delete svc;
00662 }else{
00663 std::cout<<"no valid lumi data found, quit"<<std::endl;
00664 throw lumi::Exception("no valid lumi data found","retrieveData","Lumi2DB");
00665 }
00666 }
00667 const std::string lumi::Lumi2DB::dataType() const{
00668 return "LUMI";
00669 }
00670 const std::string lumi::Lumi2DB::sourceType() const{
00671 return "DB";
00672 }
00673 lumi::Lumi2DB::~Lumi2DB(){}
00674
00675 #include "RecoLuminosity/LumiProducer/interface/DataPipeFactory.h"
00676 DEFINE_EDM_PLUGIN(lumi::DataPipeFactory,lumi::Lumi2DB,"Lumi2DB");
00677 #endif