[ROOT] ROOT version 3.00 is now officially released

From: Rene Brun (Rene.Brun@cern.ch)
Date: Mon Mar 12 2001 - 19:36:46 MET

               Official Release of ROOT Version 3.00

The ROOT Team is pleased to announce the release of ROOT version 3.00.

After a long period of beta testing with 5 intermediate releases we feel
confident to offer 3.00/06 as the new stable production release of ROOT.
We would like to thank our world-wide community of beta testers who helped
making this a solid new release. However, all remaining bugs are the sole
responsibility of the ROOT Team.

Compared to the previous production release (v2.25/03) this new
version has major enhancements in the following areas:

  - Self describing I/O
  - Automatic schema evolution
  - TObject interface cleanup
  - Signal/slots component programming mechanism
  - Grid features like parallel sockets and parallel ftp
  - A long list of fixes and enhancements

Except for the changes in the TObject API this new version is fully
backward compatible with the previous production version.

Binaries for all supported platforms are available at:

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

This is the last release where we support the following compilers:
   - HP-UX/CC (only aCC will be supported)
   - AIX/xlC 3.2  (we may support a newer compiler if ANSI C++ compliant)
   - Solaris CC4.2 (only version 5 or higher will be supported)

We would like to ask you to very attentively read the full list of new
features and enhancements described below. They will help you in making
a smooth transition to ROOT v3.00.

   Rene Brun and Fons Rademakers

Overview of the New Features, Enhancements, Classes and Fixes in ROOT v3.00

For a more detailed list of enhancements, bug fixes, etc, see:


We have modified the signature of many methods (in particular in the
TObject base class) to introduce more constness in the system.
You must change your code if your classes derive from TObject and use
one of the modified functions such as ls(), Print(), Compare(), Hash(),
etc. The modified TObject methods are:

    virtual TObject    *Clone(const char *newname="") const;
    virtual Int_t       Compare(const TObject *obj) const;
    virtual void        DrawClass() const;
    virtual TObject    *DrawClone(Option_t *option="") const;
    virtual void        Dump() const;
    virtual TObject    *FindObject(const TObject *obj) const;
    virtual char       *GetObjectInfo(Int_t px, Int_t py) const;
    virtual ULong_t     Hash() const;
    virtual void        Inspect() const;
    virtual Bool_t      IsEqual(const TObject *obj) const;
    virtual void        ls(Option_t *option="") const;
    virtual void        Print(Option_t *option="") const;

This is the only source of backward incompatibility and we urge you to
carefully check your code. Some compilers will warn you about your old
"Hash()" hiding the new "Hash() const" but, e.g. not g++. So if for example
none of your objects are found anymore in containers than it is very likely
you have to fix IsEqual(), Compare() and/or Hash().

New version of CINT with many enhancements

See the CINT release notes at:

Important additions to the I/O subsystem

This new version includes several enhancements in the I/O sub-system,
in particular:

 - A new Automatic Class Schema Evolution system
 - A self-describing object format using TSreamerInfo objects
 - Full support for STL
 - Automatic code generating using the TStreamerInfo objects stored in a file

For more details,see http://root.cern.ch/root/SchemaEvolution.html

TTree::Branch and TTree::Bronch

A new method TTree::Bronch() is part of this new release.
This function is designed to replace the function TTree::Branch()
in a future version of ROOT. This new function is far more powerful than
the Branch() function. It supports the full C++, including STL and
has the same behaviour in split or non-split mode. This new method is based
on the new TStreamerInfo. The ROOT team encourages users to try this new
function to write and read their existing classes. However, trees written
with this function cannot be analyzed yet with TTree::Draw(), Scan() or
the browsers.


The rootcint code generator has been extended to generate additional code
required by the new TStreamerInfo class. In particular, for each data
member involving an STL collection, a function is generated to perform I/O
for this collection. The new rootcint also supports several new C++
constructs not supported by the previous version.


New TClonesArray methods BypassStreamer() and CanBypassStreamer().
By default, the kBypassStreamer bit is set in the TClonesArray constructor.
When this bit is set, the TClonesArray::Streamer() does not call the class
Streamer() method, but uses a more efficient code.
You can force the old behaviour by calling BypassStreamer(kFALSE).


If your class MyClass derives from TObject, you can instruct the system
to ignore the TObject data members when writing/reading instances of this
class by calling MyClass::Class()->IgnoreTObjectStreamer().
When the TClass kIgnoreTObjectStreamer bit is set, the automatically
generated Streamer will not call TObject::Streamer(). This option avoids
saving the two (fBits, fUniqueID) TObject data members on the file. Note
that this function must be called only for the class which derives directly
from TObject.


The conversion functions for Long_t/ULong_t data types have been modified
to make these types portable data types. 8 bytes are always written/read
to/from the buffer. In case the type was written on a machine where
sizeof(Long_t) is 8 bytes and read on a machine where sizeof(Long_t) is
4 bytes, only the 4 least significant bytes are used (so the value will
be truncated). In the inverse situation the conversion is always correct.
The change will allow a smooth and backward compatible introduction of
Long_t = longlong in a future version on machines where this is possible.


By default, root.exe is not linked anymore with libNew.so. A new executable
module called rootn.exe, linked with libNew.so, is provided in $ROOTSYS/bin/.
Use rootn.exe if you need to access shared memory files (TMapFile) from a
ROOT session (libNew provides an interface to the shared heap).

Also your existing programs may fail if you forgot to properly initialize
all data members (especially pointer data members), because now libNew.so
is not there anymore to do that automatically.

The root-config script called with options --libs or --glibs does not
include libNew anymore. Use root-config with the new option --new (which
must precede --libs or --glibs) if you want to use libNew. The old --nonew
is now a noop.

TObject news

Change in the TObject destructor. Instead of calling RecursiveRemove()
on the canvas and browser lists, to remove all object references, a more
general mechanism has been introduced. In the list of folders, a new entry
"Cleanups" has been introduced. The list of Cleanups currently includes:

 - the list of canvases
 - the list of browsers
 - the list of tasks

One can Add a new list to this list. The TObject destructor will automatically
invoke the RecursiveRemove() method of all collections in the list of Cleanups.
Add a new enum kMustCleanup acting as the previous kObjInCanvas (same bit).

Change TObject::DrawClone() to return TObject* instead of void.

Add an optional argument to TObject::Clone(). This argument can be used to
specify a new name for the cloned object. If the class is not derived from
TNamed, the optional argument is ignored.


The SavePrimitive() method has been implemented or extended for several
important classes. This function is called when saving a canvas as a macro.
In particular, histograms and graphs are now saved. However the fit function
associated to histograms and graphs is not yet saved.

Histogram classes

New class TH1K developed by Victor Perevoztchikov <perev@bnl.gov>.
TH1K class supports the nearest K Neighbours method, widely used in
cluster analysis. This method is especially useful for small statistics.
In this method:

         DensityOfProbability ~ 1/DistanceToNearestKthNeighbour

differs from TH1F only by "K"
    K - is the order of K Neighbours method, usually >=3
    K = 0, means default, where K is selected by TH1K in such a way
           that DistanceToNearestKthNeighbour > BinWidth and K >=3

The following functions have been added:
   Stat_t   GetBinContent(Int_t binx, Int_t biny) const;
   Stat_t   GetBinContent(Int_t binx, Int_t biny, Int_t binz) const;
   Stat_t   GetBinError(Int_t binx, Int_t biny) const;
   Stat_t   GetBinError(Int_t binx, Int_t biny, Int_t binz) const;
   void     SetBinContent(Int_t binx, Int_t biny, Stat_t content);
   void     SetBinContent(Int_t binx, Int_t biny, Int_t binz, Stat_t content);
   void     SetBinError(Int_t binx, Int_t biny, Stat_t error);
   void     SetBinError(Int_t binx, Int_t biny, Int_t binz, Stat_t error);

Add an optional argument to the Integral() functions.
If the argument is not specified, the function is backward compatible
and returns the sum of the bin contents.
If the argument option="width", the integral computed is the sum of
the bin contents times the bin width in x, y or z.
The new argument is important to compute correctly the integral
of histograms with variable bins size.

Change in Fitting option "0"

The option "0" has been activated. When selecting this option, the
fitted function is added to the list of functions of the histogram,
but it is not drawn. You can undo what you disabled in the following way:
  h.Fit("myFunction","0"); // fit, store function but do not draw
  h.Draw(); function is not drawn
  const Int_t kNotDraw = 1<<9;
  h.Draw();  // function is visible again


The option "Z" to draw the color palette can be used with all 2-D drawing

PaintContour() supports bins with negative content. When the number of
contours is less or equal to 2, the color used for the contour is the
histogram color itself.

Optimization for computing the maximum of the scale for legos and surface

Fix a problem in TGraph::PaintGraph() when redrawing a TGraph in log scales.
With the new logic, one can:
   - switch between log and linear scales
   - zoom/unzoom a TGraph when the pad range is defined via an histogram
     or via TPad::DrawFrame().

Fonts precision 3 for font size in pixels

Implement support for text size in pixels. When the font precision is 3
(e.g. textFont = 63), the text size can be specified in pixels instead
of percent of the pad size. For example:
 textFont = 10*fontnumber + precision
Font numbers must be between 1 and 14
   precision = 0 fast hardware fonts (integral font size)
   precision = 1 scalable and rotatable hardware fonts (see below)
   precision = 2 scalable and rotatable hardware fonts
   precision = 3 scalable and rotatable hardware fonts. Text size
                 is given in pixels.
The textsize in pixels (say charheight) will be:
   charheight = textsize*canvas_height if current pad is horizontal.
   charheight = textsize*canvas_width  if current pad is vertical.
   charheight = number of pixels if font precision is 3.


New methods:
      SetGridColor(), SetGridStyle(), SetGridWidth()
      GetGridColor(), GetGridStyle(), GetGridWidth()

New options/functions in TPad

New methods:
     void      DrawCrosshair();
     Int_t     GetCrosshair();
     Bool_t    HasCrosshair();
     void      SetCrosshair();

A cross hair can be activated in a canvas or pad by calling SetCrosshair().
The SetCrosshair() method is visible (as a toggle) in the pad context menu.

The pad margins may be set to zero. This is useful when dividing a canvas/pad.
See example in new tutorial zones.C.

New enum EMarkerStyle in Gtypes.h

      1 : dot                     kDot
      2 : +                       kPlus
      3 : *                       kStar
      4 : o                       kCircle
      5 : x                       kMultiply
      6 : small scalable dot      kFullDotSmall
      7 : medium scalable dot     kFullDotMedium
      8 : large scalable dot      kFullDotLarge
      9 -->19 : dot
     20 : full circle             kFullCircle
     21 : full square             kFullSquare
     22 : full triangle up        kFullTriangleUp
     23 : full triangle down      kFullTriangleDown
     24 : open circle             kOpenCircle
     25 : open square             kOpenSquare
     26 : open triangle up        kOpenTriangleUp
     27 : open diamond            kOpenDiamond
     28 : open cross              kOpenCross
     29 : open star               kOpenStar
     30 : full star               kFullStar

Improvements in Trees

New version of TTreeFormula/TFormula by Philippe Canal:
In a TFormula . and -> are now synonymous.

In a TTreeFormula, you can now specify the index of an array (TClonesArray
or regular array) via another expression of the variable of the tree.

For example the following cases are now correctly handled:

Also enabled (rudimentarily for now) is the access to data members.
So now both the following calls are possible:

The lookup of leafname has been improved so that whether of not the dot
has been forced into the branchname the following will work:

New method TTree::GetEntryNumberWithBestIndex().
Modify the specs of TTree::GetEntryNumberWithIndex(). The new method always
returns -1 if the pair (major,minor) is not found.

Improvements in TChain

New function TChain::Add(TChain *chain) to add an existing chain to the chain.
Modify function TChain::Add(const char *name,...) to support wild carding.
One can now do:
to add all files starting with xxx in the current directory.
The TChain::Add() functions call internally a new function TChain::AddFile().
The TChain::Add() functions return an Int_t with the number of files
effectively connected to the TChain.

Implement TChain::Fill() as a dummy function with an error message to prevent
filling an existing chain.
TChain::ls() reports the number of entries for each chain element.
TChain::Print() invokes TTree::Print() for each chain element.

New TreeViewer

New version of TTreeViewer by Andrei Gheata.
Note that this class uses extensively the GUI classes and it is not
available yet on Windows (waiting the port of the TVirtualX class to Win32).
There are two ways to start the TreeViewer for a Tree T:
   - T.StartViewer()
   - use the context menu in the browser on object T

Extensive help is provided in the HELP menu of the TreeViewer window.

New class TMultiDimFit

Important contribution by Christian Holm Christensen. For an extensive
description of this class see the class description on the web.

New version of TDatabasePDG

New version of TDatabasePDG and related classes from Pasha Murat.
Note that the TDatabasePDG::AddParticle() method has two additional
(optional) parameters. Other changes:

  - the default constructor is not doing anything now (not even allocating
  - GetParticle() methods are modified to do auto-initialization if necessary
  - ReadPDGTable() includes Init() functionality
  - ROOTino has been added
  - few typo-level things fixed in the particle table itself (like "p+" has
    been changed into "proton", "n0" into "neutron" and such)

TDatabasePDG::Init() has been removed (replaced by ReadPDGTable()).
This new function reads the PDG data base from the ascii file pdg_table.txt in

The class TParticlePDG has been extended to support decay channels via a
new TDecayChannel class.

Various new classes

New class TBits by Philippe Canal. This class provides a simple container
of bits. Each bit can be set and tested via the methods SetBitNumber()
and TestBitNumber(). The default value of all bits is kFALSE.

New class TMultiGraph. A TMultiGraph is a collection of TGraphs (or derived)
objects. Use TMultiGraph::Add() to add a new graph to the list. The
TMultiGraph owns the objects in the list. Drawing options are the same as
for TGraph, for example:

     TGraph *gr1 = new TGraph(...);
     TGraphErrors *gr2 = new TGraphErrors(...);
     TMultiGraph *mg = new TMultiGraph();

New class TGenPhaseSpace developed by Valerio Filippini.
Utility class to generate n-body event according to fermi lorentz-invariant
phase space events are generated in their own center-of-mass,

New classes in the STAR directory;

New classes TFileIter and TDsKey.

Improvements in THtml

New options in MakeAll() and MakeIndex() to process only the classes specified
by a filter. The implementation is backward compatible:

 - void THtml::MakeAll(Bool_t force, const char *filter)
   It generates documentation for all classes specified in the filter
   (by default "*"). To process all classes having a name starting with
   XX, do:
       html.MakeAll(kFALSE, "XX*");
   If force=kFALSE (default), only the classes that have been modified since
   the previous call to this method will be generated.
   If force=kTRUE, all classes passing the filter will be processed.

 - void THtml::MakeIndex(const char *filter)
   It makes by default an index of all classes (if filter="*")
   To generate an index for all classes starting with "XX", do:

Random number generators

Use double precision in return types and all arguments of the random number
generator classes. The modified prototypes are:
      Int_t    Binomial(Int_t ntot, Double_t prob);
      Double_t Gaus(Double_t mean=0, Double_t sigma=1);
      Double_t Landau(Double_t mean=0, Double_t sigma=1);
      Int_t    Poisson(Double_t mean);
      void     Rannor(Float_t &a, Float_t &b);
      void     Rannor(Double_t &a, Double_t &b);
      Double_t Rndm(Int_t i=0);
      Double_t Uniform(Double_t x1=1);

Note that in case of Rannor(), two functions are provided, one with
float and one with double for backward compatibility.


New hash function which calculates hash index from any char string,
by Victor Perevoztchikov <perev@bnl.gov>. Based on precalculated table
of 256 specially selected numbers. These numbers are selected in such
a way, that for string length == 4 (integer number) the hash is
unambiguous, i.e. from hash value we can recalculate input (no

The quality of hash method is good enough, that
"random" numbers made as R = Hash(1), Hash(2), ...Hash(N)
tested by <R>, <R*R>, <Ri*Ri+1> gives the same result
as for libc rand().

For string:  i = TMath::Hash(string,nstring);
For int:     i = TMath::Hash(&intword,sizeof(int));
For pointer: i = TMath::Hash(&pointer,sizeof(void*));

Changes in GUI classes

Many changes connected with the introduction of the TGGC (graphics context)
class (all backward compatible). Also many of the static default GC's and
fontstructs are now available to the user. This can simplify code in many
places. See change in guitest.cxx.

New TGProgressBar class.

New TGShutter class: nice widget to build a toolbar/menubar
with many different subsections.

Signals and Slots

New classes TQObject and TQConnection. This is the ROOT implementation
of the Qt object communication mechanism (see

Signals and slots are used for communication between objects.
When an object has changed in some way that might be interesting
for the outside world, it emits a signal to tell whoever is
listening. All slots that are connected to this signal will be
activated (called). It is even possible to connect a signal
directly to another signal (this will emit the second signal
immediately whenever the first is emitted.) There is no limitation
on the number of slots that can be connected to a signal.
The slots will be activated in the order they were connected
to the signal. This mechanism allows objects to be easily reused,
because the object that emits a signal does not need to know
to which objects the signals are connected. Together, signals and
slots make up a powerful component programming mechanism.
For more see http://root.cern.ch/root/HowtoSignalSlot.html.

Besides all GUI classes, also all classes deriving from TSysEvtHandler
(e.g. TFileHandler, TSignalHandler, TTimer) and all classes deriving from
TVirtualPad (e.g. TPad, TCanvas) inherit now from TQObject and do emit

This implementation is provided by Valeriy Onuchin (onuchin@sirius.ihep.su).


Many more PROOF changes. This version can now remotely execute scripts on
a PROOF cluster.

Parallel sockets

New TPServerSocket and TPSocket classes. These new classes support
parallel socket operation. Using this technique network transfers are
striped over a set of parallel sockets thereby dramatically increasing
the network performance over fat pipes (grid like infrastructure).
Instead of waiting for an ACK before sending a next fragment and thereby
not filling up the pipe completely, the sockets send fragments in parallel,
keeping the pipe full. These two new classes have the same interface as
the standard TSocket and TServerSocket classes.


Can use parallel sockets to connect to rootd. Use argument netopt<0 to
specify the number of parallel sockets to rootd. This new version can
only talk to the new version of rootd.


New class used for authentication to remote services. Currently used by
TNetFile (for rootd) and TProof (for proofd). Previously most of this code
was in TNetFile.

New class TFTP

This new class implements an efficient FTP protocol for ROOT and other files.
It talks to an updated rootd daemon and can use parallel sockets for efficient
WAN usage (up to 10 times as fast a normal wu-ftp).


New version of rootd that supports parallel sockets (TPSocket). Gives
excellent performance on WAN's for TNetFile and TFTP. Attention protocol
change, this version of rootd works only with the new version of TNetFile!
Due to very low level protocol change client can not get rootd protocol
version to make appropriate checks.

Rootd and proofd now support a -b option with which one can specify the
desired tcp window size to be used. Important for fat pipe operation
(i.e. links with a high bandwidth*delay product). For more on how to enable
this in the OS see http://www.psc.edu/networking/perf_tune.html. However,
using parallel sockets it is much easier to increase network performance.

Makefile, configure script

Added new targets:

  debian            -- will build a Debian .pkg
  redhat            -- will build a RedHat .rpm
  maintainer-clean  -- delete all generated files and directories,
                       distclean does not delete the ./configure information

Provide support for shared library version numbers. Use the new configure
option: --enable-soversion for this. By default shared libs have no version

New directory $ROOTSYS/etc

The etc directory contains some data files previously scattered in
other directories. In particular it contains the file system.rootrc
that was previously in $ROOTSYS.

New Tutorials

  fithist.C:      new fit example where the fit model is a histogram +
                  a function
  tree1.C:        illustrates how to create a simple Tree
                  with branches of variable length arrays
  work.C:         illustrates how to navigate in a ROOT file
  tvdemo.C:       demonstrates the use of the new TTreeViewer
  hksimple.C:     a Gaussian fit added to the 3 histograms
                  to illustrate the advantage of TH1K
  anim.C:         illustrates an animation using a Timer
  fit2d.C:        illustrates how to fit a 2-d histogram with
                  a distribution of the type y=ax+b with a straight
  multidimfit.C:  illustrates the use of the new class TMultiDimFit.
  zones.C:        illustrates how to subdivide a canvas into adjacent
                  pads + drawing of labels on the top and right sides
                  of the pads.
  firstContour.C: illustrates access to the contour levels in a TH2
  pclient.C, pserv.C: show the use of parallel sockets

New test program bench

New test suite and benchmark bench.cxx. This test program compares the
I/O performance obtained with STL vector of objects or pointers to
objects versus the native ROOT collection class TClonesArray.
Trees in compression and non compression mode are created for each
of the following cases:
  -TClonesArray(TObjHit) in no split mode
  -TClonesArray(TObjHit) in split mode
  THit is a class not derived from TObject
  TObjHit derives from TObject and THit

The test prints a summary table comparing performances for all above cases
(CPU, file size, compression factors). The numbers for a Pentium III 650 Mhz
machine are given as reference.

This also tests the portability of STL on the different supported platforms.
Note that this new test program cannot be run under:
  - HP-UX with the old CC compiler (OK with aCC)
  - Solaris with the old CC4.2 compiler (OK with CC5).
  - Windows with VisualC++

This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:39 MET