Re: confusion with Fill()/GetEvent()

From: Petar Maksimovic (petar@harv1.fnal.gov)
Date: Mon May 03 1999 - 05:26:08 MEST


> Hello, Petar,
> 
> >
> > Dear Rooters,
> >
> > this might be a newbie question, but it should be nevertheless interesting
> > as an illustration how non-intuitive (and thus non-trivial) some of
> > ROOT's features are.
> >
>   I think what you are speaking about is not ROOT
>   but generic C++ "problem". Nobody claimed C++ is a kind of trivial
> language.
> 
>   Very likely you wanted to say:
> 
>   ntuple->SetBranchAddress("x",&x1);
>                                ^
>                                |
>              ------------------+
> 
> instead of yours
> 
>   ntuple->SetBranchAddress("x",x1);

Hi Valery,

unfortunately, this does not fix the problem (I had it right 
in my real program; I apologize for not being careful in setting
up a test case).  

I forgot to mention that this macro behaves the same way in root 
v2_21_08 with KCC_3_3 on IRIX64 (cdfsga 6.2 03131016 IP25),
as well as v2_00_13b (also KCC_3_3) on Linux RH 5.0 (5.0.2, at Fermilab)

Thanks,

	Petar




> 
>   At least when I changed your text and it works as expected.
>   The result you got os expected as well, since you told Ntuple
>   the address to keep the x values is "0" (very likey ZERO it could any
>   value, since you didn't initiated Float_t x at all.
> 
>    Hope this helps,
>                                Valery
> 
> > I'm trying to simultaneously fill an ntuple and read from it (in
> > another section of the code).  One can argue that is perfectly
> > reasonable to collect a bunch of events, pause the run, analyze them,
> > and then keep on filling the ntuple.
> >
> > However, it seams that SetBranchAddress() interferes with the Fill()
> > method for the variables for which SetBranchAddress() was issued.
> > These variables end up being 0.
> >
> > The example below (which is a slightly modified root tutorial)
> > illustrates the point:
> >
> > {
> >    FILE *fp = fopen("foo.txt","r");
> >
> >    Float_t x,y,z;
> >    Float_t x1;
> >
> >    Int_t ncols;
> >    Int_t nlines = 0;
> >
> >    TNtuple *ntuple = new TNtuple("ntuple","data from ascii file","x:y:z");
> >
> >    // ******************************************************************
> >    ntuple->SetBranchAddress("x",x1);  // <----- why is this dangerous???
> >    // ******************************************************************
> >
> >    while (1) {
> >       ncols = fscanf(fp,"%f %f %f",&x, &y, &z);
> >       if (ncols < 0) break;
> >       if (nlines < 5) printf("x=%8f, y=%8f, z=%8f\n",x,y,z);
> >       ntuple->Fill(x,y,z);
> >       nlines++;
> >    }
> >    fclose(fp);
> > }
> >
> > Where the ntuple is read from the file
> > % cat foo.txt
> > 1 2 3
> > 1.1 2.2 3.3
> > -1.1 -2.2 -3.3
> > -1 -2 -3
> > 1.5 1.5 1.5
> >
> >
> > Here, if the SetBranchAddress() is commented out, everything is fine.
> > But once it's uncommented, all "x" entries are 0.0.
> >
> > My questions:
> >
> > 1. It's obvious that I'm doing something silly, but for a non-expert
> >    like me it's hard to pin down the location of this silliness.
> >
> > 2. If this behavior of TTree is a feature (which it may well be), then
> what
> >    is the correct way of doing this?
> >
> > Many thanks!
> >
> > Petar
> >



This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:32 MET