From 7643d3d1dff7834ff2d9d34e4311c08196fea6bc Mon Sep 17 00:00:00 2001
From: Florian Uhlig <f.uhlig@gsi.de>
Date: Thu, 11 Feb 2021 17:56:14 +0100
Subject: [PATCH] fles: Add gFile + gDirectory protection

---
 .../monitor/CbmCheckDataFormatGdpb2018.cxx    | 11 ++++++----
 .../monitor/CbmMcbm2018MonitorDataRates.cxx   | 11 ++++++----
 .../monitor/CbmMcbm2018MonitorMcbmPulser.cxx  | 11 ++++++----
 .../monitor/CbmMcbm2018MonitorMcbmRate.cxx    | 11 ++++++----
 .../monitor/CbmMcbm2018MonitorMcbmSync.cxx    | 11 ++++++----
 .../monitor/CbmMcbm2018MonitorMuch.cxx        | 11 ++++++----
 .../monitor/CbmMcbm2018MonitorMuchLite.cxx    | 11 ++++++----
 .../monitor/CbmMcbm2018MonitorSts.cxx         | 11 ++++++----
 .../monitor/CbmMcbm2018MonitorStsPulser.cxx   | 11 ++++++----
 .../monitor/CbmMcbm2018MonitorStsSync.cxx     | 22 ++++++++++++-------
 .../monitor/CbmMcbm2018MonitorTaskHodo.cxx    | 17 ++++++++------
 .../monitor/CbmMcbm2018MonitorTaskPsd.cxx     | 17 ++++++++------
 .../monitor/CbmMcbm2018MonitorTaskT0.cxx      | 17 ++++++++------
 .../monitor/CbmMcbm2018MonitorTaskTof.cxx     | 17 ++++++++------
 .../CbmMcbm2018MonitorTaskTofPulser.cxx       | 17 ++++++++------
 .../monitor/CbmMcbm2018MonitorTof.cxx         | 16 ++++++--------
 .../monitor/CbmMcbm2018MonitorTofPulser.cxx   | 16 ++++++--------
 .../mcbm2018/monitor/CbmMcbm2018TofFeeThr.cxx | 11 ++++++----
 .../monitor/CbmMcbm2018TofTestFee.cxx         | 16 ++++++--------
 .../CbmMcbm2019TimeWinEventBuilderTask.cxx    | 17 ++++++++------
 .../mcbm2018/tasks/CbmMcbmCheckTimingTask.cxx | 10 +++++----
 .../unpacker/CbmMcbm2018UnpackerTaskHodo.cxx  | 17 ++++++++------
 .../unpacker/CbmMcbm2018UnpackerTaskMuch.cxx  | 17 ++++++++------
 .../unpacker/CbmMcbm2018UnpackerTaskPsd.cxx   | 18 +++++++++------
 .../unpacker/CbmMcbm2018UnpackerTaskRich.cxx  | 17 ++++++++------
 .../unpacker/CbmMcbm2018UnpackerTaskSts.cxx   | 17 ++++++++------
 .../unpacker/CbmMcbm2018UnpackerTaskTof.cxx   | 18 +++++++++------
 .../unpacker/CbmMcbm2018UnpackerTaskTrdR.cxx  | 14 +++++++-----
 reco/base/CbmUnpackTask.tmpl                  | 16 ++++++++------
 29 files changed, 251 insertions(+), 175 deletions(-)

diff --git a/fles/mcbm2018/monitor/CbmCheckDataFormatGdpb2018.cxx b/fles/mcbm2018/monitor/CbmCheckDataFormatGdpb2018.cxx
index f03ff7708d..9766005407 100644
--- a/fles/mcbm2018/monitor/CbmCheckDataFormatGdpb2018.cxx
+++ b/fles/mcbm2018/monitor/CbmCheckDataFormatGdpb2018.cxx
@@ -1276,11 +1276,12 @@ void CbmCheckDataFormatGdpb2018::Reset() {}
 void CbmCheckDataFormatGdpb2018::Finish() { SaveAllHistos(fsHistoFilename); }
 
 void CbmCheckDataFormatGdpb2018::SaveAllHistos(TString sFileName) {
-  TDirectory* oldDir = NULL;
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
   TFile* histoFile   = NULL;
   if ("" != sFileName) {
-    // Store current directory position to allow restore later
-    oldDir = gDirectory;
     // open separate histo file in recreate mode
     histoFile = new TFile(sFileName, "RECREATE");
     histoFile->cd();
@@ -1366,7 +1367,9 @@ void CbmCheckDataFormatGdpb2018::SaveAllHistos(TString sFileName) {
   if ("" != sFileName) {
     // Restore original directory position
     histoFile->Close();
-    oldDir->cd();
+    /// Restore old global file and folder pointer to avoid messing with FairRoot
+    gFile      = oldFile;
+    gDirectory = oldDir;
   }  // if( "" != sFileName )
 }
 
diff --git a/fles/mcbm2018/monitor/CbmMcbm2018MonitorDataRates.cxx b/fles/mcbm2018/monitor/CbmMcbm2018MonitorDataRates.cxx
index 05a137b5d8..c5708cde3e 100644
--- a/fles/mcbm2018/monitor/CbmMcbm2018MonitorDataRates.cxx
+++ b/fles/mcbm2018/monitor/CbmMcbm2018MonitorDataRates.cxx
@@ -600,11 +600,12 @@ void CbmMcbm2018MonitorDataRates::Reset() {}
 void CbmMcbm2018MonitorDataRates::Finish() { SaveAllHistos(fsHistoFilename); }
 
 void CbmMcbm2018MonitorDataRates::SaveAllHistos(TString sFileName) {
-  TDirectory* oldDir = NULL;
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
   TFile* histoFile   = NULL;
   if ("" != sFileName) {
-    // Store current directory position to allow restore later
-    oldDir = gDirectory;
     // open separate histo file in recreate mode
     histoFile = new TFile(sFileName, "RECREATE");
     histoFile->cd();
@@ -645,7 +646,9 @@ void CbmMcbm2018MonitorDataRates::SaveAllHistos(TString sFileName) {
   if ("" != sFileName) {
     // Restore original directory position
     histoFile->Close();
-    oldDir->cd();
+    /// Restore old global file and folder pointer to avoid messing with FairRoot
+    gFile      = oldFile;
+    gDirectory = oldDir;
   }  // if( "" != sFileName )
 }
 
diff --git a/fles/mcbm2018/monitor/CbmMcbm2018MonitorMcbmPulser.cxx b/fles/mcbm2018/monitor/CbmMcbm2018MonitorMcbmPulser.cxx
index 4f3dab3d38..6c6b2b821f 100644
--- a/fles/mcbm2018/monitor/CbmMcbm2018MonitorMcbmPulser.cxx
+++ b/fles/mcbm2018/monitor/CbmMcbm2018MonitorMcbmPulser.cxx
@@ -1398,11 +1398,12 @@ void CbmMcbm2018MonitorMcbmPulser::Finish() {
 
 
 void CbmMcbm2018MonitorMcbmPulser::SaveAllHistos(TString sFileName) {
-  TDirectory* oldDir = nullptr;
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
   TFile* histoFile   = nullptr;
   if ("" != sFileName) {
-    // Store current directory position to allow restore later
-    oldDir = gDirectory;
     // open separate histo file in recreate mode
     histoFile = new TFile(sFileName, "RECREATE");
     histoFile->cd();
@@ -1441,7 +1442,9 @@ void CbmMcbm2018MonitorMcbmPulser::SaveAllHistos(TString sFileName) {
   if ("" != sFileName) {
     // Restore original directory position
     histoFile->Close();
-    oldDir->cd();
+    /// Restore old global file and folder pointer to avoid messing with FairRoot
+    gFile      = oldFile;
+    gDirectory = oldDir;
   }  // if( "" != sFileName )
 }
 void CbmMcbm2018MonitorMcbmPulser::ResetAllHistos() {
diff --git a/fles/mcbm2018/monitor/CbmMcbm2018MonitorMcbmRate.cxx b/fles/mcbm2018/monitor/CbmMcbm2018MonitorMcbmRate.cxx
index 1108ad79ed..3949008b90 100644
--- a/fles/mcbm2018/monitor/CbmMcbm2018MonitorMcbmRate.cxx
+++ b/fles/mcbm2018/monitor/CbmMcbm2018MonitorMcbmRate.cxx
@@ -1285,11 +1285,12 @@ void CbmMcbm2018MonitorMcbmRate::Finish() {
 
 
 void CbmMcbm2018MonitorMcbmRate::SaveAllHistos(TString sFileName) {
-  TDirectory* oldDir = nullptr;
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
   TFile* histoFile   = nullptr;
   if ("" != sFileName) {
-    // Store current directory position to allow restore later
-    oldDir = gDirectory;
     // open separate histo file in recreate mode
     histoFile = new TFile(sFileName, "RECREATE");
     histoFile->cd();
@@ -1331,7 +1332,9 @@ void CbmMcbm2018MonitorMcbmRate::SaveAllHistos(TString sFileName) {
   if ("" != sFileName) {
     // Restore original directory position
     histoFile->Close();
-    oldDir->cd();
+    /// Restore old global file and folder pointer to avoid messing with FairRoot
+    gFile      = oldFile;
+    gDirectory = oldDir;
   }  // if( "" != sFileName )
 }
 void CbmMcbm2018MonitorMcbmRate::ResetAllHistos() {
diff --git a/fles/mcbm2018/monitor/CbmMcbm2018MonitorMcbmSync.cxx b/fles/mcbm2018/monitor/CbmMcbm2018MonitorMcbmSync.cxx
index 247ec608a8..a2932495aa 100644
--- a/fles/mcbm2018/monitor/CbmMcbm2018MonitorMcbmSync.cxx
+++ b/fles/mcbm2018/monitor/CbmMcbm2018MonitorMcbmSync.cxx
@@ -1536,11 +1536,12 @@ void CbmMcbm2018MonitorMcbmSync::Finish() {
 
 
 void CbmMcbm2018MonitorMcbmSync::SaveAllHistos(TString sFileName) {
-  TDirectory* oldDir = nullptr;
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
   TFile* histoFile   = nullptr;
   if ("" != sFileName) {
-    // Store current directory position to allow restore later
-    oldDir = gDirectory;
     // open separate histo file in recreate mode
     histoFile = new TFile(sFileName, "RECREATE");
     histoFile->cd();
@@ -1591,7 +1592,9 @@ void CbmMcbm2018MonitorMcbmSync::SaveAllHistos(TString sFileName) {
   if ("" != sFileName) {
     // Restore original directory position
     histoFile->Close();
-    oldDir->cd();
+    /// Restore old global file and folder pointer to avoid messing with FairRoot
+    gFile      = oldFile;
+    gDirectory = oldDir;
   }  // if( "" != sFileName )
 }
 void CbmMcbm2018MonitorMcbmSync::ResetAllHistos() {
diff --git a/fles/mcbm2018/monitor/CbmMcbm2018MonitorMuch.cxx b/fles/mcbm2018/monitor/CbmMcbm2018MonitorMuch.cxx
index 9e38a2ff6b..7f87df29a2 100644
--- a/fles/mcbm2018/monitor/CbmMcbm2018MonitorMuch.cxx
+++ b/fles/mcbm2018/monitor/CbmMcbm2018MonitorMuch.cxx
@@ -1951,11 +1951,12 @@ void CbmMcbm2018MonitorMuch::Finish() {
 
 
 void CbmMcbm2018MonitorMuch::SaveAllHistos(TString sFileName) {
-  TDirectory* oldDir = NULL;
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
   TFile* histoFile   = NULL;
   if ("" != sFileName) {
-    // Store current directory position to allow restore later
-    oldDir = gDirectory;
     // open separate histo file in recreate mode
     histoFile = new TFile(sFileName, "RECREATE");
     histoFile->cd();
@@ -2059,7 +2060,9 @@ void CbmMcbm2018MonitorMuch::SaveAllHistos(TString sFileName) {
   if ("" != sFileName) {
     // Restore original directory position
     histoFile->Close();
-    oldDir->cd();
+    /// Restore old global file and folder pointer to avoid messing with FairRoot
+    gFile      = oldFile;
+    gDirectory = oldDir;
   }  // if( "" != sFileName )
 }
 void CbmMcbm2018MonitorMuch::ResetAllHistos() {
diff --git a/fles/mcbm2018/monitor/CbmMcbm2018MonitorMuchLite.cxx b/fles/mcbm2018/monitor/CbmMcbm2018MonitorMuchLite.cxx
index 863a373926..9f09fc3cab 100644
--- a/fles/mcbm2018/monitor/CbmMcbm2018MonitorMuchLite.cxx
+++ b/fles/mcbm2018/monitor/CbmMcbm2018MonitorMuchLite.cxx
@@ -1566,11 +1566,12 @@ void CbmMcbm2018MonitorMuchLite::Finish() {
 
 
 void CbmMcbm2018MonitorMuchLite::SaveAllHistos(TString sFileName) {
-  TDirectory* oldDir = NULL;
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
   TFile* histoFile   = NULL;
   if ("" != sFileName) {
-    // Store current directory position to allow restore later
-    oldDir = gDirectory;
     // open separate histo file in recreate mode
     histoFile = new TFile(sFileName, "RECREATE");
     histoFile->cd();
@@ -1652,7 +1653,9 @@ void CbmMcbm2018MonitorMuchLite::SaveAllHistos(TString sFileName) {
   if ("" != sFileName) {
     // Restore original directory position
     histoFile->Close();
-    oldDir->cd();
+    /// Restore old global file and folder pointer to avoid messing with FairRoot
+    gFile      = oldFile;
+    gDirectory = oldDir;
   }  // if( "" != sFileName )
 }
 
diff --git a/fles/mcbm2018/monitor/CbmMcbm2018MonitorSts.cxx b/fles/mcbm2018/monitor/CbmMcbm2018MonitorSts.cxx
index cd05407887..71c83655ba 100644
--- a/fles/mcbm2018/monitor/CbmMcbm2018MonitorSts.cxx
+++ b/fles/mcbm2018/monitor/CbmMcbm2018MonitorSts.cxx
@@ -2567,11 +2567,12 @@ void CbmMcbm2018MonitorSts::Finish() {
 
 
 void CbmMcbm2018MonitorSts::SaveAllHistos(TString sFileName) {
-  TDirectory* oldDir = NULL;
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
   TFile* histoFile   = NULL;
   if ("" != sFileName) {
-    // Store current directory position to allow restore later
-    oldDir = gDirectory;
     // open separate histo file in recreate mode
     histoFile = new TFile(sFileName, "RECREATE");
     histoFile->cd();
@@ -2702,7 +2703,9 @@ void CbmMcbm2018MonitorSts::SaveAllHistos(TString sFileName) {
   if ("" != sFileName) {
     // Restore original directory position
     histoFile->Close();
-    oldDir->cd();
+    /// Restore old global file and folder pointer to avoid messing with FairRoot
+    gFile      = oldFile;
+    gDirectory = oldDir;
   }  // if( "" != sFileName )
 }
 void CbmMcbm2018MonitorSts::ResetAllHistos() {
diff --git a/fles/mcbm2018/monitor/CbmMcbm2018MonitorStsPulser.cxx b/fles/mcbm2018/monitor/CbmMcbm2018MonitorStsPulser.cxx
index 43b87d097e..b548473046 100644
--- a/fles/mcbm2018/monitor/CbmMcbm2018MonitorStsPulser.cxx
+++ b/fles/mcbm2018/monitor/CbmMcbm2018MonitorStsPulser.cxx
@@ -1332,11 +1332,12 @@ void CbmCosy2018MonitorPulser::Finish() {
 
 
 void CbmCosy2018MonitorPulser::SaveAllHistos(TString sFileName) {
-  TDirectory* oldDir = NULL;
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
   TFile* histoFile   = NULL;
   if ("" != sFileName) {
-    // Store current directory position to allow restore later
-    oldDir = gDirectory;
     // open separate histo file in recreate mode
     histoFile = new TFile(sFileName, "RECREATE");
     histoFile->cd();
@@ -1402,7 +1403,9 @@ void CbmCosy2018MonitorPulser::SaveAllHistos(TString sFileName) {
   if ("" != sFileName) {
     // Restore original directory position
     histoFile->Close();
-    oldDir->cd();
+    /// Restore old global file and folder pointer to avoid messing with FairRoot
+    gFile      = oldFile;
+    gDirectory = oldDir;
   }  // if( "" != sFileName )
 }
 void CbmCosy2018MonitorPulser::ResetAllHistos() {
diff --git a/fles/mcbm2018/monitor/CbmMcbm2018MonitorStsSync.cxx b/fles/mcbm2018/monitor/CbmMcbm2018MonitorStsSync.cxx
index bd37e5a2cb..bb8f8d5be1 100644
--- a/fles/mcbm2018/monitor/CbmMcbm2018MonitorStsSync.cxx
+++ b/fles/mcbm2018/monitor/CbmMcbm2018MonitorStsSync.cxx
@@ -1800,11 +1800,12 @@ void CbmMcbm2018MonitorStsSync::Finish() {
 }
 
 void CbmMcbm2018MonitorStsSync::SaveAllHistos(TString sFileName) {
-  TDirectory* oldDir = NULL;
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
   TFile* histoFile   = NULL;
   if ("" != sFileName) {
-    // Store current directory position to allow restore later
-    oldDir = gDirectory;
     // open separate histo file in recreate mode
     histoFile = new TFile(sFileName, "RECREATE");
     histoFile->cd();
@@ -1896,15 +1897,18 @@ void CbmMcbm2018MonitorStsSync::SaveAllHistos(TString sFileName) {
   if ("" != sFileName) {
     // Restore original directory position
     histoFile->Close();
-    oldDir->cd();
+    /// Restore old global file and folder pointer to avoid messing with FairRoot
+    gFile      = oldFile;
+    gDirectory = oldDir;
   }  // if( "" != sFileName )
 }
 void CbmMcbm2018MonitorStsSync::SavePulserHistos(TString sFileName) {
-  TDirectory* oldDir = NULL;
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
   TFile* histoFile   = NULL;
   if ("" != sFileName) {
-    // Store current directory position to allow restore later
-    oldDir = gDirectory;
     // open separate histo file in recreate mode
     histoFile = new TFile(sFileName, "RECREATE");
     histoFile->cd();
@@ -1927,7 +1931,9 @@ void CbmMcbm2018MonitorStsSync::SavePulserHistos(TString sFileName) {
   if ("" != sFileName) {
     // Restore original directory position
     histoFile->Close();
-    oldDir->cd();
+    /// Restore old global file and folder pointer to avoid messing with FairRoot
+    gFile      = oldFile;
+    gDirectory = oldDir;
   }  // if( "" != sFileName )
 }
 void CbmMcbm2018MonitorStsSync::ResetAllHistos() {
diff --git a/fles/mcbm2018/monitor/CbmMcbm2018MonitorTaskHodo.cxx b/fles/mcbm2018/monitor/CbmMcbm2018MonitorTaskHodo.cxx
index 1d79c996c1..91528178a0 100644
--- a/fles/mcbm2018/monitor/CbmMcbm2018MonitorTaskHodo.cxx
+++ b/fles/mcbm2018/monitor/CbmMcbm2018MonitorTaskHodo.cxx
@@ -219,11 +219,12 @@ Bool_t CbmMcbm2018MonitorTaskHodo::SaveHistograms() {
   std::vector<std::pair<TCanvas*, std::string>> vCanvas =
     fMonitorAlgo->GetCanvasVector();
 
-  /// (Re-)Create ROOT file to store the histos
-  TDirectory* oldDir = NULL;
-  TFile* histoFile   = NULL;
-  // Store current directory position to allow restore later
-  oldDir = gDirectory;
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
+  TFile* histoFile = nullptr;
+
   // open separate histo file in recreate mode
   histoFile = new TFile("data/HistosMonitorHodo.root", "RECREATE");
 
@@ -256,8 +257,10 @@ Bool_t CbmMcbm2018MonitorTaskHodo::SaveHistograms() {
     histoFile->cd();
   }  // for( UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto )
 
-  // Restore original directory position
-  oldDir->cd();
+  /// Restore old global file and folder pointer to avoid messing with FairRoot
+  gFile      = oldFile;
+  gDirectory = oldDir;
+
   histoFile->Close();
 
   return kTRUE;
diff --git a/fles/mcbm2018/monitor/CbmMcbm2018MonitorTaskPsd.cxx b/fles/mcbm2018/monitor/CbmMcbm2018MonitorTaskPsd.cxx
index b2f808ea92..6423306e8a 100644
--- a/fles/mcbm2018/monitor/CbmMcbm2018MonitorTaskPsd.cxx
+++ b/fles/mcbm2018/monitor/CbmMcbm2018MonitorTaskPsd.cxx
@@ -188,11 +188,12 @@ void CbmMcbm2018MonitorTaskPsd::Finish() {
   std::vector<std::pair<TNamed*, std::string>> vHistos =
     fMonitorAlgo->GetHistoVector();
 
-  /// (Re-)Create ROOT file to store the histos
-  TDirectory* oldDir = NULL;
-  TFile* histoFile   = NULL;
-  // Store current directory position to allow restore later
-  oldDir = gDirectory;
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
+  TFile* histoFile = nullptr;
+
   // open separate histo file in recreate mode
   histoFile = new TFile(fsHistoFileName, "RECREATE");
   histoFile->cd();
@@ -210,8 +211,10 @@ void CbmMcbm2018MonitorTaskPsd::Finish() {
     histoFile->cd();
   }  // for( UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto )
 
-  // Restore original directory position
-  oldDir->cd();
+  /// Restore old global file and folder pointer to avoid messing with FairRoot
+  gFile      = oldFile;
+  gDirectory = oldDir;
+
   histoFile->Close();
 }
 
diff --git a/fles/mcbm2018/monitor/CbmMcbm2018MonitorTaskT0.cxx b/fles/mcbm2018/monitor/CbmMcbm2018MonitorTaskT0.cxx
index 135b85d7d2..8f08a21cf8 100644
--- a/fles/mcbm2018/monitor/CbmMcbm2018MonitorTaskT0.cxx
+++ b/fles/mcbm2018/monitor/CbmMcbm2018MonitorTaskT0.cxx
@@ -186,11 +186,12 @@ void CbmMcbm2018MonitorTaskT0::Finish() {
   std::vector<std::pair<TNamed*, std::string>> vHistos =
     fMonitorAlgo->GetHistoVector();
 
-  /// (Re-)Create ROOT file to store the histos
-  TDirectory* oldDir = NULL;
-  TFile* histoFile   = NULL;
-  // Store current directory position to allow restore later
-  oldDir = gDirectory;
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
+  TFile* histoFile = nullptr;
+
   // open separate histo file in recreate mode
   histoFile = new TFile(fsHistoFileName, "RECREATE");
   histoFile->cd();
@@ -208,8 +209,10 @@ void CbmMcbm2018MonitorTaskT0::Finish() {
     histoFile->cd();
   }  // for( UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto )
 
-  // Restore original directory position
-  oldDir->cd();
+  /// Restore old global file and folder pointer to avoid messing with FairRoot
+  gFile      = oldFile;
+  gDirectory = oldDir;
+
   histoFile->Close();
 }
 
diff --git a/fles/mcbm2018/monitor/CbmMcbm2018MonitorTaskTof.cxx b/fles/mcbm2018/monitor/CbmMcbm2018MonitorTaskTof.cxx
index 1bda1f0487..3574413d5a 100644
--- a/fles/mcbm2018/monitor/CbmMcbm2018MonitorTaskTof.cxx
+++ b/fles/mcbm2018/monitor/CbmMcbm2018MonitorTaskTof.cxx
@@ -197,11 +197,12 @@ Bool_t CbmMcbm2018MonitorTaskTof::SaveHistograms() {
   std::vector<std::pair<TCanvas*, std::string>> vCanvas =
     fMonitorAlgo->GetCanvasVector();
 
-  /// (Re-)Create ROOT file to store the histos
-  TDirectory* oldDir = NULL;
-  TFile* histoFile   = NULL;
-  // Store current directory position to allow restore later
-  oldDir = gDirectory;
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
+  TFile* histoFile = nullptr;
+
   // open separate histo file in recreate mode
   histoFile = new TFile(fsHistoFileName, "RECREATE");
 
@@ -232,8 +233,10 @@ Bool_t CbmMcbm2018MonitorTaskTof::SaveHistograms() {
     histoFile->cd();
   }  // for( UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto )
 
-  // Restore original directory position
-  oldDir->cd();
+  /// Restore old global file and folder pointer to avoid messing with FairRoot
+  gFile      = oldFile;
+  gDirectory = oldDir;
+
   histoFile->Close();
 
   return kTRUE;
diff --git a/fles/mcbm2018/monitor/CbmMcbm2018MonitorTaskTofPulser.cxx b/fles/mcbm2018/monitor/CbmMcbm2018MonitorTaskTofPulser.cxx
index 53cd020db4..23353307da 100644
--- a/fles/mcbm2018/monitor/CbmMcbm2018MonitorTaskTofPulser.cxx
+++ b/fles/mcbm2018/monitor/CbmMcbm2018MonitorTaskTofPulser.cxx
@@ -202,11 +202,12 @@ Bool_t CbmMcbm2018MonitorTaskTofPulser::SaveHistograms() {
   std::vector<std::pair<TCanvas*, std::string>> vCanvas =
     fMonitorPulserAlgo->GetCanvasVector();
 
-  /// (Re-)Create ROOT file to store the histos
-  TDirectory* oldDir = NULL;
-  TFile* histoFile   = NULL;
-  // Store current directory position to allow restore later
-  oldDir = gDirectory;
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
+  TFile* histoFile = nullptr;
+
   // open separate histo file in recreate mode
   histoFile = new TFile(fsHistoFileName, "RECREATE");
 
@@ -237,8 +238,10 @@ Bool_t CbmMcbm2018MonitorTaskTofPulser::SaveHistograms() {
     histoFile->cd();
   }  // for( UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto )
 
-  // Restore original directory position
-  oldDir->cd();
+  /// Restore old global file and folder pointer to avoid messing with FairRoot
+  gFile      = oldFile;
+  gDirectory = oldDir;
+
   histoFile->Close();
 
   return kTRUE;
diff --git a/fles/mcbm2018/monitor/CbmMcbm2018MonitorTof.cxx b/fles/mcbm2018/monitor/CbmMcbm2018MonitorTof.cxx
index 3439cff4b0..c11bcab45a 100644
--- a/fles/mcbm2018/monitor/CbmMcbm2018MonitorTof.cxx
+++ b/fles/mcbm2018/monitor/CbmMcbm2018MonitorTof.cxx
@@ -3377,11 +3377,12 @@ void CbmMcbm2018MonitorTof::Finish() {
 }
 
 void CbmMcbm2018MonitorTof::SaveAllHistos(TString sFileName) {
-  TDirectory* oldDir = NULL;
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
   TFile* histoFile   = NULL;
   if ("" != sFileName) {
-    // Store current directory position to allow restore later
-    oldDir = gDirectory;
     // open separate histo file in recreate mode
     histoFile = new TFile(sFileName, "RECREATE");
     histoFile->cd();
@@ -3562,12 +3563,9 @@ void CbmMcbm2018MonitorTof::SaveAllHistos(TString sFileName) {
   if ("" != sFileName) {
     // Restore original directory position
     histoFile->Close();
-    oldDir->cd();
-  }  // if( "" != sFileName )
-  if ("" != sFileName) {
-    // Restore original directory position
-    histoFile->Close();
-    oldDir->cd();
+    /// Restore old global file and folder pointer to avoid messing with FairRoot
+    gFile      = oldFile;
+    gDirectory = oldDir;
   }  // if( "" != sFileName )
 }
 
diff --git a/fles/mcbm2018/monitor/CbmMcbm2018MonitorTofPulser.cxx b/fles/mcbm2018/monitor/CbmMcbm2018MonitorTofPulser.cxx
index c867ad6424..e4e2819075 100644
--- a/fles/mcbm2018/monitor/CbmMcbm2018MonitorTofPulser.cxx
+++ b/fles/mcbm2018/monitor/CbmMcbm2018MonitorTofPulser.cxx
@@ -1593,11 +1593,12 @@ void CbmMcbm2018MonitorTofPulser::Finish() {
 }
 
 void CbmMcbm2018MonitorTofPulser::SaveAllHistos(TString sFileName) {
-  TDirectory* oldDir = NULL;
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
   TFile* histoFile   = NULL;
   if ("" != sFileName) {
-    // Store current directory position to allow restore later
-    oldDir = gDirectory;
     // open separate histo file in recreate mode
     histoFile = new TFile(sFileName, "RECREATE");
     histoFile->cd();
@@ -1665,12 +1666,9 @@ void CbmMcbm2018MonitorTofPulser::SaveAllHistos(TString sFileName) {
   if ("" != sFileName) {
     // Restore original directory position
     histoFile->Close();
-    oldDir->cd();
-  }  // if( "" != sFileName )
-  if ("" != sFileName) {
-    // Restore original directory position
-    histoFile->Close();
-    oldDir->cd();
+    /// Restore old global file and folder pointer to avoid messing with FairRoot
+    gFile      = oldFile;
+    gDirectory = oldDir;
   }  // if( "" != sFileName )
 }
 
diff --git a/fles/mcbm2018/monitor/CbmMcbm2018TofFeeThr.cxx b/fles/mcbm2018/monitor/CbmMcbm2018TofFeeThr.cxx
index 377c0a251d..2657d60db6 100644
--- a/fles/mcbm2018/monitor/CbmMcbm2018TofFeeThr.cxx
+++ b/fles/mcbm2018/monitor/CbmMcbm2018TofFeeThr.cxx
@@ -514,11 +514,12 @@ void CbmMcbm2018TofFeeThr::Finish() {
 }
 
 void CbmMcbm2018TofFeeThr::SaveAllHistos(TString sFileName) {
-  TDirectory* oldDir = NULL;
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
   TFile* histoFile   = NULL;
   if ("" != sFileName) {
-    // Store current directory position to allow restore later
-    oldDir = gDirectory;
     // open separate histo file in recreate mode
     histoFile = new TFile(sFileName, "RECREATE");
     histoFile->cd();
@@ -527,7 +528,9 @@ void CbmMcbm2018TofFeeThr::SaveAllHistos(TString sFileName) {
   if ("" != sFileName) {
     // Restore original directory position
     histoFile->Close();
-    oldDir->cd();
+    /// Restore old global file and folder pointer to avoid messing with FairRoot
+    gFile      = oldFile;
+    gDirectory = oldDir;
   }  // if( "" != sFileName )
 }
 
diff --git a/fles/mcbm2018/monitor/CbmMcbm2018TofTestFee.cxx b/fles/mcbm2018/monitor/CbmMcbm2018TofTestFee.cxx
index 030d677337..d893bc5fe2 100644
--- a/fles/mcbm2018/monitor/CbmMcbm2018TofTestFee.cxx
+++ b/fles/mcbm2018/monitor/CbmMcbm2018TofTestFee.cxx
@@ -1817,11 +1817,12 @@ void CbmMcbm2018TofTestFee::Finish() {
 }
 
 void CbmMcbm2018TofTestFee::SaveAllHistos(TString sFileName) {
-  TDirectory* oldDir = NULL;
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
   TFile* histoFile   = NULL;
   if ("" != sFileName) {
-    // Store current directory position to allow restore later
-    oldDir = gDirectory;
     // open separate histo file in recreate mode
     histoFile = new TFile(sFileName, "RECREATE");
     histoFile->cd();
@@ -1913,12 +1914,9 @@ void CbmMcbm2018TofTestFee::SaveAllHistos(TString sFileName) {
   if ("" != sFileName) {
     // Restore original directory position
     histoFile->Close();
-    oldDir->cd();
-  }  // if( "" != sFileName )
-  if ("" != sFileName) {
-    // Restore original directory position
-    histoFile->Close();
-    oldDir->cd();
+    /// Restore old global file and folder pointer to avoid messing with FairRoot
+    gFile      = oldFile;
+    gDirectory = oldDir;
   }  // if( "" != sFileName )
 }
 
diff --git a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.cxx b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.cxx
index e56e4ef925..1216bf30e5 100644
--- a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.cxx
+++ b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.cxx
@@ -104,11 +104,12 @@ void CbmMcbm2019TimeWinEventBuilderTask::SaveHistos() {
   std::vector<std::pair<TNamed*, std::string>> vHistos =
     fpAlgo->GetHistoVector();
 
-  /// (Re-)Create ROOT file to store the histos
-  TDirectory* oldDir = NULL;
-  TFile* histoFile   = NULL;
-  /// Store current directory position to allow restore later
-  oldDir = gDirectory;
+  /// Save old global file and folder pointer to avoid messing with FairRoot
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+
+  TFile* histoFile = nullptr;
+
   /// open separate histo file in recreate mode
   histoFile = new TFile(fsOutFileName, "RECREATE");
   histoFile->cd();
@@ -126,8 +127,10 @@ void CbmMcbm2019TimeWinEventBuilderTask::SaveHistos() {
     histoFile->cd();
   }  // for( UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto )
 
-  /// Restore original directory position
-  oldDir->cd();
+  /// Restore old global file and folder pointer to avoid messing with FairRoot
+  gFile      = oldFile;
+  gDirectory = oldDir;
+
   histoFile->Close();
 }
 //----------------------------------------------------------------------
diff --git a/fles/mcbm2018/tasks/CbmMcbmCheckTimingTask.cxx b/fles/mcbm2018/tasks/CbmMcbmCheckTimingTask.cxx
index cfb880bbba..7fa222bf48 100644
--- a/fles/mcbm2018/tasks/CbmMcbmCheckTimingTask.cxx
+++ b/fles/mcbm2018/tasks/CbmMcbmCheckTimingTask.cxx
@@ -72,10 +72,12 @@ void CbmMcbmCheckTimingTask::SaveHistos() {
    std::vector< std::pair< TNamed *, std::string > > vHistos = fpAlgo->GetHistoVector();
 
    /// (Re-)Create ROOT file to store the histos
-   TDirectory * oldDir = NULL;
-   TFile * histoFile = NULL;
-   /// Store current directory position to allow restore later
-   oldDir = gDirectory;
+   TFile* histoFile   = nullptr;
+
+   /// Save old global file and folder pointer to avoid messing with FairRoot
+   TFile* oldFile     = gFile;
+   TDirectory* oldDir = gDirectory;
+
    /// open separate histo file in recreate mode
    histoFile = new TFile( fsOutFileName , "RECREATE");
    histoFile->cd();
diff --git a/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskHodo.cxx b/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskHodo.cxx
index 50ab822581..a9e982ad81 100644
--- a/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskHodo.cxx
+++ b/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskHodo.cxx
@@ -267,11 +267,12 @@ void CbmMcbm2018UnpackerTaskHodo::Finish() {
       fUnpackerAlgoSts->GetHistoVector();
     vHistos.insert(vHistos.end(), vHistosSts.begin(), vHistosSts.end());
 
-    /// (Re-)Create ROOT file to store the histos
-    TDirectory* oldDir = NULL;
-    TFile* histoFile   = NULL;
-    // Store current directory position to allow restore later
-    oldDir = gDirectory;
+    /// Save old global file and folder pointer to avoid messing with FairRoot
+    TFile* oldFile     = gFile;
+    TDirectory* oldDir = gDirectory;
+
+    TFile* histoFile = nullptr;
+
     // open separate histo file in recreate mode
     histoFile = new TFile("data/HistosUnpackerSts.root", "RECREATE");
     histoFile->cd();
@@ -289,8 +290,10 @@ void CbmMcbm2018UnpackerTaskHodo::Finish() {
       histoFile->cd();
     }  // for( UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto )
 
-    // Restore original directory position
-    oldDir->cd();
+    /// Restore old global file and folder pointer to avoid messing with FairRoot
+    gFile      = oldFile;
+    gDirectory = oldDir;
+
     histoFile->Close();
   }  // if( kTRUE == fbMonitorMode )
 }
diff --git a/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskMuch.cxx b/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskMuch.cxx
index 8ffac75f50..42bcf9fb8f 100644
--- a/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskMuch.cxx
+++ b/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskMuch.cxx
@@ -197,11 +197,12 @@ void CbmMcbm2018UnpackerTaskMuch::Finish() {
     std::vector<std::pair<TNamed*, std::string>> vHistos =
       fUnpackerAlgo->GetHistoVector();
 
-    /// (Re-)Create ROOT file to store the histos
-    TDirectory* oldDir = NULL;
-    TFile* histoFile   = NULL;
-    // Store current directory position to allow restore later
-    oldDir = gDirectory;
+    /// Save old global file and folder pointer to avoid messing with FairRoot
+    TFile* oldFile     = gFile;
+    TDirectory* oldDir = gDirectory;
+
+    TFile* histoFile = nullptr;
+
     // open separate histo file in recreate mode
     histoFile = new TFile("data/HistosUnpackerMuch.root", "RECREATE");
     histoFile->cd();
@@ -219,8 +220,10 @@ void CbmMcbm2018UnpackerTaskMuch::Finish() {
       histoFile->cd();
     }  // for( UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto )
 
-    // Restore original directory position
-    oldDir->cd();
+    /// Restore old global file and folder pointer to avoid messing with FairRoot
+    gFile      = oldFile;
+    gDirectory = oldDir;
+
     histoFile->Close();
   }  // if( kTRUE == fbMonitorMode )
 }
diff --git a/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskPsd.cxx b/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskPsd.cxx
index b6c4d6d1b2..c6a5e5c4f8 100644
--- a/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskPsd.cxx
+++ b/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskPsd.cxx
@@ -209,11 +209,12 @@ void CbmMcbm2018UnpackerTaskPsd::Finish() {
     std::vector<std::pair<TNamed*, std::string>> vHistos =
       fUnpackerAlgo->GetHistoVector();
 
-    /// (Re-)Create ROOT file to store the histos
-    TDirectory* oldDir = NULL;
-    TFile* histoFile   = NULL;
-    // Store current directory position to allow restore later
-    oldDir = gDirectory;
+    /// Save old global file and folder pointer to avoid messing with FairRoot
+    TFile* oldFile     = gFile;
+    TDirectory* oldDir = gDirectory;
+
+    TFile* histoFile = nullptr;
+
     // open separate histo file in recreate mode
     histoFile = new TFile("data/HistosUnpackerPsd.root", "RECREATE");
     histoFile->cd();
@@ -233,8 +234,11 @@ void CbmMcbm2018UnpackerTaskPsd::Finish() {
 
     fhArraySize->Write();
     fhArrayCapacity->Write();
-    // Restore original directory position
-    oldDir->cd();
+
+    /// Restore old global file and folder pointer to avoid messing with FairRoot
+    gFile      = oldFile;
+    gDirectory = oldDir;
+
     histoFile->Close();
   }  // if( kTRUE == fbMonitorMode )
 }
diff --git a/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskRich.cxx b/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskRich.cxx
index d87a4d073b..13c85b393b 100644
--- a/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskRich.cxx
+++ b/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskRich.cxx
@@ -105,11 +105,12 @@ void CbmMcbm2018UnpackerTaskRich::Finish() {
     std::vector<std::pair<TNamed*, std::string>> vHistos =
       fUnpackerAlgo->GetHistoVector();
 
-    /// (Re-)Create ROOT file to store the histos
-    TDirectory* oldDir = NULL;
-    TFile* histoFile   = NULL;
-    // Store current directory position to allow restore later
-    oldDir = gDirectory;
+    /// Save old global file and folder pointer to avoid messing with FairRoot
+    TFile* oldFile     = gFile;
+    TDirectory* oldDir = gDirectory;
+
+    TFile* histoFile = nullptr;
+
     // open separate histo file in recreate mode
     histoFile = new TFile("data/HistosUnpackerRich.root", "RECREATE");
     histoFile->cd();
@@ -127,8 +128,10 @@ void CbmMcbm2018UnpackerTaskRich::Finish() {
       histoFile->cd();
     }  // for( UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto )
 
-    // Restore original directory position
-    oldDir->cd();
+    /// Restore old global file and folder pointer to avoid messing with FairRoot
+    gFile      = oldFile;
+    gDirectory = oldDir;
+
     histoFile->Close();
   }  // if( kTRUE == fbMonitorMode )
 }
diff --git a/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskSts.cxx b/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskSts.cxx
index 5462affc2a..b29bb7e501 100644
--- a/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskSts.cxx
+++ b/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskSts.cxx
@@ -203,11 +203,12 @@ void CbmMcbm2018UnpackerTaskSts::Finish() {
     std::vector<std::pair<TNamed*, std::string>> vHistos =
       fUnpackerAlgo->GetHistoVector();
 
-    /// (Re-)Create ROOT file to store the histos
-    TDirectory* oldDir = NULL;
-    TFile* histoFile   = NULL;
-    // Store current directory position to allow restore later
-    oldDir = gDirectory;
+    /// Save old global file and folder pointer to avoid messing with FairRoot
+    TFile* oldFile     = gFile;
+    TDirectory* oldDir = gDirectory;
+
+    TFile* histoFile = nullptr;
+
     // open separate histo file in recreate mode
     histoFile = new TFile("data/HistosUnpackerSts.root", "RECREATE");
     histoFile->cd();
@@ -225,8 +226,10 @@ void CbmMcbm2018UnpackerTaskSts::Finish() {
       histoFile->cd();
     }  // for( UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto )
 
-    // Restore original directory position
-    oldDir->cd();
+    /// Restore old global file and folder pointer to avoid messing with FairRoot
+    gFile      = oldFile;
+    gDirectory = oldDir;
+
     histoFile->Close();
   }  // if( kTRUE == fbMonitorMode )
 }
diff --git a/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskTof.cxx b/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskTof.cxx
index 4be0c21b4c..8046bcb2d9 100644
--- a/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskTof.cxx
+++ b/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskTof.cxx
@@ -251,11 +251,12 @@ void CbmMcbm2018UnpackerTaskTof::Finish() {
     std::vector<std::pair<TNamed*, std::string>> vHistos =
       fUnpackerAlgo->GetHistoVector();
 
-    /// (Re-)Create ROOT file to store the histos
-    TDirectory* oldDir = NULL;
-    TFile* histoFile   = NULL;
-    // Store current directory position to allow restore later
-    oldDir = gDirectory;
+    /// Save old global file and folder pointer to avoid messing with FairRoot
+    TFile* oldFile     = gFile;
+    TDirectory* oldDir = gDirectory;
+
+    TFile* histoFile = nullptr;
+
     // open separate histo file in recreate mode
     histoFile = new TFile("data/HistosUnpackerTof.root", "RECREATE");
     histoFile->cd();
@@ -275,8 +276,11 @@ void CbmMcbm2018UnpackerTaskTof::Finish() {
 
     fhArraySize->Write();
     fhArrayCapacity->Write();
-    // Restore original directory position
-    oldDir->cd();
+
+    /// Restore old global file and folder pointer to avoid messing with FairRoot
+    gFile      = oldFile;
+    gDirectory = oldDir;
+
     histoFile->Close();
   }  // if( kTRUE == fbMonitorMode )
 }
diff --git a/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskTrdR.cxx b/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskTrdR.cxx
index 910bfeaaef..7198fe4290 100644
--- a/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskTrdR.cxx
+++ b/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerTaskTrdR.cxx
@@ -118,10 +118,12 @@ void CbmMcbm2018UnpackerTaskTrdR::Finish() {
       fUnpackerAlgo->GetHistoVector();
 
     /// (Re-)Create ROOT file to store the histos
-    TDirectory* oldDir = nullptr;
     TFile* histoFile   = nullptr;
-    // Store current directory position to allow restore later
-    oldDir = gDirectory;
+
+    /// Save old global file and folder pointer to avoid messing with FairRoot
+    TFile* oldFile     = gFile;
+    TDirectory* oldDir = gDirectory;
+
     // open separate histo file in recreate mode
     TString histoFileName = fMonitorHistoFileName;
     histoFile             = new TFile(histoFileName.Data(), "RECREATE");
@@ -136,8 +138,10 @@ void CbmMcbm2018UnpackerTaskTrdR::Finish() {
       vHistos[uHisto].first->Write();
       histoFile->cd();
     }
-    // Restore original directory position
-    oldDir->cd();
+    /// Restore old global file and folder pointer to avoid messing with FairRoot
+    gFile      = oldFile;
+    gDirectory = oldDir;
+
     histoFile->Close();
   }
 }
diff --git a/reco/base/CbmUnpackTask.tmpl b/reco/base/CbmUnpackTask.tmpl
index 08fddecc6c..2c22de882e 100644
--- a/reco/base/CbmUnpackTask.tmpl
+++ b/reco/base/CbmUnpackTask.tmpl
@@ -226,10 +226,11 @@ void CbmUnpackTask< TDigi, TAlgo, TParam >::Finish()
       std::vector< std::pair< TNamed *, std::string > > vHistos = fUnpackerAlgo->GetHistoVector();
 
       /// (Re-)Create ROOT file to store the histos
-      TDirectory * oldDir = NULL;
-      TFile * histoFile = NULL;
-      // Store current directory position to allow restore later
-      oldDir = gDirectory;
+      TFile * histoFile = nullptr;
+      /// Save old global file and folder pointer to avoid messing with FairRoot
+      TFile* oldFile     = gFile;
+      TDirectory* oldDir = gDirectory;
+
       // open separate histo file in recreate mode
       histoFile = new TFile( "data/HistosUnpackerSts.root" , "RECREATE");
       histoFile->cd();
@@ -249,9 +250,10 @@ void CbmUnpackTask< TDigi, TAlgo, TParam >::Finish()
          histoFile->cd();
       } // for( UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto )
 
-     // Restore original directory position
-     oldDir->cd();
-     histoFile->Close();
+      /// Restore old global file and folder pointer to avoid messing with FairRoot
+      gFile      = oldFile;
+      gDirectory = oldDir;
+      histoFile->Close();
    } // if( kTRUE == fbMonitorMode )
 }
 
-- 
GitLab