- 5.1 Introduzione
- 5.2
TH1F
: istogrammi monodimensionali- 5.2.1 i bin di un istogramma
- 5.2.2 istogrammi monodimensionali e distribuzioni di densità di probabilità
- 5.2.3 istogrammi monodimensionali in
ROOT
- 5.2.4 riempimento di un
TH1F
- 5.2.5 visualizzazione di un
TH1F
- 5.2.6 opzioni grafiche
- 5.2.7 un esempio: la forma funzionale Gaussiana
- 5.2.8 scale logaritmiche
- 5.2.9 le statistiche di un istogramma
- 5.3 una piccoola digressione: la varianza di una distribuzione
- 5.4 rappresentazione di andamenti y vs x: i
TGraph
- 5.5 TH2F: istogrammi bidimnesionali
- 5.6 L'interfaccia interattiva di
ROOT
: la classeTApplication
- 5.7 Una gestione furba del testo:
TString
- 5.8 ESERCIZI
ROOT
offre un insieme di strumenti di visualizzazione, analisi e salvataggio dati sviluppati nell'ambito della fisica delle particelle elementari- gli strumenti sono scritti in
C++
ed esiste l'interfacciaPython
per utilizzarli, con adattamenti al formato dei dati alla sintassi tipica di quell'ambiente ROOT
offre anche un ambiente interattivo che si presenta nella forma di una linea di comando, dove istruzioni scritte inC++
vengono interpretate da un parser dedicato- In questo corso vi mostriamo alcune funzionalità di
ROOT
, la descrizione completa di quello che può fare si trova nella documentazione on-line
- in un programma scritto in
C++
, ogni oggetto diROOT
viene reso disponibile nel codice sorgente con il corrispondente comando#include
- la maggior parte degli strumenti disponibili sono implementati
sotto forma di classi
#include "TH1F.h" int main (int argc, char ** argv) { TH1F istogramma ("istogramma", "istogramma", 10, -5., 5.) ; return 0 ; }
- la visualizzazione degli strumenti statistici è un aspetto fondamentale del programma, quindi molte opzioni grafiche sono integrate negli oggetti statistici
- dopo l'installazione, le librerie di
ROOT
sono salvate nel disco fisso solitamente in una cartella dedicata - per avviare l'interfaccia interattiva e per conoscere dove stiano le librerie,
è necessario che:
- la cartella che contiene l'eseguibile
root
faccia parte della lista di indirizzi salvati nella variabile d'ambiente della SHELL$PATH
- la cartella che contiene le librerie precompilate
faccia parte della lista di indirizzi salvati nella variabile d'ambiente della SHELL
$LD_LIBRARY_PATH
- la cartella che contiene l'eseguibile
- esiste lo script
thisroot.sh
nelle cartelle di installazione che va richiamato per effettuare tali impostazioni:> source thisroot.sh
- è necessario fornire al compilatore opzioni aggiuntive perché sia in grado di trovare tutti i file da includere e tutte le librerie da compilare
- la lista di opzioni aggiuntive si visualizza con il seguente comando di SHELL:
> root-config --cflags --glibs
- per evitare di copiare ed incollare il suo output nel comando di compilazione,
si può includere la sua chiamata direttamente nel programma di compilazione,
utilizzando gli apici inversi:
> c++ -o main_00 `root-config --glibs --cflags` main_00.cpp
- gli istogrammi sono una rappresentazione di distribuzioni differenziali, costruita a partire da un campione di numeri, che chiamiamo eventi
- si parte quindi da un campione di eventi {xi}i=1,..,N
- un esempio di un campione di eventi è l'insieme delle misure raccolte durante un esperimento, oppure una sequenza di numeri pseudo-casuali
- per una variabile casuale di interesse x, si suddivide il suo intervallo di definizione
in sotto-intervalli adiacenti e disgiunti delimitati da {xk}
- l'intervallo k-esimo è limitato fra xk ed xk+1
- solitamente gli intervalli sono chiamati bin
- un istogramma è l'insieme dei conteggi degli eventi che cascano in ogni intervallo
- la visualizzazione di un istogramma mono-dimensionale mostra tipicamente:
- sull'asse orizzontale l'intervallo di definizione della variabile x
- sull'asse verticale i conteggi corrispondenti a ciascun bin
- sopra ad ogni bin, una barra verticale alta quanto i conteggi
- al limite per la dimensione dei bin che diventa infinitesima, un istogramma diventa una funzione continua
- se si dividesse il contenuto di ogni bin per il numero totale di eventi N, questa funzione è normalizzata, quindi un istogramma diventa l'approssimazione di una distribuzione di densità di probabilità
- istogrammi mono-dimensionali in
ROOT
sono realizzati con la classeTH1F
TH1F istogramma ("istogramma", "titolo", 10, -5., 5.) ;
- il costruttore di
TH1F
prende come input:- un nome: è saggio usare il medesimo della variabile (ogni oggetto deve avere un nome unico!)
- un titolo, che viene scritto sopra l'istogramma
- il numero di bin (
10
in questo caso) in cui dividere l'intervallo di definizione della variabile - l'intervallo di definizione della variabile (
-5., 5.
in questo caso)
- un oggetto della classe
TH1F
quando viene creato è vuoto, cioè i conteggi di ogni singolo bin sono nulli - per riempire l'istogramma
si utilizza il suo metodo
Fill
, che viene chiamato per ogni evento:istogramma.Fill (2.2) ; istogramma.Fill (2.1) ; istogramma.Fill (-1.4) ;
- aggiorna i conteggi del bin in cui casca il valore passato (in questo caso
2.2
,2.1
,-1.4
) - aggiorna i contatori per il calcolo delle statistiche (numero di eventi, somma degli eventi, somma del quadrato degli eventi)
- aggiorna i conteggi del bin in cui casca il valore passato (in questo caso
- per visualizzare un istogramma, serve istanziare un oggetto grafico
della classe
TCanvas
, che è la tela dove l'istogramma viene disegnato- è necessario includere
TCanvas.h
perché il programma compili
TCanvas c1 ; istogramma.Draw () ; c1.Print ("esempio.png", "png") ;
- l'oggetto
c1
si occupa di produrre l'immagine che contiene l'istogramma
- è necessario includere
- il box in alto a sinistra nell'immagine dell'istogramma riporta statistiche associate alla collezione di eventi
- perché l'informazione sull'istogramma sia completa,
è necessario aggiungere informazioni riguardo il significato degli assi,
prima di invocare il metodo
Draw
:istogramma.GetXaxis ()->SetTitle ("asse x") ; istogramma.GetYaxis ()->SetTitle ("conteggi per bin") ;
- inoltre, è possibile cambiare il colore di riempimento di un istogramma:
istogramma.SetFillColor (kOrange + 1) ;
- la descrizione dettagliata di tutte le funzionalità ed opzioni di disegno degli istogrammi è documentata nella relativa guida per l'utente
- si può utilizzare un oggetto di tipo
TH1F
per visualizzare la distribuzione di eventi pseudo-casuali generati con gli algoritmi scritti nella lezione precedente - assumendo che la funzione che genera numeri casuali
con il metodo del teorema centrale del limite
abbia il seguente prototipo:
float rand_TCL (float xMin, float xMax, int N = 10)
- si può rimepire un istograma di test dell'algoritmo in questo modo:
con
TH1F h ("h", "eventi pseudo-casuali Gaussiani", 200, -1.5, 1.5) ; for (int j = 0 ; j < 1000000 ; ++j) h.Fill (rand_TCL (-1., 1., 10)) ;
1000000
eventi, ottenendo poi:
- quando i valori in diversi bin cambiano considerevolmente, può essere comodo visuallizzare gli istogrammi in scala logaritmica (lungo l'asse orizzontale o verticale), per migliorare la leggibilità del risultato
- essendo una diversa visualizzazione dello stesso contenuto,
è un'operazione che si fa con un metodo della classe
TCanvas
c1.SetLogy () ; c1.Print ("Gaussian.png", "png") ;
- è possibile estrarre i valori della media e della deviazione standard
degli eventi salvati in un istogramma:
std::cout << "numero di eventi: " << h.GetEntries () << std::endl ; std::cout << "media: " << h.GetMean () << std::endl ; std::cout << "deviazione standard: " << h.GetRMS () << std::endl ;
- dato un campione di variabili casuali {xi}i=1,..,N indipendenti identicamente distribuite, la varianza della distribuzione è la media degli scarti quadratici dalla media
- si dimostra che la varianza di un campione è uguale alla media dei quadrati meno il quadrato della media: V = E[x2]-E[x]2 (E[f] è il valore di aspettazione di f sul campione in esame)
- la radice della varianza è detta sigma, o deviazione standard ed è una stima della dispersione del campione attorno alla sua media
- all'aumentare del numero di eventi nel campione, la dispersone degli eventi non cambia, quindi la varianza rimane costante per variabili identicamente distribuite
- chiaramente, siccome ogni campione è finito, i valori della varianza ottenuti con campioni diversi non sono identici, ma ci si aspetta che siano compatibili fra loro
- di conseguenza, anche la deviazione standard non dipende dal numero di eventi nel campione
- se si conosce media e varianza di un campione, si ha un'idea di dove ci si aspetta di trovare l'evento successivo di quel campione
- se il campione è un insieme di misure, la deviazione standard dice quanto distante ci si aspetta di trovare la prossima misura dalla media delle misure raccolte
- dunque, la deviazione standard è associata all'incertezza sulla singola misura
- all'aumentare del numero di misure, invece, aumenta la precisione con la quale si conosce la media del campione
- la deviazione standard della media, definita come la deviazione standard divisa per la radice del numero di eventi nel campione, è una stima dell'incertezza sulla media
- gli istogrammi mostrano una singola variabile fisica
- talvolta è utile visualizzare coppie di misure (x,y)
- in
ROOT
la classe che si utilizza per farlo è ilTGraph
- come sempre, bisogna includere la libreria corrispondente:
#include "TGraph.h"
- ricordando di aggiungere le opzioni di
ROOT
al comando di compilazione:> c++ -o programma `root-config --cflags --glibs` programma.cpp
- un oggetto di tipo
TGraph
si definisce semplicemente:TGraph g_sigma ;
- l'oggetto è vuoto: non contiene alcuna variabile
- esistono altri costruttori oltre a quello di default,
che permettono di inizializzare un
TGraph
con un insieme di coppie di punti nulli oppure a partire da array già riempiti
- un
TGraph
viene riempito con il metodoTGraph::SetPoint (Int_t i, Double_t x, Double_t y)
, che prende in input:- l'indice del punto da riempire, che per il primo punto è 0
- il valore della variabile x
- il valore della variabile y
g_sigma.SetPoint (g_sigma.GetN (), 11.5, 7.4) ;
- in questo caso, come primo argomento si utilizza il metodo stesso
TGraph::GetN ()
, perché per unTGraph
che contieneN
elementi l'indice dell'ultimo elemento salvato èN-1
- si noti che
ROOT
ridefinisce le variabili numeriche delC++
(sostituendoint
conInt_t
edouble
conDouble_t
in questo caso), perché le variaibli definite internamente daROOT
hanno una dimensione in byte convenzionale
- come nel caso di
TH1F
, unTGraph
si disegna su unTCanvas
:TCanvas c1 ("c1", "c1", 100, 100, 1000, 1000) ; c1.SetLogx () ; g_sigma.Draw ("ALP") ; c1.Print ("sigmaTrend.png", "png") ;
- le opzioni passate al metodo
Draw
richiedono di- tracciare gli assi (
A
) - congiungere i punti con una linea (
L
) - disegnare i marker ad ogni punto (
P
).
- tracciare gli assi (
- le opzioni passate al metodo
- anche per un
TGraph
, si possono impostare diversi parametri grafici:g_sigma.SetMarkerStyle (20) ; g_sigma.SetMarkerColor (kAzure - 1) ; g_sigma.SetLineColor (kGray + 1) ; g_sigma.SetMarkerSize (2) ; g_sigma.GetHistogram ()->GetXaxis ()->SetTitle ("numero di eventi nel campione") ; g_sigma.GetHistogram ()->GetYaxis ()->SetTitle ("deviazione standard") ;
- il metodo
TGraph::GetHistogram ()
restituisce il puntatore all'istogramma di servizio creato daROOT
per comporre graficamente il disegno
- il metodo
- nel caso dell'andamento della deviazione standard
e della deviazione standard della media,
dal disegno dei
TGraph
nel caso di una distribuzione uniforme si nota chiaramente che una delle due rimane costante, mentre l'altra diminuisce all'aumentare del numero di eventi presenti nel campione - il campionamento di punti sull'asse x è fatto con ragione logaritmica, perché l'andamento atteso è lento (proporzionale a radice di N)
- la scala logaritmica sull'asse x aiuta a visualizzare in modo più efficace queste variazioni
- il concetto di istogramma monodimensionale si applica facilmente anche al caso bidimensionale
- l'oggetto di
ROOT
associato a questo concetto si chiamaTH2F
- nel costruttore, è necessario inserire numero di bin ed estremi per due direzioni
TH2F h2 ("h2", "eventi pseudo-casuali Gaussiani", 200, -1.5, 1.5, 200, -1.5, 1.5) ;
- nel riempimento, il metodo
TH2F::Fill (Double_t x, Double_t y)
prende in ingresso due valorih2.Fill (rand_TCL (-1., 1., 10), rand_TCL (-1., 1., 10)) ;
- i
TCanvas
diROOT
sono dotati di diverse funzionalità interattive alle quali si accede con menu a tendina o contestuali (accessibili con il pulsante destro del mouse) - per abilitare queste funzionalità in un programma compilato,
è necessario utilizzare un oggetto della classe TApplication
TApplication theApp ("theApp", &argc, argv) ; TCanvas c1 ; istogramma.Draw ("hist") ; theApp.Run () ;
- fra la linea
e la linea
TApplication theApp ("theApp", &argc, argv) ;
va incluso tutto il codice che si vuole interattivotheApp.Run () ;
- può esistere un solo oggetto di tipo
TApplication
in ogni programma - per terminare l'esecuzione del programma,
da un qualunque
TCanvas
bisogna utilizzare il menuFile->Quit ROOT
- fra la linea
ROOT
fornisce un oggetto che serve per maneggiare stringhe che può essere utilizzato come argomento nei metodi delle sue classi- le
TString
hanno definite una serie di operazioni che permettono di combinare velocemente testo con altre variabiliint num = atoi (argv[1]) ; TString titolo = "ci sono " ; titolo += num ; titolo += " eventi" ; TH1F istogramma ("istogramma", titolo, 10, -5., 5.) ;
- Gli esercizi relativi alla lezione si trovano qui