ROOT Version 5.18/00 Release Notes

ROOT version 5.18/00 has been released January 17, 2008. In case you are upgrading from version 5.14, please read the releases notes of version 5.16 in addition to these notes.

Binaries for all supported platforms are available at:
Versions for AFS have also been updated. See the list of supported platforms:

For more information, see:

The following people have contributed to this new version:
Roel Aaij,
Ilka Antcheva,
Silvia Arcelli,
Bertrand Bellenot,
Rene Brun,
Philippe Canal,
Olivier Couet,
Bastien Dallapiazza,
Frank Filthaut,
Valeri Fine,
Leo Franco,
Gerri Ganis,
Andrei Gheata,
Mihaela Gheata,
Andreas Hoecker,
Jan Iwaszkiewicz,
Anna Kreshuk,
Wim Lavrijsen,
Sergei Linev,
Diego Marcos-Segura,
Lorenzo Moneta,
Axel Naumann,
Valeriy Onuchin,
Timur Pocheptsov,
Fons Rademakers,
Paul Russo,
Magdalena Slawinska,
Peter Speckmayer,
Joerg Stelzer,
Scott Snyder,
Alja Tadel,
Matevz Tadel,
Zoltan Torzsok,
Long Tran-Thanh,
Wouter Verkerke,
Guido Volpi,
Helge Voss

ROOT Robutsness

This release has undergone an extensive, formalized testing procedure, using tools like valgrind and purify, regression tests, and timing studies. As a byproduct, the new file $ROOTSYS/etc/valgrind-root.supp removes irrelevant (and often distracting) parts of valgrind's reports. This is also useful when running valgrind on a program that uses ROOT. It can be used running valgrind -v --suppressions=$ROOTSYS/etc/valgrind-root.supp myprog.





Searching of reference guide now uses the relative URL, i.e. it respects the version. Simplified the library depedencies, always write the "last changed" field, show proper #include paths (i.e. only remove "include" for ROOT, not the full directory). Added static LoadAllLibs() that will load all libraries with a rootmap. Improve appearance of pages in TGHtml by hiding the tool box if no javascript. Implement multi-threaded MakeAll(), which doesn't work yet for "Begin_Macro" / "Begin_Latex" due to a TCanvas limitation. Fix for ROOT's new ViewVC. Increase font size of pre-blocks. Make sure return / member types are not wrapped.


        root [] n = new TNamed("myname","my title");
        root [] n->Write()
        Error in <TROOT::WriteTObject>: The current directory (Rint) is not
        associated with a file. The object (myname) has not been written.
        root [2] gDirectory = 0;
        root [3] n->Write();
        Error in <TNamed::Write>: The current directory (gDirectory) is null. The
        object (myname) has not been written.
             Int_t         fN;
             Double32_t   *fArr;  //[fN][-10,10,16]

Important Note about Class Versions

This version introduces support for transitioning classes from the mode where no class version is specified (and the checksum is always used for lookup) and a mode where the user specifies an explicit version number for the class (Allow for simplier, clearer data model evolution). The class version can be specified in 3 different ways:
  1. Use rootcint and add a ClassDef macro in the class declaration:
    	class MyClass {
  2. Use rootcint and add a RootClassVersion macro in the class source file:
  3. Use genreflex and specify a ClassVersion property in the selection.xml :
           <class name="MyClass" ClassVersion="10"/>
Those 3 solutions set the class version of MyClass's TClass object to 10.

In order to avoid a clash between this class version (and any future class versions) and the class versions given by default to the non-versioned layout of the class, you MUST set this class version to a number that is greater than the number of distinct non-versioned layout. Otherwise you may see warning messages like:

Warning in TStreamerInfo::BuildCheck: 
   The class MyClass transitioned from not having a specified class version
   to having a specified class version (the current class version is 2).
   However too many different non-versioned layouts of the class have been
   loaded so far.  This prevent the proper reading of objects written with
   the class layout version 3, in particular from the file:
Addition Details:

When loading a file containing a non-versioned layout of a class, this layout is assigned the next 'free' number in the list of StreamerInfo. In particular this means that if many files with non-versioned layout of the class are loaded before the loading of a library containing a versioned class layout, the slot reserved for this version layout may already be occupied and you will get the following error message:

   The class MyClass transitioned from not having a specified class version
   to having a specified class version (the current class version is 2).
   However too many different non-versioned layouts of the class have
   already been loaded so far.  To work around this problem you can
   load fewer 'old' file in the same ROOT session or load the C++ library
   describing the class MyClass before opening the files or increase the
   version number of the class for example ClassDef(MyClass,3).
   Do not try to write objects with the current class definition,
   the files might not be readable.
Also if many files with non-versioned layout of the class are read before a file with a versioned layout (and this number is too low), you may get the following error message:
Warning in TStreamerInfo::BuildCheck: 
   The class MyClass transitioned from not having a specified class version
   to having a specified class version (the current class version is 2).
   However too many different non-versioned layouts of the class have been
   loaded so far.  This prevent the proper reading of objects written with
   the class layout version 3, in particular from the file:


Dcache Plugin:

XROOTD plugin




THnSparse: An efficient Multi Dimensionnal Histogram class

The new abstract class THnSparse with its incarnations THnSparseF, THnSparseD, THnSparseC, etc, allows to histogram data in an arbitrary number of dimensions. A traditional ("naive") approach using n-dimensional arrays like for TH1-TH3 for dimensions higher than 3 is not viable due to its memory needs. Instead a sparse algorithm with very high fill and read bandwidth is used, where only bins with entries are stored in memory. The macro tutorials/hist/sparsehist.C compares the performance of array and sparse implementations. THnSparse aims in offering the same functionality as TH1-TH3; the most important interfaces are already available. Visualization of this histogram can currently be done using a temporary tree as shown in tutorials/tree/drawsparse.C.

New default values for Projection, Profile, Smooth

Many default values for bin numbers were inconsistent. Now all histogram classes follow these rules: If your code explicitly specify the default values, e.g. because you change a parameter behind the first / lastbin, you will need to change the bin numbers, e.g. to h2->FitSlicesX(f2,0,-1,1,"qln"); You will not notice this change if you did not specify the default bin numbers (e.g. h2->ProjectionX(); or of you specified non-default values (e.g. h2->ProfileX("xprof");).


        Long64_t TBranch::GetTotBytes(Option_t *option) const
           // Return total number of bytes in the branch (excluding current buffer)
           // if option ="*" includes all sub-branches of this branch too
        Long64_t TBranch::GetZipBytes(Option_t *option) const
           // Return total number of zip bytes in the branch
           // if option ="*" includes all sub-branches of this branch too



MathCore contains now the majority of the statistical functions. They statistical functions are all defined in the header file Math/DistFunc.h. The special function in the heqader file Math/SpecFunc.h. When running CINT it is not needed anymore to load the MathCore (or MathMore ) library when invoking a mathematical functions defined in these header file. The library is loaded automatically by including the header file. For example :

root> #include <Math/DistFunc.h>            // load automatically 
root> ROOT::Math::chisquared_cdf_c(11,10)  // to get chisquare probability (equivalent to TMath::Prob)

In detail, the changes for this realease are:

Further changes in MathCore are:

A new test has been added in $ROOTSYS/test, stressMathCore testing mathematical functions, physics vectors and matrices including I/O.

More detailed description of the current MathCore release (and the other Math libraries) can be found at this location.


This new release contains:

A new test has been added in $ROOTSYS/test, stressMathMore testing numerical integration, derivation and root finding algorithm

More detailed description of the current MathMore release can be found at this location.







New features in 5.17/02

New features in 5.17/04 (RooFit 2.20)

In addition the following fixes and improvements have been made

New features in 5.17/06 (RooFit 2.23)


The following list contains the changes since ROOT release 5.16/00 Remark: We are developing a new, more flexible TMVA design, which supports the boosting and combination of arbitrary base classifiers. While this code is ready, there was not enough time to perform all the test its robustness, and we were reluctant to put it into this production release of ROOT. It will follow in one of the next development releases.


Eve - Event Visualization Environment - is a new module in ROOT, based on experiment-independant part of the ALICE event display developed in cooperation between ALICE offline project and ROOT during the last two years. It has been used in ALICE for more than a year to perform high-level event visualization, debugging of simulation and reconstruction code as well as for raw-data visualization.

The components of Eve also allow for a very efficient construction of simple event-displays that do not rely on any external framework. For example, if one wants to visualize clusters and tracks stored in a ROOT file, one can simply use TFile::MakeProject() function to automatically generate class declarations and dictionaries on the fly and use them to access the experiment data in a format that mimics its native representation, including class members and containers. From that, visual representations of objects can be created via simple CINT scripts. See a complete example for display of ALICE ESD tracks and clusters in tutorials/eve/alice_esd.C.

Eve is built on top of ROOT's GUI, GL and GED infrastructure and delivers the following main features:


Spider Plots

The new class TSpider allows to produce spider plots from a TTree.

A spider view is a handsome way to visualize a set of data stored in a TTree. It draws as many polar axes as selected data members. For each of them, it draws on the axis the position of the present event between the min and max of the data member.

TTreeViewer allows to scan a TTree using a spider view. Via the SPIDER button. See new tutorial $ROOTSYS/tutorials/tree/spider.C.

Spider Plot

Parallel Coordinates Plots

A set of new classes implement the Parallel Coordinates graphs and Candle stick charts:


The multidimensional system of Parallel coordinates is a common way of studying high-dimensional geometry and visualizing multivariate problems. To show a set of points in an n-dimensional space, a backdrop is drawn consisting of n parallel lines. A point in n-dimensional space is represented as a polyline with vertices on the parallel axes; the position of the vertex on the i-th axis corresponds to the i-th coordinate of the point. See new tutorial $ROOTSYS/tutorials/tree/parallelcoord.C.

Parallel Coordinates
This tool comes with a rather large gui in the editor. It is necessary to use this editor in order to explore a data set, as explained below.

Reduce cluttering:

The main issue for parallel coordinates is the very high cluttering of the output when dealing with large data set. Two techniques have been implemented to bypass that so far:

Candle chart

TParallelCoord can also be used to display a candle chart. In that mode, every variable is drawn in the same scale. The candle chart can be combined with the parallel coordinates mode, drawing the candle sticks over the axes.

Parallel Coordinates with Candle Chart


Class containing a variable for the TParallelCoord. Appears as an axis on the pad.

Options can be defined each axis separatly using the right mouse click. These options can be applied to every axes using the editor.


A TParallelCoordRange is a range used for parallel coordinates plots. It defines a range owned by a selection on an axis.


A TParallelCoordSelect is a specialised TList to hold TParallelCoordRanges used by TParallelCoord.

Selections of specific entries can be defined over the data set using parallel coordinates. With that representation, a selection is an ensemble of ranges defined on the axes. Ranges defined on the same axis are conjugated with OR (an entry must be in one or the other ranges to be selected). Ranges on different axes are are conjugated with AND (an entry must be in all the ranges to be selected). Several selections can be defined with different colors. It is possible to generate an entry list from a given selection and apply it to the tree using the editor ("Apply to tree" button).


This is the TParallelCoord editor. It brings tools to explore datas using parallel coordinates. The main tools are:
TParallelCoord Editor


Corrected the fact that if WaitPrimitive is called with an empty argument, it unintentionally matched any unamed primitive in the canvas.

Quality Assurance (QA) / stressGraphics

stressGraphics.cxx has been extended to test almost all graphics primitives. This work is still on going.

stressGraphics has now 38 tests each of them testing one particular graphics primitive or graphics feature.

stressGraphics is meant to be run in batch mode.

The procedure:

For each test, stressGraphics does the following:
  1. Run the test and generate the corresponding PS file.
  2. Compare the size of the PS file with a reference size stored in the file stressGraphics.ref. An error is allowed because some tests use random numbers and also the size may depend on which machine the test runs. The error for each test is also stored in stressGraphics.ref.
  3. The .C file corresponding to the test is generated (SavePrimitives).
  4. The PS file is generated form the .C file obtained.

For points 2) and 4) the test is considered as OK if the PS file size correspond to the file size stored in stressGraphics.ref (within the error) otherwise the test is marked as FAILED.

When a test FAILED all the generated PS and .C files are kept for further investigation otherwise (if the test is OK) they are removed.

stressGraphics should be run as standalone compiled (option -g -O2) program and also in the CINT context:

$ ./stressGraphics

root [0] .L stressGraphics.cxx
root [1] stressGraphics()     

root [0] .x stressGraphics.cxx

This procedure allowed to find several problems in particular uninitialized variables and memory leaks. It will be extended in order to make ROOT graphics more robust.




PaintEllipse() now uses the FillStyle to control wether or not a filled area should be painted in case a closed ellipse. It used wrongly the FillColor unlike the case of an open ellipse.


The option 'l' is now available for PostScript also.


Take into account the title offsets in x,y when generating a TH3.

TGraph, TGraphErrors, TGraphAsymmErrors, TGraphBentErrors and TMultiGraph

The SavePrimitive mechanism did not work properly. In particular it was not possible to save various kind of graphs in several multigraph in the same macro. Also in case of TGraph the generated macro was wrong (Add() was missing).

In TGraphBentErrors the signatures of the two SetPointError methods were incomplete. The shift values in the various directions were missing. To preserve the backward compatibility, the missing parameters have been added with default value = 0. The new signature is now used in SavePrimitive which allows a correct saving of the TGraphBentErrors.


Implement the following changes:





DistancetoPimitive and ExecuteEvent are now implemented.

Axis painting

In some case the labels "-0" was generated. This problem was visible with the following commands:
   TH2D *s = new TH2D("s","",10,0,100,10,-9e-4,5e-4);


Some attributes were not saved by SavePrimitive(): TitleSize, TitleColor, TitleFont. Now they are.


The dark and bright colors are now taken from TColor.


(Guido Volpi)


(Valeriy Onuchin)




New option to not draw the polar labels.

TLegend, TPaveStats, TPaveText.cxx


In the PS files the page numbers are now written between ().


After zooming and unzooming on a plot containning several TF1 drawn with the option SAME, the functions might be truncated. This problem was visible with the following macro:
   TF1* f[6];
   double fg(double *x, double *p) {return sin((*p)*(*x));}
   void test_zoom() {
      for (int i=0;i<6;++i) {
         f[i]=new TF1(Form("f%d",i),fg, 0,2, 1);

TH1 titles

SetTitle now allows to have ";" (semicolon) in the histogram title and in the axis title. "#;" is a control character allowing to define the title and the axis title at the same time. To put a ";" in the titles, it is now enough to write ";" or "#semicolon".

TGX11 (low level X11 pilot)

In TGX11::SetMarkerType replace the statement
          gMarker.xy[i] = xy[i];
with the lines
          gMarker.xy[i].x = xy[i].x;
          gMarker.xy[i].x = xy[i].y;
to bypass a bug in gcc4.2 with a wrong inlining of a copy constructor. (found by Christian Hom)



Add function virtual void ObjectPaint(TObject*, Option_t*).


Implement virtual TVirtualViewer3D::ObjectPaint().

TGLCamera - TGLPerspectiveCamera - TGLOrthoCamera

Introduce two transformation matrices to clearly define movement of camera around the center point. The first transformation matrix fCamBase defines the coordinate system placed at the camera center point with camera up-vector as the third base vector. The second transformation matrix fCamTrans defines the camera transformation relative to fCamBase.

Implement a common Truck(), Rotate() and Dolly() function for orthographic and perspective camera.

Implement an option to define camera center point externally. Center can also be determined via picking.


Add new functions to get/set the base vectors directly.


Add member UInt_t fgDefaultDrawQuality.


Bug fixed in Diagonal(), integer calculation overflowed.


Make interface to draw camera center point. Add option to disable/enable depth test when drawing axis guides.


Add GUI to manipulate camera center and to disable/enable depth test when drawing axis guides.


Change layout of labeled number entries.


Fix positioning of front light. White-space consolidation.


Fix positioning of front light. White-space consolidation.


Put GUI for the 6 lights in two columns.

Tutorial glViewerExercise.C

Follow-up on changes in TGLCamera. Enable rotation on orthographic camera.

Tutorial glViewerLOD.C

Workaround for cint bug with switch statements.

TGLLegoPainter, TGLPlotPainter, etc ..

Fix the problem reported here:


Added the TPyDispatcher class that allows for easy programming of callbacks from CINT into python, for the benefit of GUIs. For example (a more complete example is included as tutorials/pyroot/

# create callback function
def MyFunction():
   print 'MyFunction was called!'

# instantiate dispatcher object
disp = ROOT.TPyDispatcher( MyFunction )

# upon clicking SomeButtonWidget, 'MyFunction' will now be called
SomeButtonWidget.Connect( 'Clicked()', "TPyDispatcher", disp, 'Dispatch()' )

A limited API, usable from both C++ and CINT, is made available through the TPython class. In particular, the two functions:

void* ObjectProxy_AsVoidPtr( PyObject* pyobject );
PyObject* ObjectProxy_FromVoidPtr( void* addr, const char* classname );
allow conversion from and to PyROOT bound objects.

New Tutorials

ROOT page - Class index - Top of the page