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).");
154 zap[
's'] =
make_field(server) = getServernames();
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) {
182 if (getFilenameExtension(
outputFile) == ROOT_FILE_FORMAT) {
184 FATAL(
"Invalid total weight: " << W << endl);
193 if (inputFile ==
"") {
199 JDB::reset(usr, pwd, cookie);
201 const int ID = getDetector<int> (detid);
202 detid = getDetector<string>(detid);
208 NOTICE(
"Extracting run information from database... " << flush);
210 ResultSet& rs = getResultSet(getTable<JRuns>(), selection);
212 for (
JRuns parameters; rs >> parameters; ) {
213 if (TString(parameters.RUNSETUPNAME.c_str()).Contains(regexp)) {
214 setups.
put(parameters);
224 for (vector<string>::const_iterator git = source.begin(); git != source.end(); ++git) {
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);
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) {
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);
269 buffer.insert(quality);
273 catch(
const exception& error) {
274 FATAL(error.what() << endl);
279 if (detid !=
"" && !is_integer(detid)) {
280 WARNING(
"Detector identifier \"" << detid <<
"\" discarded." << endl);
283 const int ID = (is_integer(detid) ? to_value<int>(detid) : -1);
292 if (
ID == -1 ||
ID == quality.detector) {
293 if (runs(quality.run)) {
294 buffer.insert(quality);
303 if (buffer.empty()) {
304 FATAL(
"No data." << endl);
307 if (
debug >= debug_t) {
312 writer.
put(*quality);
317 if (getFilenameExtension(
outputFile) == ROOT_FILE_FORMAT) {
319 runs = JRange_t(buffer.begin()->run, buffer.rbegin()->run);
321 TH1D h0(
"h0", NULL, 1000, 0.0, 1.01);
322 TH1D h1(
"h1", NULL, condition.size(), -0.5, condition.size() - 0.5);
324 for (
size_t i = 0; i != condition.size(); ++i) {
325 h1.GetXaxis()->SetBinLabel(i+1, condition[i].formula.c_str());
329 h0.SetMaximum(1.1 * (runs.getUpperLimit() - runs.getLowerLimit() + 1));
332 h1.SetMaximum(1.1 * (runs.getUpperLimit() - runs.getLowerLimit() + 1));
334 const Double_t xmin = runs.getLowerLimit() - 0.5;
335 const Double_t xmax = runs.getUpperLimit() + 0.5;
337 JManager<TString, TH1D> H1(
new TH1D(
"%", NULL, runs.getLength() + 1, xmin, xmax));
341 for (JCondition_t::const_iterator i = condition.begin(); i != condition.end();++i) {
342 H1[i->formula]->GetListOfFunctions()->Add(
new TF1(
MAKE_CSTRING(
"C " << i->formula <<
":upper"),
MAKE_CSTRING(i->range.getUpperLimit()), xmin, xmax));
343 H1[i->formula]->GetListOfFunctions()->Add(
new TF1(
MAKE_CSTRING(
"C " << i->formula <<
":lower"),
MAKE_CSTRING(i->range.getLowerLimit()), xmin, xmax));
346 for (JCondition_t::const_iterator i = veto.begin(); i != veto.end();++i) {
347 H1[i->formula]->GetListOfFunctions()->Add(
new TF1(
MAKE_CSTRING(
"V " << i->formula <<
":upper"),
MAKE_CSTRING(i->range.getUpperLimit()), xmin, xmax));
348 H1[i->formula]->GetListOfFunctions()->Add(
new TF1(
MAKE_CSTRING(
"V " << i->formula <<
":lower"),
MAKE_CSTRING(i->range.getLowerLimit()), xmin, xmax));
355 for (
size_t i = 0; i != condition.size(); ++i) {
356 os <<
":" << (char) (
'a' + i);
361 TNtuple n1(
"n1",
"quality", os.str().c_str());
372 for (
size_t i = 0; i != condition.size(); ++i) {
374 const JCondition& ps = condition[i];
375 const double y = getResult(ps.formula, *quality);
377 DEBUG(ps.formula <<
' ' << y << endl);
379 tuple.push_back((Float_t) y);
381 TH1D* p = H1[ps.formula];
383 p->SetBinContent(p->FindBin((
double) quality->run), y);
384 p->SetBinError (p->FindBin((
double) quality->run), numeric_limits<double>::epsilon());
390 h1.AddBinContent(i + 1, ps.range(y) ? 1.0 : 0.0);
393 const double Q = w/W;
395 tuple.push_back((Float_t) Q);
399 for (
size_t i = 0; i != veto.size(); ++i) {
401 const JCondition& ps = veto[i];
402 const double y = getResult(ps.formula, *quality);
404 DEBUG(ps.formula <<
' ' << y << endl);
410 p->SetBinContent(p->FindBin((
double) quality->run), y);
411 p->SetBinError (p->FindBin((
double) quality->run), numeric_limits<double>::epsilon());
415 p->SetBinContent(p->FindBin((
double) quality->run), ps.range(y) ? 0.0 : 1.0);
416 p->SetBinError (p->FindBin((
double) quality->run), numeric_limits<double>::epsilon());
423 tuple.push_back((Float_t) V);
424 tuple.push_back((Float_t) setups.
get(quality->run));
427 n1.Fill(tuple.data());
429 cout << setw(8) << quality->run <<
' ' <<
FIXED(5,3) << Q <<
' ' << setw(2) << V << endl;
434 for (Int_t i = 0; i <= h0.GetXaxis()->GetNbins(); ++i) {
435 h0.SetBinContent(i, (w += h0.GetBinContent(i)));
442 out << h0 << h1 << n1 << H1;
449 if (getFilenameExtension(
outputFile) == ASCII_FILE_FORMAT) {
455 out.setf(ios::fixed);