Post on 22-Aug-2020
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 1
ROOT III(I/O+TTree+TNtuple)
ROOT IIIROOT III(I/(I/O+TTree+TNtupleO+TTree+TNtuple))
Grzegorz StefanekJan Kochanowski University
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 2
ROOT – operacje I/OStruktura plików ROOT-
pliki ROOT mają
strukturę
katalogu w których podkatalogi i obiekty
są
zorganizowane w nieograniczoną
ilość
poziomów-
format plików ROOT jest niezależny maszynowo
-
w programach/skryptach plik jest obiektem klasy TFile-
struktura i zawartość
pliku może być
przegłądana
z użyciem
przeglądarki, tzn. obiektu klasy TBrowser-
struktura fizyczna i własności pliku mogą
być
przeglądane
z wykorzystaniem metody TFile::Map()- każdy plik ROOT posiada nagłówek opisujący podstawowe
parametry/własności pliku-
wszystkie klasy zapisane w pliku są
opisane w liście zwanej
StreamerInfo- bezpośredni (nie-sekwencyjny) dostęp do elementów pliku zapewniająklucze (TKeys) będace
obiektami klasy TKey
oraz metoda TFile::Get()
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 3
ROOT – operacje I/OStruktura plików ROOTPrzykład:
{char name[10],title[10]; TObjArray
Hlist(0); //utworzenie tablicy histogramów
TH1F *h; //utworzenie wskaźnika do hist// utworzenie 15 histogramów i dodanie do tablicy obiektówfor (Int_t
i=0;i<15;i++) {
sprintf(name,”h%d”,i);sprintf(title,”histogram
nr:%d”,i);
h = new
TH1F(name,title,100,-4,4);Hlist.Add(h);h->FillRandom(”gaus”,1000); }
// otwarcie pliku i zapis tablicy histogramówTFile
f(”histogramy.root”,”recreate”);
Hlist.Write();f.Close();
}
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 4
ROOT – operacje I/OStruktura plików ROOT
Otwieranie, przeglądanie plików:Tfile
f(”demo.root”);
Tbrowser
browser;
Sprawdzenie poprawnościotwarcia pliku:Tfile
f(”histogramy.root”);
if(f.IsZombie() {cout<<”Blad
otwarcia pliku”<<endl;
exit(-1);} else
{
……. }
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 5
ROOT – operacje I/OStruktura plików ROOTf.Map()
↑ ↑ ↑ ↑ ↑data/czas adres liczba klasa wspólczynnik
pocz. bytow
kompresjirekordu
← nagłowek
← histogramy
← StreamerInfo
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 6
ROOT – operacje I/OStruktura plików ROOTNagłówek pliku
zawiera szczegółowe informacje o pliku i pozwala
zidentyfikować
go jako zgodnego z formatem ROOT.
fVersion
pośrednio wskazuje na rozmiar pliku. nfree
i fNbytesFreeopisuje obszar pliku dostepny
do wykorzystania.
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 7
ROOT – operacje I/OStruktura plików ROOTStreamerInfo
zawiera szczegółowe informacje o wszystkich klasach
zapisanych w pliku, dostępne przez polecenie Tfile::ShowStreamerInfo.W rzeczywistości polecenie to pokazuje jedynie pierwsza linie opisu.
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 8
ROOT – operacje I/OStruktura plików ROOTROOT zawiera zlożony
mechanizm odzyskiwania zawartosci
plików
w przypadku problemów podczas sesji, TFile::Recover()
Metoda TFile::Map() odczytuje informacje sekwencyjnie. Dostęp sekwencjny
jest niewystarczający gdy przeprowadzamy analizę.
Potrzebny jest bezpośredni dostęp do obiektów w pliku z wykorzystaniemkluczy (TKeys) pełniących role indeksów obiektów.
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 9
ROOT – operacje I/OStruktura plików ROOT
Metoda TFile::Get() znajduje obiekt o kluczu TKey
o żądanej nazwie, TH1F *h9 = (TH1F*)f.Get(”h9”);
Przykład. (FileKey.C)
{TFile
f(”histogramy.root”);
TIter
next(f.GetListOfKeys());TKey
*key;
while((key=(TKey*)next())) {printf(”key:%s
points
to an object
of class: %s at
%d\n”,
key->GetName();key->GetClassName(),key->GetSeekKey());
} }
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 10
ROOT – operacje I/OStruktura plików ROOT
Przykład. (FileKey.C) –
output
Obok listy kluczy występują
też
inne listy:TFile::fFree, TFile::fListHead
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 11
ROOT – operacje I/O
Struktura plików ROOT
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 12
ROOT – operacje I/O
Struktura plików ROOTObiekt klasy TFile
zachowuje się
jak obiekt klasy TDirectory
(jest katalogiem). Jak w każdym katalogu można wyświetlać
jego zawartość
i tworzyć
podkatalogi. Podczas sesji ROOT cały czas jesteśmy
w katalogu, bierzacy
katalog jest przechowywany w gDirectory.
TFile
f(”histogramy.root”);f.ls(); // wyświetlenie zawartości plikugDirectory->pwd(); // bierzący
katalog
gDirectory->ls(”-m”); // obiekty w pamięcigDirectory->ls(”-d”); // obiekty na dyskugDirectory->GetList()->ls(); // lista obiektow
w pamięci
hist->SetDirectory(newDir); // histogram w nowym kataloguhist->Write(); // zapis obiektu na dyskf->Write(); // zapis wszystkich obiektów na dyskf->Close(); // zamknięcie pliku
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 13
ROOT – TTree/TNtupleDla zapisywania dużej liczby obiektów tej samej klasy ROOT udostępnia specjalnie do tego celu przeznaczone klasy TTree
(drzewo) , TNtuple.
Klasa Ttree
została zoptymizowana
w celu ograniczenia zajmowanej przestrzeni dyskowej oraz zwiększenia szybkości dostępu do obiektów w pliku.
TTree
pozwala na przechowanie wszystkich typów (prostych i złożonych)danych: obiektów i tablic obiektów.
TNtuple
jest przeznaczone do przechowywania liczb rzeczywistych.
W Ttree
zapisujemy bufory danych zwane gałęziami i wypełniamy je danymi pełniącymi rolę
liści. Bufory są
zapisywane, gdy zostaną
całkowicie zapełnione.
Obiekty w TTree
nie są
zapisywane pojedyńczo
lecz grupowane i zapisywane grupowo, dlatego pliku tworzone są
mniejsze niż
dla
obiektów zapisywanych pojedyńczo.
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 14
ROOT – TTree/TNtupleUżycie TTree
pozwala na znaczące skompresowanie nagłówków obiektów,
całkowity nagłówek jest redukowany z 60 do 4 bajtów.
TTree
optymizuje czas dostępu do pliku. Dane są
zapisywane w gałęziach pliku, a każda gałąź
może być
odczytana niezależnie od wszystkich
pozostałych.
Przykład:
Załóżmy że mamy 1mln przypadków zawierających dane Px, Py, a chcemy policzyć
Px2
+ Py2
dla każdego przypadku i wypełnić
histogram.
Dla danych zapisanych standardowo (bez TTree) należy wykonać:• wczytać
do pamięci każdy przypadek w całości
• pobrać
Px, Py
dla każdego przypadku• policzyć
Px2
+ Py2
• wypełnić
histogram
Musimy to wykonać
1mln razy co jest bardzo czasochłonne, a przecież
niepotrzebujemy całych przypadków.
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 15
ROOT – TTree/TNtupleJeśli używamy TTree
z jedną
gałęzią
zawierającą
Px, a drugą
zawierająca
Py. Wówczas możemy przeczytać
wszystkie wartości Px, Py
czytając jedynie gałęzie Px, Py.
Przykład:
Proste drzewo (TTree) , staff.root/
staff.C
/ cernstaff.dat
Cechy skryptu:
• definiuje strukturę
staff_t
opisującą
cechy personelu CERNu• otwiera plik ASCII, tworzy plik ..root oraz drzewo TTree• tworzy trzy gałęzie drzewa /staff, Division, Nation/ wraz z adresami początkowymi liści w oparciu o strukturę
staff_t
• wczytuje dane z pliku ASCII i zapisuje do struktury staff
oraz wypełnia drzewo tree
• zamyka plik ASCII i zapisuje plik ROOT (z drzewem tree) na dysk • f->Write() zapisuje drzewo tree• drzewo jest zapisane w pliku staff.root
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 16
ROOT – TTree/TNtupleDostęp do wejść
w ramach drzewa zapewnia metoda TTree::Show.
Przykładowy dostęp do wejścia nr 10:TFile
f(”staff.root”);
T->Show(10);
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 17
ROOT – TTree/TNtupleDostęp do struktury drzewa (ilość
wejść, gałęzie, drzewa) zapewnia
metoda TTree::Print.
Przykładowy dostęp do struktury drzewa:T->Print();
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 18
ROOT – TTree/TNtuplePrzeskanowanie zawartości wybranych liści w ramach drzewa zapewniametoda TTree::Scan
Przykładowe skanowanie kilku liści w ramach drzewaT->Scan(”Cost:Age:Children”);
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 19
ROOT – TTree/TNtupleTTree
Viewer
(przeglądarka drzew).
TTree
Viewer
pozwala na szybkie i proste przeglądanie struktury i własności drzew w plikach.
Uruchamianie:
-
klikniecie myszą
na TTree
i wyselekcjonowanie StartViewer
-
TFile
f(”staff.root”);T->StartViewer()
-
gSystem->Load(”libTreeViewer.so”);new
TTreeViewer();
// start TTree
Viewer
bez pliku
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 20
ROOT – TTree/TNtupleTTree
Viewer
(przeglądarka drzew).
->
Panelz listą
drzew
i ich gałęzi
<-
Panel z listązmiennych
i liści
Komendy użytkownika
↓
Opcjerysowania
↓
Nazwahistogramu
↓
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 21
ROOT – TTree/TNtupleTTree
Viewer
(przeglądarka drzew).
←
Zapis sesjido plikuhistorii
PrzekierowanieTTree::Scan
do pliku ASCII
↓
Przełącznikmodu
rysowania
histogramu
↓
Rysowaniewielowy-miarowychhistogramów
→
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 22
ROOT – TTree/TNtupleTTree
Viewer
(przeglądarka drzew).
Pasek ustawianiapoczątku,końca zakresuwejść
→
↑Nazwa listywejściowej (TList)
↑Nazwa listywyjściowej (TList)
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 23
ROOT – TTree/TNtupleTBranch
– gałęzie drzewa
• gałąź
jest elementem drzewa i jest klasy TBranch
• dla dodania gałęzi do drzewa należy uzyć
metody TTree::Branch()
• organizacja gałęzi pozwala na zoptymalizowanie danych dla projektowanego ich użycia
• jeśli dwie zmienne są
niezależne i nie będą
używane razem to powinnybyć
umieszczone w osobnych gałęziach
• jeśli zmienne są
związane (jak np. współrzędne punktów) to należy jeumieścić
w tej samej gałęzi
• każda z gałęzi może być
zapisywana do oddzielnego pliku
• gałęzie mogą
się
znacznie różnic w zależności od tego jakie informacje(listy zmiennych prostych, całe złożone obiekty, zawartość
katalogu,
tablice obiektów) są
w nich zapisane
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 24
ROOT – TTree/TNtupleTBranch
– gałąź
z listą
zmiennych
Tworzenie listy:tree->Branch(”EV_Branch”,&event,”temp/F:ntrack/I:nseq:flag/i”);
gdzie EV_Branch
–
nazwa gałęzi&event
–
adress
od którego musi być
czytany pierwszy element listy
temp/F –
zmienna typu rzeczywistegontrack/I –
zmienna typu integer
flag/i –
zmienna typu integer
bez znaku
ogólnie trzeci parametr ma postać
<Zmienna>/<Typ>:<Zmienna>/<Typ> gdzie<Typ>= C –
łańcuch znakowy zakończony 0, B,S,I,L
–
integer
(8,16,32,64 bity)
ze znakiem, b,s,i,l
–
integer
(8,16,32,64 bity) bez znaku, F,D
–
liczba rzeczywista (32,64 bity)
Brak oznaczenia typu oznacza poprzedni (w parametrze) typ lub F.
Nazwy liści nie zapewniają
dostąpu
do zmiennych. Zmienne występujące w trzecim parametrze TTree::TBrach
muszą
być
umieszczane w strukturze
(staff.C).
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 25
ROOT – TTree/TNtupleTBranch
– gałąź
z listą
zmiennych
Lista może zawierać
całą
tablicę
zmiennych:
Float_t
f[10];
tree->Branch(”fBranch”,f,”f[10]/F”);
w tym tablicę
o zmiennym rozmiarze
TFile
*f = new
TFile(”photon.root”,”recreate”);
Int_t
nPhot;
Float_t
E[500];
TTree* nEmcPhotons
= new
TTree(”nEmcPhotons”,”EMC
Photons”);
nEmcPhotons->Branch(”nPhot”,&nPhot,”nPhot/I”);nEmcPhotons->Branch(”E”,E,”E[nPhot]/F”);
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 26
ROOT – TTree/TNtupleTBranch
– gałąź
zawierająca obiekt
Przykład:.L libEvent.so
// biblioteka z definicja klasy Event
TFile
*f = new
TFile(”ObjectFile.root”,”RECREATE”);
TTree
*tree
= new
TTree(”T”,”Object
Tree”);
Event
*event
= new
Event(); // wskaznik
do obiektu klasy Event
tree->Branch(”EventBranch”,”Event”,&event,32000,99);
gdzie EventBranch
–
nazwa gałęziEvent
–
klasa obiektu
&event
–
adres wskaźnika do umieszczanego obiektu 32000 –
standardowy rozmiar bufora (32000 bytes) w tej konfiguracji
99 –
poziom rozszczepienia gałęzi na podgałęzie
Rozszczepienie gałęzi tworzenie podgałęzi dla każdego elementu danych w ramach obiektu. Poziom rozszczepienia może wynosić
0 (1 gałąź),
1 (każdy element danych obiektu ma gałąź), 2,3 …, 99. Im więcej gałęzi ( rozszczepień) tym mniejszy rozmiar bufora.
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 27
ROOT – TTree/TNtupleTBranch
– gałąź
zawierająca obiekt
Dwie klasy ROOT dedykowane obiektom : TObjArray, TClonesArray.TObjArray
słuzy
do przechowywania obiektów różnych klas,
TClonesArray
przechowuje obiekty tej samej klasy czyli każdy obiektma ten sam rozmiar.
Dla TObjArray
pamięć
musi być
przydzielana i zwalniana dla każdego Obiektu, TClonesArray
używa ciągle tego samego fragmentu pamięci.
Przykład:
Mamy 100.000 przypadków z 10000 śladów każdy, czyli razem 109
śladów. Używając TObjArray
dla śladów musimy przydzielać/zwalniaćpamięć
109
razy co wymaga kilku godzin. Używając TClonesArray
nie potrzebujemy dodatkowego czasu na manipulowanie pamięcią.
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 28
ROOT – TTree/TNtupleTBranch
– gałęzie z katalogów, ze zbiorów elementów (kolekcji)
tree->Branch(„/aFolder”); // tworzy gałąź
z każdego// elementu w katalogu
// zwraca całkowitą
liczbę
gałęzi
tree->Branch(*aCollection, 8000, 99, *col);
gdzie aCollection
–
wskaźnik do zbioru8000 –
rozmiar bufora
99 –
stopien
rozszczepieniacol
–
nazwa rozpoczynająca każda gałąź
(col_ )
Metoda Branch
tworzy jedną
gałąź
z każdego elementu kolekcji.Poziom rozszczepienia może być
różny w zależności od tego czy każdy
z elementów kolekcji jest klasy TCollection
czy tez nie.
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 29
ROOT – TTree/TNtupleTTree
– przykłady:
1) Prosty przykład zapisu i odczytu z pliku z drzewem –
tree1.CZawiera główna funkcję
tree1 oraz funkcje zapisu tree1w
i odczytu tree1r.Jeśli skrypt nie jest uruchamiany w wersji „batch”
to wyświetla
drzewo w przeglądarce i i TreeViewer.
Metody uruchomienia: >.x tree1.C // uruchamiana cala funkcja
// z wykorzystaniem interpretera
>.x tree1.C++ // uruchomienie po wykonaniu kompilacji// z wykorzystaniem kompilatora
>.L tree1.C // wczytanie skryptu do ROOTa> tree1w() // uruchomienie funkcji ze skryptu> tree1r() // uruchomienie funkcji ze skryptu
t1->SetBranchAddress() –
ustawienie adressu
do zmiennej w drzewiet1->GetEntry() –
pobranie jednego wejścia w drzewie
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 30
ROOT – TTree/TNtupleTTree
– przykłady:
2) Bardziej złożony przykład (tree2.C) pokazujący jak:-
jak tworzyć
gałęzie ze struktur C++
-
jak utworzyć
gałąź
z tablicy o stałym rozmiarze-
jak utworzyć
gałąź
z tablicy o zmiennym rozmiarze
-
jak czytać
określone gałęzie-
jak wypełniać
histogramy z gałęzi
-
jak wykorzystać
TTree::Draw
dla prezentacji histogramu 3D
W przykładzie wykorzystywany jest pakiet Geant3, a struktura jest wypełniana przez funkcje Geant3 w każdym kroku w polu magnetyczny (funkcja helixStep). Dla wypełniania drzewa wystarczy metoda TTree::Fill
Tworzenie gałęzi z tablicy o stałym rozmiarze: > t2.Branch(”vect”,gstep.vect,”vect[7]/F”);
Tworzenie gałęzi z tablicy o zmiennym rozmiarze:> t2.Branch(”nmec”,&gstep.nmec,”nmec/I”);> t2.Branch(”lmec”,gstep.lmec,”lmec[nmec]/I”);
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 31
ROOT – TTree/TNtupleTTree
– przykłady:
2) Analiza w przykładzie (tree2.C):
Odczyt pojedynczej gałęzi zamiast całej struktury.> TBranch
*b_destep
= t2->GetBranch(”destep”);
Ustawienie adresu do gałęzi destep.> b_destep->SetAddress(&destep);
Użycie metody TTree::GetEntry
dla pobrania zawartości gałęzi.> b_destep->GetEntry(i);
Wypełnienie histogramu wejściami z gałęzi destep.> hdestep->Fill(destep);
Narysowanie histogramu i dopasowanie funkcji Gaussa.> hdestep->Fit(”gaus”);
Dodatkowo rysowana jest trajektoria cząstki z wykorzystaniem trzech wartości zapisanych w wektorze> t2->Draw(”vect[0]:vect[1]:vect[2]”);
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 32
ROOT – TTree/TNtupleTTree
–
3 opcje czytania (GetEntry) przypadków z drzewa:
Event
*event
=0;
T.SetBranchAddress(”event”,&event);
1) Standardowa (rekomendowana)for (Int_t
i=0;i<nentries;i++) {
T.GetEntry(i); }
2) Z wykorzystaniem AutoDeleteTBranch
*branch
= T.GetBranch(”event”);
branch->SetAddress(&event);branch->SetAutoDelete(kTRUE);for (Int_t
i=0;i<nentries;i++) {
T.GetEntry(i);
}
3) Z samodzielnym kasowaniem przypadkufor (Int_t
i=0;i<nentries;i++) {
delete
event;
event
= 0;
T.GetEntry(i); }
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 33
ROOT – TTree/TNtuple
Bardziej złożone przykłady drzew w plikach:
-
hsimple.root
(ntuple)
-
tree_01I_shift_pion.root
(analiza efektu „flow”
dla hiperonów Λ)
-
t49run4047.root
(dane eksperymentu NA49 w formacie ROOT)
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 34
ROOT – Tekst/LatexTekst może być
dodawany wprost na histogramach (w oknach).
Edytor posiada wbudowany element związany z edycja teksu(toolbar
)
Tekst może być:-
modyfikowany
-
przemieszczany- skalowany-
obracany
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 35
ROOT – Tekst/LatexElementy ROOT wykorzystujące Latex:
- tytuły histogramówh->SetTitle(”p_{T} distribution”);
- tytuły osi histogramówh->GetXaxix("p_{T} (GeV/c) ");h->GetYaxis(Nevents);
-
legenda do wykresuTLegend
*legend1=new TLegend(0.25,0.58,0.4,0.8);
legend1->SetFillColor(10);legend1->SetTextFont(72);legend1->SetTextSize(0.045);legend1->SetBorderSize(0);legend1->AddEntry(gr1," #pi^{+}, #pi^{-} ","p");legend1->AddEntry(gr4," K^{0}_{s} ","p");legend1->AddEntry(gr2," p ","p");legend1->AddEntry(gr3," #Lambda ","p");
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 36
ROOT – Tekst/LatexElementy ROOT wykorzystujące Latex:
- komentażeTLatex
gty;
gty->SetTextColor(1);gty->SetTextSize(0.04);gty->SetTextAlign(12);gty->SetTextAngle(90);gty.DrawLatex(0.95,0.006,"#Gamma = 2#sigma[GeV]");
-
formuły matematyczne
=
ROOT – An Object-Oriented Data Analysis FrameworkGrzegorz Stefanek 37
ROOT – Tekst/LatexZłożone przykłady wykorzystania Latex’a
w pakiecie ROOT:
latex.Clatex2.Clatex3.C
symbole greckie latex4.Csymbole matematyczne latex5.C