Piccolo corso su ROOT e Analisi Dati Davide Cester
Parte II: Introduzione a ROOT Che cos'è ROOT Riga di comando e macro Strutture dati Lettura e scrittura di files ROOT Classi e oggetti di ROOT
...classi e oggetti di ROOT: TCanvas istogrammi 1D e 2D grafici XY Funzioni matematiche
ROOT sviluppato al CERN negli ultimi 20 anni software di analisi per i dati di LHC basato su C/C++ funzionamento interattivo o con macro fornisce strutture dati e codice già pronto http://root.cern.ch
Scrittura di files ROOT TFile *output_file = new Tfile(fileName,"RECREATE"); output_file->cd(); generic_object->write(); output_file->close();
Lettura di files ROOT TFile *infile = new TFile(fileName,"READ"); TTree *intree = (TTree*)infile->Get("datatree"); // (!) cast esplicito --^ input_file->close();
Trees - Branches - Leaves
Tree residente in memoria TTree *datatree = new TTree("name","Title"); [...] TFile *output_file = new TFile(fName,"RECREATE"); output_file->cd(); // rende il TFile la destinazione corrente datatree->write(); datatree->setdirectory(0); // riporta in memoria il tree output_file->close();
Tree residente su disco TFile *output_file = new TFile(fileName,"RECREATE"); TTree *datatree = new TTree("name","title"); [...] datatree->write(); [...] output_file->close();
Dichiarazione dei branches TBranch *branch = existing_tree->branch(branchname, Dove: address, leaflist, bufsize); branchname è il nome interno del Branch address è l'indirizzo di una struttura leaflist è l'elenco delle foglie bufsize può essere omesso
Struct associate ai branch struct evt_data_t { UInt_t evcounter; UInt_t timestamp; UShort_t samples[8]; } out_data;
Riempimento di un branch TBranch *branch = tree->branch("evbranch", &out_data.evcounter, "counter/i:time:samples[8]/s"); out_data.evcounter =... out_data.timestamp =... out_data_samples[k] =... branch->fill();
Lettura di un branch TBranch *branch = intree->getbranch("br01"); branch->setaddress(&inc_data.evcounter); branch->getentry(i); cout << out_data.evcounter;
Precisazioni L'indirizzo che va passato al costruttore del branch è quello della prima variabile della struct L'ordine ed il tipo delle variabili nella leaflist e nella struct devono combaciare
Esempi: scrivitree.c, leggitree.c
N-tuple Simile al Tree ma più semplice Contiene solo variabili float I branch ci sono, dichiarati automaticamente Esiste per tradizione
N-tuple: scrittura TNtuple *nt = new TNtuple("name", "title","var1:var2:var3"); var1 =...; var2 =...; var3 =...; nt->fill(value1,value2,value3...);
N-tuple: lettura TNtuple *nt= (TNtuple*)input_file->Get("nt_name"); // repeat for each variable: nt->setbranchaddress("varname",&var); // loop on entries: nt->getentry(numentry);
Esempi: scrivintupla.c, leggintupla.c
Istogrammi 1D L'oggetto più usato in ROOT In senso stretto, rappresenta frequenze Possiede una grande quantità di metodi utili all'analisi (ricerca picchi, fit...) Viene utilizzato per rappresentare di tutto
Istogrammi 1D TH1F("internalname","title",numBins,lowX,upX); internalname è il nome usato da ROOT title è il titolo a schermo numbins è il numero di intervalli (+2) lowx, upx sono gli estremi del grafico
Istogrammi 1D Uso per rappresentare frequenze: significato intuitivo degli intervalli i metodi restituiscono la moda, la mediana, il numero di campioni... gli spettri di energia sono grafici di frequenza in senso stretto
Istogrammi 1D Uso per rappresentare funzioni: gli intervalli simboleggiano dei punti in X le frequenze contengono il valore di f(x), arrotondato ad un intero è possibile applicare le procedure di fit al profilo del'istogramma
Istogrammi 1D Uso per rappresentare segnali: gli intervalli corrispondono alla frequenza di campionamento del segnale le frequenze contengono il valore di tensione campionato (e arrotondato) fit, ricerca dei picchi, calcolo del fondo
Metodi per riempire un istogramma: Istogrammi 1D Fill(valore): viene aumentata di 1 la frequenza del bin appropriato Fill(valore,peso): viene aumentata di 'peso' la frequenza del bin appropriato SetBinContent(): impostazione manuale
Istogrammi 1D Modi per esportare un istogramma: Salvare in un file di testo la sequenza delle altezze dei bin, e poi usare SetBinContent() Salvare l'istogramma in un file ROOT (NB: salva le altezze, non i valori originali) Salvare l'istogramma come immagine
Istogrammi 1D Operazioni applicabili ad un istogramma: Disegno di più grafici sovrapposti Ridefinizione degli intervalli (agisce sui bin) Riscalamento degli assi (ha effetto sui fit) Salvare l'istogramma come immagine Modifiche varie a linea ed area
Istogrammi 1D Disegno di più grafici sovrapposti: TCanvas *c0 = new TCanvas( c0 ); TH1F *h0 = new TH1F( h0, h0,1026,0,4096); TH1F *h1 = new TH1F( h1, h1,1026,0,4096); // riempimento degli istogrammi... h0->draw(); h1->setlinecolor(2); // 2 = rosso, vedi web h1->draw( SAME );
Istogrammi 1D Riscalamento degli assi: TH1F *h_nc = new TH1F( h_nc, h_nc,nbins,minx,maxx); float m = 1; // pendenza float q = 0; // intercetta int max_bin = h_nc->getnbinsx(); float max_kev = h_nc->getbincenter(max_bin)*m + q; h_nc->getxaxis()->setlimits(q,max_kev); h_nc->setxtitle("kev");
Istogrammi 1D Salvare una canvas (non TH1F!) come immagine: TCanvas *c0 = new TCanvas( c0 ); TH1F *histo = new TH1F( h0, h0,1026,0,4096); // riempimento del TH1F histo->draw(); c0->print( histo0.png ); c0->print( histo0.pdf );
Esempi: eventbrowserstd.c, esempio_histo.c
Fine parte II