ROOT Version: 6.18/04
Platform: Ubuntu 20.04.2
Hello ROOT forum users,
Currently when I performing multiprocessing, I receieve a TH1F back from each of my processes, which are returned in a std::vector of TH1Fs. I then have to merge those histograms. My process, as you will see in the code snippet below, involves what feels like an unnecessarily complicated process to me, of cloning a histogram, dynamically allocating a list, taking my objects from the vector and putting them into a list, and then using the cloned histogram to merge the list. My impression after writing this code was “there has to be a better way of doing this”. My question to the ROOT community is: is there is a shorter or “proper” way of merging a std::vector of histograms that I have missed?
TH1F multiprocess_analysis()
{
//Retrieve a vector of TH1Fs
std::vector<TH1F> process_output = function_returning_TH1F_vector();
//1.) make a clone of the first TH1F in the vector and point to it
TH1F* h = (TH1F*)process_output[0].Clone();
//2.) create a list
TList *list = new TList;
//3.) loop through the TH1Fs in the vector and add them to the list
for (TObject & hist : process_output)
{
list->Add(&hist);
}
//4.) use the previously cloned TH1F to merge the list
h->Merge(list);
//5.) Take the TH1F pointer to the merged histogram and store
//the value it points to in stack memory
TH1F h2 = *h;
//6.) Delete the list so I don't leak memory
delete list;
//7.) Return the merged TH1F
return h2;
}
Thank you for your help,
Joseph DeCunha