#include <iostream>

static const int gsNevt = 200;

class Data : public TObject 
{
public:
  Data() : fI(0) { }
  Data(int i) : fI(i) { }
  
public:
  int fI;
};

//......................................................................

class Event : public TObject 
{
public:
  Event() : {
    fRun   = 0;
    fEvt   = 0;
    fTop   = gROOT->GetRootFolder()->AddFolder("EventData",
					       "Detector event data...");
    // fTop->SetOwner(kTRUE);
    fF1 = fTop->AddFolder("Folder1","First folder...");
    fF2 = fTop->AddFolder("Folder2","Second folder...");
    // fF1 ->SetOwner(kTRUE);
    // fF2 ->SetOwner(kTRUE);
  }

  void Clear(const char* option=0) {
    fRun = 0;
    fEvt = 0;
    fTop->Clear();
  }
  
public:
  int      fRun; // Run number
  int      fEvt; // Event number
  TFolder* fTop; // Top level folder for detector data
  TFolder* fF1;  // A set of detector data
  TFolder* fF2;  // Another set of detector data
};

//......................................................................

void testWrite() 
{
  TFile f("treetest.root","RECREATE");
  
  Event* evt = new Event;
  
  TTree* tree = new TTree("EventTree","Event tree");
  tree->Branch("EventBranch","Event",&evt,64000,99);
  tree->Branch("fF1", "TFolder",&evt->fF1,64000,99);
  tree->Branch("fF2", "TFolder",&evt->fF1,64000,99);
  
  TClonesArray* d1 = new TClonesArray("Data");
  TClonesArray* d2 = new TClonesArray("Data");
  // d1->SetOwner(kTRUE);
  // d2->SetOwner(kTRUE);
  evt->fF1->Add(d1);
  evt->fF2->Add(d2);

  for (int i=1; i<501; ++i) {
    evt->fRun = 100;
    evt->fEvt = i;
    d1->Clear();
    d2->Clear();
    for (int j=0; j<1001; ++j) {
      new ((*d1)[j]) Data(j);
      new ((*d2)[j]) Data(j);
    }
    tree->Fill();
    if (i%10==0) fprintf(stderr, "Event=%d\n", i);
  }

  f.Write();
  f.Close();
}

//......................................................................

void testRead() 
{
  TFile f("treetest.root");
  TTree*   evtTree;
  TBranch* evtBranch;
  Event*   evt = 0;

  evtTree   = (TTree*)f.Get("EventTree");
  evtBranch = evtTree->GetBranch("EventBranch");
  evtBranch->SetAddress(&evt);
  // evtBranch->SetAutoDelete(kTRUE);
  
  for (int i=0; i<gsNevt; ++i) {
    evt->Clear();
    evtBranch->GetEntry(i);
    TClonesArray* d1 = evt->fF1->FindObjectAny("Datas");
    TClonesArray* d2 = evt->fF2->FindObjectAny("Datas");
    if (evt->fEvt%10==1)
      fprintf(stderr,"Event=%d: %d %d\n",
	      evt->fEvt, d1->GetLast(), d2->GetLast());
  }
}

////////////////////////////////////////////////////////////////////////

