alexandre suaide aula 4 c++ e root. programa aula 1 –introdução ao c++ e root –c++ básico...
TRANSCRIPT
Alexandre Suaideaula 4
c++ e Root
Programa
• Aula 1– Introdução ao c++ e ROOT– c++ básico
• Aula 2– Ponteiros/referências– Usando ponteiros cálculo de cinemática
• Aula 3– Classes e objetos– ROOT como ferramenta de programação/análise
• Aula 4– Classes e objetos no ROOT
• Aula 5– Análise de dados no Pelletron (ScanROOT)
Classes e objetos em c++
• Classes são os moldes para criação de um objeto em c++
• Objetos são entidades concretas (espaço em memória) criados e organizados com estrutura definida pelas classes
classe
objetos
Criando e destruindo objetos
• Criando objetos no stack void exemplo_obj_1() { TH1F h("hist","histograma",100,0,10); h.SetLineColor(1); h.Draw(); }
– O objeto h deixa de existir quando a função termina
• Criando objetos no heap (new e delete) void exemplo_obj_2() { TH1F* h = new TH1F("hist","histograma",100,0,10); h->SetLineColor(1); h->Draw(); }
– Objetos no heap são acessados com ponteiros– O objeto h só deixa de existir com o delete h;
Parâmetros para criação do
objeto
Construtor do objeto
ROOT• Conjunto de bibliotecas escritas em c++ cuja finalidade é
permitir o desenvolvimento de técnicas de simulação, aquisição e análise de dados– As bibliotecas seguem a filosofia de programação orientada
a objeto• A interface com o usuário se faz de três modos
– Prompt de comando• Interpretador c/c++ (CINT)
– Permite total acesso a funcionalidade do ROOT e c++– O prompt de comando atua como um compilador em
tempo real. – Interface gráfica
• Permite manipulação de objetos gráficos (histogramas, gráficos, objetos, menus, etc)
– Compilador c++ (gcc em Linux e VC em windows)• Permite compilar programas avançados e criar novos
programas específicos, utilizando a funcionalidade do ROOT
– ScanRoot, SPMRoot• Necessita conhecimento de c++ para fazer bom proveito do
sistema
Comandos básicos
• Como iniciar o programa – Digite root
• Como sair do ROOT– Digite .q
• Estranho, mas como o ROOT é um interpretador c++, os comandos internos do mesmo têm que ser diferenciados. Assim, todos os comandos do ROOT começam com “.”. Os comandos mais importantes, alem do .q são– .L para carregar um programa (macro) na
memória– .x para carregar e executar um programa– .h para um help dos comandos disponíveis
A interface do ROOT
• Use a tecla TAB para obter ajuda• root [0] b = new TB <TAB>• root [1] b = new TBrow<TAB>• root [2] b = new TBrowser(<TAB>• Útil para descobrir a lista de métodos• Descobrir também lista de parâmetros
Gráficos e histogramas no ROOT
• Gráficos e histogramas– O ROOT possui uma quantidade enorme
de classes para tratar objetos gráficos– Histogramas
• TH1 – Histogramas de 1 dimensão– TH1I, TH1S, TH1F, TH1D, ... (estabelece a
precisão do eixo)• TH2 – Histogramas de 2 dimensões• TH3 – Histogramas de 3 dimensões
– Gráficos• TGraph – Gráficos de X e Y simples• TGraphErrors – Gráficos com barras de erro
– Funções• TF1 – Função de 1 variável F=F(x)• TF2 – Função em 2 variáveis F=F(x,y)
Histogramas de 1 dimensão
• Criando um Histograma de 1 dimensão– TH1F *h = new TH1F(“nome”,”título”, Nbins, Xmin, Xmax);– TH1F h (“nome”,”título”, Nbins, Xmin, Xmax);
void exemplo_TH1() { TRandom *r = new TRandom(); TH1F *h1 = new TH1F("histograma","Exemplo histograma",50,0,10); for(int i = 0;i<2000;i++) { float x = r->Gaus(5,1); h1->Fill(x); } h1->Draw(); }
Para rodar esse exemplo, assim como os Seguintes, salve-o em um arquivo, por Exemplo, teste.C e digite, no prompt doROOT
root [0] .L teste.Croot [1] exemplo_TH1();
Histogramas de 2 dimensões
• Muito similar ao TH1– TH2F *h = new TH2F(“nome”,”título”, NbinsX, Xmin, Xmax, NBinsY, Ymin,
Ymax);– TH2F h (“nome”,”título”, NbinsX, Xmin, Xmax, NbinsY, Ymin,Ymax);
void exemplo_TH2() { TRandom *r = new TRandom(); TH2F *h2 = new TH2F("h","Exemplo Th2",50,0,10,50,0,5); for(int i = 0;i<2000;i++) { float x = r->Gaus(5,1); float y = r->Gaus(3,0.5); h2->Fill(x,y); } h2->Draw(); }
Gráficos X-Y
• Criar gráficos a partir de uma tabela é como tirar doce da mão de criança...
• TGraph e TGraphError– ... = new TGraph(N,x,y);– ... = new TGraphErrors(N,x,y,ex,ey);
• Onde– N = número de pontos– x, y são ponteiros para os vetores com os
dados– ex, ey são ponteiros para os vetores com os
erros
Um exemplo de gráficovoid exemplo_TGraph(){ float x[] = {1,2,3,4,5,6}; float y[] = {0.1,0.3,0.5,0.7,0.9,1.1}; float ex[] = {0.1,0.1,0.1,0.1,0.1,0.1}; float ey[] = {0.02,0.03,0.02,0.04,0.03,0.05}; TGraphErrors *g = new TGraphErrors(6,x,y,ex,ey); g->SetMarkerStyle(20); // para circulo g->Draw("AP"); // A desenha os eixos, P desenha pontos}
Gráficos a partir de tabelas de dadosO arquivo dados.dat contém 3 colunas, x, y, ey. No prompt do ROOT, digite
Root [1]: TGraphErrors *g = new TGraphErrors(“dados.dat”,"%lg %lg %lg");Root [2]: g->Draw(“AP”);
Simple, isnt´t it?
Como trabalhar diretamente com os atributos de um gráfico?
TCanvas *c1 = new TCanvas(“canvas”,”janela de grafico”,600,600);c1->SetLogy();
TGraphErrors *g = new TGraphErrors(“teste.dat”,"%lg %lg %lg");g->Draw(“AP”);
g->SetTitle(“Electrons from heavy quarks decay”);g->SetMarkerStyle(20);g->SetMarkerColor(2);g->SetLineColor(2);
TAxis* Y = g->GetYaxis();Y->SetTitle(“1/(2#pi p_{T}) d^{2}N/dp_{T}d#eta”);Y->SetTitleSize(0.03);Y->SetLabelSize(0.03);Y->SetTitleOffset(1.4);
TAxis* X = g->GetXaxis();X->SetTitle(“p_{T} (GeV/c)”);X->SetTitleSize(0.03);X->SetLabelSize(0.03);
Letras gregas e outros caracteres especiais de LaTEX podem ser obtidos com a mesma
sintaxe do LaTEX, substituindo \ por #
Criando funções
• O ROOT possui classes para definir funções.– TF1, TF2 e TF3
• Uso– TF1 *f = new TF1(“nome”,”formula”,min,max);
• A fórmula deve ser escrita usando a sintaxe padrão de c++.– Parâmetros variáveis devem vir entre
brackets• [0], [1], etc
– As variáveis são x, y e z• Alguns métodos interessantes
– SetParameter(), GetParameter(), GetParError(), GetChisquare(), Eval(), etc.
Um exemplo simples
void exemplo_Func(){ TF1 *f1 = new TF1("func", "[0]*exp(-x/[1])*sin([2]*x)", 0,6.28); f1->SetParameter(0,1); f1->SetParameter(1,3); f1->SetParameter(2,6); f1->Draw();}
O fim de um comando só ocorre quando se coloca o
;
Fazendo ajustes de funções• Vamos utilizar o nosso bom e velho gráfico do slide anterior• Método mais simples de ajuste: utilizar TF1
TF1 *f = new TF1(“f”,”[0]*pow(1+x/[1],-[2])”,0,15);f->SetParameter(0,1);f->SetParameter(1,1.5);f->SetParameter(2,9);g->Fit(f);
BABApow ),(
Adicionando legenda aos gráficos
• Utilize a classe TLegend– TLegend *l = new TLegend(xmin,ymin,xmax,ymax);
• Os valores são fração do tamanho da janela gráfica e não coordenadas reais nos graficos
– l->AddEntry(objeto,”label”,”modo de exibição”);• Modos de exibição
– l = linha– p = ponto– f = cor de preenchimento
• ExemploTLegend *l = new TLegend(0.67,0.75,0.87,0.87);l->AddEntry(g,”dados”,”p”);l->AddEntry(f,”ajuste”,”l”);l->Draw();
Outro exemplo de fit (com histogramas)
• Vamos criar um histograma fajuto TF1 *f = new TF1(“f”,”[0]*exp([1]*x)+gaus(2)+gaus(5)”,0,10);f->SetParameter(0,40);f->SetParameter(1,-0.3);f->SetParameter(2,20);f->SetParameter(3,4.3);f->SetParameter(4,0.2);f->SetParameter(5,56);f->SetParameter(6,8);f->SetParameter(7,0.2);
TH1F* h = new TH1F(“hist”,”teste”,100,0,10);for(int i=0; i<8000; i++) h->Fill(f->GetRandom());h->Draw();
Funções pré-definidas. O Root possui algumas funções pré-definidas,
tais como:
gaus – GaussianapolN – polinômio de grau N (N = 0...9)landau – distribuição de Landau
expo – exp([0]+[1]*x)
Outro exemplo de fit (com histogramas) [0]*exp([1]*x)+gaus(2)+gaus(5)
• Vamos ajustar o histogramah->Fit(f);
• Como extrair informações da função ajustada que não seja pela tela?
Outro exemplo de fit (com histogramas) [0]*exp([1]*x)+gaus(2)+gaus(5)
• Qual o Х2red do ajuste?
f->GetChisquare()/f->GetNDF();1.36299
• Qual o número de contagens no primeiro pico?TF1 *peak = new TF1(“peak”,”gaus(0)”,0,10);peak->SetParameters(f->GetParameters()+2);peak->Draw(“same”); peak->Integral(0,10);53.5103peak->Integral(0,10)/h->GetBinWidth(23);535.103
• E no segundo?peak->SetParameters(f->GetParameters()+5);peak->Integral(0,10)/h->GetBinWidth(23);1349.11
Essa é uma operação com ponteiros. Se você checar a documentação do ROOT verá que o
método GetParameters() retorna um Double_t* que indica a posição na memória onde os parâmetros estão guardados. O +2 indica o deslocamento dentro dessa
memória
Caso operações com ponteiros incomodem, pode-se fazer na força bruta:
peak->SetParameter(0,f->GetParameter(2));peak->SetParameter(1,f->GetParameter(3));peak->SetParameter(2,f->GetParameter(4));
Integral, por definição, inclui o tamanho do canal. Caso o canal não
tenha tamanho == 1, deve-se ter
cuidados extras
Como obter informações
• Vários tutoriais de ROOT em– http://www.dfn.if.usp.br/~suaide/pelletron/
• Referências e documentação do ROOT– http://root.cern.ch
• Página principal do root– http://root.cern.ch/root/Categories.html
• Documentação sobre as classes do root– http://root.cern.ch/root/Tutorials.html
• Tutoriais com exemplos simples, passo a passo– http://root.cern.ch/root/HowTo.html
• Como resolver problemas comuns
Resumo
• Root é uma coleção de classes para análise de dados com um interpretador c++
• ROOT– Como criar e preencher histogramas– Gráficos e funções
• Manipulando atributos de gráficos– Ajustes de dados
Próxima semana
• Histogramas, gráficos e funções– Como utilizá-los mais a fundo
• Projeções• Ajustes • Cortes• Etc.
• ScanRoot (e SPMRoot)– Como usar a interface – Como processar os dados adquiridos com
o SPMRoot