Esempi di analisi dati con ROOT Guida minima all’uso di ROOT per le esperienze didattiche di Laboratorio di Elettromagnetismo Piano Lauree Scientifiche Andrea Ventura Dipartimento di Matematica e Fisica – Università del Salento Lecce, gennaio 2015 1 Introduzione ROOT è un programma molto utilizzato nell’ambito della Fisica delle Alte Energie, che permette di analizzare anche grandi quantità di dati, produrre risultati statistici, realizzare grafici, adattare dati sperimentali a funzioni, e molto altro ancora. E’ un programma molto versatile e gratuito: una versione per Windows può essere scaricata dall’indirizzo: http://www.dmf.unisalento.it/LaureeScientifiche/Download/root/ro ot_v5.34.14.win32.vc10.msi Senza la pretesa di conoscere l’intero pacchetto, qui considereremo alcune semplici applicazioni per un impiego immediato. 2 Installazione del pacchetto • Una volta scaricato il file di setup (root*.msi), si segue la procedura standard di installazione, al termine della quale compare un’icona sul desktop su cui cliccare per avviare ROOT • ROOT è disponibile anche per altri sistemi operativi (Linux, Mac OS). • All’avvio, appare una finestra (“shell”) per i comandi da sottomettere al programma. 3 Avvio di ROOT 4 Iniziare con ROOT • ROOT è basato su CINT, un interprete di C/C++ • Blocchi di comandi possono essere racchiusi tra parentesi graffe, intervallati da punti e virgola, ovvero: {...; ...; ...} • I comandi precedenti possono essere richiamati tramite la freccia verso l’alto () • Per non digitare ogni volta gli stessi comandi, possiamo scriverli in un file (ad esempio miaMacro.C) ed eseguirli con “.x miaMacro.C” – la directory di lavoro è tipicamente C:\root • Per uscire da ROOT digitare “.q” 5 Semplici operazioni • Possiamo fare qualche calcolo, ad esempio: 7 · 9 root [0] 7*sqrt(9) • Possiamo elencare i quadrati dei primi 5 numeri pari: root [1] for (int i=1; i<=5; i++) printf(“%d^2 = %d ”, 2*i, 4*i*i); • Possiamo disegnare una funzione, f(x) = 2 senx (x–1)2 root [2] root [3] TF1 f("f","2*sin(x)*(x-1)**2",-3,7); f.Draw(); – Per avere la griglia, anteporre c1 = new TCanvas; c1->SetGrid(); – Per conoscere il valore di f(3) f(3) (const Double_t)1.12896006447893770e+000 6 Effettuare un fit a una funzione • Si salvi in un file e si esegua il seguente esempio: { // Creazione di una canvas con griglia: gROOT->Reset(); c1 = new TCanvas("c1", "Fit dei dati con errori su x e y", 200, 10, 700, 500); c1->SetGrid(); Int_t n = 10; // Inizializzazione di 4 vettori: // x[] e ex[] sono le misure in ascissa x_i e i loro errori Float_t x[n] = {0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.65, 0.75, 0.95, 1.2}; Float_t ex[n] = {0.05, 0.05, 0.04, 0.05, 0.04, 0.05, 0.06, 0.06, 0.05, 0.05}; // y[] e ey[] sono le misure in ordinata y_i e i loro errori Float_t y[n] = {0.1, 0.3, 0.55, 0.67, 0.75, 0.79, 0.71, 0.63, 0.45, 0.35}; Float_t ey[n] = {0.04, 0.03, 0.03, 0.02, 0.02, 0.02, 0.03, 0.03, 0.04, 0.04}; // Creazione di un grafico x-y con errori gr = new TGraphErrors(n,x,y,ex,ey); gr->SetTitle("Fit della funzione"); gr->SetMarkerColor(4); gr->SetMarkerStyle(21); gr->Draw("AP"); gStyle->SetOptFit(1111); // Fit dei dati del grafico con un polinomio di terzo grado gr->Fit("pol3"); c1->Update(); } 7 Risultato del fit • Il fit a una polinomiale di terzo grado è soddisfacente (il 2/ndf è prossimo a 1) • Provare altre funzioni, come “pol2”, “pol4” o “expo” 8 Fit con altre funzioni • All’interno della macro inserire la funzione desiderata: { ... // Creazione di una canvas con griglia // Inizializzazione dei 4 vettori x[] ex[] y[] ey[] // Creazione di un grafico x-y con errori ... // Definizione di una nuova funzione TF1 *funz = new TF1("funz","[0]*x*exp([1]*x+[2])",0.5,100); // Fit in un intervallo di interesse, tra -3 e 7 gr->Fit("funz","","",-3,7); c1->Update(); } • Lanciare la macro. Il fit potrebbe non funzionare per via di inadeguati valori iniziali dei parametri p0, p1, p2. – Definirli con “SetParameters” e rilanciare: TF1 *funz = new TF1("funz","[0]*x*exp([1]*x+[2])",0.5,100); funz->SetParameters(5.,-1.,0.); 9 Risultato del nuovo fit • Il nuovo fit alla funzione desiderata è soddisfacente • Si provino altre funzioni arbitrarie o altri set di punti 10 Altre operazioni con ROOT • Si possono visualizzare i valori dei parametri del fit: float p0=funz->GetParameter(0), float p1=funz->GetParameter(1), float p2=funz->GetParameter(2), cout << "p0 = " << p0 << " +- " cout << "p1 = " << p1 << " +- " cout << "p2 = " << p2 << " +- " dp0=funz->GetParError(0); dp1=funz->GetParError(1); dp2=funz->GetParError(2); << dp0 << endl; << dp1 << endl; << dp2 << endl; • Si possono salvare i grafici ottenuti tramite l’interfaccia grafica: “File -> Save As…” oppure c1->SaveAs(“mioGrafico.gif”) • Maggiori dettagli su http://root.cern.ch • Per ulteriori aiuti o chiarimenti: – [email protected] 11