144 JCondition_t condition;
152 JParser<> zap(
"Main program to evaluate quality data from data base."\
153 "\nThe condition and veto can be any TFormula compatible expression involving QA/QC parameters (see e.g. JQAQC.sh -h).");
155 zap[
's'] =
make_field(server) = getServernames();
159 zap[
'f'] =
make_field(inputFile,
"Optional input file instead of database.") =
"";
160 zap[
'o'] =
make_field(
outputFile,
"ROOT file with histograms and n-tuple or ASCII file with QA/QC data.") =
"quality.root";
162 zap[
'R'] =
make_field(runs,
"Run range") = JRange_t(1, JRange_t::getMaximum());
163 zap[
'S'] =
make_field(source,
"GIT versions") = getGITTags(TRegexp(
"v[0-9]*\\.[0-9]*\\.[0-9]*$"), JGITTags_t::key_type(
"2019-04-12"));
172 catch(
const exception &error) {
173 FATAL(error.what() << endl);
179 for (JCondition_t::const_iterator i = condition.begin(); i != condition.end(); ++i) {
183 if (getFilenameExtension(
outputFile) == ROOT_FILE_FORMAT) {
185 FATAL(
"Invalid total weight: " << W << endl);
194 if (inputFile ==
"") {
200 JDB::reset(usr, pwd, cookie);
202 const int ID = getDetector<int> (detid);
203 detid = getDetector<string>(detid);
209 NOTICE(
"Extracting run information from database... " << flush);
211 ResultSet& rs = getResultSet(getTable<JRuns>(), selection);
213 for (
JRuns parameters; rs >> parameters; ) {
214 if (TString(parameters.RUNSETUPNAME.c_str()).Contains(regexp)) {
215 setups.
put(parameters);
225 for (vector<string>::const_iterator git = source.begin(); git != source.end(); ++git) {
234 selector.add(&JRunSummaryNumbers::SOURCE_NAME, *git);
238 NOTICE(
"Extracting run summmary information with source " << *git <<
" from database... " << flush);
240 ResultSet& rs = getResultSet(getTable<JRunSummaryNumbers>(), selector);
243 if (setups.
has(parameters.RUN)) {
244 zmap[parameters.RUN].insert(make_pair(parameters.PARAMETER_NAME, parameters.DATA_VALUE));
252 catch(
const exception& error) {
NOTICE(endl); }
254 for (map_type::const_iterator run = zmap.begin(); run != zmap.end(); ++run) {
260 quality.
run = run->first;
261 quality.
name = setups[run->first].name;
262 quality.
value = setups[run->first].value;
264 for (data_type::const_iterator i = run->second.begin(); i != run->second.end(); ++i) {
265 quality.
put(i->first, i->second);
270 buffer.insert(quality);
274 catch(
const exception& error) {
275 FATAL(error.what() << endl);
280 if (detid !=
"" && !is_integer(detid)) {
281 WARNING(
"Detector identifier \"" << detid <<
"\" discarded." << endl);
284 const int ID = (is_integer(detid) ? to_value<int>(detid) : -1);
293 if (
ID == -1 ||
ID == quality.detector) {
294 if (runs(quality.run)) {
295 buffer.insert(quality);
304 if (buffer.empty()) {
305 FATAL(
"No data." << endl);
308 if (
debug >= debug_t) {
313 writer.
put(*quality);
318 if (getFilenameExtension(
outputFile) == ROOT_FILE_FORMAT) {
320 runs = JRange_t(buffer.begin()->run, buffer.rbegin()->run);
322 TH1D h0(
"h0", NULL, 1000, 0.0, 1.01);
323 TH1D h1(
"h1", NULL, condition.size(), -0.5, condition.size() - 0.5);
325 for (
size_t i = 0; i != condition.size(); ++i) {
326 h1.GetXaxis()->SetBinLabel(i+1, condition[i].formula.c_str());
330 h0.SetMaximum(1.1 * (runs.getUpperLimit() - runs.getLowerLimit() + 1));
333 h1.SetMaximum(1.1 * (runs.getUpperLimit() - runs.getLowerLimit() + 1));
335 const Double_t xmin = runs.getLowerLimit() - 0.5;
336 const Double_t xmax = runs.getUpperLimit() + 0.5;
338 JManager<TString, TH1D> H1(
new TH1D(
"%", NULL, runs.getLength() + 1, xmin, xmax));
342 for (JCondition_t::const_iterator i = condition.begin(); i != condition.end();++i) {
343 H1[i->formula]->GetListOfFunctions()->Add(
new TF1(
MAKE_CSTRING(
"C " << i->formula <<
":upper"),
MAKE_CSTRING(i->range.getUpperLimit()), xmin, xmax));
344 H1[i->formula]->GetListOfFunctions()->Add(
new TF1(
MAKE_CSTRING(
"C " << i->formula <<
":lower"),
MAKE_CSTRING(i->range.getLowerLimit()), xmin, xmax));
347 for (JCondition_t::const_iterator i = veto.begin(); i != veto.end();++i) {
348 H1[i->formula]->GetListOfFunctions()->Add(
new TF1(
MAKE_CSTRING(
"V " << i->formula <<
":upper"),
MAKE_CSTRING(i->range.getUpperLimit()), xmin, xmax));
349 H1[i->formula]->GetListOfFunctions()->Add(
new TF1(
MAKE_CSTRING(
"V " << i->formula <<
":lower"),
MAKE_CSTRING(i->range.getLowerLimit()), xmin, xmax));
356 for (
size_t i = 0; i != condition.size(); ++i) {
357 os <<
":" << (char) (
'a' + i);
362 TNtuple n1(
"n1",
"quality", os.str().c_str());
373 for (
size_t i = 0; i != condition.size(); ++i) {
375 const JCondition& ps = condition[i];
376 const double y = getResult(ps.formula, *quality);
378 DEBUG(ps.formula <<
' ' << y << endl);
380 tuple.push_back((Float_t) y);
382 TH1D* p = H1[ps.formula];
384 p->SetBinContent(p->FindBin((
double) quality->run), y);
385 p->SetBinError (p->FindBin((
double) quality->run), numeric_limits<double>::epsilon());
391 h1.AddBinContent(i + 1, ps.range(y) ? 1.0 : 0.0);
394 const double Q = w/W;
396 tuple.push_back((Float_t) Q);
400 for (
size_t i = 0; i != veto.size(); ++i) {
402 const JCondition& ps = veto[i];
403 const double y = getResult(ps.formula, *quality);
405 DEBUG(ps.formula <<
' ' << y << endl);
411 p->SetBinContent(p->FindBin((
double) quality->run), y);
412 p->SetBinError (p->FindBin((
double) quality->run), numeric_limits<double>::epsilon());
416 p->SetBinContent(p->FindBin((
double) quality->run), ps.range(y) ? 0.0 : 1.0);
417 p->SetBinError (p->FindBin((
double) quality->run), numeric_limits<double>::epsilon());
424 tuple.push_back((Float_t) V);
425 tuple.push_back((Float_t) setups.
get(quality->run));
428 n1.Fill(tuple.data());
430 cout << setw(8) << quality->run <<
' ' <<
FIXED(5,3) << Q <<
' ' << setw(2) << V << endl;
435 for (Int_t i = 0; i <= h0.GetXaxis()->GetNbins(); ++i) {
436 h0.SetBinContent(i, (w += h0.GetBinContent(i)));
443 out << h0 << h1 << n1 << H1;
450 if (getFilenameExtension(
outputFile) == ASCII_FILE_FORMAT) {
456 out.setf(ios::fixed);