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
std::vector< event_type > data_type
TString replace(const TString &target, const TRegexp ®exp, const T &replacement)
Replace regular expression in input by given replacement.
std::map< int, buffer_type > map_type
string -> hits
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.
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.