222{
225
227
232 int stats;
233 JRange_t X;
234 JRange_t Y;
235 JRange_t Z;
238 bool logz;
240 string xLabel;
241 string yLabel;
242 string zLabel;
243 double markerSize;
244 string option;
246 bool batch;
247 string title;
249 int palette;
251
252 try {
253
255
256 JParser<> zap(
"General purpose plot program for 2D ROOT objects.");
257
258 zap[
'f'] =
make_field(inputFile,
"<input file>:<object name>");
260 zap[
'w'] =
make_field(canvas,
"size of canvas <nx>x<ny> [pixels]") =
JCanvas(500, 500);
263 zap[
'x'] =
make_field(X,
"x-abscissa range") = JRange_t::DEFAULT_RANGE();
264 zap[
'y'] =
make_field(Y,
"y-abscissa range") = JRange_t::DEFAULT_RANGE();
265 zap[
'z'] =
make_field(Z,
"ordinate range") = JRange_t::DEFAULT_RANGE();
266 zap[
'X'] =
make_field(logx,
"logarithmic x-axis (-XX log10 axis)");
267 zap[
'Y'] =
make_field(logy,
"logarithmic y-axis (-YY log10 axis)");
268 zap[
'Z'] =
make_field(logz,
"logarithmic z-axis");
269 zap[
'P'] =
make_field(project,
"projection") =
"",
"xy",
"yx",
"xz",
"zx",
"yz",
"zy";
270 zap[
'>'] =
make_field(xLabel,
"x-axis label") =
"";
271 zap[
'<'] =
make_field(yLabel,
"y-axis label") =
"";
272 zap[
'^'] =
make_field(zLabel,
"z-axis label") =
"";
273 zap[
'S'] =
make_field(markerSize,
"marker size") = 1.0;
274 zap[
'O'] =
make_field(option,
"plotting option") =
"";
276 zap[
'B'] =
make_field(batch,
"batch processing");
277 zap[
'T'] =
make_field(title,
"graphics title ("
278 << "\"" << JName_t << "\" -> ROOT name; "
279 << "\"" << JTitle_t << "\" -> ROOT title)") = "KM3NeT preliminary";
281 zap[
'p'] =
make_field(palette,
"palette") = -1;
283
284 zap(argc, argv);
285 }
286 catch(const exception &error) {
287 FATAL(error.what() << endl);
288 }
289
290
291 gROOT->SetBatch(batch);
292
293 TApplication* tp = new TApplication("user", NULL, NULL);
294 TCanvas* cv =
new TCanvas(
"c1",
"c1", canvas.
x, canvas.
y);
295
296 unique_ptr<TStyle> gStyle(
new JStyle(
"gplot", cv->GetWw(), cv->GetWh(), parameters));
297
298 if (palette != -1) {
299 gStyle->SetPalette(palette);
300 }
301
302 gROOT->SetStyle("gplot");
303 gROOT->ForceStyle();
304
305
306 cv->SetFillStyle(4000);
307 cv->SetFillColor(kWhite);
308 cv->Divide(1,1);
309 cv->cd(1);
310
311 JMarkerAttributes::getInstance().setMarkerSize(markerSize);
312
313 Double_t
xmin = numeric_limits<double>::max();
314 Double_t
xmax = numeric_limits<double>::lowest();
315 Double_t ymin = numeric_limits<double>::max();
316 Double_t ymax = numeric_limits<double>::lowest();
317 Double_t zmin = numeric_limits<double>::max();
318 Double_t zmax = numeric_limits<double>::lowest();
319
321
322
323 JMaster master;
324
325 for (vector<JRootObjectID>::const_iterator input = inputFile.begin(); input != inputFile.end(); ++input) {
326
327 DEBUG(
"Input: " << *input << endl);
328
330
331 if (dir == NULL) {
332 ERROR(
"File: " << input->getFullFilename() <<
" not opened." << endl);
333 continue;
334 }
335
336 const TRegexp regexp(input->getObjectName());
337
338 TIter iter(dir->GetListOfKeys());
339
340 for (TKey* key; (key = (TKey*) iter.Next()) != NULL; ) {
341
342 const TString tag(key->GetName());
343
344 DEBUG(
"Key: " << tag <<
" match = " << tag.Contains(regexp) << endl);
345
346
347
348 if (tag.Contains(regexp) &&
isTObject(key)) {
349
350 if (title == JName_t) {
351 title = key->GetName();
352 } else if (title == JTitle_t) {
353 title = key->GetTitle();
354 }
355
357
358 try {
359
360 TH3& h3 = dynamic_cast<TH3&>(*object);
361
362 object = h3.Project3D(
project.c_str());
363 }
364 catch(exception&) {}
365
366 try {
367
368 TH2& h2 = dynamic_cast<TH2&>(*object);
369
370 h2.SetStats(stats != -1);
371
372 xmin = min(xmin, h2.GetXaxis()->GetXmin());
373 xmax = max(xmax, h2.GetXaxis()->GetXmax());
374 ymin = min(ymin, h2.GetYaxis()->GetXmin());
375 ymax = max(ymax, h2.GetYaxis()->GetXmax());
376 zmin = min(zmin, logz ? h2.GetMinimum(0.0) : h2.GetMinimum());
377 zmax = max(zmax, h2.GetMaximum());
378 }
379 catch(exception&) {}
380
381 try {
382
383 TGraph&
g1 =
dynamic_cast<TGraph&
>(*object);
384
385 for (Int_t i = 0; i !=
g1.GetN(); ++i) {
386 xmin = min(xmin,
g1.GetX()[i] - numeric_limits<float>::epsilon());
387 xmax = max(xmax,
g1.GetX()[i] + numeric_limits<float>::epsilon());
388 ymin = min(ymin,
g1.GetY()[i] - numeric_limits<float>::epsilon());
389 ymax = max(ymax,
g1.GetY()[i] + numeric_limits<float>::epsilon());
390 }
391
392 int ng = 0;
393
395 if (dynamic_cast<TGraph*>(i->get()) != NULL) {
396 ++ng;
397 }
398 }
399
400 static_cast<TAttMarker&
>(
g1) = JMarkerAttributes::getInstance().get(ng);
401 }
402 catch(exception&) {}
403
404 try {
405
406 TGraph2D& g2 = dynamic_cast<TGraph2D&>(*object);
407
408 for (Int_t i = 0; i != g2.GetN(); ++i) {
409 if (!logz || g2.GetZ()[i] > 0.0) {
410 xmin = min(xmin, g2.GetX()[i]);
411 xmax = max(xmax, g2.GetX()[i]);
412 ymin = min(ymin, g2.GetY()[i]);
413 ymax = max(ymax, g2.GetY()[i]);
414 zmin = min(zmin, g2.GetZ()[i]);
415 zmax = max(zmax, g2.GetZ()[i]);
416 }
417 }
418
419 if (Z.is_valid()) {
420 g2.SetMinimum(Z.getLowerLimit());
421 g2.SetMaximum(Z.getUpperLimit());
422 }
423 }
424 catch(exception&) {}
425
426 try {
427
428 TF2& f2 = dynamic_cast<TF2&>(*object);
429
430 f2.SetLineColor(kRed);
431 f2.SetTitle((title + ";" + xLabel + ";" + yLabel + ";" + zLabel).c_str());
432
433 double __xmin;
434 double __xmax;
435 double __ymin;
436 double __ymax;
437
438 f2.GetRange(__xmin, __ymin, __xmax, __ymax);
439
440 xmin = min(xmin, __xmin);
441 xmax = max(xmax, __xmax);
442 ymin = min(ymin, __ymin);
443 ymax = max(ymax, __ymax);
444 zmin = min(zmin, f2.GetMinimum());
445 zmax = max(zmax, f2.GetMaximum());
446 }
447 catch(exception&) {}
448
449
450
451 for (TString buffer[] = { object.getLabel(), input->getFilename().c_str(), "" }, *i = buffer; *i != ""; ++i) {
452
453 *i = (*i)(TRegexp("\\[.*\\]"));
454
455 if ((*i).Length() > 2) {
456 object.setLabel((*i)(1, (*i).Length() - 2));
457 }
458 }
459
460 if (dynamic_cast<TH2*> (object.get()) != NULL ||
461 dynamic_cast<TGraph*> (object.get()) != NULL ||
462 dynamic_cast<TGraph2D*>(object.get()) != NULL ||
463 dynamic_cast<TEllipse*>(object.get()) != NULL ||
464 dynamic_cast<TLine*> (object.get()) != NULL ||
465 dynamic_cast<TText*> (object.get()) != NULL ||
466 dynamic_cast<TF2*> (object.get()) != NULL) {
467
468 DEBUG(
"Add object: " << tag <<
" with label <" <<
object.
getLabel() <<
">" << endl);
469
470 if (master == NULL) {
471
472 master = object.get();
473 }
474
475 listOfObjects.push_back(object);
476
477 } else {
478 ERROR(
"For other objects than 2D histograms, use JPlot1D" << endl);
479 }
480 }
481 }
482 }
483
484 if (listOfObjects.empty()) {
485 ERROR(
"Nothing to draw." << endl);
486 }
487
488
489
490 cv->cd(1);
491
492 if (option.find("COLZ") != string::npos ||
493 option.find("colz") != string::npos) {
494 gPad->SetRightMargin(0.20);
495 }
496
497 if (X.is_valid()) {
498 xmin = X.getLowerLimit();
499 xmax = X.getUpperLimit();
500 }
501
502 if (Y.is_valid()) {
503 ymin = Y.getLowerLimit();
504 ymax = Y.getUpperLimit();
505 }
506
507 if (Z.is_valid()) {
508 zmin = Z.getLowerLimit();
509 zmax = Z.getUpperLimit();
510 } else if (zmax > zmin) {
512 }
513
514 if (!listOfObjects.empty()) {
515
516 if (master == NULL) {
517
518 master = new TH2D(MASTER.c_str(), NULL,
519 100, xmin, xmax,
520 100, ymin, ymax);
521
522 master->SetStats(kFALSE);
523 }
524 }
525
526 if (master == NULL) {
527
528 TText* p = new TText(0.5, 0.5, "No data");
529
530 p->SetTextAlign(21);
531 p->SetTextAngle(45);
532 p->Draw();
533
534 } else {
535
536 if (logx) { gPad->SetLogx(); }
537 if (logy) { gPad->SetLogy(); }
538 if (logz) { gPad->SetLogz(); }
539
540 master->SetTitle(title.c_str());
541
542 master->GetXaxis()->SetRangeUser(xmin, xmax);
543 master->GetYaxis()->SetRangeUser(ymin, ymax);
544
547
548 if (logx > 2) { master->GetXaxis()->SetNoExponent(); }
549 if (logy > 2) { master->GetYaxis()->SetNoExponent(); }
550
551 master->SetMinimum(zmin);
552 master->SetMaximum(zmax);
553
554 if (xLabel != "") { master->GetXaxis()->SetTitle(xLabel.c_str()); master->GetXaxis()->CenterTitle(true); }
555 if (yLabel != "") { master->GetYaxis()->SetTitle(yLabel.c_str()); master->GetYaxis()->CenterTitle(true); }
556 if (zLabel != "") { master->GetZaxis()->SetTitle(zLabel.c_str()); master->GetZaxis()->CenterTitle(true); }
557
558 master->GetXaxis()->SetMoreLogLabels((logx == 1 && log10(xmax/xmin) < 2) ||
559 (logx > 1 && xmax-xmin < 2));
560 master->GetYaxis()->SetMoreLogLabels((logy == 1 && log10(ymax/ymin) < 2) ||
561 (logy > 1 && ymax-ymin < 2));
562
564 master->SetNdivisions(i->second, i->first.c_str());
565 }
566
567 DEBUG(
"Draw " << master->GetName() <<
' ' << option << endl);
568
569 master->Draw(option.c_str());
570 }
571
572 if (logx > 1 || logy > 1) {
574 if (dynamic_cast<TH2*>(i->get()) != master) {
575 if (logx > 1) {
576 if (setLogX<TH2> (i->get())) {}
577 else if (setLogX<TF2> (i->get())) {}
578 else if (setLogX<TGraph2DErrors>(i->get())) {}
579 else if (setLogX<TGraph2D> (i->get())) {}
580 else if (setLogX<TGraphErrors> (i->get())) {}
581 else if (setLogX<TGraph> (i->get())) {}
582 else if (setLogX<TLine> (i->get())) {}
583 else if (setLogX<TEllipse> (i->get())) {}
584 }
585 if (logy > 1) {
586 if (setLogY<TH2> (i->get())) {}
587 else if (setLogY<TF2> (i->get())) {}
588 else if (setLogY<TGraph2DErrors>(i->get())) {}
589 else if (setLogY<TGraph2D> (i->get())) {}
590 else if (setLogY<TGraphErrors> (i->get())) {}
591 else if (setLogY<TGraph> (i->get())) {}
592 else if (setLogY<TLine> (i->get())) {}
593 else if (setLogY<TEllipse> (i->get())) {}
594 }
595 }
596 }
597 }
598
599 if (grid.count('x') || grid.count('X')) { gPad->SetGridx(); }
600 if (grid.count('y') || grid.count('Y')) { gPad->SetGridy(); }
601
602 if (stats != -1)
603 gStyle->SetOptStat(stats);
604 else
605 gStyle->SetOptFit(kFALSE);
606
607
609
610 if (i->get() != master) {
611
612 DEBUG(
"Draw " << (*i)->GetName() <<
' ' << (*i)->GetTitle() << endl);
613
614 string buffer(option);
615
616 buffer += "SAME";
617
618 try {
619
620 TH2& h2 = dynamic_cast<TH2&>(*(*i));
621
622 h2.SetMinimum(zmin);
623 h2.SetMaximum(zmax);
624 }
625 catch(exception&) {}
626
627 try {
628
629 TGraph&
g1 =
dynamic_cast<TGraph&
>(*(*i));
630
631 buffer = "P";
632 }
633 catch(exception&) {}
634
635 try {
636
637 TGraph2D& g2 = dynamic_cast<TGraph2D&>(*(*i));
638
639 g2.SetMinimum(zmin);
640 g2.SetMaximum(zmax);
641 }
642 catch(exception&) {}
643
644 try {
645
646 TF2& f2 = dynamic_cast<TF2&>(*(*i));
647
648 f2.SetNpx(1000);
649 f2.SetNpy(1000);
650
651
652
653
654 }
655 catch(exception&) {}
656
657 (*i)->Draw(buffer.c_str());
658 }
659 }
660
661
662
663 cv->Update();
664
667 }
668
669 if (!batch) {
670 tp->Run();
671 }
672
673 return (master != NULL ? 0 : 1);
674}
#define DEBUG(A)
Message macros.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Double_t g1(const Double_t x)
Function.
Utility class to parse parameter values.
Auxiliary data structure for TObject with a user defined label.
Auxiliary class to handle multiple boolean-like I/O.
Utility class to parse command line options.
Data structure for size of TCanvas.
int y
number of pixels in Y
int x
number of pixels in X
Wrapper class around ROOT TStyle.
std::string getLabel(const JLocation &location)
Get module label for monitoring and other applications.
void setLogarithmicX(TList *list)
Make x-axis of objects in list logarithmic (e.g. after using log10()).
void setRange(double &xmin, double &xmax, const bool logx)
Set axis range.
TDirectory * getDirectory(const JRootObjectID &id)
Get TDirectory pointer.
void setLogarithmicY(TList *list)
Make y-axis of objects in list logarithmic (e.g. after using log10()).
bool isTObject(const TKey *key)
Check if given key corresponds to a TObject.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
JProperties getProperties()
Get properties of this class.