CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_6_1_1/src/RecoLuminosity/LumiProducer/plugins/Lumi2DB.cc

Go to the documentation of this file.
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; //commit interval in LS,totalrow=nls*(1+nalgo)
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       //int idx;
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;//how much is in the beamintensity vector
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   };//cl Lumi2DB
00096 }//ns lumi
00097 
00098 //
00099 //implementation
00100 //
00101 float
00102 lumi::Lumi2DB::applyCalibration(float varToCalibrate)const{ //#only used for writing into schema_v1
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   // the run has at least 1 stable beams LS
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   // validate lumidata: all ls has lumi less than 0.5e-08 before calibration, then invalid data
00126   //
00127   lumi::Lumi2DB::LumiResult::iterator lumiIt;
00128   int nBad=0;
00129   for(lumiIt=lumiBeg;lumiIt!=lumiEnd;++lumiIt){
00130     //std::cout<<"instlumi before calib "<<lumiIt->instlumi<<std::endl;
00131     if(lumiIt->instlumi<=0.5e-8){//cut before calib
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     //std::cout<<"runnumber "<<irunnumber<<" starorbit "<<startorbit<<" lumiversion "<<lumiversion<<" totallumils "<<totallumils<<std::endl;
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   //one loop for ids
00283   //nested transaction doesn't work with bulk inserter
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     //instlumi = lumiIt->instlumi;
00321     //instlumierror = lumiIt->instlumierror;
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     //std::cout<<"nlivebx "<<nlivebx<<std::endl;
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       //::free(lumiIt->bxindex);
00347       //::free(lumiIt->beamintensity_1);
00348       //::free(lumiIt->beamintensity_2);
00349     }else{
00350       bxindex.resize(0);
00351       beamintensity_1.resize(0);
00352       beamintensity_2.resize(0);
00353     }
00354     //insert the new row
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   //output: lumi data id
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   //std::cout<<"entry_id "<<lumirundata.entry_id<<std::endl;
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; // not calibrated!
00532     instlumierror = lumiIt->instlumierror; // not calibrated!
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     //std::cout<<"nlivebx "<<nlivebx<<std::endl;
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       //::free(lumiIt->bxindex);
00551       //::free(lumiIt->beamintensity_1);
00552       //::free(lumiIt->beamintensity_2);
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) {//the push_back order in the input data is ET,OCC1,OCC2
00563         //algoname=std::string("ET");
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         //algoname=std::string("OCC1");
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         //algoname=std::string("OCC2");
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   //parse lumi source file name
00666   if(m_source.length()==0) throw lumi::Exception("lumi source is not set","parseSourceString","Lumi2DB");
00667   //std::cout<<"source "<<m_source<<std::endl;
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   //std::cout<<"version : "<<result.version<<std::endl;
00685   result.run = atoi(pieces[4].c_str());
00686   //std::cout<<"run : "<<result.run<<std::endl;
00687   result.firstsection = atoi(pieces[5].c_str());
00688   //std::cout<<"first section : "<< result.firstsection<<std::endl;
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;//a is position in lumidetail array
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             //if(i!=0){
00721             // std::cout<<"beam intensity "<<dataPtr->sectionNumber<<" "<<dataPtr->timestamp-1262300400<<" "<<(i-1)*10+1<<" "<<b.beamintensity_1[a]<<" "<<b.beamintensity_2[a]<<std::endl;
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   //check filename is in  lumiraw format
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   //hlxtree->Print();
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   //source->GetListOfKeys()->Print();
00765   std::map<unsigned int, Lumi2DB::beamData> dipmap;
00766   TTree *diptree= (TTree*)source->Get("DIPCombined");
00767   if(diptree){
00768     //throw lumi::Exception(std::string("non-existing DIPData "),"retrieveData","Lumi2DB");
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       //unsigned int fillnumber=dipdata->FillNumber;
00775       //std::vector<short> collidingidx;collidingidx.reserve(LUMI::N_BX);
00776       //for(unsigned int i=0;i<lumi::N_BX;++i){
00777       //int isb1colliding=dipdata->beam[0].beamConfig[i];
00778       //int isb2colliding=dipdata->beam[1].beamConfig[i];
00779       //if(isb1colliding && isb2colliding&&isb1colliding==1&&isb2colliding==1){
00780       //  collidingidx.push_back(i);
00781       //        }
00782       //}
00783       beamData b;
00784       //std::cout<<"Beam Mode : "<<dipdata->beamMode<<"\n";
00785       //std::cout<<"Beam Energy : "<<dipdata->Energy<<"\n";
00786       //std::cout<<"sectionUmber : "<<dipdata->sectionNumber<<"\n";
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   //diptree->Print();
00811  
00812   size_t ncmslumi=0;
00813   std::cout<<"processing total lumi lumisection "<<nentries<<std::endl;
00814   //size_t lumisecid=0;
00815   //unsigned int lumilumisecid=0;
00816   //runnumber=lumiheader->runNumber;
00817   //
00818   //hardcode the first LS is always alive
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     //std::cout<<"live flag "<<lumiheader->bCMSLive <<std::endl;
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){//just take the first ls
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     //runnumber=lumiheader->runNumber;
00839     //if(runnumber!=m_run) throw std::runtime_error(std::string("requested run ")+this->int2str(m_run)+" does not match runnumber in the data header "+this->int2str(runnumber));
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         //std::cout<<"h.bxindex size "<<sizeof(short)*h.nlivebx<<std::endl;
00854         //std::cout<<"h.beamintensity_1 size "<<sizeof(float)*h.nlivebx<<std::endl;
00855         //std::cout<<"h.beamintensity_2 size "<<sizeof(float)*h.nlivebx<<std::endl;
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         //std::cout<<"h.nlivebx is zero"<<std::endl;
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; //the dead ls has cmsls number=0
00882     }else{
00883       h.cmslsnr=ncmslumi;//we guess cms lumils
00884     }
00885     h.instlumi=lumisummary->InstantLumi;
00886     //std::cout<<"instant lumi "<<lumisummary->InstantLumi<<std::endl;
00887     h.instlumierror=lumisummary->InstantLumiErr;
00888     h.lumisectionquality=lumisummary->InstantLumiQlty;
00889     h.dtnorm=lumisummary->DeadTimeNormalization;
00890     h.lhcnorm=lumisummary->LHCNormalization;
00891     //unsigned int timestp=lumiheader->timestamp;
00892     //std::cout<<"cmslsnum "<<ncmslumi<<"timestp "<<timestp<<std::endl;
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       //bET.idx=i+1;
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       //bOCC1.idx=i+1;
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       //bOCC2.idx=i+1;
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;//nominal beam energy=sum(energy)/nstablebeams
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   //write to old lumisummary
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