Strange behaviour in TTree::TBranch split/no split

Alexander Zvyagin (zvyagin@mx.ihep.su)
Sun, 24 May 1998 20:18:14 GMT+03:00


IHEP, Protvino, Russia, 24-MAY-1998

Dear ROOT users!

I have very simple class EVENT (see below).
I want to store TTree of EVENTs in root
file "test.root". Macro main.C produces file "test.root". It creates branch
of EVENTs either in serial mode main.C(0) or in split mode main.C(1)
Finally I have macro test.C that reads EVENTs from file "test.root".

Here my four root sessions (without root startup messages).
----------------------------------------------------------------------
SESSION 1 and SESSION 2: main.C and test.C in one root session
-----------------------
Next commands produce the same output.
$ root -b -q main.C\(0\) test.C
$ root -b -q main.C\(1\) test.C
... Skiped ...
Processing main.C(0)... or Processing main.C(1)...
TFile Writing Name=test.root Title=file

*** Break *** segmentation violation

Processing test.C...
TFile** test.root
TFile* test.root
KEY: TTree EVENT tree;1 EVENT tree
Warning: File "/users/zvyagin/PPDS/1998-05-work/TEST/./EVENT.so" already
loaded
0
1
2
3
NULL

It's OK.
The message "*** Break *** segmentation violation" will disappear
if I'll use "TTree *tree = new TTree(...)" instead of "TTree tree(...)".
(I do not worry about this message but prefer do not have it.)
--------------------------------------------------------------------------
SESSION 3 split mode, main.C and test.C in different root sessions
-----------------------
$ root -b -q main.C\(1\) ; root -b -q test.C
... Skiped ...
Processing main.C(1)...
TFile Writing Name=test.root Title=file
... Skipped ...
Processing test.C...
TFile** test.root
TFile* test.root
KEY: TTree EVENT tree;1 EVENT tree
0
1
2
3
NULL

It's OK.

---------------------------------------------------------------------
SESSION 4: serial mode, main.C and test.C in different root sessions
-----------------------
$ root -b -q main.C\(0\) ; root -b -q test.C
... Skiped ...
Processing main.C(0)...
TFile Writing Name=test.root Title=file
... Skipped ...
Processing test.C...
TFile** test.root
TFile* test.root
KEY: TTree EVENT tree;1 EVENT tree
0
1
0
3
NULL

EVENTs are wrong in that case. I expect 0,1,2,3 instead of 0,1,0,3.
Who works incorrectly: me or ROOT??

Thanks in advance,
Alexander Zvyagin.

====================================================================
Files:

EVENT.h
--------------------------------------------------
#ifndef EVENT___include
#define EVENT___include

#include <TObject.h>
class EVENT : public TObject
{
public:
EVENT(void) {}
Char_t v1;
ClassDef(EVENT,1)
};

#endif // EVENT___include
--------------------------------------------------

EVENT.c
--------------------------------------------------
#include "EVENT.h"
ClassImp(EVENT)
--------------------------------------------------

main.C
--------------------------------------------------
int main(int split)
{
gSystem->Load("EVENT.so");

TFile root_file( "test.root", "RECREATE", "file", 9 );
TTree tree("EVENT tree","EVENT tree");

EVENT event, *event_ptr=&event;

TBranch *branch = tree.Branch("EVENT","EVENT",&event_ptr,32000,split);
if( NULL==branch )
{
printf("Can not create branch.\n");
exit(1);
}

for( int i=0; i<4; i++ )
{
event.v1 = i;
tree.Fill();
}

root_file.Write();
root_file.Close();

return 0;
}
--------------------------------------------------

test.C
--------------------------------------------------
void test(void)
{
gROOT->Reset();

TFile f("test.root");

gSystem->Load("EVENT.so");

EVENT event, *event_ptr = &event;

TTree *tree = f.Get("EVENT tree");
if( NULL==tree )
{
printf("Can not find tree.\n");
exit(1);
}

TBranch *branch = tree->GetBranch("EVENT");
if( NULL==branch )
{
printf("Can not find branch.\n");
exit(1);
}

branch->SetAddress(&event_ptr);
Int_t nevent = tree->GetEntries();

for( Int_t i=0; i<nevent; i++ )
{
tree->GetEvent(i);
printf("%d\n",event.v1);
}
}
--------------------------------------------------