From $ROOTSYS/tutorials/io/mergeSelective.C

void CreateFile(const char *);

void mergeSelective(Int_t nfiles=5)
{
// This macro demonstrates how to merge only a part of the content of a set
// of input files, specified via the interface:
//      TFileMerger::AddObjectNames(const char *names)
// The method can be called several times to add object names, or using a single
// strings with names separated by a blank. Directory names contained in the files
// to be merged are accepted.
//
// Two modes are supported:
// == kOnlyListed: via TFileMerger::PartialMerge(kOnlyListed)
//    This will merge only the objects in the files having the names in the
//    specified list. If a folder is specified, it whole content will be merged
//
// == kSkipListed: via TFileMerger::PartialMerge(kSkipListed)
//    This will skip merging of specified objects. If a folder is specified, its
//    whole content will be skipped.
//
// Important note: the kOnlyListed and kSkipListed flags have to be bitwise OR-ed
// on top of the merging defaults: kAll | kIncremental (as in the example)
//
// The files to be merged have the following structure:
// - hpx          (TH1F)
// - hpxpy        (TH2F)
// - hprof        (TProfile)
// - ntuple       (TNtuple)
// = folder       (TDirectory)
//      - hpx1    (TH1F)
//
// The example first merges exclusively hprof and the content of "folder",
// producing the file exclusive.root, then merges all content but skipping
// hprof and the content of "folder". The result can be inspected in the
// browser.

   // Create the files to be merged
   TStopwatch timer;
   timer.Start();
   TString tutdir = gROOT->GetTutorialsDir();
   if (gROOT->LoadMacro(tutdir + "/hsimple.C")) return;
   Int_t i;
   for (i=0; i<nfiles; i++) CreateFile(Form("tomerge%03d.root",i));

   //------------------------------------
   // Merge only the listed objects
   //------------------------------------
   TFileMerger *fm;
   fm = new TFileMerger(kFALSE);
   fm->OutputFile("exclusive.root");
   fm->AddObjectNames("hprof folder");
   for (i=0; i<nfiles; i++) fm->AddFile(Form("tomerge%03d.root",i));
   // Must add new merging flag on top of the the default ones
   Int_t default_mode = TFileMerger::kAll | TFileMerger::kIncremental;
   Int_t mode = default_mode | TFileMerger::kOnlyListed;
   fm->PartialMerge(mode);
   fm->Reset();

   //------------------------------------
   // Skip merging of the listed objects
   //------------------------------------
   fm->OutputFile("skipped.root");
   fm->AddObjectNames("hprof folder");
   for (i=0; i<nfiles; i++) fm->AddFile(Form("tomerge%03d.root",i));
   // Must add new merging flag on top of the the default ones
   mode = default_mode | TFileMerger::kSkipListed;
   fm->PartialMerge(mode);
   delete fm;


   // Cleanup initial files
   for (i=0; i<nfiles; i++) gSystem->Unlink(Form("tomerge%03d.root",i));
   // Open files to inspect in the browser
   TFile::Open("exclusive.root");
   TFile::Open("skipped.root");
   new TBrowser();
   timer.Stop();
   timer.Print();
}

void CreateFile(const char *fname)
{
   TFile *example = (TFile*)gROOT->ProcessLineFast("hsimple(1)");
   if (!example) return;
   TH1F *hpx = (TH1F*)example->Get("hpx");
   hpx->SetName("hpx1");
   TFile::Cp(example->GetName(), fname);
   TFile *file = TFile::Open(fname, "UPDATE");
   file->mkdir("folder")->cd();
   hpx->Write();
   file->Close();
   example->Close();
   TString sname(fname);
   if (sname.Contains("000")) {
      TFile::Cp(fname, "original.root");
      TFile::Open("original.root");
   }
}
 mergeSelective.C:1
 mergeSelective.C:2
 mergeSelective.C:3
 mergeSelective.C:4
 mergeSelective.C:5
 mergeSelective.C:6
 mergeSelective.C:7
 mergeSelective.C:8
 mergeSelective.C:9
 mergeSelective.C:10
 mergeSelective.C:11
 mergeSelective.C:12
 mergeSelective.C:13
 mergeSelective.C:14
 mergeSelective.C:15
 mergeSelective.C:16
 mergeSelective.C:17
 mergeSelective.C:18
 mergeSelective.C:19
 mergeSelective.C:20
 mergeSelective.C:21
 mergeSelective.C:22
 mergeSelective.C:23
 mergeSelective.C:24
 mergeSelective.C:25
 mergeSelective.C:26
 mergeSelective.C:27
 mergeSelective.C:28
 mergeSelective.C:29
 mergeSelective.C:30
 mergeSelective.C:31
 mergeSelective.C:32
 mergeSelective.C:33
 mergeSelective.C:34
 mergeSelective.C:35
 mergeSelective.C:36
 mergeSelective.C:37
 mergeSelective.C:38
 mergeSelective.C:39
 mergeSelective.C:40
 mergeSelective.C:41
 mergeSelective.C:42
 mergeSelective.C:43
 mergeSelective.C:44
 mergeSelective.C:45
 mergeSelective.C:46
 mergeSelective.C:47
 mergeSelective.C:48
 mergeSelective.C:49
 mergeSelective.C:50
 mergeSelective.C:51
 mergeSelective.C:52
 mergeSelective.C:53
 mergeSelective.C:54
 mergeSelective.C:55
 mergeSelective.C:56
 mergeSelective.C:57
 mergeSelective.C:58
 mergeSelective.C:59
 mergeSelective.C:60
 mergeSelective.C:61
 mergeSelective.C:62
 mergeSelective.C:63
 mergeSelective.C:64
 mergeSelective.C:65
 mergeSelective.C:66
 mergeSelective.C:67
 mergeSelective.C:68
 mergeSelective.C:69
 mergeSelective.C:70
 mergeSelective.C:71
 mergeSelective.C:72
 mergeSelective.C:73
 mergeSelective.C:74
 mergeSelective.C:75
 mergeSelective.C:76
 mergeSelective.C:77
 mergeSelective.C:78
 mergeSelective.C:79
 mergeSelective.C:80
 mergeSelective.C:81
 mergeSelective.C:82
 mergeSelective.C:83
 mergeSelective.C:84
 mergeSelective.C:85
 mergeSelective.C:86
 mergeSelective.C:87
 mergeSelective.C:88
 mergeSelective.C:89
 mergeSelective.C:90
 mergeSelective.C:91
 mergeSelective.C:92
 mergeSelective.C:93
 mergeSelective.C:94
 mergeSelective.C:95
 mergeSelective.C:96
 mergeSelective.C:97
 mergeSelective.C:98
 mergeSelective.C:99