Você está na página 1de 15

Guia prático ROOT

Caio Laganá

1
Sumário

1 Introdução 3

2 Instalando o ROOT 3

3 Funções 4
3.1 O tipo TF1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3.2 Fórmulas pré-definidas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3.2.1 Funções elementares . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.2.2 Trigonométricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.2.3 Hiperbólicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.2.4 Exponencial e logaritmica . . . . . . . . . . . . . . . . . . . . . . . . 5
3.3 Rotinas associadas à classe TF1 . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.4 Funções com parâmetros ajustáveis . . . . . . . . . . . . . . . . . . . . . . . 7
3.5 Opções de desenho TF1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.6 Funções de 2 variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.7 Opções de desenho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.8 Funções de 3 variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

4 Gráficos 8
4.1 Criando um gráfico a partir de um arquivo de dados . . . . . . . . . . . . . 8
4.2 Ajustando uma curva sobre uma gráfico . . . . . . . . . . . . . . . . . . . . 9
4.3 Opções de desenho TGraph . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

5 Histogramas 11
5.1 O tipo TH1F . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

6 Macros 14

7 Tópicos especiais 15
7.1 Números aleatórios no ROOT . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
7.2 LATEX no ROOT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
7.3 Dicas sobre histogramas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

2
1 Introdução

O objetivo deste texto é servir como um guia prático de ROOT. (...)

2 Instalando o ROOT

Por hora, informações sobre a instalação estão disponı́veis no site oficial do ROOT

root.cern.ch

e na minha webpage (passo-a-passo para instalação no Ubuntu 8.04)

https://sites.google.com/site/caiolagana/linux

3
3 Funções

3.1 O tipo TF1

No ROOT, uma função é uma variável do tipo TF1 (Type Function 1-variable). A
sequência de comandos a seguir cria e desenha uma função seno no intervalo [0,5].

root [1] TF1 *funcao


root [2] funcao = new TF1("titulo", "sin(x)", 0, 5)
root [3] funcao->Draw()

O comando da linha [1] declara uma variável do tipo TF1 chamada funcao (assim
como o comando int i; declara uma variável do tipo int chamada i). A seguir, na
linha [2], essa variável recebe seus atributos: tı́tulo, fórmula e intervalo (analogamente ao
comando i = 5; onde a variável i recebe seu atributo: o valor 5). Finalmente, na linha
[3], é desenhado o gráfico dessa variável. O resultado dessa sequência de comandos pode
ser visto na figura 1.

Figura 1: Função seno desenhada no ROOT.

3.2 Fórmulas pré-definidas

O ROOT tem uma série de fórmulas pré-definidas que podem ser utilizadas para mon-
tar sua função. As principais delas serão listadas a seguir.

4
3.2.1 Funções elementares

[1] funcao = new TF1("quadratica", "x^2", 0, 5)


[2] funcao = new TF1("cubida", "5*x^3", 0, 5)
[3] funcao = new TF1("polinomio", "3*x^2 + 1.5*x^3 + 2.1", 0, 5)
[4] funcao = new TF1("hiperbole", "1/x", 0, 5)
[5] funcao = new TF1("hiperbole deslocada", "1/(x - 2)", 2, 5)
[5] funcao = new TF1("hiperbole e quadratica", "1/(x + 1) + x^2", 2, 5)

3.2.2 Trigonométricas

[1] funcao = new TF1("seno", "sin(x)", 0, 5)


[2] funcao = new TF1("cosseno", "cos(x)", 0, 5)
[3] funcao = new TF1("tangente", "tan(x)", 0, 5)
[4] funcao = new TF1("arco seno", "asin(x)", 0, 1)
[5] funcao = new TF1("arco cosseno", "acos(x)", 0, 1)
[6] funcao = new TF1("arco tangente", "atan(x)", 0, 5)

3.2.3 Hiperbólicas

[7] funcao = new TF1("seno hiperbolico", "sinh(x)", -5, 5)


[8] funcao = new TF1("cosseno hiperbolico", "cosh(x)", -5, 5)
[9] funcao = new TF1("tangente hiperbolica", "tanh(x)", -5, 5)

3.2.4 Exponencial e logaritmica

[10] funcao = new TF1("logaritmo na base e", "log(x)", 0, 5)


[11] funcao = new TF1("logaritmo na base 10", "log10(x)", 0, 5)
[12] funcao = new TF1("exponencial e^x", "exp(x)", 0, 5)

3.3 Rotinas associadas à classe TF1

Variáveis do tipo TF1 têm uma série de rotinas associadas a ela. Por exemplo, o
comando

funcao->Draw()

5
excecuta a rotina Draw() associada à variável funcao. Essa rotina desenha o gráfico da
função. De forma análoga, por exemplo, o comando

funcao->Integral(0, 1)

excecuta a rotina Integral() associada à variável funcao, retornando o valor de sua


integral no intervalo [0,1] que, neste caso, vale 0.4597.
As principais rotinas associadas a uma variável do tipo TF1 serão listadas a seguir.
Alguns exemplos de uso de cada uma dessas rotinas encontram-se logo após a lista.

funcao->Draw()
funcao->DrawDerivative()
funcao->DrawIntegral()
funcao->SetTitle()
funcao->SetLineColor()
funcao->SetLineStyle()
funcao->SetLineWidth()
funcao->GetMaximum()
funcao->GetMaximumX()

// cria funcao1 e funcao2


TF1 *funcao1 = new TF1("funcao1", "x^2", 0, 10)
TF1 *funcao1 = new TF1("funcao1", "exp(x)", 0, 10)

// desenha funcao1
funcao1->Draw()

// desenha funcao2 junto com funcao1


funcao2->Draw("same")

// cria funcao f
TF1 *f = new TF1("funcao", "log(3*x)", 5, 8)

// desenha a funcao f
f->Draw()

// desenha a derivada de f junto com ela


f->DrawDerivative("same")

// cria funcao f
TF1 *f = new TF1("funcao", "x*sin(x)", -3, 5)

// retorna o valor maximo da funcao


f->GetMaximum()

// retorna o valor X onde a funcao é máxima


f->GetMaximumX()

6
Para saber como utilizar determinada função, deixe o parênteses aberto e aperte a
tecla TAB, que aparecerá quais são os parâmetros de entrada.

root [5] funcao->SetTitle(


void SetTitle(const char* title = “ ”)

3.4 Funções com parâmetros ajustáveis

No ROOT é possı́vel criar funções com parâmetros ajustáveis. A sequência de coman-


dos a seguir cria uma reta do tipo y = ax + b.
TF1 *funcao = new TF1("titulo", "[0]*x + [1]", -4, 4)
funcao->SetParameter(0, 2.3)
funcao->SetParameter(1, 4.7)
Os sı́mbolos [0] e [1] na primeira linha são os parâmetros a e b da reta. O comando
da segunda linha atribui o valor 2.3 ao parâmetro [0], e a última linha atribui o valor 4.7
ao parâmetro [1]. Dessa forma, a equação da reta fica y = 2.3x + 4.7.
Para redefinir o parâmetro de uma fórmula uma vez que ele já tenha sido definido,
basta utilizar o comando SetParameter novamente.
É possı́vel adicionar muitos parâmetros a uma fórmula, [0], [1], [2], [3], · · · , e
cada um deles é identificado pelo número dentro de [ ]. A seguir encontra-se um exemplo
de como utilizar funções com muitos parâmetros.
TF1 *funcao = new TF1("parametros", "[0]*exp([1]*x - [2]) + [3]", -1,
1);
float parametro1 = 0.54;
funcao->SetParameter(0, 4.2);
funcao->SetParameter(1, parametro1);
funcao->SetParameter(2, parametro1 - 0.3);
funcao->SetParameter(3, 1);

3.5 Opções de desenho TF1

3.6 Funções de 2 variáveis

3.7 Opções de desenho

3.8 Funções de 3 variáveis

7
Figura 2: O estilo de linha de uma função pode ser alterado através do comando
funcao->SetLineStyle(3).

Figura 3: A cor de linha de uma função pode ser alterada através do comando
funcao->SetLineColor(5).

4 Gráficos

4.1 Criando um gráfico a partir de um arquivo de dados

A sequência de comandos a seguir cria e desenha um gráfico a partir de um arquivo


de dados em formato de texto (.txt, .dat, · · · ).
// cria o grafico
TGraph *grafico = new TGraph("dados.txt")

// muda o estilo dos pontos


grafico->SetMarkerStyle(7)

// desenha o grafico
grafico->Draw("ap")

8
Figura 4: A espessura da linha de uma função pode ser alterada através do comando
funcao->SetLineWidth(2).

A primeira linha declara e cria o gráfico, dando como entrada o arquivo dados.txt.
É importante que o ROOT seja aberto no mesmo diretório onde se encontra o arquivo
dados.txt, ou que seja dada a localização completa do arquivo, por exemplo "/home/user/dados.txt.
Neste arquivo, os dados devem se encontrar em duas colunas, a primeira com os valores x
e a segunda com os valores y.
A segunda linha muda o estilo dos pontos do gráfico para o estilo número 7, que é
mais visı́vel que o estilo “default” do ROOT.
Finalmente a terceira linha desenha o gráfico. A opção "ap na função Draw() sig-
nifica para desenhar os eixos (axes) e os pontos do gráfico (poins). Caso nenhuma opção
seja dada no comando ->Draw(), o gráfico não será desenhado.
O exemplo de um gráfico criado a partir de um conjunto de dados pode ser visto na
figura 5.

4.2 Ajustando uma curva sobre uma gráfico

A sequência de comandos a seguir ajusta uma função do tipo f (x) = ax + b sobre


um gráfico.
// cria o grafico
TGraphErrors *gr1 = new TGraphErrors("dados.txt", "%lg %lg %lg");

// cria a funcao a ser ajustada


TF1 *f1 = new TF1("nome", "titulo", "[0]*x + [1]", 0, 5);

// ajusta a funcao sobre o grafico


gr1->Fit(f1)
O comando ->Fit() é que faz todo o serviço: ele recebe a função f1 e ajusta seus

9
Figura 5: Exemplo de gráfico criado com o ROOT.

parâmetros ([0] e [1]) da melhor maneira1 ao gráfico gr1. O ajuste de uma reta sobre o
gráfico da Figura 5 pode ser visto na Figura 6.
A função a ser ajustada deve conter pelo menos um parâmetro variável [0] para
que o ajuste possa ser feito.

4.3 Opções de desenho TGraph

1
Ele escolhe os parâmetros de forma a minimizar o χ2 .

10
Figura 6: Ajuste de uma reta sobre um gráfico.

Figura 7: O estilo do marcador de um gráfico pode ser alterado através do comando


grafico->SetMarkerStyle(8).

5 Histogramas

5.1 O tipo TH1F

No ROOT, histogramas são criados em dois passos. Primeiro é preciso criar uma
variável do tipo TH1F (Type Histogram 1-Dimensional Float), onde é especificada a bi-
nagem do histograma: x-mı́nimo, x-máximo e número de bins. A sequência de comandos
a seguir executa essa tarefa.

11
Figura 8: Histograma criado no ROOT.

// define variaveis
float n bins = 10;
float x min = 0;
float x max = 10;

// cria histograma
TH1F *hist = new TH1F("nome", "titulo", n bins, x min, x max)
No exemplo acima, foi criado um histograma que vai de 0 a 10 em 10 passos. A
seguir é preciso preencher esse histograma com dados. Isso é feito através do comando
Fill(), como exemplificado a seguir.
// preenche histograma com dados
hist->Fill(1)
hist->Fill(8.3)
hist->Fill(0.2)
hist->Fill(2)
hist->Fill(5)
hist->Fill(2.4)

// desenha o histograma
hist->Draw()
O histograma resultante de todos esses comandos pode ser visto na figura 8.
A criação de histogramas “manualmente”, dando ->Fill() para cada dado, não
é a maneira mais prática de se fazer isso. Infelizmente, não existe um comando que
crie o histograma a partir de um conjunto de dados, como no caso dos gráficos TGraph
e TGraphErrors. Para automatizar a criação de histogramas é preciso utilizar macros,

12
assunto que será discutido a seguir.

13
6 Macros

Uma macro é um conjunto de comandos definidos pelo autor que são executados
automaticamente pelo ROOT. Por exemplo, o conjunto de comandos a seguir, compreendidos
entre { e }, definem uma macro.
{
TF1 *f = new TF1("parabola", "3*x^2", -2, 3);
f->SetLineWidth(2);
f->SetLineColor(kRed);
}
A pergunta é: como executar todos esses comandos de uma só vez no ROOT? Em
outras palavras, como rodar essa macro no ROOT? A resposta é excitantemente simples:
crie um arquivo .C (por exemplo macro exemplo.C) com os comandos da sua macro entre
{ e }, abra o ROOT no mesmo diretório onde o arquivo foi criado e digite o comando
.x macro exemplo.C
A sua macro será executada (o .x vem de execute)
// abre arquivo
ifstream arquivo("dados.txt");
// le dados do arquivo
for (i = 0; !arquivo.eof(); i++)
y.push back(float aux << arquivo);
y.push back(float aux << arquivo);

14
7 Tópicos especiais

7.1 Números aleatórios no ROOT

7.2 LATEX no ROOT

Para usar comandos LATEX no ROOT basta utilizar o caractere # antes do comando,
como no exemplo a seguir, cujo resultado se encontra na figura 9.
TF1 *funcao = new TF1("titulo", "1/x", 1, 10);
funcao->GetXaxis()->SetTitle("#theta (graus)");
funcao->GetYaxis()->SetTitle("d#sigma/d#Omega");
funcao->SetTitle("#mu + e #rightarrow #mu + e");
funcao->Draw();

Figura 9: LATEX no ROOT.

7.3 Dicas sobre histogramas

Normalizando um histograma a 1:
hist->Scale(1/hist->Integral())
Centralizando o label do bin
hist->GetXaxis()CenterLabels();hist->Draw();

15

Você também pode gostar