I am having problems accessing existing histogram arrays outside of a named macro. The following does not work: root [0] .L draw_hists.C root [1] hists() root [2] .ls TROOT* Rint The ROOT of EVERYTHING OBJ: TH1F H Single histogram : 0 OBJ: TH1F HArray[0] Set 0 : 0 OBJ: TH1F HArray[1] Set 1 : 0 OBJ: TH1F HArray[2] Set 2 : 0 root [3] H->Draw(); root [4] c1->cd(4); root [5] HArray[2]->Draw(); Error: Symbol HArray[2] is not defined in current scope FILE:/tmp/filekSHEtv_cint LINE:1 Error: Failed to evaluate HArray[2]->Draw()Possible candidates are... filename line:size busy function type and name *** Interpreter error recovered *** So there is an error trying to draw the histogram from the array, "HArray[2]", but not the single histogram, "H". However, if I comment out the line, "void hists ()", making the macro unnamed, and then run it, it works: root [0] .X draw_hists.C root [1] .ls TROOT* Rint The ROOT of EVERYTHING OBJ: TH1F H Single histogram : 0 OBJ: TH1F HArray[0] Set 0 : 0 OBJ: TH1F HArray[1] Set 1 : 0 OBJ: TH1F HArray[2] Set 2 : 0 root [2] H->Draw() root [3] c1->cd(4) root [4] HArray[2]->Draw(); // everything is drawn Of course, in the first (non-working) example, I could do something like : root [5] TH1F *Q = (TH1F *) gROOT->FindObject("HArray[2]") root [6] Q->Draw() but this sort of defeats the purpose of having an object already in memory, and also seems unnecessary since the second example does work the way I would think it should. Here is the macro, (I tried this in root v3_02_07c KCC_4_0 Linux+2.2): // file name: draw_hists.C void hists () { // create single histogram TH1F *H = new TH1F("H","Single histogram",10,-0.5,1.5); for (int j=0;j<100;j++) H->Fill(gRandom->Gaus()); // create array of histograms TH1F *HArray[3]; for (int i = 0; i < 3; i++) { char hname[15]; char htitle[15]; sprintf( hname, "HArray[%d]", i); sprintf( htitle, "Set %d", i); HArray[i] = new TH1F(hname,htitle,10,-0.5,1.5); for (int j=0;j<100;j++) HArray[i]->Fill(gRandom->Gaus()); } // draw histograms within macro c1 = new TCanvas(); c1->Divide(2,2); c1->cd(1); H->Draw(); c1->cd(2); HArray[1]->Draw(); c1->cd(3); // Now draw the above two outside the macro. }
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:58 MET