24 #include "CoralBase/Exception.h" 25 #include "CoralBase/AttributeList.h" 26 #include "CoralBase/Attribute.h" 27 #include "CoralBase/AttributeSpecification.h" 28 #include "CoralBase/Exception.h" 29 #include "CoralBase/Blob.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" 50 #include <boost/tokenizer.hpp> 51 #include "boost/filesystem/path.hpp" 52 #include "boost/filesystem/operations.hpp" 85 void fillLSCache(
unsigned int runnum,
unsigned int luminum);
88 unsigned int maxavailableLSforRun(
coral::ISchema& schema,
const std::
string& tablename,
unsigned int runnumber);
89 std::
string m_connectStr;
90 unsigned int m_cachedrun;
92 unsigned int m_cachesize;
97 : m_cachedrun(0), m_isNullRun(
false), m_cachesize(0) {
99 produces<LumiSummary, edm::Transition::BeginLuminosityBlock>();
100 produces<LumiDetails, edm::Transition::BeginLuminosityBlock>();
102 m_connectStr = iConfig.getParameter<
std::string>(
"connect");
103 m_cachesize = iConfig.getUntrackedParameter<
unsigned int>(
"ncacheEntries", 5);
114 iLBlock.
put(std::make_unique<LumiSummary>());
115 iLBlock.
put(std::make_unique<LumiDetails>());
122 writeEmptyProductForEntry(iLBlock);
125 if (m_cachedrun != currentrun) {
126 fillLSCache(currentrun, currentls);
128 if (m_lscache.find(currentls) == m_lscache.end()) {
130 fillLSCache(currentrun, currentls);
133 if (m_lscache.empty()) {
134 writeEmptyProductForEntry(iLBlock);
137 unsigned int lstowriteout = 0;
138 if (m_lscache.find(currentls) == m_lscache.end()) {
139 std::vector<unsigned int>
v;
140 for (std::map<unsigned int, ExpressLumiProducer::PerLSData>::iterator it = m_lscache.begin(); it != m_lscache.end();
142 v.push_back(it->first);
144 lstowriteout = v.back();
146 lstowriteout = currentls;
150 if (lstowriteout == 0) {
151 writeEmptyProductForEntry(iLBlock);
153 writeProductsForEntry(iLBlock, lstowriteout);
164 coral::AttributeList bindVariables;
165 bindVariables.extend(
"runnumber",
typeid(
unsigned int));
166 bindVariables[
"runnumber"].data<
unsigned int>() = runnumber;
168 coral::AttributeList MyOutput;
169 MyOutput.extend(
"maxavailablels",
typeid(
unsigned int));
170 coral::IQuery*
myQuery = schema.newQuery();
171 myQuery->addToTableList(tablename);
172 myQuery->addToOutputList(
"max(LUMISECTION)",
"maxavailablels");
173 myQuery->setCondition(conditionStr, bindVariables);
174 myQuery->defineOutput(MyOutput);
175 coral::ICursor& mycursor = myQuery->execute();
176 while (mycursor.next()) {
177 const coral::AttributeList& row = mycursor.currentRow();
178 if (!row[
"maxavailablels"].isNull()) {
179 result = row[
"maxavailablels"].data<
unsigned int>();
194 throw cms::Exception(
"Non existing service lumi::service::DBService");
197 coral::ITypeConverter& tconverter = session->typeConverter();
201 unsigned int lsmin = 1;
202 unsigned int lsmax = currentlsnum;
204 session->transaction().start(
true);
205 coral::ISchema& schema = session->nominalSchema();
206 unsigned int maxavailableLS = maxavailableLSforRun(schema,
std::string(
"LUMI_SECTIONS"), m_cachedrun);
207 if (maxavailableLS != 0 && maxavailableLS < currentlsnum) {
208 lsmax = maxavailableLS;
209 }
else if (maxavailableLS == 0) {
211 session->transaction().commit();
214 if (m_cachesize != 0) {
215 lsmin = (lsmax - m_cachesize) > 0 ? (lsmax - m_cachesize + 1) : 1;
217 for (
unsigned int n = lsmin;
n <= lsmax; ++
n) {
219 std::vector<float> mytmp(3564, 0.0);
221 std::vector<float> myerrtmp(3564, 0.0);
223 std::vector<short> myqtmp(3564, 0);
225 m_lscache.insert(std::make_pair(
n, l));
228 coral::AttributeList lumisummaryBindVariables;
229 lumisummaryBindVariables.extend(
"lsmin",
typeid(
unsigned int));
230 lumisummaryBindVariables.extend(
"runnumber",
typeid(
unsigned int));
231 lumisummaryBindVariables[
"runnumber"].data<
unsigned int>() = m_cachedrun;
232 lumisummaryBindVariables[
"lsmin"].data<
unsigned int>() = lsmin;
233 std::string conditionStr(
" RUNNUMBER=:runnumber AND LUMISECTION>=:lsmin ");
234 coral::AttributeList lumisummaryOutput;
235 lumisummaryOutput.extend(
"LUMISECTION",
typeid(
unsigned int));
236 lumisummaryOutput.extend(
"INSTLUMI",
typeid(
float));
237 lumisummaryOutput.extend(
"DELIVLUMISECTION",
typeid(
float));
238 lumisummaryOutput.extend(
"LIVELUMISECTION",
typeid(
float));
239 lumisummaryOutput.extend(
"STARTORBIT",
typeid(
unsigned long long));
240 if (m_cachesize != 0) {
241 lumisummaryBindVariables.extend(
"lsmax",
typeid(
unsigned int));
242 conditionStr = conditionStr +
"AND LUMISECTION<=:lsmax";
243 lumisummaryBindVariables[
"lsmax"].data<
unsigned int>() = lsmax;
245 coral::IQuery* lumisummaryQuery = schema.newQuery();
246 lumisummaryQuery->addToTableList(
std::string(
"LUMI_SECTIONS"));
247 lumisummaryQuery->addToOutputList(
"LUMISECTION");
248 lumisummaryQuery->addToOutputList(
"INSTLUMI");
249 lumisummaryQuery->addToOutputList(
"DELIVLUMISECTION");
250 lumisummaryQuery->addToOutputList(
"LIVELUMISECTION");
251 lumisummaryQuery->addToOutputList(
"STARTORBIT");
252 lumisummaryQuery->setCondition(conditionStr, lumisummaryBindVariables);
253 lumisummaryQuery->defineOutput(lumisummaryOutput);
254 coral::ICursor& lumisummarycursor = lumisummaryQuery->execute();
255 unsigned int rowcounter = 0;
256 while (lumisummarycursor.next()) {
257 const coral::AttributeList& row = lumisummarycursor.currentRow();
258 unsigned int lsnum = row[
"LUMISECTION"].data<
unsigned int>();
259 float instlumi = 0.0;
260 if (!row[
"INSTLUMI"].isNull()) {
261 instlumi = row[
"INSTLUMI"].data<
float>();
263 float deadfrac = 1.0;
264 float intgdellumi = 0.0;
265 float intgreclumi = 0.0;
266 unsigned long long startorbit = 0;
267 if (!row[
"DELIVLUMISECTION"].isNull()) {
268 intgdellumi = row[
"DELIVLUMISECTION"].data<
float>() * 1000.0;
270 if (!row[
"LIVELUMISECTION"].isNull()) {
271 intgreclumi = row[
"LIVELUMISECTION"].data<
float>() * 1000.0;
273 if (intgdellumi > 0) {
274 deadfrac = 1.0 - intgreclumi / intgdellumi;
276 if (!row[
"STARTORBIT"].isNull()) {
277 startorbit = row[
"STARTORBIT"].data<
unsigned long long>();
279 unsigned long long deadcount = deadfrac * 10000.0;
280 unsigned long long bitzerocount = 10000.0;
282 lsdata.
lsnum = lsnum;
290 if (rowcounter == 0) {
293 delete lumisummaryQuery;
301 coral::AttributeList lumidetailBindVariables;
302 lumidetailBindVariables.extend(
"lsmin",
typeid(
unsigned int));
303 lumidetailBindVariables.extend(
"runnumber",
typeid(
unsigned int));
304 lumidetailBindVariables[
"runnumber"].data<
unsigned int>() = m_cachedrun;
305 lumidetailBindVariables[
"lsmin"].data<
unsigned int>() = lsmin;
306 std::string detailconditionStr(
" RUNNUMBER=:runnumber AND LUMISECTION>=:lsmin AND BUNCHLUMI>0 ");
307 coral::AttributeList lumidetailOutput;
308 lumidetailOutput.extend(
"LUMISECTION",
typeid(
unsigned int));
309 lumidetailOutput.extend(
"BUNCH",
typeid(
unsigned int));
310 lumidetailOutput.extend(
"BUNCHLUMI",
typeid(
float));
311 if (m_cachesize != 0) {
312 lumidetailBindVariables.extend(
"lsmax",
typeid(
unsigned int));
313 detailconditionStr = detailconditionStr +
"AND LUMISECTION<=:lsmax";
314 lumidetailBindVariables[
"lsmax"].data<
unsigned int>() = lsmax;
316 coral::IQuery* lumidetailQuery = schema.newQuery();
317 lumidetailQuery->addToTableList(
std::string(
"BUNCH_LUMI_SECTIONS"));
318 lumidetailQuery->addToOutputList(
"LUMISECTION");
319 lumidetailQuery->addToOutputList(
"BUNCH");
320 lumidetailQuery->addToOutputList(
"BUNCHLUMI");
321 lumidetailQuery->setCondition(detailconditionStr, lumidetailBindVariables);
322 lumidetailQuery->defineOutput(lumidetailOutput);
323 coral::ICursor& lumidetailcursor = lumidetailQuery->execute();
324 while (lumidetailcursor.next()) {
325 const coral::AttributeList& row = lumidetailcursor.currentRow();
326 unsigned int lsnum = row[
"LUMISECTION"].data<
unsigned int>();
327 unsigned int bxidx = row[
"BUNCH"].data<
unsigned int>();
328 float bxlumi = row[
"BUNCHLUMI"].data<
float>();
329 m_lscache[lsnum].bunchlumivalue[bxidx] = bxlumi;
331 delete lumidetailQuery;
332 session->transaction().commit();
334 session->transaction().rollback();
340 auto pIn1 = std::make_unique<LumiSummary>();
341 auto pIn2 = std::make_unique<LumiDetails>();
343 pIn1->setLumiVersion(
"DIP");
344 pIn2->setLumiVersion(
"DIP");
350 pIn1->setLumiVersion(
"DIP");
351 pIn1->setLumiData(lsdata.
lumivalue, 0.0, 0.0);
354 pIn1->setlsnumber(lsdata.
lsnum);
357 pIn2->setLumiVersion(
"DIP");
unsigned long long deadcount
ISessionProxyPtr connectReadOnly(const std::string &connectstring)
std::vector< short > bunchlumiquality
LuminosityBlockNumber_t luminosityBlock() const
#define DEFINE_FWK_MODULE(type)
void put(std::unique_ptr< PROD > product)
Put a new product.
void fillLSCache(unsigned int runnum, unsigned int luminum)
void produce(edm::Event &, const edm::EventSetup &) final
void writeProductsForEntry(edm::LuminosityBlock &iLBlock, unsigned int luminum)
void writeEmptyProductForEntry(edm::LuminosityBlock &iLBlock)
void beginLuminosityBlockProduce(edm::LuminosityBlock &iLBlock, edm::EventSetup const &iSetup) final
std::vector< float > bunchlumivalue
unsigned int bitzerocount
unsigned int maxavailableLSforRun(coral::ISchema &schema, const std::string &tablename, unsigned int runnumber)
std::vector< float > bunchlumierror
~ExpressLumiProducer() override