[ROOT] TTree filling problem

From: Ben Speakman (bspeak@physics.umn.edu)
Date: Tue Nov 05 2002 - 17:27:40 MET


  We have had some trouble with the new TTree::ChangeFile() method trying
split a tree to a separate file before it has reachd the 1.9GB limit.
This method is called when TFile::GetBytesWritten() exceeds 1.9GB, but
the value returned by TFile::GetBytesWritten() deviates from the actual
file size when the tree is written the following way.
  I create a tree in a file using:

TFile *fFile = new TFile("file.root","RECREATE");
TTree *fTree = new TTree("fTree","Tree Name");

  Then I make some branches using the TTree::Branch(const char* name,
void* address, const char* leaflist, Int_t bufsize = 32000) method,
leaving the bufsize to default.

  A loop runs to fill fTree:

for(...) {
  ...set variables
  TDirectory* savedir = gDirectory;
  fTree->Fill();
  fFile->cd();
  fTree->AutoSave();
  fFile->SaveSelf();
  savedir->cd();
  }

  In this loop I can watch the file size with fFile->GetBytesWritten(),
which seems to increase well beyond the actual file size.  This becomes a
problem when fFile prematurely thinks it is bigger than 1.9GB, and tries
create the new file_1.root.

  I have attached a simple script which illustrates the trouble.  When I
call the routine treesize to fill the tree 1000 times, and save everytime
the fFile->GetBytesWritten() explodes to 829kB, while the actual file size
sits at 12kB.

root [0] .L treesize.C
root [1] treesize(1,100,1000)
Output 0.2kB to 0.2kB to 3.9kB to 4.0kB
4       file.root
Output 95.8kB to 95.8kB to 96.5kB to 96.7kB
12      file.root
Output 185.3kB to 185.3kB to 186.1kB to 186.2kB
12      file.root
Output 275.6kB to 275.6kB to 276.4kB to 276.5kB
12      file.root
Output 366.4kB to 366.4kB to 367.2kB to 367.3kB
12      file.root
Output 457.8kB to 457.8kB to 458.6kB to 458.7kB
12      file.root
Output 549.8kB to 549.8kB to 550.6kB to 550.7kB
12      file.root
Output 642.3kB to 642.3kB to 643.1kB to 643.2kB
12      file.root
Output 735.1kB to 735.1kB to 735.9kB to 736.0kB
12      file.root
Output 828.1kB to 828.1kB to 828.9kB to 829.0kB
12      file.root

  Is this manner of using AutoSave improper?  Is there a better way to
define TTrees to prevent this from happening?

Thanks,
Ben Speakman





This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:51:16 MET