Jpp - 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:38
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.*\\..*\\..*"), 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  int ID = -1; // integer representation of detector identifier
152 
153  vector<JRuns> data;
155  vector<JRunQuality> buffer;
156 
157  try {
158 
159  JDB::reset(usr, pwd, cookie);
160 
161  if (is_integer(detid))
162  ID = to_value<int>(detid);
163  else
164  ID = getDetector(detid);
165 
166  // runs
167 
168  try {
169 
170  ResultSet& rs = getResultSet(getTable<JRuns>(), getSelector<JRuns>(ID));
171 
172  for (JRuns parameters; rs >> parameters; ) {
173 
174  parameters.DETID = ID;
175 
176  if (UTC(parameters.getRunStartTime())) {
177  data.push_back(parameters);
178  }
179  }
180 
181  rs.Close();
182  }
183  catch(const exception& error) {}
184 
185  // data quality
186 
187  if (is_integer(detid)) {
188  detid = getDetector(to_value<int>(detid));
189  }
190 
191  for (vector<string>::const_iterator i = source.begin(); i != source.end(); ++i) {
192 
193  typedef map<string, string> data_type;
194  typedef map<int, data_type> map_type;
195 
196  map_type zmap;
197 
198  JSelector selector = getSelector<JRunSummaryNumbers>(detid, runs.getLowerLimit(), runs.getUpperLimit());
199 
200  selector.add(&JRunSummaryNumbers::SOURCE_NAME, *i);
201 
202  try {
203 
204  ResultSet& rs = getResultSet(getTable<JRunSummaryNumbers>(), selector);
205 
206  for (JRunSummaryNumbers parameters; rs >> parameters; ) {
207  zmap[parameters.RUN].insert(make_pair(parameters.PARAMETER_NAME, parameters.DATA_VALUE));
208  }
209 
210  rs.Close();
211  }
212  catch(const exception& error) {}
213 
214  for (map_type::const_iterator run = zmap.begin(); run != zmap.end(); ++run) {
215 
216  JRunQuality quality;
217 
218  quality.GIT = *i;
219  quality.detector = ID;
220  quality.run = run->first;
221 
222  for (data_type::const_iterator p = run->second.begin(); p != run->second.end(); ++p) {
223  quality.put(p->first, p->second);
224  }
225 
226  qaqc.insert(JRun_t(ID, quality.run));
227 
228  if (UTC(TTimeStamp(quality.UTCMin_s, 0)) &&
229  UTC(TTimeStamp(quality.UTCMax_s, 0))) {
230 
231  vector<JRunQuality>::iterator p = lower_bound(buffer.begin(), buffer.end(), quality);
232 
233  if (p == buffer.end() || p->run != quality.run) {
234  buffer.insert(p, quality);
235  }
236  }
237  }
238  }
239  }
240  catch(const exception& error) {
241  FATAL(error.what() << endl);
242  }
243 
244  if (buffer.empty()) {
245  FATAL("No valid QA/QC data for detector " << detid << endl);
246  }
247 
248 
249  // bins
250 
252 
253  for (vector<JRunQuality>::const_iterator quality = buffer.begin(); quality != buffer.end(); ++quality) {
254  X.push_back(quality->UTCMin_s);
255  X.push_back(quality->UTCMax_s);
256  }
257 
258  sort(X.begin(), X.end());
259 
260  struct Xmin {
261  Xmin(double xmin) :
262  xmin(xmin)
263  {}
264 
265  bool operator()(const double x1, const double x2)
266  {
267  return x2 - x1 <= xmin;
268  }
269 
270  double xmin;
271  };
272 
273  X.push_back(data.rbegin()->getRunStartTime()); // start of last run
274 
275  X.erase(unique(X.begin(), X.end(), Xmin(Tmin_s)), X.end());
276 
277  TH1D h0("livetime_s", NULL, X.size() - 1, X.data());
278  TH1D h1("QAQC", NULL, X.size() - 1, X.data());
279 
280  for (vector<JRuns>::const_iterator i = data.begin(); i != data.end(); ++i) {
281 
282  const JRun_t run(i->DETID,i->RUN);
283 
284  if (debug >= debug_t) {
285 
286  cout << "Run "
287  << setw(8) << i->RUN << ' '
288  << TTimeStamp((time_t) i->UNIXSTARTTIME/1000).AsString("c") << ' ';
289 
290  vector<JRunQuality>::const_iterator quality = lower_bound(buffer.begin(), buffer.end(), run);
291 
292  if (quality != buffer.end() && quality->run == i->RUN) {
293  cout << "[" << TTimeStamp((time_t) quality->UTCMin_s).AsString("c") << "," << TTimeStamp((time_t) quality->UTCMax_s).AsString("c") << "]";
294  } else {
295  cout << (qaqc.count(run) == 0 ? "missing" : "invalid") << " QA/QC data";
296  }
297 
298  cout << endl;
299  }
300 
301  double W = 1.0;
302 
303  if (! binary_search(buffer.begin(), buffer.end(), run)) {
304  W = (qaqc.count(run) == 0 ? -1.0 : 0.0);
305  }
306 
307  h1.Fill(i->getRunStartTime() + Tmin_s, W);
308  }
309 
310  JManager<string, TH1D> H1(new TH1D("H[%]", NULL, X.size() - 1, X.data()));
311  JManager<string, TH1D> R1(new TH1D("R[%]", NULL, X.size() - 1, X.data()));
312 
313  for (vector<JRunQuality>::const_iterator quality = buffer.begin(); quality != buffer.end(); ++quality) {
314 
315  const double x = 0.5 * (quality->UTCMin_s + quality->UTCMax_s);
316 
317  h0.Fill(x, 100.0 * quality->livetime_s / (quality->UTCMax_s - quality->UTCMin_s));
318 
319  H1["JDAQEvent"] -> Fill(x, quality->JDAQEvent);
320  H1["JTrigger3DShower"] -> Fill(x, quality->JTrigger3DShower);
321  H1["JTrigger3DMuon"] -> Fill(x, quality->JTrigger3DMuon);
322  H1["JTriggerMXShower"] -> Fill(x, quality->JTriggerMXShower);
323 
324  if (quality->livetime_s > 0.0) {
325  R1["JDAQEvent"] -> Fill(x, quality->JDAQEvent / quality->livetime_s);
326  R1["JTrigger3DShower"] -> Fill(x, quality->JTrigger3DShower / quality->livetime_s);
327  R1["JTrigger3DMuon"] -> Fill(x, quality->JTrigger3DMuon / quality->livetime_s);
328  R1["JTriggerMXShower"] -> Fill(x, quality->JTriggerMXShower / quality->livetime_s);
329  }
330  }
331 
332 
333  Double_t W[2] = { 0.0 };
334 
335  W[0] = *X.rbegin() - *X.begin();
336 
337  for (vector<JRunQuality>::const_iterator quality = buffer.begin(); quality != buffer.end(); ++quality) {
338  W[1] += quality->livetime_s;
339  }
340 
341  NOTICE("Average data taking efficiency " << FIXED(5,1) << 100.0*W[1]/W[0] << " %." << endl);
342 
343 
344  for (TH1* p : { &h0, &h1 }) {
345  p->GetXaxis()->SetTimeDisplay(1);
346  p->GetXaxis()->SetTimeFormat(TIMESTAMP);
347  p->Sumw2(false);
348  }
349 
350  for (JManager<string, TH1D>::iterator p = H1.begin(); p != H1.end(); ++p) {
351 
352  Double_t W = 0.0;
353 
354  for (Int_t i = 1; i <= p->second->GetXaxis()->GetNbins(); ++i) {
355  p->second->SetBinContent(i, (W += p->second->GetBinContent(i)));
356  }
357 
358  p->second->GetXaxis()->SetTimeDisplay(1);
359  p->second->GetXaxis()->SetTimeFormat(TIMESTAMP);
360  p->second->Sumw2(false);
361  }
362 
363  for (JManager<string, TH1D>::iterator p = R1.begin(); p != R1.end(); ++p) {
364 
365  p->second->GetXaxis()->SetTimeDisplay(1);
366  p->second->GetXaxis()->SetTimeFormat(TIMESTAMP);
367  p->second->Sumw2(false);
368  }
369 
370  TFile out(outputFile.c_str(), "recreate");
371 
372  out << h0 << h1 << H1 << R1;
373 
374  out.Write();
375  out.Close();
376 }
Utility class to parse command line options.
Definition: JParser.hh:1500
debug
Definition: JMessage.hh:29
std::vector< std::string > getGITTags(const TRegexp regexp, const JGITTags_t::key_type date)
Get selection of GIT tags.
Definition: JDB/JGITTags.hh:34
do rm f tmp H1
#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:69
then let ID
Definition: JAcoustics.sh:30
Auxiliary data structure for floating point format specification.
Definition: JManip.hh:446
string outputFile
JDetectorsHelper getDetector
Function object for mapping serial number to object identifier of detector and vice versa...
Definition: JDBToolkit.cc:5
#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.