2014-11-04 2 views
0

Эй, я использую ROOT на данный момент, и я создал макрос, который будет принимать две гистограммы и вычитать один из другого, и прокручивать каждый бит, чтобы проверить, есть ли ненулевые бункеры, это проверит, совпадают ли гистограммы.Использование гистограмм в качестве параметров для функций

В настоящее время я создаю две гистограммы внутри макроса только для проверки функции, а третья гистограмма - Hist 1 - Hist 2, но я хотел бы сделать так, чтобы я мог вводить любые две гистограммы в качестве параметров в макрос и выполнить тест.

Как я могу это сделать?

Макрос в настоящее время это, и напомнить вам две гистограммы внутри только там, чтобы проверить:

#include "TCanvas.h" 
#include "TROOT.h" 
#include "TPad.h" 
#include "TH1F.h" 
#include "math.h" 
#include "TRandom.h" 
#include "TH1.h" 

string subtracthist() { 
    TCanvas *c1 = new TCanvas(); 
    ////////First histogram          
    TH1F *h1 = new TH1F("h1","Histogram 1",100,-3,3); 
    h1->FillRandom("gaus",10000); 
    ////////Second histogram          
    TH1F *h2 = new TH1F("h2","Histogram 2",100,-3,3); 
    h2->FillRandom("gaus",10000); 
    ////////First Histogram minus Second Histogram       
    TH1F *h3 = new TH1F("h3","Subtracted Histograms",100,-3,3); 
    h3->Add(h1,h2,1,-1); 
    // h3->Draw();               
    //TH1F *h4 = new TH1F("h4","Test", 100,-3,3);       
    //h4->Draw();               
    //c1->Update();              

    ////////Caluclate Total number of bins in histogram including underflow and overflow bins              

Int_t numberofbins = h3->GetSize(); 
////////This loop will run through each bin and check its content, if there is a nonzero bin the loop will break and output "The Histograms are not the same" If all bins are zero, it will output "The Histograms are the same".               
    for(int i=0; i<=(numberofbins - 1); i++) { 
    Int_t x = h3->GetBinContent(i); 
     if (x != 0) 
     {return "The Histograms are not the same"; 
      break;} 

} 
    return "The Histograms are the same"; 
} 
+0

Как вы хотите использовать макрос точно? Вы можете добавить аргументы в функцию 'subtracthist', как показано DoubleYou, а затем использовать ее в' cint' или 'cling' с помощью: .L subtracthist.C', а затем' string res = subtracthist (h1, h2) '. – pseyfert

ответ

1

Во-первых, вы пишете функцию вместо макроса (see here).

Тогда, хотя я ничего не знаю о ROOT, предоставление параметров функции довольно просто. Для примера:

string subtracthist(TH1F *h1, TH1F *h2) { 
    TH1F *h3 = new TH1F("h3","Subtracted Histograms",100,-3,3); 
    h3->Add(h1,h2,1,-1); 

    // Caluclate Total number of bins in histogram including underflow and overflow bins              
    Int_t numberofbins = h3->GetSize(); 
    // This loop will run through each bin and check its content, if there is a nonzero bin the loop will break and output "The Histograms are not the same" If all bins are zero, it will output "The Histograms are the same".               
    for(int i=0; i<=(numberofbins - 1); i++) { 
     Int_t x = h3->GetBinContent(i); 
     if (x != 0) { 
      delete h3; 
      return "The Histograms are not the same"; 
     } 
    } 
    delete h3; //because you've created a h3, you need to also delete it otherwise you have memory leaks. 
    return "The Histograms are the same"; 
} 

int main() { 
    //this is just to show how it might work 
    TH1F *h1 = new TH1F("h1","Histogram 1",100,-3,3); //first hist 
    h1->FillRandom("gaus",10000); 
    TH1F *h2 = new TH1F("h2","Histogram 2",100,-3,3); //second hist 
    h2->FillRandom("gaus",10000); 
    string res=substracthist(h1,h2); 
    delete h1; 
    delete h2; 
} 

Глядя, что у вас есть холст, а также, вы можете добавить параметр, чтобы обеспечить полотно таким же образом, к функции. Чтобы узнать больше о функциях и как работают параметры, просто выполните поиск в Интернете (возможно, this может стать хорошим началом).

И помните, что когда вы создаете указатели с new, не забудьте использовать delete, когда они вам больше не понадобятся (во избежание утечек памяти).

+0

Что представляет собой вторая часть (int main()) функции? Я не хочу создавать гистограммы внутри любой из этих функций, будут созданы гистограммы в другом месте, которые я хочу передать в первую часть функции. Похоже, что основная() часть создает гистограммы и передает их в часть subtracthist()? – CStarAlgebra

+0

Слово «макрос» используется в рамках корневого фреймворка по-разному, чем в объяснении функции против макроса, опубликованном вами. В корневых макросах также не должно быть функции 'main()', я рекомендую не добавлять функцию 'main' к корневым файлам макросов. – pseyfert

Смежные вопросы