CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
DIPLumiProducer.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: LumiProducer
4 // Class: DIPLumiProducer
5 //
10 //#include <memory>
15 
22 
24 
25 #include "CoralBase/Exception.h"
26 #include "CoralBase/AttributeList.h"
27 #include "CoralBase/Attribute.h"
28 #include "CoralBase/AttributeSpecification.h"
29 #include "CoralBase/Exception.h"
30 #include "RelationalAccess/ISessionProxy.h"
31 #include "RelationalAccess/ITransaction.h"
32 #include "RelationalAccess/AccessMode.h"
33 #include "RelationalAccess/ITypeConverter.h"
34 #include "RelationalAccess/IQuery.h"
35 #include "RelationalAccess/ICursor.h"
36 #include "RelationalAccess/ISchema.h"
37 #include "RelationalAccess/ITable.h"
44 #include "DIPLumiProducer.h"
45 #include <iostream>
46 #include <sstream>
47 #include <string>
48 #include <memory>
49 #include <algorithm>
50 #include <vector>
51 #include <cstring>
52 #include <iterator>
53 #include <boost/foreach.hpp>
54 #include <boost/tokenizer.hpp>
55 #include <xercesc/dom/DOM.hpp>
56 #include <xercesc/parsers/XercesDOMParser.hpp>
58 #include <xercesc/util/XMLString.hpp>
59 
60 #include "boost/filesystem/path.hpp"
61 #include "boost/filesystem/operations.hpp"
62 
63 DIPLumiProducer::DIPLumiProducer(const edm::ParameterSet& iConfig):m_connectStr(""),m_summarycachedrun(0),m_detailcachedrun(0),m_cachesize(0){
66  findingRecord<DIPLuminosityRcd>();
67  m_connectStr=iConfig.getParameter<std::string>("connect");
68  m_cachesize=iConfig.getUntrackedParameter<unsigned int>("ncacheEntries",3);
69 }
70 
73 {
74  unsigned int currentrun=m_pcurrentTime->eventID().run();
75  unsigned int currentls=m_pcurrentTime->luminosityBlockNumber();
76  if(currentls==0||currentls==4294967295){
77  return std::make_shared<DIPLumiSummary>();
78  }
79  if(m_summarycachedrun!=currentrun){//i'm in a new run
80  fillsummarycache(currentrun,currentls);//starting ls
81  }else{ //i'm in an old run
82  if(m_summarycache.find(currentls)==m_summarycache.end()){//i'm not cached
83  fillsummarycache(currentrun,currentls);//
84  }
85  }
86  if(m_summarycache.empty()){
87  return std::make_shared<DIPLumiSummary>();
88  }
89  if(m_summarycache.find(currentls)==m_summarycache.end()){
90  std::vector<unsigned int> v;
91  for(std::map<unsigned int,std::shared_ptr<DIPLumiSummary> >::iterator it=m_summarycache.begin();it!=m_summarycache.end();++it){
92  v.push_back(it->first);
93  }
95  }else{
97  }
98  if(m_summaryresult.get()==0){
99  return std::make_shared<DIPLumiSummary>();
100  }
101  return m_summaryresult;
102 }
105 {
106  unsigned int currentrun=m_pcurrentTime->eventID().run();
107  unsigned int currentls=m_pcurrentTime->luminosityBlockNumber();
108  if(currentls==0||currentls==4294967295){
109  return std::make_shared<DIPLumiDetail>();
110  }
111  if(m_detailcachedrun!=currentrun){//i'm in a new run
112  filldetailcache(currentrun,currentls);//starting ls
113  }else{ //i'm in an known run
114  if(m_detailcache.find(currentls)==m_detailcache.end()){//i'm in a unknown ls
115  filldetailcache(currentrun,currentls);//cache all ls>=currentls
116  }
117  }
118  if(m_detailcache.empty()){
119  return std::make_shared<DIPLumiDetail>();
120  }
121  if(m_detailcache.find(currentls)==m_detailcache.end()){
122  std::vector<unsigned int> v;
123  for(std::map<unsigned int,std::shared_ptr<DIPLumiDetail> >::iterator it=m_detailcache.begin();it!=m_detailcache.end();++it){
124  v.push_back(it->first);
125  }
126  m_detailresult=m_detailcache[v.back()];
127  }else{
128  m_detailresult=m_detailcache[currentls];
129  }
130  if(m_detailresult.get()==0){
131  return std::make_shared<DIPLumiDetail>();
132  }
133  return m_detailresult;
134 }
135 
136 void
138  const edm::IOVSyncValue& iTime,
139  edm::ValidityInterval& oValidity ) {
140  m_pcurrentTime=&iTime;
141  oValidity.setFirst(iTime);
142  oValidity.setLast(iTime);
143 }
144 
145 void
146 DIPLumiProducer::fillsummarycache(unsigned int runnumber,unsigned int currentlsnum){
147  m_summarycache.clear();
149  //
150  // queries once per cache refill
151  //
152  // select max(lumi_sections) as maxavailable from cms_runtime_logger.lumi_sections where runnumber=:runnumber;
153  //
154  // if maxavailable<currentls: get lsmax=maxavailable ; else: get lsmax=currentls
155  // lsmin=lsmax-cachesize
156  // select runnumber,lumisection,instlumi,delivlumi,livelumi from cms_runtime_logger.lumi_sections where lumisection>=:lsmin and lumisection<=:lsmax and runnumber=:runnumber;
157  //
159  if( !mydbservice.isAvailable() ){
160  throw cms::Exception("Non existing service lumi::service::DBService");
161  }
162  coral::ISessionProxy* session=mydbservice->connectReadOnly(m_connectStr);
163  coral::ITypeConverter& tconverter=session->typeConverter();
164  tconverter.setCppTypeForSqlType(std::string("float"),std::string("FLOAT(63)"));
165  tconverter.setCppTypeForSqlType(std::string("unsigned int"),std::string("NUMBER(10)"));
166  tconverter.setCppTypeForSqlType(std::string("unsigned short"),std::string("NUMBER(1)"));
167  unsigned int lsmin=1;
168  unsigned int lsmax=currentlsnum;
169  try{
170  session->transaction().start(true);
171  coral::ISchema& schema=session->nominalSchema();
172  unsigned int maxavailableLS=maxavailableLSforRun(schema,std::string("LUMI_SECTIONS"),m_summarycachedrun);
173  if(maxavailableLS!=0 && maxavailableLS<currentlsnum){
174  lsmax=maxavailableLS;
175  }else if(maxavailableLS==0){
176  //this run not existing (yet)
177  session->transaction().commit();
178  mydbservice->disconnect(session);
179  return;
180  }
181  if(m_cachesize!=0){
182  lsmin=(lsmax-m_cachesize)>0 ? (lsmax-m_cachesize+1) : 1;
183  }
184  //std::cout<<"lsmin "<<lsmin<<" lsmax "<<lsmax<<std::endl;
185  coral::AttributeList lumisummaryBindVariables;
186  lumisummaryBindVariables.extend("lsmin",typeid(unsigned int));
187  lumisummaryBindVariables.extend("lsmax",typeid(unsigned int));
188  lumisummaryBindVariables.extend("runnumber",typeid(unsigned int));
189  lumisummaryBindVariables["runnumber"].data<unsigned int>()=m_summarycachedrun;
190  lumisummaryBindVariables["lsmin"].data<unsigned int>()=lsmin;
191  lumisummaryBindVariables["lsmax"].data<unsigned int>()=lsmax;
192  std::string conditionStr("RUNNUMBER=:runnumber AND LUMISECTION>=:lsmin AND LUMISECTION<=:lsmax");
193  coral::AttributeList lumisummaryOutput;
194  lumisummaryOutput.extend("LUMISECTION",typeid(unsigned int));
195  lumisummaryOutput.extend("INSTLUMI",typeid(float));
196  lumisummaryOutput.extend("DELIVLUMISECTION",typeid(float));
197  lumisummaryOutput.extend("LIVELUMISECTION",typeid(float));
198  lumisummaryOutput.extend("CMS_ACTIVE",typeid(unsigned short));
199  coral::IQuery* lumisummaryQuery=schema.newQuery();
200  lumisummaryQuery->addToTableList(std::string("LUMI_SECTIONS"));
201  lumisummaryQuery->addToOutputList("LUMISECTION");
202  lumisummaryQuery->addToOutputList("INSTLUMI");
203  lumisummaryQuery->addToOutputList("DELIVLUMISECTION");
204  lumisummaryQuery->addToOutputList("LIVELUMISECTION");
205  lumisummaryQuery->addToOutputList("CMS_ACTIVE");
206  lumisummaryQuery->setCondition(conditionStr,lumisummaryBindVariables);
207  lumisummaryQuery->defineOutput(lumisummaryOutput);
208  coral::ICursor& lumisummarycursor=lumisummaryQuery->execute();
209  while( lumisummarycursor.next() ){
210  const coral::AttributeList& row=lumisummarycursor.currentRow();
211  unsigned int lsnum=row["LUMISECTION"].data<unsigned int>();
212  float instlumi=0.0;
213  if(!row["INSTLUMI"].isNull()){
214  instlumi=row["INSTLUMI"].data<float>();//Hz/ub
215  }
216  float intgdellumi=0.0;
217  if(!row["DELIVLUMISECTION"].isNull()){
218  intgdellumi=row["DELIVLUMISECTION"].data<float>()*1000.0;//convert to /ub
219  }
220  float intgreclumi=0.0;
221  if(!row["LIVELUMISECTION"].isNull()){
222  intgreclumi=row["LIVELUMISECTION"].data<float>()*1000.0;//convert to /ub
223  }
224  unsigned short cmsalive=0;
225  if(!row["CMS_ACTIVE"].isNull()){
226  cmsalive=row["CMS_ACTIVE"].data<unsigned short>();
227  }
228  auto tmpls = std::make_shared<DIPLumiSummary>(instlumi,intgdellumi,intgreclumi,cmsalive);
229  tmpls->setOrigin(m_summarycachedrun,lsnum);
230  //std::cout<<"filling "<<lsnum<<std::endl;
231  m_summarycache.insert(std::make_pair(lsnum,tmpls));
232  }
233  delete lumisummaryQuery;
234  session->transaction().commit();
235  }catch(const coral::Exception& er){
236  session->transaction().rollback();
237  mydbservice->disconnect(session);
238  throw cms::Exception("DatabaseError ")<<er.what();
239  }
240  mydbservice->disconnect(session);
241 }
242 unsigned int
243 DIPLumiProducer::maxavailableLSforRun(coral::ISchema& schema,const std::string&tablename,unsigned int runnumber){
247  unsigned int result=0;
248  coral::AttributeList bindVariables;
249  bindVariables.extend("runnumber",typeid(unsigned int));
250  bindVariables["runnumber"].data<unsigned int>()=runnumber;
251  std::string conditionStr("RUNNUMBER=:runnumber");
252  coral::AttributeList MyOutput;
253  MyOutput.extend("maxavailablels",typeid(unsigned int));
254  coral::IQuery* myQuery=schema.newQuery();
255  myQuery->addToTableList(tablename);
256  myQuery->addToOutputList("max(LUMISECTION)","maxavailablels");
257  myQuery->setCondition(conditionStr,bindVariables);
258  myQuery->defineOutput(MyOutput);
259  coral::ICursor& mycursor=myQuery->execute();
260  while( mycursor.next() ){
261  const coral::AttributeList& row=mycursor.currentRow();
262  if(!row["maxavailablels"].isNull()){
263  result=row["maxavailablels"].data<unsigned int>();
264  }
265  }
266  return result;
267 }
268 void
269 DIPLumiProducer::filldetailcache(unsigned int runnumber,unsigned int currentlsnum){
270  m_detailcache.clear();
272  //
273  //queries once per cache refill
274  //
275  //select lumisection,bunch,bunchlumi from cms_runtime_logger.bunch_lumi_sections where lumisection>=:lsmin and lumisection<:lsmax and runnumber=:runnumber ;
276  //
278  if( !mydbservice.isAvailable() ){
279  throw cms::Exception("Non existing service lumi::service::DBService");
280  }
281  coral::ISessionProxy* session=mydbservice->connectReadOnly(m_connectStr);
282  coral::ITypeConverter& tconverter=session->typeConverter();
283  tconverter.setCppTypeForSqlType(std::string("float"),std::string("FLOAT(63)"));
284  tconverter.setCppTypeForSqlType(std::string("unsigned int"),std::string("NUMBER(10)"));
285  unsigned int lsmin=1;
286  unsigned int lsmax=currentlsnum;
287  try{
288  session->transaction().start(true);
289  coral::ISchema& schema=session->nominalSchema();
290  unsigned int maxavailableLS=maxavailableLSforRun(schema,std::string("BUNCH_LUMI_SECTIONS"),m_summarycachedrun);
291  if(maxavailableLS!=0 &&maxavailableLS<currentlsnum ){
292  lsmax=maxavailableLS;
293  }else if(maxavailableLS==0){
294  //this run not existing (yet)
295  session->transaction().commit();
296  mydbservice->disconnect(session);
297  return;
298  }
299  if(m_cachesize!=0){
300  lsmin=(lsmax-m_cachesize)>0 ? (lsmax-m_cachesize+1) : 1;
301  }
302  coral::AttributeList lumidetailBindVariables;
303  lumidetailBindVariables.extend("lsmin",typeid(unsigned int));
304  lumidetailBindVariables.extend("lsmax",typeid(unsigned int));
305  lumidetailBindVariables.extend("runnumber",typeid(unsigned int));
306  lumidetailBindVariables["runnumber"].data<unsigned int>()=m_detailcachedrun;
307  lumidetailBindVariables["lsmin"].data<unsigned int>()=lsmin;
308  lumidetailBindVariables["lsmax"].data<unsigned int>()=lsmax;
309  std::string conditionStr("RUNNUMBER=:runnumber AND LUMISECTION>=:lsmin AND LUMISECTION<=:lsmax AND BUNCHLUMI>0 ");
310  coral::AttributeList lumidetailOutput;
311  lumidetailOutput.extend("LUMISECTION",typeid(unsigned int));
312  lumidetailOutput.extend("BUNCH",typeid(unsigned int));
313  lumidetailOutput.extend("BUNCHLUMI",typeid(float));
314  coral::IQuery* lumidetailQuery=schema.newQuery();
315  lumidetailQuery->addToTableList(std::string("BUNCH_LUMI_SECTIONS"));
316  lumidetailQuery->addToOutputList("LUMISECTION");
317  lumidetailQuery->addToOutputList("BUNCH");
318  lumidetailQuery->addToOutputList("BUNCHLUMI");
319  lumidetailQuery->setCondition(conditionStr,lumidetailBindVariables);
320  lumidetailQuery->defineOutput(lumidetailOutput);
321  coral::ICursor& lumidetailcursor=lumidetailQuery->execute();
322  while( lumidetailcursor.next() ){
323  const coral::AttributeList& row=lumidetailcursor.currentRow();
324  unsigned int lsnum=row["LUMISECTION"].data<unsigned int>();
325  if(m_detailcache.find(lsnum)==m_detailcache.end()){
326  m_detailcache.insert(std::make_pair(lsnum,std::make_shared<DIPLumiDetail>()));
327  m_detailcache[lsnum]->setOrigin(m_detailcachedrun,lsnum);
328  }
329  if(!row["BUNCH"].isNull()){
330  unsigned int bxidx=row["BUNCH"].data<unsigned int>();
331  float bxlumi=0.0;
332  if(!row["BUNCHLUMI"].isNull()){
333  bxlumi=row["BUNCHLUMI"].data<float>();//Hz/ub
334  }
335  m_detailcache[lsnum]->fillbxdata(bxidx,bxlumi);
336  }
337  }
338  delete lumidetailQuery;
339  session->transaction().commit();
340  }catch(const coral::Exception& er){
341  session->transaction().rollback();
342  mydbservice->disconnect(session);
343  throw cms::Exception("DatabaseError ")<<er.what();
344  }
345  mydbservice->disconnect(session);
346 }
348 //define this as a plug-in
RunNumber_t run() const
Definition: EventID.h:39
void setFirst(const IOVSyncValue &iTime)
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
unsigned int m_detailcachedrun
tuple session
Definition: dataDML.py:2333
const EventID & eventID() const
Definition: IOVSyncValue.h:42
tuple schema
Definition: dataDML.py:2334
DIPLumiProducer(const edm::ParameterSet &)
std::string m_connectStr
std::shared_ptr< DIPLumiSummary > ReturnSummaryType
ReturnDetailType produceDetail(const DIPLuminosityRcd &)
void setWhatProduced(T *iThis, const es::Label &iLabel=es::Label())
Definition: ESProducer.h:115
tuple result
Definition: mps_fire.py:84
std::shared_ptr< DIPLumiSummary > m_summaryresult
virtual void setIntervalFor(const edm::eventsetup::EventSetupRecordKey &, const edm::IOVSyncValue &, edm::ValidityInterval &)
bool isAvailable() const
Definition: Service.h:46
LuminosityBlockNumber_t luminosityBlockNumber() const
Definition: IOVSyncValue.h:43
std::shared_ptr< DIPLumiDetail > m_detailresult
void disconnect(coral::ISessionProxy *session)
Definition: DBService.cc:27
void setLast(const IOVSyncValue &iTime)
std::map< unsigned int, std::shared_ptr< DIPLumiSummary > > m_summarycache
unsigned int m_summarycachedrun
std::shared_ptr< DIPLumiDetail > ReturnDetailType
#define DEFINE_FWK_EVENTSETUP_SOURCE(type)
Definition: SourceFactory.h:92
unsigned int m_cachesize
unsigned int maxavailableLSforRun(coral::ISchema &schema, const std::string &tablename, unsigned int runnumber)
void filldetailcache(unsigned int runnumber, unsigned int startlsnum)
const edm::IOVSyncValue * m_pcurrentTime
coral::ISessionProxy * connectReadOnly(const std::string &connectstring)
Definition: DBService.cc:23
std::map< unsigned int, std::shared_ptr< DIPLumiDetail > > m_detailcache
void fillsummarycache(unsigned int runnumber, unsigned int startlsnum)
ReturnSummaryType produceSummary(const DIPLuminosityRcd &)