ROOT logo
ROOT » Download » Release Notes

ROOT Version 5.28/00 Release Notes

ROOT version 5.28/00 has been released on December 15 2010. In case you are upgrading from an old version, please read the releases notes of version 5.16, 5.18, 5.20, 5.22, 5.24 and version 5.26 in addition to these notes.

Binaries for all supported platforms are available at: 

For more information, see:

The following people have contributed to this new version:
Alberto Annovi, INFN, TH1,
Kevin Belasco, Princeton University, RooStats,
Bertrand Bellenot, CERN/SFT,
Rene Brun, CERN/SFT,
Philippe Canal, FNAL,
Olivier Couet, CERN/SFT,
Kyle Cranmer, NYU, RooStats,
Jason Detwiler, LBL, TClonesArray,
Valeri Fine, BNL/STAR,
Fabrizio Furano, CERN/IT,
Gerri Ganis, CERN/SFT,
Andrei Gheata, CERN/Alice,
Oleksandr Grebenyuk, GSI, TLatex, TPostScript,
Christian Gumpert, CERN and University Dresden, TEfficiency
Bill Heintzelman, UPENN, TTree,
Andreas Hoecker, CERN/Atlas, TMVA,
Pierre Juillot, IN2P3, PostScript,
Folkert Koetsveld, Nijmegen, RooFit,
Alex Koutsman, Nikhef, RooFit,
Sven Kreiss, NYU, RooStats,
Wim Lavrijsen, LBNL, PyRoot,
Sergei Linev, GSI,
Benno List, Desy, MathCore and MathMore,
Anar Manafov, GSI,
Mike Marino, TUM, pyroot/tutorials
Ramon Medrano Llamas, University of Oviedo, PROOF
Biagio di Micco, Pythia8,
Lorenzo Moneta, CERN/SFT,
Axel Naumann, CERN/SFT,
Eddy Offermann, Renaissance,
Bartolomeu Rabacal, CERN/ADL, Math,
Fons Rademakers, CERN/SFT,
Paul Russo, FNAL,
Sangsu Ryu, KISTI, PROOF
Stefan Schmitt, Desy, TUnfold,
Gregory Schott, Karlsruhe/CMS, RooStats,
Benoit Speckel, IN2P3, Fonts,
Peter Speckmayer, CERN, CLIC, TMVA,
Joerg Stelzer, DESY/Atlas, TMVA,
Alja Tadel, CERN/CMS, Eve,
Matevz Tadel, CERN/Alice, Eve,
Jan Therhaag, University Bonn, ATLAS, TMVA,
Eckhard von Toerne, University Bonn, ATLAS, TMVA,
Wouter Verkerke, NIKHEF/Atlas, RooFit,
Helge Voss, MPI Heidelberg, LHCb, TMVA


Build system and Platform support








File Format

Run time performance

We introduced an optimized infrastructure for reading objects using a StreamerInfo. Rather than driving the streaming using a switch statement inside TStreamerInfo::ReadBuffer, the streaming is now driven using a simple loop over a sequence of configured StreamerInfo actions. This improves run-time performance by allowing a dramatic reduction in function calls and code branches at the expense of some code duplication. There are 3 versions of this loop implemented in TBufferFile and overloaded in TBufferXML and TBufferSQL:
  1. virtual Int_t ReadSequence(const TStreamerInfoActions::TActionSequence &sequence, void *object);

  2. virtual Int_t ReadSequenceVecPtr(const TStreamerInfoActions::TActionSequence &sequence, void *start_collection, void *end_collection);

  3. virtual Int_t ReadSequence(const TStreamerInfoActions::TActionSequence &sequence, void *start_collection, void *end_collection);

The 1st version is optimized to read a single object. The 2nd version is optimized to read the content of TClonesArrays and vectors of pointers to objects. The 3rd version is used to streamed any collections.

TBufferXML and TBufferSQL overload the loops to introduce extra code to help the buffer keep track of which streamer element is being streamed (this functionality is not used by TBufferFile.)

A TStreamerInfoActions::TActionSequence is an ordered sequence of configured actions.

A configured action has both an action which is a free standing function and a configuration object deriving from TStreamerInfoActions::TConfiguration. The configuration contains information that is specific to the action but varies from use to use, including the offset from the beginning of the object that needs to be updated. Other examples of configuration include the number of bits requested for storing a Double32_t or its factor and minimum.

When the sequence is intended for a collection, the sequence has a configuration object deriving from TStreamerInfoActions::TLoopConfiguration which contains for example the size of the element of a vector or the pointers to the iterators functions (see below).

Each TStreamerInfo has 2 reading sequences, one for object-wise reading (GetReadObjectWiseActions) and one for member-wise reading (GetReadMemberWiseActions) which is used when streaming a TClonesArray of a vector of pointer to the type of objects described by the TClass.

Each collection proxy has at least one reading sequences, one for the reading each version of the contained class layout.

Each case of the TStreamerInfo::ReadBuffer switch statement is replaced by 4 new action functions, one for the object wise reading, one for the member wise reading for TClonesArray and vector of pointers, one for the member wise reading for a vector of object and one for all other collections.

Each collection (proxy) needs to provide 5 new free standing functions:
   // Set of functions to iterate easily throught the collection
   static const Int_t fgIteratorArenaSize = 16; // greater than sizeof(void*) + sizeof(UInt_t)

   typedef void (*CreateIterators_t)(void *collection, void **begin_arena, void **end_arena);
   virtual CreateIterators_t GetFunctionCreateIterators(Bool_t read = kTRUE) = 0; 
   // begin_arena and end_arena should contain the location of a memory arena of size fgIteratorSize. 
   // If the collection iterator are of that size or less, the iterators will be constructed in place in those location (new with placement)
   // Otherwise the iterators will be allocated via a regular new and their address returned by modifying the value of begin_arena and end_arena.
   typedef void* (*CopyIterator_t)(void *dest, const void *source);
   virtual CopyIterator_t GetFunctionCopyIterator(Bool_t read = kTRUE) = 0;
   // Copy the iterator source, into dest.   dest should contain the location of a memory arena of size fgIteratorSize.
   // If the collection iterator is of that size or less, the iterator will be constructed in place in this location (new with placement)
   // Otherwise the iterator will be allocated via a regular new and its address returned by modifying the value of dest.
   typedef void* (*Next_t)(void *iter, const void *end);
   virtual Next_t GetFunctionNext(Bool_t read = kTRUE) = 0;
   // iter and end should be pointers to respectively an iterator to be incremented and the result of collection.end()
   // If the iterator has not reached the end of the collection, 'Next' increment the iterator 'iter' and return 0 if 
   // the iterator reached the end.
   // If the end was not reached, 'Next' returns the address of the content pointed to by the iterator before the 
   // incrementation ; if the collection contains pointers, 'Next' will return the value of the pointer.
   typedef void (*DeleteIterator_t)(void *iter);
   typedef void (*DeleteTwoIterators_t)(void *begin, void *end);

   virtual DeleteIterator_t GetFunctionDeleteIterator(Bool_t read = kTRUE) = 0;
   virtual DeleteTwoIterators_t GetFunctionDeleteTwoIterators(Bool_t read = kTRUE) = 0;
   // If the size of the iterator is greater than fgIteratorArenaSize, call delete on the addresses,
   // Otherwise just call the iterator's destructor.






TTree Scan and Draw


Histogram package













New TEfficiency class

New TKDE class

New TSVDUnfold class

TSVDUnfold implements the singular value decomposition based unfolding method proposed in NIM A372, 469 (1996) [hep-ph/9509307]. The regularisation is implemented as a discrete minimum curvature condition. This minimal implementation of TSVDUnfold provides unfolding of one-dimensional histograms with equal number of, not necessarily equidistant, bins in the measured and unfolded distributions. In addition to the unfolding itself, TSVDUnfold provides A toy example for the use of TSVDUnfold is included in the math tutorials (TSVDUnfoldExample.C).

New TH2Poly class

TH2Poly is a 2D Histogram class, inheriting from TH2, allowing to define polygonal bins of arbitary shape.

Each bin, in a TH2Poly histogram, is a TH2PolyBin object. TH2PolyBin is a very simple class containing the vertices, stored as TGraphs and TMultiGraphs, and the content of the polygonal bin.

Bins are defined using one of the AddBin() methods. The bins definition should be done before filling.

TH2Poly implements a partitioning algorithm to speed up bins' filling. The following very simple macro shows how to build and fill a TH2Poly:

   TH2Poly *h2p = new TH2Poly();

   Double_t x1[] = {0, 5, 5};
   Double_t y1[] = {0, 0, 5};
   Double_t x2[] = {0, -1, -1, 0};
   Double_t y2[] = {0, 0, -1, -1};
   Double_t x3[] = {4, 3, 0, 1, 2.4};
   Double_t y3[] = {4, 3.7, 1, 4.7, 3.5};

   h2p->AddBin(3, x1, y1);
   h2p->AddBin(3, x2, y2);
   h2p->AddBin(3, x3, y3);

   h2p->Fill(   3,    1, 3); // fill bin 1
   h2p->Fill(-0.5, -0.5, 7); // fill bin 2
   h2p->Fill(-0.7, -0.5, 1); // fill bin 2
   h2p->Fill(   1,    3, 5); // fill bin 3
More examples can be found in $ROOTSYS/tutorials/hist/:




Python 3 is now in principle supported: a problem remains with passing builtin types by reference, since the internal object layout has changed. There may be further problems with handling of char*: all strings are unicode in p3, so if the C++ code is meant to see the char* as byte*, that won't work.

Other significant feature improvements include:

Notable bug fixes include:

Math Libraries











Top-Level XML File

Channel XML Files



General Improvements

Profile Likelihood



TestStatSampler and TestStatistics




New Tutorials


TMVA version 4.1.0 is included in this root release. The most important new feature is the support for simulataneous classification of multiple output classes for several multi-variate methods. A lot of effort went into consolidation of the software, i.e. method performance and robustness, and framework stability. The changes with respect to ROOT 5.27 / TMVA 4.0.7 are in detail:



Bug fixes


TGeoElement, TGeoIsotope

New class TGeoIsotope inside the file TGeoElement.h/.cxx. This is done for compatibility with GEANT4 isotopes and elements. TGeoElement class now contains the number of nucleons and an array of possible isotopes (as in GEANT4). One can make isotopes of the same element:

TGeoIsotope *iso1 = new TGeoIsotope("U235", Z,N1,A1);
TGeoIsotope *iso2 = new TGeoIsotope("U238", Z,N2,A2);

then an element containing the 2 isotopes:

TGeoElement *elem = new TGeoElement("U_nat", "U", 2); elem->AddIsotope(iso1,abundance1_percent); elem->AddIsotope(iso2,abundance2_percent);

Then one can make normal materials based on such elements. Added getters for isotopes from elements, as well as an isotope table within TGeoElementTable with search method by name (and not supporting several isotopes with the same name). Existing material table updated to use the number of nucleons. Everything backward compatible.


Several fixes and support for new features: Support for reading isotopes via the GDML parser. Interaction length now automatically computed using the algorithm from GEANT4. Fixed parsing of composite shapes. G4Ellipsoid is now supported in conversions.



The method ReadPDGTable of TDatabasePDG was setting the stable flags for all particles regardless of their width.


The value reported in the fLifetime variable of TParticlePDG is in seconds while in the documentation is was indicated in nanoseconds.


Particles with a width greater than 1e-10 have now the stable flag set to 1.


New functions added in the interface:










Graphical Output

PostScript and PDF




  • Small boxes (less than one pixel width) were not drawn properly.
  • Line width for hollow boxes was always 1 (in batch mode).
  • Graphics Primitives

    New text font: Symbol italic

    New markers






    TCanvas and TPad

    3D Graphics Primitives



    Major changes

    Minor changes


    Major changes

    Minor changes



    ROOT page - Class index - Top of the page - Valid XHTML 1.0 Transitional