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);