Copying a branch from existing tree to a new one

Hi all,

I am trying to copy an existing branch from a tree to a new tree. Old tree has a lot of branches which I don’t need, so I wanted to make a tree with only the branch I want to use. I am trying to do this following the code written here: … ee2.C.html
I am not running it as a macro, but typing it directly in the interpreter. The problem is, when I come to the line 24, root just crashes and won’t respond.
Also to add, I am not sure what the Event on line 13 is, so I am just ignoring that line and the next one.

Does anyone have some other suggestions for how to copy a branch to a new tree (or even better convert that branch to a new tree)?


Hi Andrea,

this is a simplified and commented version of the macro:

void skim() {

   //Get old file, old tree and set top branch address
   auto oldfile = TFile::Open("./Event.root");
   TTree* oldtree;
   oldfile->GetObject("T", oldtree);
   // Deactivate all branches
   // Activate 4 branches only: our skim

   //Create a new file + a clone of old tree header. Do not copy events
   auto newfile = TFile::Open("small.root","recreate");
   auto newtree = oldtree->CloneTree(0);

   // Here we copy the branches

   // Flush to disk

   // Clean
   delete oldfile;
   delete newfile;

The input file was created with the eventexe test in $ROOTSYS/test with the command “eventexe 1000 1 1 1”.
As you can see the name of the game is to take a tree, deactivate all branches, selectively turn on some of them and then copy the “skimmed” tree to a new file.


Thanks for your reply.

My problem still persists. I attached here the error message I always get when I use CloneTree, both on TChain or on TTree. I also attached an example file I am working with. From the file, I need the branch StrSimHits.

My file is too large, so is the link to it. … .root?dl=0

There was a crash.
This is the entire stack trace of all threads:
#0  0x00007f39872cb06e in __libc_waitpid (pid=<optimized out>, stat_loc=0x7fff04d017ac, options=<optimized out>) at ../sysdeps/unix/sysv/linux/waitpid.c:32
#1  0x00007f398725f989 in do_system (line=<optimized out>) at ../sysdeps/posix/system.c:149
#2  0x00007f39881885fc in TUnixSystem::StackTrace() () from /usr/local/lib/root/
#3  0x00007f398818ae23 in TUnixSystem::DispatchSignals(ESignals) () from /usr/local/lib/root/
#4  <signal handler called>
#5  0x00007f3988142380 in TObjArray::GetAbsLast() const () from /usr/local/lib/root/
#6  0x00007f3983eb904d in TTree::CloneTree(long long, char const*) () from /usr/local/lib/root/
#7  0x00007f3983ee2f3d in G__G__Tree_126_0_41(G__value*, char const*, G__param*, int) () from /usr/local/lib/root/
#8  0x00007f39866b65c7 in Cint::G__ExceptionWrapper(int (*)(G__value*, char const*, G__param*, int), G__value*, char*, G__param*, int) () from /usr/local/lib/root/
#9  0x00007f398675aa31 in G__execute_call () from /usr/local/lib/root/
#10 0x00007f398675adfe in G__call_cppfunc () from /usr/local/lib/root/
#11 0x00007f398673d619 in G__interpret_func () from /usr/local/lib/root/
#12 0x00007f3986727214 in G__getfunction () from /usr/local/lib/root/
#13 0x00007f398680bf3c in G__getstructmem(int, G__FastAllocString&, char*, int, char*, int*, G__var_array*, int) () from /usr/local/lib/root/
#14 0x00007f3986804dbb in G__getvariable () from /usr/local/lib/root/
#15 0x00007f3986700f5d in G__getitem () from /usr/local/lib/root/
#16 0x00007f3986707c3a in G__getexpr () from /usr/local/lib/root/
#17 0x00007f39866f1dd7 in G__define_var () from /usr/local/lib/root/
#18 0x00007f3986786e73 in G__exec_statement () from /usr/local/lib/root/
#19 0x00007f398673b76d in G__interpret_func () from /usr/local/lib/root/
#20 0x00007f3986727279 in G__getfunction () from /usr/local/lib/root/
#21 0x00007f39867016c2 in G__getitem () from /usr/local/lib/root/
#22 0x00007f3986707c3a in G__getexpr () from /usr/local/lib/root/
#23 0x00007f398678af2e in G__exec_statement () from /usr/local/lib/root/
#24 0x00007f39866ed73b in G__exec_tempfile_core () from /usr/local/lib/root/
#25 0x00007f39866eec9e in G__exec_tempfile_fp () from /usr/local/lib/root/
#26 0x00007f3986796fed in G__process_cmd () from /usr/local/lib/root/
#27 0x00007f39881537e1 in TCint::ProcessLine(char const*, TInterpreter::EErrorCode*) () from /usr/local/lib/root/
#28 0x00007f39880b9292 in TApplication::ProcessLine(char const*, bool, int*) () from /usr/local/lib/root/
#29 0x00007f3987cf6f69 in TRint::HandleTermInput() () from /usr/local/lib/root/
#30 0x00007f3988189dbd in TUnixSystem::CheckDescriptors() () from /usr/local/lib/root/
#31 0x00007f398818b55a in TUnixSystem::DispatchOneEvent(bool) () from /usr/local/lib/root/
#32 0x00007f398810fc96 in TSystem::InnerLoop() () from /usr/local/lib/root/
#33 0x00007f3988111884 in TSystem::Run() () from /usr/local/lib/root/
#34 0x00007f39880b75df in TApplication::Run(bool) () from /usr/local/lib/root/
#35 0x00007f3987cf7c57 in TRint::Run(bool) () from /usr/local/lib/root/
#36 0x00000000004010ec in main ()

The lines below might hint at the cause of the crash.
If they do not help you then please submit a bug report at Please post the ENTIRE stack trace
from above as an attachment in addition to anything else
that might help us fixing this issue.
#5  0x00007f3988142380 in TObjArray::GetAbsLast() const () from /usr/local/lib/root/
#6  0x00007f3983eb904d in TTree::CloneTree(long long, char const*) () from /usr/local/lib/root/

mySkim.C (759 Bytes)


There was an error in array size calculation in CloneTree which I fixed in the v5.34, v6.06 and master branches.

However note that in your code there is chain->SetBranchStatus("StrSimHits",1);which only select the top level branch. You most likely meant: chain->SetBranchStatus("StrSimHits*",1);which happens to also seemingly work around the problem.