-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMerge.C
More file actions
76 lines (63 loc) · 1.9 KB
/
Merge.C
File metadata and controls
76 lines (63 loc) · 1.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/**
* File : Merge.C
* Author : Anton Riedel <anton.riedel@tum.de>
* Date : 19.03.2021
* Last Modified Date: 14.10.2021
* Last Modified By : Anton Riedel <anton.riedel@tum.de>
*/
#include <TDataType.h>
#include <TFileMerger.h>
#include <fstream>
#include <string>
#include <vector>
Int_t Merge(const char *filename, const char *output) {
/* create filemerger object */
TFileMerger *tfm = new TFileMerger();
/* set name of merged file */
tfm->OutputFile(output);
/* open file containing paths to all files to be merged */
std::fstream filesToMerge;
filesToMerge.open(filename, std::ios::in);
/* pointer for holding opened files */
TFile *file;
/* needed for running over all filenames */
std::string line;
std::vector<std::string> batch;
/* merge in cycles such that we do not open too many files simultaneously */
Int_t nCycles = 100;
Int_t n = 0;
/* loop over all file names */
while (getline(filesToMerge, line)) {
/* store filenames inside a vector until we have enough files for one merge
* cycle */
batch.push_back(line);
n++;
/* start merge cycle */
if (n >= nCycles) {
/* loop over all filenames inside the vector */
for (auto f : batch) {
tfm->AddFile(f.c_str());
}
/* merge files */
tfm->Merge();
/* reset vector */
batch.clear();
/* add merged file so we merge it again during the next cycle */
batch.push_back(output);
/* reset counter +1 for previously merged files */
n = 1;
}
}
/* if the number of files is not an integer multiple of the number of cycles
* catch all remaining not merged files */
/* 1 because we push back merged file after every cycle */
if (batch.size() != 1) {
for (auto f : batch) {
tfm->AddFile(f.c_str());
}
tfm->Merge();
}
/* close file */
filesToMerge.close();
return 0;
}