... para pessoas que não sabem c++
... para pessoas que não sabem c++
Alexandre Suaideaula 1
O que é o ROOT?O que é o ROOT?
• O ROOT é tudo que você precisa ...– Conjunto de bibliotecas para análise de dados e
desenvolvimento de aplicativos• Histogramas, gráficos, análise em geral, simulação, IO,
desenvolvimento de aplicativos, etc
– Poderoso interpretador c++ (Cint)• Você pode rodar um programa em c++ linha por linha
no prompt de comando
– Interface gráfica poderosa (mas não é o Origin)• ... mas ao mesmo tempo não é muita coisa.
– O usuário tem que saber programar um pouco...
Organização das aulasOrganização das aulas
• Aula 1– Comandos (realmente) básicos do ROOT– Um pouco de c++ para usuários de ROOT– Criando objetos simples (histogramas, gráficos,
etc)– Manuseando gráficos e histogramas.
• A interface gráfica– Funções e ajustes de gráficos
• Aula 2– Análise de dados no Pelletron
• ScanRoot e PelTools– Macros– Inovando sem perder a classe.– Debug, memory leaks e administrando objetos
Comandos básicosComandos 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 macro na memória– .x para carregar e executar um macro– .h para um help
Note que esse tipo de texto será utilizado
sempre que for algum comando para ser
digitado no computador
A interface do ROOTA 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
O ROOT é realmente um interpretador c++O ROOT é realmente um interpretador c++
• Exemplo de algo bem básico ...
• Tipos de variáveis– C++
• double, float, long int, int, short int, char, etc.– No ROOT
• Double_t, Float_t, Long_t, Int_t, Short_t, Char_t, etc.– A diferença vem do fato que as variáveis em c++ dependem da
plataforma (em termos de tamanho)• Ex: int (i386 = 4 bytes, Solaris = 8 bytes)
– ... Enquanto os tipos definidos no ROOT têm tamanho fixo, independente de plataforma
root [0] float a = 10;root [1] float b = 20;root [2] cout << “a + b = “ << a + b << endl;a + b = 30root [3] for(int i = 0; i<3; i++) cout << “i = “ << i <<endl;i = 0i = 1i = 2
Um pouco de c++ só para não ficar totalmente perdido
Um pouco de c++ só para não ficar totalmente perdido
• IO básico:– cout/cin
cout << “Ola. 1 + 1 = “ << 1 + 1 << endl;int idade;cout <<“Quantos anos voce tem? “<<endl;cin >> idade;
• Loops– for ( parâmetros do loop ) { comandos }
– do { alguma coisa } while ( condição );– while ( condição ) { alguma coisa }
for(int i=0;i<10;i++) cout << i << endl;
• Condições– if ( condição ) { alguma coisa } else { outra coisa }
– == (igual), != (diferente), || (or), && (and), ! (not)
if (i==0) cout << “É zero “<<endl;else cout <<“Não é zero “<<endl;
• Comentários– /* comentário de bloco */– // comentário de linha
Um pouco mais de c++Um pouco mais de c++
• Classe– É a descrição de algum conceito abstrato– Classes possuem membros
• Membros podem ser variáveis ou funções.• Os membros podem ser públicos, privados ou protegidos.
O usuário tem acesso somente aos membros públicos
– Classes podem derivar de outras classes.• Objeto
– É a “coisa” real criada na memória do computador que tem uma estrutura definida pela classe
• Ponteiro– Contém o endereço de um objeto na memória
• É uma espécie de atalho para uma certa região de memória do computador
Classes possuem interfaceClasses possuem interface
• Como o usuário só tem acesso aos membros públicos, não importa como as coisas são feitas internamente.– A interface é muito importante e define o nível de
facilidade com o qual o usuário interage com o objeto
Criando (... e destruindo) objetos...Criando (... e destruindo) objetos...
• Criando objetos no stack
– O objeto h deixa de existir quando a função termina
void exemplo_obj_1(){ TH1F h("hist","histograma",100,0,10); h.SetLineColor(1); h.Draw();}
• Criando objetos no heap (new e delete)
– Objetos no heap são acessados com ponteiros– O objeto h só deixa de existir com o delete h;
void exemplo_obj_2(){ TH1F* h = new TH1F("hist","histograma",100,0,10); h->SetLineColor(1); h->Draw();}
Parâmetros para criação do
objeto
Construtor do objeto
Construindo objetos... Múltiplos construtores (polimorfia)
Construindo objetos... Múltiplos construtores (polimorfia)
class TH1F : public TH1, public TArrayF{ public: TH1F() TH1F(const char* name, const char* title, Int_t nbinsx, Axis_t xlow, Axis_t xup); TH1F(const char* name, const char* title, Int_t nbinsx, const Float_t* xbins); TH1F(const char* name, const char* title, Int_t nbinsx, const Double_t* xbins); TH1F(const TVectorF& v); TH1F(const TH1F& h1f); virtual ~TH1F(); virtual void AddBinContent(Int_t bin); virtual void AddBinContent(Int_t bin, Stat_t w);...
As funções de uma classe que possuem o mesmo nome da classe sãoos construtores. A função ~NOME é o destrutor
Alguns padrões no código do ROOTfacilita a aprendizagem
Alguns padrões no código do ROOTfacilita a aprendizagem
Classes Começam com T TBrowser, TH1F
Tipos Terminam com _t Int_t
Membros de classes
Começam com f fSize
Funções membros
Começam com maiúsculo
Get(), SetSize()
Constantes Começam com k kRed
Variáveis estáticas
Começam com g gROOT, gSystem
Membros estáticos
Começam com fg fgTokenClient
Trabalhando com o ROOTTrabalhando com o 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
Histogramas de 1 dimensão (TH1)Histogramas de 1 dimensão (TH1)
• 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 (TH2)Histogramas de 2 dimensões (TH2)
• 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-YGrá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 (float) para os vetores com
os dados– ex, ey são ponteiros (float) para os vetores
com os erros
Um exemplinhoUm exemplinhovoid 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}
Personalizando histogramas e gráficosPersonalizando histogramas e gráficos
• As propriedades dos objetos podem ser alteradas através dos métodos implementados na definição das classes– Pode-se fazer:
• Além disso, o ROOT possui uma interface gráfica bastante amigável– Botão da esquerda
• Arrasta objetos de um lugar para outro
– Botão do meio• Muda a janela gráfica onde os gráficos serão desenhados
– Botão da direita• Acessa menus e propriedades dos objetos onde o mouse está
localizado.
h1->SetFillColor(2); // muda a cor de preenchimentoh1->SetLineWidth(1.3); // muda espessura da linhah1->GetXaxis()->SetTitle(“legenda X”); // muda legenda do eixo X...
Acessando propriedades dos objetosclicando com o botão direito do mouseAcessando propriedades dos objetos
clicando com o botão direito do mouse
Mudando propriedades dos gráficos/histogramas
Mudando propriedades dos gráficos/histogramas
Fazendo ajustes simplesFazendo ajustes simples
Ok, fiz meus gráficos, histogramas, etc...Como que eu os gravo em um arquivo?
Ok, fiz meus gráficos, histogramas, etc...Como que eu os gravo em um arquivo?
• O ROOT possui uma classe para IO.– TFile
• TFile *f = new TFile(“NOME”,”opções”);
• Um exemplo... Gravando histogramasvoid exemplo_TFile_write(){ TRandom *r = new TRandom(); TH1F *h1 = new TH1F("hist1","Exemplo TH1",50,0,10); TH2F *h2 = new TH2F("hist2","Exemplo TH2",50,0,10,50,0,5); for(int i = 0;i<2000;i++) { h1->Fill(r->Gaus(5,1)); h2->Fill(r->Gaus(5,1), r->Gaus(3,0.5)); } TFile *f = new TFile("teste.root","NEW"); h1->Write(); h2->Write(); f->Close(); delete f;}
IMPORTANTE!!!
Abrindo e lendo objetos de um arquivoAbrindo e lendo objetos de um arquivo
• Usando o promptroot [0] TFile *f=new TFile("teste.root");root [1] TH1F *h1=f->Get("hist1");root [2] h1->Draw();
• Usando a interface gráfica (browser)new TBrowser();
Esse comando cria um objeto do tipo
TBrowser.
• Arquivos abertos aparecem na pasta ROOT Files
Trabalhando melhor com janelas gráficas (TCanvas)
Trabalhando melhor com janelas gráficas (TCanvas)
• Como criar uma janela gráfica vaziaroot [0] TCanvas *c = new TCanvas(“nome”,”Titulo”,400,300);
Um exemplo. Mostrando histogramas de várias formas
Um exemplo. Mostrando histogramas de várias formas
void exemplo_TCanvas(){ TFile *f = new TFile("teste.root"); TH2F *h1 = f->Get("hist1"); TH2F *h2 = f->Get("hist2"); TCanvas *c = new TCanvas(); c->Divide(2,2); c->cd(1); h2->Draw(); c->cd(2); h2->Draw("colz"); c->cd(3); h1->Draw(); c->cd(4); gPad->SetFillColor(11); gPad->SetLogy(); h1->Draw();}
gPad é um ponteiro interno do ROOT que sempre aponta para o objeto TPad
atual.
Fazendo ajustes mais complexos – Criando funções
Fazendo ajustes mais complexos – Criando funções
• A interface gráfica do ROOT permite ajustes simples (Gaussiana, polinômios, etc).
• 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 simplesUm 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();}
Ajustando um histogramaAjustando um histogramavoid exemplo_Fit(){ TFile *f = new TFile("teste.root"); TH2F *h1 = f->Get("hist1"); TF1 *f1 = new TF1("func","[0]*exp(-0.5*pow((x-[1])/[2],2))"); for(int i=0;i<3;i++) f1->SetParameter(i,1); h1->Fit(f1,"Q"); h1->SetFillColor(23); for(int i=0;i<3;i++) { cout <<"Parametro "<<i <<" = "<<f1->GetParameter(i) <<" +- "<<f1->GetParError(i)<<endl; } cout <<"Chi2 = "<<f1->GetChisquare() <<" NDF = "<<f1->GetNDF()<<endl;}
root [0] .L exemplo.Croot [1] exemplo_Fit()Parametro 0 = 159.659 +- 4.41171Parametro 1 = 5.00271 +- 0.0223727Parametro 2 = 0.987987 +- 0.0160371Chi2 = 24.7388 NDF = 30
Na próxima aula ...Na próxima aula ...
• Análise de dados no Pelletron– scanroot e PelTools
• Vamos explorar o ROOT um pouco mais a fundo– Macros– Definindo novas classes– Compilando para tornar a execução mais
rápida– Como corrigir problemas (debug)
Como conseguir mais informaçãoComo conseguir mais informação
• Site do ROOT– http://root.cern.ch
• Documentação das classes– http://root.cern.ch/root/Reference.html
• Alguns documentos interessantes (root, c++)– Incluindo essas aulas– http://dfn.if.usp.br/~suaide/pelletron/links.htm
• Download ROOT (+scanroot e PelTools)– http://dfn.if.usp.br/~suaide/pelletron/download.
htm
Top Related