嘿,我现在正在使用 ROOT,我创建了一个宏,它将获取两个直方图并从另一个中减去一个,然后遍历每个 bin 以检查是否有任何非零 bin,这将测试是否直方图是相等的。
目前我正在宏中创建两个直方图只是为了测试函数,第三个直方图是 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";
}
最佳答案
首先,您编写的是函数而不是宏 (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;
}
如果您也有一个 Canvas ,您可以添加一个参数以同样的方式为函数提供 Canvas 。要了解有关函数和参数如何工作的更多信息,只需搜索互联网(也许 this 是一个好的开始)。
请记住,当您使用 new
创建指针时,不要忘记在不再需要它们时使用 delete
(以避免内存泄漏)。
关于c++ - 使用直方图作为函数的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26726261/