Эй, сейчас я использую ROOT, и я создал макрос, который будет брать две гистограммы и вычитать одну из другой, и проходить через каждый бин, чтобы проверить, есть ли какие-нибудь ненулевые бины, это проверит, действительно ли гистограммы равны.
В настоящее время я создаю две гистограммы внутри макроса только для проверки функции, а третья гистограмма — это Хист 1 — Хист 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";
}
Во-первых, вы пишете функцию вместо макроса (посмотреть здесь).
Тогда, хотя я ничего не знаю о 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;
}
Учитывая, что у вас также есть холст, вы можете добавить параметр, чтобы обеспечить холст таким же образом для функции. Чтобы узнать больше о функциях и о том, как работают параметры, просто поищите в Интернете (возможно, этот может быть хорошим началом).
И помните, когда вы создаете указатели с new
не забудьте использовать delete
когда они вам больше не нужны (чтобы избежать утечек памяти).