CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_5/src/RecoLuminosity/LumiProducer/plugins/LumiProducer.cc

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 //
00003 // Package:    LumiProducer
00004 // Class:      LumiProducer
00005 // 
00016 //
00017 // Original Author:  Valerie Halyo
00018 //                   David Dagenhart
00019 //                   Zhen Xie
00020 //         Created:  Tue Jun 12 00:47:28 CEST 2007
00021 // $Id: LumiProducer.cc,v 1.31 2013/05/17 20:54:13 chrjones Exp $
00022 
00023 #include "FWCore/Framework/interface/one/EDProducer.h"
00024 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00025 #include "FWCore/Framework/interface/Event.h"
00026 #include "FWCore/Framework/interface/LuminosityBlock.h"
00027 #include "FWCore/Framework/interface/Run.h"
00028 #include "DataFormats/Provenance/interface/BranchType.h"
00029 #include "DataFormats/Provenance/interface/LuminosityBlockID.h"
00030 #include "DataFormats/Luminosity/interface/LumiSummaryRunHeader.h"
00031 #include "DataFormats/Luminosity/interface/LumiSummary.h"
00032 #include "DataFormats/Luminosity/interface/LumiDetails.h"
00033 #include "FWCore/ServiceRegistry/interface/Service.h"
00034 #include "FWCore/Framework/interface/EventSetup.h"
00035 
00036 #include "CoralBase/Exception.h"
00037 #include "CoralBase/AttributeList.h"
00038 #include "CoralBase/Attribute.h"
00039 #include "CoralBase/AttributeSpecification.h"
00040 #include "CoralBase/Exception.h"
00041 #include "CoralBase/Blob.h"
00042 #include "RelationalAccess/ISessionProxy.h"
00043 #include "RelationalAccess/ITransaction.h"
00044 #include "RelationalAccess/AccessMode.h"
00045 #include "RelationalAccess/ITypeConverter.h"
00046 #include "RelationalAccess/IQuery.h"
00047 #include "RelationalAccess/ICursor.h"
00048 #include "RelationalAccess/ISchema.h"
00049 #include "RelationalAccess/ITable.h"
00050 
00051 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00052 
00053 #include "RecoLuminosity/LumiProducer/interface/DBService.h"
00054 #include "RecoLuminosity/LumiProducer/interface/LumiNames.h"
00055 #include "RecoLuminosity/LumiProducer/interface/Exception.h"
00056 #include "RecoLuminosity/LumiProducer/interface/ConstantDef.h"
00057 #include <iostream>
00058 #include <sstream>
00059 #include <string>
00060 #include <memory>
00061 #include <algorithm>
00062 #include <vector>
00063 #include <cstring>
00064 #include <iterator>
00065 #include <boost/foreach.hpp>
00066 #include <boost/tokenizer.hpp>
00067 #include <xercesc/dom/DOM.hpp>
00068 #include <xercesc/parsers/XercesDOMParser.hpp>
00069 #include <xercesc/util/PlatformUtils.hpp>
00070 #include <xercesc/util/XMLString.hpp>
00071 
00072 #include "boost/filesystem/path.hpp"
00073 #include "boost/filesystem/operations.hpp"
00074 
00075 namespace edm {
00076   class EventSetup;
00077 }
00078 
00079 //
00080 // class declaration
00081 //
00082 class LumiProducer : public edm::one::EDProducer<edm::one::WatchRuns,
00083                                                  edm::BeginLuminosityBlockProducer,
00084                                                  edm::EndRunProducer> {
00085 
00086 public:
00087 
00088   struct HLTData{
00089     std::string pathname;
00090     unsigned int prescale;
00091     unsigned int l1passcount;
00092     unsigned int acceptcount;
00093   };
00094   struct L1Data{
00095     std::string bitname;
00096     unsigned int prescale;
00097     unsigned int ratecount;
00098   };
00099   struct PerRunData{
00100     std::string bitzeroname;//norm bit name
00101     std::map<std::string, unsigned int> TRGBitNameToIndex;
00102     std::map<std::string, unsigned int> HLTPathNameToIndex;
00103     std::vector<std::string>            TRGBitNames;
00104     std::vector<std::string>            HLTPathNames;
00105   };
00106   struct PerLSData{
00107     float lumivalue;
00108     float lumierror;
00109     short lumiquality;
00110     unsigned long long deadcount;
00111     unsigned int numorbit;
00112     unsigned int startorbit;
00113     unsigned int bitzerocount;
00114     unsigned int bitzeroprescale;
00115     std::vector< HLTData > hltdata;
00116     std::vector< L1Data > l1data;
00117     std::vector< std::pair<std::string, std::vector<float> > > bunchlumivalue;
00118     std::vector< std::pair<std::string, std::vector<float> > > bunchlumierror;
00119     std::vector< std::pair<std::string, std::vector<short> > > bunchlumiquality;
00120     std::vector<float> beam1intensity;
00121     std::vector<float> beam2intensity;
00122   };
00123 
00124   explicit LumiProducer(const edm::ParameterSet&);
00125 
00126   ~LumiProducer();
00127   
00128 private:
00129   
00130   virtual void produce(edm::Event&, const edm::EventSetup&) override final;
00131 
00132   virtual void beginRun(edm::Run const&, edm::EventSetup const &) override final;
00133 
00134   virtual void beginLuminosityBlockProduce(edm::LuminosityBlock & iLBlock,
00135                                     edm::EventSetup const& iSetup) override final;
00136  
00137   virtual void endRun(edm::Run const&, edm::EventSetup const &) override final;
00138   virtual void endRunProduce(edm::Run&, edm::EventSetup const &) override final;
00139 
00140   bool fillLumi(edm::LuminosityBlock & iLBlock);
00141   void fillRunCache(const coral::ISchema& schema,unsigned int runnumber);
00142   void fillLSCache(unsigned int luminum);
00143   void writeProductsForEntry(edm::LuminosityBlock & iLBlock,unsigned int runnumber,unsigned int luminum);
00144   const std::string servletTranslation(const std::string& servlet) const;
00145   std::string x2s(const XMLCh* input)const;
00146   XMLCh* s2x(const std::string& input)const;
00147   std::string toParentString(const xercesc::DOMNode &nodeToConvert)const;
00148   unsigned long long getLumiDataId(const coral::ISchema& schema,unsigned int runnumber);
00149   unsigned long long getTrgDataId(const coral::ISchema& schema,unsigned int runnumber);
00150   unsigned long long getHltDataId(const coral::ISchema& schema,unsigned int runnumber);
00151   std::string getCurrentDataTag(const coral::ISchema& schema);
00152   std::string m_connectStr;
00153   std::string m_lumiversion;
00154   std::string m_siteconfpath;
00155   unsigned int m_cachedrun;
00156   unsigned long long m_cachedlumidataid;
00157   unsigned long long m_cachedtrgdataid;
00158   unsigned long long m_cachedhltdataid;
00159   PerRunData  m_runcache;
00160   std::map< unsigned int,PerLSData > m_lscache;
00161   bool m_isNullRun;
00162   unsigned int m_cachesize;
00163 };
00164 
00165 //
00166 // constructors and destructor
00167 //
00168 
00169 std::string 
00170 LumiProducer::x2s(const XMLCh *toTranscode)const{
00171   std::string tmp(xercesc::XMLString::transcode(toTranscode));
00172   return tmp;
00173 }
00174 
00175 XMLCh*  
00176 LumiProducer::s2x( const std::string& temp )const{
00177   XMLCh* buff = xercesc::XMLString::transcode(temp.c_str());    
00178   return  buff;
00179 }
00180 
00181 std::string
00182 LumiProducer::toParentString(const xercesc::DOMNode &nodeToConvert)const{
00183   std::ostringstream oss;
00184   xercesc::DOMNodeList *childList = nodeToConvert.getChildNodes();
00185 
00186   unsigned int numNodes = childList->getLength ();
00187   for (unsigned int i = 0; i < numNodes; ++i){
00188     xercesc::DOMNode *childNode = childList->item(i);
00189     if (childNode->getNodeType() != xercesc::DOMNode::ELEMENT_NODE)
00190       continue;
00191     xercesc::DOMElement *child = static_cast < xercesc::DOMElement *> (childNode);
00192     xercesc::DOMNamedNodeMap *attributes = child->getAttributes();
00193     unsigned int numAttributes = attributes->getLength ();
00194     for (unsigned int j = 0; j < numAttributes; ++j){
00195       xercesc::DOMNode *attributeNode = attributes->item(j);
00196       if (attributeNode->getNodeType() != xercesc::DOMNode::ATTRIBUTE_NODE)
00197         continue;
00198       xercesc::DOMAttr *attribute = static_cast <xercesc::DOMAttr *> (attributeNode);
00199       
00200       oss << "(" << x2s(child->getTagName()) << 
00201         x2s(attribute->getName()) << "=" << 
00202         x2s(attribute->getValue()) << ")";
00203     }
00204   }
00205   return oss.str();
00206 }
00207 
00208 const std::string
00209 LumiProducer::servletTranslation(const std::string& servlet) const{
00210   std::string frontierConnect;
00211   std::string realconnect;
00212   xercesc::XMLPlatformUtils::Initialize();  
00213   std::auto_ptr< xercesc::XercesDOMParser > parser(new xercesc::XercesDOMParser);
00214   try{
00215     parser->setValidationScheme(xercesc::XercesDOMParser::Val_Auto);
00216     parser->setDoNamespaces(false);
00217     parser->parse(m_siteconfpath.c_str());
00218     xercesc::DOMDocument* doc=parser->getDocument();
00219     if(!doc){
00220       return "";
00221     }
00222    
00223     xercesc::DOMNodeList *frontierConnectList=doc->getElementsByTagName(s2x("frontier-connect"));
00224     if (frontierConnectList->getLength()>0){
00225       xercesc::DOMElement *frontierConnectElement=static_cast < xercesc::DOMElement *> (frontierConnectList->item (0));
00226       frontierConnect = toParentString(*frontierConnectElement);
00227     }
00228     // Replace the last component of every "serverurl=" piece (up to the
00229     //   next close-paren) with the servlet
00230     std::string::size_type nextparen = 0;
00231     std::string::size_type serverurl, lastslash;
00232     std::string complexstr = "";
00233     while ((serverurl=frontierConnect.find("(serverurl=", nextparen)) != std::string::npos){
00234       realconnect.append(frontierConnect, nextparen, serverurl - nextparen);
00235       nextparen=frontierConnect.find(')', serverurl);
00236       lastslash=frontierConnect.rfind('/', nextparen);
00237       realconnect.append(frontierConnect,serverurl,lastslash-serverurl+1);
00238       realconnect.append(servlet);
00239     }
00240     realconnect.append(frontierConnect, nextparen,frontierConnect.length()-nextparen);
00241   }catch(xercesc::DOMException &e){
00242   }
00243   return realconnect;
00244 }
00245 
00246 LumiProducer::
00247 LumiProducer::LumiProducer(const edm::ParameterSet& iConfig):m_cachedrun(0),m_isNullRun(false),m_cachesize(0)
00248 {
00249   // register your products
00250   produces<LumiSummaryRunHeader, edm::InRun>();
00251   produces<LumiSummary, edm::InLumi>();
00252   produces<LumiDetails, edm::InLumi>();
00253   // set up cache
00254   std::string connectStr=iConfig.getParameter<std::string>("connect");
00255   m_cachesize=iConfig.getUntrackedParameter<unsigned int>("ncacheEntries",5);
00256   m_lumiversion=iConfig.getUntrackedParameter<std::string>("lumiversion","");
00257   const std::string fproto("frontier://");
00258   //test if need frontier servlet site-local translation  
00259   if(connectStr.substr(0,fproto.length())==fproto){
00260     std::string::size_type startservlet=fproto.length();
00261     std::string::size_type endservlet=connectStr.find("(",startservlet);
00262     if(endservlet==std::string::npos){
00263       endservlet=connectStr.rfind('/',connectStr.length());
00264     }
00265     std::string servlet=connectStr.substr(startservlet,endservlet-startservlet);
00266     if( (servlet !="")&& (servlet.find_first_of(":/)[]")==std::string::npos)){
00267       if(servlet=="cms_conditions_data") servlet="";
00268       
00269       std::string siteconfpath=iConfig.getUntrackedParameter<std::string>("siteconfpath","");
00270       if(siteconfpath.length()==0){
00271         std::string url=(boost::filesystem::path("SITECONF")/boost::filesystem::path("local")/boost::filesystem::path("JobConfig")/boost::filesystem::path("site-local-config.xml")).string();
00272         char * tmp = getenv ("CMS_PATH");
00273         if(tmp){
00274           m_siteconfpath = (boost::filesystem::path(tmp)/boost::filesystem::path(url)).string();
00275         }
00276       }else{
00277         if(!boost::filesystem::exists(boost::filesystem::path(siteconfpath))){
00278           throw cms::Exception("Non existing path ")<<siteconfpath;
00279         }
00280         m_siteconfpath = (boost::filesystem::path(siteconfpath)/boost::filesystem::path("site-local-config.xml")).string();
00281       }
00282       //std::cout<<"servlet : "<<servlet<<std::endl;
00283       m_connectStr=fproto+servletTranslation(servlet)+connectStr.substr(endservlet);
00284     }else{
00285       m_connectStr=connectStr;
00286     }
00287   }else{
00288     m_connectStr=connectStr;
00289   }
00290   //std::cout<<"connect string "<< m_connectStr<<std::endl;
00291 }
00292 
00293 LumiProducer::~LumiProducer(){ 
00294 }
00295 
00296 //
00297 // member functions
00298 //
00299 void LumiProducer::produce(edm::Event& e, const edm::EventSetup& iSetup)
00300 { 
00301 }
00302 unsigned long long 
00303 LumiProducer::getLumiDataId(const coral::ISchema& schema,unsigned int runnumber){ 
00304   //
00305   //select max(data_id) from lumidata where runnum=:runnum
00306   //
00307   //std::count<<"entering getLumiDataId "<<std::endl;
00308   unsigned long long lumidataid=0;
00309   coral::AttributeList bindVariables;
00310   bindVariables.extend("runnum",typeid(unsigned int));
00311   bindVariables["runnum"].data<unsigned int>()=runnumber;
00312   coral::AttributeList lumiidOutput;
00313   lumiidOutput.extend("lumidataid",typeid(unsigned long long));
00314   coral::IQuery* lumiQuery=schema.newQuery();
00315   lumiQuery->addToTableList(lumi::LumiNames::lumidataTableName());
00316   lumiQuery->addToOutputList("MAX(DATA_ID)","lumidataid");
00317   lumiQuery->setCondition("RUNNUM=:runnum",bindVariables);
00318   lumiQuery->defineOutput(lumiidOutput);
00319   coral::ICursor& lumicursor=lumiQuery->execute();
00320   while( lumicursor.next() ){
00321     const coral::AttributeList& row=lumicursor.currentRow();
00322     if(!row["lumidataid"].isNull()){
00323       lumidataid=row["lumidataid"].data<unsigned long long>();
00324     }
00325   }
00326   delete lumiQuery;
00327   return lumidataid;
00328 }
00329 unsigned long long 
00330 LumiProducer::getTrgDataId(const coral::ISchema& schema,unsigned int runnumber){
00331   //
00332   //select max(data_id) from trgdata where runnum=:runnum
00333   //
00334   unsigned long long trgdataid=0;
00335   coral::AttributeList bindVariables;
00336   bindVariables.extend("runnum",typeid(unsigned int));
00337   bindVariables["runnum"].data<unsigned int>()=runnumber;
00338   coral::AttributeList trgidOutput;
00339   trgidOutput.extend("trgdataid",typeid(unsigned long long));
00340   coral::IQuery* trgQuery=schema.newQuery();
00341   trgQuery->addToTableList(lumi::LumiNames::trgdataTableName());
00342   trgQuery->addToOutputList("MAX(DATA_ID)","trgdataid");
00343   trgQuery->setCondition("RUNNUM=:runnum",bindVariables);
00344   trgQuery->defineOutput(trgidOutput);
00345   coral::ICursor& trgcursor=trgQuery->execute();
00346   while( trgcursor.next() ){
00347     const coral::AttributeList& row=trgcursor.currentRow();
00348     if(!row["trgdataid"].isNull()){
00349       trgdataid=row["trgdataid"].data<unsigned long long>();
00350     }
00351   }
00352   delete trgQuery;
00353   return trgdataid;
00354 }
00355 unsigned long long 
00356 LumiProducer::getHltDataId(const coral::ISchema& schema,unsigned int runnumber){
00357   //
00358   //select max(data_id) from hltdata where runnum=:runnum
00359   //
00360   unsigned long long hltdataid=0;
00361   coral::AttributeList bindVariables;
00362   bindVariables.extend("runnum",typeid(unsigned int));
00363   bindVariables["runnum"].data<unsigned int>()=runnumber;
00364   coral::AttributeList hltidOutput;
00365   hltidOutput.extend("hltdataid",typeid(unsigned long long));
00366   coral::IQuery* hltQuery=schema.newQuery();
00367   hltQuery->addToTableList(lumi::LumiNames::hltdataTableName());
00368   hltQuery->addToOutputList("MAX(DATA_ID)","hltdataid");
00369   hltQuery->setCondition("RUNNUM=:runnum",bindVariables);
00370   hltQuery->defineOutput(hltidOutput);
00371   coral::ICursor& hltcursor=hltQuery->execute();
00372   while( hltcursor.next() ){
00373     const coral::AttributeList& row=hltcursor.currentRow();
00374     if(!row["hltdataid"].isNull()){
00375       hltdataid=row["hltdataid"].data<unsigned long long>();
00376     }
00377   }
00378   delete hltQuery;
00379   return hltdataid;
00380 }
00381 
00382 std::string 
00383 LumiProducer::getCurrentDataTag(const coral::ISchema& schema){
00384   //select tagid,tagname from tags
00385   std::string result;
00386   std::map<unsigned long long,std::string> alltags;
00387   coral::IQuery* tagQuery=schema.newQuery();
00388   tagQuery->addToTableList(lumi::LumiNames::tagsTableName());
00389   tagQuery->addToOutputList("TAGID");
00390   tagQuery->addToOutputList("TAGNAME");
00391   coral::AttributeList tagoutput;
00392   tagoutput.extend("TAGID",typeid(unsigned long long));
00393   tagoutput.extend("TAGNAME",typeid(std::string));
00394   tagQuery->defineOutput(tagoutput);
00395   coral::ICursor& tagcursor=tagQuery->execute();
00396   while( tagcursor.next() ){
00397     const coral::AttributeList& row=tagcursor.currentRow();
00398     unsigned long long tagid=row["TAGID"].data<unsigned long long>();
00399     const std::string  tagname=row["TAGNAME"].data<std::string>();
00400     alltags.insert(std::make_pair(tagid,tagname));
00401   }
00402   delete tagQuery;
00403   unsigned long long maxid=0;
00404   for(std::map<unsigned long long,std::string>::iterator it = alltags.begin(); it !=alltags.end(); ++it) {
00405     if( it->first > maxid){
00406       maxid=it->first;
00407     }
00408   }
00409   result=alltags[maxid];
00410   return result;
00411 }
00412 
00413 void 
00414 LumiProducer::beginRun(edm::Run const& run,edm::EventSetup const &iSetup)
00415 {
00416   unsigned int runnumber=run.run();
00417   if(m_cachedrun!=runnumber){
00418     //queries once per run
00419     m_cachedrun=runnumber;
00420     edm::Service<lumi::service::DBService> mydbservice;
00421     if( !mydbservice.isAvailable() ){
00422       throw cms::Exception("Non existing service lumi::service::DBService");
00423     }
00424     coral::ISessionProxy* session=mydbservice->connectReadOnly(m_connectStr);
00425     try{
00426       session->transaction().start(true);
00427       m_cachedlumidataid=getLumiDataId(session->nominalSchema(),runnumber);
00428       if(m_cachedlumidataid!=0){//if no lumi, do not bother other info
00429         m_cachedtrgdataid=getTrgDataId(session->nominalSchema(),runnumber);
00430         m_cachedhltdataid=getHltDataId(session->nominalSchema(),runnumber);
00431         fillRunCache(session->nominalSchema(),runnumber);
00432       }else{
00433         m_isNullRun=true;
00434       }
00435       session->transaction().commit();
00436     }catch(const coral::Exception& er){
00437       session->transaction().rollback();
00438       mydbservice->disconnect(session);
00439       throw cms::Exception("DatabaseError ")<<er.what();
00440     }
00441     mydbservice->disconnect(session);
00442   }
00443   //std::cout<<"end of beginRun "<<runnumber<<std::endl;
00444 }
00445 
00446 void LumiProducer::beginLuminosityBlockProduce(edm::LuminosityBlock &iLBlock, edm::EventSetup const &iSetup)
00447 {
00448   unsigned int runnumber=iLBlock.run();
00449   unsigned int luminum=iLBlock.luminosityBlock();
00450   //std::cout<<"beg of beginLuminosityBlock "<<luminum<<std::endl;
00451   //if is null run, fill empty values and return
00452   if(m_isNullRun){
00453     std::auto_ptr<LumiSummary> pOut1;
00454     std::auto_ptr<LumiDetails> pOut2;
00455     LumiSummary* pIn1=new LumiSummary;
00456     LumiDetails* pIn2=new LumiDetails;
00457     pOut1.reset(pIn1);
00458     iLBlock.put(pOut1);
00459     pOut2.reset(pIn2);
00460     iLBlock.put(pOut2);
00461     return;
00462   }
00463   if(m_lscache.find(luminum)==m_lscache.end()){
00464     //if runnumber is cached but LS is not, this is the first LS, fill LS cache to full capacity
00465     fillLSCache(luminum);
00466   }
00467   //here the presence of ls is guaranteed
00468   writeProductsForEntry(iLBlock,runnumber,luminum); 
00469 }
00470 void 
00471 LumiProducer::endRun(edm::Run const& run,edm::EventSetup const &iSetup)
00472 {}
00473 void 
00474 LumiProducer::endRunProduce(edm::Run& run,edm::EventSetup const &iSetup)
00475 {
00476   std::auto_ptr<LumiSummaryRunHeader> lsrh(new LumiSummaryRunHeader());
00477   lsrh->swapL1Names(m_runcache.TRGBitNames);
00478   lsrh->swapHLTNames(m_runcache.HLTPathNames);
00479   run.put(lsrh);
00480   m_runcache.TRGBitNameToIndex.clear();
00481   m_runcache.HLTPathNameToIndex.clear();
00482 }
00483 void 
00484 LumiProducer::fillRunCache(const coral::ISchema& schema,unsigned int runnumber){
00485   if(m_lumiversion.empty()){
00486     m_lumiversion=getCurrentDataTag(schema);
00487   }
00488   std::cout<<"lumi tag version 2 "<<m_lumiversion<<std::endl;
00489   if(m_cachedtrgdataid!=0){
00490     coral::AttributeList trgBindVariables;
00491     trgBindVariables.extend("trgdataid",typeid(unsigned long long));
00492     trgBindVariables["trgdataid"].data<unsigned long long>()=m_cachedtrgdataid;
00493     //std::cout<<"cached trgdataid "<<m_cachedtrgdataid<<std::endl;
00494     coral::AttributeList trgOutput;
00495     trgOutput.extend("bitzeroname",typeid(std::string));
00496     trgOutput.extend("bitnameclob",typeid(std::string));
00497     coral::IQuery* trgQuery=schema.newQuery();
00498     trgQuery->addToTableList(lumi::LumiNames::trgdataTableName());
00499     trgQuery->addToOutputList("BITZERONAME");
00500     trgQuery->addToOutputList("BITNAMECLOB");
00501     trgQuery->setCondition("DATA_ID=:trgdataid",trgBindVariables);
00502     trgQuery->defineOutput(trgOutput);
00503     coral::ICursor& trgcursor=trgQuery->execute();
00504     while( trgcursor.next() ){
00505       const coral::AttributeList& row=trgcursor.currentRow();
00506       m_runcache.bitzeroname=row["bitzeroname"].data<std::string>();
00507       //std::cout<<"bitzeroname "<<m_runcache.bitzeroname<<std::endl;
00508       std::string bitnames=row["bitnameclob"].data<std::string>();
00509       boost::char_separator<char> sep(",");
00510       boost::tokenizer<boost::char_separator<char> > tokens(bitnames,sep);
00511       for(boost::tokenizer<boost::char_separator<char> >::iterator tok_it=tokens.begin();tok_it!=tokens.end();++tok_it){
00512         m_runcache.TRGBitNames.push_back(*tok_it);
00513       }
00514       for(unsigned int i=0;i<m_runcache.TRGBitNames.size();++i){
00515         m_runcache.TRGBitNameToIndex.insert(std::make_pair(m_runcache.TRGBitNames.at(i),i) );
00516       }      
00517     }
00518     delete trgQuery;
00519   }
00520   if(m_cachedhltdataid!=0){
00521     //
00522     //select pathnameclob from hltdata where data_id=:hltdataid
00523     //
00524     coral::AttributeList hltBindVariables;
00525     hltBindVariables.extend("hltdataid",typeid(unsigned long long));
00526     hltBindVariables["hltdataid"].data<unsigned long long>()=m_cachedhltdataid;
00527     coral::AttributeList hltOutput;
00528     hltOutput.extend("PATHNAMECLOB",typeid(std::string));
00529     coral::IQuery* hltQuery=schema.newQuery();
00530     hltQuery->addToTableList(lumi::LumiNames::hltdataTableName());
00531     hltQuery->addToOutputList("PATHNAMECLOB");
00532     hltQuery->setCondition("DATA_ID=:hltdataid",hltBindVariables);
00533     hltQuery->defineOutput(hltOutput);
00534     coral::ICursor& hltcursor=hltQuery->execute();
00535     while( hltcursor.next() ){
00536       const coral::AttributeList& row=hltcursor.currentRow();
00537       std::string pathnames=row["PATHNAMECLOB"].data<std::string>();
00538       boost::char_separator<char> sep(",");
00539       boost::tokenizer<boost::char_separator<char> > tokens(pathnames,sep);
00540       for(boost::tokenizer<boost::char_separator<char> >::iterator tok_it=tokens.begin();tok_it!=tokens.end();++tok_it){
00541         m_runcache.HLTPathNames.push_back(*tok_it);
00542       }
00543       for(unsigned int i=0;i<m_runcache.HLTPathNames.size();++i){
00544         m_runcache.HLTPathNameToIndex.insert(std::make_pair(m_runcache.HLTPathNames.at(i),i));
00545       }     
00546     }
00547     delete hltQuery;   
00548   }
00549 }
00550 void
00551 LumiProducer::fillLSCache(unsigned int luminum){
00552   //initialize cache
00553   if(m_isNullRun) return;
00554   m_lscache.clear();
00555   for(unsigned int n=luminum;n<luminum+m_cachesize;++n){
00556     PerLSData l;
00557     l.hltdata.reserve(250);
00558     l.l1data.reserve(192);
00559     l.bunchlumivalue.reserve(5);
00560     l.bunchlumierror.reserve(5);
00561     l.bunchlumiquality.reserve(5);
00562     l.beam1intensity.resize(3564,0.0);
00563     l.beam2intensity.resize(3564,0.0);
00564     m_lscache.insert(std::make_pair(n,l));
00565   }
00566   //queries once per cache refill
00567   //
00568   //select cmslsnum,instlumi,startorbit,numorbit,bxindex,beam1intensity,beam2intensity,bxlumivalue_occ1,bxlumivalue_occ2,bxlumivalue_et from lumisummaryv2 where cmslsnum>=:lsmin and cmslsnum<:lsmax and data_id=:lumidataid;
00569   //
00570   edm::Service<lumi::service::DBService> mydbservice;
00571   if( !mydbservice.isAvailable() ){
00572     throw cms::Exception("Non existing service lumi::service::DBService");
00573   }
00574   coral::ISessionProxy* session=mydbservice->connectReadOnly(m_connectStr);
00575   try{
00576     session->transaction().start(true);
00577     coral::ISchema& schema=session->nominalSchema();
00578     coral::AttributeList lumisummaryBindVariables;
00579     lumisummaryBindVariables.extend("lsmin",typeid(unsigned int));
00580     lumisummaryBindVariables.extend("lsmax",typeid(unsigned int));
00581     lumisummaryBindVariables.extend("lumidataid",typeid(unsigned long long));
00582     lumisummaryBindVariables["lumidataid"].data<unsigned long long>()=m_cachedlumidataid;
00583     lumisummaryBindVariables["lsmin"].data<unsigned int>()=luminum;
00584     lumisummaryBindVariables["lsmax"].data<unsigned int>()=luminum+m_cachesize;
00585     coral::AttributeList lumisummaryOutput;
00586     lumisummaryOutput.extend("CMSLSNUM",typeid(unsigned int));
00587     lumisummaryOutput.extend("INSTLUMI",typeid(float));
00588     lumisummaryOutput.extend("STARTORBIT",typeid(unsigned int));
00589     lumisummaryOutput.extend("NUMORBIT",typeid(unsigned int));
00590     lumisummaryOutput.extend("CMSBXINDEXBLOB",typeid(coral::Blob));
00591     lumisummaryOutput.extend("BEAMINTENSITYBLOB_1",typeid(coral::Blob));
00592     lumisummaryOutput.extend("BEAMINTENSITYBLOB_2",typeid(coral::Blob));
00593     lumisummaryOutput.extend("BXLUMIVALUE_OCC1",typeid(coral::Blob));
00594     lumisummaryOutput.extend("BXLUMIVALUE_OCC2",typeid(coral::Blob));
00595     lumisummaryOutput.extend("BXLUMIVALUE_ET",typeid(coral::Blob));
00596     coral::IQuery* lumisummaryQuery=schema.newQuery();
00597     lumisummaryQuery->addToTableList(lumi::LumiNames::lumisummaryv2TableName());
00598     lumisummaryQuery->addToOutputList("CMSLSNUM");
00599     lumisummaryQuery->addToOutputList("INSTLUMI");
00600     lumisummaryQuery->addToOutputList("STARTORBIT");
00601     lumisummaryQuery->addToOutputList("NUMORBIT");
00602     lumisummaryQuery->addToOutputList("CMSBXINDEXBLOB");
00603     lumisummaryQuery->addToOutputList("BEAMINTENSITYBLOB_1");
00604     lumisummaryQuery->addToOutputList("BEAMINTENSITYBLOB_2");
00605     lumisummaryQuery->addToOutputList("BXLUMIVALUE_OCC1");
00606     lumisummaryQuery->addToOutputList("BXLUMIVALUE_OCC2");
00607     lumisummaryQuery->addToOutputList("BXLUMIVALUE_ET");
00608     lumisummaryQuery->setCondition("CMSLSNUM>=:lsmin AND CMSLSNUM<:lsmax AND DATA_ID=:lumidataid",lumisummaryBindVariables);
00609     lumisummaryQuery->defineOutput(lumisummaryOutput);
00610     coral::ICursor& lumisummarycursor=lumisummaryQuery->execute();
00611     unsigned int rowcounter=0;
00612     while( lumisummarycursor.next() ){
00613       const coral::AttributeList& row=lumisummarycursor.currentRow();
00614       unsigned int cmslsnum=row["CMSLSNUM"].data<unsigned int>();
00615       //std::cout<<"cmslsnum "<<cmslsnum<<std::endl;
00616       PerLSData& lsdata=m_lscache[cmslsnum];
00617       lsdata.lumivalue=row["INSTLUMI"].data<float>();
00618       lsdata.lumierror=0.0;
00619       lsdata.lumiquality=0;
00620       lsdata.startorbit=row["STARTORBIT"].data<unsigned int>();
00621       lsdata.numorbit=row["NUMORBIT"].data<unsigned int>();
00622       
00623       if(!row["CMSBXINDEXBLOB"].isNull() && !row["BXLUMIVALUE_OCC1"].isNull() ){
00624         const coral::Blob& bxindexBlob=row["CMSBXINDEXBLOB"].data<coral::Blob>();
00625         const void* bxindex_StartAddress=bxindexBlob.startingAddress();
00626         short* bxindex=(short*)::malloc(bxindexBlob.size());
00627         const coral::Blob& beam1intensityBlob=row["BEAMINTENSITYBLOB_1"].data<coral::Blob>();
00628         const void* beam1intensityBlob_StartAddress=beam1intensityBlob.startingAddress();
00629         float* beam1intensity=(float*)::malloc(beam1intensityBlob.size());
00630         const coral::Blob& beam2intensityBlob=row["BEAMINTENSITYBLOB_2"].data<coral::Blob>();
00631         const void* beam2intensityBlob_StartAddress=beam2intensityBlob.startingAddress();
00632         float* beam2intensity=(float*)::malloc(beam2intensityBlob.size());
00633         std::memmove(bxindex,bxindex_StartAddress,bxindexBlob.size());
00634         std::memmove(beam1intensity,beam1intensityBlob_StartAddress,beam1intensityBlob.size());
00635         std::memmove(beam2intensity,beam2intensityBlob_StartAddress,beam2intensityBlob.size());
00636 
00637         unsigned int iMax = bxindexBlob.size()/sizeof(short);
00638         unsigned int lsb1Max = lsdata.beam1intensity.size();
00639         unsigned int lsb2Max = lsdata.beam2intensity.size();
00640         unsigned int ib1Max = beam1intensityBlob.size()/sizeof(float);
00641         unsigned int ib2Max = beam2intensityBlob.size()/sizeof(float);
00642         for(unsigned int i=0;i<iMax;++i){
00643           unsigned int idx=bxindex[i];
00644           if(ib1Max>i && lsb1Max>idx){
00645             lsdata.beam1intensity.at(idx)=beam1intensity[i];
00646           }
00647           if(ib2Max>i && lsb2Max>idx){
00648             lsdata.beam2intensity.at(idx)=beam2intensity[i];
00649           }
00650         }
00651         ::free(bxindex);
00652         ::free(beam1intensity);
00653         ::free(beam2intensity);
00654 
00655         const coral::Blob& bxlumivalBlob_occ1=row["BXLUMIVALUE_OCC1"].data<coral::Blob>();
00656         const void* bxlumival_occ1_StartAddress=bxlumivalBlob_occ1.startingAddress();
00657         float* bxlumival_occ1=(float*)::malloc(bxlumivalBlob_occ1.size());
00658         std::memmove(bxlumival_occ1,bxlumival_occ1_StartAddress,bxlumivalBlob_occ1.size());
00659         std::vector<float> bxlumivalVec_occ1(bxlumival_occ1,bxlumival_occ1+bxlumivalBlob_occ1.size()/sizeof(float));
00660         ::free(bxlumival_occ1);
00661         lsdata.bunchlumivalue.push_back(std::make_pair(std::string("OCC1"),bxlumivalVec_occ1));
00662         lsdata.bunchlumierror.push_back(std::make_pair(std::string("OCC1"),std::vector<float>(3564)));
00663         lsdata.bunchlumiquality.push_back(std::make_pair(std::string("OCC1"),std::vector<short>(3564)));
00664         const coral::Blob& bxlumivalBlob_occ2=row["BXLUMIVALUE_OCC2"].data<coral::Blob>();
00665         const void* bxlumival_occ2_StartAddress=bxlumivalBlob_occ2.startingAddress();
00666         float* bxlumival_occ2=(float*)::malloc(bxlumivalBlob_occ2.size());
00667         std::memmove(bxlumival_occ2,bxlumival_occ2_StartAddress,bxlumivalBlob_occ2.size());
00668         std::vector<float> bxlumivalVec_occ2(bxlumival_occ2,bxlumival_occ2+bxlumivalBlob_occ1.size()/sizeof(float));
00669         ::free(bxlumival_occ2);
00670         lsdata.bunchlumivalue.push_back(std::make_pair(std::string("OCC2"),bxlumivalVec_occ2));
00671         lsdata.bunchlumierror.push_back(std::make_pair(std::string("OCC2"),std::vector<float>(3564)));
00672         lsdata.bunchlumiquality.push_back(std::make_pair(std::string("OCC2"),std::vector<short>(3564)));
00673 
00674         const coral::Blob& bxlumivalBlob_et=row["BXLUMIVALUE_ET"].data<coral::Blob>();
00675         const void* bxlumival_et_StartAddress=bxlumivalBlob_et.startingAddress();
00676         float* bxlumival_et=(float*)::malloc(bxlumivalBlob_et.size());
00677         std::memmove(bxlumival_et,bxlumival_et_StartAddress,bxlumivalBlob_et.size());   
00678         std::vector<float> bxlumivalVec_et(bxlumival_et,bxlumival_et+bxlumivalBlob_et.size()/sizeof(float));
00679         ::free(bxlumival_et);
00680         lsdata.bunchlumivalue.push_back(std::make_pair(std::string("ET"),bxlumivalVec_et));
00681         lsdata.bunchlumierror.push_back(std::make_pair(std::string("ET"),std::vector<float>(3564)));
00682         lsdata.bunchlumiquality.push_back(std::make_pair(std::string("ET"),std::vector<short>(3564)));
00683       }
00684       ++rowcounter;
00685     }
00686     if (rowcounter==0){
00687       m_isNullRun=true;
00688       return;
00689     }
00690     delete lumisummaryQuery;
00691     
00692     //
00693     //select cmslsnum,deadtimecount,bitzerocount,bitzeroprescale,prescaleblob,trgcountblob from lstrg where cmslsnum >=:luminum and cmslsnum<:luminum+cachesize AND data_id=:trgdataid;
00694     //
00695     coral::AttributeList trgBindVariables;
00696     trgBindVariables.extend("lsmin",typeid(unsigned int));
00697     trgBindVariables.extend("lsmax",typeid(unsigned int));
00698     trgBindVariables.extend("trgdataid",typeid(unsigned long long));
00699     trgBindVariables["lsmin"].data<unsigned int>()=luminum;
00700     trgBindVariables["lsmax"].data<unsigned int>()=luminum+m_cachesize;
00701     trgBindVariables["trgdataid"].data<unsigned long long>()=m_cachedtrgdataid;
00702     coral::AttributeList trgOutput;
00703     trgOutput.extend("CMSLSNUM",typeid(unsigned int));
00704     trgOutput.extend("DEADTIMECOUNT",typeid(unsigned long long));
00705     trgOutput.extend("BITZEROCOUNT",typeid(unsigned int));
00706     trgOutput.extend("BITZEROPRESCALE",typeid(unsigned int));
00707     trgOutput.extend("PRESCALEBLOB",typeid(coral::Blob));
00708     trgOutput.extend("TRGCOUNTBLOB",typeid(coral::Blob));
00709 
00710     coral::IQuery* trgQuery=schema.newQuery();
00711     trgQuery->addToTableList(lumi::LumiNames::lstrgTableName());
00712     trgQuery->addToOutputList("CMSLSNUM");
00713     trgQuery->addToOutputList("DEADTIMECOUNT");
00714     trgQuery->addToOutputList("BITZEROCOUNT");
00715     trgQuery->addToOutputList("BITZEROPRESCALE");
00716     trgQuery->addToOutputList("PRESCALEBLOB");
00717     trgQuery->addToOutputList("TRGCOUNTBLOB");
00718     trgQuery->setCondition("CMSLSNUM>=:lsmin AND CMSLSNUM<:lsmax AND DATA_ID=:trgdataid",trgBindVariables);
00719     trgQuery->defineOutput(trgOutput);
00720     coral::ICursor& trgcursor=trgQuery->execute();
00721     while( trgcursor.next() ){
00722       const coral::AttributeList& row=trgcursor.currentRow();
00723       unsigned int cmslsnum=row["CMSLSNUM"].data<unsigned int>();
00724       PerLSData& lsdata=m_lscache[cmslsnum];
00725       lsdata.deadcount=row["DEADTIMECOUNT"].data<unsigned long long>();
00726       lsdata.bitzerocount=row["BITZEROCOUNT"].data<unsigned int>();
00727       lsdata.bitzeroprescale=row["BITZEROPRESCALE"].data<unsigned int>();
00728       if(!row["PRESCALEBLOB"].isNull()){
00729         const coral::Blob& prescaleblob=row["PRESCALEBLOB"].data<coral::Blob>();
00730         const void* prescaleblob_StartAddress=prescaleblob.startingAddress();
00731         unsigned int* prescales=(unsigned int*)::malloc(prescaleblob.size());
00732         std::memmove(prescales,prescaleblob_StartAddress,prescaleblob.size());
00733         const coral::Blob& trgcountblob=row["TRGCOUNTBLOB"].data<coral::Blob>();
00734         const void* trgcountblob_StartAddress=trgcountblob.startingAddress();
00735         unsigned int* trgcounts=(unsigned int*)::malloc(trgcountblob.size());
00736         std::memmove(trgcounts,trgcountblob_StartAddress,trgcountblob.size());
00737         for(unsigned int i=0;i<sizeof(trgcounts)/sizeof(unsigned int);++i){
00738           L1Data l1tmp;
00739           l1tmp.bitname=m_runcache.TRGBitNames[i];
00740           l1tmp.prescale=prescales[i];
00741           l1tmp.ratecount=trgcounts[i];
00742           lsdata.l1data.push_back(l1tmp);
00743         }
00744         ::free(prescales);
00745         ::free(trgcounts);
00746       }
00747     }
00748     delete trgQuery;
00749     //
00750     //select cmslsnum,hltcountblob,hltacceptblob,prescaleblob from hlt where cmslsnum >=:luminum and cmslsnum<=:luminum+cachesize and data_id=:hltdataid 
00751     //
00752     coral::AttributeList hltBindVariables;
00753     hltBindVariables.extend("lsmin",typeid(unsigned int));
00754     hltBindVariables.extend("lsmax",typeid(unsigned int));
00755     hltBindVariables.extend("hltdataid",typeid(unsigned long long));
00756     hltBindVariables["lsmin"].data<unsigned int>()=luminum;
00757     hltBindVariables["lsmax"].data<unsigned int>()=luminum+m_cachesize;
00758     hltBindVariables["hltdataid"].data<unsigned long long>()=m_cachedhltdataid;
00759     coral::AttributeList hltOutput;
00760     hltOutput.extend("CMSLSNUM",typeid(unsigned int));
00761     hltOutput.extend("HLTCOUNTBLOB",typeid(coral::Blob));
00762     hltOutput.extend("HLTACCEPTBLOB",typeid(coral::Blob));
00763     hltOutput.extend("PRESCALEBLOB",typeid(coral::Blob));
00764     coral::IQuery* hltQuery=schema.newQuery();
00765     hltQuery->addToTableList(lumi::LumiNames::lshltTableName());
00766     hltQuery->addToOutputList("CMSLSNUM");
00767     hltQuery->addToOutputList("HLTCOUNTBLOB");
00768     hltQuery->addToOutputList("HLTACCEPTBLOB");
00769     hltQuery->addToOutputList("PRESCALEBLOB");
00770     hltQuery->setCondition("CMSLSNUM>=:lsmin AND CMSLSNUM<:lsmax AND DATA_ID=:hltdataid",hltBindVariables);
00771     hltQuery->defineOutput(hltOutput);
00772     coral::ICursor& hltcursor=hltQuery->execute();
00773     while( hltcursor.next() ){
00774       const coral::AttributeList& row=hltcursor.currentRow();   
00775       unsigned int cmslsnum=row["CMSLSNUM"].data<unsigned int>();
00776       PerLSData& lsdata=m_lscache[cmslsnum];
00777       if(!row["PRESCALEBLOB"].isNull()){
00778         const coral::Blob& hltprescaleblob=row["PRESCALEBLOB"].data<coral::Blob>();
00779         const void* hltprescaleblob_StartAddress=hltprescaleblob.startingAddress();
00780         unsigned int* hltprescales=(unsigned int*)::malloc(hltprescaleblob.size());
00781         std::memmove(hltprescales,hltprescaleblob_StartAddress,hltprescaleblob.size());
00782         const coral::Blob& hltcountblob=row["HLTCOUNTBLOB"].data<coral::Blob>();
00783         const void* hltcountblob_StartAddress=hltcountblob.startingAddress();
00784         unsigned int* hltcounts=(unsigned int*)::malloc(hltcountblob.size());
00785         std::memmove(hltcounts,hltcountblob_StartAddress,hltcountblob.size());
00786         const coral::Blob& hltacceptblob=row["HLTACCEPTBLOB"].data<coral::Blob>();
00787         const void* hltacceptblob_StartAddress=hltacceptblob.startingAddress();
00788         unsigned int* hltaccepts=(unsigned int*)::malloc(hltacceptblob.size());
00789         std::memmove(hltaccepts,hltacceptblob_StartAddress,hltacceptblob.size());       
00790         unsigned int nhltaccepts = sizeof(hltaccepts)/sizeof(unsigned int);
00791         if(nhltaccepts > 0 && m_runcache.HLTPathNames.size() == 0){
00792           edm::LogWarning("CorruptOrMissingHLTData")<<"Got "<<nhltaccepts
00793 <<" hltaccepts, but the run chache is empty. hltdata will  not be written";
00794             break;
00795         }
00796 
00797         for(unsigned int i=0;i<sizeof(hltaccepts)/sizeof(unsigned int);++i){
00798           HLTData hlttmp;
00799           hlttmp.pathname=m_runcache.HLTPathNames[i];
00800           hlttmp.prescale=hltprescales[i];
00801           hlttmp.l1passcount=hltcounts[i];
00802           hlttmp.acceptcount=hltaccepts[i];
00803           lsdata.hltdata.push_back(hlttmp);
00804         }
00805         ::free(hltprescales);
00806         ::free(hltcounts);
00807         ::free(hltaccepts);
00808       }
00809     }
00810     delete hltQuery;
00811     session->transaction().commit();
00812   }catch(const coral::Exception& er){
00813     session->transaction().rollback();
00814     mydbservice->disconnect(session);
00815     throw cms::Exception("DatabaseError ")<<er.what();
00816   }
00817   mydbservice->disconnect(session);
00818 }
00819 void
00820 LumiProducer::writeProductsForEntry(edm::LuminosityBlock & iLBlock,unsigned int runnumber,unsigned int luminum){
00821   //std::cout<<"writing runnumber,luminum "<<runnumber<<" "<<luminum<<std::endl;
00822   std::auto_ptr<LumiSummary> pOut1;
00823   std::auto_ptr<LumiDetails> pOut2;
00824   LumiSummary* pIn1=new LumiSummary;
00825   LumiDetails* pIn2=new LumiDetails;
00826   if(m_isNullRun){
00827     pIn1->setLumiVersion("-1");
00828     pIn2->setLumiVersion("-1");
00829     pOut1.reset(pIn1);
00830     iLBlock.put(pOut1);
00831     pOut2.reset(pIn2);
00832     iLBlock.put(pOut2);
00833     return;
00834   }
00835   PerLSData& lsdata=m_lscache[luminum];
00836   pIn1->setLumiData(lsdata.lumivalue,lsdata.lumierror,lsdata.lumiquality);
00837   pIn1->setDeadCount(lsdata.deadcount);
00838   if(!lsdata.l1data.empty()){
00839     //std::cout<<"bitzerocount "<<lsdata.bitzerocount<<std::endl;
00840     //std::cout<<"bitzeroprescale "<<lsdata.bitzeroprescale<<std::endl;
00841     //std::cout<<"product "<<lsdata.bitzerocount*lsdata.bitzeroprescale<<std::endl;
00842     pIn1->setBitZeroCount(lsdata.bitzerocount*lsdata.bitzeroprescale);
00843   }
00844   pIn1->setlsnumber(luminum);
00845   pIn1->setOrbitData(lsdata.startorbit,lsdata.numorbit);
00846   std::vector<LumiSummary::L1> l1temp;
00847   for(std::vector< L1Data >::iterator it=lsdata.l1data.begin();it!=lsdata.l1data.end();++it){
00848     LumiSummary::L1 trgtmp;
00849     trgtmp.triggernameidx=m_runcache.TRGBitNameToIndex[it->bitname];
00850     trgtmp.prescale=it->prescale;
00851     l1temp.push_back(trgtmp);
00852   }
00853   std::vector<LumiSummary::HLT> hlttemp;
00854   for(std::vector< HLTData >::iterator it=lsdata.hltdata.begin();it!=lsdata.hltdata.end();++it){
00855     LumiSummary::HLT hlttmp;
00856     hlttmp.pathnameidx=m_runcache.HLTPathNameToIndex[it->pathname];;
00857     hlttmp.prescale=it->prescale;
00858     hlttemp.push_back(hlttmp);
00859   }
00860   pIn1->swapL1Data(l1temp);
00861   pIn1->swapHLTData(hlttemp);
00862   pIn1->setLumiVersion(m_lumiversion);  
00863   pIn2->fillBeamIntensities(lsdata.beam1intensity,lsdata.beam2intensity);
00864   for(unsigned int i=0;i<lsdata.bunchlumivalue.size();++i){
00865     std::string algoname=lsdata.bunchlumivalue[i].first;
00866     if(algoname=="OCC1"){
00867       pIn2->fill(LumiDetails::kOCC1,lsdata.bunchlumivalue[i].second,lsdata.bunchlumierror[i].second,lsdata.bunchlumiquality[i].second);
00868     }else if(algoname=="OCC2"){      
00869       pIn2->fill(LumiDetails::kOCC2,lsdata.bunchlumivalue[i].second,lsdata.bunchlumierror[i].second,lsdata.bunchlumiquality[i].second);
00870     }else if(algoname=="ET"){
00871       pIn2->fill(LumiDetails::kET,lsdata.bunchlumivalue[i].second,lsdata.bunchlumierror[i].second,lsdata.bunchlumiquality[i].second);
00872     }else if(algoname=="PLT"){
00873       pIn2->fill(LumiDetails::kPLT,lsdata.bunchlumivalue[i].second,lsdata.bunchlumierror[i].second,lsdata.bunchlumiquality[i].second);
00874     }
00875   }
00876   pIn2->setLumiVersion(m_lumiversion);
00877   pOut1.reset(pIn1);
00878   iLBlock.put(pOut1);
00879   pOut2.reset(pIn2);
00880   iLBlock.put(pOut2);
00881 }
00882 #include "FWCore/Framework/interface/MakerMacros.h"
00883 DEFINE_FWK_MODULE(LumiProducer);