Jpp
 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 typeset A TRIPODS get_tripods $WORKDIR tripod txt TRIPODS for EMITTER in
Definition: JCanberra.sh:36
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  string usr;
117  string pwd;
118  string cookie;
119  string outputFile;
120  string detid;
121  JRange_t runs;
122  vector<string> source;
123  JRange<TTimeStamp> UTC;
124  double Tmin_s;
125  int debug;
126 
127  try {
128 
129  JParser<> zap("Example program to plot quality data from data base.");
130 
131  zap['u'] = make_field(usr) = "";
132  zap['!'] = make_field(pwd) = "";
133  zap['C'] = make_field(cookie) = "";
134  zap['o'] = make_field(outputFile) = "monitor.root";
135  zap['D'] = make_field(detid, "detector identifier");
136  zap['R'] = make_field(runs, "run range") = JRange_t(1, JRange_t::getMaximum());
137  zap['S'] = make_field(source, "GIT versions") = getGITTags(TRegexp("v.*\\..*\\..*"), JGITTags_t::key_type("2019-04-12"));
138  zap['U'] = make_field(UTC, "UTC time range" ) = JRange<TTimeStamp>();
139  zap['T'] = make_field(Tmin_s, "minimal run duration [s]") = 60;
140  zap['d'] = make_field(debug) = 1;
141 
142  zap(argc, argv);
143  }
144  catch(const exception &error) {
145  FATAL(error.what() << endl);
146  }
147 
148 
149  int ID = -1; // integer representation of detector identifier
150 
151  vector<JRuns> data;
153  vector<JRunQuality> buffer;
154 
155  try {
156 
157  JDB::reset(usr, pwd, cookie);
158 
159  if (is_integer(detid))
160  ID = to_value<int>(detid);
161  else
162  ID = getDetector(detid);
163 
164  // runs
165 
166  try {
167 
168  ResultSet& rs = getResultSet(getTable<JRuns>(), getSelector<JRuns>(ID));
169 
170  for (JRuns parameters; rs >> parameters; ) {
171 
172  parameters.DETID = ID;
173 
174  if (UTC(parameters.getRunStartTime())) {
175  data.push_back(parameters);
176  }
177  }
178 
179  rs.Close();
180  }
181  catch(const exception& error) {}
182 
183  // data quality
184 
185  if (is_integer(detid)) {
186  detid = getDetector(to_value<int>(detid));
187  }
188 
189  for (vector<string>::const_iterator i = source.begin(); i != source.end(); ++i) {
190 
191  typedef map<string, string> data_type;
192  typedef map<int, data_type> map_type;
193 
194  map_type zmap;
195 
196  JSelector selector = getSelector<JRunSummaryNumbers>(detid, runs.getLowerLimit(), runs.getUpperLimit());
197 
198  selector.add(&JRunSummaryNumbers::SOURCE_NAME, *i);
199 
200  try {
201 
202  ResultSet& rs = getResultSet(getTable<JRunSummaryNumbers>(), selector);
203 
204  for (JRunSummaryNumbers parameters; rs >> parameters; ) {
205  zmap[parameters.RUN].insert(make_pair(parameters.PARAMETER_NAME, parameters.DATA_VALUE));
206  }
207  }
208  catch(const exception& error) {}
209 
210  for (map_type::const_iterator run = zmap.begin(); run != zmap.end(); ++run) {
211 
212  JRunQuality quality;
213 
214  quality.GIT = *i;
215  quality.detector = ID;
216  quality.run = run->first;
217 
218  for (data_type::const_iterator p = run->second.begin(); p != run->second.end(); ++p) {
219  quality.put(p->first, p->second);
220  }
221 
222  qaqc.insert(JRun_t(ID, quality.run));
223 
224  if (UTC(TTimeStamp(quality.UTCMin_s, 0)) &&
225  UTC(TTimeStamp(quality.UTCMax_s, 0))) {
226 
227  vector<JRunQuality>::iterator p = lower_bound(buffer.begin(), buffer.end(), quality);
228 
229  if (p == buffer.end() || p->run != quality.run) {
230  buffer.insert(p, quality);
231  }
232  }
233  }
234  }
235  }
236  catch(const exception& error) {
237  FATAL(error.what() << endl);
238  }
239 
240  if (buffer.empty()) {
241  FATAL("No valid QA/QC data for detector " << detid << endl);
242  }
243 
244 
245  // bins
246 
247  vector<double> X;
248 
249  for (vector<JRunQuality>::const_iterator quality = buffer.begin(); quality != buffer.end(); ++quality) {
250  X.push_back(quality->UTCMin_s);
251  X.push_back(quality->UTCMax_s);
252  }
253 
254  sort(X.begin(), X.end());
255 
256  struct Xmin {
257  Xmin(double xmin) :
258  xmin(xmin)
259  {}
260 
261  bool operator()(const double x1, const double x2)
262  {
263  return x2 - x1 <= xmin;
264  }
265 
266  double xmin;
267  };
268 
269  X.push_back(data.rbegin()->getRunStartTime()); // start of last run
270 
271  X.erase(unique(X.begin(), X.end(), Xmin(Tmin_s)), X.end());
272 
273  TH1D h0("livetime_s", NULL, X.size() - 1, X.data());
274  TH1D h1("QAQC", NULL, X.size() - 1, X.data());
275 
276  for (vector<JRuns>::const_iterator i = data.begin(); i != data.end(); ++i) {
277 
278  const JRun_t run(i->DETID,i->RUN);
279 
280  if (debug >= debug_t) {
281 
282  cout << "Run "
283  << setw(8) << i->RUN << ' '
284  << TTimeStamp((time_t) i->UNIXSTARTTIME/1000).AsString("c") << ' ';
285 
286  vector<JRunQuality>::const_iterator quality = lower_bound(buffer.begin(), buffer.end(), run);
287 
288  if (quality != buffer.end() && quality->run == i->RUN) {
289  cout << "[" << TTimeStamp((time_t) quality->UTCMin_s).AsString("c") << "," << TTimeStamp((time_t) quality->UTCMax_s).AsString("c") << "]";
290  } else {
291  cout << (qaqc.count(run) == 0 ? "missing" : "invalid") << " QA/QC data";
292  }
293 
294  cout << endl;
295  }
296 
297  double W = 1.0;
298 
299  if (! binary_search(buffer.begin(), buffer.end(), run)) {
300  W = (qaqc.count(run) == 0 ? -1.0 : 0.0);
301  }
302 
303  h1.Fill(i->getRunStartTime() + Tmin_s, W);
304  }
305 
306  JManager<string, TH1D> H1(new TH1D("%", NULL, X.size() - 1, X.data()));
307 
308  for (vector<JRunQuality>::const_iterator quality = buffer.begin(); quality != buffer.end(); ++quality) {
309 
310  const double x = 0.5 * (quality->UTCMin_s + quality->UTCMax_s);
311 
312  h0.Fill(x, 100.0 * quality->livetime_s / (quality->UTCMax_s - quality->UTCMin_s));
313 
314  H1["JDAQEvent"] -> Fill(x, quality->JDAQEvent);
315  H1["JTrigger3DShower"] -> Fill(x, quality->JTrigger3DShower);
316  H1["JTrigger3DMuon"] -> Fill(x, quality->JTrigger3DMuon);
317  H1["JTriggerMXShower"] -> Fill(x, quality->JTriggerMXShower);
318  }
319 
320 
321  Double_t W[2] = { 0.0 };
322 
323  W[0] = *X.rbegin() - *X.begin();
324 
325  for (vector<JRunQuality>::const_iterator quality = buffer.begin(); quality != buffer.end(); ++quality) {
326  W[1] += quality->livetime_s;
327  }
328 
329  NOTICE("Average data taking efficiency " << FIXED(5,1) << 100.0*W[1]/W[0] << " %." << endl);
330 
331 
332  for (TH1* p : { &h0, &h1 }) {
333  p->GetXaxis()->SetTimeDisplay(1);
334  p->GetXaxis()->SetTimeFormat(TIMESTAMP);
335  p->Sumw2(false);
336  }
337 
338  for (JManager<string, TH1D>::iterator p = H1.begin(); p != H1.end(); ++p) {
339 
340  Double_t W = 0.0;
341 
342  for (Int_t i = 1; i <= p->second->GetXaxis()->GetNbins(); ++i) {
343  p->second->SetBinContent(i, (W += p->second->GetBinContent(i)));
344  }
345 
346  p->second->GetXaxis()->SetTimeDisplay(1);
347  p->second->GetXaxis()->SetTimeFormat(TIMESTAMP);
348  p->second->Sumw2(false);
349  }
350 
351  TFile out(outputFile.c_str(), "recreate");
352 
353  out << h0 << h1 << H1;
354 
355  out.Write();
356  out.Close();
357 }
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
*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:445
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
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:269
static const char *const TIMESTAMP
Time stamp of earliest UTC time.
int qaqc
QA/QC file descriptor.