From bb82dd46d17d356bef1b2e67911414e64456d4cf Mon Sep 17 00:00:00 2001
From: Florian Uhlig <f.uhlig@gsi.de>
Date: Thu, 11 Feb 2021 18:01:37 +0100
Subject: [PATCH] much: Add gFile + gDirectory protection

---
 core/detectors/much/CbmMuchGeoScheme.cxx      | 11 ++++++--
 core/detectors/much/CbmMuchSegmentAuto.cxx    |  9 +++++--
 core/detectors/much/CbmMuchSegmentManual.cxx  |  9 +++++--
 core/detectors/much/CbmMuchSegmentSector.cxx  |  9 +++++--
 reco/detectors/much/CbmMuchFindHitsGem.cxx    | 26 ++++++++++++-------
 .../much/CbmMuchHitProducerIdeal.cxx          | 10 +++++--
 reco/detectors/much/qa/CbmMuchHitFinderQa.cxx |  9 +++++++
 sim/detectors/much/CbmMuchDigitizeGem.cxx     | 19 +++++++++++---
 8 files changed, 78 insertions(+), 24 deletions(-)

diff --git a/core/detectors/much/CbmMuchGeoScheme.cxx b/core/detectors/much/CbmMuchGeoScheme.cxx
index 1ae081aba6..f5425451a8 100644
--- a/core/detectors/much/CbmMuchGeoScheme.cxx
+++ b/core/detectors/much/CbmMuchGeoScheme.cxx
@@ -135,12 +135,19 @@ void CbmMuchGeoScheme::Init(TObjArray* stations, Int_t flag) {
 // -------------------------------------------------------------------------
 void CbmMuchGeoScheme::Init(TString digiFileName, Int_t flag) {
 
-  TFile* oldfile      = gFile;
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
   TFile* file         = new TFile(digiFileName);
   TObjArray* stations = (TObjArray*) file->Get("stations");
   file->Close();
   file->Delete();
-  gFile = oldfile;
+
+  /// Restore old global file and folder pointer to avoid messing with FairRoot
+  gFile      = oldFile;
+  gDirectory = oldDir;
+
   Init(stations, flag);
 }
 // -------------------------------------------------------------------------
diff --git a/core/detectors/much/CbmMuchSegmentAuto.cxx b/core/detectors/much/CbmMuchSegmentAuto.cxx
index fe08db8a6d..672ee236bd 100644
--- a/core/detectors/much/CbmMuchSegmentAuto.cxx
+++ b/core/detectors/much/CbmMuchSegmentAuto.cxx
@@ -230,13 +230,18 @@ void CbmMuchSegmentAuto::FinishTask() {
     printf("Station%i segmented\n", i + 1);
   }
 
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
   // Save parameters
-  TFile* oldfile = gFile;
   TFile* f       = new TFile(fDigiFileName, "RECREATE");
   fStations->Write("stations", 1);
 
   f->Close();
-  gFile = oldfile;
+  /// Restore old global file and folder pointer to avoid messing with FairRoot
+  gFile      = oldFile;
+  gDirectory = oldDir;
 
   DrawSegmentation();
 
diff --git a/core/detectors/much/CbmMuchSegmentManual.cxx b/core/detectors/much/CbmMuchSegmentManual.cxx
index e6018f93c5..1162c38b47 100644
--- a/core/detectors/much/CbmMuchSegmentManual.cxx
+++ b/core/detectors/much/CbmMuchSegmentManual.cxx
@@ -261,13 +261,18 @@ void CbmMuchSegmentManual::SegmentMuch() {
     printf("Station %i segmented\n", iStation + 1);
   }
 
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
   // Save parameters
-  TFile* oldfile = gFile;
   TFile* f       = new TFile(fDigiFileName, "RECREATE");
   fStations->Write("stations", 1);
 
   f->Close();
-  gFile = oldfile;
+  /// Restore old global file and folder pointer to avoid messing with FairRoot
+  gFile      = oldFile;
+  gDirectory = oldDir;
 
   // Draw colored stations
   DrawSegmentation();
diff --git a/core/detectors/much/CbmMuchSegmentSector.cxx b/core/detectors/much/CbmMuchSegmentSector.cxx
index 283587da2e..24ec4dc9b0 100644
--- a/core/detectors/much/CbmMuchSegmentSector.cxx
+++ b/core/detectors/much/CbmMuchSegmentSector.cxx
@@ -144,13 +144,18 @@ void CbmMuchSegmentSector::SegmentMuch() {
     printf("Station %i segmented\n", iStation + 1);
   }
 
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
   // Save parameters
-  TFile* oldfile = gFile;
   TFile* f       = new TFile(fDigiFileName, "RECREATE");
   fStations->Write("stations", 1);
 
   f->Close();
-  gFile = oldfile;
+  /// Restore old global file and folder pointer to avoid messing with FairRoot
+  gFile      = oldFile;
+  gDirectory = oldDir;
 
   DrawSegmentation();
 }
diff --git a/reco/detectors/much/CbmMuchFindHitsGem.cxx b/reco/detectors/much/CbmMuchFindHitsGem.cxx
index a7dc2d83d9..9a18f06417 100644
--- a/reco/detectors/much/CbmMuchFindHitsGem.cxx
+++ b/reco/detectors/much/CbmMuchFindHitsGem.cxx
@@ -1,6 +1,6 @@
 /*
  * CbmMuchFindHitsGem.cxx
- * 
+ *
  * Modified on 08/08/2019 : Hit reconstruction in Event (in time slice) and Time slice mode
  * Default is time slice (kCbmTimeSlice) and it will run in event mode (kCbmEvent) if find event branch in the tree
  * @authors Vikas Singhal and Ajit Kumar
@@ -78,13 +78,13 @@ InitStatus CbmMuchFindHitsGem::Init() {
 
   // fDigis will not be used now. Just for checking. Need to remove
   /*fDigis     = (TClonesArray*) ioman->GetObject("MuchDigi");
-  if (! fDigis) 
-    fDigis     = (TClonesArray*) ioman->GetObject("MuchBeamTimeDigi"); 
-  if (! fDigis) 
-    fDigis     = (TClonesArray*) ioman->GetObject("CbmMuchBeamTimeDigi"); 
-  if (! fDigis) 
-    fDigis     = (TClonesArray*) ioman->GetObject("CbmMuchDigi"); 
-  if (! fDigis) 
+  if (! fDigis)
+    fDigis     = (TClonesArray*) ioman->GetObject("MuchBeamTimeDigi");
+  if (! fDigis)
+    fDigis     = (TClonesArray*) ioman->GetObject("CbmMuchBeamTimeDigi");
+  if (! fDigis)
+    fDigis     = (TClonesArray*) ioman->GetObject("CbmMuchDigi");
+  if (! fDigis)
     LOG(info) << "MuchFindHitsGem: No MuchDigi or MuchBeamTimeDigi or CbmMuchDigi or CbmMuchBeamTimeDigi exist";
     */
 
@@ -117,12 +117,18 @@ InitStatus CbmMuchFindHitsGem::Init() {
                   IsOutputBranchPersistent("MuchPixelHit"));
 
   // Initialize GeoScheme
-  TFile* oldfile      = gFile;
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
   TFile* file         = new TFile(fDigiFile);
   TObjArray* stations = (TObjArray*) file->Get("stations");
   file->Close();
   file->Delete();
-  gFile = oldfile;
+  /// Restore old global file and folder pointer to avoid messing with FairRoot
+  gFile      = oldFile;
+  gDirectory = oldDir;
+
   fGeoScheme->Init(stations, fFlag);
   return kSUCCESS;
 }
diff --git a/reco/detectors/much/CbmMuchHitProducerIdeal.cxx b/reco/detectors/much/CbmMuchHitProducerIdeal.cxx
index f719cb34e7..f6182355c9 100644
--- a/reco/detectors/much/CbmMuchHitProducerIdeal.cxx
+++ b/reco/detectors/much/CbmMuchHitProducerIdeal.cxx
@@ -45,12 +45,18 @@ InitStatus CbmMuchHitProducerIdeal::Init() {
 
   // Initialize GeoScheme
   fGeoScheme          = CbmMuchGeoScheme::Instance();
-  TFile* oldfile      = gFile;
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
   TFile* file         = new TFile(fDigiFile);
   TObjArray* stations = (TObjArray*) file->Get("stations");
   file->Close();
   file->Delete();
-  gFile = oldfile;
+  /// Restore old global file and folder pointer to avoid messing with FairRoot
+  gFile      = oldFile;
+  gDirectory = oldDir;
+
   fGeoScheme->Init(stations, fId);
   return kSUCCESS;
 }
diff --git a/reco/detectors/much/qa/CbmMuchHitFinderQa.cxx b/reco/detectors/much/qa/CbmMuchHitFinderQa.cxx
index 6b397aaeb3..ebe7f84917 100644
--- a/reco/detectors/much/qa/CbmMuchHitFinderQa.cxx
+++ b/reco/detectors/much/qa/CbmMuchHitFinderQa.cxx
@@ -138,7 +138,16 @@ InitStatus CbmMuchHitFinderQa::Init() {
   // Reading Much Digis from CbmMuchDigiManager which are stored as vector
   fDigiManager = CbmDigiManager::Instance();
 
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
   TFile* f            = new TFile(fGeoFileName, "R");
+
+  /// Restore old global file and folder pointer to avoid messing with FairRoot
+  gFile      = oldFile;
+  gDirectory = oldDir;
+
   TObjArray* stations = (TObjArray*) f->Get("stations");
   fGeoScheme->Init(stations, fFlag);
 
diff --git a/sim/detectors/much/CbmMuchDigitizeGem.cxx b/sim/detectors/much/CbmMuchDigitizeGem.cxx
index 419df13c14..dd38dc25e4 100644
--- a/sim/detectors/much/CbmMuchDigitizeGem.cxx
+++ b/sim/detectors/much/CbmMuchDigitizeGem.cxx
@@ -2,8 +2,8 @@
  *@author Vikas Singhal <vikas@vecc.gov.in>
  *@since 15.01.2020
  *@version 4.0
- *@description: Using std::vector for digi and match containers. 
- *@author Ekata Nandy (ekata@vecc.gov.in) 
+ *@description: Using std::vector for digi and match containers.
+ *@author Ekata Nandy (ekata@vecc.gov.in)
  *@since 21.06.19 : RPC digitization parameters(for 3rd and 4th MUCH station) now have been implemented along with GEM param// eters (1st and 2nd station) @author Ekata Nandy (ekata@vecc.gov.in)
  *@description: ADC channels number is 32.GEM & RPC has different charge threshold value and dynamic range, so SetAdc has been changed acc// ordingly. ADC value starts from 1 to 32. ADC 0 has been excluded as it gives wrong x, y, t. @author Ekata Nandy
  *@author Vikas Singhal <vikas@vecc.gov.in>
@@ -378,7 +378,9 @@ InitStatus CbmMuchDigitizeGem::Init() {
 
 
   // Initialize GeoScheme
-  TFile* oldfile = gFile;
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
   TFile* file    = new TFile(fDigiFile);
   if (!file->IsOpen())
     LOG(fatal) << fName << ": parameter file " << fDigiFile
@@ -386,7 +388,9 @@ InitStatus CbmMuchDigitizeGem::Init() {
   TObjArray* stations = (TObjArray*) file->Get("stations");
   file->Close();
   file->Delete();
-  gFile = oldfile;
+  /// Restore old global file and folder pointer to avoid messing with FairRoot
+  gFile      = oldFile;
+  gDirectory = oldDir;
   fGeoScheme->Init(stations, fFlag);
 
 
@@ -808,11 +812,18 @@ void CbmMuchDigitizeGem::Finish() {
   LOG(info) << "=====================================";
 
   /*
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
   TFile *f1 =new TFile ("pri_el_info.root","RECREATE");
   hPriElAfterDriftpathgem->Write();
   hPriElAfterDriftpathrpc->Write();
   hadcGEM->Write();
   hadcRPC->Write();
+  f1->Close();
+  /// Restore old global file and folder pointer to avoid messing with FairRoot
+  gFile      = oldFile;
+  gDirectory = oldDir;
   */
   //if (fDaq)	ReadAndRegister(-1.);
 }
-- 
GitLab