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); } } --------------------------------------------------
This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:34:33 MET