00001 #ifndef RecoLuminosity_LumiProducer_TRGWBM2DB_h
00002 #define RecoLuminosity_LumiProducer_TRGWBM2DB_h
00003 #include "CoralBase/AttributeList.h"
00004 #include "CoralBase/Attribute.h"
00005 #include "CoralBase/AttributeSpecification.h"
00006 #include "CoralBase/Exception.h"
00007 #include "RelationalAccess/ConnectionService.h"
00008 #include "RelationalAccess/ISessionProxy.h"
00009 #include "RelationalAccess/ITransaction.h"
00010 #include "RelationalAccess/ITypeConverter.h"
00011 #include "RelationalAccess/IQuery.h"
00012 #include "RelationalAccess/ICursor.h"
00013 #include "RelationalAccess/ISchema.h"
00014 #include "RelationalAccess/IView.h"
00015 #include "RelationalAccess/ITable.h"
00016 #include "RelationalAccess/ITableDataEditor.h"
00017 #include "RelationalAccess/IBulkOperation.h"
00018 #include "RecoLuminosity/LumiProducer/interface/DataPipe.h"
00019 #include "RecoLuminosity/LumiProducer/interface/LumiNames.h"
00020 #include "RecoLuminosity/LumiProducer/interface/idDealer.h"
00021 #include "RecoLuminosity/LumiProducer/interface/Exception.h"
00022 #include "RecoLuminosity/LumiProducer/interface/DBConfig.h"
00023 #include "RecoLuminosity/LumiProducer/interface/ConstantDef.h"
00024 #include <iostream>
00025 #include <sstream>
00026 #include <map>
00027 namespace lumi{
00028 class TRGWBM2DB : public DataPipe{
00029 public:
00030 const static unsigned int COMMITLSINTERVAL=20;
00031 explicit TRGWBM2DB(const std::string& dest);
00032 virtual void retrieveData( unsigned int runnumber);
00033 virtual const std::string dataType() const;
00034 virtual const std::string sourceType() const;
00035 virtual ~TRGWBM2DB();
00036 private:
00037 std::string int2str(unsigned int t,unsigned int width);
00038 unsigned int str2int(const std::string& s);
00039 private:
00040
00041 typedef std::vector<std::string> TriggerNameResult_Algo;
00042 typedef std::vector<std::string> TriggerNameResult_Tech;
00043 typedef std::vector<unsigned int> PrescaleResult_Algo;
00044 typedef std::vector<unsigned int> PrescaleResult_Tech;
00045
00046 typedef unsigned long long DEADCOUNT;
00047 typedef std::vector<DEADCOUNT> TriggerDeadCountResult;
00048 typedef std::vector<unsigned int> BITCOUNT;
00049 typedef std::vector<BITCOUNT> TriggerCountResult_Algo;
00050 typedef std::vector<BITCOUNT> TriggerCountResult_Tech;
00051 };
00052
00053
00054
00055 TRGWBM2DB::TRGWBM2DB(const std::string& dest):DataPipe(dest){}
00056 void TRGWBM2DB::retrieveData( unsigned int runnumber){
00057 std::string runnumberstr=int2str(runnumber,6);
00058
00059 coral::ConnectionService* svc=new coral::ConnectionService;
00060 lumi::DBConfig dbconf(*svc);
00061 if(!m_authpath.empty()){
00062 dbconf.setAuthentication(m_authpath);
00063 }
00064
00065 coral::ISessionProxy* trgsession=svc->connect(m_source, coral::ReadOnly);
00066 coral::ITypeConverter& tpc=trgsession->typeConverter();
00067
00068 tpc.setCppTypeForSqlType("unsigned int","NUMBER(7)");
00069 tpc.setCppTypeForSqlType("unsigned int","NUMBER(10)");
00070 tpc.setCppTypeForSqlType("unsigned long long","NUMBER(20)");
00071
00072 coral::AttributeList bindVariableList;
00073 bindVariableList.extend("runnumber",typeid(unsigned int));
00074 bindVariableList["runnumber"].data<unsigned int>()=runnumber;
00075 std::string wbmschema("CMS_WBM");
00076 std::string algoname("LEVEL1_TRIGGER_ALGO_CONDITIONS");
00077 std::string techname("LEVEL1_TRIGGER_TECH_CONDITIONS");
00078 std::string deadname("LEVEL1_TRIGGER_CONDITIONS");
00079
00080 std::string gtschema("CMS_GT");
00081 std::string runtechviewname("GT_RUN_TECH_VIEW");
00082 std::string runalgoviewname("GT_RUN_ALGO_VIEW");
00083 std::string runprescalgoviewname("GT_RUN_PRESC_ALGO_VIEW");
00084 std::string runpresctechviewname("GT_RUN_PRESC_TECH_VIEW");
00085
00086
00087 lumi::TRGWBM2DB::BITCOUNT mybitcount_algo;
00088 mybitcount_algo.reserve(lumi::N_TRGALGOBIT);
00089 lumi::TRGWBM2DB::BITCOUNT mybitcount_tech;
00090 mybitcount_tech.reserve(lumi::N_TRGTECHBIT);
00091 lumi::TRGWBM2DB::TriggerNameResult_Algo algonames;
00092 algonames.reserve(lumi::N_TRGALGOBIT);
00093 lumi::TRGWBM2DB::TriggerNameResult_Tech technames;
00094 technames.reserve(lumi::N_TRGTECHBIT);
00095 lumi::TRGWBM2DB::PrescaleResult_Algo algoprescale;
00096 algoprescale.reserve(lumi::N_TRGALGOBIT);
00097 lumi::TRGWBM2DB::PrescaleResult_Tech techprescale;
00098 techprescale.reserve(lumi::N_TRGTECHBIT);
00099 lumi::TRGWBM2DB::TriggerCountResult_Algo algocount;
00100 algocount.reserve(400);
00101 lumi::TRGWBM2DB::TriggerCountResult_Tech techcount;
00102 techcount.reserve(400);
00103 lumi::TRGWBM2DB::TriggerDeadCountResult deadtimeresult;
00104 deadtimeresult.reserve(400);
00105 coral::ITransaction& transaction=trgsession->transaction();
00106 transaction.start(true);
00107
00130 coral::ISchema& wbmschemaHandle=trgsession->schema(wbmschema);
00131 if(!wbmschemaHandle.existsTable(algoname)){
00132 throw lumi::Exception(std::string("non-existing table ")+algoname,"retrieveData","TRGWBM2DB");
00133 }
00134 if(!wbmschemaHandle.existsTable(techname)){
00135 throw lumi::Exception(std::string("non-existing table ")+techname,"retrieveData","TRGWBM2DB");
00136 }
00137 if(!wbmschemaHandle.existsTable(deadname)){
00138 throw lumi::Exception(std::string("non-existing table ")+deadname,"retrieveData","TRGWBM2DB");
00139 }
00140
00141
00142
00143
00144
00145 coral::IQuery* Queryalgo=wbmschemaHandle.newQuery();
00146 Queryalgo->addToTableList(algoname);
00147 coral::AttributeList qalgoOutput;
00148 qalgoOutput.extend("counts",typeid(unsigned int));
00149 qalgoOutput.extend("lsnr",typeid(unsigned int));
00150 qalgoOutput.extend("algobit",typeid(unsigned int));
00151 Queryalgo->addToOutputList("GTALGOCOUNTS","counts");
00152 Queryalgo->addToOutputList("LUMISEGMENTNR","lsnr");
00153 Queryalgo->addToOutputList("BIT","algobit");
00154 Queryalgo->setCondition("RUNNUMBER =:runnumber",bindVariableList);
00155 Queryalgo->addToOrderList("LUMISEGMENTNR");
00156 Queryalgo->addToOrderList("BIT");
00157 Queryalgo->defineOutput(qalgoOutput);
00158 coral::ICursor& c=Queryalgo->execute();
00159 unsigned int s=0;
00160 while( c.next() ){
00161 const coral::AttributeList& row = c.currentRow();
00162
00163 unsigned int lsnr=row["lsnr"].data<unsigned int>();
00164 unsigned int count=row["counts"].data<unsigned int>();
00165 mybitcount_algo.push_back(count);
00166 unsigned int algobit=row["algobit"].data<unsigned int>();
00167 if(algobit==(lumi::N_TRGALGOBIT-1)){
00168 ++s;
00169 while(s!=lsnr){
00170 std::cout<<"ALGO COUNT alert: found hole in LS range"<<std::endl;
00171 std::cout<<" fill all algocount 0 for LS "<<s<<std::endl;
00172 std::vector<unsigned int> tmpzero(lumi::N_TRGALGOBIT,0);
00173 algocount.push_back(tmpzero);
00174 ++s;
00175 }
00176 algocount.push_back(mybitcount_algo);
00177 mybitcount_algo.clear();
00178 }
00179 }
00180 if(s==0){
00181 c.close();
00182 delete Queryalgo;
00183 transaction.commit();
00184 throw lumi::Exception(std::string("requested run ")+runnumberstr+std::string(" doesn't exist for algocounts"),"retrieveData","TRGWBM2DB");
00185 }
00186 delete Queryalgo;
00187 transaction.commit();
00188
00189
00190
00191
00192
00193
00194 transaction.start(true);
00195 coral::IQuery* Querytech=wbmschemaHandle.newQuery();
00196 Querytech->addToTableList(techname);
00197 coral::AttributeList qtechOutput;
00198 qtechOutput.extend("counts",typeid(unsigned int));
00199 qtechOutput.extend("lsnr",typeid(unsigned int));
00200 qtechOutput.extend("techbit",typeid(unsigned int));
00201 Querytech->addToOutputList("GTTECHCOUNTS","counts");
00202 Querytech->addToOutputList("LUMISEGMENTNR","lsnr");
00203 Querytech->addToOutputList("BIT","techbit");
00204 Querytech->setCondition("RUNNUMBER=:runnumber",bindVariableList);
00205 Querytech->addToOrderList("LUMISEGMENTNR");
00206 Querytech->addToOrderList("BIT");
00207 Querytech->defineOutput(qtechOutput);
00208 coral::ICursor& techcursor=Querytech->execute();
00209
00210 s=0;
00211 while( techcursor.next() ){
00212 const coral::AttributeList& row = techcursor.currentRow();
00213
00214 unsigned int lsnr=row["lsnr"].data<unsigned int>();
00215 unsigned int count=row["counts"].data<unsigned int>();
00216 unsigned int techbit=row["techbit"].data<unsigned int>();
00217 mybitcount_tech.push_back(count);
00218 if(techbit==(lumi::N_TRGTECHBIT-1)){
00219 ++s;
00220 while( s!=lsnr){
00221 std::cout<<"TECH COUNT alert: found hole in LS range"<<std::endl;
00222 std::cout<<" fill all techcount with 0 for LS "<<s<<std::endl;
00223 std::vector<unsigned int> tmpzero(lumi::N_TRGTECHBIT,0);
00224 techcount.push_back(tmpzero);
00225 ++s;
00226 }
00227 techcount.push_back(mybitcount_tech);
00228 mybitcount_tech.clear();
00229 }
00230 }
00231 if(s==0){
00232 techcursor.close();
00233 delete Querytech;
00234 transaction.commit();
00235 throw lumi::Exception(std::string("requested run ")+runnumberstr+std::string(" doesn't exist for techcounts"),"retrieveData","TRGWBM2DB");
00236 }
00237 delete Querytech;
00238 transaction.commit();
00239
00240
00241
00242
00243
00244 transaction.start(true);
00245 coral::IQuery* Querydead=wbmschemaHandle.newQuery();
00246 Querydead->addToTableList(deadname);
00247 coral::AttributeList qdeadOutput;
00248 qdeadOutput.extend("counts",typeid(unsigned int));
00249 qdeadOutput.extend("lsnr",typeid(unsigned int));
00250 Querydead->addToOutputList("DEADTIMEBEAMACTIVE","counts");
00251 Querydead->addToOutputList("LUMISEGMENTNR","lsnr");
00252 coral::AttributeList bindVariablesDead;
00253 bindVariablesDead.extend("runnumber",typeid(int));
00254 bindVariablesDead["runnumber"].data<int>()=runnumber;
00255 Querydead->setCondition("RUNNUMBER=:runnumber",bindVariablesDead);
00256 Querydead->addToOrderList("LUMISEGMENTNR");
00257 Querydead->defineOutput(qdeadOutput);
00258 coral::ICursor& deadcursor=Querydead->execute();
00259 s=0;
00260 while( deadcursor.next() ){
00261 const coral::AttributeList& row = deadcursor.currentRow();
00262
00263 ++s;
00264 unsigned int lsnr=row["lsnr"].data<unsigned int>();
00265 while(s!=lsnr){
00266 std::cout<<"DEADTIME alert: found hole in LS range"<<std::endl;
00267 std::cout<<" fill deadtimebeamactive 0 for LS "<<s<<std::endl;
00268 deadtimeresult.push_back(0);
00269 ++s;
00270 }
00271 unsigned int count=row["counts"].data<unsigned int>();
00272 deadtimeresult.push_back(count);
00273 }
00274
00275 if(s==0){
00276 deadcursor.close();
00277 delete Querydead;
00278 transaction.commit();
00279 throw lumi::Exception(std::string("requested run ")+runnumberstr+std::string(" doesn't exist for deadcounts"),"retrieveData","TRGWBM2DB");
00280 return;
00281 }
00282 delete Querydead;
00283 transaction.commit();
00284
00289 transaction.start(true);
00290 coral::ISchema& gtschemaHandle=trgsession->schema(gtschema);
00291 if(!gtschemaHandle.existsView(runtechviewname)){
00292 throw lumi::Exception(std::string("non-existing view ")+runtechviewname,"str2int","TRGWBM2DB");
00293 }
00294 if(!gtschemaHandle.existsView(runalgoviewname)){
00295 throw lumi::Exception(std::string("non-existing view ")+runalgoviewname,"str2int","TRGWBM2DB");
00296 }
00297 if(!gtschemaHandle.existsView(runprescalgoviewname)){
00298 throw lumi::Exception(std::string("non-existing view ")+runprescalgoviewname,"str2int","TRGWBM2DB");
00299 }
00300 if(!gtschemaHandle.existsView(runpresctechviewname)){
00301 throw lumi::Exception(std::string("non-existing view ")+runpresctechviewname,"str2int","TRGWBM2DB");
00302 }
00303
00304
00305
00306 std::map<unsigned int,std::string> triggernamemap;
00307 coral::IQuery* QueryName=gtschemaHandle.newQuery();
00308 QueryName->addToTableList(runalgoviewname);
00309 coral::AttributeList qAlgoNameOutput;
00310 qAlgoNameOutput.extend("algo_index",typeid(unsigned int));
00311 qAlgoNameOutput.extend("alias",typeid(std::string));
00312 QueryName->addToOutputList("algo_index");
00313 QueryName->addToOutputList("alias");
00314 QueryName->setCondition("runnumber =:runnumber",bindVariableList);
00315 QueryName->addToOrderList("algo_index");
00316 QueryName->defineOutput(qAlgoNameOutput);
00317 coral::ICursor& algonamecursor=QueryName->execute();
00318 while( algonamecursor.next() ){
00319 const coral::AttributeList& row = algonamecursor.currentRow();
00320
00321 unsigned int algo_index=row["algo_index"].data<unsigned int>();
00322 std::string algo_name=row["alias"].data<std::string>();
00323 triggernamemap.insert(std::make_pair(algo_index,algo_name));
00324 }
00325 delete QueryName;
00326
00327 transaction.commit();
00328
00329
00330
00331
00332 transaction.start(true);
00333 std::map<unsigned int,std::string> techtriggernamemap;
00334 coral::IQuery* QueryTechName=gtschemaHandle.newQuery();
00335 QueryTechName->addToTableList(runtechviewname);
00336 coral::AttributeList qTechNameOutput;
00337 qTechNameOutput.extend("techtrig_index",typeid(unsigned int));
00338 qTechNameOutput.extend("name",typeid(std::string));
00339 QueryTechName->addToOutputList("techtrig_index");
00340 QueryTechName->addToOutputList("name");
00341 QueryTechName->setCondition("runnumber =:runnumber",bindVariableList);
00342 QueryTechName->addToOrderList("techtrig_index");
00343 QueryTechName->defineOutput(qTechNameOutput);
00344 coral::ICursor& technamecursor=QueryTechName->execute();
00345 while( technamecursor.next() ){
00346 const coral::AttributeList& row = technamecursor.currentRow();
00347
00348 unsigned int tech_index=row["techtrig_index"].data<unsigned int>();
00349 std::string tech_name=row["name"].data<std::string>();
00350 techtriggernamemap.insert(std::make_pair(tech_index,tech_name));
00351 }
00352 delete QueryTechName;
00353 transaction.commit();
00354
00355
00356
00357 transaction.start(true);
00358 coral::IQuery* QueryAlgoPresc=gtschemaHandle.newQuery();
00359 QueryAlgoPresc->addToTableList(runprescalgoviewname);
00360 coral::AttributeList qAlgoPrescOutput;
00361 std::string algoprescBase("PRESCALE_FACTOR_ALGO_");
00362 for(unsigned int bitidx=0;bitidx<lumi::N_TRGALGOBIT;++bitidx){
00363 std::string algopresc=algoprescBase+int2str(bitidx,3);
00364 qAlgoPrescOutput.extend(algopresc,typeid(unsigned int));
00365 }
00366 for(unsigned int bitidx=0;bitidx<lumi::N_TRGALGOBIT;++bitidx){
00367 std::string algopresc=algoprescBase+int2str(bitidx,3);
00368 QueryAlgoPresc->addToOutputList(algopresc);
00369 }
00370 coral::AttributeList PrescbindVariable;
00371 PrescbindVariable.extend("runnumber",typeid(int));
00372 PrescbindVariable.extend("prescaleindex",typeid(int));
00373 PrescbindVariable["runnumber"].data<int>()=runnumber;
00374 PrescbindVariable["prescaleindex"].data<int>()=0;
00375 QueryAlgoPresc->setCondition("runnr =:runnumber AND prescale_index =:prescaleindex",PrescbindVariable);
00376 QueryAlgoPresc->defineOutput(qAlgoPrescOutput);
00377 coral::ICursor& algopresccursor=QueryAlgoPresc->execute();
00378 while( algopresccursor.next() ){
00379 const coral::AttributeList& row = algopresccursor.currentRow();
00380
00381 for(unsigned int bitidx=0;bitidx<128;++bitidx){
00382 std::string algopresc=algoprescBase+int2str(bitidx,3);
00383 algoprescale.push_back(row[algopresc].data<unsigned int>());
00384 }
00385 }
00386 delete QueryAlgoPresc;
00387 transaction.commit();
00388
00389
00390
00391
00392 transaction.start(true);
00393 coral::IQuery* QueryTechPresc=gtschemaHandle.newQuery();
00394 QueryTechPresc->addToTableList(runpresctechviewname);
00395 coral::AttributeList qTechPrescOutput;
00396 std::string techprescBase("PRESCALE_FACTOR_TT_");
00397 for(unsigned int bitidx=0;bitidx<lumi::N_TRGTECHBIT;++bitidx){
00398 std::string techpresc=techprescBase+this->int2str(bitidx,3);
00399 qTechPrescOutput.extend(techpresc,typeid(unsigned int));
00400 }
00401 for(unsigned int bitidx=0;bitidx<lumi::N_TRGTECHBIT;++bitidx){
00402 std::string techpresc=techprescBase+int2str(bitidx,3);
00403 QueryTechPresc->addToOutputList(techpresc);
00404 }
00405 coral::AttributeList TechPrescbindVariable;
00406 TechPrescbindVariable.extend("runnumber",typeid(int));
00407 TechPrescbindVariable.extend("prescaleindex",typeid(int));
00408 TechPrescbindVariable["runnumber"].data<int>()=runnumber;
00409 TechPrescbindVariable["prescaleindex"].data<int>()=0;
00410 QueryTechPresc->setCondition("runnr =:runnumber AND prescale_index =:prescaleindex",TechPrescbindVariable);
00411 QueryTechPresc->defineOutput(qTechPrescOutput);
00412 coral::ICursor& techpresccursor=QueryTechPresc->execute();
00413 while( techpresccursor.next() ){
00414 const coral::AttributeList& row = techpresccursor.currentRow();
00415
00416 for(unsigned int bitidx=0;bitidx<lumi::N_TRGTECHBIT;++bitidx){
00417 std::string techpresc=techprescBase+int2str(bitidx,3);
00418 techprescale.push_back(row[techpresc].data<unsigned int>());
00419 }
00420 }
00421 delete QueryTechPresc;
00422 transaction.commit();
00423 transaction.commit();
00424
00425 delete trgsession;
00426
00427
00428
00429
00430 for(size_t algoidx=0;algoidx<lumi::N_TRGALGOBIT;++algoidx){
00431 std::map<unsigned int,std::string>::iterator pos=triggernamemap.find(algoidx);
00432 if(pos!=triggernamemap.end()){
00433 algonames.push_back(pos->second);
00434 }else{
00435 algonames.push_back("False");
00436 }
00437 }
00438
00439
00440
00441 std::stringstream ss;
00442 for(size_t techidx=0;techidx<lumi::N_TRGTECHBIT;++techidx){
00443 std::map<unsigned int,std::string>::iterator pos=techtriggernamemap.find(techidx);
00444 ss<<techidx;
00445 technames.push_back(ss.str());
00446 ss.str("");
00447 }
00448
00449
00450
00451 if(algonames.size()!=lumi::N_TRGALGOBIT || technames.size()!=lumi::N_TRGTECHBIT){
00452 throw lumi::Exception("wrong number of bits","retrieveData","TRGWBM2DB");
00453 }
00454 if(algoprescale.size()!=lumi::N_TRGALGOBIT || techprescale.size()!=lumi::N_TRGTECHBIT){
00455 throw lumi::Exception("wrong number of prescale","retrieveData","TRGWBM2DB");
00456 }
00457 if(deadtimeresult.size()!=algocount.size() || deadtimeresult.size()!=techcount.size()){
00458 throw lumi::Exception("inconsistent number of LS","retrieveData","TRGWBM2DB");
00459 }
00460
00461
00462
00463 coral::ISessionProxy* lumisession=svc->connect(m_dest,coral::Update);
00464 coral::ITypeConverter& lumitpc=lumisession->typeConverter();
00465 lumitpc.setCppTypeForSqlType("unsigned int","NUMBER(7)");
00466 lumitpc.setCppTypeForSqlType("unsigned int","NUMBER(10)");
00467 lumitpc.setCppTypeForSqlType("unsigned long long","NUMBER(20)");
00468
00469 TriggerDeadCountResult::const_iterator deadIt;
00470 TriggerDeadCountResult::const_iterator deadBeg=deadtimeresult.begin();
00471 TriggerDeadCountResult::const_iterator deadEnd=deadtimeresult.end();
00472
00473 unsigned int totalcmsls=deadtimeresult.size();
00474 std::cout<<"inserting totalcmsls "<<totalcmsls<<std::endl;
00475 std::map< unsigned long long, std::vector<unsigned long long> > idallocationtable;
00476 try{
00477 std::cout<<"\t allocating total ids "<<totalcmsls*lumi::N_TRGBIT<<std::endl;
00478 lumisession->transaction().start(false);
00479 lumi::idDealer idg(lumisession->nominalSchema());
00480 unsigned long long trgID = idg.generateNextIDForTable(LumiNames::trgTableName(),totalcmsls*lumi::N_TRGBIT)-totalcmsls*lumi::N_TRGBIT;
00481 lumisession->transaction().commit();
00482 unsigned int trglscount=0;
00483 for(deadIt=deadBeg;deadIt!=deadEnd;++deadIt,++trglscount){
00484 std::vector<unsigned long long> bitvec;
00485 bitvec.reserve(lumi::N_TRGBIT);
00486 BITCOUNT& algoinbits=algocount[trglscount];
00487 BITCOUNT& techinbits=techcount[trglscount];
00488 BITCOUNT::const_iterator algoBitIt;
00489 BITCOUNT::const_iterator algoBitBeg=algoinbits.begin();
00490 BITCOUNT::const_iterator algoBitEnd=algoinbits.end();
00491 for(algoBitIt=algoBitBeg;algoBitIt!=algoBitEnd;++algoBitIt,++trgID){
00492 bitvec.push_back(trgID);
00493 }
00494 BITCOUNT::const_iterator techBitIt;
00495 BITCOUNT::const_iterator techBitBeg=techinbits.begin();
00496 BITCOUNT::const_iterator techBitEnd=techinbits.end();
00497 for(techBitIt=techBitBeg;techBitIt!=techBitEnd;++techBitIt,++trgID){
00498 bitvec.push_back(trgID);
00499 }
00500 idallocationtable.insert(std::make_pair(trglscount,bitvec));
00501 }
00502 std::cout<<"\t all ids allocated"<<std::endl;
00503 coral::AttributeList trgData;
00504 trgData.extend<unsigned long long>("TRG_ID");
00505 trgData.extend<unsigned int>("RUNNUM");
00506 trgData.extend<unsigned int>("CMSLSNUM");
00507 trgData.extend<unsigned int>("BITNUM");
00508 trgData.extend<std::string>("BITNAME");
00509 trgData.extend<unsigned int>("TRGCOUNT");
00510 trgData.extend<unsigned long long>("DEADTIME");
00511 trgData.extend<unsigned int>("PRESCALE");
00512
00513 unsigned long long& trg_id=trgData["TRG_ID"].data<unsigned long long>();
00514 unsigned int& trgrunnum=trgData["RUNNUM"].data<unsigned int>();
00515 unsigned int& cmslsnum=trgData["CMSLSNUM"].data<unsigned int>();
00516 unsigned int& bitnum=trgData["BITNUM"].data<unsigned int>();
00517 std::string& bitname=trgData["BITNAME"].data<std::string>();
00518 unsigned int& count=trgData["TRGCOUNT"].data<unsigned int>();
00519 unsigned long long& deadtime=trgData["DEADTIME"].data<unsigned long long>();
00520 unsigned int& prescale=trgData["PRESCALE"].data<unsigned int>();
00521
00522 trglscount=0;
00523 coral::IBulkOperation* trgInserter=0;
00524 unsigned int comittedls=0;
00525 for(deadIt=deadBeg;deadIt!=deadEnd;++deadIt,++trglscount ){
00526 unsigned int cmslscount=trglscount+1;
00527 BITCOUNT& algoinbits=algocount[trglscount];
00528 BITCOUNT& techinbits=techcount[trglscount];
00529 unsigned int trgbitcount=0;
00530 BITCOUNT::const_iterator algoBitIt;
00531 BITCOUNT::const_iterator algoBitBeg=algoinbits.begin();
00532 BITCOUNT::const_iterator algoBitEnd=algoinbits.end();
00533 if(!lumisession->transaction().isActive()){
00534 lumisession->transaction().start(false);
00535 coral::ITable& trgtable=lumisession->nominalSchema().tableHandle(LumiNames::trgTableName());
00536 trgInserter=trgtable.dataEditor().bulkInsert(trgData,2048);
00537 }
00538 for(algoBitIt=algoBitBeg;algoBitIt!=algoBitEnd;++algoBitIt,++trgbitcount){
00539 trg_id = idallocationtable[trglscount].at(trgbitcount);
00540 deadtime=*deadIt;
00541 trgrunnum = runnumber;
00542 cmslsnum = cmslscount;
00543 bitnum=trgbitcount;
00544 bitname=algonames[trgbitcount];
00545 count=*algoBitIt;
00546 prescale=algoprescale[trgbitcount];
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559 trgInserter->processNextIteration();
00560
00561 }
00562 BITCOUNT::const_iterator techBitIt;
00563 BITCOUNT::const_iterator techBitBeg=techinbits.begin();
00564 BITCOUNT::const_iterator techBitEnd=techinbits.end();
00565 for(techBitIt=techBitBeg;techBitIt!=techBitEnd;++techBitIt,++trgbitcount){
00566 trg_id = idallocationtable[trglscount].at(trgbitcount);
00567 deadtime=*deadIt;
00568 trgrunnum = runnumber;
00569 cmslsnum = cmslscount;
00570 bitnum=trgbitcount;
00571 bitname=technames[trgbitcount-lumi::N_TRGALGOBIT];
00572 count=*techBitIt;
00573 prescale=techprescale[trgbitcount-lumi::N_TRGALGOBIT];
00574 trgInserter->processNextIteration();
00575
00576
00577
00578
00579
00580
00581
00582
00583
00584
00585
00586 }
00587 trgInserter->flush();
00588 ++comittedls;
00589 if(comittedls==TRGWBM2DB::COMMITLSINTERVAL){
00590 std::cout<<"\t committing in LS chunck "<<comittedls<<std::endl;
00591 delete trgInserter; trgInserter=0;
00592 lumisession->transaction().commit();
00593 comittedls=0;
00594 std::cout<<"\t committed "<<std::endl;
00595 }else if( trglscount==( totalcmsls-1) ){
00596 std::cout<<"\t committing at the end"<<std::endl;
00597 delete trgInserter; trgInserter=0;
00598 lumisession->transaction().commit();
00599 std::cout<<"\t done"<<std::endl;
00600 }
00601 }
00602 }catch( const coral::Exception& er){
00603 lumisession->transaction().rollback();
00604 delete lumisession;
00605 delete svc;
00606 throw er;
00607 }
00608
00609
00610 delete lumisession;
00611 delete svc;
00612 }
00613 const std::string TRGWBM2DB::dataType() const{
00614 return "TRG";
00615 }
00616 const std::string TRGWBM2DB::sourceType() const{
00617 return "DB";
00618 }
00619
00620 std::string TRGWBM2DB::int2str(unsigned int t, unsigned int width){
00621 std::stringstream ss;
00622 ss.width(width);
00623 ss.fill('0');
00624 ss<<t;
00625 return ss.str();
00626 }
00627 unsigned int TRGWBM2DB::str2int(const std::string& s){
00628 std::istringstream myStream(s);
00629 unsigned int i;
00630 if(myStream>>i){
00631 return i;
00632 }else{
00633 throw lumi::Exception(std::string("str2int error"),"str2int","TRGWBM2DB");
00634 }
00635 }
00636 TRGWBM2DB::~TRGWBM2DB(){}
00637 }
00638 #include "RecoLuminosity/LumiProducer/interface/DataPipeFactory.h"
00639 DEFINE_EDM_PLUGIN(lumi::DataPipeFactory,lumi::TRGWBM2DB,"TRGWBM2DB");
00640 #endif