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