10 #include "TApplication.h" 
   14 #include "TAttMarker.h" 
   20 #include "TGraphErrors.h" 
   22 #include "TGraph2DErrors.h" 
   51   inline bool setLogX(
TObject* 
object)
 
   55     T* p = 
dynamic_cast<T*
>(object);
 
   74   inline bool setLogY(
TObject* 
object)
 
   78     T* p = 
dynamic_cast<T*
>(object);
 
   92   const char* 
const JName_t  = 
"?";     
 
   93   const char* 
const JTitle_t = 
"%";     
 
  103 int main(
int argc, 
char **argv)
 
  108   typedef JRange<double>  JRange_t;
 
  135     JParser<> zap(
"General purpose plot program for 2D ROOT objects.");
 
  137     zap[
'f'] = 
make_field(inputFile,  
"<input file>:<object name>");
 
  139     zap[
'w'] = 
make_field(canvas,     
"size of canvas <nx>x<ny> [pixels]")  = JCanvas(500, 500);
 
  141     zap[
'x'] = 
make_field(
X,          
"x-abscissa range")                   = JRange_t::DEFAULT_RANGE();
 
  142     zap[
'y'] = 
make_field(
Y,          
"y-abscissa range")                   = JRange_t::DEFAULT_RANGE();
 
  143     zap[
'z'] = 
make_field(
Z,          
"ordinate range")                     = JRange_t::DEFAULT_RANGE();
 
  144     zap[
'X'] = 
make_field(logx,       
"logarithmic x-axis (-XX log10 axis)");
 
  145     zap[
'Y'] = 
make_field(logy,       
"logarithmic y-axis (-YY log10 axis)");
 
  146     zap[
'Z'] = 
make_field(logz,       
"logarithmic z-axis");
 
  147     zap[
'P'] = 
make_field(
project,    
"projection")                         = 
"", 
"xy", 
"yx", 
"xz", 
"zx", 
"yz", 
"zy";
 
  148     zap[
'>'] = 
make_field(xLabel,     
"x-axis label")                       = 
"";
 
  149     zap[
'<'] = 
make_field(yLabel,     
"y-axis label")                       = 
"";
 
  150     zap[
'^'] = 
make_field(zLabel,     
"z-axis label")                       = 
"";
 
  151     zap[
'S'] = 
make_field(markerSize, 
"marker size")                        = 1.0;
 
  152     zap[
'O'] = 
make_field(option,     
"plotting option")                    = 
"";
 
  154     zap[
'B'] = 
make_field(batch,      
"batch processing");
 
  155     zap[
'T'] = 
make_field(title,      
"graphics title (" 
  156                           << 
"\"" << JName_t  << 
"\" -> ROOT name; " 
  157                           << 
"\"" << JTitle_t << 
"\" -> ROOT title)")       = 
"KM3NeT preliminary";
 
  159     zap[
'p'] = 
make_field(palette,    
"palette")                            = -1;
 
  164   catch(
const exception &error) {
 
  165     FATAL(error.what() << endl);
 
  169   gROOT->SetBatch(batch);
 
  171   TApplication* tp = 
new TApplication(
"user", NULL, NULL);
 
  172   TCanvas*      cv = 
new TCanvas(
"c1", 
"c1", canvas.x, canvas.y);
 
  174   JSinglePointer<TStyle> gStyle(
new JStyle(
"gplot", cv->GetWw(), cv->GetWh()));
 
  177     gStyle->SetPalette(palette);
 
  180   gROOT->SetStyle(
"gplot");
 
  184   cv->SetFillStyle(4000);
 
  185   cv->SetFillColor(kWhite);
 
  191   Double_t 
xmin = numeric_limits<double>::max();
 
  192   Double_t 
xmax = numeric_limits<double>::lowest();
 
  193   Double_t ymin = numeric_limits<double>::max();
 
  194   Double_t ymax = numeric_limits<double>::lowest();
 
  195   Double_t zmin = numeric_limits<double>::max();
 
  196   Double_t zmax = numeric_limits<double>::lowest();
 
  204     DEBUG(
"Input: " << *input << endl);
 
  209       ERROR(
"File: " << input->getFullFilename() << 
" not opened." << endl);
 
  213     const TRegexp regexp(input->getObjectName());
 
  215     TIter iter(dir->GetListOfKeys());
 
  217     for (TKey* key; (key = (TKey*) iter.Next()) != NULL; ) {
 
  219       const TString tag(key->GetName());
 
  221       DEBUG(
"Key: " << tag << 
" match = " << tag.Contains(regexp) << endl);
 
  225       if (tag.Contains(regexp) && 
isTObject(key)) {
 
  227         if        (title == JName_t) {
 
  228           title = key->GetName();
 
  229         } 
else if (title == JTitle_t) {
 
  230           title = key->GetTitle();
 
  233         JRootObject object(key->ReadObj());
 
  237           TH3& h3 = 
dynamic_cast<TH3&
>(*object);
 
  239           object = h3.Project3D(
project.c_str());
 
  245           TH2& h2 = 
dynamic_cast<TH2&
>(*object);
 
  247           h2.SetStats(stats != -1);
 
  249           xmin = min(
xmin, h2.GetXaxis()->GetXmin());
 
  250           xmax = max(xmax, h2.GetXaxis()->GetXmax());
 
  251           ymin = min(ymin, h2.GetYaxis()->GetXmin());
 
  252           ymax = max(ymax, h2.GetYaxis()->GetXmax());
 
  253           zmin = min(zmin, logz ? h2.GetMinimum(0.0) : h2.GetMinimum());
 
  254           zmax = max(zmax, h2.GetMaximum());
 
  260           TGraph& 
g1 = 
dynamic_cast<TGraph&
>(*object);
 
  262           for (Int_t 
i = 0; 
i != g1.GetN(); ++
i) {
 
  272             if (dynamic_cast<TGraph*>(
i->get()) != NULL) {
 
  283           TGraph2D& g2 = 
dynamic_cast<TGraph2D&
>(*object);
 
  285           for (Int_t 
i = 0; 
i != g2.GetN(); ++
i) {
 
  286             if (!logz || g2.GetZ()[
i] > 0.0) {
 
  288               xmax = max(xmax, g2.GetX()[
i]);
 
  289               ymin = min(ymin, g2.GetY()[
i]);
 
  290               ymax = max(ymax, g2.GetY()[
i]);
 
  291               zmin = min(zmin, g2.GetZ()[
i]);
 
  292               zmax = max(zmax, g2.GetZ()[
i]);
 
  297             g2.SetMinimum(
Z.getLowerLimit());
 
  298             g2.SetMaximum(
Z.getUpperLimit());
 
  305           TF2& f2 = 
dynamic_cast<TF2&
>(*object);
 
  307           f2.SetLineColor(kRed);
 
  308           f2.SetTitle((title +  
";" + xLabel + 
";" + yLabel + 
";" + zLabel).c_str());
 
  315           f2.GetRange(__xmin, __ymin, __xmax, __ymax);
 
  319           ymin = min(ymin, __ymin);
 
  320           ymax = max(ymax, __ymax);
 
  321           zmin = min(zmin, f2.GetMinimum());
 
  322           zmax = max(zmax, f2.GetMaximum());
 
  328         for (TString buffer[] = { 
object.getLabel(), input->getFilename().c_str(), 
"" }, *
i = buffer; *
i != 
""; ++
i) {
 
  330           *
i = (*i)(TRegexp(
"\\[.*\\]"));
 
  332           if ((*i).Length() > 2) {
 
  333             object.setLabel((*
i)(1, (*i).Length() - 2));
 
  337         if (dynamic_cast<TH2*>     (
object.
get())  !=  NULL ||
 
  338             dynamic_cast<TGraph*>  (
object.
get())  !=  NULL ||
 
  339             dynamic_cast<TGraph2D*>(
object.
get())  !=  NULL ||
 
  340             dynamic_cast<TEllipse*>(
object.
get())  !=  NULL ||
 
  341             dynamic_cast<TLine*>   (
object.
get())  !=  NULL ||
 
  342             dynamic_cast<TText*>   (
object.
get())  !=  NULL ||
 
  343             dynamic_cast<TF2*>     (
object.
get())  !=  NULL) {
 
  345           DEBUG(
"Add object: " << tag << 
" with label <" << 
object.
getLabel() << 
">" << endl);
 
  348             master = 
dynamic_cast<TH2*
>(
object.get());
 
  351           listOfObjects.push_back(
object);
 
  354           ERROR(
"For other objects than 2D histograms, use JPlot1D" << endl);
 
  360   if (listOfObjects.empty()) {
 
  361     ERROR(
"Nothing to draw." << endl);
 
  368   if (option.find(
"COLZ") != string::npos ||
 
  369       option.find(
"colz") != string::npos) {
 
  370     gPad->SetRightMargin(0.20);
 
  374     xmin = 
X.getLowerLimit();
 
  375     xmax = 
X.getUpperLimit();
 
  379     ymin = 
Y.getLowerLimit();
 
  380     ymax = 
Y.getUpperLimit();
 
  384     zmin = 
Z.getLowerLimit();
 
  385     zmax = 
Z.getUpperLimit();
 
  386   } 
else if (zmax > zmin) {
 
  390   if (!listOfObjects.empty()) {
 
  394       master = 
new TH2D(MASTER.c_str(), NULL, 
 
  404     TText* p = 
new TText(0.5, 0.5, 
"No data");
 
  412     if (logx) { gPad->SetLogx(); }
 
  413     if (logy) { gPad->SetLogy(); }
 
  414     if (logz) { gPad->SetLogz(); }
 
  417     master->GetYaxis()->SetRangeUser(ymin, ymax);
 
  422     master->SetTitle(title.c_str());
 
  427     if (xLabel != 
"") { 
master->GetXaxis()->SetTitle(xLabel.c_str()); 
master->GetXaxis()->CenterTitle(
true); }
 
  428     if (yLabel != 
"") { 
master->GetYaxis()->SetTitle(yLabel.c_str()); 
master->GetYaxis()->CenterTitle(
true); }
 
  429     if (zLabel != 
"") { 
master->GetZaxis()->SetTitle(zLabel.c_str()); 
master->GetZaxis()->CenterTitle(
true); }
 
  433     master->GetYaxis()->SetMoreLogLabels((logy == 1 && 
log10(ymax/ymin) < 2) ||
 
  434                                          (logy >  1 &&       ymax-ymin  < 2));
 
  437       master->SetNdivisions(
i->second, 
i->first.c_str());
 
  440     DEBUG(
"Draw " << 
master->GetName() << 
' ' << option << endl);
 
  442     master->Draw(option.c_str());
 
  445   if (logx > 1 || logy > 1) {
 
  447       if (dynamic_cast<TH2*>(
i->get()) != 
master) {
 
  449           if      (setLogX<TH2>           (
i->get())) {}
 
  450           else if (setLogX<TF2>           (
i->get())) {}
 
  451           else if (setLogX<TGraph2DErrors>(
i->get())) {}
 
  452           else if (setLogX<TGraph2D>      (
i->get())) {}
 
  453           else if (setLogX<TGraphErrors>  (
i->get())) {}
 
  454           else if (setLogX<TGraph>        (
i->get())) {}
 
  455           else if (setLogX<TLine>         (
i->get())) {}
 
  456           else if (setLogX<TEllipse>      (
i->get())) {}
 
  459           if      (setLogY<TH2>           (
i->get())) {}
 
  460           else if (setLogY<TF2>           (
i->get())) {}
 
  461           else if (setLogY<TGraph2DErrors>(
i->get())) {}
 
  462           else if (setLogY<TGraph2D>      (
i->get())) {}
 
  463           else if (setLogY<TGraphErrors>  (
i->get())) {}
 
  464           else if (setLogY<TGraph>        (
i->get())) {}
 
  465           else if (setLogY<TLine>         (
i->get())) {}
 
  466           else if (setLogY<TEllipse>      (
i->get())) {}
 
  472   if (grid.count(
'x') || grid.count(
'X')) { gPad->SetGridx(); }
 
  473   if (grid.count(
'y') || grid.count(
'Y')) { gPad->SetGridy(); }
 
  476     gStyle->SetOptStat(stats);
 
  478     gStyle->SetOptFit(kFALSE);
 
  482     DEBUG(
"Draw " << (*i)->GetName() << 
' ' << (*i)->GetTitle() << endl);
 
  484     string buffer(option);
 
  490       TH2& h2 = 
dynamic_cast<TH2&
>(*(*i));
 
  499       TGraph& 
g1 = 
dynamic_cast<TGraph&
>(*(*i));
 
  507       TGraph2D& g2 = 
dynamic_cast<TGraph2D&
>(*(*i));
 
  516       TF2& f2 = 
dynamic_cast<TF2&
>(*(*i));
 
  527     (*i)->Draw(buffer.c_str());
 
  542   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. 
 
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
 
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
 
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
 
#define DEBUG(A)
Message macros. 
 
Double_t g1(const Double_t x)
Function.