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 =
"%";
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() :
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)
226 typedef JRange<double> JRange_t;
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();
356 JRootObject object(key->ReadObj());
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) {
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]);
420 g2.SetMinimum(
Z.getLowerLimit());
421 g2.SetMaximum(
Z.getUpperLimit());
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);
498 xmin =
X.getLowerLimit();
499 xmax =
X.getUpperLimit();
503 ymin =
Y.getLowerLimit();
504 ymax =
Y.getUpperLimit();
508 zmin =
Z.getLowerLimit();
509 zmax =
Z.getUpperLimit();
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);
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);
Utility class to parse command line options.
then echo Test string reversed by master(hit< return > to continue)." $DIR/JProcess -c "$DIR/JEcho" -rC fi if (( 1 ))
int main(int argc, char *argv[])
std::string getLabel(const JLocation &location)
Get module label for monitoring and other applications.
Utility class to parse parameter values.
*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
then usage $script< detector file >< detectorfile > nIf the range of floors is the first detector file is aligned to the second before the comparison nIn this
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
then fatal Wrong number of arguments fi set_variable STRING $argv[1] set_variable DETECTORXY_TXT $WORKDIR $DETECTORXY_TXT tail read X Y CHI2 RMS printf optimum n $X $Y $CHI2 $RMS awk v Y
Utility class to parse parameter values.
void setLogarithmicX(TList *list)
Make x-axis of objects in list logarithmic (e.g. after using log10()).
T & getInstance(const T &object)
Get static instance from temporary object.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
set_variable E_E log10(E_{fit}/E_{#mu})"
do set_variable OUTPUT_DIRECTORY $WORKDIR T
Template definition of auxiliary base class for comparison of data structures.
General purpose messaging.
void setLogarithmicY(TList *list)
Make y-axis of objects in list logarithmic (e.g. after using log10()).
void setRange(double &xmin, double &xmax, const bool logx)
Set axis range.
Auxiliary class to define a range between two values.
Utility class to parse command line options.
Auxiliary class to handle multiple boolean-like I/O.
bool isTObject(const TKey *key)
Check if given key corresponds to a TObject.
no fit printf nominal n $STRING awk v X
TDirectory * getDirectory(const JRootObjectID &id)
Get TDirectory pointer.
do set_variable MODULE getModule a $WORKDIR detector_a datx L $STRING JEditDetector a $WORKDIR detector_a datx M $MODULE setz o $WORKDIR detector_a datx JEditDetector a $WORKDIR detector_b datx M $MODULE setz o $WORKDIR detector_b datx done echo Output stored at $WORKDIR detector_a datx and $WORKDIR tripod_a txt JDrawDetector2D a $WORKDIR detector_a datx a $WORKDIR detector_b datx L BL o detector $FORMAT $BATCH JDrawDetector2D T $WORKDIR tripod_a txt T $WORKDIR tripod_b txt L BL o tripod $FORMAT $BATCH JCompareDetector a $WORKDIR detector_a datx b $WORKDIR detector_b datx o $WORKDIR abc root &dev null for KEY in X Y Z
bool equals(const JFirst_t &first, const JSecond_t &second, const double precision=std::numeric_limits< double >::min())
Check equality.
#define DEBUG(A)
Message macros.
Double_t g1(const Double_t x)
Function.