small branches not be written out

From: Robert Feuerbach (feuerbac@ernest.phys.cmu.edu)
Date: Tue Feb 15 2000 - 00:14:30 MET


Hi,

I'm having a problem with "small" branches not being written out, until
it contains enough data. The problem appears to be related to the
buffer size, though I haven't been able to figure out what exactly is
going wrong. The version of ROOT I'm using is 2.23/12, running on a linux
box (RedHat 5.2) with egcs-1.1.2.  The test case I'm using is:

//************ testclass.h **************//
#include <iostream>

#include <TObject.h>

extern "C" {
  #include "ROOTtypes.h"
}

class AClass : public TObject {
public:
  AClass(Int_t a1=0,Int_t a2=3);
  virtual ~AClass();
  void SetVal(Int_t aa, Int_t ab) { a1=aa, a2=ab; }

private:
  Int_t a1, a2;
  
public:
  ClassDef(AClass,1)
};
//*********** testclass.cc ************//
#include "testclass.h"

ClassImp(AClass)
AClass::AClass(Int_t aa, Int_t ab) : a1(aa), a2(ab) {
  cerr << "AClass "<<a1<<" "<<a2<<" being created.\n";
}
AClass::~AClass() {
  cerr << "\tAClass "<<a1<<" "<<a2<<" being destroyed.\n";
}
//************ main routine ***********//
#include <iostream>
#include <stdlib.h>
#include "testclass.h"
#include "TROOT.h"
#include "TFile.h"

int main(int argc, char * argv[]) {

  static TROOT Root("Root","Test");
  static TTree *tree;
  static AClass *A = 0;
  static TBranch *Abr;
  TFile fRootfile("test.out","RECREATE","Test file");
  tree = new TTree("T","test tree");

  int i, j;

  Int_t max = 10;
  Int_t bufsize=16000;
  Int_t split = 1;
  Int_t compress = 2;
  Int_t autosave = 1000000;

  cout << "Max = "<<max<<".\n";
  cout << "Compression = "<<compress<<".\n";
  cout << "Split = "<<split<<".\n";
  cout << "Bufsize = "<<bufsize<<".\n";
  cout << "AutoSave = "<<autosave<<".\n";

  fRootfile.SetCompressionLevel(compress);
  tree->SetAutoSave(autosave);
  
  for (i=0; i<max; i++) {
    for (j=20; j<max+20; j++) {
      if (!A) {
	A = new AClass(i,j);
	
	Abr = tree->Branch("a","AClass",&A,bufsize,split);
	tree->SetBranchStatus("a",1);
      }

      if (A) {
	A->SetVal(i,j);
      }

      tree->Fill();
    }
  }

  fRootfile.Write();
  tree->Print();

  return 0;
}


With a buffersize = 16000 (the default), until max > 60 the tree->Print()
called at the end shows that the # of entries is correct, but 0 bytes for
each branch are being written out. When I look at the file in ROOT, I get
the same thing. Am I doing something wrong?

Thanks for the help,
Rob Feuerbach



This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:19 MET