From 69f4b97fb4551f869a99396c585598a9ef95dd38 Mon Sep 17 00:00:00 2001
From: Philippe Canal <pcanal@fnal.gov>
Date: Mon, 8 Feb 2021 15:24:03 -0600
Subject: [PATCH] In TFileMerger use obj in memory if available.

Currently only in the case where we have a Merge function and a dictionary.
---
 io/io/src/TFileMerger.cxx | 33 +++++++++++++++++++++++----------
 1 file changed, 23 insertions(+), 10 deletions(-)

diff --git a/io/io/src/TFileMerger.cxx b/io/io/src/TFileMerger.cxx
index cf8e80d4f56..991bd24a424 100644
--- a/io/io/src/TFileMerger.cxx
+++ b/io/io/src/TFileMerger.cxx
@@ -24,6 +24,7 @@ to be merged, like the standalone hadd program.
 
 #include "TFileMerger.h"
 #include "TDirectory.h"
+#include "TError.h"
 #include "TUrl.h"
 #include "TFile.h"
 #include "TUUID.h"
@@ -503,6 +504,9 @@ Bool_t TFileMerger::MergeRecursive(TDirectory *target, TList *sourcelist, Int_t
                obj = current_sourcedir->GetList()->FindObject(key->GetName());
                if (!obj) {
                   obj = key->ReadObj();
+               } else if (info.fIsFirst && current_sourcedir != target) {
+                  R__ASSERT(cl->IsTObject());
+                  obj = obj->Clone();
                }
             } else {
                obj = key->ReadObj();
@@ -561,6 +565,7 @@ Bool_t TFileMerger::MergeRecursive(TDirectory *target, TList *sourcelist, Int_t
                if (alreadyseen) continue;
 
                TList inputs;
+               TList todelete;
                Bool_t oneGo = fHistoOneGo && cl->InheritsFrom(R__TH1_Class);
 
                // Loop over all source files and merge same-name object
@@ -579,15 +584,21 @@ Bool_t TFileMerger::MergeRecursive(TDirectory *target, TList *sourcelist, Int_t
                         // 'key' retrieved indirectly.
                         // ndir->ResetBit(kMustCleanup);
                         ndir->cd();
-                        TKey *key2 = (TKey*)ndir->GetListOfKeys()->FindObject(key->GetName());
-                        if (key2) {
-                           TObject *hobj = key2->ReadObj();
-                           if (!hobj) {
-                              Info("MergeRecursive", "could not read object for key {%s, %s}; skipping file %s",
-                                   key->GetName(), key->GetTitle(), nextsource->GetName());
-                              nextsource = (TFile*)sourcelist->After(nextsource);
-                              continue;
+                        TObject *hobj = ndir->GetList()->FindObject(key->GetName());
+                        if (!hobj) {
+                           TKey *key2 = (TKey*)ndir->GetListOfKeys()->FindObject(key->GetName());
+                           if (key2) {
+                              hobj = key2->ReadObj();
+                              if (!hobj) {
+                                 Info("MergeRecursive", "could not read object for key {%s, %s}; skipping file %s",
+                                    key->GetName(), key->GetTitle(), nextsource->GetName());
+                                 nextsource = (TFile*)sourcelist->After(nextsource);
+                                 continue;
+                              }
+                              todelete.Add(hobj);
                            }
+                        }
+                        if (hobj) {
                            // Set ownership for collections
                            if (hobj->InheritsFrom(TCollection::Class())) {
                               ((TCollection*)hobj)->SetOwner();
@@ -602,7 +613,8 @@ Bool_t TFileMerger::MergeRecursive(TDirectory *target, TList *sourcelist, Int_t
                                  Error("MergeRecursive", "calling Merge() on '%s' with the corresponding object in '%s'",
                                        obj->GetName(), nextsource->GetName());
                               }
-                              inputs.Delete();
+                              inputs.Clear();
+                              todelete.Delete();
                            }
                         }
                      }
@@ -613,7 +625,8 @@ Bool_t TFileMerger::MergeRecursive(TDirectory *target, TList *sourcelist, Int_t
                      ROOT::MergeFunc_t func = cl->GetMerge();
                      func(obj, &inputs, &info);
                      info.fIsFirst = kFALSE;
-                     inputs.Delete();
+                     inputs.Clear();
+                     todelete.Delete();
                   }
                }
             } else if (cl->IsTObject() &&
-- 
GitLab