# 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:

          http://root.cern.ch/root/Version310.html

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

          http://root.cern.ch/root/AFS.html

    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:
     http://root.cern.ch/root/doc/RootDoc.html
    Individual pdf files corresponding to each chapter can be downloaded separately.

    For more information, see:

          http://root.cern.ch

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

    --------------------------------------------------------------------------

    CINT
    ====

    Latest version of CINT. For the main new features see the CINT
    release notes: http://root.cern.ch/root/Cint.phtml?relnote

    ACLiC
    =====

    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 file_C.so), 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:
       TSystem::TempDirectory()
       TSystem::TempFilename()
    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
    from: http://root.cern.ch/root/doc/RootDoc.html
    Many thanks to Mihaela Gheata for this new chapter.

    VMC
    ===

    A new interface to the Virtual Monte Carlo has been released.
    For more details, see: http://root.cern.ch/root/vmc/VirtualMC.html

    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.

    TFile
    =====

    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.

    TRFIOFile
    =========

    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,
    TWinNTSystem).

    TCastorFile
    ===========

    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:
        castor:/castor/cern.ch/user/r/rdm/bla.root.
    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.

    TDCacheFile
    ===========

    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 http://www-dcache.desy.de/. 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,
    TWinNTSystem).

    TChirpFile
    ==========

    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
    see http://www.cs.wisc.edu/condor/chirp).
    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).

    rootd
    =====

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

    http://root.cern.ch/root/Auth.html

    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:

           http://root.cern.ch/root/Auth.html

    See also the $ROOTSYS/README/README.AUTH file.

    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
        (www.globus.org) 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.

    Kerberos
    --------

    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.

    TStreamerInfo
    =============

    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).

    rootcint
    ========

    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.

    TClass
    ======

    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).

    TClassGenerator
    ===============

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

    TROOT
    =====

    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.

    TObject
    =======

    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.

    TString
    =======

    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.

    TFormula
    ========

    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()");
    or
       T->Draw("TMath::BreitWigner(fPx)");
    or
       T->Draw("MyInterpretedFunction(fPx)");
    or
       TF1 *f = new TF1("f1","TMath::BreitWigner(fPx.[0],[1])");
          myhist->Fit(f);

    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:
       mytree->Draw(".5");
       mytree->Draw("goodvar*.5");
    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.

    TTree
    =====

    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
      filled.

      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.

    TTree::Draw
    ===========

    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
       tree.Draw("y:x");
    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
    	  tree.Draw("y:x:,"","l");
    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.
    mytree->Draw("myevent.myTbits");
    will create a 1D histogram from 0 to nbits which is filled for
    each bit number which is non-null.

    evtl->SetReapplyCut(1);
    analysis->SetEventList(evtl);
    analysis->Draw("nch",".5","goff")
    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
    separator.

    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
    necessary.

    Added support for nested arrays.

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

    TTree::Scan()
    =============

    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
    'lenmax=dd':
    tree->Scan("myarr","","lenmax=3");
    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.

    TBranchElement
    ==============

    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.

    TTreePlayer
    ===========

    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).

    TTreeViewer
    ===========

    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.

    TTree/TChain
    ============

    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:
      mytree->SetAlias("mult","fPx*fPy");
      mytree->Draw("mult");
    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:
      TTree::SetAlias()
      TTree::GetAlias()
      TChain::GetAlias()
      TTree::GetListOfAliases()

    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:

        <protocol>:///user/file.

    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.

    PROOF
    =====

    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: BUILD.sh and SETUP.C. BUILD.sh 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 BUILD.sh,
       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 BUILD.sh is:
          #! /bin/sh
          make libEvent.so

       An example of SETUP.C is:
          void SETUP()
          {
             gSystem->Load("libEvent");
          }

       The package manager API is:

          gProof->UploadPackage()
          gProof->EnablePackage()
          gProof->ClearPackage()

    TSelector
    =========

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

    - 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.

    TH1
    ===

    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.

    TH2/TH3
    =======

    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.

    THStack
    =======

     - Support for stacked lego plots with variable bin size histograms

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

    TProfile
    ========

    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
    only:
        - 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.

    TProfile2D
    ==========

    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.

    TSpectrum
    =========

    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.

    Fitting/TMinuit/TFumili
    =======================

    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
    TFitter.

    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.

    TConfidenceLevel
    ================

    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.

    TF1
    ===

    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");
       f12->Draw();

    TPad
    ====

    Do not show the pad highlighted when printing on Postscript.

    TGraph
    ======

    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().

    TGraphBentErrors
    ================

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

    TGraph2D
    ========

    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.

       Example:

       {
          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;
             dt->SetPoint(N,x,y,z);
          }
          gStyle->SetPalette(1);
          dt->Draw("surf1");
       }

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

    TGraph2DErrors
    ==============

    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.

    THistPainter
    ============

    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.

    TAxis/TGaxis
    =============

    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

    TPolyLine
    =========

    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.

    TLatex
    ======

    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}

    TPostScript
    ===========

    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.

    GUI
    ===

    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
    macro.

    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:
       gClient->GetResourcePool()->GetGCPool()->Print()
       gClient->GetResourcePool()->GetFontPool()->Print()
       gClient->GetResourcePool()->GetPicturePool()->Print()

    TRootBrowser
    ------------

    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.

    TRootCanvas
    -----------

    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.).

    TGListTree
    ----------

    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
    ---------------------------------------------------

    Added:
      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
    popup-menus.

    TGToolBar::ChangeIcon() method added.

    TGStatusBar
    -----------

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

    TGShutter
    ---------

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

    TGNumberEntry
    -------------

    Accelerate the speed for changing numbers when button is permanently pressed

    TGToolBar
    ---------

    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 Module.mk'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
      markers.

    - 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 otto.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
      chapters
    - all chapters are available as separate PDF files for download to
      provide an easy access to the searched information