Odczyt i zapis obiektów do pliku.

Dane w ROOT zapisuje się plikach ROOTowych. Ich odczyt i zapis jest relatywnie prosty. Przykłądowo w celu zapisu histogramu do pliku użyjemy takiego kodu:

void new_histo(){
    TH1D *histo = new TH1D("histo","histo",100,0,1);
    TFile *file = new TFile("data.root","recreate");
    histo->Write();
    file->Close();
}

Ważne w tym kodzie jest użycie opcji "recreate" oznacza ona utworzenie/nadpisanie pliku, bez niej ROOT będzie próbował otworzyć plik. W momencie wywołania konstruktora TFile nijako znajdujemy się w tym pliku, oznacza to że każde TH1D:Write zapisze nam histogram w aktualnie otwartym pliku. W przypadku gdy mamy jednocześnie otwarte wiele plików możemy przechodzić z jednego do drugiego przy pomocy metody TFile::cd().

Odczyt obiektu z histogramu jest równie prosty. Rozważmy takie makro:

void read_histo(){
    TFile *f = new TFile("data.root");
    f->ls();
    TH1D *h = (TH1D*)f->Get("histo");
    //wersja alternatywna
    //auto = f->Get("histo");
    f->Close();
    h->Draw();
}

Tutaj otwieramy sobie plik, następnie przy pomocy ls listujemy obiekty wewnątrz pliku (zobaczymy coś typu KEY: TH1D histo;1 histo - czyli min. informację o klasie obiektu oraz jego nazwę). Następnie taki plik sobie wczytujemy metodą Get, należy zwrócić tu uwagę że Get zwraca TObject i musimy tutaj zrobić rzutowanie na obiekt klasy TH1D (w ROOT 5 nie było to konieczne). Potem zamykamy nasz plik bo nie jest nam potrzebny, rysujemy histogram i ... dostajemy błąd.

Object ownership

Z czego wynika błąd? wynika on z tego, że w ROOT istnieje pewne automatyczne zarządzanie pamięcią, w tym przypadku autorzy doszli do wniosku, że ponieważ zamykamy plik to pewnie "obrobiliśmy" dane i można je pozwalniać. Niestety, ponieważ próbujemy tych danych użyć dorysowania, a ich nie ma - program się wysypuje. Problem ten można obejść na kilka sposobów, najprostszym jest nie wywoływanie TFile::Close, przez co pamięć nie będzie zwalniana, drugą opcja jest użyce TH1D::SetDirectory(0x0) co oznacza, że nasz histogram staje się "wolny" (tzn. niezależny od pliku) i po zamknięciu nadal będzie istniał w pamięci. Generalnie ownership w ROOT powoduje, że trzeba bardzo uważać na zamykanie plików.

TBrowser

Wcześniej pokazano że TFile::ls pozwala zobaczyć listę obiektów, często jednak chcemy sobie te obiekty podejrzeć "na szybko". Do takiego szybkiego podglądu można użyć klasy TBrowser, użycie jej polega ona na tym, że w ROOT po prostu wpisujemy "new TBrowser()" i otwiera nam się przeglądarka plików (można też wpisać w terminal root nazwa_pliku a potem new TBrowser, wtedy od razu jesteśmy w interesującym pliku i nie musimy wyklikiwać do niego ścieżki).

Rys.1 TBrowser z otwartym plikiem widać dwa histogramy wewnątrz pliku (histo2 i histo) klikając na nie można je narysować na Canvas_1 (białe okno po prawej stronie). Warto zwrócić uwagę na pasek nad eksploratorem plików, możemy tutaj min. posortować obiekty według nazwy czy zmienić opcję rysowania histogramów. Interesującą opcją jest to że po kliknięciu prawym przyciskiem myszy można wejść w menu obiektu i np. dokonać inspekcji obiektu (Inspect).