1 #ifndef RecoLuminosity_LumiProducer_HLTV32DB_H 2 #define RecoLuminosity_LumiProducer_HLTV32DB_H 3 #include "CoralBase/AttributeList.h" 4 #include "CoralBase/Attribute.h" 5 #include "CoralBase/AttributeSpecification.h" 6 #include "CoralBase/Blob.h" 7 #include "CoralBase/Exception.h" 8 #include "RelationalAccess/ConnectionService.h" 9 #include "RelationalAccess/ISessionProxy.h" 10 #include "RelationalAccess/ITransaction.h" 11 #include "RelationalAccess/ITypeConverter.h" 12 #include "RelationalAccess/IQuery.h" 13 #include "RelationalAccess/ICursor.h" 14 #include "RelationalAccess/ISchema.h" 15 #include "RelationalAccess/IView.h" 16 #include "RelationalAccess/ITable.h" 17 #include "RelationalAccess/ITableDataEditor.h" 18 #include "RelationalAccess/IBulkOperation.h" 51 typedef std::map<unsigned int, std::string, std::less<unsigned int> >
HltPathMap;
52 typedef std::vector<std::map<unsigned int, HLTV32DB::hltinfo, std::less<unsigned int> > >
HltResult;
54 unsigned int irunnumber,
57 HltResult::iterator hltBeg,
58 HltResult::iterator hltEnd,
59 unsigned int commitintv);
61 unsigned int irunnumber,
64 HltResult::iterator hltBeg,
65 HltResult::iterator hltEnd,
67 unsigned int commitintv);
78 std::string triggerpathtabname(
"HLT_SUPERVISOR_TRIGGERPATHS");
79 std::string maptabname(
"HLT_SUPERVISOR_SCALAR_MAP_V2");
81 coral::ConnectionService* svc =
new coral::ConnectionService;
93 if (cutpos != std::string::npos) {
94 dbsource =
m_source.substr(0, cutpos);
95 csvsource =
m_source.substr(cutpos + 1);
98 coral::ISessionProxy* srcsession = svc->connect(dbsource, coral::ReadOnly);
99 coral::ITypeConverter& tpc = srcsession->typeConverter();
100 tpc.setCppTypeForSqlType(
"unsigned int",
"NUMBER(11)");
101 srcsession->transaction().start(
true);
102 coral::ISchema& gtSchemaHandle = srcsession->schema(gtschema);
103 coral::ISchema& hltSchemaHandle = srcsession->schema(hltschema);
104 coral::ISchema& confdbSchemaHandle = srcsession->schema(confdbschema);
105 if (!hltSchemaHandle.existsTable(triggerpathtabname) || !hltSchemaHandle.existsTable(maptabname)) {
106 throw lumi::Exception(
"missing hlt tables",
"retrieveData",
"HLTV32DB");
110 std::vector<std::pair<unsigned int, unsigned int> > psindexmap;
111 coral::AttributeList psindexVariableList;
112 psindexVariableList.extend(
"runnumber",
typeid(
unsigned int));
113 psindexVariableList[
"runnumber"].data<
unsigned int>() =
runnumber;
114 coral::IQuery* qPsindex = gtSchemaHandle.tableHandle(gttabname).newQuery();
115 coral::AttributeList psindexOutput;
116 psindexOutput.extend(
"PRESCALE_INDEX",
typeid(
unsigned int));
117 psindexOutput.extend(
"LUMI_SECTION",
typeid(
unsigned int));
118 qPsindex->addToOutputList(
"PRESCALE_INDEX");
119 qPsindex->addToOutputList(
"LUMI_SECTION");
120 qPsindex->setCondition(
"RUN_NUMBER=:runnumber", psindexVariableList);
121 qPsindex->defineOutput(psindexOutput);
122 coral::ICursor& psindexCursor = qPsindex->execute();
123 unsigned int lsmin = 4294967295;
124 unsigned int lsmax = 0;
125 while (psindexCursor.next()) {
126 if (!psindexCursor.currentRow()[
"PRESCALE_INDEX"].isNull()) {
127 unsigned int psindx = psindexCursor.currentRow()[
"PRESCALE_INDEX"].data<
unsigned int>();
128 unsigned int pslsnum = psindexCursor.currentRow()[
"LUMI_SECTION"].data<
unsigned int>();
129 if (pslsnum >
lsmax) {
132 if (pslsnum <
lsmin) {
135 psindexmap.push_back(std::make_pair(pslsnum, psindx));
139 if (psindexmap.empty()) {
140 srcsession->transaction().commit();
142 throw lumi::Exception(
"no psindex data found",
"retrieveData",
"HLTV32DB");
148 coral::AttributeList bindVariableList;
149 bindVariableList.extend(
"runnumber",
typeid(
unsigned int));
150 bindVariableList[
"runnumber"].data<
unsigned int>() =
runnumber;
151 coral::IQuery* q1 = hltSchemaHandle.tableHandle(triggerpathtabname).newQuery();
152 coral::AttributeList hltpathid;
153 hltpathid.extend(
"hltpathid",
typeid(
unsigned int));
154 q1->addToOutputList(
"distinct(PATHID)",
"hltpathid");
155 q1->setCondition(
"RUNNUMBER=:runnumber", bindVariableList);
156 q1->defineOutput(hltpathid);
157 coral::ICursor&
c = q1->execute();
159 unsigned int hid =
c.currentRow()[
"hltpathid"].data<
unsigned int>();
160 hltpathmap.insert(std::make_pair(hid,
""));
165 HltPathMap::iterator mpit;
166 HltPathMap::iterator mpitBeg = hltpathmap.begin();
167 HltPathMap::iterator mpitEnd = hltpathmap.end();
168 for (mpit = mpitBeg; mpit != mpitEnd; ++mpit) {
169 coral::IQuery* mq = confdbSchemaHandle.newQuery();
170 coral::AttributeList mqbindVariableList;
171 mqbindVariableList.extend(
"pathid",
typeid(
unsigned int));
172 mqbindVariableList[
"pathid"].data<
unsigned int>() = mpit->first;
173 mq->addToTableList(confdbpathtabname);
174 mq->addToOutputList(
"NAME",
"hltpathname");
175 mq->setCondition(
"PATHID=:pathid", mqbindVariableList);
176 coral::ICursor& mqcursor = mq->execute();
177 while (mqcursor.next()) {
188 hltresult.reserve(nls);
193 std::map<unsigned int, HLTV32DB::hltinfo> allpaths;
194 HltPathMap::iterator aIt;
195 HltPathMap::iterator aItBeg = hltpathmap.begin();
196 HltPathMap::iterator aItEnd = hltpathmap.end();
197 for (aIt = aItBeg; aIt != aItEnd; ++aIt) {
204 allpaths.insert(std::make_pair(aIt->first, ct));
206 hltresult.push_back(allpaths);
209 bool lscountfromzero =
false;
212 for (
std::vector<std::pair<unsigned int, unsigned int> >::iterator it = psindexmap.begin(); it != psindexmap.end();
215 unsigned int lsnum = it->first;
216 unsigned int psindex = it->second;
217 coral::AttributeList hltdataVariableList;
218 hltdataVariableList.extend(
"runnumber",
typeid(
unsigned int));
219 hltdataVariableList.extend(
"lsnum",
typeid(
unsigned int));
220 hltdataVariableList.extend(
"psindex",
typeid(
unsigned int));
221 hltdataVariableList[
"runnumber"].data<
unsigned int>() =
runnumber;
222 hltdataVariableList[
"lsnum"].data<
unsigned int>() = lsnum;
223 hltdataVariableList[
"psindex"].data<
unsigned int>() = psindex;
224 coral::IQuery* qHltData = hltSchemaHandle.newQuery();
225 qHltData->addToTableList(triggerpathtabname,
"t");
226 qHltData->addToTableList(maptabname,
"m");
227 coral::AttributeList hltdataOutput;
228 hltdataOutput.extend(
"L1PASS",
typeid(
unsigned int));
229 hltdataOutput.extend(
"PACCEPT",
typeid(
unsigned int));
230 hltdataOutput.extend(
"PATHID",
typeid(
unsigned int));
231 hltdataOutput.extend(
"PSVALUE",
typeid(
unsigned int));
233 qHltData->addToOutputList(
"t.L1PASS",
"l1pass");
234 qHltData->addToOutputList(
"t.PACCEPT",
"paccept");
235 qHltData->addToOutputList(
"t.PATHID",
"pathid");
236 qHltData->addToOutputList(
"m.PSVALUE",
"psvalue");
237 qHltData->setCondition(
238 "m.PATHID=t.PATHID and m.RUNNUMBER=t.RUNNUMBER and m.RUNNUMBER=:runnumber AND m.PSINDEX=:psindex AND " 240 hltdataVariableList);
241 qHltData->defineOutput(hltdataOutput);
242 coral::ICursor& hltdataCursor = qHltData->execute();
243 while (hltdataCursor.next()) {
244 const coral::AttributeList& row = hltdataCursor.currentRow();
246 lscountfromzero =
true;
247 if (lscountfromzero) {
248 std::cout <<
"hlt ls count from 0 , we skip/dodge/parry it!" << std::endl;
251 unsigned int pathid = row[
"PATHID"].data<
unsigned int>();
252 std::map<unsigned int, hltinfo>& allpathinfo = hltresult.at(lsnum - 1);
253 hltinfo& pathcontent = allpathinfo[pathid];
254 pathcontent.
hltinput = row[
"L1PASS"].data<
unsigned int>();
255 pathcontent.
hltaccept = row[
"PACCEPT"].data<
unsigned int>();
256 pathcontent.
prescale = row[
"PSVALUE"].data<
unsigned int>();
261 srcsession->transaction().commit();
266 unsigned int npath = hltpathmap.size();
267 coral::ISessionProxy* destsession = svc->connect(
m_dest, coral::Update);
268 coral::ITypeConverter& lumitpc = destsession->typeConverter();
269 lumitpc.setCppTypeForSqlType(
"unsigned int",
"NUMBER(7)");
270 lumitpc.setCppTypeForSqlType(
"unsigned int",
"NUMBER(10)");
271 lumitpc.setCppTypeForSqlType(
"unsigned long long",
"NUMBER(20)");
281 unsigned int totalcmsls = hltresult.size();
282 std::cout <<
"inserting totalhltls " << totalcmsls <<
" total path " << npath << std::endl;
285 unsigned long long hltdataid = 0;
287 if (
m_mode ==
"loadoldschema") {
288 std::cout <<
"writing hlt data to old hlt table" << std::endl;
292 std::cout <<
"writing hlt data to new lshlt table" << std::endl;
314 std::cout <<
"database problem " << er.what() << std::endl;
315 destsession->transaction().rollback();
323 unsigned int irunnumber,
326 HltResult::iterator hltItBeg,
327 HltResult::iterator hltItEnd,
328 unsigned int commitintv) {
329 std::map<unsigned long long, std::vector<unsigned long long> > idallocationtable;
330 unsigned int hltlscount = 0;
332 std::cout <<
"\t allocating total ids " << totalcmsls * npath << std::endl;
333 lumisession->transaction().start(
false);
335 unsigned long long hltID =
337 for (HltResult::iterator hltIt = hltItBeg; hltIt != hltItEnd; ++hltIt, ++hltlscount) {
338 std::vector<unsigned long long> pathvec;
339 pathvec.reserve(npath);
340 for (
unsigned int i = 0;
i < npath; ++
i, ++hltID) {
341 pathvec.push_back(hltID);
343 idallocationtable.insert(std::make_pair(hltlscount, pathvec));
345 std::cout <<
"\t all ids allocated" << std::endl;
347 coral::AttributeList hltData;
348 hltData.extend(
"HLT_ID",
typeid(
unsigned long long));
349 hltData.extend(
"RUNNUM",
typeid(
unsigned int));
350 hltData.extend(
"CMSLSNUM",
typeid(
unsigned int));
352 hltData.extend(
"INPUTCOUNT",
typeid(
unsigned int));
353 hltData.extend(
"ACCEPTCOUNT",
typeid(
unsigned int));
354 hltData.extend(
"PRESCALE",
typeid(
unsigned int));
357 unsigned long long& hlt_id = hltData[
"HLT_ID"].data<
unsigned long long>();
358 unsigned int& hltrunnum = hltData[
"RUNNUM"].data<
unsigned int>();
359 unsigned int& cmslsnum = hltData[
"CMSLSNUM"].data<
unsigned int>();
361 unsigned int& inputcount = hltData[
"INPUTCOUNT"].data<
unsigned int>();
362 unsigned int& acceptcount = hltData[
"ACCEPTCOUNT"].data<
unsigned int>();
363 unsigned int&
prescale = hltData[
"PRESCALE"].data<
unsigned int>();
365 coral::IBulkOperation* hltInserter =
nullptr;
366 unsigned int comittedls = 0;
367 for (HltResult::iterator hltIt = hltItBeg; hltIt != hltItEnd; ++hltIt, ++hltlscount) {
368 std::map<unsigned int, HLTV32DB::hltinfo>::const_iterator pathIt;
369 std::map<unsigned int, HLTV32DB::hltinfo>::const_iterator pathBeg = hltIt->begin();
370 std::map<unsigned int, HLTV32DB::hltinfo>::const_iterator pathEnd = hltIt->end();
371 if (!lumisession->transaction().isActive()) {
372 lumisession->transaction().start(
false);
374 hltInserter = hlttable.dataEditor().bulkInsert(hltData, npath);
376 if (hltIt == hltItBeg) {
378 hltInserter = hlttable.dataEditor().bulkInsert(hltData, npath);
381 unsigned int hltpathcount = 0;
382 for (pathIt = pathBeg; pathIt != pathEnd; ++pathIt, ++hltpathcount) {
383 hlt_id = idallocationtable[hltlscount].at(hltpathcount);
384 hltrunnum = irunnumber;
385 cmslsnum = pathIt->second.cmsluminr;
387 inputcount = pathIt->second.hltinput;
388 acceptcount = pathIt->second.hltaccept;
390 hltInserter->processNextIteration();
392 hltInserter->flush();
394 if (comittedls == commitintv) {
395 std::cout <<
"\t committing in LS chunck " << comittedls << std::endl;
397 hltInserter =
nullptr;
398 lumisession->transaction().commit();
400 std::cout <<
"\t committed " << std::endl;
401 }
else if (hltlscount == (totalcmsls - 1)) {
402 std::cout <<
"\t committing at the end" << std::endl;
404 hltInserter =
nullptr;
405 lumisession->transaction().commit();
411 unsigned int irunnumber,
414 HltResult::iterator hltItBeg,
415 HltResult::iterator hltItEnd,
417 unsigned int commitintv) {
419 std::cout <<
"inserting totalcmsls " << totalcmsls << std::endl;
420 coral::AttributeList lshltData;
421 lshltData.extend(
"DATA_ID",
typeid(
unsigned long long));
422 lshltData.extend(
"RUNNUM",
typeid(
unsigned int));
423 lshltData.extend(
"CMSLSNUM",
typeid(
unsigned int));
424 lshltData.extend(
"PRESCALEBLOB",
typeid(coral::Blob));
425 lshltData.extend(
"HLTCOUNTBLOB",
typeid(coral::Blob));
426 lshltData.extend(
"HLTACCEPTBLOB",
typeid(coral::Blob));
427 unsigned long long& data_id = lshltData[
"DATA_ID"].data<
unsigned long long>();
428 unsigned int& hltrunnum = lshltData[
"RUNNUM"].data<
unsigned int>();
429 unsigned int& cmslsnum = lshltData[
"CMSLSNUM"].data<
unsigned int>();
430 coral::Blob& prescaleblob = lshltData[
"PRESCALEBLOB"].data<coral::Blob>();
431 coral::Blob& hltcountblob = lshltData[
"HLTCOUNTBLOB"].data<coral::Blob>();
432 coral::Blob& hltacceptblob = lshltData[
"HLTACCEPTBLOB"].data<coral::Blob>();
434 unsigned long long branch_id = 3;
438 std::stringstream
op;
441 lumisession->transaction().start(
false);
445 hltrundata.
npath = npath;
447 HltPathMap::iterator hltpathmapIt;
448 HltPathMap::iterator hltpathmapItBeg = hltpathmap.begin();
449 HltPathMap::iterator hltpathmapItEnd = hltpathmap.end();
450 for (hltpathmapIt = hltpathmapItBeg; hltpathmapIt != hltpathmapItEnd; ++hltpathmapIt) {
451 if (hltpathmapIt != hltpathmapItBeg) {
454 pathnames += hltpathmapIt->second;
456 std::cout <<
"\tpathnames " << pathnames << std::endl;
463 <<
" data_id " << hltrundata.
data_id << std::endl;
469 <<
" data_id " << hltrundata.
data_id << std::endl;
473 std::cout <<
"inserting hltrundata" << std::endl;
475 std::cout <<
"inserting lshlt data" << std::endl;
477 unsigned int hltlscount = 0;
478 coral::IBulkOperation* hltInserter =
nullptr;
479 unsigned int comittedls = 0;
480 for (HltResult::iterator hltIt = hltItBeg; hltIt != hltItEnd; ++hltIt, ++hltlscount) {
481 unsigned int cmslscount = hltlscount + 1;
482 std::map<unsigned int, HLTV32DB::hltinfo, std::less<unsigned int> >::const_iterator pathIt;
483 std::map<unsigned int, HLTV32DB::hltinfo, std::less<unsigned int> >::const_iterator pathBeg = hltIt->begin();
484 std::map<unsigned int, HLTV32DB::hltinfo, std::less<unsigned int> >::const_iterator pathEnd = hltIt->end();
485 if (!lumisession->transaction().isActive()) {
486 lumisession->transaction().start(
false);
488 hltInserter = hlttable.dataEditor().bulkInsert(lshltData, npath);
490 if (hltIt == hltItBeg) {
492 hltInserter = hlttable.dataEditor().bulkInsert(lshltData, npath);
496 hltrunnum = irunnumber;
497 cmslsnum = cmslscount;
500 std::vector<unsigned int> hltcounts;
501 hltcounts.reserve(npath);
502 std::vector<unsigned int> hltaccepts;
503 hltaccepts.reserve(npath);
505 for (pathIt = pathBeg; pathIt != pathEnd; ++pathIt) {
506 unsigned int hltcount = pathIt->second.hltinput;
508 hltcounts.push_back(hltcount);
509 unsigned int hltaccept = pathIt->second.hltaccept;
511 hltaccepts.push_back(hltaccept);
512 unsigned int prescale = pathIt->second.prescale;
516 prescaleblob.resize(
sizeof(
unsigned int) * npath);
517 void* prescaleblob_StartAddress = prescaleblob.startingAddress();
518 std::memmove(prescaleblob_StartAddress, &
prescales[0],
sizeof(
unsigned int) * npath);
519 hltcountblob.resize(
sizeof(
unsigned int) * npath);
520 void* hltcountblob_StartAddress = hltcountblob.startingAddress();
521 std::memmove(hltcountblob_StartAddress, &hltcounts[0],
sizeof(
unsigned int) * npath);
522 hltacceptblob.resize(
sizeof(
unsigned int) * npath);
523 void* hltacceptblob_StartAddress = hltacceptblob.startingAddress();
524 std::memmove(hltacceptblob_StartAddress, &hltaccepts[0],
sizeof(
unsigned int) * npath);
526 hltInserter->processNextIteration();
527 hltInserter->flush();
529 if (comittedls == commitintv) {
530 std::cout <<
"\t committing in LS chunck " << comittedls << std::endl;
532 hltInserter =
nullptr;
533 lumisession->transaction().commit();
535 std::cout <<
"\t committed " << std::endl;
536 }
else if (hltlscount == (totalcmsls - 1)) {
537 std::cout <<
"\t committing at the end" << std::endl;
539 hltInserter =
nullptr;
540 lumisession->transaction().commit();
void addEntry(coral::ISchema &schema, const std::string &datatableName, const Entry &entry, unsigned long long branch_id, const std::string &branchname)
static const std::string lshltTableName()
const std::string sourceType() const override
static const std::string hltdataTableName()
std::map< unsigned int, std::string, std::less< unsigned int > > HltPathMap
void writeHltData(coral::ISessionProxy *lumisession, unsigned int irunnumber, const std::string &source, unsigned int npath, HltResult::iterator hltBeg, HltResult::iterator hltEnd, unsigned int commitintv)
unsigned long long data_id
void setAuthentication(const std::string &authPath)
unsigned long long getEntryInBranchByName(coral::ISchema &schema, const std::string &datatableName, const std::string &entryname, const std::string &branchname)
unsigned long long revision_id
static const unsigned int COMMITINTERVAL
unsigned long long entry_id
std::vector< std::map< unsigned int, HLTV32DB::hltinfo, std::less< unsigned int > > > HltResult
static const unsigned int COMMITLSINTERVAL
void bookNewEntry(coral::ISchema &schema, const std::string &datatableName, Entry &entry)
void insertHltRunData(coral::ISchema &schema, const HltEntry &hltentry)
static const std::string hltTableName()
unsigned long long generateNextIDForTable(const std::string &tableName, unsigned int interval=1)
const std::string dataType() const override
unsigned long long writeHltDataToSchema2(coral::ISessionProxy *lumisession, unsigned int irunnumber, const std::string &source, unsigned int npath, HltResult::iterator hltBeg, HltResult::iterator hltEnd, HltPathMap &hltpathmap, unsigned int commitintv)
#define DEFINE_EDM_PLUGIN(factory, type, name)
void addRevision(coral::ISchema &schema, const std::string &datatableName, const Entry &revision, unsigned long long branch_id, std::string &branchname)
unsigned long long retrieveData(unsigned int) override
HLTV32DB(const std::string &dest)
static std::string const source
void bookNewRevision(coral::ISchema &schema, const std::string &datatableName, Entry &revision)