ROOT collections

TObjArray versus std::vector

For historical reasons, some of ROOT’s interfaces use ROOT’s own collection types such as TList and TObjArray. You (and modern ROOT code) should use std::array or std::vector etc from the C++ Standard Library; ROOT supports these fully. The following describes how you can access the elements in case an interface returns a ROOT collection type such as TList.

Iteration and Element Access

ROOT collections hold pointers to TObject. I.e. to store an object in a ROOT collection, it must inherit from TObject. ROOT collections return pointers to TObject; those pointers have to be cast back to the correct subclass.

You can think of a TList as a std::list<TObject*>.

Element retrieval through TObject* is often not useful; for instance with TTree::GetListOfBranches() you know that the elements are of type TBranch*. For this purpose, ROOT offers a tool specific for range-based for loops: TRangeDynCast.

for (auto br : TRangeDynCast<TBranch>( tree->GetListOfBranches() )) {
    if (!br) continue;
    // Use br as a TBranch*
}