How to Efficiently Merge ROOT Files in Multiple Directories?

  • Thread starter Thread starter ChrisVer
  • Start date Start date
  • Tags Tags
    Root
Click For Summary
To merge multiple .root files from 40 directories efficiently, a shell script using a for loop is recommended. Instead of manually typing individual "hadd" commands for each directory, a script can automate the process. The suggested approach involves iterating through each directory and using the "hadd" command to combine the .root files into a single output file for each directory. The script structure includes initializing a counter and iterating over the directories, allowing for the creation of merged files without repetitive manual input. This method not only streamlines the merging process but also ensures that all histograms and trees are included in the final output.
ChrisVer
Science Advisor
Messages
3,372
Reaction score
465
Suppose I have a collection of 40 directories, each containing 1, 2 ,3 ,4 or 5 .root files with histograms and trees.
What is an optimal way to merge those .root files so I would end up with 40 directories and 40 root files with the histos added together?
One way I thought of was to start typing for the 40 different directories an "hadd" command in the terminal.

"hadd sum1.root dir1/*.root"
"hadd sum2.root dir2/*.root"
...
"hadd sum40.root dir40/*.root"


However I find this kind of tiring and stupid. Do you have any better solution?
My problem with a macro is that I am not sure if it understands the *.root notation (so I cannot think of iterating).
Finally I am not sure if a TChain can, apart from Trees in different root files, merge TH1s (histograms) too.

THanks :)
 
Technology news on Phys.org
You could write a shell script that uses iteration to generate a text file containing a single line of the form:

hadd sum1.root dir1/*.root & ; hadd sum1.root dir2/*.root & ; hadd sum3.root dir1/*.root & ; ... ; hadd sum1.root dir40/*.root​

then just copy the line to the command prompt and execute it
 
  • Like
Likes ChrisVer
andrewkirk said:
You could write a shell script that uses iteration to generate a text file containing a single line of the form:

hadd sum1.root dir1/*.root & ; hadd sum1.root dir2/*.root & ; hadd sum3.root dir1/*.root & ; ... ; hadd sum1.root dir40/*.root​

then just copy the line to the command prompt and execute it

Thanks for the reply...
It helped me to try to do it manually... after the 3rd try, I figured out what "for loop" I had to use in the shell script...That's what I had to do:
Bash:
i=0
for folder in directory_path_of_folders/*; do
    hadd -f target_directory/sumfile$((i++)).root $folder/*.root
done
 
Learn If you want to write code for Python Machine learning, AI Statistics/data analysis Scientific research Web application servers Some microcontrollers JavaScript/Node JS/TypeScript Web sites Web application servers C# Games (Unity) Consumer applications (Windows) Business applications C++ Games (Unreal Engine) Operating systems, device drivers Microcontrollers/embedded systems Consumer applications (Linux) Some more tips: Do not learn C++ (or any other dialect of C) as a...

Similar threads

  • · Replies 9 ·
Replies
9
Views
3K
  • · Replies 1 ·
Replies
1
Views
5K
Replies
5
Views
2K
  • · Replies 1 ·
Replies
1
Views
11K
  • · Replies 13 ·
Replies
13
Views
3K