00001 // -*- C++ -*- 00002 // 00003 // Package: CondTools/SiPixel 00004 // Class: PixelPopConCalibSourceHandler 00005 // 00013 // 00014 // Original Author: Michael Eads 00015 // Created: 8 Feb 2008 00016 // $Id: PixelPopConCalibSourceHandler.cc,v 1.1.2.1 2008/09/03 16:33:29 meads Exp $ 00017 // 00018 // 00019 00020 #include "CondTools/SiPixel/interface/PixelPopConCalibSourceHandler.h" 00021 00022 #include <iostream> 00023 #include <sstream> 00024 00025 // DBCommon includes 00026 #include "CondCore/DBCommon/interface/SessionConfiguration.h" 00027 #include "CondCore/DBCommon/interface/Exception.h" 00028 #include "CondCore/DBCommon/interface/Connection.h" 00029 00030 // CORAL includes 00031 #include "RelationalAccess/IView.h" 00032 #include "RelationalAccess/ISessionProxy.h" 00033 #include "RelationalAccess/ISchema.h" 00034 #include "RelationalAccess/ISessionProperties.h" 00035 #include "RelationalAccess/IQuery.h" 00036 #include "RelationalAccess/ICursor.h" 00037 #include "CoralBase/AttributeList.h" 00038 #include "CoralBase/Attribute.h" 00039 00040 #include "CalibFormats/SiPixelObjects/interface/PixelCalibConfiguration.h" 00041 00042 // test poolDBOutput 00043 #include "CondCore/DBOutputService/interface/PoolDBOutputService.h" 00044 #include "FWCore/ServiceRegistry/interface/Service.h" 00045 00046 00047 using namespace std; 00048 00049 // constructor 00050 PixelPopConCalibSourceHandler::PixelPopConCalibSourceHandler(edm::ParameterSet const &pset) { 00051 00052 // try to get a parameter 00053 _connectString = pset.getParameter<string>("connectString"); 00054 //cout << " connectString: " << _connectString << endl; 00055 00056 // get the schema and view name to use from the config file 00057 _viewName = pset.getParameter<string>("viewName"); 00058 _schemaName = pset.getParameter<string>("schemaName"); 00059 00060 // get the key name and/or run number to use 00061 _runNumber = pset.getParameter<int>("runNumber"); 00062 _configKeyName = pset.getParameter<string>("configKeyName"); 00063 00064 // get the "since" IOV parameter 00065 _sinceIOV = pset.getParameter<unsigned int>("sinceIOV"); 00066 00067 } // constructor 00068 00069 // destructor 00070 PixelPopConCalibSourceHandler::~PixelPopConCalibSourceHandler() { 00071 00072 } // destructor 00073 00074 string PixelPopConCalibSourceHandler::id() const { 00075 00076 return string("PixelPopConCalibSourceHandler"); 00077 00078 } // string PixelPopConCalibSourceHandler::id() 00079 00080 00081 // getNewObjects method using coral 00082 void PixelPopConCalibSourceHandler::getNewObjects_coral() { 00083 cout << "I'm sorry, the PixelPopConCalibSourceHandler::getNewObjects_coral() is not currently working." << endl; 00084 cout << "I am not able to build calibration configuration objects from the database" << endl; 00085 return; 00086 00087 // create the empty SiPixelCalibConfiguration object 00088 SiPixelCalibConfiguration* calibConfig = new SiPixelCalibConfiguration(); 00089 00090 // set up the DB session 00091 cond::DBSession* dbsession = new cond::DBSession(); 00092 dbsession->configuration().setAuthenticationMethod(cond::XML); 00093 dbsession->configuration().setMessageLevel(cond::Error); 00094 try{ 00095 dbsession->open(); 00096 }catch(cond::Exception& er){ 00097 std::cerr<< "CoralIface::initialize cond " << er.what()<<std::endl; 00098 throw; 00099 }catch(std::exception& er){ 00100 std::cerr<< "CoralIface::initialize std " << er.what()<<std::endl; 00101 throw; 00102 } 00103 00104 cond::Connection dbconn(_connectString); 00105 dbconn.connect(dbsession); 00106 cond::CoralTransaction& coraldb=dbconn.coralTransaction(); 00107 coraldb.start(true); 00108 00109 // build and execute the query 00110 coral::IQuery* query = coraldb.coralSessionProxy().schema(_schemaName).newQuery(); 00111 query->addToTableList(_viewName); 00112 query->addToOutputList("CONFG_KEY"); 00113 query->addToOutputList("VERSION"); 00114 query->addToOutputList("RUN_TYPE"); 00115 query->addToOutputList("RUN_NUMBER"); 00116 query->addToOutputList("CALIB_OBJ_DATA_FILE"); 00117 query->addToOutputList("CALIB_OBJ_DATA_CLOB"); 00118 00119 // if _runNumber is -1, query by config key name 00120 if (_runNumber == -1) 00121 query->setCondition("CONFG_KEY = '" + _configKeyName + "'", coral::AttributeList()); 00122 else // query by run number 00123 query->setCondition("RUN_NUMBER = " + _runNumber, coral::AttributeList()); 00124 coral::ICursor& cursor = query->execute(); 00125 00126 // parse the response, build the Calib object 00127 bool found_fNtriggers = false; 00128 bool found_fRowPattern = false; 00129 bool found_fColumnPattern = false; 00130 bool found_fVCalValues = false; 00131 bool found_fMode = false; 00132 while ( cursor.next() ) { 00133 cout << "Inside cursor.next() loop" << endl; 00134 //cursor.currentRow().toOutputStream( std::cout ) << std::endl; 00135 coral::AttributeList row = cursor.currentRow(); 00136 00137 string mystring = row["CALIB_OBJ_DATA_CLOB"].data<string>(); 00138 cout << "mystring: " << mystring << endl; 00139 00140 // get fMode 00141 if (!found_fMode) { 00142 calibConfig->setCalibrationMode(row["CALIB_MODE"].data<string>()); 00143 found_fMode = true; 00144 } // if (!found_fMode) 00145 00146 // fill fNTriggers 00147 if (row["PARAMETER"].data<string>() == "Number of Triggers") { 00148 if (found_fNtriggers) { 00149 cout << "Warning: found mulitple entries for fNtriggers!" << endl; 00150 } 00151 int fNtriggers = atoi(row["VALUE"].data<string>().c_str()); 00152 //cout << "Number of triggers: " << fNtriggers << endl; 00153 calibConfig->setNTriggers(static_cast<short>(fNtriggers)); 00154 found_fNtriggers = true; 00155 } // fill fNTriggers 00156 00157 /* 00158 // fill fROCIds 00159 if (row["PARAMETER"].data<string>() == "ROC") { 00160 if (found_fROCIds) { 00161 cout << "Warning: found mulitple entries for fROCIds!" << endl; 00162 } 00163 string rocidlist = row["VALUE"].data<string>(); 00164 // split the string 00165 string buff; 00166 vector<string> ROCIds; 00167 stringstream ss(rocidlist); 00168 while (ss >> buff) { 00169 ROCIds.push_back(buff); 00170 } 00171 calibConfig->setROCIds(ROCIds); 00172 found_fROCIds = true; 00173 } // fill fROCIds 00174 */ 00175 00176 // fill fRowPattern 00177 if (row["PARAMETER"].data<string>() == "RowNums") { 00178 if (found_fRowPattern) { 00179 cout << "Warning: found mulitple entries for fRowPattern!" << endl; 00180 } 00181 string rowlist = row["VALUE"].data<string>(); 00182 // split the string 00183 string buff; 00184 vector<short> rows; 00185 stringstream ss(rowlist); 00186 while (ss >> buff) { 00187 rows.push_back(static_cast<short>(atoi(buff.c_str()))); 00188 } 00189 calibConfig->setRowPattern(rows); 00190 found_fRowPattern = true; 00191 } // fill fRowPattern 00192 00193 // fill fColumnPattern 00194 if (row["PARAMETER"].data<string>() == "ColNums") { 00195 if (found_fColumnPattern) { 00196 cout << "Warning: found mulitple entries for fColumnPattern!" << endl; 00197 } 00198 string collist = row["VALUE"].data<string>(); 00199 // split the string 00200 string buff; 00201 vector<short> cols; 00202 stringstream ss(collist); 00203 while (ss >> buff) { 00204 cols.push_back(static_cast<short>(atoi(buff.c_str()))); 00205 } 00206 calibConfig->setColumnPattern(cols); 00207 found_fColumnPattern = true; 00208 } // fill fColumnPattern 00209 00210 // fill fVCalValues 00211 if (row["CALIB_OBJECT"].data<string>() == "Vcal DAC") { 00212 if (found_fVCalValues) { 00213 cout << "Warning: found mulitple entries for fVCalValues!" << endl; 00214 } 00215 string vcallist = row["VALUE"].data<string>(); 00216 // split the string 00217 string buff; 00218 vector<short> vcals; 00219 stringstream ss(vcallist); 00220 while (ss >> buff) { 00221 vcals.push_back(static_cast<short>(atoi(buff.c_str()))); 00222 } 00223 calibConfig->setVCalValues(vcals); 00224 found_fVCalValues = true; 00225 } // fill fRowPattern 00226 00227 /* 00228 for (coral::AttributeList::iterator it = row.begin(); 00229 it != row.end(); ++it) { 00230 if it->specification().name() == "PARAMETER" 00231 00232 if (it->specification().name() == "RUN_NUMBER") 00233 cout << it->specification().name() << ", " << it->data<long long>() << endl; 00234 else 00235 cout << it->specification().name() << ", " << it->data<string>() << endl; 00236 00237 } // loop over attribute list 00238 */ 00239 } // while (cursor.next()) 00240 00241 // spit out calibConfig object 00242 cout << endl << "** calibConfig: " << endl; 00243 cout << " fNtriggers: " << calibConfig->getNTriggers() << endl; 00244 /* 00245 cout << " fROCIds: "; 00246 vector<string> rocids = calibConfig->getROCIds(); 00247 for (vector<string>::const_iterator it = rocids.begin(); 00248 it != rocids.end(); ++it) 00249 cout << *it << ", "; 00250 cout << endl; 00251 */ 00252 cout << " fRowPattern: "; 00253 vector<short> rowpattern = calibConfig->getRowPattern(); 00254 for (vector<short>::const_iterator it = rowpattern.begin(); 00255 it != rowpattern.end(); ++it) 00256 cout << *it << ", "; 00257 cout << endl; 00258 cout << " fColumnPattern: "; 00259 vector<short> columnpattern = calibConfig->getColumnPattern(); 00260 for (vector<short>::const_iterator it = columnpattern.begin(); 00261 it != columnpattern.end(); ++it) 00262 cout << *it << ", "; 00263 cout << endl; 00264 cout << " fVcalValues: "; 00265 vector<short> vcalvalues = calibConfig->getVCalValues(); 00266 for (vector<short>::const_iterator it = vcalvalues.begin(); 00267 it != vcalvalues.end(); ++it) 00268 cout << *it << ", "; 00269 cout << endl; 00270 cout << " fNmode: " << calibConfig->getCalibrationMode() << endl; 00271 00272 // see what's in the db 00273 //cout << "tagInfo: " << tagInfo().name << ", " << tagInfo().lastInterval.first << endl; 00274 00275 m_to_transfer.push_back(std::make_pair(calibConfig,_sinceIOV)); 00276 00277 00278 delete dbsession; 00279 } // void PixelPopConCalibSourceHandler::getNewObjects_coral() 00280 00281 // getNewObjects method using a text file 00282 void PixelPopConCalibSourceHandler::getNewObjects_file() { 00283 // check to make sure the _connectString begins with "file//" 00284 if (_connectString.find("file://") != 0) { 00285 cout << "Invalid connectString: " << _connectString << endl; 00286 cout << "It should begin with \"file://\"" << endl; 00287 return; 00288 } 00289 // strip the "file://" from the connect string 00290 string inputFilename = _connectString.erase(0, 7); 00291 00292 cout << "PopCon-ing the calibration configuration file located at " << inputFilename << endl; 00293 00294 // use online code to parse the file 00295 pos::PixelCalibConfiguration fancyCalib(inputFilename); 00296 SiPixelCalibConfiguration *calibConfig = new SiPixelCalibConfiguration(fancyCalib); 00297 00298 m_to_transfer.push_back(std::make_pair(calibConfig, _sinceIOV)); 00299 00300 } // void PixelPopConCalibSourceHandler::getNewObjects_file() 00301