Função como Parâmetro [RESOLVIDO]

1. Função como Parâmetro [RESOLVIDO]

Ailton Silva
kidsaqua

(usa Slackware)

Enviado em 04/07/2017 - 15:59h

Boa tarde pessoal,
Estou escrevendo uma macro em c++ para me ajudar em um experimento com raios gama. O código está logo abaixo, o problema é que eu preciso que a função Run() chame em tempo de execução a função doHist(). Como posso fazer isso?


void Run(TString namefile = "default.root"){

TFile *f = new TFile(namefile, "UPDATE");

/// n histograms

doHist("Medidas_Ar/05CMAR.txt","hist_05cmar");
// ou
TH1 *hist1;
hist1 = doHist("Medidas_Ar/05CMAR.txt");


f->close();

}



void doHist(TString namedata, TH1 *h)
{

int max_canal = 0, max_contagem = 0;
int canal_inicial = 0, contagem_inicial = 0, total_contagem = 0, canal_final = 0, contagem_final = 0;

get_MaxCount(namedata, max_canal, max_contagem);
cout << "========================" << endl;
cout << " MAXIMA CONTAGEM " << endl;
cout << "Canal:" << " " << "Contagem:" << endl;
cout << " " << max_canal << " " << max_contagem << endl;
cout << "========================" << endl;

get_FirstChannel(namedata, max_canal, canal_inicial, contagem_inicial, canal_final, contagem_final);
cout << "========================" << endl;
cout << " CANAL INICIAL " << endl;
cout << "Canal:" << " " << "Contagem:" << endl;
cout << " " << canal_inicial << " " << contagem_inicial << endl;
cout << "========================" << endl;

cout << "========================" << endl;
cout << " CANAL FINAL " << endl;
cout << "Canal:" << " " << "Contagem:" << endl;
cout << " " << canal_final - 2 << " " << contagem_final << endl;
cout << "========================" << endl;

//make_Hist(namedata, canal_inicial, canal_final);


int nbin = max_canal-min_canal+1;

TH1 *h;
h = new TH1F ("h", "h", nbin , min_canal, max_canal+1);

int i = 0;
if (in.is_open())
{
while(getline(in, line))
{
in >> canal >> contagem;

if ((canal > (min_canal-1)) && (canal < (max_canal+1)))
{
i++;
h->SetBinContent(i,contagem);
}
}
}

}




void get_MaxCount(TString namedata, int &max_canal, int &max_contagem)
{
ifstream in;
in.open(namedata);
string line;
int canal, contagem;

if(in.is_open())
{
while(getline(in, line))
{
in >> canal >> contagem;
if(contagem > max_contagem)
{
max_contagem = contagem;
max_canal = canal;
}
}

}
}

void get_FirstChannel(TString namedata, int &max_canal, int &canal_inicial, int &contagem_inicial, int &canal_final, int &contagem_final)
{
ifstream in;
in.open(namedata);
string line;
int vteste[3] = {0,0,0};
int canal = 0, contagem;

if (in.is_open())
{
while(getline(in, line))
{
in >> canal >> contagem;
vteste[0] = vteste[1];
vteste[1] = vteste[2];
vteste[2] = contagem;

if((vteste[0] == 0) && (vteste[1] == 0) && (vteste[2] != 0))
{
canal_inicial = canal;
contagem_inicial = contagem;
break;
}
}
}

if (in.is_open())
{

while(getline(in, line))
{
in >> canal >> contagem;
int i = canal;
if (i >= max_canal)
{
vteste[0] = vteste[1];
vteste[1] = vteste[2];
vteste[2] = contagem;

if((vteste[0] == 0) && (vteste[1] == 0) && (vteste[2] == 0))
{
canal_final = canal;
contagem_final = contagem;
break;
}
}
}
}
}

void make_Hist(TString namedata, int &min_canal, int &max_canal)
{

TFile *f = new TFile(namefile, "UPDATE");

ifstream in;
in.open(namedata);
string line;

int canal;
float contagem;

int nbin = max_canal-min_canal+1;

TH1 *h3;
h3 = new TH1F ("h3", "h3", nbin , min_canal, max_canal+1);

int i = 0;
if (in.is_open())
{
while(getline(in, line))
{
in >> canal >> contagem;

if ((canal > (min_canal-1)) && (canal < (max_canal+1)))
{
i++;
h3->SetBinContent(i,contagem);
}
}
}

h3 -> Write();
f -> Close();

}



  


2. Re: Função como Parâmetro

Paulo
paulo1205

(usa Ubuntu)

Enviado em 04/07/2017 - 18:01h

O que é o tipo TH1?

Pela declaração da função doHist(), o segundo argumento é um ponteiro para um objeto da classe TH1 (ou classe dela derivada, especialmente se a classe for polimórfica).

Então, o que você tem de fazer em Run() é criar um objeto de classe compatível, e passar um ponteiro para esse objeto como argumento de doHist.

Mas isso é o que eu vi numa olhada básica. Não verifiquei o interior das funções, nem fiz análise nenhuma com vistas a refatoração de código.


3. Re: Função como Parâmetro [RESOLVIDO]

Ailton Silva
kidsaqua

(usa Slackware)

Enviado em 05/07/2017 - 12:43h

Blz... A TH1 é uma classe especial do root-cern, uma biblioteca direcionadas à físicos para analise de partículas. Usamos c++ para escrever nossos códigos que são escrito dentro do próprio root-cern. Mas sua idéia resolveu meu problema... Na função Run(), passei ponteiro como parâmetro... Ficou assim Run(TString namefile = "default.root", TH1 *&h)

Obrigado pela ajuda.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts