Hi Christian, yesterday, I answered a similar question from Rolf.Dubitzky. I said: Two problems in your small test: - TClonesArray must reference objects with a fix structure. TNamed or like are not authorized because each class instance has a different length. - Up to version 2.23/08 included, it was not possible to have a TClonesArray branch in non-split mode. I am supporting this feature in 2.23/09 to be released tomorrow. Your program will work if you set split=1. However, as I said above, you cannot use classes like TNamed or any class where instances have a different size in a TClonesArray. Rene Brun Christian Holm Christensen wrote: > > Hi ROOT'ers > > I have a peculiar problem. I'm trying to write objects to a TTree, via > a TClonesArray. However, it seems, that the array isn't written to > file, and the TBranchClones objects fList pointer points to zero. What > am I doing wrong? > > Here's the code: > > // file Foo.C //////////////////////////////////////// > TFile* file; > TNamed* obj; > TClonesArray* array; > TTree* tree; > TBranch* branch; > > int > Foo(void) > { > file = new TFile("foo.root", "RECREATE"); > tree = new TTree("tree", "A tree"); > array = new TClonesArray("TNamed",2); > branch = tree->Branch("branch",&array); > > (*array)[0] = new TNamed("foo", "Foo object"); > tree->Fill(); > (*array)[1] = new TNamed("bar", "Bar object"); > tree->Fill(); > > file->Write(); > file->Close(); > > delete file; > > return 0; > } > > int > Bar(void) > { > file = new TFile("foo.root", "READ"); > file->ls(); > > tree = (TTree*)file->Get("tree"); > if (!tree) { > cout << "Bad!" << endl; > return 1; > } > > branch = tree->GetBranch("branch"); > > if (!branch) { > cout << "Bad!" << endl; > return 2; > } > > cout << "Object `branch' is a " > << branch->IsA()->GetName() << " object" > << " with " << branch->GetEntries() << " entries" << endl; > > array = ((TBranchClones*)branch)->GetList(); > if (!array) { > cout << "Bad! (address of array is " << array << ")" << endl; > return 4; > } > > int n = array->GetEntriesFast(); > for (int i = 0; i < n ; i++) { > if (!(*array)[i]) { > cout << "Bad! (No object at position " << i > << " in array)" << endl; > continue; > } > cout << "Entry " << i << " in Clones array in tree is " > << ((TNamed*)(*array)[i])->GetName() << " " > << ((TNamed*)(*array)[i])->GetTitle() << endl; > } > > return 0; > } > // End of file Foo.C ///////////////////////////////// > > And the output: > > // Output from ROOT ////////////////////////////////// > root [0] .L Foo.C > root [1] Foo() > (int)0 > root [2] Bar() > TFile** foo.root > TFile* foo.root > KEY: TTree tree;1 A tree > Object `branch' is a TBranchClones object with 0 entries > Bad! (address of array is (nil)) > (int)4 > // End of Output from ROOT /////////////////////////// > > If any of you have an idea why this fails, please notice that I'm not > on the roottalk mailing list (Too much trafic I'm afraid - how about a > rootdigest list?), so please respond to me (cholm@nbi.dk) also. > > Thanks > > Christian Holm > ---------------------------------------------------------------- > Christian Holm Christensen Phone: (+45) 35 35 96 91 > Sankt Hansgade 23. 1, th Office: (+45) 353 25 307 > DK-2200 Copenhagen N Email: cholm@nbi.dk > Denmark Homepage: www.nbi.dk/~cholm > > > >
This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:43 MET