// Note: one MUST use this code as (pre)compiled (e.g. by ACLiC) because // the "storage" class inherits from a compiled class ("TObject"): // root [0] .L breakingExample.C++ // root [1] breakingExampleWrite(); // root [2] breakingExampleRead(); // #include #include #include #include #include class storage : public TObject { public: TTree* tree; storage() { tree = 0; } ClassDef(storage, 1); // my storage class }; void breakingExampleWrite() { TTimeStamp time; Double_t value; TFile* file = new TFile("tmp.root", "recreate"); auto tree = new TTree("tree", "tree"); tree->Branch("Time", &time); tree->Branch("Value", &value); const int nEvents = 10000000; TTimeStamp lastSave; for(long i = 0; i < nEvents; ++i) { time = TTimeStamp(); value = gRandom->Uniform(-10., 10.); tree->Fill(); if (time.AsDouble() - lastSave.AsDouble() > 10) { printf("saving...\n"); tree->AutoSave("SaveSelf"); lastSave = time; } } tree->AutoSave("SaveSelf FlushBaskets"); tree->Write(); delete file; file = new TFile("tmp.root"); tree = (TTree*)file->Get("tree"); auto fout = new TFile("final.root", "recreate"); storage stor; stor.tree = tree->CloneTree(); stor.Write("storage"); delete fout; delete file; } void breakingExampleRead() { auto file = new TFile("final.root"); auto stor = (storage*)file->Get("storage"); stor->tree->Print(); stor->tree->Show(22); stor->tree->Scan(); delete file; }