http://root.cern.ch ROO C++ Èun com prog dedi Piano di lavoro ROOT é un framework per l analisi dati basato sul C++: E` un sistema estremamente flessibile, ma un po complesso da imparare, Introduzione alla progra che consente di scrivere un programma sfruttando una intera Il framework di analisi R infrastruttura dedicata all analisi Applicazioni all analisi d + piccolissima introduzione/ricapitolazione sulla programmazione + introduzione al framework di root + esempi
La linea di comando Riassunto Architettura di un PC '()*+,-./,01(, B,671*/, &586* Programma:!"# $%& 23'4 "5()*-167/8915:1-6*;<=1(1 >-?-@-AAA Il ciclo di istruzioni Leggere dati da input o l ciclo di memoria istruzioni Eseguire una operazione + Leggere Scrivere dati da risultato input in o memoria o + Eseguire su output una operazione + Scrivere L esecuzione risultato in passa memoria poi o su output all istruzione successiva... + Lʼesecuzione passa poi allʼistruzione successiva... Serie di istruzioni che vengono eseguite in sequenza dalla CPU M. Floris Introduzione alla programmazione Programma: Serie di istruzioni che vengono eseguite in sequenza dalla CPU
La linea di comando Riassunto linguaggio di programmazione Cosa è un linguaggio di programmazione? Un Un linguaggio di di programmazione permette di scriveredei dei comandi per per il il computer in inglese. Queste vengono tradotte in istruzioni per la CPU Queste da un vengono programma tradotte chiamato in istruzioni compilatore pero della interprete. CPU da un programma chiamato compilatore o interprete. Conta fino a 10! Interprete tradotto riga per riga durante l esecuzione Interprete Compilatore tradotto tradotto riga per nell insieme riga durante etrasformato lʼesecuzione in codice eseguibile Compilatore tradotto nellʼinsieme e trasformato in codice eseguibile Il C ed il C++ sono linguaggi compilati Il C ed il C++ sono linguaggi compilati... in genere!
Riassunto Vantaggi di compilatori ed interpreti Compilatori Esecuzione più veloce Errori nel codice vengono trovati prima che inizi l esecuzione La compilazione richiede tempo (es. vedere effetti di una piccola modifica) Poco portabile Medio-grande complessità e fase di produzione Interpreti Vedere subito cosa fa il programma Facilmente utilizzabile su sistemi operativi diversi Programma pù lento Un errore banale alla fine del codice potrebbe essere scoperto solo dopo alcune ore di esecuzione... Programmi molto semplici o in fase di sviluppo/prototipazione M. Floris Introduzione alla programmazione
Riassunto Il C ed il C++: Hello World Il C rinomato per la sua efficienza, e si imposto come linguaggio di riferimento per la realizzazione di software di sistema su gran parte delle piattaforme hardware moderne. Il C++ un linguaggio di programmazione orientato agli oggetti [... ]. stato sviluppato [...] nel 1983 come un miglioramento del linguaggio C (Wikipedia) Ogni corso di programmazione che si rispetti, inizia con il programma Hello World : #i n c l u d e <stdio.h> int main( int argc, char argv []) { printf ( Hello World\n ); return 0; M. Floris Introduzione alla programmazione
Le funzioni La linea di comando Riassunto Sintassi: Punteggiatura Sintassi Un linguaggio di programmazione segue delle Sintassi regole grammaticali rigide (sintassi) Un linguaggio di programmazione segue delle regole grammaticali rigide (sintassi) #i n c l u d e <stdio.h> int main( int argc, char argv []) { printf ( Hello World\n ); return 0; Diversi blocchi di codice sono racchiusi tra {... Le righe di istruzioni devono terminare con ; M. Floris Introduzione alla programmazione
Le funzioni Cosa significa programmare Introduzione al C/C++ Le funzioni La linea di comando Riassunto Il codice pu`o essere diviso in vari blocchi logici (funzioni), che raccolgono comandi coerenti tra loro. Il codice può essere diviso in vari blocchi logici (funzioni), che raccolgono comandi coerenti tra loro. #i n c l u d e <stdio.h> int main( int argc, char argv []) { printf ( Hello World\n ); return 0; printf è una funzione Se dovete riscrivere lo stesso codice piuʼ volte, conviene ragrupparlo in una funzione TIP: Se dovete riscrivere lo stesso codice piu volte, conviene ragrupparlo in una funzione Il compilatore mette a disposizione un gran numero di funzioni per svolgere alcuni compiti comuni (libreria standard). M. Floris Introduzione alla programmazione printf eʼ una funzione della libreria standard utile per scrivere del testo sullo schermo.
svolgere alcuni compiti comuni (libreria standard). printf è una funzione della libreria standard utile per scrivere del testo sullo schermo. ROOT fornice delle librerie supplementari con funzioni (e oggetti) di uso comune nell analisi dei dati! #i n c l u d e <stdio.h> int main( int argc, char argv []) { printf ( Hello World\n ); return 0; per usare una funzione di libreria è necessario includere la sua definizione printf è una funzione di libreria M. Floris Introduzione alla programmazione
ROOT fornice delle librerie supplementari con funzioni (e oggetti) di uso comune nellʼanalisi dei dati
La funzione Main La linea di comando Riassunto Ogni programma in C++ deve avere una funzione principale (main), che viene eseguita quanto parte il programma Ogni programma in C++ deve avere una funzione principale (main), che viene eseguita quanto parte il programma! Le funzioni possono restituire dei valori Le funzioni possono restituire dei valori! Ad esempio, la funzione Ad esempio, Quardrato(x) la funzione potrebbe Quardrato(x) restituire x potrebbe x. restituire x x. I valori I valori delle delle funzioni funzioni devono devono avereun un tipo, che chedefiniscedichevaloresi di si tratta tratta (es. (es. numero intero, intero, numero decimale, testo testo....). ) #i n c l u d e <stdio.h> int main( int argc, char argv []) { printf ( Hello World\n ); return 0; M. Floris Introduzione alla programmazione tipo di dato restituito da main main è il punto di ingresso al programma
Esempio di Utilizzo di una funzione Un esempio completo: #i n c l u d e <stdio.h> int Quadrato( int x); int main( int argc, char argv []) { int n = 3; int xquadro = Quadrato(n); printf ( Quadrato di %d: %d\n, n, xquadro); return 0; int Quadrato( int x) { return x x; M. Floris Introduzione alla programmazione
Esempio di Utilizzo di una funzione Un esempio completo: #i n c l u d e <stdio.h> int Quadrato( int x); Dichiarazione della funzione int main( int argc, char argv []) { int n = 3; Dichiarazione variabile x int xquadro = Quadrato(n); Uso quadrato e assegnazione printf ( Quadrato di %d: %d\n, n, xquadro); return 0; int Quadrato( int x) { return x x; M. Floris Introduzione alla programmazione I %d vengono sostituiti con i valori di x ed xquadro!
linea di comando Sia che si usi Linux, sia che si usi Windows eʼ utile saper usare la linea di comando Modo per dare istruzioni al PC alternativo a point-and-click con il mouse Piu` flessibile in molte circostanze: provate a cancellare con il mouse tutti i files che cominciano con pi e finiscono con ppo! Riga di comando del pi*ppo Indispensabile per usare ROOT!
le variabili Le Variabili Scelte Cicli Riassunto Variabili : celle di memoria dove vengono conservati i valori nei vostri Variabili : programmi. celle di memoria dove vengono conservati i valori nei vostri programmi. Come Come le funzioni, le funzioni, le le variabili devono essere dichiarate: dichiarate: Con la dichiarazione viene riservata Conuna la dichiarazione cella memoria viene riservata per la una variabile cella di memoria Con lʼassegnazione per la variabile viene inserito il valore Con nella l assegnazione cella viene inserito il valore nella cella 10... Cella riservata con definizione Tipo di variabile (intero) int var ; Nome della variabile Il punto e virgola! Si deve assegnare un valore alla variabile:... var = 10; Variabile inizializzata: int var = 10;; M. Floris Variabili ed Operatori Variabile inizializzata: int var = 10;
ItipidiVariabili Le Variabili Scelte Cicli Riassunto Esistono diversi tipi di variabili, a seconda del dato che deve essere conservato: Tipi int float double void char bool Numero intero Numero a virgola mobile Numero a virgola mobile (doppia precisione) Nessun valore (utile nella definizione di funzioni) Singolo carattere Vero/Falso float e double rappresentano lo stesso tipo di numero. double occupa più memoria ma è più preciso (consente più cifre significative) void è utile per definire funzioni che non restituiscono valori Per definire stringhe (sequenze di caratteri) sono necessari i puntatori, che vedremo tra qualche lezione. M. Floris Variabili ed Operatori
Le scelte le scelte Esempi che abbiamo visto finora: istruzioni eseguite in sequenza. Esempi che abbiamo visto finora: istruzioni eseguite in sequenza. Utile avere Utile anche avere dei anche modi dei per modi modificare per modificare il flusso il del flusso programma, del programma, ad esempio ad esempio per per fare fare delle delle scelte. scelte. prendi l ombrello Si piove? Alt, se c è vento prendi la giacca Altrimenti prendi gli occhiali da sole M. Floris Variabili ed Operatori
if - else Le Variabili Scelte Cicli Riassunto In C il costrutto principale utilizzato per fare delle scelte `e: if-[else if]-[else] if - else (else if e else sono opzionali) In C il costrutto principale utilizzato per fare delle scelte è: if-[else if]-[else] (else if e else sono opzionali) int main( int argc, char argv []) { bool rain, wind ; rain = true ; wind = false ; if (rain == true) { PrendiOmbrello (); else if (wind == true) { PrendiGiacca (); else { PrendiOcchialiSole (); Blocchi racchiusi tra { return 0; M. Floris Variabili ed Operatori
And, Or, Not Le Variabili Scelte Cicli Riassunto r e Tabelle di verità sono usare combinazioni logiche, con gli operatori: (&&) e or ( ) e not (!) Si possono usare combinazioni logiche, con gli operatori: and (&&) e or ( ) e not (!) and or 0 0 0 0 0 0 0 1 0 0 1 1 1 0 0 1 0 1 1 1 1 1 1 1 0 = falso 1 = vero Esempio: if (a && b (!c) ) {... C++ 0 corrisponde a falso, qualsiasi valore = 0 corrisponde a
li Operatori 4 operazioni + - * / Incremento (es. i ++) ++ Decremento (es. i ) Uguale == Diverso!= Maggiore > Maggiore o uguale >= Minore < Minore o uguale <= O logico E logico && Negazione Logica! Parentesi () M. Floris Variabili ed Operatori
Icicli I cicli Cicli Riassunto Esistono anche dei costrutti che permettono di eseguire azioni ripetitive: i cicli. Esistono anche dei costrutti che permettono di eseguire azioni ripetitive: icicli. Notare i ; valore iniziale condizione per continuare for( int i = 0; i < 10 ; i ++){ printf ( %d\n, i ); azione da eseguire ad ogni ciclo i può essere dichiarata al volo ma non è definita fuori da qui i non è definita fuori dal blocco di codice delimitato dalle graffe: queste parentesi definiscono lo scope della variabile i non eʼ definita fuori dal blocco di codice delimitato dalle graffe: queste parentesi definiscono lo scope della variabile M. Floris Variabili ed Operatori
Array Array Array Puntatori Riassunto Gli array sono insiemi di n variabili dello stesso tipo. Questo esempio crea un array con 10 elementi. Gli array sono insiemi di n variabili dello stesso tipo. Questo esempio crea un array con 10 elementi. nome della variabile tipo dimensione dell array int ar r [1 0] ; La dimensione è tra [ ] I valori dei singoli elementi vengono impostati in questo modo: arr [0] = 10; arr [1] = 3;... arr [9] = 4; Il primo elemento è 0 L ultimo elemento n-1! M. Floris Array e Puntatori
Immaginate di voler raccogliere i voti di una classe di 10 studenti, e di voler calcolare il voto medio: voto medio = voto 1 + voto 2 + + voto n n Senza gli array avreste bisogno di 10 variabili. Con l array: int voti [10] = { 5,6,10,7,8,6,4,3,6,7 ; float media = 0; for( int istud=0; istud <10; istud++){ media = media + voti [ istud ]; media = media / 10; Dichiarazione, inizializazione array. Notare le { Ciclo for per la somma M. Floris Array e Puntatori
Gli Oggetti Gli Oggetti ROOT Riassunto Definizione: oggetti Un oggetto è un insieme di dati con le funzioni che servono per manipolare questi dati Divisione del programma in unita auto-consistenti Programmazione ad oggetti introduce un livello di astrazione più alto: programmazione più vicina all utente che alla macchina Esempio: nei nostri programmi ci potrebbe essere un oggetto telescopio che contiene tutte le informazioni sul telescopio (numero di piani, distanza, etc e che permette di visualizzare segnali lasciati da particelle). Noi non scriveremo oggetti, ma useremo numerosi oggetti definiti da ROOT M. Floris Oggetti e introduzione a ROOT
Terminologia Gli Oggetti ROOT Riassunto L uso degli oggetti in C++ è associato ad una terminologia: Classe: un nuovo tipo di dato che rappresenta la struttura di un oggetto (esempio la classe istogramma, la classe TH1F ). Molti oggetti possono appartenere alla stessa classe. Oggetto: unavariabilecheimplementaunacertaclasse(esempio l oggetto h1 appartiene alla classe TH1F; più propriamente: è un istanza di TH1F) Metodo: una funzione appartenente ad una classe Membro: unavariabileappartenenteadunaclasse N.B. A volte il termine oggetto viene anche utilizzato con il significato di classe M. Floris Oggetti e introduzione a ROOT
Come usare gli oggetti ROOT Riassunto Oggetti si usano come normali variabili: classi definiscono nuovi tipi. Spesso si usano puntatori per riferirsi agli oggetti. Supponiamo di aver definito la classe TMacchina: due membri per il colore e la velocità e due metodi per impostare valori // Crea un oggetto normalmente TMacchina macchina1 ( rossa ); // Per usare un metodo, serve un. macchina1.setspeed(10); // Crea una macchina come puntatore TMacchina macchina2 = new TMacchina( blu ); // Per usare un metodo s i usa una > macchina2 >SetSpeed (100); Notare il. ela-> new nome classe serve quando si usa un puntatore M. Floris Oggetti e introduzione a ROOT Inizializzazione valori classe
ROOT Riassunto Esempio: L oggetto istogramma Questo esempio usa l oggetto TH1F di ROOT, che rapresenta un istogramma. Il grafico rappresenta il numero di studenti per lezione (ad esempio ci sono stati tra 6 e 9 studenti per 3 lezioni... ) M. Floris Oggetti e introduzione a ROOT
Riassunto Esempio istogramma: codice // Dichiarazione del l istogramma TH1F h = new TH1F( hstud, Studenti per lezione, 10, 0, 30); h > Fill (5); // Ci sono s t a t i 3 studenti h > Fill (10); // Ci sono s t a t i 10 studenti... h > Fill (25); // Serve un f i l l per ogni lezione h >Draw ( ) ; // viene disegnato l istogramma M. Floris Oggetti e introduzione a ROOT
Lʼinterprete di ROOT L interprete di ROOT Gli Oggetti ROOT Riassunto ROOT ROOT fornisce un insieme di classi per l analisi dati e CINT, uninterprete di C++. Come aprire l interprete: 1 start ->...-> Visual C++ ->...-> Visual Studio Command Prompt Questo apre una linea di comando, consapevole dell esistenza di Visual C++ nel sistema aprire un terminale digitare root 2 Digitare root Provare a dichiarare due variabili float, assegnare un valore a ciascuna e farne la somma con l interprete. M. Floris Oggetti e introduzione a ROOT
La Macro Tipo di ROOT I programmi scritti per ROOT vengono normalmente chiamati Macro. Piccole differenze rispetto ad un programma: la funzione main è sostituita da una funzione principale che deve avere lo stesso nome del file di codice File: Macro.cpp // include l i b r e r i e #include <stdio.h> // dichiarazione funzioni float Quadrato( float x); // Funzione Principale ( s i chiama come i l f i l e ) void Macro () { float xquadro = Quadrato (4); printf ( Quadrato di 3: %d\n, n, xquadro); return 0; // implementazione delle a l t r e funzioni float Quadrato( float x) { return x x;
Eseguire una Macro Usando le Macro non è più necessario compilare usando l editor di Visual C++, si può usare direttamente CINT. CINT/ROOT C/C++ I n t e r p r e t e r v e r s i o n 5. 1 6. 2 9, Jan 08,2008 Type? for help. Commands must be C++ statements. Enclose multiple statements between {. root [0].L Macro.C+ [...] root [1] Macro() Ciao root [2].x Macro.C+ Ciao.x carica la macro ed esegue la funzione principale al volo.l carica la macro le funzioni definite nella macro sono disponibili in CINT Senza il + alla fine del nome della macro, la macro viene interpretata. Consiglio: compilare quasi sempre. Provare a fare una macro che scriva Hello World M. Floris Oggetti e introduzione a ROOT
primo esempio - uso root 1) apri terminale 2) esegui root 3) crea l istogramma: root[] TH1F *hist_1 = new TH1F("hist_1", "Il mio primo histo", 100, 2, 200); 4) riempi l istogramma root[] hist_1.fill(50); root[] hist_1.fill(120,2); root[] hist_1.fill(130,2); 5) disegna l istogramma root[] hist_1.draw();
una macro root { TH2F *hpxpy = new TH2F("hpxpy","py vs px",40,-4,4,40,-4,4); TH1F *hpx = new TH1F("hpx","px",40,-4,4); TH1F *hpy = new TH1F("hpy","py",40,-4,4); Double_t px,py; for (Int_t i = 0; i < 50000; i++) { grandom->rannor(px,py); hpxpy->fill(px,py); hpx->fill(px); hpy->fill(py); hpxpy->draw("col"); 1) apri terminale 2) edita la macro 3) esegui la macro
una macro root { TH2F *hpxpy = new TH2F("hpxpy","py vs px",40,-4,4,40,-4,4); TH1F *hpx = new TH1F("hpx","px",40,-4,4); TH1F *hpy = new TH1F("hpy","py",40,-4,4); Double_t px,py; for (Int_t i = 0; i < 50000; i++) { grandom->rannor(px,py); hpxpy->fill(px,py); hpx->fill(px); hpy->fill(py); hpxpy->draw("col"); 1) apri terminale 2) edita la macro 3) esegui la macro http://root.cern.ch/root/html http://root.cern.ch/root/html/trandom.html http://root.cern.ch/root/html/trandom.html#trandom:rannor
esempio di un fit gaussiano { TH2F *hpxpy = new TH2F("hpxpy","py vs px",40,-4,4,40,-4,4); TH1F *hpx = new TH1F("hpx","px",40,-4,4); TH1F *hpy = new TH1F("hpy","py",40,-4,4); Double_t px,py; for (Int_t i = 0; i < 50000; i++) { grandom->rannor(px,py); hpxpy->fill(px,py); hpx->fill(px); hpy->fill(py); hpxpy->draw("col"); 1) apri terminale 2) edita la macro 3) esegui la macro 4) hpx->draw() 5) esegui un fit gaussiano tramite l interfaccia fit panel
un poʼ piuʼ complesso 1) scaricate: http://www.cern.ch/iosys/basic2.c 2) scaricate: http://www.cern.ch/iosys/basic.txt 3) eseguite basic2.c
un poʼ piuʼ complesso void basic2() { // example of macro to create can ntuple reading data from an ascii file. // This macro is a variant of basic.c //Author: Rene Brun TString dir = gsystem->unixpathname(ginterpreter->getcurrentmacroname()); dir.replaceall("basic2.c",""); dir.replaceall("/./","/"); TFile *f = new TFile("basic2.root","RECREATE"); TH1F *h1 = new TH1F("h1","x distribution",100,-4,4); TTree *T = new TTree("ntuple","data from ascii file"); Long64_t nlines = T->ReadFile(Form("%sbasic.dat",dir.Data()),"x:y:z"); printf(" found %lld points\n",nlines); T->Draw("y","z>2"); T->Write();
fit con funzione esterna Double_t fitf(double_t *v, Double_t *par) { Double_t arg = 0; arg = (v[0]/par[2] + par[1]); Double_t fitval = par[3]+par[0]*1/((tmath::sin(arg))*(tmath::sin(arg))*(tmath::sin(arg))*(tmath::sin(arg))); return fitval; void myfit() { float ang[9]={0,5,10,15; float cont[9]={3353,1543,96,6; float errx[9]={2,2,2,2; float erry[9]={100,100,10,5; TGraphErrors *gr3 = new TGraphErrors(4,ang,cont,errx,erry); TF1 *func = new TF1("fit",fitf,0,25,4); func->setparameters(35,10,5,10); func->setparnames("par0","par1","par2","par3"); gr3->setmarkerstyle(21); gr3->draw("ap"); gr3->fit("fit"); http://liviof.web.cern.ch/liviof/myfit.c
fit con funzione esterna