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

From: Philippe Canal (pcanal@fnal.gov)
Date: Tue May 06 2003 - 00:18:30 MEST


> 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