Jpp  18.0.1-rc.2
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Functions
JPlot1D.cc File Reference

General purpose plot program for 1D ROOT objects. More...

#include <string>
#include <iostream>
#include <iomanip>
#include <vector>
#include <set>
#include <cmath>
#include <memory>
#include "TROOT.h"
#include "TFile.h"
#include "TClass.h"
#include "TApplication.h"
#include "TCanvas.h"
#include "TKey.h"
#include "TStyle.h"
#include "TAttMarker.h"
#include "TAttLine.h"
#include "TH1.h"
#include "TH2.h"
#include "TH3.h"
#include "TF1.h"
#include "TF2.h"
#include "THStack.h"
#include "TGraph.h"
#include "TGraphErrors.h"
#include "TMultiGraph.h"
#include "TProfile.h"
#include "TEllipse.h"
#include "TMarker.h"
#include "TLine.h"
#include "TLegend.h"
#include "TString.h"
#include "TRegexp.h"
#include "TText.h"
#include "JTools/JRange.hh"
#include "JLang/JSinglePointer.hh"
#include "JROOT/JStyle.hh"
#include "JROOT/JCanvas.hh"
#include "JROOT/JMarkerAttributes.hh"
#include "JROOT/JLineAttributes.hh"
#include "JROOT/JLegend.hh"
#include "JGizmo/JRootObjectID.hh"
#include "JGizmo/JRootObject.hh"
#include "JGizmo/JGizmoToolkit.hh"
#include "Jeep/JPrint.hh"
#include "Jeep/JParser.hh"
#include "Jeep/JMessage.hh"

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 

Detailed Description

General purpose plot program for 1D ROOT objects.

The option -f corresponds to <file name>:<object name>.

Author
mdejong

Definition in file JPlot1D.cc.

Function Documentation

int main ( int  argc,
char **  argv 
)

Definition at line 204 of file JPlot1D.cc.

205 {
206  using namespace std;
207  using namespace JPP;
208 
209  typedef JRange<double> JRange_t;
210 
211  vector<JRootObjectID> inputFile;
212  string outputFile;
213  JCanvas canvas;
214  int stats;
215  JLegend legend;
216  JRange_t X;
217  JRange_t Y;
218  JRange_t Z;
219  JCounter logx;
220  bool logy;
221  bool logz;
222  char project;
223  string xLabel;
224  string yLabel;
225  JCounter drawLine;
226  bool fillArea;
227  int lineWidth;
228  double markerSize;
229  string option;
230  set<char> grid;
231  bool batch;
232  string title;
233  map<string, int> Ndivisions;
234  int group;
235  int debug;
236  string xTimeFormat;
237 
238  try {
239 
240  JParser<> zap("General purpose plot program for 1D ROOT objects.");
241 
242  zap['f'] = make_field(inputFile, "<input file>:<object name>");
243  zap['o'] = make_field(outputFile, "graphics output") = "";
244  zap['w'] = make_field(canvas, "size of canvas <nx>x<ny> [pixels]") = JCanvas(500, 500);
245  zap['s'] = make_field(stats) = -1;
246  zap['L'] = make_field(legend, "position legend e.g. TR [factor]") = JLegend(), JLegend("TL"), JLegend("TR"), JLegend("BR"), JLegend("BL");
247  zap['x'] = make_field(X, "abscissa range") = JRange_t();
248  zap['y'] = make_field(Y, "ordinate range") = JRange_t();
249  zap['z'] = make_field(Z, "ordinate range of projection)") = JRange_t();
250  zap['X'] = make_field(logx, "logarithmic x-axis (-XX log10 axis)");
251  zap['Y'] = make_field(logy, "logarithmic y-axis");
252  zap['Z'] = make_field(logz, "logarithmic y-axis; after projection");
253  zap['P'] = make_field(project, "projection") = '\0', 'x', 'X', 'y', 'Y';
254  zap['>'] = make_field(xLabel, "x-axis label") = "";
255  zap['^'] = make_field(yLabel, "y-axis label") = "";
256  zap['C'] = make_field(drawLine, "draw line (-C black-and-white -CC colour)");
257  zap['F'] = make_field(fillArea, "fill area");
258  zap['l'] = make_field(lineWidth, "line width") = 2;
259  zap['S'] = make_field(markerSize, "marker size") = 1.0;
260  zap['O'] = make_field(option, "plotting option") = "";
261  zap['G'] = make_field(grid, "grid lines [X][Y]") = JPARSER::initialised();
262  zap['B'] = make_field(batch, "batch processing");
263  zap['T'] = make_field(title, "graphics title ("
264  << "\"" << JName_t << "\" -> ROOT name; "
265  << "\"" << JTitle_t << "\" -> ROOT title)") = "KM3NeT preliminary";
266  zap['N'] = make_field(Ndivisions, "axis divisioning (e.g. \"X 505\")") = JPARSER::initialised();
267  zap['g'] = make_field(group, "group colour codes of objects") = 1;
268  zap['t'] = make_field(xTimeFormat, "set time format for x-axis, e.g. \%d\\/\%m\\/\\%y%F1970-01-01 00:00:00") = "";
269  zap['d'] = make_field(debug) = 0;
270 
271  zap(argc, argv);
272  }
273  catch(const exception &error) {
274  FATAL(error.what() << endl);
275  }
276 
277 
278  gROOT->SetBatch(batch);
279 
280  TApplication* tp = new TApplication("user", NULL, NULL);
281  TCanvas* cv = new TCanvas("c1", "c1", canvas.x, canvas.y);
282 
283  JSinglePointer<TStyle> gStyle(new JStyle("gplot", cv->GetWw(), cv->GetWh()));
284 
285  gROOT->SetStyle("gplot");
286  gROOT->ForceStyle();
287 
288 
289  cv->SetFillStyle(4000);
290  cv->SetFillColor(kWhite);
291  cv->Divide(1,1);
292  cv->cd(1);
293 
294 
295  JMarkerAttributes::getInstance().setMarkerSize(markerSize);
296  JLineAttributes ::getInstance().setLineWidth (lineWidth);
297 
298 
299  Double_t xmin = numeric_limits<double>::max();
300  Double_t xmax = numeric_limits<double>::lowest();
301 
302  Double_t ymin = numeric_limits<double>::max();
303  Double_t ymax = numeric_limits<double>::lowest();
304 
305 
306  vector<JRootObject> listOfObjects;
307 
308  const bool px = (project == 'x' || project == 'X'); // projection on x-axis of (2|3)D histogram
309  const bool py = (project == 'y' || project == 'Y'); // projection on y-axis of (2|3)D histogram
310  const bool pz = (project == 'z' || project == 'Z'); // projection on z-axis of 3D histogram
311 
312  logy = (logy || logz);
313 
314  if (px) {
315  swap(Y, Z); // Y becomes range in TH2::ProjectionX() and Z becomes y-axis range
316  }
317 
318  if (py) {
319  swap(X, Z); // X becomes range in TH2::ProjectionY()
320  swap(Y, X); // Y becomes x-axis range and Z becomes y-axis range
321  }
322 
323  TH1* master = NULL;
324 
325  for (vector<JRootObjectID>::const_iterator input = inputFile.begin(); input != inputFile.end(); ++input) {
326 
327  DEBUG("Input: " << *input << endl);
328 
329  TDirectory* dir = getDirectory(*input);
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  // option match
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 
356  JRootObject object(key->ReadObj());
357 
358  TAttMarker marker = JMarkerAttributes::getInstance().get(0);
359  TAttLine line = JLineAttributes ::getInstance().get(0);
360 
361  if (group > 1)
362  marker.SetMarkerColor(JMarkerAttributes::getInstance().get(listOfObjects.size()/group).GetMarkerColor());
363  else
364  marker = JMarkerAttributes::getInstance().get(listOfObjects.size());
365 
366  if (drawLine == 1)
367  line = JLineAttributes::getInstance().get(listOfObjects.size());
368  else
369  line.SetLineColor(marker.GetMarkerColor());
370 
371  // projections
372 
373  try {
374 
375  TProfile& h1 = dynamic_cast<TProfile&>(*object);
376 
377  object = h1.ProjectionX();
378  }
379  catch(exception&) {}
380 
381  try {
382 
383  TH2& h2 = dynamic_cast<TH2&>(*object);
384 
385  if (px) {
386 
387  if (Z != JRange_t())
388  object = h2.ProjectionX(MAKE_CSTRING(h2.GetName() << "_px" << LABEL_TERMINATOR << listOfObjects.size()),
389  h2.GetYaxis()->FindBin(Z.getLowerLimit()),
390  h2.GetYaxis()->FindBin(Z.getUpperLimit()) - 1);
391  else
392  object = h2.ProjectionX(MAKE_CSTRING(h2.GetName() << "_px" << LABEL_TERMINATOR << listOfObjects.size()),
393  1,
394  h2.GetYaxis()->GetNbins());
395 
396  } else if (py) {
397 
398  if (Z != JRange_t())
399  object = h2.ProjectionY(MAKE_CSTRING(h2.GetName() << "_py" << LABEL_TERMINATOR << listOfObjects.size()),
400  h2.GetXaxis()->FindBin(Z.getLowerLimit()),
401  h2.GetXaxis()->FindBin(Z.getUpperLimit()) - 1);
402  else
403  object = h2.ProjectionY(MAKE_CSTRING(h2.GetName() << "_py" << LABEL_TERMINATOR << listOfObjects.size()),
404  1,
405  h2.GetXaxis()->GetNbins());
406 
407  } else {
408 
409  ERROR("For 2D histograms, use option option -P for projections or use JPlot2D" << endl);
410 
411  continue;
412  }
413  }
414  catch(exception&) {}
415 
416  try {
417 
418  TH3& h3 = dynamic_cast<TH3&>(*object);
419 
420  if (px) {
421 
422  object = h3.ProjectionX(MAKE_CSTRING(h3.GetName() << "_px" << LABEL_TERMINATOR << listOfObjects.size()));
423 
424  } else if (py) {
425 
426  object = h3.ProjectionY(MAKE_CSTRING(h3.GetName() << "_py" << LABEL_TERMINATOR << listOfObjects.size()));
427 
428  } else if (pz) {
429 
430  object = h3.ProjectionZ(MAKE_CSTRING(h3.GetName() << "_pz" << LABEL_TERMINATOR << listOfObjects.size()));
431 
432  } else {
433 
434  ERROR("For 3D histograms, use option option -P for projections or use JPlot2D -P <projection>" << endl);
435 
436  continue;
437  }
438  }
439  catch(exception&) {}
440 
441  // colouring
442 
443  try {
444  if (dynamic_cast<TMarker*>(object.get()) == NULL) {
445  dynamic_cast<TAttMarker&>(*object) = marker;
446  }
447  }
448  catch(exception&) {}
449 
450  try {
451  if (dynamic_cast<TLine*>(object.get()) == NULL) {
452  dynamic_cast<TAttLine&> (*object) = line;
453  }
454  }
455  catch(exception&) {}
456 
457  if (fillArea) {
458 
459  try {
460 
461  TAttFill& fill = dynamic_cast<TAttFill&>(*object);
462 
463  fill.SetFillColor(marker.GetMarkerColor());
464  }
465  catch(exception&) {}
466  }
467 
468  // set errors
469 
470  if (drawLine) {
471 
472  try {
473 
474  TH1& h1 = dynamic_cast<TH1&>(*object);
475 
476  for (int i = 1; i <= h1.GetNbinsX(); ++i) {
477  h1.SetBinError(i, 0.0);
478  }
479  }
480  catch(exception&) {}
481 
482  try {
483 
484  TGraphErrors& g1 = dynamic_cast<TGraphErrors&>(*object);
485 
486  for (Int_t i = 0; i != g1.GetN(); ++i) {
487  g1.GetEX()[i] = 0.0;
488  g1.GetEY()[i] = 0.0;
489  }
490  }
491  catch(exception&) {}
492  }
493 
494  // min-max
495 
496  try {
497 
498  TH1& h1 = dynamic_cast<TH1&>(*object);
499 
500  h1.SetStats(stats != -1);
501 
502  xmin = min(xmin, h1.GetXaxis()->GetXmin());
503  xmax = max(xmax, h1.GetXaxis()->GetXmax());
504  ymin = min(ymin, logy ? h1.GetMinimum(0.0) : h1.GetMinimum());
505  ymax = max(ymax, h1.GetMaximum());
506 
507  if (!logy && h1.GetListOfFunctions() != NULL) {
508  for (unique_ptr<TIterator> iterator(h1.GetListOfFunctions()->MakeIterator()); TF1* f1 = (TF1*) iterator->Next(); ) {
509  ymin = min(ymin, f1->GetMinimum(h1.GetXaxis()->GetXmin(), h1.GetXaxis()->GetXmax()));
510  ymax = max(ymax, f1->GetMaximum(h1.GetXaxis()->GetXmin(), h1.GetXaxis()->GetXmax()));
511  }
512  }
513  }
514  catch(exception&) {}
515 
516  try {
517 
518  TGraph& g1 = dynamic_cast<TGraph&>(*object);
519 
520  for (Int_t i = 0; i != g1.GetN(); ++i) {
521 
522  xmin = min(xmin, g1.GetX()[i]);
523  xmax = max(xmax, g1.GetX()[i]);
524 
525  if (!logy || g1.GetY()[i] > 0.0) {
526  ymin = min(ymin, g1.GetY()[i]);
527  ymax = max(ymax, g1.GetY()[i]);
528  }
529  }
530  }
531  catch(exception&) {}
532 
533  try {
534 
535  TGraphErrors& g1 = dynamic_cast<TGraphErrors&>(*object);
536 
537  for (Int_t i = 0; i != g1.GetN(); ++i) {
538  if (!logy || g1.GetY()[i] - g1.GetEY()[i] > 0.0) { ymin = min(ymin, g1.GetY()[i] - g1.GetEY()[i]); }
539  if (!logy || g1.GetY()[i] + g1.GetEY()[i] > 0.0) { ymax = max(ymax, g1.GetY()[i] + g1.GetEY()[i]); }
540  }
541  }
542  catch(exception&) {}
543 
544  try {
545 
546  TMultiGraph& m1 = dynamic_cast<TMultiGraph&>(*object);
547 
548  for (TIter i1(m1.GetListOfGraphs()); TGraph* g1 = dynamic_cast<TGraph*>(i1()); ) {
549 
550  for (Int_t i = 0; i != g1->GetN(); ++i) {
551 
552  xmin = min(xmin, g1->GetX()[i]);
553  xmax = max(xmax, g1->GetX()[i]);
554 
555  if (!logy || g1->GetY()[i] > 0.0) {
556  ymin = min(ymin, g1->GetY()[i]);
557  ymax = max(ymax, g1->GetY()[i]);
558  }
559  }
560  }
561  }
562  catch(exception&) {}
563 
564  try {
565 
566  TF2& f2 = dynamic_cast<TF2&>(*object);
567  TF1* f1 = NULL;
568 
569  TString formula = f2.GetExpFormula();
570  TString _z_ = TString::Format("%f", 0.5 * (Z.getLowerLimit() + Z.getUpperLimit()));
571 
572  double __xmin;
573  double __xmax;
574  double __ymin;
575  double __ymax;
576 
577  f2.GetRange(__xmin, __ymin, __xmax, __ymax);
578 
579  if (px) {
580 
581  formula.ReplaceAll("y", _z_);
582 
583  f1 = new TF1(MAKE_CSTRING(f2.GetName() << "_px" << LABEL_TERMINATOR << listOfObjects.size()), formula);
584 
585  f1->SetRange(__xmin, __xmax);
586 
587  } else if (py) {
588 
589  formula.ReplaceAll("x", _z_);
590  formula.ReplaceAll("y", "x");
591 
592  f1 = new TF1(MAKE_CSTRING(f2.GetName() << "_py" << LABEL_TERMINATOR << listOfObjects.size()), formula);
593 
594  f1->SetRange(__ymin, __ymax);
595 
596  } else {
597 
598  ERROR("For 2D functions, use option option -P for projections or use JPlot2D" << endl);
599 
600  continue;
601  }
602 
603  DEBUG("TF1: " << f1->GetExpFormula() << endl);
604 
605  f1->SetParameters(f2.GetParameters());
606 
607  object = f1;
608  }
609  catch(exception&) {}
610 
611  try {
612 
613  TF1& f1 = dynamic_cast<TF1&>(*object);
614 
615  double __xmin;
616  double __xmax;
617 
618  f1.GetRange(__xmin, __xmax);
619 
620  xmin = min(xmin, __xmin);
621  xmax = max(xmax, __xmax);
622  ymin = min(ymin, f1.GetMinimum());
623  ymax = max(ymax, f1.GetMaximum());
624  }
625  catch(exception&) {}
626 
627  try {
628 
629  THStack& hs = dynamic_cast<THStack&>(*object);
630 
631  NOTICE("THStack" << endl);
632 
633  unique_ptr<TIterator> iterator(hs.GetHists()->MakeIterator());
634 
635  for (size_t index = 1; TObject* i = iterator->Next(); ++index) {
636 
637  TH1& h1 = dynamic_cast<TH1&>(*i);
638 
639  NOTICE("TH1[" << index << "] " << h1.GetName() << endl);
640 
641  xmin = min(xmin, h1.GetXaxis()->GetXmin());
642  xmax = max(xmax, h1.GetXaxis()->GetXmax());
643 
644  ymin = min(ymin, logy ? h1.GetMinimum(0.0) : h1.GetMinimum());
645  ymax = max(ymax, h1.GetMaximum());
646 
647  h1.SetLineWidth(1);
648  h1.SetLineColor(kBlack);
649 
650  h1.SetFillColor(JMarkerAttributes::getInstance().get(index).GetMarkerColor());
651  }
652  }
653  catch(exception&) {}
654 
655  try {
656 
657  TLine& h1 = dynamic_cast<TLine&>(*object);
658 
659  xmin = min(xmin, h1.GetX1());
660  xmax = max(xmax, h1.GetX2());
661  ymin = min(ymin, h1.GetY1());
662  ymax = max(ymax, h1.GetY2());
663  }
664  catch(exception&) {}
665 
666  // label
667 
668  for (TString buffer[] = { object.getLabel(), input->getFilename().c_str(), "" }, *i = buffer; *i != ""; ++i) {
669 
670  *i = (*i)(TRegexp("\\[.*\\]"));
671 
672  if (i->Length() > 2) {
673  object.setLabel((*i)(1, i->Length() - 2));
674  }
675  }
676 
677  DEBUG("Add object: " << tag << " with label <" << object.getLabel() << ">" << endl);
678 
679  if (master == NULL) {
680  master = dynamic_cast<TH1*>(object.get());
681  }
682 
683  listOfObjects.push_back(object);
684  }
685  }
686  }
687 
688  if (listOfObjects.empty()) {
689  ERROR("Nothing to draw." << endl);
690  }
691 
692  for (vector<JRootObject>::iterator i = listOfObjects.begin(); i != listOfObjects.end(); ++i) {
693 
694  // set line attributes of associated functions
695  // for single objects, change colour if same range else change style
696  // for multiple objecs, keep colour and change style
697 
698  TH1* h1 = dynamic_cast<TH1*> (i->get());
699  TGraph* g1 = dynamic_cast<TGraph*> (i->get());
700  TMultiGraph* m1 = dynamic_cast<TMultiGraph*>(i->get());
701  TAttLine* ls = dynamic_cast<TAttLine*> (i->get());
702 
703  TList list;
704 
705  unique_ptr<TIterator> iterator;
706 
707  if (h1 != NULL) {
708 
709  iterator.reset(h1->GetListOfFunctions()->MakeIterator());
710 
711  } else if (g1 != NULL) {
712 
713  iterator.reset(g1->GetListOfFunctions()->MakeIterator());
714 
715  } else if (m1 != NULL) {
716 
717  for (TIter i1(m1->GetListOfGraphs()); TGraph* gi = dynamic_cast<TGraph*>(i1()); ) {
718  for (TIter i2(gi->GetListOfFunctions()); TF1* fi = dynamic_cast<TF1*>(i2()); ) {
719  list.Add(fi);
720  }
721  }
722 
723  iterator.reset(list.MakeIterator());
724  }
725 
726  if (iterator != NULL) {
727 
728  Double_t x1[] = { numeric_limits<Double_t>::max(), numeric_limits<Double_t>::max() };
729  Double_t x2[] = { numeric_limits<Double_t>::lowest(), numeric_limits<Double_t>::lowest() };
730 
731  for (int nf = 0, ns = 0, nc = 1; TF1* f1 = (TF1*) iterator->Next(); ++nf) {
732 
733  f1->GetRange(x1[1], x2[1]);
734  f1->SetNpx(5000);
735 
736  dynamic_cast<TAttLine&>(*f1) = JLineAttributes::getInstance().get(0);
737 
738  if (listOfObjects.size() == 1) {
739 
740  if (x1[0] == x1[1] &&
741  x2[0] == x2[1])
742  ++nc; // change colour
743  else if (nf != 0)
744  ++ns; // change style
745 
746  f1->SetLineStyle(JLineAttributes ::getInstance().get(ns).GetLineStyle());
747  f1->SetLineColor(JMarkerAttributes::getInstance().get(nc).GetMarkerColor());
748 
749  } else {
750 
751  // keep colour of base object and accordingly modify line style.
752 
753  f1->SetLineColor(ls->GetLineColor());
754  f1->SetLineStyle(JLineAttributes::getInstance().get(ns++).GetLineStyle());
755  }
756 
757  x1[0] = x1[1];
758  x2[0] = x2[1];
759 
760  // set limits
761  /*
762  double __xmin;
763  double __xmax;
764 
765  f1->GetRange(__xmin, __xmax);
766 
767  ymin = min(ymin, f1->GetMinimum(__xmin, __xmax));
768  ymax = max(ymax, f1->GetMaximum(__xmin, __xmax));
769  */
770  }
771  }
772  }
773 
774  // plot frame
775 
776  if (X != JRange_t()) {
777  xmin = X.getLowerLimit();
778  xmax = X.getUpperLimit();
779  }
780 
781  if (Y != JRange_t()) {
782  ymin = Y.getLowerLimit();
783  ymax = Y.getUpperLimit();
784  } else if (ymax > ymin) {
785  setRange(ymin, ymax, logy);
786  }
787 
788  cv->cd(1);
789 
790  if (!listOfObjects.empty()) {
791 
792  if (master == NULL || listOfObjects.size() >= 2u) {
793 
794  master = new TH1D(MASTER.c_str(), NULL, 100, xmin, xmax);
795 
796  master->SetStats(kFALSE);
797 
798  for (Int_t i = 1; i <= master->GetXaxis()->GetNbins(); ++i) {
799  master->SetBinContent(i, ymin);
800  }
801  }
802  }
803 
804  if (master == NULL) {
805 
806  TText* p = new TText(0.5, 0.5, MAKE_CSTRING("No data"));
807 
808  p->SetTextAlign(21);
809  p->SetTextAngle(45);
810  p->Draw();
811 
812  } else {
813 
814  if (logx) { gPad->SetLogx(); }
815  if (logy) { gPad->SetLogy(); }
816 
817  master->GetXaxis()->SetRangeUser(xmin, xmax);
818  master->SetTitle(title.c_str());
819 
820  if (logx > 1) {
822  }
823 
824  master->SetMinimum(ymin);
825  master->SetMaximum(ymax);
826 
827  if (xLabel != "") { master->GetXaxis()->SetTitle(xLabel.c_str()); master->GetXaxis()->CenterTitle(true); }
828  if (yLabel != "") { master->GetYaxis()->SetTitle(yLabel.c_str()); master->GetYaxis()->CenterTitle(true); }
829 
830  master->GetXaxis()->SetMoreLogLabels((logx == 1 && log10(xmax/xmin) < 2) ||
831  (logx > 1 && (xmax-xmin) < 2));
832 
833  master->GetYaxis()->SetMoreLogLabels( logy && log10(ymax/ymin) < 2);
834  master->GetYaxis()->SetNoExponent ( logy && log10(ymax/ymin) < 2);
835 
836  for (map<string, int>::const_iterator i = Ndivisions.begin(); i != Ndivisions.end(); ++i) {
837  master->SetNdivisions(i->second, i->first.c_str());
838  }
839 
840  if (xTimeFormat != "") {
841 
842  master->GetXaxis()->SetTimeDisplay(1);
843 
844  if (xTimeFormat == "utc") {
845  master->GetXaxis()->SetTimeFormat("#splitline{}{#splitline{%d-%m-%y}{ %H:%M}}");
846  master->GetXaxis()->SetTimeOffset(0.0, "gmt");
847  } else if (xTimeFormat == "UTC") {
848  master->GetXaxis()->SetTimeFormat("%d-%m-%y");
849  master->GetXaxis()->SetTimeOffset(0.0, "gmt");
850  } else {
851  master->GetXaxis()->SetTimeFormat(xTimeFormat.c_str());
852  }
853  }
854 
855  master->Draw(option.c_str());
856  }
857 
858  if (logx > 1) {
859  for (vector<JRootObject>::iterator i = listOfObjects.begin(); i != listOfObjects.end(); ++i) {
860  if (dynamic_cast<TH1*>(i->get()) != master) {
861  if (setLogX<TH1> (i->get())) {}
862  else if (setLogX<TF1> (i->get())) {}
863  else if (setLogX<TGraphErrors>(i->get())) {}
864  else if (setLogX<TGraph> (i->get())) {}
865  else if (setLogX<TMultiGraph> (i->get())) {}
866  else if (setLogX<TLine> (i->get())) {}
867  else if (setLogX<TEllipse> (i->get())) {}
868  }
869  }
870  }
871 
872  if (grid.count('x') || grid.count('X')) { gPad->SetGridx(); }
873  if (grid.count('y') || grid.count('Y')) { gPad->SetGridy(); }
874 
875  if (stats != -1)
876  gStyle->SetOptStat(stats);
877  else
878  gStyle->SetOptFit(kFALSE);
879 
880 
881  for (vector<JRootObject>::const_iterator i = listOfObjects.begin(); i != listOfObjects.end(); ++i) {
882 
883  DEBUG("Draw " << (*i)->GetName() << ' ' << (*i)->GetTitle() << endl);
884 
885  string buffer(option);
886 
887  //if (!dynamic_cast<THStack*>(i->get())) {
888  // buffer += "SAMES";
889  //}
890 
891  buffer += "SAME";
892 
893  TF1* f1 = dynamic_cast<TF1*> (i->get());
894  TGraph* g1 = dynamic_cast<TGraph*> (i->get());
895  TMultiGraph* q1 = dynamic_cast<TMultiGraph*>(i->get());
896 
897  if (f1 != NULL) {
898  f1->SetNpx(5000);
899  }
900 
901  if (g1 != NULL) {
902  if (g1->GetN() > 1 && drawLine)
903  buffer += "L"; // drawing cut line
904  else
905  buffer += "P"; // drawing point(s)
906  }
907 
908  if (q1 != NULL) {
909 
910  for (TIter i1(q1->GetListOfGraphs()); TGraph* gi = dynamic_cast<TGraph*>(i1()); ) {
911 
912  string zbuf = buffer;
913 
914  if (gi->GetN() > 1 && drawLine)
915  zbuf += "L"; // drawing cut line
916  else
917  zbuf += "P"; // drawing point(s)
918 
919  gi->Draw(zbuf.c_str());
920  }
921 
922  } else {
923 
924  (*i).Draw(buffer.c_str());
925  }
926  }
927 
928  //gPad->RedrawAxis();
929 
930  if (legend.is_valid()) {
931 
932  Ssiz_t height = listOfObjects.size();
933  Ssiz_t width = 1;
934 
935  for (vector<JRootObject>::const_iterator i = listOfObjects.begin(); i != listOfObjects.end(); ++i) {
936  width = max(width, getWidth(i->getLabel()));
937  }
938 
939  TLegend* lg = getLegend(width, height, legend.location, legend.factor);
940 
941  for (vector<JRootObject>::const_iterator i = listOfObjects.begin(); i != listOfObjects.end(); ++i) {
942  if (dynamic_cast<TMarker*>(i->get()) == NULL &&
943  dynamic_cast<TLine*> (i->get()) == NULL &&
944  dynamic_cast<TText*> (i->get()) == NULL) {
945  lg->AddEntry(*i, " " + i->getLabel(), isTAttLine(*i) ? "L" : "LPF");
946  }
947  }
948 
949  lg->Draw();
950  }
951 
952  cv->Update();
953 
954  if (outputFile != "") {
955  cv->SaveAs(outputFile.c_str());
956  }
957 
958  if (!batch) {
959  tp->Run();
960  }
961 
962  return (master != NULL ? 0 : 1);
963 }
const double xmax
Definition: JQuadrature.cc:24
Utility class to parse command line options.
Definition: JParser.hh:1514
then echo Test string reversed by master(hit< return > to continue)." $DIR/JProcess -c "$DIR/JEcho" -rC fi if (( 1 ))
std::string getLabel(const JLocation &location)
Get module label for monitoring and other applications.
Definition: JLocation.hh:246
std::vector< size_t > ns
Definition: JRoot.hh:19
#define MAKE_CSTRING(A)
Make C-string.
Definition: JPrint.hh:136
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition: JParser.hh:83
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
string outputFile
const JPolynome f1(1.0, 2.0, 3.0)
Function.
bool isTAttLine(const TObject *object)
Get drawing option of TH1.
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.
Definition: JObject.hh:75
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1989
set_variable E_E log10(E_{fit}/E_{#mu})"
TLegend * getLegend(const Int_t width, const Int_t height, const std::string option, const Double_t factor=1.0)
Get legend.
Definition: JLegend.hh:29
#define NOTICE(A)
Definition: JMessage.hh:64
#define ERROR(A)
Definition: JMessage.hh:66
static const char LABEL_TERMINATOR
label terminator
Definition: JRootObject.hh:23
#define FATAL(A)
Definition: JMessage.hh:67
const double xmin
Definition: JQuadrature.cc:23
void setRange(double &xmin, double &xmax, const bool logx)
Set axis range.
Auxiliary class to handle multiple boolean-like I/O.
Definition: JParser.hh:238
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
double u[N+1]
Definition: JPolint.hh:776
int debug
debug level
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62
Double_t g1(const Double_t x)
Function.
Definition: JQuantiles.cc:25