Filling a THnD or THnSparse using `Draw` or `RDataFrame`

I am having a look to the documentation of classes THnD and THnSparse. I see in the documentation that this objects are filled as a traditional TH1D histogram, using Fill. So I could just iterate and fill. But there is a more straight forward way to do this?

I see for example inside RDataFrame there is a method .HistoND that I imagine it returns a THnD.

However, how could I initialise a THnSparse object that seems to be more suited for data with many zeros?

If I try:

auto hN = dataFrame.HistoND( ... );

It works, but how do I cast the auto to the object I want?

Ok, (edit) I found that I could create a THnd:

root [17] THnD *hNd = new THnD(*dd)
(THnD *) 0x5556cbb7e770
root [18] hNd->GetEntries()
(double) 10000.000

But not a THnSparse with the same technique:

root [19] THnSparse *hSparse = new THnSparse(*dd)
ROOT_prompt_19:1:26: error: allocating an object of abstract class type 'THnSparse'
THnSparse *hSparse = new THnSparse(*dd)
                         ^
/programas/root/6.26.06/include/THnSparse.h:61:20: note: unimplemented pure virtual method 'GenerateArray' in 'THnSparse'
   virtual TArray* GenerateArray() const = 0;
                   ^
root [20] 
1 Like

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.

Hello,

I am sorry this post slipped through the cracks, likely because it was posted right when CERN Christmas holidays started :confused:

The solution is indeed what is mentioned at https://root-forum.cern.ch/t/unstable-results-when-enabling-mt-and-filling-a-thnd-histogram-using-take/55855/3: as per the error message THnSparse is an abstract base class and one of the concrete derived classes such as THnSparseD should be used instead. It’s mentioned at the top of the THnSparse docs: ROOT: THnSparse Class Reference .

Cheers,
Enrico