> 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