ROOT version 3.10/02 Release Notes

The ROOT Team is pleased to announce the release of ROOT version 3.10/02.

This new, backward compatible, version has major enhancements described
in the attachment.

Binaries for all supported platforms are available at:

Versions for AFS have also been updated. See the list of supported platforms:

Both links are reachable via the download page. Note that with this release,
we are supporting binaries for more platforms/compilers.

A new version of the USERS GUIDE is available at:
Individual pdf files corresponding to each chapter can be downloaded separately.

For more information, see:

Ilka Antcheva,
Maarten Ballintijn,
Bertrand Bellenot,
Rene Brun,
Philippe Canal,
Olivier Couet,
Gerri Ganis,
Andrei Gheata,
Masaharu Goto,
Eddy Offermann,
Valeriy Onuchin,
Fons Rademakers



Latest version of CINT. For the main new features see the CINT
release notes:


The '+' option now properly recreates the library when the script or one
of the file it includes is newer than the shared library.
When asked to load a script (file.C) which has already been compiled
(into, ACLiC looks for a dependency file (file_C.d).
If this dependency file is older than the library or does not exist, ACLiC
generates a new dependency file using ROOT's rmkdepend tool and the list
of -I and -D directives it knows  about (see ACLiC description on how to
set those).     Then ACLiC compare the time stamp of all the files listed
in the dependency file and rebuild the library if any of them is newer than
the library

TSystem:CompileMacro has a new option: 'c' which tells ACLiC to compile
and link the shared library but do not load it.  This allows using ACLiC in
makefile to link shared library even if there are not "closed" (except on
platform that do not support this (i.e. Windows, Aix, etc.)).

added ACLiC.IncludePaths (in the attached patch)
   # Add additional include directives for ACLiC compilations
   #ACLiC.IncludePaths:     -I/where/the/includes/are

Added ACLiC.BuildDir and the corresponding TSystem::SetBuildDir to allow
the customization of the ACLiC build directory.

Allow "@" in filenames.
Allows dash in include path name in ACLiC.

ACLiC is now able to compile scripts which are on a disk which is not the
current disk and/or to use a build dir on a different disk (actually, it also
repairs SetBuildDir in the usual case).

Full native support for 64 bit integers

ROOT supports now on all platforms 64 integers via the portable typedefs
Long64_t and ULong64_t.

Changes in TSystem

Floating point exception control

Available via TSystem two new methods for floating point exception control:
   Int_t           GetFPEMask();
   Int_t           SetFPEMask(Int_t mask = kDefaultMask);
to get and set the Floating Point Exceptions control. Implementations for
Linux (Maarten), Mac OS X (Federico) and Windows (Bertrand).

Getting user info

New methods to get user info:
   virtual Int_t           GetUid(const char *user = 0);
   virtual Int_t           GetGid(const char *group = 0);
   virtual UserGroup_t    *GetUserInfo(Int_t uid);
   virtual UserGroup_t    *GetUserInfo(const char *user = 0);
   virtual UserGroup_t    *GetGroupInfo(Int_t gid);
   virtual UserGroup_t    *GetGroupInfo(const char *group = 0);
The returned structure is defined in TSystem.h and is:
   struct UserGroup_t {
      Int_t    fUid;          // user id
      Int_t    fGid;          // group id
      TString  fUser;         // user name
      TString  fGroup;        // group name
      TString  fPasswd;       // password
      TString  fRealName;     // user full name
      TString  fShell;        // user preferred shell

Tempfile handling

New methods:
using these methods removes the use mkstemp warning on linux.

Plugin Manager

New features in the plugin manager: constructors can now be global functions.
In the rootrc file a global function is specified by starting the ctor with
"::". Also added support for plugin macros, instead of the lib name just
use the macro name (typically myplugin.C). The macro will be searched for in
the standard macro path.

Geometry package

The list of improvements and new features from Andrei Gheata is far too long
to be described here. Read the new chapter describing the package
in the new USERS GUIDE. You can download only the chapter about the Geometry
Many thanks to Mihaela Gheata for this new chapter.


A new interface to the Virtual Monte Carlo has been released.
For more details, see:

Via the VMC, you can
  -run an existing Geant3 program using the new Geometry package
  -design a MC application that can run with Geant3, Geant4 or Fluka
The Fluka interface is currently being implemented by Alice.


Add a new option "R" in TFile::Close().

 if option == "R", all TProcessIDs referenced by this file are deleted.
 Calling TFile::Close("R") might be necessary in case one reads a long list
 of files having TRef, writing some of the referenced objects or TRef
 to a new file. If the TRef or referenced objects of the file being closed
 will not be referenced again, it is possible to minimize the size
 of the TProcessID data structures in memory by forcing a delete of
 the unused TProcessID.


Add capability to read directory structures via RFIO. This works via
the TRFIOSystem helper class (which derives from TSystem) that is loaded
by the plugin manager whenever one tries to access an rfio directory or
file. This helper class is used in the actual system class (TUnixSystem,


A TCastorFile is like a normal TNetFile except that it obtains the
remote node (disk server) via the CASTOR API, once the disk server
and the local file path are determined, the file will be accessed
via the rootd daemon. File names have to be specified like:
The TCastorFile plugin will be automatically loaded via the plugin
manager when accessed via TFile::Open().
The patch level of libshift should be at least 1.5.x (which is the one
installed on all CERN machines in /usr/local).
The CASTOR HSM interface code is provided by Jean-Damien Durand of the
CASTOR team.


A TDCacheFile is like a normal TFile except that it may read and
write its data via a dCache server (for more on the dCache daemon
see Given a path which doesn't belong
to the dCache managed filesystem, it falls back to the ordinary
TFile behavior.
The TDCacheFile plugin will be automatically loaded via the plugin
manager when accessed via TFile::Open().

Add capability to read directory structures via dCache. This works via
the TDCacheSystem helper class (which derives from TSystem) that is loaded
by the plugin manager whenever one tries to access an dCache directory or
file. This helper class is used in the actual system class (TUnixSystem,


A TChirpFile is like a normal TFile except that it may read and
write its data via a Chirp server (for more on the Chirp protocol
The TChirpFile plugin will be automatically loaded via the plugin
manager when accessed via TFile::Open().

The ZIP package performance improved

Very nice performance improvement in the ZIP system by Michal Kapala.
Some facts: by putting the files: Tree.c, Bits.c and Deflate.c in a single
C file (with some small changes), what makes the 'level' variable appear
in only one copy, I've increased the result of the 'stress' benchmarking
program from 584 RM to 701 RM -- 20% improvement. At the same time, the
size of all compressed data increased by about 1.7%. (Itanium 1000 MHz
machine, Intel compiler v8.0 with -O3 and profile-guided optimization).


The rootd daemon uses the new authentication methods described
in detail in (see also next item):

Client/Server Authentication

Client/Server authentication for access to data on remote hosts
(via the rootd daemon) or to a PROOF cluster has been deeply
restructured. We describe here the new features and functionalities.
More details can be found in:


New methods

The three available authentication methods ("UsrPwd", via /etc/passwd
or .rootdpass; "SRP", using the Stanford Secure Remote Password
protocol; "Krb5", using Kerberos) have been supplemented with
three additional methods:

  - "Globus" uses the security part of the Globus Tool Kit
    ( to establish a security context between client
    and server based on globus user proxies and host globus
    certificates and keys.

  - "SSH" delegates authentication to a local sshd daemon which
    then communicates the result to the requesting rootd/proofd.

  - "UidGid" requires the match of local and user and group ID;
    this insecure method is supported for fast controlled access
    in cases where security is not an issue.

In addition, password exchange in the "UsrPwd" method has been
secured by means of RSA asymmetric encryption. A simple RSA encdec
package written by Martin Nicolay (see clib/src/rsalib.c) has been
adapted to (and distributed with) ROOT; it is foreseen to support
use of SSL RSA in the near future.

Support for re-usability

The possibility to reuse a successful authentication has been added.
If the reuse feature is requested, a unique token is randomly
generated by the server and assigned to an established security
context; this token is secure-transmitted to the client and can be
used for subsequent authentications.

Support for access control

The possibility to control daemon access has been added. The file
<Root_Dir>/etc/system.rootdaemonrc defines the policy of the daemon
servers. Entries in the file specify a list of methods accepted
to access a specified daemon (rootd or proofd) from a given host or
domain; it is also possible to specify user-dependent rules.

Support for negotiation

The possibility for client and server to negotiate the method to be
used has been added. Negotiation is activated if the method
first chosen by the client either fails or is not accepted by the
server. In such a case the server sends back the list of methods
accepted and not yet attempted by the client. The client tries
next available method, and so on until an attempt is successful
or all the available methods have been tried.

Credential export in PROOF

For PROOF, a delicate point is the export of the credentials for
Master-to-Slave authentication and further authentications performed
by slaves. This has been fully automatized for all the methods
available (except for SSH, for which the manual setting of the key
files on the master and slaves is needed). In particular, manual
setup of the .netrc or .rootnetrc files on master/slaves is no
longer mandatory for the SRP method, since it is now possible to
choose secure-forwarding of passwords over the net.

New classes and modules

As a product of the restructuring of the authentication part, a new
module, called 'rpdutils', has been created with all the tools used
in common by the rootd and proofd daemons. This allowed to drop many
duplications, in particular for what concerns error reporting,
networking and authentication.
Moreover, two new authentication-related classes have been added:

  THostAuth: This class contains directives for authentication to a
  remote host as a given user; it specifies a list of available methods,
  in order of preference, and for each method it gives the details relevant
  to define the kind of security context to be established.

  TAuthDetails: This class contains the details of a successful
  authentication like the remote host and username, and the information
  needed to reuse the security context, the unique token and the offset
  in the remote authentication table file.


Implement Kerberos forwarding ticket in the PROOF/ROOTD protocols.

Tutorial macro: TestAuth.C

This macro can be run to test the available authentication methods.
See README/README.AUTH for a description of the available options,
for an example of the output and for tips in case of problems.

TMath improvements
Several new functions or improvements to TMath:
see Poisson, PoissonI, Gaus, BreitWigner, Struve, Locmin, Locmax, IsInside

rootcint, TClass, TTree (i.e. general I/O)

Improved support for multiple inheritance.

Prevented the splitting of TCollection of objects (except TClonesArray).
Corrected a few cases where the TClonesArray were incorrectly split or
analyzed (by TTreeFormula).

Start supporting virtual inheritance (not finished).

TKey::ReadObj now returns '0' when it fails.

Improved the error recovery in the case where TBuffer::ReadObjectAny()
decides it wont be able to read/load the objects.  By calling
CheckByteCount() explicitly we prevent an extra spurious error message
of the style 'some top level class Streamer is out of sync'.

In the TKey constructor add a protection in case the compression algorithm
cannot compress the buffer. This protection was already in place in TBasket
for the case of Trees.

TStreamerInfo::New() has been updated to properly initialize pointers
and array of objects.


Fixed a bug which prevented TTree::Draw() to look in the base classes
of 'Emulated Classes' (classes for which the library code is not loaded).


Properly use TEMP, TMP or . on windows (instead of c:).

Support nested unions and enumerations for Foreign Classes.

Add support for the .c++ extension for the dictionary name.

Rootcint now correctly detects the presence of a default
constructor in some cases of template classes.


New function HasDefaultConstructor() which return true if a
default constructor is available through fNew OR through the interpreter.

Improve the handling of (re)loading libraries.

Fixed the fact that due to an omission in the code, operator<< (or
more exactly TClass::Streamer) was callable only once TBuffer instance
for instrumented classes not inheriting from TObject per run.  (i.e. it
was remembering its arguments at the first call and was using it for
ALL subsequent calls).


New abstract interface that enables the implementation of alternate way of
population the ROOT class system.


New function TROOT::AddClassGenerator(ROOT::TClassGenerator *)
All the ROOT::TClassGenerator object that have registered will be called (in
order) when the usual TROOT::GetClass fails.

Fix the fact that TROOT::GetGlobalFunction() had the side effect of
creating the byte code for ALL the CINT global function (even if they
crash cint but are never used). Also the current code was different
for Windows and Unix. Also it now fully relies on
TFunction::GetMangledName() which is now cached. The fact that it was
not cached was also causing problems when the file was reload.

Support ROOTDEBUG environment variable, its value is used to set gDebug
at startup and overrides the value in a rootrc file. Convenient to quickly
turn on debug mode in TROOT startup.


Add new option kWriteDelete in TObject::Write().
The option can be a combination of: kSingleKey, kOverwrite or kWriteDelete.
Using the kOverwrite option a previous key with the same name is
overwritten. The previous key is deleted before writing the new object.
Using the kWriteDelete option a previous key with the same name is
deleted only after the new object has been written. This option
is safer than kOverwrite but it is slower.


The memory limitation of TString's Format() has been removed.

Two new methods to read from stdio:
   Bool_t   Fgets(FILE *fp);
   void     Fputs(FILE *fp);
This facilitates often recurring code around pipes.


Add the ability to call any global and class static C++ function which takes
numerical arguments and return numerical arguments from a TFormula
expression. For example:
   f = new TFormula("f","cos(3)*TMath::Pi()");
   TF1 *f = new TF1("f1","TMath::BreitWigner(fPx.[0],[1])");

Fix a problem  when TFormula encounters "(x+[8])^7" as part of the 2nd (or
later) TFormula in a expression (like 'shirt' in  "(f1-shift)*0.60".)
TFormula was 'forgetting' to increments the parameters index.  The
consequence is that with shift similar to "[7]*(x+[8])^7" doing f1-shirt
resulted in (conceptually):
   f1 - [15]*(x+[8])^7
instead of
   f1 - [15]*(x+[16])^7

TFormula now
- allows numerical value of the format d*[.d*][e-+]d* where d is a
   digit and hexadecimal: 0xH* where H is a digit or a through f.
- disallows explicitly more that one decimal point
- disallows explicitly decimal point in the exponent part
- disallows trailing characters after a decimal point

TFormula::Analyze() now checks whether an expression is numerical
__before__ checking whether it is a defined variable.
Without this patch doing something as simple as:
could fail depending on the structure of the tree. In particular, if a new
'weird' branch is added to a tree, those statement might now lead to core
dumps event if the new branch is not being used (the core dumps should
not be happening in the first place ... but this is enhance stability).

Correct the precedent of the token '"' to have precedence over all other
tokens (previous it had the lowest priority), hence allowing the other
tokens to be inside a string.


Add an optional argument to TTree::AutoSave():
  if option contains "SaveSelf", gDirectory->SaveSelf() is called.
  This allows another process to analyze the Tree while the Tree is being

  By default the previous header is deleted after having written the new
  header. If option contains "Overwrite", the previous Tree header is
  deleted before written the new header. This option is slightly faster, but
  the default option is safer in case of a problem (disk quota exceeded)
  when writing the new header.

Add an example with two scripts treew.C and treer.C showing how to write a
Tree in one process and view it from another process.

Add a new function TTree::SetEntries(Double_t n).
This new function may be useful when filling branches one by one via
TBranch::Fill() without calling TTree::Fill().

Add new function:

 void TTree::SetFileNumber(Int_t number)
   Set fFileNumber to number.
   fFileNumber is used by TTree::Fill to set the file name
   for a new file to be created when the current file exceeds fgTreeMaxSize.
    (see TTree::ChangeFile)
   if fFileNumber=10, the new file name will have a suffix "_11",
   ie, fFileNumber is incremented before setting the file name

Update BuildIndex to elegantly fail if the given index do not produces exactly
one value per entry.


Replace the generation of a TPolyMarker by a TGraph when
generating 2-d plots in tree.Draw("y:x").
With this change, one can use all the features of a TGraph, like
additional drawing options "l" or TGraph::Fit().
For example the following command
produces a scatter plot with the points corresponding to the
original coordinates x and y. After the command, one can access
the TGraph object in the pad with
   TGraph *g = (TGraph*)gPad->GetPrimitive("Graph");

The following command
will produce a TGraph connecting all the points with a line.

Implement support for 4 dimensions in TTree::Draw.
When doing tree.Draw("x:y:z:u"), the variable "u" is mapped to a color number.
A 3-d scatter plot is generated with ncolors TPolymarker3D objects attached
to the produced histogram list of functions.

Allow the TTree::Drawing a TBits object. I.e.
will create a 1D histogram from 0 to nbits which is filled for
each bit number which is non-null.

now properly apply the actual weight and reapply the event list cut.

TSelectorDraw was fixed to distinguish the scope operator and it's own variable

TTreeFormula (affects TTree::Scan() and TTree::Draw())

The evaluation of operator && (and ||) is now optimized so that if the left
hand of the expression is false (true) then     the right part is not
evaluated, thus avoiding to load in memory part of the TTree that are not

Added support for nested arrays.

Repaired a few problems related to unusual class layout and splitting involving


TTree::Scan() was enhanced to print the content of arrays inside an entry.
It now prints one row per array elements per entry.
Arrays (within an entry) are printed in their linear forms.  If several
arrays with multiple dimensions are printed together, they will NOT be
synchronized.  For example printing arr1[4][2] and arr2[2][3] will results in
a printing similar to:

*    Row   * Instance *      arr1 *      arr2 *
*0 *0 * arr1[0][0]* arr2[0][0]*
*0 *1 * arr1[0][1]* arr2[0][1]*
*0 *2 * arr1[1][0]* arr2[0][2]*
*0 *3 * arr1[1][1]* arr2[1][0]*
*0 *4 * arr1[2][0]* arr2[1][1]*
*0 *5 * arr1[2][1]* arr2[1][2]*
*0 *6 * arr1[3][0]*   *
*0 *7 * arr1[3][1]*   *
*1 *0 * arr1[0][0]* arr2[0][0]*
*1 *1 * arr1[0][1]* arr2[0][1]*
*1 *2 * arr1[1][0]* arr2[0][2]*
*1 *3 * arr1[1][1]* arr2[1][0]*
*1 *4 * arr1[2][0]* arr2[1][1]*
*1 *5 * arr1[2][1]* arr2[1][2]*
*1 *6 * arr1[3][0]*   *
*1 *7 * arr1[3][1]*   *

To limit the number of elements printed per array, use the option
will print at most 3 elements per entry.
If no selection is specified, there is always a least one line per entry
(possibly empty) If a selection is specified, an entry is printed if and only
if a least one of the sub-element exist and match the selection.


A fix in TBranchElement::SetAddress for the case of a vector embedded
in an object embedded in an object which is inherited from.
The old code thought there was a missing branch in the branch hierarchy
because the actual parent class inherited from the branch's class instead
of being equal to it.

TNtuple, TNtupleD

Add new function ReadFile() in TNtuple and TNtupleD
Int_t TNtuple::ReadFile(const char *filename)
  read from filename as many columns as variables in the ntuple
  the function returns the number of rows found in the file.


In the case where the tree contains 2 top level objects which happen to
have a data member that has the same name, the variable name for the
branch pointer in the class created by MakeClass (i.e. b_branchname)
was identical. This corrects the situation.

Repaired the creation of event list in TTree::Draw() when the
selection criteria is an array (The broken implementation lead to core dumps
is a regular draw with array was done before the draw event list and resulted
in an empty event list in some cases).

Prevented a core dump if the user double click in the TBrowser on a
non-split leaf. It also reduces to 1 the number of message warning that
TSelectorDraw does not know how to histogram this type of objects (it only
know how to histogram TBits and numerical types).


Changes in the tree viewer are:
- modified help text for opening trees and session.
- a record (produced for a valid X/Y/Z + drawing option selection when
  clicking the red button) will get now the same name as the histogram.
- the treeviewer constructors define a variable gTV that can be accessed
  only from interpreter to get a pointer to the treeviewer. This can be
  used to append one or more new trees by pointer: new method
  AppendTree() implemented. This is explained in the help menu Open/Load.

Several layout improvement and changes. New Refresh button.


Solved a few issues related to the usage of TTreeFriend in conjunction with
TChain objects.

SetBranchStatus() can now also set the status of TTreeFriends

Fix SetBranchAddress for few cases of unusual class layout.

Improved TTree::CloneTree.
CloneTree can now be called on a TChain object without needing to set
the address before hand. This is accomplished by making sure that default
addresses are created before passing it to the clone and keeping a list
of cloned trees and inform them when an address change. Also hard to trace
memory errors due to the 'link' between the original and the cloned tree
are removed by making the original reset all the addresses of the cloned
tree whenever the original tree/chain is deleted.

Added the concept of TTree variable alias: To use them:
Note that the aliases have been added to the TTree object so that they can
be persistent (with the tree) if you choose.
Also note that the alias are not checked for validity until they are used
in a Draw or Scan command.
Existing alias are silently replaced.
The new functions are:

Added the capability to transfer buffer directly from one tree to another
without creating the contained objects or even without uncompressing the
buffer (in the case where there is only one object in the buffer).

TTree::CopyEntries() does not anymore open all the files in a chain before
starting the copy of the entries.

In TChain::Merge(), implement a new option "keep" to not close the file
after Merging.

If the filename points to a directory it looks like TFile::Open() returns 0.
A fix in TChain::LoadTree() reacts properly to this case.

TUrl class

For the special protocols: file, rfio, hpss, castor, dcache and dcap
also support the valid notation:


Interface to AliEn Grid system

Big update of TGrid and related classes, and updated TAlien plugin for the
AliEn grid system. To build the TAlien plugin one needs to install the
AliEn client API lib. How the basic TGrid class works with AliEn is
described in the file README/README.ALIEN.
Also provided is a Grid/AliEn controlled distribution and startup system
for PROOF. This uses the TGridProof/TAlienProof classes and the LFN/PFN
information in the TDSet to find the AliEn sites where the data resides.
On these sites PROOF daemons (proofd) are started by AliEn (using an
interactive submission queue). Once the proofd's are running standard
PROOF is started which then connects to these proofd's. After that the
user performs his analysis, like on a local PROOF cluster.


Many improvements in the PROOF system:

- improvements in the Package Manager and Sandbox.
- improved packetizer (work distributor).
- interface to AliEn grid system via the TGridProof/TAlienProof classes.
- interface to Condor Computing on Demand via TCondor class.
- query progress dialog
- introduced the Package Manager:
   The package manager allows the distribution, installation and setting
   up of user code in the PROOF sandbox environment.
   The package manager distributes so called PAR files, which are standard
   tarred and gziped files, but with extension .par. A file "mylibs.par" is
   required to untar into a directory "mylibs". A PAR file contains in addition
   to the user's code and libraries one special directory PROOF-INF that contains
   two scripts: and SETUP.C. is a shell script that is
   used to build the user's libraries on the PROOF cluster (which might be
   of a different architecture/compiler then the user's machine). SETUP.C is
   a ROOT macro that is used to load the user's libraries, built by,
   and to do any other kind of setup needed to run with the user libraries.
   These scripts are executed in the package directory (not the PROOF-INF
   directory). An example of a is:
      #! /bin/sh

   An example of SETUP.C is:
      void SETUP()

   The package manager API is:



The TSelector class has been upgraded to improve its general
functionality and better support its use in PROOF. Specific

- Introduction of a Version() function to provide backward
  compatibility for old the version and support future upgrades.

- Replace ProcessCut() and ProcessFill() with a single Process()
  function. Reduce the information that needs to be shared between
  functions. Promote a more granular access to data by reading branches
  as they are needed.

- Add SlaveBegin() and SlaveTerminate(), in the case of PROOF these
  routines are called on the slave servers. The Begin() and Terminate()
  function now always run on the (local) client machine even when
  using PROOF.

- Support TSelector based classes that are already loaded into the client.


Changes in the histogramming package are:

 - setting titles to the X, Y and Z axis:

    h->GetXaxis()->SetTitle("X axis title");
    h->GetYaxis()->SetTitle("Y axis title");

   The histogram title and the axis titles can be any TLatex string.
   The titles are part of the persistent histogram.
   It is also possible to specify the histogram title and the axis
   titles at creation time. These titles can be given in the "title"
   parameter. They must be separated by ";":

    TH1F* h=new TH1F("h","Histogram title;X Axis;Y Axis;Z Axis",100,0,1);

   Any title can be omitted:

    TH1F* h=new TH1F("h","Histogram title;;Y Axis",100,0,1);
    TH1F* h=new TH1F("h",";;Y Axis",100,0,1);

   The method SetTitle has the same syntax:
    h->SetTitle("Histogram title;An other X title Axis");

Add a new function:

    static void StatOverflows(Bool_t flag=kTRUE)

All histogram Fill() functions modified to test this new flag.
By default the flag is off.

Note that the mean value/RMS is computed using the bins in the currently
defined range (see TAxis::SetRange). By default the range includes
all bins from 1 to nbins included, excluding underflows and overflows.
To force the underflows and overflows in the computation, one must
call the static function TH1::StatOverflows(kTRUE) before filling
the histogram.

Do not change the number of entries in TH1::Rebin().

Add a newoption "LL" in TH1::Fit().
This is an improved Log Likelihood fit in case of very low statistics
and when bin contents are not integers. Do not use use this option
if bin contents are large (say greater than 100).

Implement new histogram drawing option "]["
When this option is specified, the vertical lines for the first and last bin
are not drawn. This option is interesting when superimposing many histograms
on the same picture.


New option "d" in TH2:;ProjectionX,Y,ProfileX,Y and TH3::ProjectionZ
If a projection with the same name already exists in the pad or directory,
the previous projection is reset and filled again.

New class TH1I

Bin contents are 32 bit integers.


 - Support for stacked lego plots with variable bin size histograms

 - Improvement by Jiri Masik when drawing THStack in log scale.


Add an optional argument to the TH1::Add(TF1*) functions:
   void TH1::Add(TF1 *f1, Double_t c1, Option_t *option)
Performs the operation: this = this + c1*f1
if errors are defined (see TH1::Sumw2), errors are also recalculated.
By default, the function is computed at the centre of the bin.
if option "I" is specified (1-d histogram only), the integral of the
function in each bin is used instead of the value of the function at
the centre of the bin.

In TProfile::Merge(), in case the profiles have different binning, set
the number of bins for the merged profile to the number of bins of the
profile for which the function is called.

Add a new static function:
   void TProfile::Approximate(Bool_t approx=kTRUE);
When the flag is true, the function GetBinError will approximate the bin
error with the average profile error on all bins in the following situation
    - the number of bins in the profile is less than 1002
    - the number of entries in the bin is small (<5)
    - the estimated bin error is extremely small compared to the bin content.
By default GetBinError does not make this approximation.


Implement the same algorithm as in TProfile::GetBinError() for low
statistics bins. Add new static member fgApproximate and corresponding
static setter Approximate(). Add new member fScaling used internally
(like in TProfile) when scaling a TProfile2D.


New improvements in the Spectrum classes by Miro Morach.
Remove the old Smooth() and Search() functions. They are replaced
by the SearchHighres(), SmoothHighres() new functions.


A new fitter class TFumili (deriving from TVirtualFitter) has been provided
by Stanislav Nesterov. TFumili is much faster than TMinuit.

Add new environment resource to select the Fitter:

# Default Fitter (current choices are Minuit and Fumili)
Root.Fitter:     Minuit

Many changes in TFitter to accommodate the changes in TVirtualFitter.
The objective functions H1FitChisquare and H1FitLikelihood previously in TH1
or TGraph have been moved to TFitter.
The global variables communicating with TH1 or TGraph have been replaced
by the functions in TVirtualFitter.

Many changes in TGraph::Fit to use the new TVirtualFitter extended interface.
The static functions GraphFitChisquare has been moved to TFitter.

The global variables:
  TF1 *grF1
  TVirtualfitter *grFitter
have been deleted and replaced by functions from TVirtualFitter.

Many changes in TH1::Fit() to use the new TVirtualFitter extended interface.
The static functions H1FitChisquare(), H1FitLikelihood() have been moved to

The global variables:
  TF1 *gF1
  TVirtualfitter *hFitter
  Int_t hxfirst,hxlast,hyfirst,hylast,hzfirst,hzlast
have been deleted and replaced by functions from TVirtualFitter.

TMultiLayerPerceptron package

New MultiLayerPerceptron (mlp) package, by Christophe Delaere.

The package has 3 classes TMultiLayerPerceptron, TNeuron, TSynapse
These classes describe a neural network.
There are facilities to train the network and use the output.
The input layer is made of inactive neurons (returning the
normalized input), hidden layers are made of sigmoids and output
neurons are linear.

The basic input is a TTree and two (training and test) TEventLists.
For classification jobs, a branch (maybe in a TFriend) must contain
the expected output.
6 learning methods are available: kStochastic, kBatch,
kSteepestDescent, kRibierePolak, kFletcherReeves and kBFGS.

This implementation is *inspired* from the mlpfit package from
J.Schwindling et al.


New function TConfidenceLevel::Draw() suggested by Christophe Delaere.
Display sort of a "canonical" -2lnQ plot.
This results in a plot with 2 elements:
 - The histogram of -2lnQ for background hypothesis (full)
 - The histogram of -2lnQ for signal and background hypothesis (dashed)
The 2 histograms are respectively named b_hist and sb_hist.


New functions GetMinimumX(), GetMaximumX() returning the X value
corresponding to the minimum/maximum of the function in a given range.
New function GetX() returning the X value for a given function value Y.
A special case of this function is to find the zero of a function.

Interesting addition to TF1 by Thomas Bretz. A new set of functions to
compute integrals using precomputed "Gaus-Legendre" points.
The precomputed points can be obtained by the static functions:
  void     CalcGaussLegendreSamplingPoints(TGraph *g, Double_t eps=3.0e-11)
  TGraph  *CalcGaussLegendreSamplingPoints(Int_t num=21, Double_t eps=3.0e-11)
  void     CalcGaussLegendreSamplingPoints(Int_t num, Double_t *x, Double_t *w, Double_t eps=3.0e-11)

The integral can be obtained with:
  Double_t IntegralFast(const TGraph *g, Double_t a, Double_t b, Double_t *params=0)
  Double_t IntegralFast(Int_t num, Double_t *x, Double_t *w, Double_t a, Double_t b, Double_t *params=0)

Example of use:
   TF1 f("f","x**3",0,5);
   TGraph *g = TF1::CalcGaussLegendreSamplingPoints(6);
   double result =  f.IntegralFast(g,1,4);

New function:
  Int_t TF1::GetFreeParameters() const

Add new functions Moment(), CentralMoment(), Mean() and  Variance(),
from original code by Gene Van Buren.

New class TF12

A TF12 is a projection of a TF2 along X or Y and has the same behavior
as a TF1. Example of a function:

   TF2 *f2 = new TF2("f2","sin(x)*sin(y)/(x*y)",0,5,0,5);
   TF12 *f12 = new TF12("f12",f2,0.1,"y");


Do not show the pad highlighted when printing on Postscript.


Accept option "same" in TGraph::Draw() and TGraph::PaintGraph().
The option is dummy. It is introduced for consistency with
other high level classes (TH1, TTree). It eliminates
the problem with the native option "a" of TGraph.

Fix a problem in TGraph::Smooth preventing option "CF" (smooth fill area)
to work correctly as well as option "e4" in TH1::Draw().


New class by Dave Morrison to draw graphs with bent asymmetric errors.


This new class is a set of N points x[i],y[i],zi[i] in a non uniform
grid. Several visualization techniques are implemented, including Delaunay
triangulation. Delaunay triangulation is defined as follow:
For a set S of points in the Euclidean plane, the unique triangulation DT(S)
of S such that no point in S is inside the circumcircle of any triangle in
DT(S). DT(S) is the dual of the Voronoi diagram of S.
If n is the number of points in S, the Voronoi diagram of S is the
partitioning of the plane containing S points into n convex polygons such that
each polygon contains exactly one point and every point in a given polygon is
closer to its central point than to any other. A Voronoi diagram is sometimes
also known as a Dirichlet tessellation.
Specific drawing options can be used to paint a TGraph2D:
  "TRI"  : The Delaunay triangles are drawn using filled area.
   An hidden surface drawing technique is used. The surface is
   painted with the current fill area color. The edges of each
   triangles are painted with the current line color.
  "TRIW" : The Delaunay triangles are drawn as wire frame
  "TRI1" : The Delaunay triangles are painted with color levels. The edges
   of each triangles are painted with the current line color.

  "TRI2" : the Delaunay triangles are painted with color levels.
  "P"    : Draw a marker at each vertex
  "P0"   : Draw a circle at each vertex. Each circle background is white.

A TGraph2D can be also drawn with ANY options valid to draw a 2D histogram.


      TCanvas *c = new TCanvas("c","Graph2D example",0,0,700,600);
      Double_t x, y, z, P = 6.;
      Int_t np = 200;
      TGraph2D *dt = new TGraph2D();
      TRandom *r = new TRandom();
      for (Int_t N=0; N<np; N++) {
         x = 2*P*(r->Rndm(N))-P;
         y = 2*P*(r->Rndm(N))-P;
         z = (sin(x)/x)*(sin(y)/y)+0.2;

A more complete example can be find in $ROOTSYS/tutorial/graph2dfit.C.


A TGraph2DErrors is a TGraph2D with errors. It is useful to perform
fits with errors on a 2D graph.

A complete example can be find in $ROOTSYS/tutorial/graph2derrorsfit.C.

Support for log scale for all basic 2-d primitives

TArrow, TEllipse, TLatex, TLine, TMarker, TText:
implement support for log scales in the drawing, picking and editing.
The corresponding primitives can be drawn in a pad in linear scale
and one can toggle the lin/log scales.


New features in the histogram painter:

  - Option "AXIS" now works on 2D histograms.

  - New static function THistpainter::GetBestFormat to compute the best format
    to be used to print the error of some parameter. This is currently used to
    display the errors on the fit parameters.

  - Optimization of the color scale computation when drawing with option "colz'

  - LogZ now works for contours and surfaces (the color part).

  - In case of SURF3 option with LogZ, the color contour plot is now drawn
    on top of the surface (before the position was "random").

  - New histogram drawing option "SURF5". Same as SURF3 but only the colored contour
    is drawn. Used with option CYL, SPH or PSR it allows to draw colored contours on
    a sphere, a cylinder or a in pseudo rapidy space. In Cartesian or polar coordinates,
    option SURF3 is used.

  - New histogram drawing option "][" When this option is specified, the vertical lines
    for the first and last bin are not drawn. This option is interesting when superimposing
    many histograms on the same picture.

  - More rational behavior between contour levels and the color palette for the "COL" and
    "CONT" algorithms.


New features in the axis classes:

  - The time offset is now saved (in fTimeFormat) in TAxis and TGaxis. This allows to define
    individual time offset for each axis. A complete description of the time axis usage is
    given in the HowTo page and documentation.

  - New option MoreLogLabels: When this option is selected more labels are drawn when in log scale
    and there is a small number of decades  (<3).

  - Improvements in the log axis drawing:
      - allows exponent notation when extra log labels are drawn
      - extra labels are drawn only if they do not overlap
      - draw exponent labels with TLatex
      - better positioning of the labels


Modify TPolyLine::DistancetoPrimitive() to support the case of a filled
and closed polyline. In this case the object is picked when the mouse is
inside the polygone, otherwise the object is picked only when the mouse
is closed to one of lines of the polyline.


Implement the Angstroem characters #AA and #aa.

A TLatex string may be split in two lines (like a fraction without the line)
with the new command #splitline{top}{bottom}.
TAxis and TGaxis have been modified to take advantage of the new feature.
For example a new option in the time axis can show the date/time over two
lines with e.g.: #splitline{21 April 2003}{14:23:56}


The text size in Postscript files is now computed in order to fit exactly
with the TTF text size on screen. Previously it was close but a bit
different, therefore on long character strings it was possible to see gaps
between various pieces of a TLatex expression.

Postscript files are now compliant with the CUPS printing software.


Many bug fixes and improvements.

Saving any GUI as C++ source code

SavePrimitive() methods were implemented for ROOT GUI classes. They
automatically generate the code corresponding to the screen layout.
Any ROOT GUI can now be saved  as a macro. Executing this macro brings
back the current GUI without the action handling
based on the process event or signals/slots mechanism. This very
important development allows to get easily the source for any GUI,
which can then be inspected or used to create other GUI's.
Also this new ROOT feature will allow a GUI builder to save and
restore GUI's.

To save any GUI developed with ROOT GUI classes use the methods
TGMainFrame::SaveSource("macro.C","") for running application or
TGTransientFrame::SaveSource("dialogMacro.C","") for a dialog window.

You can trigger the saving just hitting ctrl-s on keyboard.

The SavePrimitive methods will generate the C++ code to rebuild the GUI
objects with their attributes. This code can be edited and reexecuted by
CINT. The macro can help you to  understand how to set widgets' parameters
or crucial layout hints. Once you like a dialog  layout or an application
window you can generate the code that reproduced it.
Just run guitest or RootShower and having mouse pointer on any main
frame area hit CRTL/S to try this feature. Write the name of generated
macro in SaveAs dialog that appears. After that run ROOT and execute your

If you have your own GUI class and you would like to save it in a macro
with the GUI around, you have to implement SavePrimitive member function.

We believe this feature will save your time spent on investigation how
to build the application layouts, menus, dialogs...

New Resource managment

Major changes in the resource management of the GUI classes. Introduced the
new class TGResourcePool which loads and keeps track of the 3 main resource
pools: fonts, picture and graphics contexts. Fonts are now handled via the
new TGFont class (and TGFontPool). In the past the loading of these resources
was done in TGClient and required all GUI classes to have TGClient as friend
to have their global statics initialized by TGClient. Adding a new widget
required TGClient.cxx to be changed too. This was obviously not good.
In addition it is now possible to find the full definition of the original
resource back based on a resource handle (GContext_t or FontStruct_t yielding
a TGGC or TGFont) which is needed for the SavePrimitive() functionality.

The resource pool can be found via TGClient (e.g. gClient->GetResourcePool()).
To see all active graphics contexts, fonts and pictures do:


New signals added which allow user to define procedures for extending
TBrowser functionality:
TGListTree::KeyPressed  and TGContainer::KeyPressed signals
allow to add user defined key-handling  procedures
TRootBrowser::BrowseObj - emitted when user browses an object
TRootBrowser::DoubleClicked - signal is emitted when user double clicks
   on an icon in TBrowser
TRootBrowser::ExecuteDefaultAction - emitted when user clicks on
    a file from a directory.

Flicker-free scrolling is implemented for right window of the TBrowser.


New getters provided for the menubar and menubar item layout hints. This
allows for the extension of the standard TCanvas menubar

Wheel mouse handling added. That makes scrolling easy through large canvas.

TGFrame and TGCompositeFrame

Print method introduced which will print frame parameters
(id, parent id, size, position etc.).


Keyboards keys handling added (arrow key, pageup, pagedown etc.).

SearchDialog added which can be activated by F7, Cntr-F keys.

KeyPressed signal and correspondent SendMessage added.

TGListView, TGContainer, TGCanvas and TGFSContainer

  void TGContainer::SetMapSubwindows(Bool_t on)

Added new simplified constructor to TGLVEntry class.

New method TGLVEntry::SetSubnames() added simplifies setting entry
subnames (for detail view layout).

New method TGLVContainer::SetColHeaders() added
simplifies setting column names (for detail view layout).

TGListView::GetViewMode() method added.

TGContainer::KeyPressed() signal and correspondent SendMessage() added.

Flicker-free scrolling is implemented for TGListView,TGcontainer classes.

TGLabel, TGTextButton, TControlBar and TRootControlBar

Methods SetTextFont(), SetTextColor() were added.

TGSlider and TGDoubleSlider

Mouse motion handling routines were improved.

TGMenu, TGMenuBar and TGToolBar

TGMenuBar::AddPopup() method added which also simplifies adding of

TGToolBar::ChangeIcon() method added.


Add possibility to put a progress bar into a status bar.


New method SetSelectedItem() that allows users to set
programmatically the currently open shutter item.


Accelerate the speed for changing numbers when button is permanently pressed


New method ChangeIcon() that allows the user to change the
icon of a tool bar button.

New examples

TestFileList, TestListDir examples added to guitest demo.
They demonstrate how to use TGFileContainer/TGContainer,
TGListTree classes and reproduce general functionality of TBrowser.

The win32gdk version

The win32gdk ROOT version was re-designed and rewritten for
speed, stability and compatibility with Unix version.

The results are:
  - gain in performance for canvas graphics from 2 up to 7 times
  - support for GL methods added
  - ROOT TGxxx classes are now fully functional under windows.

Guitest and RootShower

Many improvements in these advanced GUI examples illustrating new functions
implemented in the GUI classes.

New ports

Added port to IBM's xlC compiler under MacOS X, by Federico Carminati.

Port to Microsoft's VC++ 7.1.

Port to Intel's icc v8.0.

Port to RedHat 8.x, 9.x.

Port to Fedora Core 1.

Port to Cygwin gcc, by Axel Naumann.

Port to AMD Opteron and Athlon64

Improvements in build system

Several extensive changes in configure and in several's:
  - automatic architecture detection (first architecture argument
    only needed if non-default compiler is required)
  - better detection and avoidance of duplicate libraries for the
    authentication modules (afs, krb5 and srp modules can be build
    at the same time)
Mods by Christian Holm.

New tutorials in $ROOTSYS/tutorial

Many new tutorials were added showing the many new features in this
version of ROOT:

- New tutorial graph2dfit.C: TGraph2D example.

- New tutorial graph2derrorsfit.C: TGraph2DErrors example.

- New tutorial markerwarning.C illustrating the danger of using asymmetryc

- New tutorial logscales.C illustrating the use of axis with log scales.

- New tutorial triangles.C illustrating how to interact with closed polylines.

- New tutorial multigraph.C illustrating the use of TMultiGraph.

- New tutorial mlpHiggs.C by Christophe Delaere illustring the use
  of the Neural Network classes TMultiLayerPerceptron, etc.

- New tutorial bent.C illustrating the use of the new class TGraphBentError
  by Dave Morrison.

- New tutorial peaks.C illustrating how to use the peak finder
  (class TSpectrum) associated with a complex minimization problem.

- New tutorial TestAuth.C to test the ROOT Authentication methods.

- New tutorial threads.C illustrating the use of the Tread classes.

- New tutorial geoshapes.C by Mihaela Gheata illustrating the use of the
  TGeo shapes.

- New tutorial timeonaxis2.C illustrating the basics of the time units on
  the histogram axis.

- New tutorial clonesA_Event.C illustrating complex situations of inheritance and
  multiple inheritance.

- New tutorial jets.C illustrating the use of a Tree using the JetEvent class.

- New tutorial tree2a.C  with the same functionality than tree2.C but using
  a class instead of a C-struct.

- New tutorial copytree3.C showing how to copy selected entries to
  another Tree.

- Improvements in zdemo.C: It uses TLatex instead of many TText positioned
  "by hand" to write formulas

ROOT Documentation

The ROOT User's Guide includes several new chapters, in particular the chapter
describing the Geometry Package. The Guide has a new improved Index.
Many typos and errors have been fixed.

The ROOT User's Guide page on web was changed in the way to help
users to find faster answers from the basic question to the question
about ROOT advanced features:
- the main MSWord and PDF files contain internal links to all pointed
- all chapters are available as separate PDF files for download to
  provide an easy access to the searched information

ROOT page - Class index - Top of the page

This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.