#include "TFile.h" #include "TTree.h" #include "TClonesArray.h" class Traj : public TObject { public: int fX; int fY; int fZ; ClassDef(Traj,1); }; class Detector : public TNamed { public: Detector(const char *name = "not set") : TNamed(name,"title"),fTrajs("Traj") {} TClonesArray fTrajs; Traj *AddTraj() { return new (fTrajs[fTrajs.GetEntries()]) Traj; } void Clear(const char *opt = "") { fTrajs.Clear(opt); } ClassDef(Detector,1); }; class EventInfo { public: EventInfo() : fEventNumber(0),fRunNumber(0) {} void SetRunNumber(Int_t run) { fRunNumber = run; } void SetEventNumber(Int_t event) { fEventNumber = event; } private: Int_t fEventNumber; Int_t fRunNumber; }; void Create(const char *filename = "example.root", Int_t runnumber = 1, Int_t nevents = 10) { TFile *output = new TFile(filename,"RECREATE"); TTree *tree = new TTree("tree","tree"); EventInfo *info = new EventInfo; info->SetRunNumber(runnumber); TObjArray detectors; for(Int_t d = 0; d < 10 /* number of detectors */; ++d ) { Detector *det = new Detector(TString::Format("det_%d.",d)); detectors.Add(det); } tree->Branch("info.",&info); tree->Branch(&detectors); for(Int_t event = 0; event < nevents; ++event) { Int_t detindex = 0; TIter next( &detectors ); Detector *det = 0; while( (det = (Detector*)next() ) ) { det->Clear(); for(int t= 0; t < 20 /* number of traj */; ++t ) { Traj *traj = det->AddTraj(); traj->fX = (detindex+1)*(t+1); traj->fY = (detindex+1)*(t+4); traj->fZ = (detindex+1)*(t+412); } detindex++; } tree->Fill(); } output->Write(); delete output; }