WedX - журнал о программировании и компьютерных науках

Использование гистограмм в качестве параметров функций

Эй, я использую 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";
}

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

Ответы:


1

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

Затем, хотя я ничего не знаю о 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, когда они вам больше не нужны (во избежание утечек памяти).

04.11.2014
  • Что делает вторая часть (int main()) функции? Я не хочу создавать гистограммы внутри какой-либо из этих функций, там будут гистограммы, уже созданные в другом месте, которые я хочу передать в первую часть функции. Похоже, что часть main() создает гистограммы и передает их части subtracthist()? 04.11.2014
  • Слово «макрос» используется в жаргоне корневой среды иначе, чем в опубликованном вами объяснении функций и макросов. В корневых макросах также нормально не иметь функции main(), я рекомендую не добавлять функцию main в файлы корневых макросов. 09.04.2016
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]