109   JCondition_t    condition;
 
  118     const JGITTags_t::key_type date   (
"2019-04-12");
 
  119     const TRegexp              
version(
"v.*\\..*\\..*");
 
  122     for (JGITTags_t::const_reverse_iterator i = tags.rbegin(); i.base() != tags.lower_bound(date); ++i) {
 
  123       if (TString(i->second.c_str()).Contains(
version)) {
 
  128     JParser<> zap(
"Example program to plot quality data from data base."\
 
  129                   "\nThe condition and veto can be any TFormula compatible expression involving QA/QC parameters (see e.g. JQAQC.sh -h).");
 
  134     zap[
'f'] = 
make_field(inputFile,  
"Optional input file instead of database.")       = 
"";
 
  135     zap[
'o'] = 
make_field(
outputFile, 
"Output file containing histograms and n-tuple.") = 
"quality.root";
 
  138     zap[
'S'] = 
make_field(source,     
"GIT versions")                                   = buffer;
 
  139     zap[
'Q'] = 
make_field(condition,  
"User defined conditions");
 
  147   catch(
const exception &error) {
 
  148     FATAL(error.what() << endl);
 
  154   for (JCondition_t::const_iterator i = condition.begin(); i != condition.end(); ++i) {
 
  159     FATAL(
"Invalid total weight: " << W << endl);
 
  166   if (inputFile == 
"") {
 
  177         ID = to_value<int>(detid);
 
  185       selection += getSelector<JRuns>(
ID);
 
  187       ResultSet& rs  = 
getResultSet(getTable<JRuns>(), selection);
 
  190         if (TString(parameters.RUNSETUPNAME.c_str()).Contains(regexp)) {
 
  191           setup.put(parameters);
 
  204         JSelector selector = getSelector<JRunSummaryNumbers>(detid, runs.getLowerLimit(), runs.getUpperLimit());
 
  206         selector.add(&JRunSummaryNumbers::SOURCE_NAME, *i);
 
  210           ResultSet& rs  = 
getResultSet(getTable<JRunSummaryNumbers>(), selector);
 
  212           for (JRunSummaryNumbers parameters; rs >> 
parameters; ) {
 
  213             if (setup.has(parameters.RUN)) {
 
  214               zmap[parameters.RUN].insert(make_pair(parameters.PARAMETER_NAME, parameters.DATA_VALUE));
 
  218         catch(
const exception& error) {}
 
  220         for (map_type::const_iterator run = zmap.begin(); run != zmap.end(); ++run) {
 
  225           quality.detector = 
ID;
 
  226           quality.run      = run->first;
 
  228           for (data_type::const_iterator p = run->second.begin(); p != run->second.end(); ++p) {
 
  229             quality.put(p->first, p->second);
 
  232           buffer.insert(quality);
 
  236     catch(
const exception& error) {
 
  237       FATAL(error.what() << endl);
 
  242     ifstream 
in(inputFile.c_str());
 
  244     for (JRunQuality quality; 
in >> quality; ) {
 
  245       buffer.insert(quality);
 
  251   if (buffer.empty()) {
 
  252     FATAL(
"No data." << endl);
 
  257       cout << i->run << 
' ' << i->GIT << endl;
 
  262   runs = 
JRange_t(buffer.begin()->run, buffer.rbegin()->run);
 
  264   TH1D h0(
"h0", NULL, 1000, 0.0, 1.01);
 
  265   TH1D 
h1(
"h1", NULL, condition.size(), -0.5, condition.size() + 0.5);
 
  268   h0.SetMaximum(1.1 * (runs.getUpperLimit() - runs.getLowerLimit()));
 
  271   h1.SetMaximum(1.1 * (runs.getUpperLimit() - runs.getLowerLimit()));
 
  273   JManager<TString, TH1D> zmap(
new TH1D(
"%", NULL, 
 
  274                                         runs.getLength() + 1,
 
  275                                         runs.getLowerLimit() - 0.5,
 
  276                                         runs.getUpperLimit() + 0.5));
 
  280   for (JCondition_t::const_iterator i = condition.begin(); i != condition.end();++i) {
 
  282     const string buffer = i->formula;
 
  284     zmap[buffer]->GetListOfFunctions()->Add(
new TF1(
MAKE_CSTRING(buffer << 
":upper"), 
MAKE_CSTRING(i->range.getUpperLimit()), runs.getLowerLimit(), runs.getUpperLimit()));
 
  285     zmap[buffer]->GetListOfFunctions()->Add(
new TF1(
MAKE_CSTRING(buffer << 
":lower"), 
MAKE_CSTRING(i->range.getLowerLimit()), runs.getLowerLimit(), runs.getUpperLimit()));
 
  288   for (JCondition_t::const_iterator i = veto.begin(); i != veto.end();++i) {
 
  290     const string buffer = 
MAKE_STRING(
"VETO[" << i->formula << 
"]");
 
  292     zmap[buffer]->GetListOfFunctions()->Add(
new TF1(
MAKE_CSTRING(buffer << 
":upper"), 
MAKE_CSTRING(i->range.getUpperLimit()), runs.getLowerLimit(), runs.getUpperLimit()));
 
  293     zmap[buffer]->GetListOfFunctions()->Add(
new TF1(
MAKE_CSTRING(buffer << 
":lower"), 
MAKE_CSTRING(i->range.getLowerLimit()), runs.getLowerLimit(), runs.getUpperLimit()));
 
  300   for (
size_t i = 0; i != condition.size(); ++i) {
 
  301     os << 
":" << (char) (
'a' + i);
 
  306   TNtuple n1(
"n1", 
"quality", os.str().c_str());
 
  320     tuple.push_back((Float_t) quality->run);
 
  324     for (
size_t i = 0; i != condition.size(); ++i) {
 
  326       const JCondition& ps = condition[i];
 
  327       const double      y  = 
getResult(ps.formula, *quality);
 
  329       tuple.push_back((Float_t) y);
 
  331       TH1D* p = zmap[ps.formula];
 
  333       p->SetBinContent(p->FindBin((
double) quality->run), y);
 
  334       p->SetBinError  (p->FindBin((
double) quality->run), 0.0);
 
  340       h1.AddBinContent(i + 1, ps.range(y) ? 1.0 : 0.0);
 
  343     const double Q = w/W;
 
  345     tuple.push_back((Float_t) Q);
 
  349     for (
size_t i = 0; i != veto.size(); ++i) {
 
  351       const JCondition& ps = veto[i];
 
  352       const double      y  = 
getResult(ps.formula, *quality);
 
  354       TH1D* p = zmap[
MAKE_STRING(
"VETO[" << ps.formula << 
"]")];
 
  356       p->SetBinContent(p->FindBin((
double) quality->run), ps.range(y) ? 0.0 : 1.0);
 
  357       p->SetBinError  (p->FindBin((
double) quality->run), 0.0);
 
  364     tuple.push_back((Float_t) V);
 
  365     tuple.push_back((Float_t) setup.get(quality->run));
 
  368     n1.Fill(tuple.data());
 
  370     cout << setw(8) << quality->run << 
' ' << 
FIXED(5,3) << Q << 
' ' << setw(2) << V << endl;
 
  375   for (Int_t i = 0; i <= h0.GetXaxis()->GetNbins(); ++i) {
 
  376     h0.SetBinContent(i, (w += h0.GetBinContent(i)));
 
  383   out << h0 << 
h1 << n1 << zmap;
 
Utility class to parse command line options. 
 
esac print_variable DETECTOR INPUT_FILE OUTPUT_FILE CDF for TYPE in
 
*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. 
 
#define MAKE_STRING(A)
Make string. 
 
std::map< JDate<'-'>, std::string > JGITTags_t
Type definition of dated GIT tags. 
 
#define ASSERT(A,...)
Assert macro. 
 
std::string getGITVersion(const std::string &tag)
Get GIT version for given GIT tag. 
 
#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. 
 
then usage $script[detector file[variant[identifier]]] fi case set_variable ID
 
bool is_integer(const std::string &buffer)
Check if string is an integer. 
 
JRange< Double_t > JRange_t
 
static const JDetectorsHelper & getDetector
Function object for mapping serial number and object identifier of detectors. 
 
const JGITTags_t & getGITTags()
Get GIT dated tags. 
 
ResultSet & getResultSet(const std::string &query)
Get result set. 
 
bool resetObject(JManager< JKey_t, JValue_t > *object, const bool reset=false)
Reset JManager object.