Go to the documentation of this file.00001
00002
00003 #include "CondTools/RunInfo/interface/RunInfoRead.h"
00004 #include "RelationalAccess/ISession.h"
00005 #include "RelationalAccess/ITransaction.h"
00006 #include "RelationalAccess/ISchema.h"
00007 #include "RelationalAccess/ITable.h"
00008 #include "RelationalAccess/ITableDataEditor.h"
00009 #include "RelationalAccess/TableDescription.h"
00010 #include "RelationalAccess/IQuery.h"
00011 #include "RelationalAccess/ICursor.h"
00012 #include "CoralBase/AttributeList.h"
00013 #include "CoralBase/Attribute.h"
00014 #include "CoralBase/AttributeSpecification.h"
00015 #include "CoralBase/TimeStamp.h"
00016 #include <algorithm>
00017 #include <iostream>
00018 #include <iterator>
00019 #include <stdexcept>
00020 #include <vector>
00021 #include <math.h>
00022
00023 RunInfoRead::RunInfoRead(const std::string& connectionString,
00024 const std::string& user,
00025 const std::string& pass):
00026 TestBase(),
00027 m_connectionString( connectionString ),
00028 m_user( user ),
00029 m_pass( pass ) {
00030 m_tableToRead="";
00031 m_columnToRead="";
00032 }
00033
00034 RunInfoRead::~RunInfoRead() {}
00035
00036 void RunInfoRead::run() {}
00037
00038 RunInfo
00039 RunInfoRead::readData(const std::string & table,
00040 const std::string &column, const int r_number) {
00041 m_tableToRead = table;
00042 m_columnToRead= column;
00043 RunInfo sum;
00044 RunInfo temp_sum;
00045
00046
00047 bool Bnotchanged = 0;
00048
00049 const boost::posix_time::ptime time0 =
00050 boost::posix_time::from_time_t(0);
00051
00052 temp_sum.m_run = r_number;
00053 std::cout << "entering readData" << std::endl;
00054 coral::ISession* session = this->connect( m_connectionString,
00055 m_user, m_pass );
00056 try{
00057 session->transaction().start();
00058 std::cout << "starting session " << std::endl;
00059 coral::ISchema& schema = session->schema("CMS_RUNINFO");
00060 std::cout << " accessing schema " << std::endl;
00061 std::cout << " trying to handle table :: " << m_tableToRead << std::endl;
00062 std::string m_columnToRead_id = "ID";
00063 long long id_start = 0;
00064
00065 coral::IQuery* queryI = schema.tableHandle(m_tableToRead).newQuery();
00066
00067 queryI->addToOutputList(m_tableToRead + "." + m_columnToRead_id, m_columnToRead_id);
00068
00069 coral::AttributeList conditionData;
00070 conditionData.extend<int>( "n_run" );
00071 conditionData[0].data<int>() = r_number;
00072 std::string condition1 = m_tableToRead + ".runnumber=:n_run AND " + m_tableToRead + ".name='CMS.LVL0:START_TIME_T'";
00073 queryI->setCondition(condition1, conditionData);
00074 coral::ICursor& cursorI = queryI->execute();
00075 if( cursorI.next() ) {
00076
00077 const coral::AttributeList& row = cursorI.currentRow();
00078 id_start = row[m_columnToRead_id].data<long long>();
00079 }
00080 else {
00081 id_start = -1;
00082 }
00083
00084 delete queryI;
00085
00086
00087 std::string m_tableToRead_date = "RUNSESSION_DATE";
00088 std::string m_columnToRead_val = "VALUE";
00089
00090 coral::IQuery* queryII = schema.tableHandle(m_tableToRead_date).newQuery();
00091
00092 queryII->addToOutputList(m_tableToRead_date + "." + m_columnToRead_val, m_columnToRead_val);
00093
00094 coral::AttributeList conditionData2;
00095 conditionData2.extend<long long>( "n_id" );
00096 conditionData2[0].data<long long>() = id_start;
00097 std::string condition2 = m_tableToRead_date + ".runsession_parameter_id=:n_id";
00098 queryII->setCondition(condition2, conditionData2);
00099 coral::ICursor& cursorII = queryII->execute();
00100 coral::TimeStamp start;
00101 if( cursorII.next() ) {
00102
00103 const coral::AttributeList& row = cursorII.currentRow();
00104 start = row[m_columnToRead_val].data<coral::TimeStamp>();
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116 boost::posix_time::ptime start_ptime = start.time();
00117 std::cout << "Posix time for run start: "<< start_ptime << std::endl;
00118 boost::posix_time::time_duration startTimeFromEpoch = start_ptime - time0;
00119 temp_sum.m_start_time_str = boost::posix_time::to_iso_extended_string(start_ptime);
00120 temp_sum.m_start_time_ll = startTimeFromEpoch.total_microseconds();
00121 std::cout << "start time string extracted == " << temp_sum.m_start_time_str << std::endl;
00122 std::cout << "microsecond since Epoch (UTC) : " << temp_sum.m_start_time_ll << std::endl;
00123 }
00124 else {
00125 temp_sum.m_start_time_str = "null";
00126 temp_sum.m_start_time_ll = -1;
00127 }
00128 delete queryII;
00129
00130
00131 coral::IQuery* queryIII = schema.tableHandle(m_tableToRead).newQuery();
00132
00133 queryIII->addToOutputList(m_tableToRead + "." + m_columnToRead_id, m_columnToRead_id);
00134
00135 std::string condition3 = m_tableToRead + ".runnumber=:n_run AND " + m_tableToRead + ".name='CMS.LVL0:STOP_TIME_T'";
00136 queryIII->setCondition(condition3, conditionData);
00137 coral::ICursor& cursorIII = queryIII->execute();
00138 long long id_stop = 0;
00139 if( cursorIII.next() ) {
00140
00141 const coral::AttributeList& row = cursorIII.currentRow();
00142 id_stop = row[m_columnToRead_id].data<long long>();
00143 }
00144 else {
00145 id_stop = -1;
00146 }
00147
00148 delete queryIII;
00149
00150
00151 coral::IQuery* queryIV = schema.tableHandle(m_tableToRead_date).newQuery();
00152
00153 queryIV->addToOutputList(m_tableToRead_date + "." + m_columnToRead_val, m_columnToRead_val);
00154
00155 coral::AttributeList conditionData4;
00156 conditionData4.extend<long long>( "n_id" );
00157 conditionData4[0].data<long long>() = id_stop;
00158 std::string condition4 = m_tableToRead_date + ".runsession_parameter_id=:n_id";
00159 queryIV->setCondition(condition4, conditionData4);
00160 coral::ICursor& cursorIV = queryIV->execute();
00161 coral::TimeStamp stop;
00162 if( cursorIV.next() ) {
00163
00164 const coral::AttributeList& row = cursorIV.currentRow();
00165 stop = row[m_columnToRead_val].data<coral::TimeStamp>();
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177 boost::posix_time::ptime stop_ptime = stop.time();
00178 std::cout << "Posix time for run stop: "<< stop_ptime << std::endl;
00179 boost::posix_time::time_duration stopTimeFromEpoch = stop_ptime - time0;
00180 temp_sum.m_stop_time_str = boost::posix_time::to_iso_extended_string(stop_ptime);
00181 temp_sum.m_stop_time_ll = stopTimeFromEpoch.total_microseconds();
00182 std::cout << "stop time string extracted == " << temp_sum.m_stop_time_str << std::endl;
00183 std::cout << "microsecond since Epoch (UTC) : " << temp_sum.m_stop_time_ll << std::endl;
00184 }
00185 else {
00186 temp_sum.m_stop_time_str = "null";
00187 temp_sum.m_stop_time_ll = -1;
00188 }
00189 delete queryIV;
00190
00191 std::string m_tableToRead_fed = "RUNSESSION_STRING";
00192 coral::IQuery* queryV = schema.newQuery();
00193 queryV->addToTableList(m_tableToRead);
00194 queryV->addToTableList(m_tableToRead_fed);
00195 queryV->addToOutputList(m_tableToRead_fed + "." + m_columnToRead_val, m_columnToRead_val);
00196
00197
00198 std::string condition5 = m_tableToRead + ".RUNNUMBER=:n_run AND " + m_tableToRead + ".NAME='CMS.LVL0:FED_ENABLE_MASK' AND RUNSESSION_PARAMETER.ID = RUNSESSION_STRING.RUNSESSION_PARAMETER_ID";
00199
00200 queryV->setCondition(condition5, conditionData);
00201 coral::ICursor& cursorV = queryV->execute();
00202 std::string fed;
00203 if ( cursorV.next() ) {
00204
00205 const coral::AttributeList& row = cursorV.currentRow();
00206 fed = row[m_columnToRead_val].data<std::string>();
00207 }
00208 else {
00209 fed="null";
00210 }
00211
00212 delete queryV;
00213
00214 std::replace(fed.begin(), fed.end(), '%', ' ');
00215 std::stringstream stream(fed);
00216 for(;;) {
00217 std::string word;
00218 if ( !(stream >> word) ){break;}
00219 std::replace(word.begin(), word.end(), '&', ' ');
00220 std::stringstream ss(word);
00221 int fedNumber;
00222 int val;
00223 ss >> fedNumber >> val;
00224
00225
00226 if( (val & 0001) == 1 && (val != 5) && (val != 7) )
00227 temp_sum.m_fed_in.push_back(fedNumber);
00228 }
00229 std::cout << "feds in run:--> ";
00230 std::copy(temp_sum.m_fed_in.begin(), temp_sum.m_fed_in.end(), std::ostream_iterator<int>(std::cout, ", "));
00231 std::cout << std::endl;
00232
00233
00234
00235
00236
00237
00238 coral::ISchema& schema2 = session->schema("CMS_DCS_ENV_PVSS_COND");
00239 std::string m_tableToRead_cur= "CMSFWMAGNET";
00240 std::string m_columnToRead_cur= "CURRENT";
00241 std::string m_columnToRead_date= "CHANGE_DATE";
00242 coral::IQuery* queryVI = schema2.tableHandle(m_tableToRead_cur).newQuery();
00243 queryVI->addToOutputList(m_tableToRead_cur + "." + m_columnToRead_cur, m_columnToRead_cur);
00244 queryVI->addToOutputList(m_tableToRead_cur + "." + m_columnToRead_date, m_columnToRead_date);
00245
00246 coral::AttributeList conditionData6;
00247 float last_current = -1;
00248 if(temp_sum.m_stop_time_str != "null") {
00249 conditionData6.extend<coral::TimeStamp>( "runstart_time" );
00250 conditionData6.extend<coral::TimeStamp>( "runstop_time" );
00251 conditionData6["runstart_time"].data<coral::TimeStamp>() = start;
00252 conditionData6["runstop_time"].data<coral::TimeStamp>() = stop;
00253 std::string conditionVI = " NOT " + m_tableToRead_cur + "." + m_columnToRead_cur + " IS NULL AND "
00254 + m_tableToRead_cur + "." + m_columnToRead_date + ">:runstart_time AND "
00255 + m_tableToRead_cur + "." + m_columnToRead_date + "<:runstop_time" ;
00256 queryVI->setCondition(conditionVI, conditionData6);
00257 queryVI->addToOrderList(m_tableToRead_cur + "." + m_columnToRead_date + " DESC");
00258 } else {
00259 std::cout << "run stop null" << std::endl;
00260 conditionData6.extend<coral::TimeStamp>( "runstart_time" );
00261 conditionData6["runstart_time"].data<coral::TimeStamp>() = start;
00262 std::string conditionVI = " NOT " + m_tableToRead_cur + "." + m_columnToRead_cur + " IS NULL AND "
00263 + m_tableToRead_cur + "." + m_columnToRead_date + "<:runstart_time" ;
00264 queryVI->setCondition(conditionVI, conditionData6);
00265 queryVI->addToOrderList(m_tableToRead_cur + "." + m_columnToRead_date + " DESC");
00266 }
00267 queryVI->limitReturnedRows(10000);
00268 coral::ICursor& cursorVI = queryVI->execute();
00269 coral::TimeStamp lastCurrentDate;
00270 std::string last_date;
00271 std::vector<double> time_curr;
00272 if ( !cursorVI.next() ) {
00273
00274 Bnotchanged = 1;
00275 coral::AttributeList conditionData6bis;
00276 conditionData6bis.extend<coral::TimeStamp>( "runstop_time" );
00277 conditionData6bis["runstop_time"].data<coral::TimeStamp>() = stop;
00278 std::string conditionVIbis = " NOT " + m_tableToRead_cur + "." + m_columnToRead_cur + " IS NULL AND "
00279 + m_tableToRead_cur + "." + m_columnToRead_date + " <:runstop_time" ;
00280 coral::IQuery* queryVIbis = schema2.tableHandle(m_tableToRead_cur).newQuery();
00281 queryVIbis->addToOutputList(m_tableToRead_cur + "." + m_columnToRead_cur, m_columnToRead_cur);
00282 queryVIbis->setCondition(conditionVIbis, conditionData6bis);
00283 queryVIbis->addToOrderList(m_tableToRead_cur + "." + m_columnToRead_date + " DESC");
00284 coral::ICursor& cursorVIbis= queryVIbis->execute();
00285 if( cursorVIbis.next() ) {
00286
00287 const coral::AttributeList& row = cursorVIbis.currentRow();
00288 last_current = row[m_columnToRead_cur].data<float>();
00289 std::cout << "previos run(s) current, not changed in this run... " << last_current << std::endl;
00290 }
00291 temp_sum.m_avg_current = last_current;
00292 temp_sum.m_min_current = last_current;
00293 temp_sum.m_max_current = last_current;
00294 temp_sum.m_stop_current = last_current;
00295 temp_sum.m_start_current = last_current;
00296 }
00297 while( cursorVI.next() ) {
00298
00299 const coral::AttributeList& row = cursorVI.currentRow();
00300 lastCurrentDate = row[m_columnToRead_date].data<coral::TimeStamp>();
00301 temp_sum.m_current.push_back( row[m_columnToRead_cur].data<float>() );
00302 if(temp_sum.m_stop_time_str == "null") break;
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314 boost::posix_time::ptime lastCurrentDate_ptime = lastCurrentDate.time();
00315 std::cout << "Posix time for last current time: " << lastCurrentDate_ptime << std::endl;
00316 boost::posix_time::time_duration lastCurrentDateTimeFromEpoch = lastCurrentDate_ptime - time0;
00317 last_date = boost::posix_time::to_iso_extended_string(lastCurrentDate_ptime);
00318 std::cout << "last current time extracted == " << last_date << std::endl;
00319 long long last_date_ll = lastCurrentDateTimeFromEpoch.total_microseconds();
00320 time_curr.push_back(last_date_ll);
00321 }
00322 delete queryVI;
00323
00324 size_t csize = temp_sum.m_current.size();
00325 std::cout << "size of currents " << csize << std::endl;
00326 size_t tsize = time_curr.size();
00327 std::cout << "size of time " << tsize << std::endl;
00328 if(csize != tsize) {
00329 std::cout<< "current and time not filled correctly" << std::endl;
00330 }
00331 if(tsize > 1) {
00332 temp_sum.m_run_intervall_micros = time_curr.front() - time_curr.back();
00333 } else {
00334 temp_sum.m_run_intervall_micros = 0;
00335 }
00336 std::cout << "change current during run interval in microseconds " << temp_sum.m_run_intervall_micros << std::endl;
00337
00338 double wi = 0;
00339
00340 double sumwixi = 0;
00341 double sumwi = 0;
00342 float min = -1;
00343 float max = -1;
00344
00345 if(csize != 0) {
00346 min = temp_sum.m_current.front();
00347 max = temp_sum.m_current.front();
00348 for(size_t i = 0; i < csize; ++i) {
00349 std::cout << "--> " << temp_sum.m_current[i] << std::endl;
00350 if( (tsize > 1) && ( i < csize - 1 ) ) {
00351 wi = (time_curr[i] - time_curr[i+1]) ;
00352 temp_sum.m_times_of_currents.push_back(wi);
00353
00354 sumwixi += wi * temp_sum.m_current[i] ;
00355 sumwi += wi;
00356 }
00357 min = std::min(min, temp_sum.m_current[i]);
00358 max = std::max(max, temp_sum.m_current[i]);
00359 }
00360
00361 for (size_t i = 0; i < temp_sum.m_times_of_currents.size(); ++i){
00362 std::cout << "wi " << temp_sum.m_times_of_currents[i] << std::endl;
00363 }
00364 temp_sum.m_start_current = temp_sum.m_current.back();
00365 std::cout << "--> " << "start cur " << temp_sum.m_start_current << std::endl;
00366 temp_sum.m_stop_current = temp_sum.m_current.front();
00367 std::cout<< "--> " << "stop cur " << temp_sum.m_stop_current << std::endl;
00368 if (tsize>1) {
00369 temp_sum.m_avg_current=sumwixi/sumwi;
00370 } else {
00371 temp_sum.m_avg_current= temp_sum.m_start_current;
00372 }
00373 std::cout<< "--> " << "avg cur " << temp_sum.m_avg_current << std::endl;
00374 temp_sum.m_max_current= max;
00375 std::cout<< "--> " << "max cur " << temp_sum.m_max_current << std::endl;
00376 temp_sum.m_min_current= min;
00377 std::cout<< "--> " << "min cur " << temp_sum.m_min_current << std::endl;
00378 } else {
00379 if (!Bnotchanged) {
00380 temp_sum.m_avg_current = -1;
00381 temp_sum.m_min_current = -1;
00382 temp_sum.m_max_current = -1;
00383 temp_sum.m_stop_current = -1;
00384 temp_sum.m_start_current = -1;
00385 }
00386 }
00387
00388 std::cout << "temp_sum.m_avg_current " << temp_sum.m_avg_current << std::endl;
00389 std::cout << "temp_sum.m_min_current " << temp_sum.m_min_current << std::endl;
00390 std::cout << "temp_sum.m_max_current " << temp_sum.m_max_current << std::endl;
00391 std::cout << "temp_sum.m_stop_current " << temp_sum.m_stop_current << std::endl;
00392 std::cout << "temp_sum.m_start_current " << temp_sum.m_start_current << std::endl;
00393
00394 session->transaction().commit();
00395 }
00396 catch (const std::exception& e) {
00397 std::cout << "Exception: " << e.what() << std::endl;
00398 }
00399 delete session;
00400
00401 sum= temp_sum;
00402 return sum;
00403 }