Środowisko do Analizy Danych Obiektowo Orientowane Izabela Ciepał Instytut Fizyki Jądrowej PAN Kraków
Środowisko do Analizy Danych Obiektowo Orientowane Plan: 1. Co to jest ROOT? 2. Programowanie OO. 3. Główne elementy/obiekty. 4. Co potrafi ROOT drzewa ntuple, dopasowanie funkcji, cięcia graficzne, analiza danych.
Co to jest ROOT? System ROOT jest to Obiektowo Orientowane (OO) środowisko, którego funkcjonalności pozwalają na przechowywanie danych, jak i ich efektywną analizę. Dane są definiowane jako zestaw obiektów, do których możemy sięgać przy pomocy istniejących metod oraz funkcji. bazuje na językach programowania C++ (interpreter) i C, kod opensource (jest dostępny za darmo), przeznaczony do obiektowej analizy dużych zbiorów danych, ciągle i aktywnie rozwijany przez wielu ludzi, elastyczność jest związana ze złożonością manual jest obszerny (ponad 300 stron), istnieje wiele poradników i kursów w internecie. 3
Programowanie Obiektowo Orientowane Klasa ENCJA/BYT (ang. Entity): atrybuty, operacje, Relacje (ang. Relations) relacje między encjami, Obiekt instancja klasy/encji (zbiór obiektów opisywanych tymi samymi cechami) Model E/R (Entity/Relations) Struktura logiczna systemu graficzny język zapisu UML 4
Programowanie Obiektowo Orientowane Zapis UML-owy: diagram klas cechy klasy usługi danej klasy: funkcje i metody 5
Programowanie Obiektowo Orientowane Cechy OO : Klasy Dziedziczenie Polimorfizm Hermetyczność 7
Programowanie Obiektowo Orientowane Dziedziczenie przykład: 8
Podstawowe obiekty w ROOT THistogram przedstawienie graficzne danych 1D, 2D lub 3D TTree - gałęzie, liście, - bardziej skomplikowany format danych, - przechowuje informacje o każdym zdarzeniu NTupla - pojedyncza gałąź + liście TFile - przechowuje dane w dowolnej postaci tj. histogramów, grafów, drzew. Makro (nie jest obiektem) - plik zawierający zestaw komend wykonywanych przez interpreter GUIs Graphical User Interface nakładka graficzna, nie trzeba znać komend 10
Jak tworzymy obiekty danej klasy? bez wskaźnika z użyciem wskaźnika Pies_domowy kajtek; kajtek Szczekaj(); Pies_domowy *mojpies; Pies_domowy kajtek; Pies_domowy = & kajtek; mojpies Szczekaj(); dynamicznie Pies_domowy *mojpies = new Pies_domowy() ; mojpies Szczekaj(); delete mojpies; 11
Co to jest ROOT? strona www ROOT-a: http://root.cern.ch/ - wiele przykładów, poradników, informacja o dostępnych klasach, metodach i funkcjach, kod źródłowy (do ściągnięcia) RootTalk mailing list - bardzo pomocna kurs Fermilab ROOT: http://www-root.fnal.gov/root/ kurs SLAC ROOT: http://www.slac.stanford.edu/bfroot/www/doc/workbook /root1/root1.html 12
Zadanie 1: Proszę uruchomić ROOT-a oraz zakończyć jego działanie. WSKAZÓWKI: http://root.cern.ch/ Documentation User's Guide ROOT User's Guide Pro version 5.34.00 Getting Started 13
Documentation User's Guide ROOT User's Guide Pro version 5.34.00 Getting Started root [] linia komend 14
TBrowser nawigator w ROOT root [0] new TBrowser; 15
TBrowser rootfile rootfile 16
TBrowser rootfile Ikony reprezentujące różne typy spektr/obiektów profile, 1-D histogram, 2-D histogram, N-tuple 17
TBrowser 18
Histogramy 19
Histogram 1D 20
Histogram 1D bin histogramu 21
TCanvas - obiekty Tytuł hist. Histogram Statystyka Y-axis Frame Canvas X-axis 22
TPad 23
Zadanie 2: Proszę stworzyć obiekt c1 klasy TCanvas : 1. o nazwie MyCanvas, 2. o wielkości 400 x 600 px, 3. podzielony na 4 pady, 4. na 3 padzie proszę umieścić napis Hallo World!, 5. ustawić rozmiar czcionki na 0.15 6. narysować ten obiekt WSKAZÓWKI http://root.cern.ch/ Documentation User's Guide ROOT User's Guide Pro version 5.34.00 Getting Started 24 https://root.cern.ch/root/html/tutorials/graphics/canvas.c.html
ODPOWIEDŹ: root [] TCanvas c1("c1", "MyCanvas", 600, 400); root [] c1.divide(2,2); root [] c1.cd(3); root [] TText t1(0.05,0.8, Hello World! ); root [] t1.settextsize(0.15); root [] t1.draw(); 25
Zadanie 3: Proszę wygenerować (przy użyciu FillRandom()) histogram, będący rozkładem Gaussa dla 5 000 zdarzeń o dowolnej szerokości rozkładu i wartości oczekiwanej. WSKAZÓWKI http://root.cern.ch/ Documentation User's Guide ROOT User's Guide Pro version 5.34.00 Histograms 26
tworzenie histogramu 1D ODPOWIEDŹ: root[ ] TH1F h1("h1","rozklad Gaussa",100,-3,3); root[ ] h1.fillrandom("gaus",10000); root[ ] h1.draw( E ); 27
Histogram 1D zmiana wyglądu histogramu aktywny histogram kolor hist. 28
Histogram 1D zmiana wyglądu histogramu aktywny histogram rodzaj wypełnienia 29
Histogram 1D zmiana wyglądu histogramu tytuł histogramu 30
Histogram 1D zmiana wyglądu histogramu zmiana binowania i zakresu 31
Zadanie 4: Proszę zmienić dla histogramu z poprzedniego zadania: 1. kolor, 2. wypełnić go teksturą, 3. wpisać tytuł, 4. zmienić binowanie, 5. zrobić zoom WSKAZÓWKI http://root.cern.ch/ Documentation User's Guide ROOT User's Guide Pro version 5.34.00 Getting Started 32
Histogram 2D tworzenie histogramu 2D root [ ] TH2F mojhist("h_nazwa", "h_tytul", 5, 0., 5., 5, 0.,5.); root [ ] mojhist.fill(0,0); root [ ] mojhist.draw("colz"); root [ ] mojhist.fill(4,4); root [ ] mojhist.fill(4,1); root [ ] mojhist.fill(1,4); root [ ] mojhist.draw("colz"); 33
Dopasowywanie funkcji do danych (Data Fitting) Zadanie 5: Do wygenerowanego w zadaniu 3 histogramu, proszę dopasować funkcję rozkładu Gaussa, z użyciem: 1. interfejsu graficznego (Tools-> Fit Panel), 2. linii komend (h1->fit("gaus","v","e1",-1,1.5)) http://root.cern.ch/ Documentation User's Guide ROOT User's Guide Pro version 5.34.00 Fitting Histograms 1 x - [1] 2 [2] - ( [0] e ) 34
Dopasowywanie funkcji do danych (Data Fitting) Funkcje dostępne w ROOT: "gaus" gaus = p0*exp(-0.5*pow((x-p1)/p2),2) "expo" expo = exp(p0+p1*x) "poln" poln = p0 + p1*x + p2*pow(x,2) + p3*... Parametry dopasowania: root[ ] TF1 *gfit = (TF1 *)h1->getfunction("gaus"); root[ ] gfit->getparameter(0); root[ ] gfit->getparameter(1); root[ ] gfit->getparerror(0); root[ ] double par[3]; root[ ] gfit->getparameters(par); 35
Dopasowywanie funkcji do danych (Data Fitting) Funkcje zdefiniowane przez użytkownika: root[ ] root[ ] root[ ] root[ ] TF1 *fu = new TF1("f1", "sin(x)/x", 0, 10); TF1 *fd = new TF1("f2", "f1 * 2", 0, 10); fu->draw(); fd->draw("same"); 36
Dopasowywanie funkcji do danych (Data Fitting) Zadanie 6: Do histogramu hfs, proszę: 1. dopasować funkcję sinusoidalną korzystając z linii komend, 2. wyświetlić parametry tego dopasowania 3. narysuj legendę http://root.cern.ch/ http://root.cern.ch/ Documentation Documentation User's Guide ROOT User's Guide Pro version 5.34.00 Fitting Histograms Fit Statistics User's Guide ROOT User's Guide Pro version 5.34.00 Graphics Legends 37
Dopasowywanie funkcji do danych (Data Fitting) ODPOWIEDŹ: root[ ] TF1 *fu = new TF1("f1","[0]*sin([1]*x+[2])",-20,20); root[ ] fu->setparameter(0,80); root[ ] fu->setparameter(1,0.5); root[ ] fu->setparameter(2,10); root[ ] hfs->fit("f1"); root[ ] gstyle->setoptfit(1111); TLegend *legend =new TLegend(.75,.80,.95,.95); legend->addentry(hfs,"dane"); legend->addentry(f1,"fit"); legend->draw(); 38
TTree & NTuple TTree jest to struktura, która przechowuje dane w postaci tzw. zdarzenie po zdarzeniu (ang. event by event ), TChain łańcuch/lista zbiorów Roota, TNtuple dziedziczy po TTree - jedna gałąź drzewa. 39
TTree & TNtuple Co można zrobić z drzewem/ntuplą? 1. mamy dostęp do każdego zdarzenia, gdy analizujemy dane 2. możemy tworzyć różne wykresy/zależności 1D oraz 2D. 3. możemy nakładać/definiować różne cięcia (ang. Cut) 4. możemy tworzyć dowolne histogramy pod zdefiniowanymi przez nas warunkami/cięciami 5. Ntuple/drzewa są wygodniejsze od histogramów, bo można przy pomocy ich liści (TLeaf) tworzyć dowolne zależności i nie trzeba za każdym razem sortować danych, co jest bardzo czasochłonne 40
TTree & TNtuple Zadanie 7: Proszę otworzyć plik root dp_eksperyment.root : 1. zlokalizować drzewo, gałęzie, liście, 2. uruchomić TreeViewer, 42
TTree & TNtuple Kilka gałęzi: gałęzie TBranch liście TLeaf 43
TTree & TNtuple Kilka gałęzi: prawy przycisk myszy i StartViewer 44
TTree & TNtuple opcje rysowania gałęzie cięcia (TCut) wyrażenia liście przeciągamy liście, aby narysować histogram rysujemy histogram 45
TTree & TNtuple Zadanie 8: 1. Proszę narysować histogram 1D dla zmiennych Event.fEn1, Event.fTh1, za pomocą: a) interfejsu graficznego, b) linii komend. 2. Proszę zapisać uzyskany histogram jako plik.root oraz.pdf. 46
TTree & TNtuple Histogram 1D: 1.wybieramy zmienną i przeciągamy ją 2.klikamy 47
TTree & TNtuple Histogram 1D: 1.wybieramy zmienną i przeciągamy ją 3.histogram! 2.klikamy 48
TTree & TNtuple ODPOWIEDŹ: z linii komend: root [ ] TFile f ("dp_eksperyment.root"); root [ ] TTree *T = (TTree*)f Get("T"); root [ ] TCanvas *mycanvas = new TCanvas(); root [ ] T->Draw("Event.fEn1"); 49
TTree & TNtuple Histogram 2D: 1.wybieramy 1-szą zmienną i przeciągamy ją 2.wybieramy 2-gą zmienną i przeciągamy ją 3.klikamy 50
TTree & TNtuple Histogram 2D: 2.wybieramy 2-gą 4.histogramzmienną! i przeciągamy ją 51
TTree & TNtuple Zadanie 9: 1. Proszę narysować histogram 2D bazując na liściach z gałęzi Event: Event.fdE1_conv vs. Event.fEn1 za pomocą: a) interfejsu graficznego, b) linii komend. 2. Proszę zapisać uzyskany histogram jako plik.root oraz.pdf. 52
TTree & TNtuple ODPOWIEDŹ: z linii komend: root [ ] TFile f ("dp_eksperyment.root"); root [ ] TTree *T = (TTree*)f Get("T"); root [ ] TCanvas *mycanvas = new TCanvas(); root [ ] T Draw("Event.fdE1_conv:Event.fEn1"); 53
Zadanie 10: 1. Proszę przygotować histogram Event.fdE1_conv vs. Event.fEn1 do dalszej pracy w następujący sposób: a) użyć opcji colz, b) ustawić skalę osi X : 0-180, c) ustawić skalę osi Y: 0-900, d) zmienić binowanie obu osi. 2. Proszę zapisać uzyskany histogram jako plik.root oraz.pdf. 54
REZULTAT: 55
Cięcia graficzne (Graphical Cuts) Pozwala na zdefiniowanie określonego, zamkniętego obszaru histogramu: 56
Cięcia graficzne (Graphical Cuts) Klikamy w kolejne punkty histogramu i tworzymy zamknięty obszar: 57
Cięcia graficzne (Graphical Cuts) Efekt końcowy: 58
Cięcia graficzne (Graphical Cuts) Zapisujemy cięcie: 59
Cięcia graficzne (Graphical Cuts) Zapisujemy dwukrotnie z rozszerzeniem.root oraz.c: 60
Cięcia graficzne (Graphical Cuts) Jak zobaczyć cięcie? linia komend: root [ ] TFile f("c1.root"); root [ ] TGraph *g = (TGraph*)f->Get("CUTG"); root [ ] g->draw("al"); GUI: 1. root [ ] new TBrowser; 2. StartViewer 3. Event.fdE1_conv vs. Event.fEn1 4. root [ ].x mycut.c 61
Rysowanie histogramów pod różnymi warunkami 62
Rysowanie histogramów pod różnymi warunkami 63
Rysowanie histogramów pod różnymi warunkami 64
Proste makra w ROOT Makro zestaw poleceń/komend, które potrafi przeczytać interpreter; Makro to plik z rozszerzeniem nazwa.c: - można używać poleceń takich jak w linii komend, - język programowania C++ (Object Oriented) lub C. Makro uruchamiamy z linii komend: root [ ].x mojemakro.c 66
Proste makra w ROOT Otwieramy proste makro o nazwie mojemakro1.c: W tym celu należy: 1. > emacs mojemakro1.c & 2. każde makro zawiera: { otwarcie } zamknięcie Pomiędzy tymi nawiasami znajdują się instrukcje dla Root. Odwolujemy się do pliku dp_eksperyment.root oraz korzystamy z metody Ttree::Draw. 67
Proste makra w ROOT Draw( wyrazenie, warunki, opcje ); wyrazenie= e1, e1:e2 lub e1:e2:e3, co odpowiada histogramom 1-D, 2-D 3-D warunki = "x<y && sqrt(z)>3.2", Używamy operatorów: ==, +, *,!, &&, opcje= colz 68
Dziękuję za uwagę :) Izabela Ciepał Instytut Fizyki Jądrowej PAN Kraków izabela.ciepal@ifj.edu.pl Prezentacja przygotowana w ramach Warsztaty 3N 69