From c33777d5a1d0fc82bb2447a3718bba5a3c0a2e46 Mon Sep 17 00:00:00 2001
From: Alaettin Serhan Mete <alaettin.serhan.mete@cern.ch>
Date: Tue, 30 Mar 2021 06:05:27 +0000
Subject: [PATCH] MdtRawDataMonitoring: Memory-leak fix and clean-up

---
 .../MdtRawDataMonitoring/MdtRawDataMonAlg.h   |  8 +-
 .../MdtRawDataMonitoring/MdtRawDataValAlg.h   |  5 +-
 .../src/MDTRawDataUtils.cxx                   |  4 +-
 .../src/MDTRawDataUtilsRun3.cxx               |  4 +-
 .../src/MdtRawDataMonAlg.cxx                  | 93 +++++++++++--------
 5 files changed, 64 insertions(+), 50 deletions(-)

diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataMonAlg.h b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataMonAlg.h
index feeca790eeda..cba4d684877b 100755
--- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataMonAlg.h
+++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataMonAlg.h
@@ -110,10 +110,6 @@ class MdtRawDataMonAlg: public AthMonitorAlgorithm {
 
  private: 
 
-  TH2* m_mdthitspermultilayerLumi[4][4];
-  TH2* m_mdthitsperchamber_InnerMiddleOuterLumi[2];
-  TH2* m_mdthitsperML_byLayer[3];//These are alternative Global hit coverage plots
-
   MDTNoisyTubes* m_masked_tubes;
 
   ServiceHandle<Muon::IMuonIdHelperSvc> m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"};
@@ -136,8 +132,8 @@ class MdtRawDataMonAlg: public AthMonitorAlgorithm {
 
   //MDTRawDataUtils_cxx
   bool AinB( int A, std::vector<int> & B ) const;
-  virtual StatusCode  binMdtGlobal( TH2* &, char ecap );
-  virtual StatusCode  binMdtRegional( TH2* &, std::string &xAxis);
+  virtual StatusCode  binMdtGlobal( TH2*, char ecap );
+  virtual StatusCode  binMdtRegional( TH2*, std::string &xAxis );
   virtual StatusCode  binMdtGlobal_byLayer( TH2*, TH2*, TH2*);
   virtual StatusCode binMdtOccVsLB(TH2* &h, int region, int layer);
   virtual StatusCode binMdtOccVsLB_Crate(TH2* &h, int region, int crate);
diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataValAlg.h b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataValAlg.h
index 6df5cbf4b05f..e7fa452cfbf5 100755
--- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataValAlg.h
+++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataMonitoring/MdtRawDataValAlg.h
@@ -39,6 +39,7 @@
 #include <fstream> 
 #include <cstdlib>
 #include <iostream>
+#include <memory>
 
 class MuonDQAHistList;
 
@@ -131,8 +132,8 @@ class MdtRawDataValAlg: public ManagedMonitorToolBase {
   StatusCode handleEvent_effCalc(const Trk::SegmentCollection* segms);//, const Muon::MdtPrepDataContainer* mdt_container );
 
   bool AinB( int A, std::vector<int> & B );
-  virtual StatusCode  binMdtGlobal( TH2* &, char ecap );
-  virtual StatusCode  binMdtRegional( TH2* &, std::string &xAxis);
+  virtual StatusCode  binMdtGlobal( TH2*, char ecap );
+  virtual StatusCode  binMdtRegional( TH2*, std::string &xAxis );
   virtual StatusCode  binMdtGlobal_byLayer( TH2*, TH2*, TH2*);
   virtual StatusCode binMdtOccVsLB(TH2* &h, int region, int layer);
   virtual StatusCode binMdtOccVsLB_Crate(TH2* &h, int region, int crate);
diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/src/MDTRawDataUtils.cxx b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/src/MDTRawDataUtils.cxx
index 370f37cec4b5..3faa6e3c0e0f 100644
--- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/src/MDTRawDataUtils.cxx
+++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/src/MDTRawDataUtils.cxx
@@ -24,7 +24,7 @@
 
 using std::string;
 
-StatusCode MdtRawDataValAlg::binMdtGlobal( TH2* &h, char ecap ) {
+StatusCode MdtRawDataValAlg::binMdtGlobal( TH2* h, char ecap ) {
 
   //Set x-axis labels
   int LowerEta=0;
@@ -220,7 +220,7 @@ StatusCode MdtRawDataValAlg::binMdtGlobal( TH2* &h, char ecap ) {
   return StatusCode::SUCCESS;
 } 
 
-StatusCode  MdtRawDataValAlg::binMdtRegional( TH2* &h, string &xAxis){
+StatusCode  MdtRawDataValAlg::binMdtRegional( TH2* h, string &xAxis ) {
   
   ///SET Ghost Entries
   int LowerEta=-0;
diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/src/MDTRawDataUtilsRun3.cxx b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/src/MDTRawDataUtilsRun3.cxx
index 27b797159e88..85e4288e3a42 100644
--- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/src/MDTRawDataUtilsRun3.cxx
+++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/src/MDTRawDataUtilsRun3.cxx
@@ -23,7 +23,7 @@
 
 using std::string;
 
-StatusCode MdtRawDataMonAlg::binMdtGlobal( TH2* &h, char ecap ) {
+StatusCode MdtRawDataMonAlg::binMdtGlobal( TH2* h, char ecap ) {
 
   //Set x-axis labels
   int LowerEta=0;
@@ -74,7 +74,7 @@ StatusCode MdtRawDataMonAlg::binMdtGlobal( TH2* &h, char ecap ) {
   return StatusCode::SUCCESS;
 } 
 
-StatusCode  MdtRawDataMonAlg::binMdtRegional( TH2* &h, string &xAxis){
+StatusCode  MdtRawDataMonAlg::binMdtRegional( TH2* h, string &xAxis ) {
   
   ///SET Ghost Entries
   int LowerEta=-0;
diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/src/MdtRawDataMonAlg.cxx b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/src/MdtRawDataMonAlg.cxx
index 75b6660e772c..d789ecc93297 100755
--- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/src/MdtRawDataMonAlg.cxx
+++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MdtRawDataMonitoring/src/MdtRawDataMonAlg.cxx
@@ -57,8 +57,6 @@ namespace {
   static constexpr unsigned int const maxNTubesPerLayer = 120;
 }
 
-enum {enumInner, enumMiddle, enumOuter, enumExtra};
-
 struct MDTOverviewHistogramStruct {
   std::vector<float> mdt_tube_x_barrel;
   std::vector<float> mdt_tube_y_barrel;
@@ -240,41 +238,60 @@ StatusCode MdtRawDataMonAlg::initialize()
     }
   }
 
-  std::string MDTHits_BE[2] = {"Barrel", "EndCap"};
-  std::string ecap[4]={"BA","BC","EA","EC"};
-  std::string layer[4]={"Inner","Middle","Outer","Extra"};
-
-  for (int iecap=0;iecap<4;iecap++) {//BA,BC,EA,EC 
-    for (int ilayer=0;ilayer<4;ilayer++) { //inner, middle, outer, extra
-      	std::string s = "NumberOfHitsIn"+ecap[iecap]+layer[ilayer]+"PerMultiLayer_ADCCut";
-	m_mdthitspermultilayerLumi[iecap][ilayer] = new TH2F(s.c_str(), s.c_str(), 1, 0, 1, 1, 0, 1);
-	m_mdthitspermultilayerLumi[iecap][ilayer]->SetDirectory(0);
-	std::string xAxis = ecap[iecap].substr(0,1) + layer[ilayer].substr(0,1) + ecap[iecap].substr(1,1);
-	ATH_CHECK(binMdtRegional(m_mdthitspermultilayerLumi[iecap][ilayer], xAxis));
-
-      if( ilayer==0 && ((iecap==0||iecap==2)) ) {
-        s = "NumberOfHits"+MDTHits_BE[iecap/2];
-	m_mdthitsperchamber_InnerMiddleOuterLumi[iecap/2] = new TH2F(s.c_str(), s.c_str(), 1, 0, 1, 1, 0, 1);
-	m_mdthitsperchamber_InnerMiddleOuterLumi[iecap/2]->SetDirectory(0);
-	ATH_CHECK(binMdtGlobal(m_mdthitsperchamber_InnerMiddleOuterLumi[iecap/2], MDTHits_BE[iecap/2].at(0)));
-      }
-    }
-  }
-
-  std::string s = "NumberOfHitsInMDTInner_ADCCut";
-  m_mdthitsperML_byLayer[enumInner] = new TH2F(s.c_str(), s.c_str(), 1, 0, 1, 1, 0, 1);
-  m_mdthitsperML_byLayer[enumInner]->SetDirectory(0);
-  s = "NumberOfHitsInMDTMIddle_ADCCut";
-  m_mdthitsperML_byLayer[enumMiddle] = new TH2F(s.c_str(), s.c_str(), 1, 0, 1, 1, 0, 1);
-  m_mdthitsperML_byLayer[enumMiddle]->SetDirectory(0);
-  s = "NumberOfHitsInMDTOuter_ADCCut";
-  m_mdthitsperML_byLayer[enumOuter] = new TH2F(s.c_str(), s.c_str(), 1, 0, 1, 1, 0, 1);
-  m_mdthitsperML_byLayer[enumOuter]->SetDirectory(0);
-  ATH_CHECK(binMdtGlobal_byLayer(m_mdthitsperML_byLayer[enumInner], m_mdthitsperML_byLayer[enumMiddle], m_mdthitsperML_byLayer[enumOuter]));
+  /* It seems as if a bunch of histograms are created below on the heap
+   * Then these are filled in the binMdtFooBar methods
+   * Later these are passed onto relevant methods of MDTChamber where internals are filled
+   * The original histograms are transient and not needed past initialize here
+   * The logic is a little too convoluted but left as is
+   */
+  unsigned int counter { 0 };
+  std::string s { "" }, xAxis { "" };
+
+  // Create Inner/Middle/Outer/Extra histograms per BA/BC/EA/EC
+  std::vector< std::string > ecap { "BA", "BC", "EA", "EC" };
+  std::vector< std::string > layer { "Inner", "Middle", "Outer", "Extra" };
+  std::vector< std::unique_ptr<TH2F> > mdtHitsPerMultiLayerLumi;
+  mdtHitsPerMultiLayerLumi.reserve( ecap.size() * layer.size() );
+
+  for ( const auto& iecap : ecap ) {
+    for ( const auto& ilayer : layer ) {
+      s = "NumberOfHitsIn" + iecap + ilayer + "PerMultiLayer_ADCCut";
+      mdtHitsPerMultiLayerLumi.push_back( std::make_unique<TH2F>( s.c_str(), s.c_str(), 1, 0, 1, 1, 0, 1 ) );
+      xAxis = iecap.substr(0,1) + ilayer.substr(0,1) + iecap.substr(1,1);
+      ATH_CHECK( binMdtRegional( mdtHitsPerMultiLayerLumi[ counter ].get(), xAxis ) );
+      counter++;
+    } // end of iecap
+  } // end of ilayer
+  counter = 0;
+
+  // Create Barrel/EndCap histrograms here
+  std::vector< std::string > mdtHitsBE { "Barrel", "EndCap" };
+  std::vector< std::unique_ptr<TH2F> > mdtHitsPerChamberIMOLumi;
+  mdtHitsPerChamberIMOLumi.reserve( mdtHitsBE.size() );
+
+  for ( const auto& imdt : mdtHitsBE ) {
+    s = "NumberOfHits" + imdt;
+    mdtHitsPerChamberIMOLumi.push_back( std::make_unique<TH2F>( s.c_str(), s.c_str(), 1, 0, 1, 1, 0, 1 ) );
+    ATH_CHECK( binMdtGlobal( mdtHitsPerChamberIMOLumi[ counter ].get(), imdt.at(0) ) );
+    counter++;
+  } // end of imdt
+  counter = 0;
+
+  // Create Inner/Middle/Outer histograms here
+  std::vector< std::unique_ptr<TH2F> > mdtHitsPerMLByLayer;
+  mdtHitsPerMLByLayer.reserve( layer.size() - 1 );
+
+  for ( const auto& ilayer : layer ) {
+    if ( ilayer == "Extra" ) continue;
+    s = "NumberOfHitsInMDT" + ilayer + "_ADCCut";
+    mdtHitsPerMLByLayer.push_back( std::make_unique<TH2F> ( s.c_str(), s.c_str(), 1, 0, 1, 1, 0, 1 ) );
+  } // end of ilayer
+  ATH_CHECK( binMdtGlobal_byLayer( mdtHitsPerMLByLayer[ 0 ].get(),
+                                   mdtHitsPerMLByLayer[ 1 ].get(),
+                                   mdtHitsPerMLByLayer[ 2 ].get() ) );
 
   //DEV this before was in bookHistogramsRecurrent-- problably still needed since we need to fill m_hist_hash_list??  
   clear_hist_map();
-  int counter = 0;
 
   for(std::vector<Identifier>::const_iterator itr = m_chambersId.begin(); itr != m_chambersId.end(); ++itr, ++counter){
     std::string hardware_name = convertChamberName(m_idHelperSvc->mdtIdHelper().stationName(*itr),m_idHelperSvc->mdtIdHelper().stationEta(*itr),
@@ -284,10 +301,10 @@ StatusCode MdtRawDataMonAlg::initialize()
     
     MDTChamber* chamber = new MDTChamber(hardware_name);
     (*m_hist_hash_list)[m_chambersIdHash.at(counter)] = chamber;
-   
-    chamber->SetMDTHitsPerChamber_IMO_Bin(dynamic_cast<TH2F*> (m_mdthitsperchamber_InnerMiddleOuterLumi[chamber->GetBarrelEndcapEnum()]));
-    chamber->SetMDTHitsPerML_byLayer_Bins(dynamic_cast<TH2F*> (m_mdthitspermultilayerLumi[chamber->GetRegionEnum()][chamber->GetLayerEnum()])
-					  ,dynamic_cast<TH2F*> (m_mdthitsperML_byLayer[ (chamber->GetLayerEnum() < 3 ? chamber->GetLayerEnum() : 0) ]));
+
+    chamber->SetMDTHitsPerChamber_IMO_Bin( mdtHitsPerChamberIMOLumi[ chamber->GetBarrelEndcapEnum() ].get() );
+    chamber->SetMDTHitsPerML_byLayer_Bins( mdtHitsPerMultiLayerLumi[ chamber->GetRegionEnum() * ecap.size() + chamber->GetLayerEnum() ].get(),
+                                           mdtHitsPerMLByLayer[ (chamber->GetLayerEnum() < 3 ? chamber->GetLayerEnum() : 0) ].get() );
 
     m_tubesperchamber_map[hardware_name] = GetTubeMax(*itr, hardware_name); // total number of tubes in chamber
 
-- 
GitLab