Jpp  16.0.0-rc.1
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Functions
JDataMonitor.cc File Reference

Auxiliary program to plot data from data base. More...

#include <string>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include "TROOT.h"
#include "TFile.h"
#include "TH1D.h"
#include "TTimeStamp.h"
#include "JDB/JDB.hh"
#include "JDB/JSelector.hh"
#include "JDB/JSelectorSupportkit.hh"
#include "JDB/JRunQuality.hh"
#include "JDB/JRuns.hh"
#include "JDB/JDBToolkit.hh"
#include "JDB/JDBSupportkit.hh"
#include "JDB/JGITTags.hh"
#include "JLang/JVectorize.hh"
#include "JLang/JLangToolkit.hh"
#include "JTools/JRange.hh"
#include "JROOT/JRootPrinter.hh"
#include "JROOT/JRootToolkit.hh"
#include "JROOT/JMathSupportkit.hh"
#include "JROOT/JManager.hh"
#include "JGizmo/JGizmoToolkit.hh"
#include "Jeep/JParser.hh"
#include "Jeep/JMessage.hh"

Go to the source code of this file.

Functions

std::istream & operator>> (std::istream &in, TTimeStamp &object)
 Read time stamp from input stream. More...
 
std::ostream & operator>> (std::ostream &out, const TTimeStamp &object)
 Write time stamp to output stream. More...
 
int main (int argc, char **argv)
 

Detailed Description

Auxiliary program to plot data from data base.

Author
mdejong

Definition in file JDataMonitor.cc.

Function Documentation

std::istream& operator>> ( std::istream &  in,
TTimeStamp &  object 
)
inline

Read time stamp from input stream.

Format is YYYY-MM-DD HH:MM:SS"

Parameters
ininput stream
objecttime stamp
Returns
input stream

Definition at line 46 of file JDataMonitor.cc.

47 {
48  using namespace std;
49  using namespace JPP;
50 
51  string buffer;
52 
53  if (in >> buffer) {
54 
55  UInt_t year;
56  UInt_t month;
57  UInt_t day;
58 
59  istringstream is;
60 
61  is.str(replace(buffer, '-', ' '));
62 
63  if (is >> year >> month >> day) {
64 
65  UInt_t hour = 0;
66  UInt_t min = 0;
67  UInt_t sec = 0;
68 
69  if (in >> buffer) {
70 
71  is.clear();
72  is.str(replace(buffer, ':', ' '));
73 
74  if (is >> hour >> min >> sec) {
75 
76  object = TTimeStamp(year, month, day, hour, min, sec);
77 
78  return in;
79  }
80  }
81  }
82  }
83 
84  in.setstate(ios::failbit);
85 
86  return in;
87 }
TString replace(const TString &target, const TRegexp &regexp, const T &replacement)
Replace regular expression in input by given replacement.
Definition: JPrintResult.cc:63
is
Definition: JDAQCHSM.chsm:167
then fatal Wrong number of arguments fi set_variable DETECTOR $argv[1] set_variable INPUT_FILE $argv[2] eval JPrintDetector a $DETECTOR O IDENTIFIER eval JPrintDetector a $DETECTOR O SUMMARY source JAcoustics sh $DETECTOR_ID CHECK_EXIT_CODE typeset A TRIPODS get_tripods $WORKDIR tripod txt TRIPODS for EMITTER in
Definition: JCanberra.sh:42
std::ostream& operator>> ( std::ostream &  out,
const TTimeStamp &  object 
)
inline

Write time stamp to output stream.

Parameters
outoutput stream
objecttime stamp
Returns
output stream

Definition at line 97 of file JDataMonitor.cc.

98 {
99  return out << object.AsString();
100 }
int main ( int  argc,
char **  argv 
)

Definition at line 109 of file JDataMonitor.cc.

110 {
111  using namespace std;
112  using namespace JPP;
113 
114  typedef JRange<int> JRange_t;
115 
116  JServer server;
117  string usr;
118  string pwd;
119  string cookie;
120  string outputFile;
121  string detid;
122  JRange_t runs;
123  vector<string> source;
124  JRange<TTimeStamp> UTC;
125  double Tmin_s;
126  int debug;
127 
128  try {
129 
130  JParser<> zap("Example program to plot quality data from data base.");
131 
132  zap['s'] = make_field(server) = getServernames();
133  zap['u'] = make_field(usr) = "";
134  zap['!'] = make_field(pwd) = "";
135  zap['C'] = make_field(cookie) = "";
136  zap['o'] = make_field(outputFile) = "monitor.root";
137  zap['D'] = make_field(detid, "detector identifier");
138  zap['R'] = make_field(runs, "run range") = JRange_t(1, JRange_t::getMaximum());
139  zap['S'] = make_field(source, "GIT versions") = getGITTags(TRegexp("v[0-9]*\\.[0-9]*\\.[0-9]*$"), JGITTags_t::key_type("2019-04-12"));
140  zap['U'] = make_field(UTC, "UTC time range" ) = JRange<TTimeStamp>();
141  zap['T'] = make_field(Tmin_s, "minimal run duration [s]") = 60;
142  zap['d'] = make_field(debug) = 1;
143 
144  zap(argc, argv);
145  }
146  catch(const exception &error) {
147  FATAL(error.what() << endl);
148  }
149 
150 
151  vector<JRuns> data;
153  vector<JRunQuality> buffer;
154 
155  try {
156 
157  JDB::reset(usr, pwd, cookie);
158 
159  const int ID = getDetector<int>(detid);
160 
161  // runs
162 
163  try {
164 
165  NOTICE("Extracting run information from database... " << flush);
166 
167  ResultSet& rs = getResultSet(getTable<JRuns>(), getSelector<JRuns>(ID));
168 
169  for (JRuns parameters; rs >> parameters; ) {
170 
171  parameters.DETID = ID;
172 
173  if (UTC(parameters.getRunStartTime())) {
174  data.push_back(parameters);
175  }
176  }
177 
178  rs.Close();
179 
180  NOTICE("OK" << endl);
181  }
182  catch(const exception& error) {}
183 
184  // data quality
185 
186  if (is_integer(detid)) {
187  detid = getDetector(to_value<int>(detid));
188  }
189 
190  for (vector<string>::const_iterator git = source.begin(); git != source.end(); ++git) {
191 
192  typedef map<string, string> data_type;
193  typedef map<int, data_type> map_type;
194 
195  map_type zmap;
196 
197  JSelector selector = getSelector<JRunSummaryNumbers>(detid, runs.getLowerLimit(), runs.getUpperLimit());
198 
199  selector.add(&JRunSummaryNumbers::SOURCE_NAME, *git);
200 
201  try {
202 
203  NOTICE("Extracting run summmary information with source " << *git << " from database... " << flush);
204 
205  ResultSet& rs = getResultSet(getTable<JRunSummaryNumbers>(), selector);
206 
207  for (JRunSummaryNumbers parameters; rs >> parameters; ) {
208  zmap[parameters.RUN].insert(make_pair(parameters.PARAMETER_NAME, parameters.DATA_VALUE));
209  }
210 
211  rs.Close();
212 
213  NOTICE("OK" << endl);
214  }
215  catch(const exception& error) { NOTICE(endl); }
216 
217  for (map_type::const_iterator run = zmap.begin(); run != zmap.end(); ++run) {
218 
219  JRunQuality quality;
220 
221  quality.GIT = *git;
222  quality.detector = ID;
223  quality.run = run->first;
224 
225  for (data_type::const_iterator p = run->second.begin(); p != run->second.end(); ++p) {
226  quality.put(p->first, p->second);
227  }
228 
229  qaqc.insert(JRun_t(ID, quality.run));
230 
231  if (UTC(TTimeStamp(quality.UTCMin_s, 0)) &&
232  UTC(TTimeStamp(quality.UTCMax_s, 0))) {
233 
234  vector<JRunQuality>::iterator p = lower_bound(buffer.begin(), buffer.end(), quality);
235 
236  if (p == buffer.end() || p->run != quality.run) {
237  buffer.insert(p, quality);
238  }
239  }
240  }
241  }
242  }
243  catch(const exception& error) {
244  FATAL(error.what() << endl);
245  }
246 
247  if (buffer.empty()) {
248  FATAL("No valid QA/QC data for detector " << detid << endl);
249  }
250 
251 
252  // bins
253 
255 
256  for (vector<JRunQuality>::const_iterator quality = buffer.begin(); quality != buffer.end(); ++quality) {
257  X.push_back(quality->UTCMin_s);
258  X.push_back(quality->UTCMax_s);
259  }
260 
261  sort(X.begin(), X.end());
262 
263  struct Xmin {
264  Xmin(double xmin) :
265  xmin(xmin)
266  {}
267 
268  bool operator()(const double x1, const double x2)
269  {
270  return x2 - x1 <= xmin;
271  }
272 
273  double xmin;
274  };
275 
276  X.push_back(data.rbegin()->getRunStartTime()); // start of last run
277 
278  X.erase(unique(X.begin(), X.end(), Xmin(Tmin_s)), X.end());
279 
280  TH1D h0("livetime_s", NULL, X.size() - 1, X.data());
281  TH1D h1("QAQC", NULL, X.size() - 1, X.data());
282 
283  for (vector<JRuns>::const_iterator i = data.begin(); i != data.end(); ++i) {
284 
285  const JRun_t run(i->DETID,i->RUN);
286 
287  if (debug >= debug_t) {
288 
289  cout << "Run "
290  << setw(8) << i->RUN << ' '
291  << TTimeStamp((time_t) i->UNIXSTARTTIME/1000).AsString("c") << ' ';
292 
293  vector<JRunQuality>::const_iterator quality = lower_bound(buffer.begin(), buffer.end(), run);
294 
295  if (quality != buffer.end() && quality->run == i->RUN) {
296  cout << "[" << TTimeStamp((time_t) quality->UTCMin_s).AsString("c") << "," << TTimeStamp((time_t) quality->UTCMax_s).AsString("c") << "]";
297  } else {
298  cout << (qaqc.count(run) == 0 ? "missing" : "invalid") << " QA/QC data";
299  }
300 
301  cout << endl;
302  }
303 
304  double W = 1.0;
305 
306  if (! binary_search(buffer.begin(), buffer.end(), run)) {
307  W = (qaqc.count(run) == 0 ? -1.0 : 0.0);
308  }
309 
310  h1.Fill(i->getRunStartTime() + Tmin_s, W);
311  }
312 
313  JManager<string, TH1D> H1(new TH1D("H[%]", NULL, X.size() - 1, X.data()));
314  JManager<string, TH1D> R1(new TH1D("R[%]", NULL, X.size() - 1, X.data()));
315 
316  for (vector<JRunQuality>::const_iterator quality = buffer.begin(); quality != buffer.end(); ++quality) {
317 
318  const double x = 0.5 * (quality->UTCMin_s + quality->UTCMax_s);
319 
320  h0.Fill(x, 100.0 * quality->livetime_s / (quality->UTCMax_s - quality->UTCMin_s));
321 
322  H1["JDAQEvent"] -> Fill(x, quality->JDAQEvent);
323  H1["JTrigger3DShower"] -> Fill(x, quality->JTrigger3DShower);
324  H1["JTrigger3DMuon"] -> Fill(x, quality->JTrigger3DMuon);
325  H1["JTriggerMXShower"] -> Fill(x, quality->JTriggerMXShower);
326 
327  if (quality->livetime_s > 0.0) {
328  R1["JDAQEvent"] -> Fill(x, quality->JDAQEvent / quality->livetime_s);
329  R1["JTrigger3DShower"] -> Fill(x, quality->JTrigger3DShower / quality->livetime_s);
330  R1["JTrigger3DMuon"] -> Fill(x, quality->JTrigger3DMuon / quality->livetime_s);
331  R1["JTriggerMXShower"] -> Fill(x, quality->JTriggerMXShower / quality->livetime_s);
332  }
333  }
334 
335 
336  Double_t W[2] = { 0.0 };
337 
338  W[0] = *X.rbegin() - *X.begin();
339 
340  for (vector<JRunQuality>::const_iterator quality = buffer.begin(); quality != buffer.end(); ++quality) {
341  W[1] += quality->livetime_s;
342  }
343 
344  NOTICE("Average data taking efficiency " << FIXED(5,1) << 100.0*W[1]/W[0] << " %." << endl);
345 
346 
347  for (TH1* p : { &h0, &h1 }) {
348  p->GetXaxis()->SetTimeDisplay(1);
349  p->GetXaxis()->SetTimeFormat(TIMESTAMP);
350  p->Sumw2(false);
351  }
352 
353  for (JManager<string, TH1D>::iterator p = H1.begin(); p != H1.end(); ++p) {
354 
355  Double_t W = 0.0;
356 
357  for (Int_t i = 1; i <= p->second->GetXaxis()->GetNbins(); ++i) {
358  p->second->SetBinContent(i, (W += p->second->GetBinContent(i)));
359  }
360 
361  p->second->GetXaxis()->SetTimeDisplay(1);
362  p->second->GetXaxis()->SetTimeFormat(TIMESTAMP);
363  p->second->Sumw2(false);
364  }
365 
366  for (JManager<string, TH1D>::iterator p = R1.begin(); p != R1.end(); ++p) {
367 
368  p->second->GetXaxis()->SetTimeDisplay(1);
369  p->second->GetXaxis()->SetTimeFormat(TIMESTAMP);
370  p->second->Sumw2(false);
371  }
372 
373  TFile out(outputFile.c_str(), "recreate");
374 
375  out << h0 << h1 << H1 << R1;
376 
377  out.Write();
378  out.Close();
379 }
Utility class to parse command line options.
Definition: JParser.hh:1500
debug
Definition: JMessage.hh:29
#define R1(x)
*fatal Wrong number of arguments esac JCookie sh typeset Z DETECTOR typeset Z SOURCE_RUN typeset Z TARGET_RUN set_variable PARAMETERS_FILE $WORKDIR parameters
Definition: diff-Tuna.sh:38
then for HISTOGRAM in h0 h1
Definition: JMatrixNZ.sh:71
then let ID
Definition: JAcoustics.sh:31
Auxiliary data structure for floating point format specification.
Definition: JManip.hh:446
string outputFile
JDetectorsHelper & getDetector()
Auxiliary function for helper object initialisation.
Definition: JDBToolkit.hh:365
std::vector< std::string > getGITTags(const TRegexp &regexp, const JGITTags_t::key_type &date)
Get selection of GIT tags.
Definition: JDB/JGITTags.hh:34
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1961
#define NOTICE(A)
Definition: JMessage.hh:64
then break fi done getCenter read X Y Z let X
bool is_integer(const std::string &buffer)
Check if string is an integer.
Definition: JLangToolkit.hh:58
int debug
debug level
Definition: JSirene.cc:63
#define FATAL(A)
Definition: JMessage.hh:67
void reset(T &value)
Reset value.
ResultSet & getResultSet(const std::string &query)
Get result set.
Definition: JDB.hh:432
std::vector< JServer > getServernames()
Get list of names of available database servers.
Definition: JDB.hh:98
static const char *const TIMESTAMP
Time stamp of earliest UTC time.
int qaqc
QA/QC file descriptor.