10 #include "TApplication.h"
14 #include "TAttMarker.h"
20 #include "TGraphErrors.h"
22 #include "TGraph2DErrors.h"
52 inline bool setLogX(
TObject*
object)
56 T* p =
dynamic_cast<T*
>(object);
75 inline bool setLogY(
TObject*
object)
79 T* p =
dynamic_cast<T*
>(object);
91 const std::string MASTER =
"__H__";
93 const char*
const JName_t =
"?";
94 const char*
const JTitle_t =
"%";
108 bool equals(
const JMaster& master)
const
110 return (this->h2 == master.h2 &&
111 this->g2 == master.g2);
116 return (this->h2 ==
dynamic_cast<const TH2*
>(p) &&
117 this->g2 ==
dynamic_cast<const TGraph2D*
>(p));
120 JMaster* operator->()
127 h2 =
dynamic_cast<TH2*
> (p);
128 g2 =
dynamic_cast<TGraph2D*
>(p);
131 const char* GetName()
const
133 return (h2 != NULL ? h2->GetName() :
134 g2 != NULL ? g2->GetName() :
138 void SetTitle(
const char* title)
140 if (h2 != NULL) { h2->SetTitle(title); }
141 if (g2 != NULL) { g2->SetTitle(title); }
144 void SetStats(
const Bool_t stats)
146 if (h2 != NULL) { h2->SetStats(stats); }
149 void SetMaximum(Double_t maximum)
151 if (h2 != NULL) { h2->SetMaximum(maximum); }
152 if (g2 != NULL) { g2->SetMaximum(maximum); }
155 void SetMinimum(Double_t minimum)
157 if (h2 != NULL) { h2->SetMinimum(minimum); }
158 if (g2 != NULL) { g2->SetMinimum(minimum); }
161 void SetNdivisions(Int_t
n, Option_t *axis)
163 if (h2 != NULL) { h2->SetNdivisions(
n, axis); }
168 return (h2 != NULL ? h2->GetXaxis() :
169 g2 != NULL ? g2->GetXaxis() :
175 return (h2 != NULL ? h2->GetYaxis() :
176 g2 != NULL ? g2->GetYaxis() :
182 return (h2 != NULL ? h2->GetZaxis() :
183 g2 != NULL ? g2->GetZaxis() :
187 void Draw(Option_t *option=
"")
189 if (h2 != NULL) { h2->Draw(option); }
190 if (g2 != NULL) { g2->Draw(option); }
210 inline void setLogarithmicX(JMaster& master) { master.setLogarithmicX(); }
211 inline void setLogarithmicY(JMaster& master) { master.setLogarithmicY(); }
221 int main(
int argc,
char **argv)
256 JParser<> zap(
"General purpose plot program for 2D ROOT objects.");
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;
286 catch(
const exception &error) {
287 FATAL(error.what() << endl);
291 gROOT->SetBatch(batch);
293 TApplication* tp =
new TApplication(
"user", NULL, NULL);
294 TCanvas* cv =
new TCanvas(
"c1",
"c1", canvas.
x, canvas.
y);
296 unique_ptr<TStyle> gStyle(
new JStyle(
"gplot", cv->GetWw(), cv->GetWh(), parameters));
299 gStyle->SetPalette(palette);
302 gROOT->SetStyle(
"gplot");
306 cv->SetFillStyle(4000);
307 cv->SetFillColor(kWhite);
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();
327 DEBUG(
"Input: " << *input << endl);
332 ERROR(
"File: " << input->getFullFilename() <<
" not opened." << endl);
336 const TRegexp regexp(input->getObjectName());
338 TIter iter(dir->GetListOfKeys());
340 for (TKey* key; (key = (TKey*) iter.Next()) != NULL; ) {
342 const TString tag(key->GetName());
344 DEBUG(
"Key: " << tag <<
" match = " << tag.Contains(regexp) << endl);
348 if (tag.Contains(regexp) &&
isTObject(key)) {
350 if (title == JName_t) {
351 title = key->GetName();
352 }
else if (title == JTitle_t) {
353 title = key->GetTitle();
360 TH3& h3 =
dynamic_cast<TH3&
>(*object);
362 object = h3.Project3D(
project.c_str());
368 TH2& h2 =
dynamic_cast<TH2&
>(*object);
370 h2.SetStats(stats != -1);
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());
383 TGraph&
g1 =
dynamic_cast<TGraph&
>(*object);
385 for (Int_t i = 0; i !=
g1.GetN(); ++i) {
395 if (
dynamic_cast<TGraph*
>(i->get()) != NULL) {
406 TGraph2D& g2 =
dynamic_cast<TGraph2D&
>(*object);
408 for (Int_t i = 0; i != g2.GetN(); ++i) {
409 if (!logz || g2.GetZ()[i] > 0.0) {
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]);
428 TF2& f2 =
dynamic_cast<TF2&
>(*object);
430 f2.SetLineColor(kRed);
431 f2.SetTitle((title +
";" + xLabel +
";" + yLabel +
";" + zLabel).c_str());
438 f2.GetRange(__xmin, __ymin, __xmax, __ymax);
442 ymin = min(ymin, __ymin);
443 ymax = max(ymax, __ymax);
444 zmin = min(zmin, f2.GetMinimum());
445 zmax = max(zmax, f2.GetMaximum());
451 for (TString buffer[] = {
object.getLabel(), input->getFilename().c_str(),
"" }, *i = buffer; *i !=
""; ++i) {
453 *i = (*i)(TRegexp(
"\\[.*\\]"));
455 if ((*i).Length() > 2) {
456 object.setLabel((*i)(1, (*i).Length() - 2));
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) {
468 DEBUG(
"Add object: " << tag <<
" with label <" <<
object.
getLabel() <<
">" << endl);
470 if (master == NULL) {
472 master =
object.get();
475 listOfObjects.push_back(
object);
478 ERROR(
"For other objects than 2D histograms, use JPlot1D" << endl);
484 if (listOfObjects.empty()) {
485 ERROR(
"Nothing to draw." << endl);
492 if (option.find(
"COLZ") != string::npos ||
493 option.find(
"colz") != string::npos) {
494 gPad->SetRightMargin(0.20);
510 }
else if (zmax > zmin) {
514 if (!listOfObjects.empty()) {
516 if (master == NULL) {
518 master =
new TH2D(MASTER.c_str(), NULL,
522 master->SetStats(kFALSE);
526 if (master == NULL) {
528 TText* p =
new TText(0.5, 0.5,
"No data");
536 if (logx) { gPad->SetLogx(); }
537 if (logy) { gPad->SetLogy(); }
538 if (logz) { gPad->SetLogz(); }
540 master->GetXaxis()->SetRangeUser(
xmin,
xmax);
541 master->GetYaxis()->SetRangeUser(ymin, ymax);
546 master->SetTitle(title.c_str());
548 master->SetMinimum(zmin);
549 master->SetMaximum(zmax);
551 if (xLabel !=
"") { master->GetXaxis()->SetTitle(xLabel.c_str()); master->GetXaxis()->CenterTitle(
true); }
552 if (yLabel !=
"") { master->GetYaxis()->SetTitle(yLabel.c_str()); master->GetYaxis()->CenterTitle(
true); }
553 if (zLabel !=
"") { master->GetZaxis()->SetTitle(zLabel.c_str()); master->GetZaxis()->CenterTitle(
true); }
555 master->GetXaxis()->SetMoreLogLabels((logx == 1 && log10(
xmax/
xmin) < 2) ||
557 master->GetYaxis()->SetMoreLogLabels((logy == 1 && log10(ymax/ymin) < 2) ||
558 (logy > 1 && ymax-ymin < 2));
561 master->SetNdivisions(i->second, i->first.c_str());
564 DEBUG(
"Draw " << master->GetName() <<
' ' << option << endl);
566 master->Draw(option.c_str());
569 if (logx > 1 || logy > 1) {
571 if (
dynamic_cast<TH2*
>(i->get()) != master) {
573 if (setLogX<TH2> (i->get())) {}
574 else if (setLogX<TF2> (i->get())) {}
575 else if (setLogX<TGraph2DErrors>(i->get())) {}
576 else if (setLogX<TGraph2D> (i->get())) {}
577 else if (setLogX<TGraphErrors> (i->get())) {}
578 else if (setLogX<TGraph> (i->get())) {}
579 else if (setLogX<TLine> (i->get())) {}
580 else if (setLogX<TEllipse> (i->get())) {}
583 if (setLogY<TH2> (i->get())) {}
584 else if (setLogY<TF2> (i->get())) {}
585 else if (setLogY<TGraph2DErrors>(i->get())) {}
586 else if (setLogY<TGraph2D> (i->get())) {}
587 else if (setLogY<TGraphErrors> (i->get())) {}
588 else if (setLogY<TGraph> (i->get())) {}
589 else if (setLogY<TLine> (i->get())) {}
590 else if (setLogY<TEllipse> (i->get())) {}
596 if (grid.count(
'x') || grid.count(
'X')) { gPad->SetGridx(); }
597 if (grid.count(
'y') || grid.count(
'Y')) { gPad->SetGridy(); }
600 gStyle->SetOptStat(stats);
602 gStyle->SetOptFit(kFALSE);
607 if (i->get() != master) {
609 DEBUG(
"Draw " << (*i)->GetName() <<
' ' << (*i)->GetTitle() << endl);
611 string buffer(option);
617 TH2& h2 =
dynamic_cast<TH2&
>(*(*i));
626 TGraph&
g1 =
dynamic_cast<TGraph&
>(*(*i));
634 TGraph2D& g2 =
dynamic_cast<TGraph2D&
>(*(*i));
643 TF2& f2 =
dynamic_cast<TF2&
>(*(*i));
654 (*i)->Draw(buffer.c_str());
670 return (master != NULL ? 0 : 1);
General purpose messaging.
#define DEBUG(A)
Message macros.
Utility class to parse command line options.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
int main(int argc, char **argv)
Utility class to parse parameter values.
Double_t g1(const Double_t x)
Function.
Auxiliary class to define a range between two values.
Utility class to parse parameter values.
Auxiliary data structure for TObject with a user defined label.
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.
void setLogarithmicY(TList *list)
Make y-axis of objects in list logarithmic (e.g. after using log10()).
TDirectory * getDirectory(const JRootObjectID &id)
Get TDirectory pointer.
bool isTObject(const TKey *key)
Check if given key corresponds to a TObject.
T & getInstance(const T &object)
Get static instance from temporary object.
bool equals(const JFirst_t &first, const JSecond_t &second, const double precision=std::numeric_limits< double >::min())
Check equality.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Type definition of range.
Template definition of auxiliary base class for comparison of data structures.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
JProperties getProperties()
Get properties of this class.