131 typedef JRange<int> JRange_t;
143 JCondition_t condition;
151 JParser<> zap(
"Main program to evaluate quality data from data base."\
152 "\nThe condition and veto can be any TFormula compatible expression involving QA/QC parameters (see e.g. JQAQC.sh -h).");
158 zap[
'f'] =
make_field(inputFile,
"Optional input file instead of database.") =
"";
159 zap[
'o'] =
make_field(
outputFile,
"ROOT file with histograms and n-tuple or ASCII file with QA/QC data.") =
"quality.root";
161 zap[
'R'] =
make_field(runs,
"Run range") = JRange_t(1, JRange_t::getMaximum());
162 zap[
'S'] =
make_field(source,
"GIT versions") =
getGITTags(TRegexp(
"v[0-9]*\\.[0-9]*\\.[0-9]*$"), JGITTags_t::key_type(
"2019-04-12"));
171 catch(
const exception &error) {
172 FATAL(error.what() << endl);
178 for (JCondition_t::const_iterator i = condition.begin(); i != condition.end(); ++i) {
184 FATAL(
"Invalid total weight: " << W << endl);
193 if (inputFile ==
"") {
201 const int ID = getDetector<int> (detid);
202 detid = getDetector<string>(detid);
206 selection += getSelector<JRuns>(
ID);
208 NOTICE(
"Extracting run information from database... " << flush);
210 ResultSet& rs =
getResultSet(getTable<JRuns>(), selection);
213 if (TString(parameters.RUNSETUPNAME.c_str()).Contains(regexp)) {
214 setups.put(parameters);
231 JSelector selector = getSelector<JRunSummaryNumbers>(detid, runs.getLowerLimit(), runs.getUpperLimit());
233 selector.add(&JRunSummaryNumbers::SOURCE_NAME, *git);
237 NOTICE(
"Extracting run summmary information with source " << *git <<
" from database... " << flush);
239 ResultSet& rs =
getResultSet(getTable<JRunSummaryNumbers>(), selector);
241 for (JRunSummaryNumbers parameters; rs >>
parameters; ) {
242 if (setups.has(parameters.RUN)) {
243 zmap[parameters.RUN].insert(make_pair(parameters.PARAMETER_NAME, parameters.DATA_VALUE));
251 catch(
const exception& error) {
NOTICE(endl); }
253 for (map_type::const_iterator run = zmap.begin(); run != zmap.end(); ++run) {
258 quality.detector =
ID;
259 quality.run = run->first;
260 quality.name = setups[run->first].name;
261 quality.value = setups[run->first].value;
263 for (data_type::const_iterator i = run->second.begin(); i != run->second.end(); ++i) {
264 quality.put(i->first, i->second);
267 quality.name =
replace(quality.name,
' ',
'_');
269 buffer.insert(quality);
273 catch(
const exception& error) {
274 FATAL(error.what() << endl);
285 for (JRunQuality quality;
in >> quality; ) {
286 buffer.insert(quality);
293 if (buffer.empty()) {
294 FATAL(
"No data." << endl);
300 runs = JRange_t(buffer.begin()->run, buffer.rbegin()->run);
302 TH1D h0(
"h0", NULL, 1000, 0.0, 1.01);
303 TH1D
h1(
"h1", NULL, condition.size(), -0.5, condition.size() - 0.5);
305 for (
size_t i = 0; i != condition.size(); ++i) {
306 h1.GetXaxis()->SetBinLabel(i+1, condition[i].formula.c_str());
310 h0.SetMaximum(1.1 * (runs.getUpperLimit() - runs.getLowerLimit()));
313 h1.SetMaximum(1.1 * (runs.getUpperLimit() - runs.getLowerLimit()));
315 const Double_t xmin = runs.getLowerLimit() - 0.5;
316 const Double_t xmax = runs.getUpperLimit() + 0.5;
318 JManager<TString, TH1D> H1(
new TH1D(
"%", NULL, runs.getLength() + 1, xmin, xmax));
322 for (JCondition_t::const_iterator i = condition.begin(); i != condition.end();++i) {
323 H1[i->formula]->GetListOfFunctions()->Add(
new TF1(
MAKE_CSTRING(
"C " << i->formula <<
":upper"),
MAKE_CSTRING(i->range.getUpperLimit()), xmin, xmax));
324 H1[i->formula]->GetListOfFunctions()->Add(
new TF1(
MAKE_CSTRING(
"C " << i->formula <<
":lower"),
MAKE_CSTRING(i->range.getLowerLimit()), xmin, xmax));
327 for (JCondition_t::const_iterator i = veto.begin(); i != veto.end();++i) {
328 H1[i->formula]->GetListOfFunctions()->Add(
new TF1(
MAKE_CSTRING(
"V " << i->formula <<
":upper"),
MAKE_CSTRING(i->range.getUpperLimit()), xmin, xmax));
329 H1[i->formula]->GetListOfFunctions()->Add(
new TF1(
MAKE_CSTRING(
"V " << i->formula <<
":lower"),
MAKE_CSTRING(i->range.getLowerLimit()), xmin, xmax));
336 for (
size_t i = 0; i != condition.size(); ++i) {
337 os <<
":" << (char) (
'a' + i);
342 TNtuple n1(
"n1",
"quality", os.str().c_str());
353 for (
size_t i = 0; i != condition.size(); ++i) {
355 const JCondition& ps = condition[i];
356 const double y =
getResult(ps.formula, *quality);
358 DEBUG(ps.formula <<
' ' << y << endl);
360 tuple.push_back((Float_t) y);
362 TH1D* p = H1[ps.formula];
364 p->SetBinContent(p->FindBin((
double) quality->run), y);
365 p->SetBinError (p->FindBin((
double) quality->run), numeric_limits<double>::epsilon());
371 h1.AddBinContent(i + 1, ps.range(y) ? 1.0 : 0.0);
374 const double Q = w/W;
376 tuple.push_back((Float_t) Q);
380 for (
size_t i = 0; i != veto.size(); ++i) {
382 const JCondition& ps = veto[i];
383 const double y =
getResult(ps.formula, *quality);
385 DEBUG(ps.formula <<
' ' << y << endl);
391 p->SetBinContent(p->FindBin((
double) quality->run), y);
392 p->SetBinError (p->FindBin((
double) quality->run), numeric_limits<double>::epsilon());
396 p->SetBinContent(p->FindBin((
double) quality->run), ps.range(y) ? 0.0 : 1.0);
397 p->SetBinError (p->FindBin((
double) quality->run), numeric_limits<double>::epsilon());
404 tuple.push_back((Float_t) V);
405 tuple.push_back((Float_t) setups.get(quality->run));
408 n1.Fill(tuple.data());
410 cout << setw(8) << quality->run <<
' ' <<
FIXED(5,3) << Q <<
' ' << setw(2) << V << endl;
415 for (Int_t i = 0; i <= h0.GetXaxis()->GetNbins(); ++i) {
416 h0.SetBinContent(i, (w += h0.GetBinContent(i)));
423 out << h0 <<
h1 << n1 << H1;
436 out.setf(ios::fixed);
440 comment.add(JMeta(argc, argv));
Utility class to parse command line options.
Q(UTCMax_s-UTCMin_s)-livetime_s
TString replace(const TString &target, const TRegexp ®exp, const T &replacement)
Replace regular expression in input by given replacement.
*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
#define MAKE_CSTRING(A)
Make C-string.
then for HISTOGRAM in h0 h1
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Auxiliary data structure for floating point format specification.
static const char *const ASCII_FILE_FORMAT
file name extension ASCII format
V(JDAQEvent-JTriggerReprocessor)*1.0/(JDAQEvent+1.0e-10)
#define MAKE_STRING(A)
Make string.
std::vector< std::string > getGITTags(const TRegexp ®exp, const JGITTags_t::key_type &date)
Get selection of GIT tags.
#define ASSERT(A,...)
Assert macro.
T & getInstance(const T &object)
Get static instance from temporary object.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Double_t getResult(const TString &text, TObject *object=NULL)
Get result of given textual formula.
std::string getFilenameExtension(const std::string &file_name)
Get file name extension, i.e. part after last JEEP::FILENAME_SEPARATOR if any.
then usage $script< input_file >< detector_file > fi set_variable OUTPUT_DIR set_variable SELECTOR JDAQTimesliceL1 set_variable DEBUG case set_variable DEBUG
ResultSet & getResultSet(const std::string &query)
Get result set.
std::vector< JServer > getServernames()
Get list of names of available database servers.
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
static const char *const ROOT_FILE_FORMAT
file name extension ROOT format