ROOT Tutorial
Parte 2
Importare dati da file testo
Esempio:
void readfile()
{
const char *nomeFile = "file.txt";
fstream file(nomeFile, ios::in);
string variabile1;
string variabile2;
file >> variabile1 >> variabile2;
Int_t x[10], y[10];
Int_t n = 0;
while(file >> x[n] >> y[n]) n++;
cout << "Ho letto " << n << " righe" << endl;
cout << variabile1 << " " << variabile2 << endl;
for(Int_t i=0; i<n; i++) cout << x[i] << " " << y[i] << endl;
}
Istogrammi
ROOT permette di gestire vari tipi di istogrammi:
• 1-D
• 2-D
• 3-D
short, integer, float, double
Istogrammi 1-D
TH1F(const char name,const *title,Int_t nbins,Float_t xmin,Float_t xmax)
Metodi comunemente usati:
• Fill
h1->Fill(x);
h1->Fill(x,w); //with weight
• SetBinContent
h1->SetBinContent(Int_t bin, Double_t content)
• Draw
h1->Draw(Option_t *goption)
• Fit
h1->Fit(Fit(const char *fname, Option_t *option,
Option_t *goption, Axis_t xxmin, Axis_t xxmax)
Riempimento degli istogrammi: Metodo SetBinContent
Ch
Frequenza
1
0
2
0
10
3
0
8
4
2
6
5
1
6
3
7
5
8
8
9
11
10
10
11
8
12
6
13
6
14
4
15
2
16
1
17
0
18
0
19
0
12
(i,val_i)
4
2
0
1
2
3
4
5
6
7
8
9
10 11 12 13 14 15 16 17 18 19
h1->SetBinContent(i,val_i)
i = 0 underflow bin
i = nbins+1 overflow bin
nbins: numero canali
xmin, xmax: range istogramma
Stabiliti dai dati in
ingresso
Riempimento degli istogrammi: Metodo Fill
Valore
Ch
Frequenza
7
1
0
5
2
0
9
3
0
11
4
2
13
5
1
8
6
3
16
7
5
4
8
8
4
…
9
11
2
10
10
11
8
12
6
13
6
14
4
15
2
16
1
17
0
18
0
19
0
h1->Fill(i)
12
10
8
(i)
6
0
1
2
3
4
5
6
7
8
9
10 11 12 13 14 15 16 17 18 19
Esercizio: importare i dati in formato ASCII relativi all’esperienza sulla
sorgente 
void alfa()
{
const char *nomeFile = "spectrum.Spe";
fstream file(nomeFile, ios::in);
string dummy;
for(Int_t i=0; i<12; i++) getline(file, dummy);
TH1I *hspectrum = new TH1I("hspectrum","hspectrum",2048,0,2047);
Int_t n=0;
Int_t counts;
while((file >> counts) && n < 2048){
hspectrum->SetBinContent(n+1,counts);
n++;
}
hspectrum->Draw();
hspectrum->GetXaxis()->SetRangeUser(200,320);
hspectrum->Fit("gaus","","",237,243);
}
Istogrammi 2-D
TH2F(const char name,const *title,Int_t nbinsx,Float_t xmin,Float_t xmax,
Int_t nbinsy,Float_t ymin,Float_t ymax)
Metodi comunemente usati:
• Fill
h2->Fill(x,y);
h2->Fill(x,y,w); //with weight
• SetBinContent
h2->SetBinContent(Int_t binx, Int_t biny, Double_t
content)
• Draw
h2->Draw(Option_t *goption)
Opzioni grafiche valide per tutti i tipi di istogramma:
"AXIS": Disegna solo l’asse indicato.
"SAME": Disegna l’istogramma nella pad corrente.
"CYL": Usa le coordinate cilindriche.
"POL": Usa le coordinate polari.
"SPH": Usa le coordinate sferiche.
"LEGO”, "LEGO1”, "LEGO2": Disegna un lego plot.
"SURF”, "SURF1”, "SURF2”, "SURF3”, "SURF4”: Disegna plot di
superficie
…
Opzioni grafiche valide per istogrammi 2-D:
"COL": Mappa di colori
"COLZ": Mappa di colori + palette
"CONT": Contour plot
"CONTZ": Contour plot + palette
"CONT1“, "CONT2“, "CONT3“, "CONT4“, "CONT5“, : Diversi stili di
contour plot
"SCAT": Disegna uno scatter-plot (default)
…
Generatori di numeri casuali
In ROOT numeri pseudo - casuali sono generati usando le classi
TRandom. Esistono 4 differenti classi (TRandom, TRandom1,
TRandom2 e TRandom3), ciascuna delle quali implementa un differente
tipo di generatore di numeri casuali.
Il metodo SetSeed permette di scegliere il seme.
gRandom->SetSeed(Int_t seed);
Se non specificato, il seme è stabilito dal clock del PC
Esempio: distribuzione uniforme
void randomUni(){
Double_t x, y;
TH2D *h2 = new TH2D(“h2”,”Uniform Distribution”, 100,0,10,100,0,10);
for(Int_t i=0; i < 100000; i++){
x = gRandom->Uniform(0,10);
y = gRandom->Uniform(0,10);
h2->Fill(x,y);
}
gStyle->SetPalette(1);
h2->Draw(“colz”);
}
Distribuzione non uniformi disponibili in ROOT
Esercizio: simulazione MC per valutare la distanza relativa tra due
contatori geiger
Ipotesi:
1) Contatori Geiger bidimensionali
r = 0.5 Geiger radius in cm
l = 6 Geiger length in cm
2) Distanza nominale d = 5 cm
3) Estrazione uniforme dei punti
Possibili miglioramenti:
1) Contatori Geiger in 3D
DA VERIFICARE!
void geigerMC(){
gROOT->SetStyle("Plain");
Double_t x1, y1, x2, y2;
//Define the experimental setup
const int d = 5; // Distance between geigers
Double_t r = 0.5; // Geiger radius in cm
Double_t l = 6; // Geiger length in cm
TH1D *h1 = new TH1D("h1","Distances distribution", 100,0,10);
TH2D *h2 = new TH2D("h2","Points distribution", 150, -5, 10, 100, -5, 5);
for(Int_t i=0; i < 100000; i++){
x1 = gRandom->Uniform(-r,r);
y1 = gRandom->Uniform(-l/2,l/2);
x2 = gRandom->Uniform(d-r,d+r);
y2 = gRandom->Uniform(-l/2,l/2);
h2->Fill(x1,y1);
h2->Fill(x2,y2);
Double_t distance = TMath::Sqrt((x1-x2)**2+(y1-y2)**2);
h1->Fill(distance);
}
TCanvas *c1 = new TCanvas();
gStyle->SetPalette(1);
h2->Draw("colz");
TCanvas *c2 = new TCanvas();
h1->Draw();
}
5 cm
3 cm
15 cm
Scarica

h1->Fill(i)