From 388f02fbe4ebfef5496113115972f1fd44ec1d2b Mon Sep 17 00:00:00 2001
From: Florian Uhlig <f.uhlig@gsi.de>
Date: Wed, 24 Jan 2024 17:48:08 +0100
Subject: [PATCH] Fix memory leaks in digitizers

Send matches to CbmDaq only if matches should be created.
---
 sim/detectors/fsd/CbmFsdDigitize.cxx        | 34 ++++++++++++++------
 sim/detectors/much/CbmMuchDigitizeGem.cxx   |  9 ++++--
 sim/detectors/psd/CbmPsdSimpleDigitizer.cxx |  7 ++++-
 sim/detectors/tof/CbmTofDigitize.cxx        | 35 +++++++++++++++------
 sim/detectors/trd/CbmTrdDigitizer.cxx       | 14 +++++++--
 sim/detectors/trd/CbmTrdModuleSimR.cxx      |  1 +
 6 files changed, 75 insertions(+), 25 deletions(-)

diff --git a/sim/detectors/fsd/CbmFsdDigitize.cxx b/sim/detectors/fsd/CbmFsdDigitize.cxx
index b889b53a55..13cf305f42 100644
--- a/sim/detectors/fsd/CbmFsdDigitize.cxx
+++ b/sim/detectors/fsd/CbmFsdDigitize.cxx
@@ -182,10 +182,15 @@ void CbmFsdDigitize::Exec(Option_t*)
         // not within time cut -> send the digi from buffer and replace by the new one
         CbmFsdDigi* oldDigi =
           new CbmFsdDigi(it->second.first->GetAddress(), it->second.first->GetTime(), it->second.first->GetEdep());
-        CbmMatch* oldDigiMatch = new CbmMatch(*it->second.second);
-        if (fCreateMatches) SendData(oldDigi->GetTime(), oldDigi, oldDigiMatch);
-        else
+        if (fCreateMatches) {
+          CbmMatch* oldDigiMatch = new CbmMatch(*it->second.second);
+          SendData(oldDigi->GetTime(), oldDigi, oldDigiMatch);
+          delete it->second.second;
+        }
+        else {
           SendData(oldDigi->GetTime(), oldDigi);
+        }
+        delete it->second.first;
         fDigiBuffer.erase(it);
 
         CbmFsdDigi* digi = new CbmFsdDigi(address, time, eloss);
@@ -248,10 +253,16 @@ void CbmFsdDigitize::ReleaseBuffer(Bool_t sendEverything)
     for (const auto& dp : fDigiBuffer) {
       CbmFsdDigi* digi =
         new CbmFsdDigi(dp.second.first->GetAddress(), dp.second.first->GetTime(), dp.second.first->GetEdep());
-      CbmMatch* digiMatch = new CbmMatch(*dp.second.second);
-      if (fCreateMatches) SendData(digi->GetTime(), digi, digiMatch);
-      else
+      if (fCreateMatches) {
+        CbmMatch* digiMatch = new CbmMatch(*dp.second.second);
+        SendData(digi->GetTime(), digi, digiMatch);
+        delete dp.second.first;
+        delete dp.second.second;
+      }
+      else {
         SendData(digi->GetTime(), digi);
+        delete dp.second.first;
+      }
     }  // # digi buffer
     fDigiBuffer.clear();
   }
@@ -266,11 +277,14 @@ void CbmFsdDigitize::ReleaseBuffer(Bool_t sendEverything)
         // send this digi
         CbmFsdDigi* digi =
           new CbmFsdDigi(dp.second.first->GetAddress(), dp.second.first->GetTime(), dp.second.first->GetEdep());
-        CbmMatch* digiMatch = new CbmMatch(*dp.second.second);
-        if (fCreateMatches) SendData(digi->GetTime(), digi, digiMatch);
-        else
+        if (fCreateMatches) {
+          CbmMatch* digiMatch = new CbmMatch(*dp.second.second);
+          SendData(digi->GetTime(), digi, digiMatch);
+          delete dp.second.second;
+        }
+        else {
           SendData(digi->GetTime(), digi);
-
+        }
         // save which keys were sent and should be removed
         keysSent.push_back(dp.first);
       }  // ? time
diff --git a/sim/detectors/much/CbmMuchDigitizeGem.cxx b/sim/detectors/much/CbmMuchDigitizeGem.cxx
index 05b89110b8..bf63798dc2 100644
--- a/sim/detectors/much/CbmMuchDigitizeGem.cxx
+++ b/sim/detectors/much/CbmMuchDigitizeGem.cxx
@@ -702,7 +702,6 @@ void CbmMuchDigitizeGem::ReadAndRegister(Long_t eventTime)
 
   for (std::vector<CbmMuchSignal*>::iterator LoopOver = SignalList.begin(); LoopOver != SignalList.end(); LoopOver++) {
     CbmMuchDigi* digi   = ConvertSignalToDigi(*LoopOver);
-    CbmMatch* digiMatch = new CbmMatch(*(*LoopOver)->GetMatch());  // must be copied from signal
     // assert(digi);
     if (!digi) {
       LOG(debug2) << GetName() << ": Digi not created as signal is below threshold.";
@@ -711,7 +710,13 @@ void CbmMuchDigitizeGem::ReadAndRegister(Long_t eventTime)
       LOG(debug2) << GetName() << ": New digi: sector = " << CbmMuchAddress::GetSectorIndex(digi->GetAddress())
                   << " channel= " << CbmMuchAddress::GetChannelIndex(digi->GetAddress());
 
-      SendData(digi->GetTime(), digi, digiMatch);
+      if (fCreateMatches) {
+        CbmMatch* digiMatch = new CbmMatch(*(*LoopOver)->GetMatch());  // must be copied from signal
+        SendData(digi->GetTime(), digi, digiMatch);
+      }
+      else {
+        SendData(digi->GetTime(), digi);
+      }
       fNofDigis++;
     }
   }
diff --git a/sim/detectors/psd/CbmPsdSimpleDigitizer.cxx b/sim/detectors/psd/CbmPsdSimpleDigitizer.cxx
index d1c9fe4937..aa8a41adbc 100644
--- a/sim/detectors/psd/CbmPsdSimpleDigitizer.cxx
+++ b/sim/detectors/psd/CbmPsdSimpleDigitizer.cxx
@@ -154,7 +154,12 @@ void CbmPsdSimpleDigitizer::Exec(Option_t*)
     eLossSmeared += eNoise;
     CbmPsdDigi* digi =
       new CbmPsdDigi(entry.second.first.GetAddress(), entry.second.first.GetTime() + fCurrentEventTime, eLossSmeared);
-    SendData(digi->GetTime(), digi, entry.second.second);
+    if (fCreateMatches) {
+      SendData(digi->GetTime(), digi, entry.second.second);
+    }
+    else {
+      SendData(digi->GetTime(), digi);
+    }
     nDigis++;
     LOG(debug1) << fName << ": Digi " << nDigis << " Time " << entry.second.first.GetTime() + fCurrentEventTime
                 << " Section " << entry.second.first.GetSectionID() << " Module " << entry.second.first.GetModuleID()
diff --git a/sim/detectors/tof/CbmTofDigitize.cxx b/sim/detectors/tof/CbmTofDigitize.cxx
index 32f8b487d1..5647b8c40b 100644
--- a/sim/detectors/tof/CbmTofDigitize.cxx
+++ b/sim/detectors/tof/CbmTofDigitize.cxx
@@ -1055,8 +1055,13 @@ Bool_t CbmTofDigitize::MergeSameChanDigis()
     Double_t dHitTime      = fCurrentEventTime + gRandom->Gaus(0., 0.04);
     const Double_t dHitTot = 2.;
     CbmTofDigi* tDigi      = new CbmTofDigi(uChanUId, dHitTime, dHitTot);
-    CbmMatch* tMatch       = new CbmMatch();
-    SendData(tDigi->GetTime(), tDigi, tMatch);  // Send digi to DAQ
+    if (fCreateMatches) {
+      CbmMatch* tMatch       = new CbmMatch();
+      SendData(tDigi->GetTime(), tDigi, tMatch);  // Send digi to DAQ
+    } 
+    else {
+      SendData(tDigi->GetTime(), tDigi);  // Send digi to DAQ
+    }
     fiNbDigis++;
     LOG(debug) << Form("Add fake diamond digis 0x%08x mode with t = %7.3f", uChanUId, dHitTime);
     //delete tDigi;
@@ -1146,12 +1151,16 @@ Bool_t CbmTofDigitize::MergeSameChanDigis()
                     // The original digi will be deleted below, together with the unused digis from the buffer.
                     CbmTofDigi* digi =
                       new CbmTofDigi(*(fStorDigi[iSmType][iSm * iNbRpc + iRpc][iNbSides * iCh + iSide][iDigi0].first));
-                    CbmMatch* match =
-                      new CbmMatch(*(fStorDigi[iSmType][iSm * iNbRpc + iRpc][iNbSides * iCh + iSide][iDigi0].second));
-
                     digi->SetTime(digi->GetTime() * fdDigiTimeConvFactor + fCurrentEventTime);  // ns->ps
-                    SendData(digi->GetTime(), digi, match);                                     // Send digi to DAQ
-                    fiNbDigis++;
+                    if (fCreateMatches) {
+                      CbmMatch* match =
+                        new CbmMatch(*(fStorDigi[iSmType][iSm * iNbRpc + iRpc][iNbSides * iCh + iSide][iDigi0].second));
+                      SendData(digi->GetTime(), digi, match);                                     // Send digi to DAQ
+                   }
+                   else { 
+                      SendData(digi->GetTime(), digi);                                     // Send digi to DAQ
+                   }
+                   fiNbDigis++;
 
                     // TOF QA
                     if (fbMonitorHistos && NULL != digiMatch) {
@@ -1186,10 +1195,16 @@ Bool_t CbmTofDigitize::MergeSameChanDigis()
               // The original digi will be deleted below, together with the unused digis from the buffer.
               CbmTofDigi* digi =
                 new CbmTofDigi(*(fStorDigi[iSmType][iSm * iNbRpc + iRpc][iNbSides * iCh + iSide][iDigi0].first));
-              CbmMatch* match =
-                new CbmMatch(*(fStorDigi[iSmType][iSm * iNbRpc + iRpc][iNbSides * iCh + iSide][iDigi0].second));
               digi->SetTime(digi->GetTime() * fdDigiTimeConvFactor + fCurrentEventTime);  // ns->ps
-              SendData(digi->GetTime(), digi, match);                                     // Send digi to DAQ
+              if (fCreateMatches) {
+                CbmMatch* match =
+                  new CbmMatch(*(fStorDigi[iSmType][iSm * iNbRpc + iRpc][iNbSides * iCh + iSide][iDigi0].second));
+                SendData(digi->GetTime(), digi, match);                                     // Send digi to DAQ
+              }
+              else {
+                SendData(digi->GetTime(), digi);                                     // Send digi to DAQ
+              }
+
               fiNbDigis++;
 
               if (fbMonitorHistos) {
diff --git a/sim/detectors/trd/CbmTrdDigitizer.cxx b/sim/detectors/trd/CbmTrdDigitizer.cxx
index 432c618cf8..7f0b83d895 100644
--- a/sim/detectors/trd/CbmTrdDigitizer.cxx
+++ b/sim/detectors/trd/CbmTrdDigitizer.cxx
@@ -225,7 +225,12 @@ void CbmTrdDigitizer::Exec(Option_t*)
     for (std::map<Int_t, pair<CbmTrdDigi*, CbmMatch*>>::iterator it = digis->begin(); it != digis->end(); it++) {
       assert(it->second.second);
       CbmTrdDigi* digi = it->second.first;
-      SendData(digi->GetTime(), digi, it->second.second);
+      if (fCreateMatches) {
+        SendData(digi->GetTime(), digi, it->second.second);
+      }
+      else {
+        SendData(digi->GetTime(), digi);
+      }
       nDigis++;
     }  //# modules
     digis->clear();
@@ -263,7 +268,12 @@ void CbmTrdDigitizer::FlushBuffers()
     for (std::map<Int_t, pair<CbmTrdDigi*, CbmMatch*>>::iterator it = digis->begin(); it != digis->end(); it++) {
       assert(it->second.second);
       CbmTrdDigi* digi = it->second.first;
-      SendData(digi->GetTime(), digi, it->second.second);
+      if (fCreateMatches) {
+        SendData(digi->GetTime(), digi, it->second.second);
+      }
+      else {
+        SendData(digi->GetTime(), digi);
+      }
       nDigis++;
     }  //# modules
     digis->clear();
diff --git a/sim/detectors/trd/CbmTrdModuleSimR.cxx b/sim/detectors/trd/CbmTrdModuleSimR.cxx
index be6f1a092d..01ed0883b9 100644
--- a/sim/detectors/trd/CbmTrdModuleSimR.cxx
+++ b/sim/detectors/trd/CbmTrdModuleSimR.cxx
@@ -400,6 +400,7 @@ void CbmTrdModuleSimR::ProcessPulseBuffer(Int_t address, Bool_t FNcall, Bool_t M
 
   fDigiMap[address] = std::make_pair(digi, digiMatch);
 
+  delete fPulseBuffer[address].second;
   fPulseBuffer.erase(address);
 
   if (!FNcall && !MultiCall && trigger == 1) {
-- 
GitLab