[ROOT] C++ scope question

From: Kevin Reil (reil@SLAC.stanford.edu)
Date: Thu May 29 2003 - 23:22:23 MEST


Hi all,

I should know this but

I have files
photon_1.root with ntuple phot1
photon_2.root with ntuple phot2
photon_3.root with ntuple phot3

If the file is there I want to return a pointer to it and a pointer to the
ntuple it contains.

If it is not there, I want to return a pointer to a file ready to write to
and a pointer to an ntuple ready to fill.

the new TFile and new TNtuple are lost when I go out of scope (I believe)
so when I do nin->GetEntries() before leaving I get the anwer when I do it
after leaving the function, I get a seg fault. I now its a scope thing but
I cannot recall the solution.

Core example it is below.

Thanks,
Kevin



Int_t GetNtuple(Int_t stage, TFile *fin, TNtuple *nin)
{
  char fname[256];
  sprintf(fname,"photons_%d.root",stage);
  char ntname[256];
  sprintf(ntname,"phot%d",stage);
  cout << ntname << " " << fname << endl;
  TFile *tfin = new TFile("photons_1.root","READ");
  if (!fin->IsOpen()) {
    fin = new TFile(fname,"RECREATE");
    nin=new TNtuple(ntname,"photons","x:y:z:dx:dy:dz:lambda");
  } else {
    tnin = (TNtuple*)gROOT->FindObject(ntname);
  }
  fin=tfin->Copy((TObject*)tfin);
  nin=tnin->Copy((TObject*)tnin);
  cout << nin->GetEntries() << endl;
  //works here (there are 10,000 if file is there else 0)
  return 0;
}

int main()
{
TNtuple *phot1;
TFile *f1;

Int_t nocode=GetNtuple(1,f1,phot1);
cout << phot1->GetEntries() << endl; // segfault
}

|------------------------------------|---------------------------------|
| Kevin Reil                         | 2575 Sand Hill Road, MS 26      |
| X2447, 103D A&E Bldg. 041          | Menlo Park, CA 94025            |
|------------------------------------|---------------------------------|
| http://www.slac.stanford.edu/~reil | Office (650) 926-2447           |
| reil@slac.stanford.edu             | Home   (650) 938-1767           |
| http://reil.no-ip.org              | Fax    (650) 926-5368           |
|----------------------------------------------------------------------|
|                    And my father dwelt in a tent.                    |
|----------------------------------------------------------------------|

On Thu, 29 May 2003, Mayly Sanchez wrote:

>
>Hi Rene,
>the root file is here:
>http://minos.phy.tufts.edu/msanchez/dchisq90_c.root
>Mayly
>
>On Thursday, May 29, 2003, at 01:47  PM, Rene Brun wrote:
>
>> Hi Mayly,
>>
>> Could you send the canvas.root file instead of canvas.gif?
>>
>> Rene Brun
>>
>> On Thu, 29 May
>> 2003, Mayly Sanchez wrote:
>>
>>>
>>> Thanks Rene, that fixed the contours but now it has a funny problem in
>>> the lego plots. For some cases (I still have to determine the
>>> pattern),
>>> it draws lego plots where part of it shows as a wireframe while the
>>> rest seems ok. The best way to explain is a picture:
>>> http://minos.phy.tufts.edu/msanchez/dchisq90_lego.gif
>>>
>>> Any ideas?
>>> Mayly
>>>
>>> On Wednesday, May 21, 2003, at 06:42  PM, Rene Brun wrote:
>>>
>>>> Hi,
>>>>
>>>> Some changes have been made in the past few weeks by Olivier Couet
>>>> to solve the kind of problems you are reporting.
>>>> Take the version from CVS head and install from source.
>>>>
>>>> Rene Brun
>>>>
>>>> On Wed,
>>>> 21 May 2003, Mayly Sanchez wrote:
>>>>
>>>>>
>>>>> Hi,
>>>>> I have a macro for drawing non-equidistant 2d contours that used to
>>>>> work before but fails in most recent versions of root. The latest
>>>>> test
>>>>> has been done with 3.05/05.
>>>>>
>>>>> Here are the steps I follow:
>>>>> {TH2F *ch = new
>>>>> TH2F("ch","",nbinx,nbinxmin,nbinxmax,nbiny,nbinymin,nbinymax);
>>>>> ch->Fill(x,y,weight);
>>>>> ch->SetContour(2);
>>>>> ch->SetContourLevel(0,0.0)
>>>>> ch->SetContourLevel(1,2.0)
>>>>>
>>>>> ch->Draw("cont2");
>>>>> }
>>>>>
>>>>> Now what happens is: that if I do a lego2 plot before drawing the
>>>>> contours, the levels are set at the proper heights. Once I have run
>>>>> Draw("cont2") or any of the other cont options it recalculates the
>>>>> levels in a weird way. It seems to put the first level at the
>>>>> GetMinimum value and the second half way between the maximum and the
>>>>> minimum, as if it wanted to do equidistant contours.
>>>>>
>>>>> Did something change? Can I force it to do non-equidistant contours
>>>>> again? I need this urgently so any workarounds are welcome, thanks,
>>>>>
>>>>> Mayly
>>>>>
>>>>> ps. the method with SetContourLevels(2,vector) was also tested and
>>>>> gave
>>>>> the same results
>>>>>
>>>>>
>>>
>
>



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:12 MET