[ROOT] Problems when calling TBrowser

From: cstrato@EUnet.at
Date: Sun Dec 31 2000 - 20:59:17 MET


Dear Rooters

Maybe I am still not quite understanding the way root works,
since I do not understand the following problem:

Although the code (macro2.C) seems to work, opening the Browser
and double-clicking on a variable always causes root to hang
so that I have to kill root.
Note that macro2.C is very similar to macro1.C which does work!

1, macro1.C:  The following code, taken from Rene Brun, works:
(Re: [ROOT] variable length "arrays"
 Date: Sun, 29 Oct 2000 22:23:11 +0100)

//-----begin macro1.C-------
typedef struct{
  int eventnr;
  int count;
  float meas[100];
} event_struct;

void fillstruct()
{
   TFile f("struct.root","recreate");
   TTree T("T","test struct");
   event_struct event;

   T.Branch("first",&event.eventnr,"eventnr/I:count/I:meas[count]/F");
   for (Int_t i=0;i<10;i++) {
      event.eventnr = i;
      event.count = 100*gRandom->Rndm();
      for (Int_t j=0;j<event.count;j++) event.meas[j] = i+j;
      T.Fill();
   }
   T.Print();
   T.Write();
}

void readstruct()
{
   TFile *f = new TFile("struct.root");
   TTree *T = (TTree*)f->Get("T");

   event_struct event;
   T->SetBranchAddress("first",&event.eventnr);

   Int_t nentries = (Int_t)(T->GetEntries());
   cout << "number of entries: " << nentries << endl;

   for (Int_t i=0;i<nentries;i++) {
      T->GetEntry(i);
      cout << "event.eventnr " << event.eventnr << " i= " << i << endl;
      cout << "event.count " << event.count << " i= " << i << endl;
      cout << "event.meas " << event.meas[i] << " i= " << i << endl;
   }
}
//------end macro1--------

This is the output:
//------begin output------
  *******************************************
  *                                         *
  *        W E L C O M E  to  R O O T       *
  *                                         *
  *   Version   3.00/00  19 December 2000   *
  *                                         *
  *  You are welcome to visit our Web site  *
  *          http://root.cern.ch            *
  *                                         *
  *******************************************

CINT/ROOT C/C++ Interpreter version 5.14.65, Dec 6 2000
Type ? for help. Commands must be C++ statements.
Enclose multiple statements between { }.
root [0] .L macro1.C
root [1] fillstruct()
******************************************************************************

*Tree    :T         : test
struct                                            *
*Entries :       10 : Total =               0 bytes  File  Size
=          0 *
*        :          : Tree compression factor =
1.00                       *
******************************************************************************

*Branch  :first     :
eventnr/I:count/I:meas[count]/F                        *
*Entries :       10 : Total  Size=          0 bytes  File Size
=          0 *
*Baskets :        0 : Basket Size=      32000 bytes  Compression=
1.00     *
*............................................................................*

root [2] readstruct()
number of entries: 10
event.eventnr 0 i= 0
event.count 10 i= 0
event.meas 0 i= 0
event.eventnr 1 i= 1
event.count 58 i= 1
event.meas 2 i= 1
event.eventnr 2 i= 2
event.count 31 i= 2
event.meas 4 i= 2
event.eventnr 3 i= 3
event.count 14 i= 3
event.meas 6 i= 3
event.eventnr 4 i= 4
event.count 29 i= 4
event.meas 8 i= 4
event.eventnr 5 i= 5
event.count 4 i= 5
event.meas 9 i= 5
event.eventnr 6 i= 6
event.count 15 i= 6
event.meas 12 i= 6
event.eventnr 7 i= 7
event.count 95 i= 7
event.meas 14 i= 7
event.eventnr 8 i= 8
event.count 47 i= 8
event.meas 16 i= 8
event.eventnr 9 i= 9
event.count 58 i= 9
event.meas 18 i= 9
root [3] TBrowser b
root [4] <TCanvas::MakeDefCanvas>: created default TCanvas with name c1
//------end output------

In the Browser I can double-click on the fields of the struct,
and the Canvas displays the data correctly.

2, macro2.C: However, the following code, which is as similar to
macro1.C as possible, has problems with TBrowser:

//-----begin macro2.C-------
#include "TMatrix.h"
#include <iostream.h>
#include <math.h>

typedef struct {
   Int_t fNRows;
   Int_t fNCols;
   Int_t fLength;
   Float_t fMeas[10000];
} DATA;

void fillarray(Int_t nrow,Int_t ncol)
{
   TFile f("test.root","recreate");
   TTree T("T","a simple test with an array");
   DATA vData;


T.Branch("vDataBranch",&vData.fNRows,"fNRows/I:fNCols:fLength:fMeas[fLength]/F");

   Int_t num = nrow*ncol;
   vData.fNRows = nrow;
   vData.fNCols = ncol;
   vData.fLength = num;
   for (Int_t i=0;i<num;i++) {
      vData.fMeas[i] = i;
   }
   T.Fill();

   T.Print();
   T.Write();
}

void readarray()
{
   Int_t nrow;
   Int_t ncol;
   Float_t vArr[100][100];

   TFile *f = new TFile("test.root");
   TTree *T = (TTree*)f->Get("T");

   DATA vData;
   T->SetBranchAddress("vDataBranch",&vData.fNRows);
//   TH1F *hed = new TH1F("hed","ma values",100,-100,100);
//   TH2F *hed2 = new TH2F("hed2","ed values",99,0,99,99,0,99);
   TH2F *hed2 = new TH2F("hed2","ed values",100,0,100,100,0,100);

   Int_t nentries = (Int_t)(T->GetEntries());
   cout << "number of entries: " << nentries << endl;

   T->GetEntry();
   cout << "vData.fNRows: " << vData.fNRows << endl;
   cout << "vData.fNCols: " << vData.fNCols << endl;
   cout << "vData.fLength: " << vData.fLength << endl;
   cout << "vData.fMeas0: " << vData.fMeas[0] << endl;
   cout << "vData.fMeas1: " << vData.fMeas[1] << endl;
   cout << "vData.fMeas2: " << vData.fMeas[2] << endl;

   nrow = vData.fNRows;
   ncol = vData.fNCols;
   for (Int_t i=0;i<nrow;i++) {
      for (Int_t j=0;j<ncol;j++) {
         vArr[i][j] = vData.fMeas[i*ncol + j];
         hed2->SetCellContent(i,j,vArr[i][j]);
//         hed->Fill(vArr[i][j]);
      }
   }
   printf("nrows = %i, ncols = %i \n",nrow,ncol);
//   hed->Draw();
   hed2->Draw("col");
}
//---------end macro2.C---------

This is the output:
//------begin output------
[christian@cookiebook xchip]$ root
  *******************************************
  *                                         *
  *        W E L C O M E  to  R O O T       *
  *                                         *
  *   Version   3.00/00  19 December 2000   *
  *                                         *
  *  You are welcome to visit our Web site  *
  *          http://root.cern.ch            *
  *                                         *
  *******************************************

CINT/ROOT C/C++ Interpreter version 5.14.65, Dec 6 2000
Type ? for help. Commands must be C++ statements.
Enclose multiple statements between { }.
root [0] .L macro2.C
root [1] fillarray(90,90)
******************************************************************************

*Tree    :T         : a simple test with an
array                            *
*Entries :        1 : Total =           32491 bytes  File  Size =
10303 *
*        :          : Tree compression factor =
3.15                       *
******************************************************************************

*Branch  :vDataBranch :
fNRows/I:fNCols:fLength:fMeas[fLength]/F             *
*Entries :        1 : Total  Size=      32491 bytes  File Size  =
10303 *
*Baskets :        1 : Basket Size=      32000 bytes  Compression=
3.15     *
*............................................................................*

root [2] readarray()
number of entries: 1
vData.fNRows: 90
vData.fNCols: 90
vData.fLength: 8100
vData.fMeas0: 0
vData.fMeas1: 1
vData.fMeas2: 2
nrows = 90, ncols = 90
<TCanvas::MakeDefCanvas>: created default TCanvas with name c1
root [3] TBrowser b
//--------end output--------

Now I have the following questions to the following problems:

1, Tree-Print(): Why are the entries so different for macro1.C und
macro2.C?

2, TBrowser: When I double-click on fNRows, a value of 10 is shown,
   although fNRows = 90!! Why is not the right value displayed?

3, TBrowser: When I double-click on fNCols, the Browser hangs
   and I have to kill root. Moreover I also have to close the
   terminal-window, since it does no longer work either.
   What is happening here?

Overall: What did I wrong in my code??? Why does it seem to work?

(My system: PowerBook with LinuxPPC, running KDE1.1)

Any help would be greatly appreciated.
Thank you very much and Happy New Year

Christian Stratowa
Vienna, Austria



This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:40 MET