132   typedef JRange<int>           JRange_t; 
 
  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).");
 
  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) {
 
  185       FATAL(
"Invalid total weight: " << W << endl);
 
  194   if (inputFile == 
"") {                    
 
  202       const int ID = getDetector<int>   (detid);
 
  203       detid        = getDetector<string>(detid);
 
  207       selection += getSelector<JRuns>(
ID);
 
  209       NOTICE(
"Extracting run information from database... " << flush);
 
  211       ResultSet& rs  = 
getResultSet(getTable<JRuns>(), selection);
 
  214         if (TString(parameters.RUNSETUPNAME.c_str()).Contains(regexp)) {
 
  215           setups.put(parameters);
 
  232         JSelector selector = getSelector<JRunSummaryNumbers>(detid, runs.getLowerLimit(), runs.getUpperLimit());
 
  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);
 
  242           for (JRunSummaryNumbers parameters; rs >> 
parameters; ) {
 
  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) {
 
  259           quality.detector = 
ID;
 
  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);
 
  268           quality.name     = 
replace(quality.name, 
' ', 
'_');
 
  270           buffer.insert(quality);           
 
  274     catch(
const exception& error) {
 
  275       FATAL(error.what() << endl);
 
  281       WARNING(
"Detector identifier \"" << detid << 
"\" discarded." << endl);
 
  284     const int ID = (
is_integer(detid) ? to_value<int>(detid) : -1);
 
  292     for (JRunQuality quality; 
in >> quality; ) {
 
  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);
 
  313       writer.put(*quality);
 
  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);
 
  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);
 
  416         p->SetBinContent(p->FindBin((
double) quality->run), ps.range(y) ? 0.0 : 1.0);
 
  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;
 
  456     out.setf(ios::fixed);
 
  460     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. 
 
std::vector< std::string > getGITTags(const TRegexp ®exp, const JGITTags_t::key_type &date)
Get selection of GIT tags. 
 
*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. 
 
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. 
 
#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. 
 
then echo Variable JPP_DIR undefined exit fi source $JPP_DIR setenv sh $JPP_DIR &dev null set_variable DETECTOR $JPP_DATA km3net_reference detx set_variable NUMBER_OF_STRINGS set_variable ID if do_usage *then usage $script[detector file[identifier]] fi case set_variable ID
 
bool is_integer(const std::string &buffer)
Check if string is an integer. 
 
std::string getFilenameExtension(const std::string &file_name)
Get file name extension, i.e. part after last JEEP::FILENAME_SEPARATOR if any. 
 
ResultSet & getResultSet(const std::string &query)
Get result set. 
 
std::vector< JServer > getServernames()
Get list of names of available database servers. 
 
std::vector< JHit > data_type
 
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 JAcoustics sh $DETECTOR_ID source JAcousticsToolkit sh CHECK_EXIT_CODE typeset A EMITTERS get_tripods $WORKDIR tripod txt EMITTERS get_transmitters $WORKDIR transmitter txt EMITTERS for EMITTER in
 
static const char *const ROOT_FILE_FORMAT
file name extension ROOT format 
 
#define DEBUG(A)
Message macros.