Hlavní navigace

Tvorba histogramů v prostředí ROOT

23. 6. 2004
Doba čtení: 5 minut

Sdílet

Společně se podíváme, jak se v prostředí ROOT tvoří jednoduché histogramy.

Než začneme

Pokud provozujeme prostředí ROOT v interaktivním grafickém režimu (spouštíme root bez přepínače -b pro batch režim), je vhodné zajistit co největší grafické rozlišení. Rozlišení 1280×1024 je minimum, naopak docela dobře vystačíme i s osmibitovou barevnou hloubkou, pokud oželíme antialiasing. Ve vyšším rozlišení nebudeme muset zoomovat tak často a zobrazovaný výsledek je více podobný tomu, který nakonec uvidíme na papíře. Pro ukládání hotových výsledků budeme používat formát (e)ps, což je jediná použitelná volba, pokud chceme kvalitní tiskový výstup.

Histogramy

jsou nejčastěji používanou částí ROOT frameworku.

histogram m. stat. grafické znázornění počtu případů určitého druhu pomocí různě velikých sloupků, jejichž základna vyjadřuje rozmezí třídy.

Třídy reprezentující histogramy jsou pojmenovány podle schématu THDP.

  1. Všechny třídy v ROOTu, které označují nějaký typ dat, začínají velkým písmenem T.
  2. Druhý znak H naznačuje, že jde o reprezentaci histogramu
  3. Třetí znak určuje rozměr histogramu 1–3, 1 pro 1D histogram, …
  4. Čtvrtý znak určuje maximální hodnotu jednotlivých binů.
    C – 255
    S – 65535
    I – 2147483647
    F – 7 číselný float
    D – 14 číselný float

Příklad: Jednorozměrný float histogram je TH1F.

ROOT podporuje i 1D a 2D profile histogramy (třídy TProfile a TProfile2D).

Histogram je rozdělen na předem stanovený počet binů. Root podporuje u všech typů histogramů biny s konstantní nebo proměnnou velikostí. ROOT umožnuje i automatické přispůsobení rozsahu jednotlivých os vstupním datům, takže u histogramu stačí předem nastavit jen požadovaný počet binů. Kromě toho jsou u histogramů použity underflow a overflow biny, kam se ukládají data překračující předem zvolený rozsah.

Náš první histogram

Po spuštění naběhne ROOT do interaktivního režimu. Pokud nemáme prostředí XWindowS, je nutné použít přepínač -b pro batch režim. V batch režimu sice neuvidíme výsledek v grafice, ale můžeme si jej uložit do souboru a prohlédnout později.

(hsn@ttyp0):~/clanky/wip% root
  *******************************************
  *                                         *
  *        W E L C O M E  to  R O O T       *
  *                                         *
  *   Version   4.00/03     22 April 2004   *
  *                                         *
  *  You are welcome to visit our Web site  *
  *          http://root.cern.ch            *
  *                                         *
  *******************************************

FreeType Engine v2.1.3 used to render TrueType fonts.
Compiled for freebsd4.

CINT/ROOT C/C++ Interpreter version 5.15.128, Mar 16 2004
Type ? for help. Commands must be C++ statements.
Enclose multiple statements between { }.
root [0]

V interaktivním režimu je možné ihned zadávat C/C++ příkazy nebo zadávat speciální příkazy interpretru, které začínají tečkou a jejichž seznam je uveden v nápovědě ?. Nejdůležitější příkazy jsou .x soubor pro vykonání obsahu souboru a .q pro ukončení.

V našem prvním příkladě budeme zadávat příkazy přímo. Vytvoříme 1D histogram o velikosti 100 binů s konstantní velikostí s rozsahem osy x od –2 do 2.

root [0] h1=new TH1F("h1","Nas prvni histogram",100,-2,2)
(class TH1F*)0x8e0ac00 

Naplníme tento histogram 3000 daty z předdefinované funkce gaus, což je generátor náhodných čísel s gaus distribucí.

root [1] h1.FillRandom("gaus",3000) 

a nakreslíme výsledek

root [2] h1.Draw()
<TCanvas::MakeDefCanvas>: created default TCanvas with name c1 


Root pro zobrazení histogramu automaticky vytvořil TCanvas objekt s jménem c1. Využijeme jej a uložíme si histogram do souboru formátu ps.

root [3] c1->SaveAs("h1.ps")
Info in <TCanvas::Print>: ps file h1.ps has been created 

Pokud chceme tyto příkazy spouštět ze souboru, je nutné doplnit na konce řádek středníky a všechny příkazy uzavřít do bloku { }. V ROOTu mají takové soubory koncovku .C a jsou spustitelné v interpretru pomocí příkazu .x nebo mohou být předány programu root jako argumenty. Výsledný program je zde.

Pokud bychom trvali na kompilované formě, je nutné příkazy doplnit ještě (ne)potřebnou C++ omáčkou, jako jsou includy a deklarace typů u proměnných, a používat správně operátory -&gt; a .. Kompilovaná forma se v praxi používá pouze v případě, že narazíte na bug nebo na nepodporovanou vlastnost CINTu.

Druhý histogram

Jako druhý příklad jsem zvolil real-world příklad. Budeme kreslit histogram zobrazující škálovatelnost databáze PostgreSQL na OS FreeBSD 5.2. Nasbírané performance data máme v souboru freebsd52.txt. Vypadají takto:

(hsn@ttyp0):~/clanky/wip% head freebsd52.txt
1 48.95
1 53.15
1 43.17
1 36.08
1 44.70
1 45.68
1 39.61
1 38.82
1 35.95
1 39.60

První číslo je počet klientů a druhé je dosažená hodnota v TPS. Protože měření vykazuje jisté výkyvy, je každý pokus opakován 10×. Měření bylo prováděno pro 1 až 17 klientů včetně.

 1  {
 2    gROOT->Reset();
 3
 4    Int_t n;
 5    Float_t tps;
 6
 7    h1=new TH1F("freebsd","PostgreSQL - FreeBSD 5.2",17,1.0,18.0);
 8    h1->SetFillColor(48);
 9    f=fopen("freebsd52.txt","r");
10    while(1)
11    {
12      if(EOF==fscanf(f,"%d %f\n",&n,&tps)) break;
13      h1.Fill(n,tps);
14    }
15    fclose(f);
16    h1.Scale(0.1);
17    h1.Fit("pol4");
18    h1.GetXaxis()->SetTitle("Clients");
19    h1.GetYaxis()->SetTitle("TPS");
20    gStyle->SetOptStat(1100);
21    h1.Draw("");
22  } 

(Neobarvený zdroják je zde.)

Komentář k jednotlivým řádkům:

2 Globální proměnné v ROOTu začínají malým g. Tento příkaz provede kompletní reset prostředí ROOT. Zkuste si ho umístit někdy do těla programu.

4,5 Typy končící s _t jsou platformově nezávislé. V našem případě není jejích použití nezbytné. Deklarace je v tomto případě nutná, protože jinak bychom dostali na řádku 12 chybu – nedefinovaný identifikátor.

7 Konstruktor histogramu. První argument je název pro případné uložení do souboru, druhý je titulek, poté následuje počet binů (speciální biny pro under a over flow se nepočítají), minimální a maximální hodnota pro osu X. Limity pro osu X můžeme nechat ROOTa automaticky určit. V tomto případě jsou zahrnuty, abych ukázal že minimální mez je v histogramu zahrnuta, zatímco maximální nikoliv. Rozsah osy X je tedy 1,0 – 17,99999.

8 Nastavení barvy pro vyplnění histogramu. Default je bílá, která není na defaultově bílém pozadí vidět.

9–15 Načítání dat ze souboru v klasickém C stylu. Na řádce 13 přičteme načtenou hodnotu do histogramu.

16 Od každého měření jsme přečetli 10 hodnot. Vynásobíme proto histogram 0,1, abychom dostali aritmetický průměr

17 Pro zajímavost proložíme histogramem polynom čtvrtého řádu

18–19 Popis os

20 Změníme zobrazované položky v popisce se statistikou. Argumentem je dekadicky zadávaná bitová maska určující, které položky chceme zobrazit

21 A nakreslíme výsledek


CS24_early

S nakresleným histogramem můžeme provádět několik specifických věcí. V první řadě je to aktivace status řádky pomocí Options->Event Status, ve které lze odečítat hodnoty z histogramu pomocí myšky. Pokud klepneme pravým tlačítkem na vrchol sloupečku, mělo by se zobrazit popup menu k histogramu TH1F::freebsd. V tomto menu jsou zajímavé dvě položky. První se jmenuje Smooth a trošku vyhladí hrany v histogramu (možno opakovat vícekrát pro větší vyhlazení), druhá se jmenuje FitPanel a zobrazí uživatelské rozhraní, kde můžeme měnit parametry a typ funkce pro prokládání histogramem.

Byl pro vás článek přínosný?

Autor článku