Re: [ROOT] C++ scope question

From: Axel Naumann (axel-naumann@gmx.de)
Date: Fri May 30 2003 - 00:06:47 MEST


Hi,

Int_t GetNtuple(Int_t stage, TFile* &fin, TNtuple* &nin)

You'll need to pass the arg by ref (better but uncommonway of stating
that: You'll need to define the method such that the arg gets passed by
ref), to allow GetNtuple to change the arg.

Cheers, Axel.

> 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