Hi Christian, The TTree split mode should not be used in several cases. See the list of restrictions described in the Users Guide or at URL: http://root.cern.ch/root/HowtoWriteTree.html look at section: Making a Tree with many branches In your example, the solution is to replace: vTree->Branch("vBranch","TestClass",&vTest,256000,1); by vTree->Branch("vBranch","TestClass",&vTest,256000,0); I am currently removing all the restrictions to the TTree split mode. The split and no-split mode will use the same algorithm using the new TStreamerInfo class. For more info, see: http://root.cern.ch/root/SchemaEvolution.html The new algorithm should be available in teh coming few weeks. Rene Brun cstrato@EUnet.at wrote: > > Dear Rooters > > I would like to store names as TString in a treebranch, but have > problems in reading them back. > > I have a class "TestClass" which I use in TBranch. The following > code in macro1 seems to work but in macro2 I can only read back > the number vFloat but not the name vName: > > ---------macro1.C--------------- > { > TFile *vFile = new TFile("test.root","RECREATE"); > TTree *vTree = new TTree("vTree","data from file name.txt"); > TestClass *vTest = new TestClass(); > TBranch *vBranch = > vTree->Branch("vBranch","TestClass",&vTest,256000,1); > > ifstream vInput.open("name.txt", ios::in); > > // I tested the following three definitions > // which one should I use? > char* vName = new char[8]; > char vName[8]; > TString vName; > > for (Int_t i=0;i<1000;i++) { > vInput >> vFloat >> vName; > if (!vInput.good()) break; > > vTest->FSetFloat(vFloat); > vTest->FSetName(vName); > > vTree->Fill(); > vTest->Clear(); > } > > vInput.close(); > vTree->Write(); > > delete vTest; > delete [] vName; > } > > ---------macro2.C--------------- > { > TFile *vFile = new TFile("test.root","READ"); > TTree *vTree = (TTree*)vFile->Get("vTree"); > TestClass *vTest = new TestClass(); > vTree->SetBranchAddress("vBranch",&vTest); > > // none of the following three definitions seems to work > char* vName = new char[8]; > char vName[8]; > TString vName; > > for (Int_t i=0;i<1000;i++) { > vTree->GetEntry(i); > > vFloat = vTest->FGetFloat(); > vName = vTest->FGetName(); > > // this prints vFloat correctly, but random chars for vName > printf("vFloat=%.3lf,vName=%s\n", vFloat, vName); > // this prints vFloat correctly, but nothing for vName > cout << "vFloat= " << vFloat << " vName= " << vName << endl; > } > > delete vTest; > delete [] vName; > } > > ---------TestClass-------------- > class TestClass: public TObject { > > private: > TString fName; > Float_t fFloat; > > public : > > TestClass(); > ~TestClass(); > > void FSetFloat(Float_t vFloat) {fFloat = vFloat;} > // first test to store TString > void FSetName(const char *vName) {fName = vName;} > // second test to store TString: should I use this function? > void FSetName(const char *vName) {fName = TString(vName,8);} > > Float_t FGetFloat() const {return fFloat;} > const char* FGetName() const {return fName;} > > ClassDef(TestClass,1) //TestClass > }; > > //-------------------- > #include "TestClass.h" > > ClassImp(TestClass); > > TestClass::TestClass(): TObject() > { > } > > TestClass::~TestClass() > { > }//Destructor > //-------------------- > > Could you please tell me what I am doing wrong? I tested differnt > ways to read back TString, but none of them seem to work. > > Thank you in advance for your help. > > Best regards > Christian Stratowa > Vienna, Austria > > My system: PowerBook running LinuxPPC 2000 > root 3.00/01 22 December 2000
This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:34 MET