00001
00002
00003
00004
00005
00016
00017
00018
00019
00020
00021
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
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;
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
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
00229
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
00250 produces<LumiSummaryRunHeader, edm::InRun>();
00251 produces<LumiSummary, edm::InLumi>();
00252 produces<LumiDetails, edm::InLumi>();
00253
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
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
00283 m_connectStr=fproto+servletTranslation(servlet)+connectStr.substr(endservlet);
00284 }else{
00285 m_connectStr=connectStr;
00286 }
00287 }else{
00288 m_connectStr=connectStr;
00289 }
00290
00291 }
00292
00293 LumiProducer::~LumiProducer(){
00294 }
00295
00296
00297
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
00306
00307
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
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
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
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
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){
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
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
00451
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
00465 fillLSCache(luminum);
00466 }
00467
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
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
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
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
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
00567
00568
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
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
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
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
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
00840
00841
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);