ROOT Version 5.18/00 Release Notes
ROOT version 5.18/00 has been released January 17, 2008.
In case you are upgrading from version 5.14, please read the releases notes
of version 5.16 in addition to these notes.
Binaries for all supported platforms are available at:
http://root.cern.ch/root/Version518.html
Versions for AFS have also been updated. See the list of supported
platforms:
http://root.cern.ch/Welcome.html
For more information, see:
http://root.cern.ch
The following people have contributed to this new version:
Roel Aaij,
Ilka Antcheva,
Silvia Arcelli,
Bertrand Bellenot,
Rene Brun,
Philippe Canal,
Olivier Couet,
Bastien Dallapiazza,
Frank Filthaut,
Valeri Fine,
Leo Franco,
Gerri Ganis,
Andrei Gheata,
Mihaela Gheata,
Andreas Hoecker,
Jan Iwaszkiewicz,
Anna Kreshuk,
Wim Lavrijsen,
Sergei Linev,
Diego Marcos-Segura,
Lorenzo Moneta,
Axel Naumann,
Valeriy Onuchin,
Timur Pocheptsov,
Fons Rademakers,
Paul Russo,
Magdalena Slawinska,
Peter Speckmayer,
Joerg Stelzer,
Scott Snyder,
Alja Tadel,
Matevz Tadel,
Zoltan Torzsok,
Long Tran-Thanh,
Wouter Verkerke,
Guido Volpi,
Helge Voss
ROOT Robutsness
This release has undergone an extensive, formalized testing procedure,
using tools like valgrind and purify, regression tests, and timing studies. As a
byproduct, the new file $ROOTSYS/etc/valgrind-root.supp removes
irrelevant (and often distracting) parts of valgrind's reports. This is
also useful when running valgrind on a program that uses ROOT. It can be
used running valgrind -v
--suppressions=$ROOTSYS/etc/valgrind-root.supp myprog.
Core
-
Updated TPluginManager. Plugin handlers can now be specified wia macros
in a list of plugin directories. These new features are implemented via
two new methods described below. These changes are fully backward compatible
and plugin descriptions in rootrc files still work. However, using the new
macros we only load in program memory the handlers for the needed plugins,
instead of the almost 100 handlers of all plugins. For example after starting
root.exe, only these handlers are loaded:
root [0] gPluginMgr->Print()
=====================================================================
Base Regexp Class Plugin
=====================================================================
TSystem ^rfio: TRFIOSystem RFIO
TSystem ^castor: TRFIOSystem RFIO
TSystem ^dcache: TDCacheSystem DCache
TSystem ^dcap: TDCacheSystem DCache
TSystem ^alien: TAlienSystem RAliEn
TSystem ^root: TXNetSystem Netx
=====================================================================
6 plugin handlers registered
[*] plugin not available
=====================================================================
For more see below:
void TPluginManager::LoadHandlersFromPluginDirs(const char *base)
Load plugin handlers specified via macros in a list of plugin
directories. The $ROOTSYS/etc/plugins is the default top plugin directory
specified in $ROOTSYS/etc/system.rootrc. The macros must have names
like <BaseClass>/PX0_<PluginClass>.C, e.g.:
TFile/P10_TRFIOFile.C, TSQLServer/P20_TMySQLServer.C, etc.
to allow easy sorting and grouping. Macros not beginning with 'P' and
ending with ".C" are ignored. If base is specified only plugin macros for
that base class are loaded. The macros typically should look like:
void P10_TDCacheFile()
{
gPluginMgr->AddHandler("TFile", "^dcache", "TDCacheFile",
"DCache", "TDCacheFile(const char*,Option_t*,const char*,Int_t)");
}
In general these macros should not cause side effects, by changing global
ROOT state via, e.g. gSystem calls, etc. However, in specific cases
this might be useful, e.g. adding a library search path, adding a specific
dependency, check on some OS or ROOT capability or downloading
of the plugin.
Int_t TPluginManager::WritePluginMacros(const char *dir, const char *plugin)
Write in the specified directory the plugin macros. If plugin is specified
and if it is a base class all macros for that base will be written. If it
is a plugin class name, only that one macro will be written. If plugin
is 0 all macros are written. Returns -1 if dir does not exist, 0 otherwise.
This method allows the regeneration of the entire tree of plugin macros
in case we ever decide to change something in the macros.
-
New class TFileCollection that contains a hashlist of TFileInfo's and
a list of accumulated meta data information about its entries. This class
is used to describe file sets as stored by Grid file catalogs,
by PROOF or any other collection of TFile names.
-
In TWebFile add support for the HTTP/1.1 protocol which allows sockets to stay open.
This saves a lot of time in not having to open and setup sockets for
each request. They gain can be up to 100% or more.
-
DCache (1.7.0-39) now supports vector reads which are used in the TDAcheFile plugin.
"It's amazing! On some applications I got up ti 12 times performance increase!"
-
Fixes in GFAL, RFIO and HTTP plugins fixing TFile::Cp().
-
Implement floating point exception support for Mac OS X i386 and x86_64.
-
New Merge() method in TSeqCollection which allows the merging of
the objects in the collections.
-
Port to Mac OS X 10.5 (Leopard), both 32 and 64 bit versions.
-
Add TApplication::HandleException() method, which gets called by
TSystem::DispatchSignals() in case of an exception (sigbus,
sigsegv, sigill or sigfpe). In derived TApplication's one can
now not throw or do something else to reset the environment.
-
New TUri class implementing the RFC 3986 (http://rfc.net/rfc3986.html).
Meta
-
Allow for machine independent rootmap files by supporting shared
library names without extension in the rootmap files.
CINT
- Core.
Issue with "ifunc table overflow" on auto-loading is fixed.
Remove loadfile of bool.h.
Simplify and fix parsing of cast to basic type.
Fix parsing of templated operators and constness determination of conversion operators' (return) type.
Better error message for dangling parentheses.
Support for new platforms (MacOSX 10.5, MIPS, HPPA, MSVC2008).
- Reflex. Split off development for GCCXML0.7; fall-back to 0.6 happens during configure.
GCCXML0.6 is now deprecated.
Make Reflex rootmaps compatible with CINT's (no std:: in template parameters).
New options for genreflex:
--iocomment only stores comments in dictionaries that are relevant for ROOT I/O.
--interpreteronly generates a minimal dictionary that skips non-public data members.
Reflex's typedef longlong is now removed.
Variables and enums can now be excluded from dictionaries.
genreflex(-rootcint) wrapper scripts are now created by configure.
- Cintex. Add support for ClassVersion property supplied by selection.xml: <class name="FOO" ClassVersion="42">. This number is equivalent with the number provided to ClassDef(FOO, 42).
THtml
Searching of reference guide now uses the relative URL, i.e. it respects the version.
Simplified the library depedencies, always write the "last changed" field, show proper #include paths (i.e. only remove "include" for ROOT, not the full directory).
Added static LoadAllLibs() that will load all libraries with a rootmap.
Improve appearance of pages in TGHtml by hiding the tool box if no javascript.
Implement multi-threaded MakeAll(), which doesn't work yet for "Begin_Macro" / "Begin_Latex" due to a TCanvas limitation.
Fix for ROOT's new ViewVC.
Increase font size of pre-blocks. Make sure return / member types are not wrapped.
I/O
- Certified and extended the schema evolution to and from any of numerical
types
involving on one end or the other any of the many variations of Float16_t
and Double32_t.
- Added the annotation (aka the comment part with [xyz]) of data members
that
Float16_t, Double32_t or C style arrays to the checksum calculation.
- The checksum of existing class with a ClassDef to allowed to match with
and without the annotations taken in consideration. This allows for reading
older file (hence with a deficient checksum) to be read without any warning
message. However this also means that if the classes on this older file
are different only by the annotation, it will not be noted.
- The code now prevents the fact that any consecutive Double32_t,
independently of their annotation are 'compiled' together and thus only the
annotation of the first one are used (incorrectly). To support
backward
compatibility with files written with this bug, the version number of
TStreamerInfo
has been increased to 6. The compilation is still done the same way for
'old'
TStreamerInfo (TStreamerInfo version 5 or less). However if the Double32_t
are changed to Float16_t, since the compilation is turned off because of
the schema evolution, the 'wrong' annotation might be used for those old
files. [This should be rare]
-
Add Warning messages in caseobject.Write is called and there is no directory/file to write. The warningsare illustrated by the following example session:
root [] n = new TNamed("myname","my title");
root [] n->Write()
Error in <TROOT::WriteTObject>: The current directory (Rint) is not
associated with a file. The object (myname) has not been written.
root [2] gDirectory = 0;
root [3] n->Write();
Error in <TNamed::Write>: The current directory (gDirectory) is null. The
object (myname) has not been written.
- Speed up I/O by invoking ShowMembers()
directly for TObject-derived objects, instead of going via the
interpreter.
- Enable specifying the range of the element of an array of Double32_t (which was documented but disabled (In this case the double were always stored as
floats):
Int_t fN;
Double32_t *fArr; //[fN][-10,10,16]
- In hadd, reduce the requirement from 3 to 2 arguments, this
allows to call hadd newfile.root @list)
- In TSystem::Load, remove an explicit check to see if a lib is
statically linked in the main application. It was interfering in a complicated
way with the autoload mechanism and preventing some libs from being
autoloaded that needed to be loaded (this fixes issue 27631).
- Allow updating a file that was previously created as an empty ROOT file
Important Note about Class Versions
This version introduces support for transitioning classes
from the mode where no class version is specified
(and the checksum is always used for lookup) and a mode
where the user specifies an explicit version number for
the class (Allow for simplier, clearer data model evolution).
The class version can be specified in 3 different ways:
- Use rootcint and add a ClassDef macro in the class declaration:
class MyClass {
...
ClassDef(MyClass,10);
};
- Use rootcint and add a RootClassVersion macro in the class source file:
RootClassVersion(MyClass,10);
- Use genreflex and specify a ClassVersion property in the selection.xml
:
<class name="MyClass" ClassVersion="10"/>
Those 3 solutions set the class version of MyClass's TClass object
to 10.
In order to avoid a clash between this class version (and any future
class versions) and the class versions given by default to the
non-versioned layout of the class, you MUST set this class version to
a number that is greater than the number of distinct non-versioned layout.
Otherwise you may see warning messages like:
Warning in TStreamerInfo::BuildCheck:
The class MyClass transitioned from not having a specified class version
to having a specified class version (the current class version is 2).
However too many different non-versioned layouts of the class have been
loaded so far. This prevent the proper reading of objects written with
the class layout version 3, in particular from the file:
myclass3.root.
Addition Details:
When loading a file containing a non-versioned layout of a class, this
layout is assigned the next 'free' number in the list of StreamerInfo.
In particular this means that if many files with non-versioned layout
of the class are loaded before the loading of a library containing a
versioned class layout, the slot reserved for this version layout may
already be occupied and you will get the following error message:
The class MyClass transitioned from not having a specified class version
to having a specified class version (the current class version is 2).
However too many different non-versioned layouts of the class have
already been loaded so far. To work around this problem you can
load fewer 'old' file in the same ROOT session or load the C++ library
describing the class MyClass before opening the files or increase the
version number of the class for example ClassDef(MyClass,3).
Do not try to write objects with the current class definition,
the files might not be readable.
Also if many files with non-versioned layout of the class are read
before a file with a versioned layout (and this number is too low), you
may get the following error message:
Warning in TStreamerInfo::BuildCheck:
The class MyClass transitioned from not having a specified class version
to having a specified class version (the current class version is 2).
However too many different non-versioned layouts of the class have been
loaded so far. This prevent the proper reading of objects written with
the class layout version 3, in particular from the file:
myclass3.root.
SQL
- Allow (usefull) derivation ofTMySQLServer by making the members protected
- New virtual method TSQLStatement::SetMaxFieldSize(). It implemented for now only for Oracle and specifies maximum size in bytes, which should be used for field in read/write operation.
- Improved implementation of OracleStatement::GetBinary method. Now not only BLOB, but also CLOB, LONG, BFILE, CFILE Oracle datatypes are supported for reading. Fow now BFILE and CFILE not supported for writing.
Dcache Plugin:
- Enable the use of the vector nterface of the new version of DCache (version 1.7.0-39) as well as a good emulation of the vector interface for older version of DCache (by fetching one larger all inclusive block when a set of blocks is requested). On some applications this brinfs up to 12 times performance increase!
XROOTD plugin
- XrdClient: cache policies updated to better cope with
the TTreeCache way of requesting data
- TXNetFile/XrdClient: now it honors different per-file
settings of the internal data cache and of the read ahead size
- read ahead completely switched off for raw files
- internal
buffer of TFileCacheRead is substituted by the XrdClient's cache
- Support for asynchronous mode in
TXNetFile/TFileCacheRead/TTreeCache: when in this mode all the data
accesses are treated
asynchronously, i.e. while the future data is coming and has already
been automatically requested, the application processes the chunks
which have already arrived.
- The XrdClient's cache is treated like a
sliding window on the list of the future accesses
generated by TTreeCache; the size of this sliding cache
(which determines how much memory is actually used) is in the variable
XNet.ReadCacheSize.
- The size of the TXNetFile/XrdClient readahead is in
XNet.ReadAheadSize; this is used only
for the learning phase of TTreeCache
XROOTD
- New version 20071116-0000 (latest pre-cmsd version +
fixes in the client code)
- Several bug-fixes in
the client readv code.
PROOF
- New tutorial/proof directory with some basic examples of
PROOF running, e.g.
$ cd
$ROOTSYS/tutorials
root[0] .L
proof/runProof.C+
root[1]
runProof("simple(nevt=1000000,nhist=16)")
See the header of $ROOTSYS/tutorials/proof/runProof.C for more
explanations.
- New test/stressProof.cxx facility
$ cd
$ROOTSYS/test
$ gmake
stressProof
$ .stressProof
******************************************************************
*
Starting P R O O F - S T R E S S
suite
*
******************************************************************
*
Log file: /tmp/ProofStress_vqHj6z
******************************************************************
Test
1 : Open ............................................. OK *
Test
2 : GetLogs .......................................... OK *
Test
3 : Simple ........................................... OK *
Test
4 : H1:http .......................................... OK *
* All
registered tests have been passed
:-)
*
******************************************************************
- Added support for non-tree based processing (e.g.
Monte Carlo
generation).
The algorithm to be run is still implemented in the form
of a TSelector following the usual rules. A new implementation of the
TProof::Process method allows to specify the number of times the
Process() method of the selector has to be called; for example, if
PythiaMC.C implements a TSelector interface to the Pythia Monte Carlo
(implemented in the package Pythia6)
with PythiaMC::Process generating a Pythia event, then
root[0] TProof
*proof = TProof::Open("master");
root[1]
proof->UploadPackage("Pythia6");
root[2]
proof->EnablePackage("Pythia6")
root[3]
proof->Process("PythiaMC.C+", 10000);
can be used to generate 10000 Pythia events.
- Enable the usage of TTreeCache; can be switched-off
setting
ProofPlayer.UseTreeCache: no in the
relevant rootrc file
- Add possibility for the admin to broadcast a message to
the connected
users: TProofMgr::SendMsgToUser("message or text file","user")
- Added support for automatic merging of output object
saved
in files on the workers.
- Added mechanism to control CPU quotas by 're-nicing'
proofserv processes.
- Improve version binary compatibility checks using also
the
SVN revision number (when available) to define the running version.
- Improved notification during Reset
- Extend the version binary compatibility checks also to
the
cached selector
binaries.
- Add option 'removeMissing' to TDSet::Lookup to remove
missing files from the dataset.
- Move the data set lookup to the
TProofPlayerRemote::Process.
- Handle properly the case of incomplete
datasets: a 'missingFiles' list is returned in the output list.
- Added functionality to broadcast group priorities
- Improved determination of the query initialization time
- Extended support for processing data sets 'by name' also
to drawing operations (TProof::DrawSelect).
- Added support for entry-lists
- In
TProofServ::HandleCache, remove the full package directory when a package
re-build is needed; this avoids problems when the 'clean' target is not
(or not correctly) implemented in the package makefile.
- Use always the FQDN as name of the worker nodes
to
avoid problems in packets assignments
- Add support for multi-user mode for non-privileged daemons
- Export the ROOT version tag to proofserv as
ROOTVERSIONTAG; available to package builder scripts.
- Add support for SSH SOCKS4 tunnelling; the local port for
the tunnel
can be specified in the master URL, e.g.
$ ssh -fN4 -D 8000 lxplus.cern.ch
root[0] TProof::Open("master/?tunnel:8000")
- Add "PROOF_ForceLocal" parameter to the
TPacketizerAdaptive; if set to 1, all the data are processed locally
- Add support for remote grep functionality while
retrieving logs
- Several bug fixes
Hist
THnSparse: An efficient Multi Dimensionnal Histogram class
The new abstract class THnSparse with its incarnations THnSparseF,
THnSparseD, THnSparseC, etc, allows to histogram data in an arbitrary
number of dimensions. A traditional ("naive") approach using
n-dimensional arrays like for TH1-TH3 for dimensions higher than 3 is
not viable due to its memory
needs. Instead a sparse algorithm with very high fill and read bandwidth
is used, where only bins with entries are stored in memory. The macro
tutorials/hist/sparsehist.C compares the performance of array and
sparse
implementations. THnSparse aims in offering the same functionality as
TH1-TH3; the most important interfaces are already available.
Visualization of this histogram can currently be done using a temporary
tree as shown in tutorials/tree/drawsparse.C.
New default values for Projection, Profile, Smooth
Many default values for bin numbers were inconsistent. Now all
histogram classes follow these rules:
- If the operation uses all bins excluding over- and underflow
bins, the firstbin argument defaults to 1.
- If the operation uses all bins including over- and underflow
bins, the firstbin argument defaults to 0.
- The lastbin argument always defaults to -1.
If your code explicitly specify the default
values, e.g. because you change a parameter behind the first / lastbin,
you will need to change the bin numbers, e.g. to
h2->FitSlicesX(f2,0,-1,1,"qln"); You will not notice this
change if you did not specify the default bin numbers (e.g.
h2->ProjectionX(); or of you specified non-default values
(e.g. h2->ProfileX("xprof");).
Tree
- In MakeProxy add support for STL containers, for array with 3 dimension or more,. and fix several issue related to include files and nesting of base classes.
- In MakeProxy corrected the support for top level vector of basis type and vector of
vector of basic type.
- Fix several small memory leaks.
- Corrected support for long long in the leaflist method of branch creation.
-
We now strongly recommend using MakeProxy in all cases (where MakeClass/MakeSelector was used).
- Add Proof support to TEntryList. Fix several chain and proof related issues.
- Add an optional argument and extend functionality of the following functions in TBranch
Long64_t TBranch::GetTotBytes(Option_t *option) const
// Return total number of bytes in the branch (excluding current buffer)
// if option ="*" includes all sub-branches of this branch too
Long64_t TBranch::GetZipBytes(Option_t *option) const
// Return total number of zip bytes in the branch
// if option ="*" includes all sub-branches of this branch too
TBinomialEfficiencyFitter
- extension to 2D and 3D problems.
- a method to allow the use to change the integration precision.
(this might be necessary for the 2D and 3D cases,
depending on the complexity of the problem etc.).
- computation of a goodness-of-fit parameter (the quantity
proposed by Baker and Cousins). Together with the number of
degrees of freedom, this allows to compute easily the fit
probability using TF1::Prob(). Such computation is contained
in the 1D example, and it doesn't return a completely flat
probability distribution -- but it has to be kept in mind
that this is only asymptotically a proper chisquared variable.
- documentation.
MathCore
MathCore contains now the majority of the statistical functions. They statistical functions are all defined in the header file Math/DistFunc.h. The special function in the heqader file Math/SpecFunc.h. When running CINT it is not needed anymore to load the MathCore (or MathMore ) library when invoking a mathematical functions defined in these header file. The library is loaded automatically by including the header file. For example :
root> #include <Math/DistFunc.h> // load automatically libMathCore.so
root> ROOT::Math::chisquared_cdf_c(11,10) // to get chisquare probability (equivalent to TMath::Prob)
In detail, the changes for this realease are:
- add new implementations for some special functions based on the Cephes library from Stephen L. Moshier (see http:://www.netlib.org/cephes). The special functions implemented now using Cephes are :
- error functions (ROOT::Math::erf and ROOT::Math::erfc)
- gamma function (ROOT::Math::tgamma)
- logarithmic of gamma function (ROOT::Math::lgamma)
- beta function (ROOT::Math::beta)
- added new special functions implemented again using Cephes:
- regularized incomplete gamma function (ROOT::Math::inc_gamma) and its complement (ROOT::Math::inc_gamma_c)
- regularized beta function (ROOT::Math::inc_beta)
- incluse also the implementation from Cephes of the inverse function of the gaussian integral, positive gamma integral and incomplete beta function
- reimplement all the cumulative statistical distributions using now the new special functions. These functions were previously in MathMore and were implemented using GSL. In general, the new implementation is of the same quality as GSL but more efficient (more detailed and figures can be found in the presentation by M. Slawinska at the ROOT team meeting)
- reimplement as well almost all the quantile functions (inverse of the cumulative) for all the major distributions. MathMore contains now only few statistical functions.
- move also the beta and landau pdf functions from MathMore to MathCore
- add implementation for landau_cdf
- remove the old names for cdf and quantiles (_prob , _quant, _prob_inv and _quant_inv) which were kept in the previous release for backward compatibility.
Further changes in MathCore are:
- Remove the template parameter in the Functor and Functor1D classes, and have now these types of Functor classes:
- ROOT::Math::Functor for wrapping multi-dimensional function objects (implementing double operator()(const double *) or member functions in a ROOT::Math::IMultiGenFunction interface
- ROOT::Math::Functor1D for wrapping one-dimensional function objects (implementing operator()(double )) or member functions in a ROOT::Math::IGenFunction interface
- ROOT::Math::GradFunctor for wrapping two multi-dimensional function objects,one for the function evaluation (implementing double operator()(const double *)) and one for the partial derivatives (implementing double operator()(const double *, unsigned int)) or two member functions in a ROOT::Math::IMultiGradFunction interface
- ROOT::Math::GradFunctor1D for wrapping two one-dimensional function objects, one for the function evaluation and one for the derivative, or two member functions in a ROOT::Math::IGradFunction interface
- Add possibility to construct all these 4 Functor classes from CINT interpreted function. In this case, in addition to the function object pointer the class name needs to be passed in the constructor. For free functions it is sufficient to pass just the function pointer.
- add base classes for numerical integration, ROOT::Math::IntegratorOneDim (which has a typedef to ROOT::Math::Integrator) and ROOT::Math::IntegratorMultiDim for multi-dimensional functions. The implementation classes based on GSL and present in MathMore are loaded using the plugin manager.
- new class, ROOT::Math::AdaptiveIntegratorMultiDim implementing adaptive multi-dimensional integration based on the Genz Malik cubature method (same algorithm from CERNLIB and present also in TF1::IntegralMultiple).
- new interface ROOT::Math::Minimizer for multi-dimensional minimization. It is implemented by a classes in Minuit2 and in MathMore and based on GSL multi-dimensional minimization. The concrete classes are created using the plugin manager via the static function: ROOT::Math::Factory::CreateMinimizer(...). The default minimizer is Minuit2.
- Add constructor of TRansform3D from any type of Rotation class, not only Rotation3D. Add as well the possibility to get any type of rotations using the method Transform2D::GetDecomposition and Transform3D::Rotation. Furthermore, any type of Rotation can be used as well in the operator* to get a Transfrom3D from the combination a Translation3D or another Transform3D class.
- Add a new new free function ROOT::Math::VectorUtil::DeltaR2 to calculate the square sum of the difference in phi and eta between two LorentzVector's
- Add dictionary generation for Lorentz Vectors based on ROOT::Math::PtEtaPhiM4D<Double32_t>.
Add as well the generation of the dictionary for all the coordinate types based on Double32_t.
- Fix a compilation problem when including only the file PositionVector3D.h
A new test has been added in $ROOTSYS/test, stressMathCore testing mathematical functions, physics vectors and matrices including I/O.
More detailed description of the current MathCore release (and the other Math libraries) can be found at this location.
MathMore
This new release contains:
- Rename the class ROOT::Math::Integrator to ROOT::Math::GSLIntegrator to distinguish from the main interface class which has been put in the mathcore library. The new Integrator class creates the GSLIntegrator using the plug-in manager.
- Add in the class ROOT::Math::GSLIntegrator for Cauchy principal value integration.
- New class ROOT::Math::GSLMCIntegration for multi-dimensional Monte Carlo integration using the methods present in GSL. These nethods are: VEGAS, MISER and PLAIN Monte Carlo integration
- Add a class for using GSL multi-dimensional minimization (ROOT::Math::GSLMinimizer) .
- Add a new class for non linear least-square fitting (ROOT::Math::GSLNLSMinimizer) based on the Levemberg-Marquardt minimization algorithm.
- New classes for simulated annealing, ROOT::Math::GSLSimAnnealing and ROOT::Math::GSLSimAnMinimizer which implements the same Minimizer interface of the other minimizer classes.
- Improve the ROOT::Math::Interpolator class by adding the possibility to set the interpolation data later on via the method SetData
- This release contains some improvements in the special functions thanks to some patches sent by C. Crawford:
- Add missing implementation for the laguerre (ROOT::Math::laguerre) and spherical legendre (ROOT::Math::sph_legendre) functions which are specified in the proposal for the next version of standard C++ (C++0x);
- fix a phase in the ROOT::Math::assoc_legendre function to be consistent with what specified by C++0x;
- use double values for the parameter m in the ROOT::Math::assoc_laguerre function.
A new test has been added in $ROOTSYS/test, stressMathMore testing numerical integration, derivation and root finding algorithm
More detailed description of the current MathMore release can be found at this location.
SMatrix
- Add a new new method SMatrix::Trace to calculate the trace (sum of the diagonal elements) of a matrix.
Minuit2
- fix the maximum edm value allowed for convergence of the minimization to be 0.001 * tolerance. This is the same as in Fortran version and it is the value documented in the User Guide
- fix a similar tolerance problem in Minos and MnFuncitonCross. Use same values now as in Fortran version
- add a new method to FunctionMinimum to set the error definition, to allow Minos to run with a different error definition than Migrad.
- add a new class ROOT::Minuit2::Minuit2Minimizer implementing the ROOT::Math::Minimizer interface. A test program minuit2/test/testNewMinimizer.cxx shows how to use the new interface.
Unuran
-
Use in this release a new version, 1.1.1 which contains a new method for generating random variates from multi-dimensional distributions (MVTDR) and fixes some warning messages during compilation on gcc4.
- Add possibility to change efficiently the distribution parameters using the method TUnuran::ReInitDiscrDist for the discrete distributions (Poisson and Binomial). See test examples unuran/test/unuranDiscrete.cxx on how to do that.
TVirtualFitter
-
In the implementation of the methods GetConfidenceIntervals use central confidence intervals for the CL values and not one-sided intervals as before.
- Fix a bug in TFitter for getting the confidence interval result in a TH1 or TGraph2D object
ROOFIT
New features in 5.17/02
- Class RooWorkspace. Generic container for persistence of both data and functions, p.d.f.
and composite objects. Right now roughly 90% of all RooFit p.d.f classes have been tested
and adjusted to make persistence through RooWorkspace possible. This is includes most basic p.d.f shapes
as well as operator classes RooAddPdf and RooProdPdf.
- New function RooAbsPdf::createProjection() which returns a projection of a p.d.f that
is a RooAbsPdf itself
- New class function class RooProfileLL which represents the profile likelihood for a given input
likelihood and a given set of observables. The profile likelihood is calculated by minimizing the likelihood
w.r.t all parameters for each observable value.
- New message service singleton class RooMsgService that will become standard interface for all RooFit
warning, error, info and debug messages. This new interface allows detailed user control over which messages
are logged selecting on topic (integration,plotting etc...), object class name, object name and message level.
Sofar mostly event generation and integration messages have been reimplemented with the new interface.
New features in 5.17/04 (RooFit 2.20)
- Fast numeric convolution operator class based on Fourier Transforms
- A new operator class RooFFTConvPdf has been added that can convolve any
arbitrary pair of RooFit p.d.f.s. The class exploits the convolution theorem
f(x) (*) g(x) --F--> f(k_i) * g(k_i)
and calculates the convolution by calculating a real->complex FFT of both input p.d.f.s,
multiplying the complex coefficients, and performing the reverse complex->real FFT
to get the result in the input space. This class using the TVirtualFFT to
the (free) FFTW3 package (www.fftw.org) and requires that your ROOT installation is
compiled with the --enable-fftw3 option to be able to use it. Here is an
example fragment convolving a Landau with a Gaussian:
RooRealVar x("x","x",-10,20) ;
x.setBins(1000) ;
RooRealVar mx("mx","mx",0) ;
RooRealVar sx("sx","sx",1,0.1,10) ;
RooGaussian gx("gx","gx",x,mx,sx) ;
RooRealVar ml("ml","mean landau",-3.,-10,10) ;
RooRealVar sl("sl","sigma landau",0.3,0.1,10) ;
RooLandau lx("lx","lx",x,ml,sl) ;
RooFFTConvPdf gxlx("gxbx","gx (X) bx",x,gx,lx) ;
Note that the performance, in terms of speed and stability, of class RooFFTConvPdf is
vastly superior to that of RooNumConvPdf. An unbinned maximum likelihood fit of
the above p.d.f to 10000 data points takes of order 5 seconds.
The number of sampling points for convolution is taken from the number bins associated
with the convolution observable. Note that the default number of bins is 100, for a good
quality convolution you should set this to at least 1000.
An important feature of FFT convolutions is that the observable is treated in a
cyclical way. This is correct and desirable behavior for cyclical observables such as angles,
but it may not be for other observables. The effect that is observed is that if e.g. a
p.d.f is zero at xMin and non-zero at xMax some spillover occurs and
a rising tail may appear at xMin. This effect is eliminated in RooFFTConvPdf by default by inserting a buffer zone
in the FFT calculation in between the points where xMax and xMin meet. The default buffer size is 10% of the
observable domain size and can be changed with setBufferFraction() member function, e.g.
for observables for which the cyclical behavior is deseribale.
It is foreseen that the functionality of this class is expanded to multi-dimensional convolutions
in future RooFit versions.
- Upgraded RooClassFactory functionality.
- Methods makeFunction() and makePdf() now take optional
extra argument with function expression allowing to construct
fully functional class code rather than a template
RooClassFactory::makeFunction("RooDilution","w,w_p0,w_p1","1-2*(w_p0+(1-w_p1)*w)") ;
- New methods makeAndCompileFunction() and makeAndCompilePdf()
call methods above and automatically compile function
using ROOT ACliC functionality
RooClassFactory::makeAndCompileFunction("RooDilution","w,w_p0,w_p1","1-2*(w_p0+(1-w_p1)*w)") ;
RooDilution* D = new RooDilution("D","dilution",*w,*w_p0,*w_p1) ;
- New methods makeFunctionInstance() and makePdfInstance()
call method above an instantiate object of just compiled
class using CINT functionality. This layer of functionality
allows to replace interpreted RooFormulaVars with compiled
code:
Example:
RooAbsReal* f = new RooFormulaVar("f","D(1-2w)",RooArgSet(D,w)) ;
becomes
RooAbsReal* f = RooClassFactory::defineFunction("f","D(1-2w)",RooArgSet(D,w)) ;
Optional 4th argument allows to specify analytical integrals of function
expression that will be advertised and implemented by the compiled code.
If in case of the above example D is a discrete variable with states +1 and -1
one could add ,"D:0") to specify that the integral over D is zero.
Note that this feature does not enhance the functionality of the function object,
as any integral can be calculate numerically, but rather speeds up integration
for cases where you know the analytical answer to the calculation.
- All function and p.d.f making methods now also accept RooAbsCategory discrete variables
- New classes for p.d.f.s that cache values
In addition the following fixes and improvements have been made
- New SumCoefRange(const char*) named argument that can be passed to fitTo() and
the RooNLLVar constructor. If specified, it will instruct all RooAddPdf nodes
in the function expression to interpret their fraction parameters in the range
with the specified name. Example
sigplusbkg.fitTo(*data,Extended()) ;
results in nsig and nbkg counts over entire domain of observables, whereas
x.setRange("sig",-10,10) ;
sigplusbkg.fitTo(*data,Extended(),SumCoefRange(sig)) ;
will modify interpretation of nsig and bkg such that they represent the counts
in the range named "sig".
- Complete rewrite of internal function optimization.
The code that manages the internal optimization of complex p.d.f expression trees
for evaluation in likelihood calculations has been completely written. A key advantage
of the new implementation is that all function object that create caches that
represent partial or auxiliary function structures (such a RooProdPdf products
of partial integrals and RooAddPdf coefficient projection integrals) now transparently
advertise these structure to the optimizer and these cached structure are optimized as well.
The speedup realized with these changes depends very much on the actuall application and
can range from none to enormous.
- Reduction of overhead in and streamline of calculation of numeric integrals of any kind.
- Improved handling of coefficient integration for classes deriving from RooAbsAnaConvPdf.
In new scheme, integration configuration can be different for each coefficient, rather
than having a unique code per p.d.f. New implementation relies on implementation providing
the optional RooArgSet* coefVars(Int_t coefIdx) const method.
New features in 5.17/06 (RooFit 2.23)
- Graphical representation of composite RooFit objects
New method RooAbsArg::graphVizTree(const char* filename) to support drawing graphs of
any composite RooFit function object. To make actual graphics output run dot -Tps -o graph.ps filename.dot
The complete suite of graphics tools, including dot can be downloaded from www.graphviz.org.
(This is the same tool that is used to draw the ROOT class hierarchy diagrams for the ROOT online class documentation)
- Interface change for analytically convolved classes
Signature of method RooAbsAnaConvPdf::getCoefAnalyticalIntegral(Int_t coef, RooArgSet& allVars,
RooArgSet& analVars, const char* rangeName=0) const has changed to include new first argument that
indicates coefficient to which output applies. This change is interface is necessary to make new optimization
scheme work properly for convolved p.d.fs. All RooAbsAnaConvPdf implementations in RooFit have been adapted, but
external p.d.f classes must be migrated as well.
- Migration of all remaining RooFit cout print statements to new RooMsgService facility
- Large number of assorted minor fixes, speed improvements, plugging (small) memory leaks, continuing work on enabling
and fixing persistence of more RooFit function classes.
- New automated regression test suite stressRooFit in $ROOTSYS/test that runs O(20) separate test modules
with automated comparison to reference results.
TMVA
The following list contains the changes since ROOT release 5.16/00
-
Dataset preparation:
-
Pre-cuts: Preselection cuts can now be applied
independently for signal and background in the
PrepareTrainingAndTestTree phase.
-
Event weight expressions: Event weights can now be
set individually for signal and background via the calls
factory->SetSignalWeightExpression(
"<signal-expression>" ) and
factory->SetBackgroundWeightExpression(
"<background-expression>" ). The former call is
still supported.
- Methods:
-
PDERS: New normalisation option
"NormTree" for the binary search tree used in
PDERS. The tree sorting is modified to achieve trees with
equal branch lengths, which, in average, speeds up
searches.
-
PDERS: Significant speed improvements for
PDERS. For the options to benefit from this, see the
example "PDERSkNN" in
$ROOTSYS/tmva/test/TMVAnalysis.C. Thanks to
Kamil Kraszewski and friends from Cracow for implementing
this.
-
Fisher: Previously, the input variables used by
the Fisher classifier were always normalised to
[-1,1]. This restriction has been removed, so that it is
now in the hand of the user to decide whether or not
normalisation is applied. Choose
"Normalise"
("!Normalise") for normalisation (no
normalisation), default is 'no normalisation'.
-
BDT: Shortened BDT weight-file and standalone
C++ reader class by 20% and 50%, respectively.
-
GUI:
-
Overtraining test: a new GUI button (corresponding to an
extension of the macro
$ROOTSYS/tmva/test/mvas.C) is available to
plot a comparison of the classifier response distributions
for the training and independent test data sets. The
results of a Kolmogorov-Smirnov compatibility test are
printed on stdout and plots.
-
Significance evaluation: graphical presentation of the
signal significance as a function of the mva output. The
user number of expected signal and background events can
be set via a dialog box.
-
BDT: The user can now plot arbitrary decision
trees that comprise the BDT.
-
Application: The cuts corresponding to a
given signal efficiency can be retrieved via the reader. An
example for this is implemented in
$ROOTSYS/tmva/test/TMVApplication.C. Briefly,
retrieve the cuts classifier object as follows:
TMVA::MethodCuts* mcuts =
(TMVA::MethodCuts*)reader->FindMVA( "CutsGA method" );,
define cut vectors (a vector of pairs can also be retrieved
via overloaded GetCuts function):
std::vector<Double_t> cutsMin;
std::vector<Double_t> cutsMax; and fill them via:
mcuts->GetCuts( wantedSignalEfficiency, cutsMin, cutsMax
);
-
Plugin capability: New multivariate methods can now
easily be used within the TMVA framework. The user needs to
derive a class from
MethodBase and implement the
IMethod interface. Then the method can be called
via ROOT's plugin mechanism, an example is given in
$ROOTSYS/tmva/test/TMVAnalysis.C.
-
Bug fixes:
-
Small fix in MLP network plotter.
-
Fix of problem with TChain treatment (occurred in ROOT >=5.15) in DataSet.
-
Memory leaks in the Reader class are removed: the Reader
is now properly destructed (deletion of all handled
classifiers). Thereby, pointer problems in the destructors
of Fisher and SVM have been found and fixed.
-
In later ROOT versions (after 5.14) the macro
TMVApplication.C produced a segmentation fault when run
from the ROOT prompt (the compiled version in the examples
directory worked fine). This problem is now solved.
-
The color selection has been adapted to the new color
palette that was introduced in ROOT 5.16. The macros
should now look alike with all ROOT versions (above
4.02/00).
-
Very important bug fix: the application of cuts in the
PrepareTrainingAndTestTree call in conjunction with the
use of several trees (ie, several consecutive calls of
factory->AddSignalTree(...) or
factory->AddBackgroundTree(...)), lead to a wrong
application of the cut to all trees but the first one in
the signal and background chains. More details can be
provided if requested - please contact the authors. We
wish to thank Manfred Groh for spotting and analysing the
problem!
-
Some compilers complained about a missing #include
"TMVA/Configurable.h" in the Reader class. This has been
fixed.
-
Fixed problem in RuleFit's standalone class when using
integer input variables.
-
Fixed compilation problem when using decorrelation
preprocessing of input variables in C++ standalone reader
classes.
-
Fixed bug in number-of-plots calculation in correlation
script.
-
Fixed bug in printing of number of events in case of
several trees (no impact on results).
-
Fixed inconsistency between cut optimisation and cut
reading: the aligned definition of min and max cuts is: a
variable passes a cut if: min < var <= max. (This
inconsistency may have affected your results if you used
cut optimisation together with integer variables. Please
check with the new version.)
-
Fixed macro path in TMVAGui.C to fix problem when running
the GUI in the ROOT/TMVA distribution. Also: TMVA Style
moved from TMVAlogon into tmvaglob to fix style problem
when running in the ROOT/TMVA distribution.
-
Fixed "MinMax" and "RMS" options of PDERS (thanks to
Junpei Maeda for spotting this)
-
Fixed compilation problem in MetricEuler class on some
platforms
Remark: We are developing a new, more flexible
TMVA design, which supports the boosting and combination of
arbitrary base classifiers. While this code is ready, there was
not enough time to perform all the test its robustness, and we
were reluctant to put it into this production release of ROOT. It
will follow in one of the next development releases.
Eve
Eve - Event Visualization Environment - is a new module in ROOT,
based on experiment-independant part of the ALICE event display
developed in cooperation between ALICE offline project and ROOT
during the last two years. It has been used in ALICE for more than
a year to perform high-level event visualization, debugging of
simulation and reconstruction code as well as for raw-data
visualization.
The components of Eve also allow for a very efficient construction
of simple event-displays that do not rely on any external
framework. For example, if one wants to visualize clusters and
tracks stored in a ROOT file, one can simply use
TFile::MakeProject() function to automatically generate class
declarations and dictionaries on the fly and use them to access
the experiment data in a format that mimics its native
representation, including class members and containers. From that,
visual representations of objects can be created via simple CINT
scripts. See a complete example for display of ALICE ESD tracks
and clusters in tutorials/eve/alice_esd.C.
Eve is built on top of ROOT's GUI, GL and GED infrastructure and delivers
the following main features:
- Base-classes for representation of visual objects that can
be presented in list-tree views, object-editors and rendered
via OpenGL (TEveElement and sub-classes).
- Application manager class TEveManager for top-level
management of elements, GUI components, geometries and events;
- Classes for presentation of full TGeo geometries
(TEveGeoNode and TEveGeoTopNode) as well as of
simplifed geometries via extraction of shape-data
(TEveGeoShape). See the
tutorials/eve/geom_xyzz.C macros that display
geometries of ALICE, ATLAS and CMS in the Eve browser.
- Classes for presentation of trajectories or tracks
(TEveTrack, TEveTrackPropagator) and hits or
clusters (TEvePointSet, TEvePointSetArray).
- Base-classes for presentation of raw-data or digits
(TEveDigitSet, TEveQuadSet and
TEveBoxSet). A collection of objects can be assigned
common signal-to-color mapping (TEveRGBAPelette) and
surrounding frame (TEveFrameBox).
- Base-classes for 2D projections with dynamically controllable
fish-eye magnification of the vertex region
(TEveProjectionManager and
TEveProjection). Tracks, points and geometries can be
projected automatically. R-phi and Rho-z projections are
currently supported.
- TriangleSet class for presentation of generic
triangle meshes.
GUI
- TGTextEdit
- Added new data member and corresponding methods allowing to hide cursor in the TGTextEditor window when when focus went out from its window.
SetDisabledAndSelected(Bool_t on) was performed in the user's code.
- New data member:
Bool_t fEnableCursorWithoutFocus - enable cursor visibility when focus went out from text editor window (default is kTRUE)
- Added following new methods:
- TGTextEdit::EnableCursorWithoutFocus(Bool_t on = kTRUE) - setter.
- TGTextEdit::IsCursorEnabledithoutFocus() - getter.
- Drag & Drop for TGListTree
Drag & Drop mechanism has been implemented in TGListTree. Here is a simple example of how to use it:
// add an item in a list tree
TGListTreeItem *itm = fListTree->AddItem(item,fname,pic,pic);
// to set this item as a DND source:
itm->SetDNDSource(kTRUE);
// to set this item as a DND target:
itm->SetDNDTarget(kTRUE);
- Changes in TGListTreeItem
- Added new data member:
- Int_t fDNDState - DND Flag. can be 0 or one of the following: kIsDNDSource kIsDNDTarget.
- Added following new methods (setters and getters for fDNDState):
- TGListTreeItem::SetDNDSource(Bool_t onoff) - sets the TGListTreeItem as drag source.
- TGListTreeItem::SetDNDTarget(Bool_t onoff) - sets the TGListTreeItem as drop target.
- TGListTreeItem::IsDNDSource() - check if the TGListTreeItem is drag source.
- TGListTreeItem::IsDNDTarget() - check if the TGListTreeItem is drop target.
- Changes in TGListTree
- Added new data member:
- TBufferFile *fBuf - buffer used for Drag and Drop.
- TDNDdata fDNDData - Drag and Drop data.
- Atom_t *fDNDTypeList - supported DND types list.
- TGListTreeItem *fDropItem - item on which DND is over.
- Added following new methods:
- TGListTree::HandleDNDDrop(TDNDData *data) - handles drop events inside the TGListTree.
- TGListTree::HandleDNDPosition(Int_t x, Int_t y, Atom_t action, Int_t xroot, Int_t yroot) - handles dragging position inside the TGListTree.
- TGListTree::HandleDNDEnter(Atom_t * typelist) - handles drag enter event inside the TGListTree.
- TGListTree::HandleDNDLeave() - handles drag leave event inside the TGListTree.
- TGListTree::GetDNDData(Atom_t) - returns the drag and drop data from the source.
- Added new signal:
- TGListTreeItem::DataDropped(TGListTreeItem *item, TDNDdata *data) - signal on which TGListTreeItem the drop event has occured and with which data.
- New ROOT Browser
The new ROOT Object Browser has been designed to be dynamically and extensively customizable.
- Browser Version
Selection of the browser version is done via the 'Browser.Name' entry in 'system.rootrc' configuration file:
- Browser.Name: TRootBrowserLite - Lite (old) version (default).
- Browser.Name: TRootBrowser - New version.
- Features
- New layout:
Has three main tabs, separated by horizontal and vertical splitters:
- Plug-in management
Each Tab can be populated with plug-ins. A plug-in can be a macro or a command, as shown below:
- Example 1 - create a browser and execute a macro as plugin:
TBrowser b;
b.ExecPlugin("MyPlugin", "MyMacro.C");
In this example, the macro 'MyMacro.C' creates a TGMainFrame, which will be embedded at the default location (righ tab), creating a new tab element called 'MyPlugin'.
To be able to use a macro as plug-in, it must create a TGMainFrame, passing gClient->GetRoot() as parent window in its constructor, i.e.:
fMain = new TGMainFrame(gClient->GetRoot(), 300, 150);
- Example 2 - create a browser and execute a command as plug-in:
TBrowser b;
b.ExecPlugin("Canvas", 0, "new TCanvas()");
In this example, the TCanvas will be embedded at the default location (right tab), creating a new tab element called 'Canvas'.
This can be achieved with any class creating (or inheriting from) a TGMainFrame.
The only requirement is to pass gClient->GetRoot() as parent in the constructor, as shown previously.
Plug-in execution is also available from the 'Browser' menu.
- There are several plug-ins already available in ROOT:
- File browser (TGFileBrowser).
This is the core of the new browser, allowing to browse system directories and ROOT files and execute macros, as in the old browser.
- Text editor (TGTextEditor).
ROOT text editor, allowing to edit, execute and compile macros. Double-clicking on a macro file in the file browser while the active tab contains a text editor will open the macro in the editor.
- Canvas (TCanvas).
Double-clicking on a graphic object inside a ROOT file will display the histogram in the canvas.
- Command (I/O) redirection (TGCommandPlugin).
This plug-in creates a combo box (populated with root command history) to enter interpreter commands (stdin), and a text view displaying the output (stdout/stderr).
- HTML browser (TGHtmlBrowser).
ROOT HTML browser, allowing to browse web pages and to open remote ROOT files (via http protocol).
- Proof (TSessionViewer).
Proof and local sessions Manager
- GL Viewer.
ROOT OpenGL viewer.
- Specifying startup options
A list of options (plugins) for the new TRootBrowser is specified via the env 'Browser.Options' in .rootrc, default being: FECI
Here is the list of available options:
- Usage
By default, the left pane contains the file browser, which is the core of the browser.
From there, user can:
- Execute Root macros:
To execute the macro, double-click on the file icon.
NB: the editor must not be active on the right tab, otherwise the macro will be opened in the editor.
- Open text files in the editor:
To open the file, double-click on the file icon while the editor tab being active on the right tab.
It is also possible to drag the file from the list tree and drop it in the editor.
Once the file is opened in the editor, if it is a Root Macro, it can be executed with the button 'execute' in the editors's tool bar.
- Display picture files in the canvas:
Drag the picture file from the list tree and drop it in the canvas.
- Browse ROOT files:
To open the file, double-click on the file icon. Its content will be displayed in the list tree.
From there, user can double-click on any item (i.e. histogram) to display it in the canvas.
It is also possible to drag the item from the list tree and drop it in the canvas.
- Browse ROOT files from Web:
- From the 'Browser' menu, select 'New HTML'. A new tab is created, containing a HTML browser.
- From there, type the URL from where you want to access Root files.
- Click once on the file you want to open. The file is opened and the browser automatically switch to the 'ROOT Files' folder in the list tree.
From there, just browse the file as a local Root file.
- New classes
- TGFileBrowser, a file browser plugin for the new TRootBrowser
- TGCommandPlugin, a command I/O plugin for the new TRootBrowser
- TGHtmlBrowser, a html browser plugin for the new TRootBrowser
- Examples
-
Browser with Canvas plugin
-
Browser with Editor plugin
-
Browser with HTML Browser plugin
-
Browser with HTML Browser plugin (browsing remote root files via html)
- TGButton Classes
Radio and Check Buttons (check & radio buttons) remember their state (ON or OFF) when disabled.
This means that whenever a button is disabled its status is saved in the user space, and
users will be able to see the last (and maybe still valid) state of the button.
The new method SetDisabledAndSelected(Bool_t on) can be used in case the state of a disabled
button has to be changed.
Implemented possibility for multi line labels of text buttons. To create them users need only to
add the new line symbol '\n' into the label string.The new method SetMargins allows to set left,
right, top, bottom margins around the text inside the button space.
- TGButtonGroup
Implemented interface to set the state of a button group as enabled or disabled. All buttons in
the group save their state (ON or OFF) when disabled and return to it if no call to the method
SetDisabledAndSelected(Bool_t on) was performed in the user's code.
- TGSplitButton - New Class
This class implements a Split Button Popup widget, which has a button and a menu.
The Split Button Popup control allows you to add a group of controls that will be displayed
via a popup menu when the arrow part of the button is clicked. Once a menu entry is selected
from the drop-down list, you can simply click on the button half of the split button to execute
the code for the selected control. The menu includes predefined commands for secondary functionality.
Consider the following when you include split buttons in an application: there are 2 modes available
that may be changed by "on the fly" by calling the
SetSplit(Bool_t) method.
- If the button is split (i.e. SetSplit(kTRUE) was called), a menu will popup when the menu area
of the button is clicked (the right part containing a small triangle). Activating a menu item
changes the functionality of the button by having it emit a additional signal when it is clicked.
The signal emitted when the button is clicked, is the ItemClicked(Int_t) signal with a different
fixed value for the Int_t that corresponds to the id of the activated menu entry.
The button label should update to reflect the last item selected from the menu.
- If the button is not split, clicking it will popup the menu and the ItemClicked(Int_t) signal
will be emitted when a menu entry is activated. The value of the Int_t is again equal to the
value of the id of the activated menu entry.

- TGLabel
The method GetDefaultSize() was modified to allow fixed size labels. For example, if you do:
label->ChangeOptions(label->GetOptions() | kFixedSize);
label->Resize(100, 100);
after that the label size can not changed by the layout manager in use.
- TGCanvas, TGListBox, TGListTree, TGListView Classes
Avoided flickering effect during resizing, scrolling, exposing/overlapping of these widgets.
Implemented new painting technique uses double-buffering (back plane pixmap) and repaints
only exposed regions.
- TGFileDialog
Set fFileInfo->fFileNamesList to 0 (zero) in case Cancel button was clicked or
dialog was closed via Window Manager ([x] button on the top/right corner of dialog window).
This way users can distinguish the case when a multiple selection was made, and then the Cancel button
was pressed.
- TGListTree, TGListTreeItem
Added following new methods:
- TGListTreeItem::CheckAllChildren(Bool_t state = kTRUE) - sets the state of this
TGListTreeItem and all its children (if any) as checked if state=kTRUE (default behavior);
or unchecked if state=kFALSE.
- TGListTree::GetChecked(TList *checked) - adds the item text of all checked list tree items
as TObjString into the list 'checked'. This list is not adopted and must be deleted by
the user later.
TList *mylist = new TList();
fListTree->GetChecked(mylist);
...
mylist->Delete();
delete mylist;
- TGListTree::CheckAllChildren(TGListTreeItem *item, Bool_t state) - checks all child items of 'item'
and 'item' itself according to the 'state' value: kTRUE means check all, kFALSE - uncheck all.
TGListTreeItem *it;
it = fLTree->FindChildByName(fLTree->GetFirstItem(),"item_text");
fLTree->CheckAllChildren(it, kFALSE);
// or users can use the returned TGListTreeItem directly by calling
it->CheckAllChildren(kFALSE);
- TGMainFrame
New method SetIconPixmap(char **xpm_array) for setting window's icon from XPM data included into
the source.
#include "/home/root/icons/bld_rgb.xpm"
// bld_rgb.xpm contains char *bld_rgb[] array
main_frame->SetIconPixmap(bld_rgb);
- TGTextEntry
Added new signal method ShiftTabPressed() - it is emitted when <SHIFT> and <TAB>
keys are pressed.
- TGSplitter
Added abstract method SetFrame(TGFrame *frame, Bool_t prev) - it allows the use of the base
class pointer (TGSplitter) for configuring the horizontal (TGHSplitter) and the vertical
(TGVSplitter) splitters
- Qt Layer (BNL)
Ongoing work for Qt 4.3.x-based builds of this interface.
- Several new tutorials (see section New Tutorials below)
Spider Plots
The new class TSpider allows to produce spider plots from a TTree.
A spider view is a handsome way to visualize a set of data stored in a
TTree. It draws as many polar axes as selected data members. For each of
them, it draws on the axis the position of the present event between the
min and max of the data member.
TTreeViewer allows to scan a TTree using a spider view. Via the SPIDER button.
See new tutorial $ROOTSYS/tutorials/tree/spider.C.
Parallel Coordinates Plots
A set of new classes implement the Parallel Coordinates graphs and Candle stick charts:
TParallelCoord
The multidimensional system of Parallel coordinates is a common way of studying
high-dimensional geometry and visualizing multivariate problems.
To show a set of points in an n-dimensional space, a backdrop is drawn
consisting of n parallel lines. A point in n-dimensional space is represented
as a polyline with vertices on the parallel axes; the position of the vertex
on the i-th axis corresponds to the i-th coordinate of the point.
See new tutorial $ROOTSYS/tutorials/tree/parallelcoord.C.
This tool comes with a rather large gui in the editor. It is necessary to use
this editor in order to explore a data set, as explained below.
Reduce cluttering:
The main issue for parallel coordinates is the very high cluttering of the
output when dealing with large data set. Two techniques have been implemented
to bypass that so far:
- Draw doted lines instead of plain lines with an adjustable dots spacing.
A slider to adjust the dots spacing is available in the editor.
- Sort the entries to display with a "weight cut". On each axis is drawn a
histogram describing the distribution of the data on the corresponding
variable. The "weight" of an entry is the sum of the bin content of each
bin the entry is going through. An entry going through the histograms peaks
will have a big weight wether an entry going randomly through the histograms
will have a rather small weight. Setting a cut on this weight allows to draw
only the most representative entries. A slider set the cut is also available
in the gui.
Candle chart
TParallelCoord can also be used to display a candle chart. In that mode, every
variable is drawn in the same scale. The candle chart can be combined with the
parallel coordinates mode, drawing the candle sticks over the axes.
TParallelCoordVar
Class containing a variable for the TParallelCoord. Appears as an axis on the pad.
Options can be defined each axis separatly using the right mouse click.
These options can be applied to every axes using the editor.
- Axis width: If set to 0, the axis is simply a line. If higher, a color
histogram is drawn on the axis.
- Axis histogram height: If not 0, a usual bar histogram is drawn on the plot.
The order in which the variables are drawn is essential to see the clusters.
The axes can be dragged to change their position. A zoom is also available.
The logarithm scale is also available by right clicking on the axis.
TParallelCoordRange
A TParallelCoordRange is a range used for parallel coordinates plots. It defines
a range owned by a selection on an axis.
TParallelCoorSelect
A TParallelCoordSelect is a specialised TList to hold TParallelCoordRanges used
by TParallelCoord.
Selections of specific entries can be defined over the data set using parallel
coordinates. With that representation, a selection is an ensemble of ranges
defined on the axes. Ranges defined on the same axis are conjugated with OR
(an entry must be in one or the other ranges to be selected).
Ranges on different axes are are conjugated with AND (an entry must be in all
the ranges to be selected). Several selections can be defined with different
colors. It is possible to generate an entry list from a given selection and
apply it to the tree using the editor ("Apply to tree" button).
TParallelCoordEditor
This is the TParallelCoord editor. It brings tools to explore datas using
parallel coordinates. The main tools are:
- Dots spacing : Set the dots spacing with whichone the lines must be drawn.
This tool is useful to reduce the image cluttering.
- The Selections section : Set the current edited selection and allows to
apply it to the tree through a generated entry list.
- The Entries section : Set how many events must be drawn. A weight cut can
be defined here (see TParallelCoord for a a description of the weight cut).
- The Variables tab : To define the global settings to display the axes.
It is also possible to add a variable from its expression or delete a
selected one (also possible using right click on the pad.
TPad::WaitPrimitive
Corrected the fact that if WaitPrimitive is called with an empty argument,
it unintentionally matched any unamed primitive in the canvas.
Quality Assurance (QA) / stressGraphics
stressGraphics.cxx has been extended to test almost all graphics
primitives. This work is still on going.
stressGraphics has now 38 tests each of them testing one particular graphics
primitive or graphics feature.
stressGraphics is meant to be run in batch mode.
The procedure:
For each test, stressGraphics does the following:
- Run the test and generate the corresponding PS file.
- Compare the size of the PS file with a reference size stored in the file
stressGraphics.ref. An error is allowed because some tests use random numbers
and also the size may depend on which machine the test runs. The error for
each test is also stored in stressGraphics.ref.
- The .C file corresponding to the test is generated (SavePrimitives).
- The PS file is generated form the .C file obtained.
For points 2) and 4) the test is considered as OK if the PS file size correspond
to the file size stored in stressGraphics.ref (within the error) otherwise the
test is marked as FAILED.
When a test FAILED all the generated PS and .C files are kept for further
investigation otherwise (if the test is OK) they are removed.
stressGraphics should be run as standalone compiled (option -g -O2) program
and also in the CINT context:
$ ./stressGraphics
root [0] .L stressGraphics.cxx
root [1] stressGraphics()
root [0] .x stressGraphics.cxx
This procedure allowed to find several problems in particular uninitialized
variables and memory leaks. It will be extended in order to make ROOT graphics
more robust.
Miscellaneous
TLatex
- Some improvements when drawing #acute.
- New operator #scale[s]{my text} to apply a scale factor "s" to the
text string "my text". (from jasondet@gmail.com).
TEllipse::Draw
PaintEllipse() now uses the
FillStyle to control wether or not a filled area
should be painted in case a closed ellipse. It used wrongly the
FillColor unlike the case of an open ellipse.
TBox::Draw
The option 'l' is now available for PostScript also.
TSelectorDraw
Take into account the title offsets in x,y when generating a TH3.
TGraph, TGraphErrors, TGraphAsymmErrors, TGraphBentErrors and TMultiGraph
The SavePrimitive mechanism did not work properly. In particular
it was not possible to save various kind of graphs in several
multigraph in the same macro. Also in case of TGraph the
generated macro was wrong (Add() was missing).
In TGraphBentErrors the signatures of the two SetPointError
methods were incomplete. The shift values in the various directions were
missing. To preserve the backward compatibility, the missing parameters
have been added with default value = 0.
The new signature is now used in SavePrimitive which allows a
correct saving of the TGraphBentErrors.
TGraph::Draw
Implement the following changes:
- when option "same" is specified it is ignored
- when option "a" is specified the pad is cleared
-
In PaintGraph fHistogram's limits
are computed with some margins. The new
minimum along x is stored in "uxmin" and the new minimum along y
in "minimum".
In some cases the new minimum can be negative whereas the real
minimum is
positive. In such case, the new minimum was set to 90% of the
real minimum
in case of log scale, and to 0 in case of linear scale. Setting
to 0 in case
of linear scale, was not a good idea because if the pad is turned
into log
scale later on, then some points close to the real mimimum are
not visible.
The following macro demonstrate the problem:
{
Double_t x[2];
Double_t y[2];
x[0]= 200; y[0]=2.0271;
x[1]=3e+06; y[1]=0.0005;
TGraph *gr = new TGraph(2,x,y);
gr->Draw("alp");
gr->SetMarkerStyle(20);
gPad->Update();
gPad->SetLogx();
gPad->SetLogy();
}
Now, when the new computed minimum is negative and when the real
minimum is
positive, the new minimum is set to 90% of the real minimum in
both log and
linear scale.
TH2::Draw
- When painted with option TEXT the empty bins were drawn also
("0" appeared).
- When used with any
LEGO option, the option "0" allows to not draw the empty
bins.
hpxpy->Draw("lego2") :
hpxpy->Draw("lego2 0") :
TH1::Draw
- Make option BAR work
with option HIST as explain in the THistPainter::Paint() method
help (option HIST). Previously the option BAR was ignored when an
histo was painted with "BAR HIST".
- Two new options in
PaintErrors: E5 and E6. They are like E3 and E4 but
the empty bins are ignored.
TGraph2D
- In TGraph2D::Draw
when the option "PCOL" was used to draw a TGraph2D
having already its underlaying histrogram created, the histogram was plotted
with option "COL" before the TGraph2D was plotted with option "PCOL".
- In SavePrimitive: name the
saved TGraph2D "graph2d" instead of "graph" to
avoid problems when a TGraph and a TGraph2D are in the same
picture.
- Implement the Set(n) method.
TSpline
DistancetoPimitive and ExecuteEvent are now implemented.
Axis painting
In some case the labels "-0" was generated.
This problem was visible with the following commands:
TH2D *s = new TH2D("s","",10,0,100,10,-9e-4,5e-4);
s->Draw();
TGaxis
Some attributes were not saved by SavePrimitive(): TitleSize, TitleColor, TitleFont.
Now they are.
TWbox
The dark and bright colors are now taken from TColor.
TPie
(Guido Volpi)
- Redefinition of some static variables: in global variable the
flag is not needed, in other part the definition as const is better.
- MakeLegend() method can have 4 arguments that represent the
TLegend position: TPie::Makelegend(x1,y1,x2,y2). The default values are
the old one.
- Added the method TPie::SortSlices(Bool_t); this method sorts
the TPieSlices according the values in increasing (kTRUE) or decreasing
(kFALSE) order.
- Added the two more drawing options ">" and "<&>
applying the increasing or decreasing order.
- TPie::MakeLegend() now takes an extra argument to setup the
TLegend
header, the default now is an empty header for the legend instead
the
name of the TPie object.
-
TPie::SortSlices() has an extra argument that represents a
threshold;
if the threshold is greater than 0 (the default value), slices
with
values smaller than the threshold are merged together in a new
slice
with the label "other".
TASImage
(Valeriy Onuchin)
- The new method GetVecArray
returns a pointer to internal array[width x height] of double
values [0, 1]
This array is directly accessible. That allows to
manipulate/change the image.
- TASImage::GetArray
Fix to return correct array (previously it was truncated when
x, y shift position were not zeros).
- TAttImage.cxx
For "Pretty Palette with a Spectrum Violet->Red" set
white color to zeros.
TPad
- Fix to enable switching between non-gl and gl viewer in a pad.
- Implement PS output for geometries displayed in TPad using GL.
- The old pending problem with hatched canvases is not fixed.
When piece of graphics was moved interactivelly on a pad being painted with a
pattern, traces were left.
Some code was foreseen in Pad::PaintModified to avoid that but it
did not work. Some mods were also needed in windows version of ClearWindow.
TColor
- Two new functions: RGB2HSV and HSV2RGB to convert a color
from RGB to HSV system and vice versa.
- In TColor::InitializeColors(), SetPalette
is called only if fgPalette.fN == 0.
fgPalette.fN !=0 means that SetPalette has been, very likely,
already called from rootlogon.C. Calling it again would reset the palette.
- In the TColor destructor delete the static palette when all colors have been deleted.
- Fix a wrong definition of palette[48] (was 112 instead of 2).
- SetPalette() calls
InitializeColors() before defining the deap sea palette.
Without this call the deap sea palette definition tried to
redefine some
existing colors.
TGraphPolar
New option to not draw the polar labels.
TLegend, TPaveStats, TPaveText.cxx
- Make sure the right font is used when the text size is computed in the
Paint() methods. (Oleksandr Grebenyuk)
The following macro demonstrated the problem:
{
TCanvas *c1 = new TCanvas("c1", "c1",521,150,700,590);
c1->Range(0,0,1,1);
TPaveText *pt;
TText *text;
pt = new TPaveText(0.1106322,0.6004274,0.8448276,0.9764957,"br");
text = pt->AddText("Calculate from helvetica bold");
text = pt->AddText("Display with helvetica bold");
pt->Draw();
pt = new TPaveText(0.112069,0.1325301,0.8477011,0.5562249,"br");
pt->SetTextFont(22);
text = pt->AddText("Calculate from helvetica bold");
text = pt->AddText("Display with times bold");
pt->Draw();
TLine *line = new TLine(0.8132184,0.9558233,0.8132184,0.2309237);
line->SetLineColor(2); line->Draw();
line = new TLine(0.783046,0.5140562,0.783046,0.2309237);
line->SetLineColor(2); line->Draw();
TArrow *arrow = new TArrow(0.783046,0.2610442,0.8146552,0.2610442,0.02,"<|>");
arrow->SetFillColor(2); arrow->SetFillStyle(1001);
arrow->SetLineColor(2); arrow->Draw();
}
- TLegend:
In case of
multicolumns, the last line was outside the
frame if it was not complete.
TPostScript
In the PS files the page numbers are now written between ().
TF1
After zooming and unzooming on a plot containning several TF1 drawn with
the option SAME, the functions might be truncated. This problem was
visible with the following macro:
TF1* f[6];
double fg(double *x, double *p) {return sin((*p)*(*x));}
void test_zoom() {
for (int i=0;i<6;++i) {
f[i]=new TF1(Form("f%d",i),fg, 0,2, 1);
f[i]->SetParameter(0,i+1);
f[i]->SetLineColor(i+1);
f[i]->Draw(i?"same":"");
}
f[0]->GetXaxis()->SetRangeUser(.1,.3);
gPad->Update();
f[0]->GetXaxis()->UnZoom();
gPad->Modified();
}
TH1 titles
SetTitle now allows to have ";" (semicolon) in the histogram title and in
the axis title. "#;" is a control character allowing to define the title
and the axis title at the same time. To put a ";" in the titles, it is now
enough to write ";" or "#semicolon".
TGX11 (low level X11 pilot)
In TGX11::SetMarkerType replace the
statement
gMarker.xy[i] = xy[i];
with the lines
gMarker.xy[i].x = xy[i].x;
gMarker.xy[i].x = xy[i].y;
to bypass a bug in gcc4.2 with a wrong inlining of a copy
constructor. (found by Christian Hom)
OpenGL
TVirtualViewer3D
Add function virtual void ObjectPaint(TObject*, Option_t*).
TGLScenePad
Implement virtual TVirtualViewer3D::ObjectPaint().
TGLCamera - TGLPerspectiveCamera - TGLOrthoCamera
Introduce two transformation matrices to clearly define movement
of camera around the center point. The first transformation
matrix fCamBase defines the coordinate system placed at the camera
center point with camera up-vector as the third base vector. The second
transformation matrix fCamTrans defines the camera transformation
relative to fCamBase.
Implement a common Truck(), Rotate() and Dolly()
function for orthographic and perspective camera.
Implement an option to define camera center point
externally. Center can also be determined via picking.
TGLMatrix
Add new functions to get/set the base vectors directly.
TGLUtil
Add member UInt_t fgDefaultDrawQuality.
TGLRect
Bug fixed in Diagonal(), integer calculation overflowed.
TGLViewer
Make interface to draw camera center point.
Add option to disable/enable depth test when drawing axis guides.
TGLViewerEditor
Add GUI to manipulate camera center and to disable/enable depth
test when drawing axis guides.
TGLClipSetEditor
Change layout of labeled number entries.
TGLLightSet
Fix positioning of front light. White-space consolidation.
TGLLightSet
Fix positioning of front light. White-space consolidation.
TGLLightSetEditor
Put GUI for the 6 lights in two columns.
Tutorial glViewerExercise.C
Follow-up on changes in TGLCamera. Enable rotation on orthographic camera.
Tutorial glViewerLOD.C
Workaround for cint bug with switch statements.
TGLLegoPainter, TGLPlotPainter, etc ..
Fix the problem reported here: http://root.cern.ch/phpBB2/viewtopic.php?t=5595
Pyroot
Added the TPyDispatcher class that allows for easy programming of callbacks
from CINT into python, for the benefit of GUIs.
For example (a more complete example is included as tutorials/pyroot/gui_ex.py):
# create callback function
def MyFunction():
print 'MyFunction was called!'
# instantiate dispatcher object
disp = ROOT.TPyDispatcher( MyFunction )
# upon clicking SomeButtonWidget, 'MyFunction' will now be called
SomeButtonWidget.Connect( 'Clicked()', "TPyDispatcher", disp, 'Dispatch()' )
A limited API, usable from both C++ and CINT, is made available through the
TPython class.
In particular, the two functions:
void* ObjectProxy_AsVoidPtr( PyObject* pyobject );
PyObject* ObjectProxy_FromVoidPtr( void* addr, const char* classname );
allow conversion from and to PyROOT bound objects.
New Tutorials
- tutorials/hist/sparsehist.C: an example how to use the new multi dim histogram class THnSparse.
- tutorials/hist/drawsparse.C: an example how to visualize a sparse multi dim histogram.
use the new multi dim histogram class THnSparse.
- tutorials/fit/TestBinomial.C: New version of the tutorial illustrating the new functionality of
TBinomialEfficiencyFitter.
- tutorialsmath/Bessel.C : example showing the various Bessel functions
- tutorialsmath/GammaFun.C example showing the gamma and related functions
- tutorialsmath/Legendre.C example whowing the first Legendre polynomials
- tutorialsmath/LegendreAssoc.C example showing the first associated Legendre polynomials
- tutorialsmath/tStudent.C: - example showing the statistical functions available (pdf, cdf and quantile) of the t Student distribution
- tutorials/math/mathmoreIntegration.C: example showing how to use the
ROOT::Math::Integrator class.
- tutorials/tree/parallelcoord.C: example of new class TParallelCoord
- tutorials/tree/spider.C: example of new class TSpider.
- tutorials/gui/buttongroupState.C: an example for enabled/disabled state of a
button group with radio and check buttons.
- tutorials/gui/guiWithCINT.C: an example how to interact with CINT: entering commands and geting the output.
- tutorials/gui/buttonTest.C: an example of how to set/change attributes of the text button label..
- tutorials/gui/splitbuttonTest.C: an example of new TGSplitButton class.
- tutorials/gui/guilabels.C: added an example of a label with fixed size in pixels.
- tutorials/gui/calendar.C: an example how to use TGHtml widget to display tabular data.
- tutorials/gui/textEntries.C: an example of how to set/change text entry attributes.
- tutorials/gui/iconAsXPMData.C: an example of how to create an icon image from XPM data included into the code.
- tutorials/eve/alice_esd.C: a simple event display using Alice data.
- tutorials/eve/geom_alias.C: Demonstates usage of geometry aliases. Merge ALICE ITS with ATLAS MUON.
- tutorials/eve/geom_alice_its.C:
- tutorials/eve/geom_alice_tpc.C:
- tutorials/eve/geom_cms.C:
- tutorials/eve/geom_default.C: Demonstrates usage of "Default" geometry alias.
- tutorials/eve/lineset_test.C:
- tutorials/eve/pointset_test.C:
- tutorials/eve/quad_test.C:
- tutorials/eve/triangleset.C:
- tutorials/eve/view3ds.C:
ROOT page
- Class index - Top of the page