RE: [ROOT] Problem with TTree::Draw("A.B") if "A" is already a branch.

From: Robert Michaels (rom@jlab.org)
Date: Tue May 06 2003 - 03:00:34 MEST


Thanks, I figured that was probably the convention.  Unluckily our
code has quite a few "dots", but we can fix it.

BTW, I meant to write T->Draw("A.B[0]") and T->Draw("A.B[1]"), etc.

Robert

On Mon, 5 May 2003, Philippe Canal wrote:

> > Now, my questions:  Is this a bug in TTreeFormula, or should
> > I be doing something else ?  Perhaps my choice of variable
> > names ("A" and "A.B") is poor and should be avoided ?
> 
> Hi,
> 
> This is probably not clear enough in the document for TTree::Branch, however
> '.' is a reserved by TTree for its own purpose and should be avoided.  As
> noted in the code '.' is used as a delimiter to indicates an actual
> sub-branch or a data member into a non-split branch.  Hence the algorithm,
> on purpose, try to looks for 'B' inside the branch 'A'.
> 
> Please use something like '_':
> 
>   mytree->Branch("A_B",arr2,"arr2[ndat]/D");
>   mytree->Branch("X_B",arr2,"arr2[ndat]/D");
> 
> Cheers,
> Philippe.
> 
> -----Original Message-----
> From: owner-roottalk@pcroot.cern.ch
> [mailto:owner-roottalk@pcroot.cern.ch]On Behalf Of Robert Michaels
> Sent: Monday, May 05, 2003 4:54 PM
> To: roottalk@pcroot.cern.ch
> Subject: [ROOT] Problem with TTree::Draw("A.B") if "A" is already a
> branch.
> 
> 
> Using ROOT 3.05/02 on Red Hat Linux 8.0 with
> gcc version 3.2 20020903  (Dell laptop C840).
> 
> After executing the root macro example below, my problem
> is trying to Draw("A.B")
> 
> root [2] T->Draw("A")
> <TCanvas::MakeDefCanvas>: created default TCanvas with name c1
> root [3] T->Draw("A.B")
> 
> *ERROR 26 :
>  Unknown name : "A.B"
> 
> I think the reason for this is that in
> TTreeFormula::DefinedVariable(TString &name)
> at line 1787 there is a check
> if (cname[i] == '.' || cname[i] == '[' || cname[i] == '\0' ) {
>     // A delimiter happened let's see if what we have seen
>     // so far does point to a leaf.
> and then it proceeds to corrupt the string "A.B".
> I can make it work by eliminating the check for '.'
> 
> Incidentally, for an older version of ROOT (3.02/06)
> the T->Draw("A.B") draws something, but it is the
> same data as T->Draw("A"), which is wrong since "A" is
> connected to arr1 and "A.B" to arr2.  I don't want to
> worry about old ROOT versions, but I offer this info to
> hint at what has changed.
> 
> Another point:  T->Draw("X.B") works fine (for any
> version of ROOT I tried).
> 
> Now, my questions:  Is this a bug in TTreeFormula, or should
> I be doing something else ?  Perhaps my choice of variable
> names ("A" and "A.B") is poor and should be avoided ?
> 
> {  // This example script illustrates my problem
> 
>   mytree = new TTree("T","My Tree");
> 
>   Int_t ndat = 50;
>   Double_t *arr1 = new Double_t[ndat];
>   Double_t *arr2 = new Double_t[ndat];
> 
>   mytree->Branch("ndata",&ndat,"ndat/I");
>   mytree->Branch("A",arr1,"arr1[ndat]/D");
>   mytree->Branch("A.B",arr2,"arr2[ndat]/D");
>   mytree->Branch("X.B",arr2,"arr2[ndat]/D");
> 
>   for (Int_t iev = 0; iev < 100; iev++) {
>     for (Int_t i = 0; i < ndat; i++) {
>        arr1[i] = (Double_t) (i + 100*iev);
>        arr2[i] = 2*arr1[i];
>     }
>     mytree->Fill();
>   }
> 
> }
> 
> Thanks a bunch for reading this LONG inquiry !
> ------------------------------------------------------
> Robert W. Michaels
> www.jlab.org/~rom
> Thomas Jefferson National Accelerator Facility
> 12000 Jefferson Ave, Newport News, VA 23606 USA
> 
> 



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