Tree->Draw("var>>hist")

You macro seems to be problematic . On mac with ROOT 6.10 it gives me:

root [0] 
Processing comp.C...
file: r1.root
dir: ee
hist name: ee/cutflow
name: 0eehmupt
libc++abi.dylib: terminating with uncaught exception of type std::out_of_range: basic_string

Ok, can you please try now?
Regards

I get a canvas but still errors:

root [0] 
Processing comp.C...
file: r1.root
dir: ee
hist name: ee/cutflow
name: ee0hmupt
file: r2.root
dir: ee
hist name: ee/cutflow
name: ee1hmupt
[/Users/couet/git/roottrunk-bin/lib/libCling.so] cling_runtime_internal_throwIfInvalidPointer (no debug info)
[<unknown binary>] (no debug info)
[/Users/couet/git/roottrunk-bin/lib/libCling.so] cling::Interpreter::RunFunction(clang::FunctionDecl const*, cling::Value*) (no debug info)
[/Users/couet/git/roottrunk-bin/lib/libCling.so] cling::Interpreter::EvaluateInternal(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, cling::CompilationOptions, cling::Value*, cling::Transaction**, unsigned long) (no debug info)
[/Users/couet/git/roottrunk-bin/lib/libCling.so] cling::MetaSema::actOnxCommand(llvm::StringRef, llvm::StringRef, cling::Value*) (no debug info)
[/Users/couet/git/roottrunk-bin/lib/libCling.so] cling::MetaParser::isXCommand(cling::MetaSema::ActionResult&, cling::Value*) (no debug info)
[/Users/couet/git/roottrunk-bin/lib/libCling.so] cling::MetaParser::isCommand(cling::MetaSema::ActionResult&, cling::Value*) (no debug info)
[/Users/couet/git/roottrunk-bin/lib/libCling.so] cling::MetaParser::isMetaCommand(cling::MetaSema::ActionResult&, cling::Value*) (no debug info)
[/Users/couet/git/roottrunk-bin/lib/libCling.so] cling::MetaProcessor::process(llvm::StringRef, cling::Interpreter::CompilationResult&, cling::Value*, bool) (no debug info)
[/Users/couet/git/roottrunk-bin/lib/libCling.so] HandleInterpreterException(cling::MetaProcessor*, char const*, cling::Interpreter::CompilationResult&, cling::Value*) /Users/couet/git/roottrunk/core/metacling/src/TCling.cxx:1902
[/Users/couet/git/roottrunk-bin/lib/libCling.so] TCling::ProcessLine(char const*, TInterpreter::EErrorCode*) /Users/couet/git/roottrunk/core/metacling/src/TCling.cxx:2035
[/Users/couet/git/roottrunk-bin/lib/libCling.so] TCling::ProcessLineSynch(char const*, TInterpreter::EErrorCode*) /Users/couet/git/roottrunk/core/metacling/src/TCling.cxx:2884
[/Users/couet/git/roottrunk-bin/lib/libCore.so] TApplication::ExecuteFile(char const*, int*, bool) /Users/couet/git/roottrunk/core/base/src/TApplication.cxx:1137
[/Users/couet/git/roottrunk-bin/lib/libRint.so] TRint::ProcessLineNr(char const*, char const*, int*) /Users/couet/git/roottrunk/core/rint/src/TRint.cxx:756
[/Users/couet/git/roottrunk-bin/lib/libRint.so] TRint::Run(bool) /Users/couet/git/roottrunk/core/rint/src/TRint.cxx:416
[/Users/couet/git/roottrunk-bin/bin/root.exe] main /Users/couet/git/roottrunk/main/src/rmain.cxx:32
[/usr/lib/system/libdyld.dylib] start (no debug info)
[<unknown binary>] (no debug info)
Error in <HandleInterpreterException>: Trying to access a pointer that points to an invalid memory address..
Execution of your code was aborted.
In file included from input_line_9:1:
/Users/couet/Downloads/comp.C:95:7: warning: invalid memory pointer passed to a callee:
      hmupt[nfile][nbdir]->SetLineColor(nfile);
      ^~~~~~~~~~~~~~~~~~~
root [1] 

And this is the correct code:

  canvastree->cd();
  for(int nbfile=0; nbfile<nfile; nbfile++){
    for(int nbdir=0; nbdir<ndir; nbdir++){
      hmupt[nbfile][nbdir]->SetLineColor(nfile);
      canvastree->cd();
      hmupt[nbfile][nbdir]->Draw("hist&same");
    }
  }

Hi Couet,
for me it runs file with root 6.08.
Regards

@calbet I just sent the solution…

Hi Bellenot,
I add your suggestions, but I still have the same results, a canvas with one histogram instead of 2.
Regards

Here is what I see in the Canvas:

root [2] mupt->ls()
Canvas Name=mupt Title=mupt Option=
 TCanvas fXlowNDC=0 fYlowNDC=0 fWNDC=1 fHNDC=1 Name= mupt Title= mupt Option=
  OBJ: TList    TList   Doubly linked list : 0
   TFrame  X1= 31000.000000 Y1=0.000000 X2=75500.000000 Y2=1.050000
   OBJ: TH1F    hmupt[1][0]     mu_pt : 0 at: 0x3005910
   OBJ: TH1D    ee0hmupt        ee0hmupt : 0 at: 0x2f27480
   OBJ: TH1D    ee1hmupt        ee1hmupt : 0 at: 0x2f0a6f0
   OBJ: TPaveText       title   X1= 69937.501533 Y1=0.459375 X2=75500.001699 Y2=0.721875

Hi Bellenot,
I’m confused. I created an array of histogram “TH1D *hmupt[2][1];”, I filled it with TTree->Draw(var>>hmupt), then I want to draw what I stored in the array. I did not created any TH1F.
Regards

The following command cannot work:

tree->Draw(Form("mu_pt>>hmupt[%d][%d]",nfile,ndir);

Because the string you pass to TTres::Draw is not a piece of C++. It has its own syntax (see doc). Therefore you cannot use the pointer of the histogram in the string. You should use the name of the histogram. … Fix this first … you may have more issues after.

Hi Couet,

I did (1) to parse the hist name as a char, please see (2) line 77 to 79 but still the same results. Do you see what is wrong?

Regards

(1)
string histname = hmupt[nfile][ndir]->GetName();
const char* histname_ = histname.c_str();
tree->Draw(“mu_pt>>histname_”);

(2)
http://calpas.web.cern.ch/calpas/comp.cc

We just noticed that one of your tree is empty.

Nope. This way: tree->Draw(Form("mu_pt>>%s",hmupt[nfile][ndir]->GetName()));
And as Olivier just said, the “nominal” tree, in the “r1.root” file has 0 entries, so you will never see any histogram from this tree… :confused:

Hi Bellenot and Couet,

  • thank you for your help.
  • I put a new fill tree.
  • I set “tree->Draw(Form(“mu_pt>>%s”,hmupt[nfile][ndir]->GetName()));” line 77
  • but when I run, it seems like it does not want to plot them on the same canvas despite the Draw(“same”) option line 92? Something does not work…
    Regards

This works for me:

  for(int nbfile=0; nbfile<nfile; nbfile++){
    for(int nbdir=0; nbdir<ndir; nbdir++){
      hmupt[nbfile][nbdir]->SetLineColor(2+nbfile);
      hmupt[nbfile][nbdir]->Draw("hist same");
    }
  }

You can also do:

  for(int nbfile=0; nbfile<nfile; nbfile++){
    for(int nbdir=0; nbdir<ndir; nbdir++){
      hmupt[nbfile][nbdir]->SetLineColor(2+nbfile);
      if (nbfile == 0 && nbdir == 0)
         hmupt[nbfile][nbdir]->Draw("hist");
      else
         hmupt[nbfile][nbdir]->Draw("hist same");
    }
  }

Hi Bellenot,

  • yes for nbfile==0 the color is white so I could not see it!
  • It works for me too.
  • Thank you and Couet for your help!
    Regards

I would suggest that you check individually that your histograms are properly filled (doing individual plots one by one) . Remember you have an empty TTree…

Dear Couet,
ok, I’ll do that. Thank you for your help.
Regards

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.