30
... para pessoas que não sabem c+ + Alexandre Suaide aula 1

para pessoas que não sabem c++ Alexandre Suaide aula 1

Embed Size (px)

Citation preview

Page 1: para pessoas que não sabem c++ Alexandre Suaide aula 1

... para pessoas que não sabem c++

... para pessoas que não sabem c++

Alexandre Suaideaula 1

Page 2: para pessoas que não sabem c++ Alexandre Suaide aula 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...

Page 3: para pessoas que não sabem c++ Alexandre Suaide aula 1

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

Page 4: para pessoas que não sabem c++ Alexandre Suaide aula 1

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

Page 5: para pessoas que não sabem c++ Alexandre Suaide aula 1

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

Page 6: para pessoas que não sabem c++ Alexandre Suaide aula 1

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

Page 7: para pessoas que não sabem c++ Alexandre Suaide aula 1

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

Page 8: para pessoas que não sabem c++ Alexandre Suaide aula 1

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

Page 9: para pessoas que não sabem c++ Alexandre Suaide aula 1

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

Page 10: para pessoas que não sabem c++ Alexandre Suaide aula 1

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

Page 11: para pessoas que não sabem c++ Alexandre Suaide aula 1

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

Page 12: para pessoas que não sabem c++ Alexandre Suaide aula 1

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

Page 13: para pessoas que não sabem c++ Alexandre Suaide aula 1

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

Page 14: para pessoas que não sabem c++ Alexandre Suaide aula 1

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();

Page 15: para pessoas que não sabem c++ Alexandre Suaide aula 1

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();}

Page 16: para pessoas que não sabem c++ Alexandre Suaide aula 1

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

Page 17: para pessoas que não sabem c++ Alexandre Suaide aula 1

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}

Page 18: para pessoas que não sabem c++ Alexandre Suaide aula 1

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...

Page 19: para pessoas que não sabem c++ Alexandre Suaide aula 1

Acessando propriedades dos objetosclicando com o botão direito do mouseAcessando propriedades dos objetos

clicando com o botão direito do mouse

Page 20: para pessoas que não sabem c++ Alexandre Suaide aula 1

Mudando propriedades dos gráficos/histogramas

Mudando propriedades dos gráficos/histogramas

Page 21: para pessoas que não sabem c++ Alexandre Suaide aula 1

Fazendo ajustes simplesFazendo ajustes simples

Page 22: para pessoas que não sabem c++ Alexandre Suaide aula 1

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!!!

Page 23: para pessoas que não sabem c++ Alexandre Suaide aula 1

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

Page 24: para pessoas que não sabem c++ Alexandre Suaide aula 1

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);

Page 25: para pessoas que não sabem c++ Alexandre Suaide aula 1

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.

Page 26: para pessoas que não sabem c++ Alexandre Suaide aula 1

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.

Page 27: para pessoas que não sabem c++ Alexandre Suaide aula 1

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();}

Page 28: para pessoas que não sabem c++ Alexandre Suaide aula 1

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

Page 29: para pessoas que não sabem c++ Alexandre Suaide aula 1

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)

Page 30: para pessoas que não sabem c++ Alexandre Suaide aula 1

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