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

---
 analysis/detectors/psd/CbmPsdMCbmQaReal.cxx | 17 +++++++++++++++--
 reco/detectors/psd/CbmPsdHitProducer.cxx    | 12 +++++++++++-
 sim/detectors/psd/CbmPsdMC.cxx              | 12 +++++++++++-
 3 files changed, 37 insertions(+), 4 deletions(-)

diff --git a/analysis/detectors/psd/CbmPsdMCbmQaReal.cxx b/analysis/detectors/psd/CbmPsdMCbmQaReal.cxx
index 2abf885349..47fbb5d9dc 100644
--- a/analysis/detectors/psd/CbmPsdMCbmQaReal.cxx
+++ b/analysis/detectors/psd/CbmPsdMCbmQaReal.cxx
@@ -485,7 +485,10 @@ void CbmPsdMCbmQaReal::Finish() {
   }
 
   if (this->fDoWriteHistToFile) {
-    TDirectory* oldir = gDirectory;
+    /// Save old global file and folder pointer to avoid messing with FairRoot
+    TFile* oldFile     = gFile;
+    TDirectory* oldDir = gDirectory;
+
     std::string s     = fOutputDir + "/RecoHists.root";
     TFile* outFile    = new TFile(s.c_str(), "RECREATE");
     if (outFile->IsOpen()) {
@@ -494,7 +497,9 @@ void CbmPsdMCbmQaReal::Finish() {
       outFile->Close();
       std::cout << "Done!" << std::endl;
     }
-    gDirectory->cd(oldir->GetPath());
+    /// Restore old global file and folder pointer to avoid messing with FairRoot
+    gFile      = oldFile;
+    gDirectory = oldDir;
   }
 }
 
@@ -503,6 +508,10 @@ void CbmPsdMCbmQaReal::DrawFromFile(const string& fileName,
                                     const string& outputDir) {
   fOutputDir = outputDir;
 
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
   if (fHM != nullptr) delete fHM;
 
   fHM         = new CbmHistManager();
@@ -511,6 +520,10 @@ void CbmPsdMCbmQaReal::DrawFromFile(const string& fileName,
   DrawHist();
 
   fHM->SaveCanvasToImage(fOutputDir);
+
+  /// Restore old global file and folder pointer to avoid messing with FairRoot
+  gFile      = oldFile;
+  gDirectory = oldDir;
 }
 
 
diff --git a/reco/detectors/psd/CbmPsdHitProducer.cxx b/reco/detectors/psd/CbmPsdHitProducer.cxx
index 1554899204..00e1016204 100644
--- a/reco/detectors/psd/CbmPsdHitProducer.cxx
+++ b/reco/detectors/psd/CbmPsdHitProducer.cxx
@@ -142,7 +142,7 @@ void CbmPsdHitProducer::Exec(Option_t* /*opt*/) {
 
   /*
   for (Int_t imod=0; imod<NPsdMod; imod++) //marina
-  {              
+  {
     if (edep[imod]>0.)
     {
       new ((*fHitArray)[fNHits]) CbmPsdHit(imod+1, edep[imod]);
@@ -160,9 +160,19 @@ void CbmPsdHitProducer::Exec(Option_t* /*opt*/) {
 // -------------------------------------------------------------------------
 void CbmPsdHitProducer::Finish() {
   cout << " CbmPsdHitProducer::Finish() " << endl;
+
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
   TFile* outfile = new TFile("EdepHistos.root", "RECREATE");
   outfile->cd();
   fhModXNewEn->Write();
+
+  /// Restore old global file and folder pointer to avoid messing with FairRoot
+  gFile      = oldFile;
+  gDirectory = oldDir;
+
   //outfile->Close();                     //SELIM
 }
 
diff --git a/sim/detectors/psd/CbmPsdMC.cxx b/sim/detectors/psd/CbmPsdMC.cxx
index 7464c792f7..0e5cf56dc4 100644
--- a/sim/detectors/psd/CbmPsdMC.cxx
+++ b/sim/detectors/psd/CbmPsdMC.cxx
@@ -71,6 +71,10 @@ void CbmPsdMC::ConstructGeometry() {
   }
 
   // --- Look for PSD volume and transformation matrix in geometry file
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
   TFile* geoFile = new TFile(fgeoName);
   assert ( geoFile );
   TKey* key = nullptr;
@@ -122,9 +126,15 @@ void CbmPsdMC::ConstructGeometry() {
   for (Int_t i=0; i<psdVolume->GetNdaughters(); ++i)
     RegisterSensitiveVolumes(psdVolume->GetNode(i));
 //   RegisterSensitiveVolumes(psdVolume->GetNode(0));
-  
+
   LOG(debug) << GetName() << ": " << fNbOfSensitiveVol
              << " sensitive volumes";
+             *
+  /// Restore old global file and folder pointer to avoid messing with FairRoot
+  gFile      = oldFile;
+  gDirectory = oldDir;
+
+  geoFile->Close();
 */
 
   LOG(info) << "Importing PSD geometry from ROOT file " << fgeoName.Data();
-- 
GitLab