CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_6_1_1/src/RecoLuminosity/LumiProducer/src/RevisionDML.cc

Go to the documentation of this file.
00001 #include "RecoLuminosity/LumiProducer/interface/RevisionDML.h"
00002 #include "RelationalAccess/ISchema.h"
00003 #include "RelationalAccess/ITable.h"
00004 #include "RelationalAccess/ITableDataEditor.h"
00005 #include "RelationalAccess/IQuery.h"
00006 #include "RelationalAccess/ICursor.h"
00007 #include "RelationalAccess/SchemaException.h" 
00008 #include "CoralBase/AttributeList.h"
00009 #include "CoralBase/Attribute.h"
00010 #include "CoralBase/AttributeSpecification.h"
00011 #include "CoralBase/TimeStamp.h"
00012 #include "RecoLuminosity/LumiProducer/interface/LumiNames.h"
00013 #include "RecoLuminosity/LumiProducer/interface/idDealer.h"
00014 #include "RecoLuminosity/LumiProducer/interface/Exception.h"
00015 #include <algorithm>
00016 unsigned long long 
00017 lumi::RevisionDML::getEntryInBranchByName(coral::ISchema& schema,
00018                                           const std::string& datatableName,
00019                                           const std::string& entryname,
00020                                           const std::string& branchname){
00021   unsigned long long entry_id=0;
00022   coral::IQuery* qHandle=schema.newQuery();
00023   qHandle->addToTableList( lumi::LumiNames::entryTableName(datatableName),"e");
00024   qHandle->addToTableList( lumi::LumiNames::revisionTableName(),"r");
00025   qHandle->addToOutputList("e.ENTRY_ID","entry_id");
00026 
00027   coral::AttributeList qCondition;
00028   qCondition.extend("entryname",typeid(std::string));
00029   qCondition.extend("branchname",typeid(std::string));
00030   qCondition["entryname"].data<std::string>()=entryname;
00031   qCondition["branchname"].data<std::string>()=branchname;
00032   std::string qConditionStr("r.REVISION_ID=e.REVISION_ID and e.NAME=:entryname AND r.BRANCH_NAME=:branchname");
00033 
00034   coral::AttributeList qResult;
00035   qResult.extend("entry_id",typeid(unsigned long long));
00036   qHandle->defineOutput(qResult);
00037   qHandle->setCondition(qConditionStr,qCondition);
00038   coral::ICursor& cursor=qHandle->execute();
00039   while(cursor.next()){
00040     entry_id=cursor.currentRow()["entry_id"].data<unsigned long long>();
00041   }
00042   delete qHandle;
00043   return entry_id;
00044 }
00045 void 
00046 lumi::RevisionDML::bookNewEntry(coral::ISchema& schema,
00047                                 const std::string& datatableName,
00048                                 lumi::RevisionDML::Entry& entry){
00049   lumi::idDealer idg(schema);
00050   const std::string entrytableName=lumi::LumiNames::entryTableName(datatableName);
00051   entry.revision_id=idg.generateNextIDForTable(lumi::LumiNames::revisionTableName());
00052   entry.data_id=idg.generateNextIDForTable(datatableName);
00053   entry.entry_id=idg.generateNextIDForTable(entrytableName);
00054 }
00055 void 
00056 lumi::RevisionDML::bookNewRevision(coral::ISchema& schema,
00057                                    const std::string& datatableName,
00058                                    lumi::RevisionDML::Entry& revision){
00059   lumi::idDealer idg(schema);
00060   revision.revision_id=idg.generateNextIDForTable(lumi::LumiNames::revisionTableName());
00061   revision.data_id=idg.generateNextIDForTable(datatableName);
00062 }
00063 void 
00064 lumi::RevisionDML::addEntry(coral::ISchema& schema,
00065                             const std::string& datatableName,
00066                             const lumi::RevisionDML::Entry& entry,
00067                             unsigned long long branchid,
00068                             const std::string& branchname ){
00069   coral::AttributeList revdata;
00070   revdata.extend("REVISION_ID",typeid(unsigned long long));
00071   revdata.extend("BRANCH_ID",typeid(unsigned long long));
00072   revdata.extend("BRANCH_NAME",typeid(std::string));
00073   revdata.extend("CTIME",typeid(coral::TimeStamp));
00074   revdata["REVISION_ID"].data<unsigned long long>()=entry.revision_id;
00075   revdata["BRANCH_ID"].data<unsigned long long>()=branchid;
00076   revdata["BRANCH_NAME"].data<std::string>()=branchname;
00077   revdata["CTIME"].data<coral::TimeStamp>()=coral::TimeStamp::now();
00078   const std::string revTableName=lumi::LumiNames::revisionTableName();
00079   schema.tableHandle(revTableName).dataEditor().insertRow(revdata);
00080 
00081   coral::AttributeList entrydata;
00082   entrydata.extend("REVISION_ID",typeid(unsigned long long));
00083   entrydata.extend("ENTRY_ID",typeid(unsigned long long));
00084   entrydata.extend("NAME",typeid(std::string));
00085   entrydata["REVISION_ID"].data<unsigned long long>()=entry.revision_id;
00086   entrydata["ENTRY_ID"].data<unsigned long long>()=entry.entry_id;
00087   entrydata["NAME"].data<std::string>()=entry.entry_name;
00088   const std::string entryTableName=lumi::LumiNames::entryTableName(datatableName);
00089   schema.tableHandle(entryTableName).dataEditor().insertRow(entrydata);
00090   
00091   coral::AttributeList revmapdata;
00092   revmapdata.extend("REVISION_ID",typeid(unsigned long long));
00093   revmapdata.extend("DATA_ID",typeid(unsigned long long));
00094 
00095   revmapdata["REVISION_ID"].data<unsigned long long>()=entry.revision_id;
00096   revmapdata["DATA_ID"].data<unsigned long long>()=entry.data_id;
00097 
00098   const std::string revmapTableName=lumi::LumiNames::revmapTableName(datatableName);
00099   schema.tableHandle(revmapTableName).dataEditor().insertRow(revmapdata);
00100 }
00101 void 
00102 lumi::RevisionDML::addRevision(coral::ISchema& schema,
00103                                const std::string& datatableName,
00104                                const lumi::RevisionDML::Entry& revision,
00105                                unsigned long long branchid,
00106                                std::string& branchname ){
00107   coral::AttributeList revdata;
00108   revdata.extend("REVISION_ID",typeid(unsigned long long));
00109   revdata.extend("BRANCH_ID",typeid(unsigned long long));
00110   revdata.extend("BRANCH_NAME",typeid(std::string));
00111   revdata.extend("CTIME",typeid(coral::TimeStamp));
00112   revdata["REVISION_ID"].data<unsigned long long>()=revision.revision_id;
00113   revdata["BRANCH_ID"].data<unsigned long long>()=branchid;
00114   revdata["BRANCH_NAME"].data<std::string>()=branchname;
00115   revdata["CTIME"].data<coral::TimeStamp>()=coral::TimeStamp::now();
00116   schema.tableHandle(lumi::LumiNames::revisionTableName()).dataEditor().insertRow(revdata);
00117   coral::AttributeList revmapdata;
00118   revmapdata.extend("REVISION_ID",typeid(unsigned long long));
00119   revmapdata.extend("DATA_ID",typeid(unsigned long long));
00120   revmapdata["REVISION_ID"].data<unsigned long long>()=revision.revision_id;
00121   revmapdata["DATA_ID"].data<unsigned long long>()=revision.data_id;
00122   const std::string revmapTableName=lumi::LumiNames::revmapTableName(datatableName);
00123   schema.tableHandle(revmapTableName).dataEditor().insertRow(revmapdata);
00124 }
00125 void 
00126 lumi::RevisionDML::insertLumiRunData(coral::ISchema& schema,
00127                                      const lumi::RevisionDML::LumiEntry& lumientry){
00128   coral::AttributeList lumirundata;
00129   lumirundata.extend("DATA_ID",typeid(unsigned long long));
00130   lumirundata.extend("ENTRY_ID",typeid(unsigned long long));
00131   lumirundata.extend("ENTRY_NAME",typeid(std::string));
00132   lumirundata.extend("RUNNUM",typeid(unsigned int));
00133   lumirundata.extend("SOURCE",typeid(std::string));
00134   lumirundata.extend("NOMINALEGEV",typeid(float));
00135   lumirundata.extend("NCOLLIDINGBUNCHES",typeid(unsigned int));
00136   lumirundata["DATA_ID"].data<unsigned long long>()=lumientry.data_id;
00137   lumirundata["ENTRY_ID"].data<unsigned long long>()=lumientry.entry_id;
00138   lumirundata["ENTRY_NAME"].data<std::string>()=lumientry.entry_name;
00139   lumirundata["RUNNUM"].data<unsigned int>()=lumientry.runnumber;
00140   lumirundata["SOURCE"].data<std::string>()=lumientry.source;
00141   lumirundata["NOMINALEGEV"].data<float>()=lumientry.bgev;
00142   lumirundata["NCOLLIDINGBUNCHES"].data<unsigned int>()=lumientry.ncollidingbunches;
00143   const std::string lumidataTableName=lumi::LumiNames::lumidataTableName();
00144   schema.tableHandle(lumidataTableName).dataEditor().insertRow(lumirundata);
00145 }
00146 void 
00147 lumi::RevisionDML::insertTrgRunData(coral::ISchema& schema,
00148                                     const lumi::RevisionDML::TrgEntry& trgentry){
00149   coral::AttributeList trgrundata;
00150   trgrundata.extend("DATA_ID",typeid(unsigned long long));
00151   trgrundata.extend("ENTRY_ID",typeid(unsigned long long));
00152   trgrundata.extend("ENTRY_NAME",typeid(std::string));
00153   trgrundata.extend("RUNNUM",typeid(unsigned int));
00154   trgrundata.extend("SOURCE",typeid(std::string));
00155   trgrundata.extend("BITZERONAME",typeid(std::string));
00156   trgrundata.extend("BITNAMECLOB",typeid(std::string));
00157   trgrundata["DATA_ID"].data<unsigned long long>()=trgentry.data_id;
00158   trgrundata["ENTRY_ID"].data<unsigned long long>()=trgentry.entry_id;
00159   trgrundata["ENTRY_NAME"].data<std::string>()=trgentry.entry_name;
00160   trgrundata["RUNNUM"].data<unsigned int>()=trgentry.runnumber;
00161   trgrundata["SOURCE"].data<std::string>()=trgentry.source;
00162   trgrundata["BITZERONAME"].data<std::string>()=trgentry.bitzeroname;
00163   trgrundata["BITNAMECLOB"].data<std::string>()=trgentry.bitnames;
00164   const std::string trgdataTableName=lumi::LumiNames::trgdataTableName();
00165   schema.tableHandle(trgdataTableName).dataEditor().insertRow(trgrundata);
00166 }
00167 void 
00168 lumi::RevisionDML::insertHltRunData(coral::ISchema& schema,
00169                                     const lumi::RevisionDML::HltEntry& hltentry){
00170   coral::AttributeList hltrundata;
00171   hltrundata.extend("DATA_ID",typeid(unsigned long long));
00172   hltrundata.extend("ENTRY_ID",typeid(unsigned long long));
00173   hltrundata.extend("ENTRY_NAME",typeid(std::string));
00174   hltrundata.extend("RUNNUM",typeid(unsigned int));
00175   hltrundata.extend("SOURCE",typeid(std::string));
00176   hltrundata.extend("NPATH",typeid(unsigned int));
00177   hltrundata.extend("PATHNAMECLOB",typeid(std::string));
00178   hltrundata["DATA_ID"].data<unsigned long long>()=hltentry.data_id;
00179   hltrundata["ENTRY_ID"].data<unsigned long long>()=hltentry.entry_id;
00180   hltrundata["ENTRY_NAME"].data<std::string>()=hltentry.entry_name;
00181   hltrundata["RUNNUM"].data<unsigned int>()=hltentry.runnumber;
00182   hltrundata["SOURCE"].data<std::string>()=hltentry.source;
00183   hltrundata["NPATH"].data<unsigned int>()=hltentry.npath;
00184   hltrundata["PATHNAMECLOB"].data<std::string>()=hltentry.pathnames;
00185   const std::string hltdataTableName=lumi::LumiNames::hltdataTableName();
00186   schema.tableHandle(hltdataTableName).dataEditor().insertRow(hltrundata);
00187 }
00188 
00189 unsigned long long
00190 lumi::RevisionDML::currentHFDataTagId(coral::ISchema& schema){
00191   unsigned long long currentdatatagid=0;
00192   std::vector<unsigned long long> alltagids;
00193   coral::IQuery* qHandle=schema.newQuery();
00194   qHandle->addToTableList( lumi::LumiNames::tagsTableName());
00195   qHandle->addToOutputList("TAGID");
00196   coral::AttributeList qResult;
00197   qResult.extend("TAGID",typeid(unsigned long long));
00198   qHandle->defineOutput(qResult);
00199   coral::ICursor& cursor=qHandle->execute();
00200   while(cursor.next()){
00201     if(!cursor.currentRow()["TAGID"].isNull()){
00202       alltagids.push_back(cursor.currentRow()["TAGID"].data<unsigned long long>());
00203     }
00204   }
00205   delete qHandle;
00206   if(alltagids.size()>0){
00207     std::vector<unsigned long long>::iterator currentdatatagidIt=std::max_element(alltagids.begin(),alltagids.end());
00208     currentdatatagid=*currentdatatagidIt;
00209   }
00210   return currentdatatagid;
00211 }
00212 
00213 unsigned long long
00214 lumi::RevisionDML::HFDataTagIdByName(coral::ISchema& schema,
00215                                      const std::string& datatagname){
00216   unsigned long long datatagid=0;
00217   coral::IQuery* qHandle=schema.newQuery();
00218   qHandle->addToTableList( lumi::LumiNames::tagsTableName());
00219   const std::string conditionStr("TAGNAME=:tagname");
00220   coral::AttributeList condition;
00221   condition.extend("tagname",typeid(std::string));
00222   condition["tagname"].data<std::string>()=datatagname;
00223   qHandle->addToOutputList("TAGID");
00224   coral::AttributeList qResult;
00225   qResult.extend("TAGID",typeid(unsigned long long));
00226   qHandle->setCondition(conditionStr,condition);
00227   qHandle->defineOutput(qResult);
00228   coral::ICursor& cursor=qHandle->execute();
00229   while(cursor.next()){
00230     if(!cursor.currentRow()["TAGID"].isNull()){
00231       datatagid=cursor.currentRow()["TAGID"].data<unsigned long long>();
00232     }
00233   }
00234   delete qHandle;
00235   return datatagid;
00236 }
00237 
00238 unsigned long long
00239 lumi::RevisionDML::addRunToCurrentHFDataTag(coral::ISchema& schema,
00240                                             unsigned int runnum,
00241                                             unsigned long long lumiid,
00242                                             unsigned long long trgid,
00243                                             unsigned long long hltid,
00244                                             const std::string& patchcomment)
00245 {
00246   unsigned long long currenttagid=currentHFDataTagId(schema);  
00247   coral::AttributeList tagrundata;
00248   tagrundata.extend("TAGID",typeid(unsigned long long));
00249   tagrundata.extend("RUNNUM",typeid(unsigned int));
00250   tagrundata.extend("LUMIDATAID",typeid(unsigned long long));
00251   tagrundata.extend("TRGDATAID",typeid(unsigned long long));
00252   tagrundata.extend("HLTDATAID",typeid(unsigned long long));
00253   tagrundata.extend("CREATIONTIME",typeid(coral::TimeStamp));
00254   tagrundata.extend("COMMENT",typeid(std::string));
00255   tagrundata["TAGID"].data<unsigned long long>()=currenttagid;
00256   tagrundata["RUNNUM"].data<unsigned int>()=runnum;
00257   tagrundata["LUMIDATAID"].data<unsigned long long>()=lumiid;
00258   tagrundata["TRGDATAID"].data<unsigned long long>()=trgid;
00259   tagrundata["HLTDATAID"].data<unsigned long long>()=hltid;
00260   tagrundata["CREATIONTIME"].data<coral::TimeStamp>()=coral::TimeStamp::now();
00261   tagrundata["COMMENT"].data<std::string>()=patchcomment;
00262   const std::string tagrunTableName=lumi::LumiNames::tagRunsTableName();
00263   try{
00264     schema.tableHandle(lumi::LumiNames::tagRunsTableName()).dataEditor().insertRow(tagrundata);
00265   }catch(const coral::DuplicateEntryInUniqueKeyException& er){
00266     throw lumi::duplicateRunInDataTagException("","addRunToCurrentHFDataTag","RevisionDML");
00267   }
00268   return currenttagid;
00269 }
00270 
00271 lumi::RevisionDML::DataID
00272 lumi::RevisionDML::dataIDForRun(coral::ISchema& schema,
00273                           unsigned int runnum,
00274                           unsigned long long tagid){
00275   lumi::RevisionDML::DataID result;
00276   coral::IQuery* qHandle=schema.newQuery();
00277   qHandle->addToTableList( lumi::LumiNames::tagRunsTableName());
00278   qHandle->addToOutputList("LUMIDATAID");
00279   qHandle->addToOutputList("TRGDATAID");
00280   qHandle->addToOutputList("HLTDATAID");
00281   coral::AttributeList qResult;
00282   qResult.extend("LUMIDATAID",typeid(unsigned long long));
00283   qResult.extend("TRGDATAID",typeid(unsigned long long));
00284   qResult.extend("HLTDATAID",typeid(unsigned long long));
00285   qHandle->defineOutput(qResult);
00286   coral::AttributeList qCondition;
00287   qCondition.extend("tagid",typeid(unsigned long long));
00288   qCondition.extend("runnum",typeid(unsigned int));
00289   qCondition["tagid"].data<unsigned long long>()=tagid;
00290   qCondition["runnum"].data<unsigned int>()=runnum;
00291   std::string qConditionStr("TAGID<=:tagid AND RUNNUM=:runnum");
00292   qHandle->setCondition(qConditionStr,qCondition);
00293   coral::ICursor& cursor=qHandle->execute();
00294   unsigned long long minlumid=0;
00295   unsigned long long mintrgid=0;
00296   unsigned long long minhltid=0;
00297   while(cursor.next()){
00298     if(!cursor.currentRow()["LUMIDATAID"].isNull()){
00299       unsigned long long lumiid=cursor.currentRow()["LUMIDATAID"].data<unsigned long long>();      
00300       if(lumiid>minlumid){
00301         result.lumi_id=lumiid;
00302       }
00303       
00304     }
00305     if(!cursor.currentRow()["TRGDATAID"].isNull()){
00306       unsigned long long trgid=cursor.currentRow()["TRGDATAID"].data<unsigned long long>();      
00307       if(trgid>mintrgid){
00308         result.trg_id=trgid;
00309       }
00310     }
00311     if(!cursor.currentRow()["HLTDATAID"].isNull()){
00312       unsigned long long hltid=cursor.currentRow()["HLTDATAID"].data<unsigned long long>();  
00313       if(hltid>minhltid){
00314         result.hlt_id=hltid;
00315       }
00316     }
00317   }
00318   delete qHandle;
00319   return result;
00320 }