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: http://root.cern.ch/root/Version300.html Versions for AFS have also been updated. See list of supported platforms: http://root.cern.ch/root/AFS.html 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: http://root.cern.ch/root/html/examples/V3.00.txt.html Constness ========= 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: http://root.cern.ch/root/Cint.phtml?relnote. 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. rootcint ======== 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. BypassStreamer ============== 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). IgnoreTObjectStreamer ===================== 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. Long_t ====== 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. libNew.so ========= 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. SavePrimitive() =============== 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 TH1K::TH1K(name,title,nbins,xlow,xup,K=0) 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.GetFunction("myFunction")->ResetBit(kNotDraw); h.Draw(); // function is visible again THistPainter ============ The option "Z" to draw the color palette can be used with all 2-D drawing options. 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 plots. 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. TStyle ====== 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: myTree->Draw("clone1.a1:clone2.a2[2]"); myTree->Draw("clone1.a1:clone2.a2[clone1.b1]"); myTree->Draw("clone1.a1","clone2.a2[clone1.b1]>0"); Also enabled (rudimentarily for now) is the access to data members. So now both the following calls are possible: T->Draw("event->GetNtrack()"); T->Draw("event.fNtrack"); The lookup of leafname has been improved so that whether of not the dot has been forced into the branchname the following will work: T->Draw("event.fTemperature") T->Draw("fTemperature") 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: chain.Add("xxx*.root"); 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 memory) - 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 $ROOTSYS/etc/. 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(); mg->Add(gr1); mg->Add(gr2); mg->Draw("alp"); 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: html.MakeIndex("XX*"); 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. TMath::Hash() ============= 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 degeneration). 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 http://www.troll.no/qt/metaobjects.html) 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 signals. This implementation is provided by Valeriy Onuchin (onuchin@sirius.ihep.su). PROOF ===== 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. TNetFile ======== 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. TAuthenticate ============= 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). rootd ===== 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 number. 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: -vector<THit> -vector<THit*> -TClonesArray(TObjHit) in no split mode -TClonesArray(TObjHit) in split mode Where: 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 : Fri Jun 08 2001 - 11:51:20 MEST