CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
RunInfoRead.cc
Go to the documentation of this file.
1 //#include "CondFormats/Common/interface/TimeConversions.h"
2 //#include "CondFormats/Common/interface/Time.h"
7 #include "RelationalAccess/ISessionProxy.h"
8 #include "RelationalAccess/ITransaction.h"
9 #include "RelationalAccess/ISchema.h"
10 #include "RelationalAccess/ITable.h"
11 #include "RelationalAccess/IQuery.h"
12 #include "RelationalAccess/ICursor.h"
13 #include "CoralBase/AttributeList.h"
14 #include "CoralBase/Attribute.h"
15 #include "CoralBase/AttributeSpecification.h"
16 #include "CoralBase/TimeStamp.h"
17 #include <algorithm>
18 #include <iostream>
19 #include <iterator>
20 #include <memory>
21 #include <stdexcept>
22 #include <vector>
23 #include <math.h>
24 
25 
26 
27 namespace {
28  std::string dot(".");
29  std::string quote("\"");
30  std::string bNOTb(" NOT ");
31  std::string squoted( const std::string& s ){
32  return quote+s+quote;
33  }
34  //now strings for the tables and columns to be queried
35  std::string sParameterTable( "RUNSESSION_PARAMETER" );
36  std::string sDateTable( "RUNSESSION_DATE" );
37  std::string sStringTable( "RUNSESSION_STRING" );
38  std::string sIdParameterColumn( "ID" );
39  std::string sRunNumberParameterColumn( "RUNNUMBER" );
40  std::string sNameParameterColumn( "NAME" );
41  std::string sRunSessionParameterIdDataColumn( "RUNSESSION_PARAMETER_ID" );
42  std::string sValueDataColumn( "VALUE" );
43  std::string sDCSMagnetTable( "CMSFWMAGNET" );
44  std::string sDCSMagnetCurrentColumn( "CURRENT" );
45  std::string sDCSMagnetChangeDateColumn( "CHANGE_DATE" );
46 }
47 
49  , const edm::ParameterSet& connectionPset ):
50  m_connectionString( connectionString )
51  ,m_connectionPset( connectionPset ) {}
52 
54 
55 RunInfo
56 RunInfoRead::readData( const std::string & runinfo_schema
57  , const std::string & dcsenv_schema
58  , const int r_number ) {
59  RunInfo temp_sum;
60  //for B currents...
61  bool Bnotchanged = 0;
62  //from TimeConversions.h
63  const boost::posix_time::ptime time0 = boost::posix_time::from_time_t(0);
64  //if cursor is null setting null values
65  temp_sum.m_run = r_number;
66  edm::LogInfo( "RunInfoReader" ) << "[RunInfoRead::" << __func__ << "]: Initialising Connection Pool" << std::endl;
68  connection.setParameters( m_connectionPset );
69  connection.configure();
70  edm::LogInfo( "RunInfoReader" ) << "[RunInfoRead::" << __func__ << "]: Initialising read-only session to " << m_connectionString << std::endl;
71  boost::shared_ptr<coral::ISessionProxy> session = connection.createCoralSession( m_connectionString, false );
72  try{
73  session->transaction().start( true );
74  coral::ISchema& schema = session->schema( runinfo_schema );
75  edm::LogInfo( "RunInfoReader" ) << "[RunInfoRead::" << __func__ << "]: Accessing schema " << runinfo_schema << std::endl;
76  //new query to obtain the start_time
77  std::unique_ptr<coral::IQuery> query( schema.newQuery() );
78  query->addToTableList( sParameterTable );
79  query->addToTableList( sDateTable );
80  query->addToOutputList( sValueDataColumn );
81  coral::AttributeList runTimeDataOutput;
82  runTimeDataOutput.extend<coral::TimeStamp>( sValueDataColumn );
83  query->defineOutput( runTimeDataOutput );
84  std::string runStartWhereClause( sRunNumberParameterColumn + std::string( "=:n_run AND " )
85  + sNameParameterColumn + std::string( "='CMS.LVL0:START_TIME_T' AND " )
86  + sIdParameterColumn + std::string( "=" ) + sRunSessionParameterIdDataColumn );
87  coral::AttributeList runNumberBindVariableList;
88  runNumberBindVariableList.extend<int>( "n_run" );
89  runNumberBindVariableList[ "n_run" ].data<int>() = r_number;
90  query->setCondition( runStartWhereClause, runNumberBindVariableList );
91  coral::ICursor& runStartCursor = query->execute();
92  coral::TimeStamp start; //now all times are UTC!
93  if( runStartCursor.next() ) {
94  std::ostringstream osstartdebug;
95  runStartCursor.currentRow().toOutputStream( osstartdebug );
96  LogDebug( "RunInfoReader" ) << osstartdebug.str() << std::endl;
97  const coral::AttributeList& row = runStartCursor.currentRow();
98  start = row[ sValueDataColumn ].data<coral::TimeStamp>();
99  LogDebug( "RunInfoReader" ) << "UTC start time extracted == "
100  << "-->year " << start.year()
101  << "-- month " << start.month()
102  << "-- day " << start.day()
103  << "-- hour " << start.hour()
104  << "-- minute " << start.minute()
105  << "-- second " << start.second()
106  << "-- nanosecond " << start.nanosecond()
107  << std::endl;
108  boost::posix_time::ptime start_ptime = start.time();
109  boost::posix_time::time_duration startTimeFromEpoch = start_ptime - time0;
110  temp_sum.m_start_time_str = boost::posix_time::to_iso_extended_string(start_ptime);
111  temp_sum.m_start_time_ll = startTimeFromEpoch.total_microseconds();
112  std::ostringstream osstart;
113  osstart << "[RunInfoRead::" << __func__ << "]: Timestamp for start of run " << r_number << std::endl
114  << "Posix time: " << start_ptime << std::endl
115  << "ISO string: " << temp_sum.m_start_time_str << std::endl
116  << "Microsecond since Epoch (UTC): " << temp_sum.m_start_time_ll;
117  edm::LogInfo( "RunInfoReader" ) << osstart.str() << std::endl;
118  }
119  else {
120  edm::LogInfo( "RunInfoReader" ) << "[RunInfoRead::" << __func__ << "]: run " << r_number
121  << " start time not found." << std::endl;
122  temp_sum.m_start_time_str = "null";
123  temp_sum.m_start_time_ll = -1;
124  }
125 
126  //new query to obtain the stop_time
127  query.reset( schema.newQuery() );
128  query->addToTableList( sParameterTable );
129  query->addToTableList( sDateTable );
130  query->addToOutputList( sValueDataColumn );
131  query->defineOutput( runTimeDataOutput );
132  std::string runStopWhereClause( sRunNumberParameterColumn + std::string( "=:n_run AND " )
133  + sNameParameterColumn + std::string( "='CMS.LVL0:STOP_TIME_T' AND " )
134  + sIdParameterColumn + std::string( "=" ) + sRunSessionParameterIdDataColumn );
135  query->setCondition( runStopWhereClause, runNumberBindVariableList );
136  coral::ICursor& runStopCursor = query->execute();
137  coral::TimeStamp stop;
138  if( runStopCursor.next() ) {
139  std::ostringstream osstopdebug;
140  runStopCursor.currentRow().toOutputStream( osstopdebug );
141  LogDebug( "RunInfoReader" ) << osstopdebug.str() << std::endl;
142  const coral::AttributeList& row = runStopCursor.currentRow();
143  stop = row[ sValueDataColumn ].data<coral::TimeStamp>();
144  LogDebug( "RunInfoReader" ) << "stop time extracted == "
145  << "-->year " << stop.year()
146  << "-- month " << stop.month()
147  << "-- day " << stop.day()
148  << "-- hour " << stop.hour()
149  << "-- minute " << stop.minute()
150  << "-- second " << stop.second()
151  << "-- nanosecond " << stop.nanosecond()
152  << std::endl;
153  boost::posix_time::ptime stop_ptime = stop.time();
154  boost::posix_time::time_duration stopTimeFromEpoch = stop_ptime - time0;
155  temp_sum.m_stop_time_str = boost::posix_time::to_iso_extended_string(stop_ptime);
156  temp_sum.m_stop_time_ll = stopTimeFromEpoch.total_microseconds();
157  std::ostringstream osstop;
158  osstop << "[RunInfoRead::" << __func__ << "]: Timestamp for stop of run " << r_number << std::endl
159  << "Posix time: " << stop_ptime << std::endl
160  << "ISO string: " << temp_sum.m_stop_time_str << std::endl
161  << "Microsecond since Epoch (UTC): " << temp_sum.m_stop_time_ll;
162  edm::LogInfo( "RunInfoReader" ) << osstop.str() << std::endl;
163  }
164  else {
165  edm::LogInfo( "RunInfoReader" ) << "[RunInfoRead::" << __func__ << "]: run " << r_number
166  << " stop time not found." << std::endl;
167  temp_sum.m_stop_time_str = "null";
168  temp_sum.m_stop_time_ll = -1;
169  }
170 
171  //new query for obtaining the list of FEDs included in the run
172  query.reset( schema.newQuery() );
173  query->addToTableList( sParameterTable );
174  query->addToTableList( sStringTable );
175  query->addToOutputList( sValueDataColumn );
176  query->defineOutputType( sValueDataColumn, "string" );
177  std::string fedWhereClause( sRunNumberParameterColumn + std::string( "=:n_run AND " )
178  + sNameParameterColumn + std::string( "='CMS.LVL0:FED_ENABLE_MASK' AND " )
179  + sIdParameterColumn + std::string( "=" ) + sRunSessionParameterIdDataColumn );
180  query->setCondition( fedWhereClause, runNumberBindVariableList );
181  coral::ICursor& fedCursor = query->execute();
182  std::string fed;
183  if ( fedCursor.next() ) {
184  std::ostringstream osfeddebug;
185  fedCursor.currentRow().toOutputStream( osfeddebug );
186  LogDebug( "RunInfoReader" ) << osfeddebug.str() << std::endl;
187  const coral::AttributeList& row = fedCursor.currentRow();
188  fed = row[ sValueDataColumn ].data<std::string>();
189  }
190  else {
191  edm::LogInfo( "RunInfoReader" ) << "[RunInfoRead::" << __func__ << "]: run " << r_number
192  << "has no FED included." << std::endl;
193  fed="null";
194  }
195  std::replace(fed.begin(), fed.end(), '%', ' ');
196  std::stringstream stream(fed);
197  for(;;) {
198  std::string word;
199  if ( !(stream >> word) ){break;}
200  std::replace(word.begin(), word.end(), '&', ' ');
201  std::stringstream ss(word);
202  int fedNumber;
203  int val;
204  ss >> fedNumber >> val;
205  LogDebug( "RunInfoReader" ) << "FED: " << fedNumber << " --> value: " << val << std::endl;
206  //val bit 0 represents the status of the SLINK, but 5 and 7 means the SLINK/TTS is ON but NA or BROKEN (see mail of alex....)
207  if( (val & 0001) == 1 && (val != 5) && (val != 7) )
208  temp_sum.m_fed_in.push_back(fedNumber);
209  }
210  std::ostringstream osfed;
211  osfed << "[RunInfoRead::" << __func__ << "]: feds included in run " << r_number << ": ";
212  std::copy(temp_sum.m_fed_in.begin(), temp_sum.m_fed_in.end(), std::ostream_iterator<int>(osfed, ", "));
213  edm::LogInfo( "RunInfoReader" ) << osfed.str() << std::endl;
214 
215  //we connect now to the DCS schema in order to retrieve the magnet current
216  edm::LogInfo( "RunInfoReader" ) << "[RunInfoRead::" << __func__ << "]: Accessing schema " << dcsenv_schema << std::endl;
217  coral::ISchema& schema2 = session->schema( dcsenv_schema );
218  query.reset( schema2.tableHandle( sDCSMagnetTable ).newQuery() );
219  query->addToOutputList( squoted( sDCSMagnetCurrentColumn ), sDCSMagnetCurrentColumn );
220  query->addToOutputList( sDCSMagnetChangeDateColumn );
221  coral::AttributeList magnetDataOutput;
222  magnetDataOutput.extend<float>( sDCSMagnetCurrentColumn );
223  magnetDataOutput.extend<coral::TimeStamp>( sDCSMagnetChangeDateColumn );
224  query->defineOutput( magnetDataOutput );
225  //condition
226  coral::AttributeList magnetCurrentBindVariableList;
227  float last_current = -1;
228  magnetCurrentBindVariableList.extend<coral::TimeStamp>( "runstart_time" );
229  magnetCurrentBindVariableList[ "runstart_time" ].data<coral::TimeStamp>() = start;
230  std::string magnetCurrentWhereClause;
231  if(temp_sum.m_stop_time_str != "null") {
232  edm::LogInfo( "RunInfoReader" ) << "[RunInfoRead::" << __func__ << "]: Accessing the magnet currents measured during run " << r_number
233  << " between " << temp_sum.m_start_time_str
234  << " and " << temp_sum.m_stop_time_str << std::endl;
235  magnetCurrentBindVariableList.extend<coral::TimeStamp>( "runstop_time" );
236  magnetCurrentBindVariableList[ "runstop_time" ].data<coral::TimeStamp>() = stop;
237  magnetCurrentWhereClause = std::string( "NOT " ) + squoted(sDCSMagnetCurrentColumn) + std::string( " IS NULL AND " )
238  + sDCSMagnetChangeDateColumn + std::string( ">:runstart_time AND " )
239  + sDCSMagnetChangeDateColumn + std::string( "<:runstop_time" );
240  } else {
241  edm::LogInfo( "RunInfoReader" ) << "[RunInfoRead::" << __func__ << "]: Accessing the magnet currents measured before run " << r_number
242  << "start time " << temp_sum.m_start_time_str << std::endl;
243  magnetCurrentWhereClause = std::string( "NOT " ) + squoted(sDCSMagnetCurrentColumn) + std::string( " IS NULL AND " )
244  + sDCSMagnetChangeDateColumn + std::string( "<:runstart_time" );
245  }
246  query->setCondition( magnetCurrentWhereClause, magnetCurrentBindVariableList );
247  query->addToOrderList( sDCSMagnetChangeDateColumn + std::string( " DESC" ) );
248  query->limitReturnedRows( 10000 );
249  coral::ICursor& magnetCurrentCursor = query->execute();
250  coral::TimeStamp lastCurrentDate;
251  std::string last_date;
252  std::vector<double> time_curr;
253  if ( !magnetCurrentCursor.next() ) {
254  // we should deal with stable currents... so the query is returning no value and we should take the last modified current value...
255  edm::LogInfo( "RunInfoReader" ) << "[RunInfoRead::" << __func__ << "]: The magnet current did not change during run " << r_number
256  << ". Looking for the most recent change before " << temp_sum.m_stop_time_str << std::endl;
257  Bnotchanged = 1;
258  std::unique_ptr<coral::IQuery> lastValueQuery( schema2.tableHandle(sDCSMagnetTable).newQuery() );
259  lastValueQuery->addToOutputList( squoted(sDCSMagnetCurrentColumn), sDCSMagnetCurrentColumn );
260  lastValueQuery->defineOutputType( sDCSMagnetCurrentColumn, "float" );
261  coral::AttributeList lastValueBindVariableList;
262  lastValueBindVariableList.extend<coral::TimeStamp>( "runstop_time" );
263  lastValueBindVariableList[ "runstop_time" ].data<coral::TimeStamp>() = stop;
264  std::string lastValueWhereClause( std::string( " NOT " ) + squoted(sDCSMagnetCurrentColumn) + std::string( " IS NULL AND " )
265  + sDCSMagnetChangeDateColumn + std::string( " <:runstop_time" ) );
266  lastValueQuery->setCondition( lastValueWhereClause, lastValueBindVariableList );
267  lastValueQuery->addToOrderList( sDCSMagnetChangeDateColumn + std::string( " DESC" ) );
268  coral::ICursor& lastValueCursor = lastValueQuery->execute();
269  if( lastValueCursor.next() ) {
270  std::ostringstream oslastvaluedebug;
271  lastValueCursor.currentRow().toOutputStream( oslastvaluedebug );
272  LogDebug( "RunInfoReader" ) << oslastvaluedebug.str() << std::endl;
273  const coral::AttributeList& row = lastValueCursor.currentRow();
274  last_current = row[sDCSMagnetCurrentColumn].data<float>();
275  edm::LogInfo( "RunInfoReader" ) << "[RunInfoRead::" << __func__ << "]: Magnet current of previos run(s), not changed during run " << r_number
276  << ": " << last_current << std::endl;
277  }
278  temp_sum.m_avg_current = last_current;
279  temp_sum.m_min_current = last_current;
280  temp_sum.m_max_current = last_current;
281  temp_sum.m_stop_current = last_current;
282  temp_sum.m_start_current = last_current;
283  }
284  while( magnetCurrentCursor.next() ) {
285  std::ostringstream oscurrentdebug;
286  magnetCurrentCursor.currentRow().toOutputStream( oscurrentdebug );
287  LogDebug( "RunInfoReader" ) << oscurrentdebug.str() << std::endl;
288  const coral::AttributeList& row = magnetCurrentCursor.currentRow();
289  lastCurrentDate = row[sDCSMagnetChangeDateColumn].data<coral::TimeStamp>();
290  temp_sum.m_current.push_back( row[sDCSMagnetCurrentColumn].data<float>() );
291  if(temp_sum.m_stop_time_str == "null") break;
292  LogDebug( "RunInfoReader" ) << " last current time extracted == "
293  << "-->year " << lastCurrentDate.year()
294  << "-- month " << lastCurrentDate.month()
295  << "-- day " << lastCurrentDate.day()
296  << "-- hour " << lastCurrentDate.hour()
297  << "-- minute " << lastCurrentDate.minute()
298  << "-- second " << lastCurrentDate.second()
299  << "-- nanosecond " << lastCurrentDate.nanosecond()
300  << std::endl;
301  boost::posix_time::ptime lastCurrentDate_ptime = lastCurrentDate.time();
302  boost::posix_time::time_duration lastCurrentDateTimeFromEpoch = lastCurrentDate_ptime - time0;
303  last_date = boost::posix_time::to_iso_extended_string(lastCurrentDate_ptime);
304  long long last_date_ll = lastCurrentDateTimeFromEpoch.total_microseconds();
305  time_curr.push_back(last_date_ll);
306  std::ostringstream ostrans;
307  ostrans << "[RunInfoRead::" << __func__ << "]: Transition of the magnet current " << std::endl
308  << "New value: " << row[sDCSMagnetCurrentColumn].data<float>() << std::endl
309  << "Posix time for the transition timestamp: " << lastCurrentDate_ptime << std::endl
310  << "ISO string for the transition timestamp: " << last_date << std::endl
311  << "Microseconds since Epoch (UTC) for the transition timestamp: " << last_date_ll;
312  edm::LogInfo( "RunInfoReader" ) << ostrans.str() << std::endl;
313  }
314 
315  size_t csize = temp_sum.m_current.size();
316  size_t tsize = time_curr.size();
317  edm::LogInfo( "RunInfoReader" ) << "[RunInfoRead::" << __func__ << "]: size of time: " << tsize
318  << ", size of currents: " << csize << std::endl;
319  if(csize != tsize) {
320  edm::LogWarning( "RunInfoReader" ) << "[RunInfoRead::" << __func__ << "]: current and time not filled correctly." << std::endl;
321  }
322  if(tsize > 1) {
323  temp_sum.m_run_intervall_micros = time_curr.front() - time_curr.back();
324  } else {
325  temp_sum.m_run_intervall_micros = 0;
326  }
327  edm::LogInfo( "RunInfoReader" ) << "[RunInfoRead::" << __func__ << "]: Duration in microseconds of the magnet ramp during run " << r_number
328  << ": " << temp_sum.m_run_intervall_micros << std::endl;
329 
330  double wi = 0;
331  double sumwixi = 0;
332  double sumwi = 0;
333  float min = -1;
334  float max = -1;
335 
336  if(csize != 0) {
337  min = temp_sum.m_current.front();
338  max = temp_sum.m_current.front();
339  for(size_t i = 0; i < csize; ++i) {
340  if( (tsize > 1) && ( i < csize - 1 ) ) {
341  wi = (time_curr[i] - time_curr[i+1]);
342  temp_sum.m_times_of_currents.push_back(wi);
343  sumwixi += wi * temp_sum.m_current[i] ;
344  sumwi += wi;
345  }
346  min = std::min(min, temp_sum.m_current[i]);
347  max = std::max(max, temp_sum.m_current[i]);
348  }
349  std::ostringstream oswi;
350  oswi << "[RunInfoRead::" << __func__ << "]: Duration of current values in run " << r_number << ": ";
351  std::copy(temp_sum.m_times_of_currents.begin(), temp_sum.m_times_of_currents.end(), std::ostream_iterator<float>(oswi, ", "));
352  edm::LogInfo( "RunInfoReader" ) << oswi.str() << std::endl;
353  temp_sum.m_start_current = temp_sum.m_current.back();
354  LogDebug( "RunInfoReader" ) << "start current: " << temp_sum.m_start_current << std::endl;
355  temp_sum.m_stop_current = temp_sum.m_current.front();
356  LogDebug( "RunInfoReader" ) << "stop current: " << temp_sum.m_stop_current << std::endl;
357  if (tsize>1) {
358  temp_sum.m_avg_current=sumwixi/sumwi;
359  } else {
360  temp_sum.m_avg_current= temp_sum.m_start_current;
361  }
362  LogDebug( "RunInfoReader" ) << "average current: " << temp_sum.m_avg_current << std::endl;
363  temp_sum.m_max_current= max;
364  LogDebug( "RunInfoReader" ) << "maximum current: " << temp_sum.m_max_current << std::endl;
365  temp_sum.m_min_current= min;
366  LogDebug( "RunInfoReader" ) << "minimum current: " << temp_sum.m_min_current << std::endl;
367  } else {
368  if (!Bnotchanged) {
369  edm::LogWarning( "RunInfoReader" ) << "Inserting fake values for magnet current." << std::endl;
370  temp_sum.m_avg_current = -1;
371  temp_sum.m_min_current = -1;
372  temp_sum.m_max_current = -1;
373  temp_sum.m_stop_current = -1;
374  temp_sum.m_start_current = -1;
375  }
376  }
377  std::ostringstream oscurr;
378  oscurr << "[RunInfoRead::" << __func__ << "]: Values of currents for run " << r_number << std::endl;
379  oscurr << "Average current (A): " << temp_sum.m_avg_current << std::endl;
380  oscurr << "Minimum current (A): " << temp_sum.m_min_current << std::endl;
381  oscurr << "Maximum current (A): " << temp_sum.m_max_current << std::endl;
382  oscurr << "Current at run stop (A): " << temp_sum.m_stop_current << std::endl;
383  oscurr << "Current at run start (A): " << temp_sum.m_start_current;
384  edm::LogInfo( "RunInfoReader" ) << oscurr.str() << std::endl;
385 
386  session->transaction().commit();
387  }
388  catch (const std::exception& e) {
389  throw cms::Exception( "RunInfoReader" ) << "[RunInfoRead::" << __func__ << "]: "
390  << "Unable to create a RunInfo payload. Original Exception:\n"
391  << e.what() << std::endl;
392  }
393 
394  return temp_sum;
395 }
#define LogDebug(id)
int i
Definition: DBlmapReader.cc:9
tuple start
Check for commandline option errors.
Definition: dqm_diff.py:58
const boost::posix_time::ptime time0
tuple schema
Definition: dataDML.py:2334
boost::shared_ptr< coral::ISessionProxy > createCoralSession(const std::string &connectionString, bool writeCapable=false)
RunInfoRead(const std::string &connectionString, const edm::ParameterSet &connectionPset)
Definition: RunInfoRead.cc:48
RunInfo readData(const std::string &runinfo_schema, const std::string &dcsenv_schema, const int r_number)
Definition: RunInfoRead.cc:56
void setParameters(const edm::ParameterSet &connectionPset)
std::vector< int > m_fed_in
Definition: RunInfo.h:26
std::string m_start_time_str
Definition: RunInfo.h:23
T min(T a, T b)
Definition: MathUtil.h:58
std::vector< float > m_current
Definition: RunInfo.h:33
float m_stop_current
Definition: RunInfo.h:28
string connectionString
Definition: autoCondHLT.py:4
long long m_stop_time_ll
Definition: RunInfo.h:24
edm::ParameterSet m_connectionPset
Definition: RunInfoRead.h:16
float m_min_current
Definition: RunInfo.h:31
float m_avg_current
Definition: RunInfo.h:29
float m_run_intervall_micros
Definition: RunInfo.h:32
float m_max_current
Definition: RunInfo.h:30
T dot(const Basic3DVector &v) const
Scalar product, or &quot;dot&quot; product, with a vector of same type.
float m_start_current
Definition: RunInfo.h:27
std::string m_stop_time_str
Definition: RunInfo.h:25
tuple query
Definition: o2o.py:269
session
Definition: models.py:201
int m_run
Definition: RunInfo.h:21
std::string m_connectionString
Definition: RunInfoRead.h:15
std::vector< float > m_times_of_currents
Definition: RunInfo.h:34
long long m_start_time_ll
Definition: RunInfo.h:22