From d265d5e11e23ee62bd07cb3368236d6c27483a26 Mon Sep 17 00:00:00 2001
From: Cornelius Feier-Riesen <cornelius.riesen@physik.uni-giessen.de>
Date: Fri, 1 Sep 2023 14:24:44 +0200
Subject: [PATCH] Add methods for THnSparse histograms in CbmHistManager

---
 core/base/CbmHistManager.cxx |  2 +-
 core/base/CbmHistManager.h   | 34 ++++++++++++++++++++++++++++++++++
 2 files changed, 35 insertions(+), 1 deletion(-)
 mode change 100644 => 100755 core/base/CbmHistManager.cxx
 mode change 100644 => 100755 core/base/CbmHistManager.h

diff --git a/core/base/CbmHistManager.cxx b/core/base/CbmHistManager.cxx
old mode 100644
new mode 100755
index 19dc3be1cc..86d702c24f
--- a/core/base/CbmHistManager.cxx
+++ b/core/base/CbmHistManager.cxx
@@ -144,7 +144,7 @@ void CbmHistManager::ReadFromFile(TFile* file)
 void CbmHistManager::AddTNamedObject(TObject* obj)
 {
   if (obj->IsA()->InheritsFrom(TH1::Class()) || obj->IsA()->InheritsFrom(TGraph::Class())
-      || obj->IsA()->InheritsFrom(TGraph2D::Class())) {
+      || obj->IsA()->InheritsFrom(TGraph2D::Class()) || obj->IsA()->InheritsFrom(THnBase::Class())) {
     TNamed* h = (TNamed*) obj;
     //TNamed* h1 = (TNamed*)file->Get(h->GetName());
     Add(string(h->GetName()), h);
diff --git a/core/base/CbmHistManager.h b/core/base/CbmHistManager.h
old mode 100644
new mode 100755
index 65e39fd098..037b2208c7
--- a/core/base/CbmHistManager.h
+++ b/core/base/CbmHistManager.h
@@ -22,6 +22,7 @@
 #include <TH1.h>         // for TH1
 #include <TH2.h>         // for TH2
 #include <TH3.h>         // for TH3
+#include <THnSparse.h>   // for THnSparse
 #include <TNamed.h>      // for TNamed
 #include <TObject.h>     // for TObject
 #include <TProfile.h>    // for TProfile
@@ -166,6 +167,25 @@ public:
     Add(name, h);
   }
 
+  /**
+    * \brief Helper function for creation of THnSparse objects.
+    * Template argument is a real object type that has to be created, for example,
+    * CreateSparse<THnSparseD>("name", "title", nDim, nBins, minVals, maxVals);
+    * \param[in] name Object name.
+    * \param[in] title Object title.
+    * \param[in] nDim Number of dimensions.
+    * \param[in] nBins Array with number of bins for each dimension.
+    * \param[in] minVals Array with minimum values for each dimension.
+    * \param[in] maxVals Array with maximum values for each dimension.
+    */
+  template<class T>
+  void CreateSparse(const std::string& name, const std::string& title, Int_t nDim, const Int_t* nBins,
+                     const Double_t* minVals, const Double_t* maxVals)
+  {
+    T* h = new T(name.c_str(), title.c_str(), nDim, nBins, minVals, maxVals);
+    Add(name, h);
+  }
+
   TNamed* GetObject(const std::string& name) const
   {
     if (fMap.count(name) == 0) {  // Temporarily used for debugging
@@ -267,6 +287,20 @@ public:
     */
   TH3* H3Clone(const std::string& name) const { return static_cast<TH3*>(H3(name)->Clone()); }
 
+  /**
+    * \brief Return pointer to THnSparse histogram.
+    * \param[in] name Name of THnSparse histogram.
+    * \return pointer to THnSparse histogram.
+    */
+  THnSparse* HnSparse(const std::string& name) const
+  {
+    if (fMap.count(name) == 0) {  // Temporarily used for debugging
+      LOG(error) << "CbmHistManager::HnSparse(name): name=" << name;
+    }
+    assert(fMap.count(name) != 0);
+    return dynamic_cast<THnSparse*>(fMap.find(name)->second);
+  }
+
   /**
     * \brief Return pointer to TGraph.
     * \param[in] name Name of TGraph.
-- 
GitLab