ROOT Tutorial Parte 4 Tree ROOT Ogni esperimento di fisica nucleare produce in genere degli eventi, definiti da una serie ordinata di variabili. Esempio: 2 rivelatori in coincidenza, con le seguenti informazioni: energia depositata in ciascuno dei due e tempo di volo tra i due: E1, E2, T Struttura dell’evento: N.Evento E1 E2 T 1 2.35 3.46 5.61 2 3.43 4.21 5.66 3 4 ……………………………. ……………………… Il programma di acquisizione dati scriverà in un file, evento per evento, questa serie ordinata di numeri, per la loro successiva analisi I Tree di ROOT permettono di conservare facilmente queste strutture dati e consentono un’analisi multiparametrica Creare e riempire un Tree Creare un oggetto TTree TTree *tree = new TTree(“tree","A ROOT tree"); Aggiungere i Branches Double_t var; tree->Branch(“var",&var,”var/D”); Riempire il tree tree->Fill(); Scrivere un tree in un file tree->Write(); Esempio void createtree(){ //Output ROOT file TFile *f = new TFile("esempiotree.root","RECREATE"); //Output tree TTree *myTree = new TTree("myTree","a ROOT tree"); Int_t evno; Float_t var1, var2, var3; myTree->Branch("evno",&evno,"evno/I"); myTree->Branch("var1",&var1,"var1/F"); myTree->Branch("var2",&var2,"var2/F"); myTree->Branch("var3",&var3,"var3/F"); for(Int_t i=0; i<1000; i++){ evno = i; var1 = gRandom->Uniform(); var2 = gRandom->Exp(1); var3 = gRandom->Gaus(0,1); myTree->Fill(); } myTree->Write(); f->Close(); } Alcuni metodi utili per l’analisi di un Tree (interattivamente) root[ ]> myTree- >Scan() root[ ]> myTree- >Print() root[ ]> myTree- >Draw(“var3”) 1D root[ ]> myTree- >Draw(“var1:var2”) 2D root[ ]> myTree- >Draw(“var1:var2”, “”, “lego2”) 2D con opzioni root[ ]> myTree- >Draw(“var1:var2”, “evno<500”, “lego”) 2D con taglio root[ ]> myTree- >Draw(“var1:var2:var3”) 3D root[ ]> myTree- >Fit(“gaus”, “var3”) Fit root[ ]> myTree- >Fit(“gaus”, “var3”, “cut”) Fit con taglio Leggere un tree da un file ROOT void readtree(){ TFile *f = new TFile("esempiotree.root"); TTree *tree = (TTree*)f->Get("myTree"); Int_t evno; Float_t var1, var2, var3; tree->SetBranchAddress("evno",&evno); tree->SetBranchAddress("var1",&var1); tree->SetBranchAddress("var2",&var2); tree->SetBranchAddress("var3",&var3); tree->Draw("var3","evno<500"); } Un esempio di analisi su dati simulati Diverse particelle (p, π, K in una certa proporzione) Rivelatore costituito da 3 rivelatori sottili e da un rivelatore spesso in silicio Output: Un file di Root con 50000 eventi simulati che contengono: N.evento, Tipo di particella, Impulso, E1, E2, E3, Etot Esercitazione: Costruire gli spettri dell’energia depositata in ciascuno dei rivelatori Contenuto del Tree (file “deltae.root”) Kpart=8 (pioni), 11 (kaoni), 14 (protoni) Leggere il file deltae.root void deltae(){ TFile *f = new TFile("deltae.root"); TTree *tree = (TTree*)f->Get("tree"); Int_t iev, kpart; Double_t pmod, e1, e2, e3, etot; tree->SetBranchAddress("iev",&iev); tree->SetBranchAddress("kpart",&kpart); tree->SetBranchAddress("pmod",&pmod); tree->SetBranchAddress("e1",&e1); tree->SetBranchAddress("e2",&e2); tree->SetBranchAddress("e3",&e3); tree->SetBranchAddress("etot",&etot); … Un esempio di analisi su dati simulati Esercitazioni: 1 Costruire gli spettri dell’energia depositata in ciascuno dei rivelatori 2 Costruire gli spettri selezionando le particelle incidenti 3 Costruire dei plot bidimensionali Ej-Etot per j=1, 2, 3 (matrici DeltaE-E) 4 Studiare l’effetto dell’impulso delle particelle incidenti 5 Studiare l’effetto dell’inclinazione della traccia Costruire gli spettri dell’energia depositata in ciascuno dei rivelatori … Tree->Draw(“e1”); } Costruire gli spettri selezionando le particelle incidenti … Tree->Draw(“e1”, “kpart==14”); } Costruire dei plot bidimensionali … Tree->Draw(“e1:etot”); //Oppure TH2D *h2 = new TH2D("h2","deltaE-E",300,0,150,50,0,2.5); for(Int_t i = 0; i < tree->GetEntries(); i++){ tree->GetEntry(i); h2->Fill(etot,e1); } gStyle->SetPalette(1); h2->Draw("colz"); } Studiare l’effetto dell’impulso Tree->Draw(“e1:etot”,”kpart==11&&pmod<0.4”) Studiare l’effetto dell’inclinazione della traccia deltae.root Tree->Draw(“etot”,”kpart==8”) deltae_cono.root