ROOT Version 5.30/00 Release Notes
ROOT version 5.30/00 has been released on June 28, 2011.
In case you are upgrading from an old version, please read the releases notes
of version 5.22, 5.24, 5,26 and version 5.28 in addition to these notes.
The release of version 5.32 is scheduled for November 29, 2011.
- Bindings - packages related to the interplay with other programming languages (Python, Ruby)
- Cint - the C++ interpreter
- Core - the basic ROOT functionality
- Geometry - building, representing and drawing geometrical objects
- 2D Graphics - ROOT's two dimensional graphics interface
- 3D Graphics - ROOT's three dimensional graphics interface
- Graphical User Interface - from basic GUI elements to ROOT's own, complete dialogs
- Histograming - counting values, spectra, and drawing them
- HTML - the documentation generator
- Input/Ouput - storing and reading data
- Mathemathics - everything one can use to calculate: minimizers, matrixes, FFT, and much more
- Miscellaneous - things that didn't make it into the other groups: table
- Monte Carlo - monte carlo and physics simulation interfaces
- Networking - network-related parts, e.g. protocols and authentication interfaces
- PROOF - parallel ROOT facility
- RooFit - a fitting library
- RooStats - a collection of statistical tools
- SQL - database interfaces
- TMVA - multivariate analysis tools
- Trees - ROOT's unique container class and related utilities
- Tutorials - ROOT's Tutorials
For more information, see:
http://root.cern.ch
The following people have contributed to this new version:
Bertrand Bellenot, CERN/SFT,
Dario Berzano, INFN and University of Torino, ALICE, Proof,
Brian Bockelman, UNL/CMS,
Rene Brun, CERN/SFT,
Philippe Canal, FNAL,
Olivier Couet, CERN/SFT,
Kyle Cranmer, NYU, RooStats,
David Dagenhart, FNAL/CMS,
Gerri Ganis, CERN/SFT,
Andrei Gheata, CERN/Alice,
Sven Kreiss, NYU, RooStats,
Wim Lavrijsen, LBNL, PyRoot,
Sergei Linev, GSI,
Lorenzo Moneta, CERN/SFT,
Axel Naumann, CERN/SFT,
Eddy Offermann, Renaissance,
Giovanni Petrucciani, UCSD,
Bartolomeu Rabacal, CERN/ADL, Math,
Fons Rademakers, CERN/SFT,
Paul Russo, FNAL,
Elvin Alin Sindrilaru, CERN,
Joerg Stelzer, DESY/Atlas, TMVA,
Alja Tadel, CERN/CMS, Eve,
Matevz Tadel, CERN/Alice, Eve,
Eckhard von Toerne, University Bonn, ATLAS, TMVA,
Wouter Verkerke, NIKHEF/Atlas, RooFit,
Core
TString
-
Reimplementation of the internals of TString to not use reference counting and
copy on write, but to use a more modern and thread safe Short String
Optimization (SSO) technique. Using SSO short strings (<15 on 64-bit and
<11 on 32-bit) are contained in the TString internal data structure
without the need for mallocing the required space.
TObject
-
In TObject::ls, add support for the option 'noaddr' which
prevents the printing of the address of the object. This
is useful in particular in roottest. Use this in hadd
and TFileMerger
TROOT
- New routine CloseFiles used automatically shortly before termination to
insure closing of files and sockets before the unload of any library.
- New collection 'ClosedObjects' holding pointers to TFile or TSocket that
have been closed but not deleted it. In the case of TSocket, they are added only
if they are closed by the CloseFiles.
- Add a Close member function to TProofMgr since it is added to the list of socket.
- Migrate the closing of files from various to a single place (T*System::Exit).
- Fill in the implementation of TROOT::FindObjectAnyFile.
- Mark TROOT as TObject::kInvalidObject as soon as its destructor starts,
in order to be able to veto some action later on (like autoloading).
TSystem
- Better handle the cases where the information in the rootmap file is (almost) empty.
Avoid infinite loop if one of the dependent library is missing.
Meta
- Add new fast accessors to Merge routines (See the I/O package for more details.
- Improve error message in case a schema evolution rule can not be loaded when the library is loaded
(from the generic 'it conflicts with one of the other rules' to 'the target member ... is unknown'.
- Add the ability to explicitly forbid (or allow) the splitting of a class
(TClass::SetSplit ) so that user can inforce the use of a custom streamer in all possible split cases.
- Improve the performance of TProcessUUID::AddUUID by reintroducing the THashList.
This significanly improve the performance of reading file with very large number of
directories (A file with 100,000 directories was traversed in more than 8 minutes
and is now traversed in 15s) without noticeable affecting small files.
TFolder
- Several enhancement and clarification to TFolder::FindFullPathName.
TStyle
ACLiC
- ACLiC now passes the macro __ACLIC__ to both the rootcint and compiler phases.
TWinNTSystem
- Fix 64-bit compatibility issues (__asm keyword is not allowed).
- Try (as much as possible) to avoid the disturbing "There is no disk in the drive. Please insert a disk into drive \Device\..." popup message box when calling AccessPathName() on removable disk drives with no media installed. This should fix the problem reported on the forum.
- Prevent short timers (e.g. 10ms) to keep looping in the DispatchOneEvent() infinite loop.
- Better stdout/stderr redirection (it was impossible to restore stdout using freopen on Windows 7, leaving the console as a zombie...)
- Make sure the stdout/stderr redirection works also in the case there is no console (i.e. in stand-alone applications).
- Make sure the file descriptors are valid before using them.
- The shortcuts are now working on Windows.
Building with CMake
- ROOT can now be build using the CMake build system (version 2.8).
The initial supported platforms are Linux(gcc), Windows (vc9), MacOSX(gcc). The installed libraries and executables should be compatible to the standard build of ROOT. CMake generates native makefiles and workspaces (i.e. Xcode, Eclipse, Visual Studio) that can be used in the
compiler environment of your choice. The main difference with respect
the Module.mk build is that the build is done out of the source tree,
which allows several build configurations in parallel (debug,
non-debug, optional components, etc.). The main advantage
with respect the standard build system is that for the Windows platform
it does not require the installaton of CygWin.
- Here are the basic instructions:
mkdir <builddir> # create a empty directory in which CMake will put temporary and binary files
cd <builddir>
cmake [options] <rootsources> # by default it will generate a Makefile (or NMake file on Windows)
make [options] # you can use any standard make options (e.g. -jN)
make install # installation to the source tree by default, use CMAKE_INSTALL_PREFIX to change it
- The CMake options and parameters can be viewed using the ccmake utility (cmake-gui for Windows). Here is a quick summary of them:
-DCMAKE_INSTALL_PREFIX=<installdir> # installation prefix
-Dxxxx=ON -Dyyyy=OFF # Optional ROOT components (e.g. tmva, mathcode, gdml, etc.)
-DGIF_INCLUDE_DIR=/usr/include # Specify locations for external libraries and packages
-DGIF_LIBRARY=/usr/lib64/libgif.so
-G <generator name> # E.g. "XCode", "Eclipse CDT4 - Unix Makefiles", "Visual Studio 9 2008 "
-DCMAKE_BUILD_TYPE=Debug # Other build types: Release, RelWithDebInfo, MinSizeRel
TextInput library
Replace getline / editline libraries by a single, new, platform
independent TextInput library. Previously, ROOT used separate readline
implementations for Windows (clib/Getline) and a ll other platforms
(editline/[n]curses based). The Windows prompt was limited to one line
(with '$' as continuation character), no colors, etc. The new
TextInput library works on all platforms the same way, with history
and color highlighting, multiple inputs and outputs (prompt, GUI), and
without the need to link [n]curses, i.e. it's much smaller than
before. It implements all bash-like editor shortcuts and it
enables us to add e.g. context sensitive help in the future.
The only known backward incompatibility is the constness of the
return type of Getlinem() and Getlinem(): they now return const
char*.
I/O
- Add support for the Chirp filesystem. To configure and build, chirp 3.2.2 must be installed.
- When a TFile object is deleted, make sure that CINT also 'removes' any global variables that might point to it.
- Fix support for the automatic addition to the current directory (for TTree and TH1 for example) in TKey::Read(TObject*).
- In TKey, properly handle error in the I/O routines.
- Explicitly check the validity of the zipped buffer before calling R__unzip, this allow for better error recovery.
- When double checking whether a checksum difference is sustantial, ignore the std namespace. Use CompareContent also in the case of where
the class is versioned but the 'current' streamerInfo has not yet been built.
- Prevent the I/O engine from mistakenly applying schema evolution to the TObject::fBits.
- Make sure that when a streamer info of a base class is used to stream memberwise that is always not-optimized. If the StreamerInfo on file
has the same version as the StreamerInfo in memory but the one on file need to be 'not optimized' while the one in memory is not yet built, make
sure it will not be optimized.
- Fix the reading of empty collection of object when reading without the library.
- If the sequence of actions for streaming member-wise is not created correctly (i.e. where fReadMemberWise was null previously),
we now explicitly issue a Fatal error:
Fatal in <ReadSequence>: The sequence of actions to read AliESDVertex:7 member-wise was not initialized.
aborting
- Add new optional parameter maxbuf to TXMLEngine::ParseFile() allowing the specification of the XML file size to be parsed. This fixes issue #78864.
- Add function TBuffer::AutoExpand to centralize the automatic buffer extension policy. This enable the ability to tweak it later (for example instead of always doubling the size, increasing by only at most 2Mb or take hints from the number of entries already
in a TBasket).
- Migrate the class TFileMerger from the proofplayer library to ROOT I/O library and update hadd to rely on
TFileMerger for everything but the command line argument parsing.
- Fix support for schema evolution from:
TParameter<Int_t>* MyInt; //-> version 1
to
TParameter<Int_t> MyInt; // version 2
- The TZIPFile compressed archive reader now supports the Zip64 format for
archives and file members greater than 2 and 4 GB, respectively.
MakeProject
- Add support for the case when the requested project/files in path that in not under the current directory
- Generate the code/dictonary only for pair type that do not already have a dictionary
Object Merging
We introduced a new explicit interface for providing merging
capability. If a class has a method with the name and
signature:
Long64_t Merge(TCollection *input, TFileMergeInfo*);
it will be used by a
TFileMerger (and thus by PROOF) to merge one or more
other objects into the current object.
Merge should
return a negative value if the merging failed.
If this method does not exist, the
TFileMerger will use
a method with the name and signature:
Long64_t Merge(TCollection *input);
TClass now provides a quick access to these merging
function via
TClass::GetMerge. The wrapper function
is automatically created by rootcint and can be installed
via
TClass::SetMerge. The wrapper function should have
the signature/type ROOT::MergeFunc_t:
Long64_t (*)(void *thisobj, TCollection *input, TFileMergeInfo*);
We added the new
Merge function to
TTree and
THStack.
We also added the new
Merge function to
TQCommand as the
existing
TQCommand::Merge does
not have the right
semantic (in part because
TQCommand is a collection).
In
TFileMerger, we added a
PrintLevel to allow hadd to request
more output than regular
TFileMerger.
We removed all hard dependencies of
TFileMerger on
TH1 and
TTree.
(Soft dependencies still exist to be able to disable the
merging of
TTrees and to be able to disable the
AutoAdd
behavior of
TH1).
The object
TFileMergeInfo can be used inside the
Merge
function to pass information between runs of the
Merge
(see below). In particular it contains:
TDirectory *fOutputDirectory; // Target directory where the merged object will be written.
Bool_t fIsFirst; // True if this is the first call to Merge for this series of object.
TString fOptions; // Additional text based option being passed down to customize the merge.
TObject *fUserData; // Place holder to pass extra information. This object will be deleted at the end of each series of objects.
The default in
TFileMerger is to call
Merge for every object
in the series (i.e the collection has exactly one element) in
order to save memory (by not having all the object in memory
at the same time).
However for histograms, the default is to first load all the
objects and then merge them in one go ; this is customizable
when creating the
TFileMerger object.
LZMA Compression and compression Level setting
ROOT I/O now support the LZMA compression algorithm to compress data in
addition to the ZLIB compression algorithm.
LZMA compression typically results in smaller files, but takes more
CPU time to compress data. To use the new feature, the external XZ
package must be installed when ROOT is configured and built:
Download 5.0.3 from here
tukaani.org
and make sure to configure with fPIC:
./configure CFLAGS='-fPIC'
Then the client C++ code must call routines to explicitly request LZMA
compression.
ZLIB compression is still the default.
Setting the Compression Level and Algorithm
There are three equivalent ways to set the compression level and
algorithm. For example, to set the compression to the LZMA algorithm
and compression level 5.
TFile f(filename, option, title);
f.SetCompressionSettings(ROOT::CompressionSettings(ROOT::kLZMA, 5));
-
TFile f(filename, option, title, ROOT::CompressionSettings(ROOT::kLZMA, 5));
-
TFile f(filename, option, title);
f.SetCompressionAlgorithm(ROOT::kLZMA);
f.SetCompressionLevel(5);
These methods work for
TFile,
TBranch,
TMessage,
TSocket, and
TBufferXML.
The compression algorithm and level settings only affect compression of
data after they have been set.
TFile passes its settings to a TTree's branches
only at the time the branches are created. This can be overidden by
explicitly setting the level and algorithm for the branch. These classes
also have the following methods to access the algorithm and level for
compression.
Int_t GetCompressionAlgorithm() const;
Int_t GetCompressionLevel() const;
Int_t GetCompressionSettings() const;
If the compression level is set to 0, then no compression will be
done. All of the currently supported algorithms allow the level to be
set to any value from 1 to 9. The higher the level, the larger the
compression factors will be (smaller compressed data size). The
tradeoff is that for higher levels more CPU time is used for
compression and possibly more memory. The ZLIB algorithm takes less
CPU time during compression than the LZMA algorithm, but the LZMA
algorithm usually delivers higher compression factors.
The header file core/zip/inc/Compression.h declares the function
"CompressionSettings" and the enumeration for the algorithms.
Currently the following selections can be made for the algorithm:
kZLIB (1), kLZMA (2), kOldCompressionAlgo (3), and kUseGlobalSetting
(0). The last option refers to an older interface used to control the
algorithm that is maintained for backward compatibility. The following
function is defined in core/zip/inc/Bits.h and it set the global
variable.
R__SetZipMode(int algorithm);
If the algorithm is set to kUseGlobalSetting (0), the global variable
controls the algorithm for compression operations. This is the
default and the default value for the global variable is kZLIB.
Asynchronous Prefetching
The prefetching mechanism uses two new classes (
TFilePrefetch
and
TFPBlock) to prefetch in advance a block of tree entries. There
is a thread which takes care of actually transferring the blocks and
making them available to the main requesting thread. Therefore, the time
spent by the main thread waiting for the data before processing considerably
decreases. Besides the prefetching mechanisms there is also a local
caching option which can be enabled by the user. Both capabilities are
disabled by default and must be explicitly enabled by the user.
In order to enable the prefetching the user must set the rootrc environment
variable
TFile.AsyncPrefetching as follows:
gEnv->SetValue("TFile.AsyncPrefetching", 1). Only when the
prefetching is enabled can the user set the local cache directory in
which the file transferred will be saved. For subsequent reads of the
same file the system will use the local copy of the file from cache.
To set up a local cache directory, the client can use the following commands:
TString cachedir="file:/tmp/xcache/";
// or using xrootd on port 2000
// TString cachedir="root://localhost:2000//tmp/xrdcache1/";
gEnv->SetValue("Cache.Directory", cachedir.Data());
The
TFilePrefetch class is responsible for actually reading
and storing the requests received from the main thread. It also creates
the working thread which will transfer all the information. Apart from
managing the block requests, it also deals with caching the blocks on
the local machine and retrieving them when necessary.
The
TFPBlock class represents the encapsulation of a block
request. It contains the chunks to be prefetched and also serves as a
container for the information read.
Networking
- Xrootd
- New version 3.0.4 . See the xrootd release notes for a detailed description of the changes and fixes wrt to version 3.0.3 .
SQL
Tree
Performance
- Introduce support for TTree with variable cluster size (i.e. value of fAutoFlush).
Iterating through the cluster should be done via the new class TTree::TClusterIterator (i.e. this replaces += fAutoFlush):
TTree::TClusterIterator clusterIter = tree->GetClusterIterator(which_entry_to_start_from);
Long64_t clusterStart;
while( (clusterStart = clusterIter()) < tree-<GetEntries()) {
printf("The cluster starts at %lld and ends at %lld\n",clusterStart,clusterIter.GetNextEntry()-1);
}
See TTreeCache::FillBuffer for a concrete usage example.
- Significant improvement of the performance of SetBranchAddress/SetAddress (by a factor 3 to 10 depending on the length/complexity of the classname).
- Prevent the unlimited growth of the TBasket's buffer even if the basket is reused.
When the basket is Reset (this happens when it is written and will be reused),
if the TBuffer size is greater than
- - twice the data in the current basket
- and - twice the average data in each basket (of this branch)
- and - twice the requeste basket size (TBranch::GetBasketSize).
the size of the buffer is reduced to the max of
'the data in the current basket' and 'the average' and the requested
buffer size and aligned to next highest multiple of 512.
- In TBranchRef distinguish between the entry we need (now called RequestedEntry) and the
entry we have read (fReadEntry) so that we can avoid re-reading the same entry too many
times when executing TRef::GetObject.
- Reduce by 40% the time taken GetEntry for a branch created using a leaflist (exclusive of the decompression time).
- Introduce TVirtualPerfStats::FileUnzipEvent to be able to keep track of the cost of unzipping and use this in TTreePerfStats and TBasket ... This give a good picture of where the time in unzip or in unstreaming
- Add more clusters to the TTreeCache buffer until fBufferMinSize is hit to avoid severely underfilled buffer when
a low number of branches is selected/used.
- When reading backwards, make sure to load a full (new) cluster and several other fixes to TTreeCache.
- Reduce the memory used by a TTree in half. Refactor the code reading and writing the TBasket data.
A single transient buffer holding the compressed data is now managed by TTree (and could be made thread local)
rather than having one per TBranch.
- In TTree::Fill, call FlushBasket before calling OptimizeBaskets so that we have a correct
and accurate value of fTotBytes to use as the requested memory.
In TTree::OptimizeBasket enforces hard minimun for the basket size (no lower than the
estimate size of one entry in the branch and no lower than 8 bytes).
TTree::Process
- Add support for the flag TSelector::kAbortFile.
TTree::Draw
- The line width setting was missing in a few places.
- Namely support the option 'a' for TGraphs in TTree::Draw (delegate the axis management to the TGraph object).
TTreeSQL
- Allow TTreeSQL to see temporary tables.
- Avoid creating the unnecessary array fEntryOffset ... which when its content is always set to zero actually prevent reading text field with TTreeSQL.
- Properly find the column even if they were not created by TTreeSQL itself. Fix the loading of data for the last column.
Other
- Update the branch split mechanism to no longer split a base class
that can not be split (i.e. respect the information returned
by TStreamerElement::CannotSplit (and thus TClass::CanSplit).
- In TChain::ls, print the name of the chain and indent the list of files (this fixes #79909).
- When setting fBranch in the loaded basket, make sure to set it also for the first/only basket ; this prevents a crash when calling SetBasketSize for a split top level branch in a file produced by v4.00/08.
- In TTree::Streamer, if the object we are reading in was already attached to a directory, let's make sure to unregister the object before setting fDirectory to zero.
- Prevent TChainIndex and TTreeIndex from finding the branches from the friend tree when looking up the value in the master/parent TTree. This fixes #79166.
- Update GetEntryNumberFriend and related functions to retun a Long64_t as needed.
- Fix the case of a split collection which contains a class with one
data member which is an instance of a class with more than one base
class some of which are not split (for example if one the base class
is std::vector<int>).
- Fix the problem reported at #11890
by making sure that TChain::ResetBranchAddress(TBranch*) also record the reset in the
chain's meta information about branches.
- Allow the output name passed to MakeProxy to be either a classname (to which will be added .h to make the filename) or a filename (which already has an extension).
- Allow (via the option kIgnoreMissingTopLevel) for the TTreeCloner to handle the case where the output TTree has more top level branches than the input TTree (this is usefull in case of 'horizontal' merging of TTrees and/or the case of copy and add.)
- Add support for csv files:
Add support for other delimiters (like ',') and for direct import of files in the common .csv format in TTree::ReadFile. To handle older .csv files, add support for '\r' carriage returns in addition to '\n' (which also works for "\r\n").
Proof
- Backward incompatible changes
- Starting from this version, the string to be used in
TProof::Open(...) to start a PROOF-Lite session changed to "lite://".
This is because the string "lite" prevented the use of 'lite' as
a possible name for a machine on the local domain. A reminder is
printed if 'lite' is used and the connection fails. Note that, if
Proof.LocalDefault is unset, TProof::Open("") can still be used to
start a PROOF-Lite session.
- New functionality
- In TProof::Load, add the possibility to define a list of files to be
sent because needed by the main macro file. The list is comma-separated
and the first file is considered as the main one. For example
proof->Load("<macropath>/mymacro.C+,<thispath>/thisheader.h,<thatpath>/thatheader.h")
will make sure that the files 'thisheader.h' and 'thatheader.h', needed
by 'mymacro.C' are available in the sandbox on the worker machines.
Note that 'thisheader.h' and 'thatheader.h' will be available remotely
in the sandbox, as 'mymacro.C'; so they should be included directly by
'mymacro.C', e.g. '#include "thisheader.h"' .
- Import the dataset stager daemon 'afdsmgrd' into ROOT; this is used
to manage data staging based on the dataset information (see
http://code.google.com/p/afdsmgrd/ for more info). The daemon is
located under $ROOTSYS/proof/afdsmgrd .
- New PROOF bench suite, a framework to run CPU and IO benchmarks with
default selectors/data or with user-provided ones. The code is located
under proof/proofbench. See
http://root.cern.ch/drupal/content/new-benchmark-framework-tproofbench
.
- Add the possibility to access the files on the workers via the same
port used by PROOF. This is useful for cases when it is not possible to
start a file server daemon on a different port (because, for eample, of
a firewall or just inconvenience) and workers do not share a file
system. Internally this works by forking a 'rootd' after identifying a
file request and trasferring the connection to it. The client side is a
TNetFile and it is triggered by the protocol "rootd://" (the just
implemented etc/plugins/TFile/P120_TNetFile.C includes this
protocol).
See also
http://root.cern.ch/drupal/content/configuration-reference-guide#rootd
.
- Add support for log file truncation. Truncation is disabled by
default. Enabling is controlled by the rootrc variable
ProofServ.LogFileMaxSize
{<bytes>|<kilobytes>K|<megabytes>M|<gigabytes>G}
indicating the max number of bytes. The number can be followed by
a {K,M,G} to indicate KBytes, MBytes or GBytes, respectively.
- Add new derivation of TList (TProofOutputList) to be used on the
PROOF client to filter out PROOF internal objects when displaying or
printing the list. By default objects was names start with 'PROOF_' are
not shown. The presence of a non empty missing file list is
notified.
- In the PROOF monitoring to: send additional information about memory
usage during the query, the name and size (# of files) of the dataset
processed (if any); add possibility to send the information to multiple
monitoring collectors. See documentation updated at
http://root.cern.ch/drupal/content/enabling-query-monitoring .
- Add support for block activation/deactivation of workers.
- Add possibility to start the proofserv with 'system()' instead of
'fork()' as done in PROOF-Lite. A new switch 'usefrk' has been added to
'xpd.proofservmgr' to control that. Default is still fork().
- Added support for the protocol "pod://" in TProof::Open to
automatically address the entry point of the available PoD installation.
- Improvements
- In TProof::ClearPackages, use the manager to execute the command on
all known worker machines. Improves the consistency when re-istalling
packages.
- In TProof::GetDataSets, add support for option ':lite:'; this allows
to fill the map with only the summary information about the datasets
(the header of TFileCollections), significantly increasing the speed
and the memory footprint when the number of datasets is very large.
- Accept '.' in user names.
- Add switch to control caching of the files read on MacOsX. A call to
fcntl(fd, F_NOCACHE, 1) is done after opening the file.
- Add export of the envs ROOTPROOFCLIENT and ROOTPROOFLITE when
appropriate. These allow to steer building and/or enabling of PAR files
in PROOF-INF/BUILD.sh and/or PROOF-INF/SETUP.C, improving transparency
between normal ROOT and PROOF. The example PAR
'tutorials/proof/event.par' has been modified to check the two
variables.
- Fix a few issues in SQL PROOF monitoring: in
TSQLMonitoringWriter::SendParameters, drop ''' around field names in
the INSERT string; also use TString::Format(...) instead of Form(...)
where relevant. In TPerfStats: call 'proofgroup' instead of
'group' the field with the PROOF group (interference with the 'group'
keyword in SQL); add new field 'querytag' VARCHAR(64) with the unique
query tag; in WriteQueryLog fill also the field 'totevents'; in
PacketEvent, add switch to control whether to send te information to
the monitoring system on per packet level (may be too much for SQL).
The switch is called fMonitorPerPacket and it is globally controlled by
the rootrc variable 'Proof.MonitorPerPacket' and at session level with
the parameter PROOF_MonitorPerPacket .
- Improve treatment of the case when temporary files are asked to be
created on a shared file system not containing the sandboxes. This
case, which seems to be a rather common one, should be now fully
supported.
- Correctly honour selector abort status settings
TSelector::kAbortProcess and TSelector::kAbortFile.
- Improve reporting of the non-processed {files, events} in the final
'MissingFiles' list.
- Improved algorithm for TPacketizerUnit to fix issue with non
homogeneous machines.
- Improve the way the information about log files is saved in case of
failures. The log paths for these failing now should be now correctly
saved and accessible via TProofLog.
- Improve merging of histograms. Just use TH1::Add whne the axis are
equal; much faster than TH1::Merge.
- Fixes
- In TDataSetManagerFile::NotifyUpdate fix handling of the case when
the global list file does not exist yet (new dataset directory). Fixes
error messages during editing dataset operations.
- Fix issue with machine names consistency when working on a local
machine ('localhost' or 'localhost.localdomain' are mapped to
gSystem->HostName()); solves possible matching problems in the
packetizer.
- In TProofServ, fill the "grand total" message with more blanks, so
that no remnants of the previous message are visible on the screen.
- In the autoconf/bonjour interface, fix issue preventing the correct
port (the protocol one, which may be different from the application
default) being used when registering the service.
- In TProofPlayer::AddQueryResult, fix a bug affecting the order in
whihc query results are registered when the start time is within 1
second.
- Fix worker name in TSlaveLite.
- Fix problem with enabling packages with option 'notOnClient' in
PROOF-Lite .
- Make sure the log file is flushed at the end of startup to avoid
spurious log messages on next commands .
- In CreateSession(), fix an issue with the validity check for existing
sessions .
- In TProofLite: fix problem with passing the 'varexp' and 'selection'
strings for processing, preventing correct usage of the operators '|'
and '||' in TTreeFormula.
- In the TProofOutputFile constructor, remove the 'localroot' prefix
only if present in the path. Fixes possible truncation problems
occuring when the paths are not under the localroot scope.
- In TXSocket and TXSlave: fix problem with the way collection over a
socket just marked as 'bad' was interrupted; the interrupt was de facto
ineffective, so that collection stayed always until the timeout expired
(default: 5 minutes). Should solve some of the cases were slow response
was experienced.
- Fix a problem with log path transmission when the node dies early or
not even starts. The log path was empty and wrong was filled in when
retrieving the log buffers, disorienting debugging.
- Fix a bug checking the first event which rendered ineffective the
request for processing a subset of events in a given dataset or
chain.
- In pq2-ana-dist, fix problem with the labels of the distribution
histo occuring when machines are represented by IPs instead of
names.
- Add missing calls to closedir() and TSystem::FreeDirectory, cuasing a
large number of filedescriptors remaining opened after xproofd
initialization.
- Fix a problem with the final update of the progress information
affecting occasionally cases with skipped events.
- Fix merging of TproofOutputFile when using submergers (the
intermediate files were not correctly handled).
- Fix the way TChain weights are transmitted to TProofDraw in
DrawSelect operations.
- AoB
- The class TFileMerger has been moved to 'io/io'
Histogram package
All Histogram classes (including the TProfile's)
- Add support for filling histograms with negative weights. Now the correct global histogram statistics (Mean, Standard
deviation, etc..) is computed, while before the abs(w) was used when computing the histogram statistics.
- Updated in all the projection function the check for the compatibility with previously existing histograms, now
the limits are checked using a tolerance/
- Fix a bug in computing the point errors when fitting a 2d (or 3D) histogram with a 1d (or 2D) function.
TH1
- Add support for weighted likelihood fit of histogram by using a new option, WL and suppress the old option
LL.
The histogram must have the sum of the weight squared stored bin by bin to use this fit option
(i.e. TH1::Sumw2() has been called before filling).
Now one can perform likelihoof fit to weighted or scaled histograms and get the correct errors in the fit parameters.
(see bug report 79754).
- Fix for the bug 82562.
- Fix a bug in TH1::Merge for histogram with labels (bug 75902).
- Fix few bugs related with the Buffer.
TProfile
- Fix a bug in TProfile::Merge when the kCanRebin bit is set
(bug 79675).
- Fix a bug in LabelsDeflate (bug 77149)
TH1
- Add new method TH3::Rebin3D and alsoRebinX, RebinY and RebinZ thanks to Zhiyi Liu.
THistPainter
- TPad::SetTheta() and TPad::SetPhi() did not cause the
canvas redrawing.
- Protection added in case two histograms were plotted in the same pad
using the option BOX (the 2nd one with option SAME).
The clipping was not correct when an interactive zoom was performed.
- The 2D functions, for instance a fit function, associated to a 2D
histogram were always drawn as scatter plots. This was very confusing.
Now they are drawn as a surface if the histogram plotting option is a
lego or a surface or as a contour plot for any other plotting options.
- When drawing scatter plot for TH2 or TH2Poly do not use gRandom, but an independent random generator instance,
to avoid interfering with gRandom (bug 83021).
Now the same random sequence is always used for drawing the same histograms, giving therefore exactly the same scatter plot for the same
histogram, while before a slightly different plot was obtained every time.
TH2Poly
- Add(const TH1 *h1, Double_t c1) has been implemented.
- Reset() has been implemented.
- The destructor has been completed.
THStack
- When the 1D histograms in a stack are painted with patterns or hatches
the histograms are first painted with the TFrame background color to avoid
the hatches overlaps. In case the TFrame background color was 0 this did not
work because in that case the histogram is painted hollow. Instead of 0 we
now use 10 (also white).
TGraph
- The default browsing option for graphs is now "alp".
-
- Like SetPoint the method Apply modifies the graph
content. So, a logic similar to the one implemented in SetPoint
is now done, ie:
- if fHistogram exists it is reset.
- if gPad exist a gPad->Modified() is issued.
TGraphErrors
- The following macro generated wrong C++ code.
{
TGraphErrors *ge = new TGraphErrors(2);
ge->SetName("aaa"); // <<< without this it works
ge->SetPoint(1, 1, 1); ge->SetPoint(2, 2, 1);
ge->Draw("ap*");
gPad->Update();
ge->SavePrimitive(cout);
}
- The option "0" for graphs with error bars is no implemented:
"By default, when a data point is outside the visible range
along the Y axis the error bars are not drawn. Combined with
other options, this option forces error bars' drawing for the
data points outside the visible range along the Y axis."
A similar option already existed for histograms.
- When fitting TGraphErrors and a linear function, use the error in X, before they were not used,
while they were used for non-linear fits.
TFractionFitter
- New version from Frank Filthaut providing the possibility to exclude bins from the fit
TGraphAsymErrors
- Fix calculation of binomial errors in >TGraphAsymErrors::Divide for the case the histogram have weights.
Have methods working for Bayesian and Normal statistic options. For the others options the division using weights is
not supported.
TEfficiency
- Update in the class by implementing DistanceToPrimitive and ExecuteEvent. This allows the
possibility to click on the object
- Add methods to returned the drawn graph (1D) or the histogram (2D).
- Apply some fixes in the TEfficiency::Draw and Paint methods.
TSVDUnfold
- Rescaling using full covariance matrix rather than neglecting
correlations.
- Computed covariance matrix via GetXtau() and inverse via
GetXinv().
CINT
PyROOT
A couple of minor bug fixes related to TPython::LoadMacro, TClass::DynamicCast and the setting of pointers through operator[] on STL containers.
Math Libraries
MathCore
TMath
- Add some new functions based on std::numeric_limits:
- double TMath::QuietNaN() returning a quite NaN
- double TMath::SignalingNaN() returning a signaling NaN
- double TMath::Infinity() returning an infinity double value
- Added also (based on numeric_limits) templated functions on T (where T can be double, float or int) for computing
the limits for a given type:
- T TMath::Limits< T >::Max() returning the maximum number which can be represented for the type T ( T TMath::Limits< double >::Max()=1.79769e+308)
- T TMath::Limits< T >::Min() returning the minimum number which can be represented for the type T ( T TMath::Limits< double >::Max()=2.22507e-308)
- T TMath::Limits< T >::Epsilon() returning the epsilon (see Wikipedia for its definition) for the type T ( T
TMath::Limits< double >::Epsilon()=2.22045e-16)
TRandom1 and TRandom3
- Add an implementation of UInt_t GetSeed() to return the first element of the seed table. Before always a fixed
value was returned, independently of the random generator state
ROOT::Fit::Fitter and related classes
-
Add new version of the Fitter class with various improvements:
- add the possibility to just evaluate the objective function (FCN) one time (Fitter::EvalFCN) and fill the
result (class ROOT::Fit::FitResult using the obtained value of FCN plus the parameter values and errors from
the Fit configuration class (ROOT::Fit::FitConfig).
This required adding a nw constructor of FitResult from FitConfig.
This originated from the Savannah request.
- Add also new methods Fitter::SetFCN.
- Update the configuration (parameter values and errors) after a fit with the FitResult values
So next fit will use improved parameter values and errors. This update can be switched on/off
by using FitConfig::SetUpdateAfterFit(on/off). By default is on.
- Add new method FitConfig::SetFromFitResult.
- Add possibility to run Hesse (Fitter:::CalculateHessErrors) without having done the minimization.
- Add support for weighted likelihood fits.
- Add a new method Fitter::ApplyWeightCorrection(fcn2)
which corrects covariance matrix for the weights using the likelihood function built using the weight square
- Add the support for weights for the binned Poisson likelihood fits (in the
ROOT::Fit::PoissonLikelihoodFCN class). A new option (WL) has been added also in TH1::Fit
for performing weighted fits of histograms (see ).
ROOT::Math::Minimizer
Add new methods Minimizer::GetHessianMatrix(double * mat) and Minimizer::GetCovMatrix(double * mat) to return the full
matrices by filling the passed C arrays, which must have a dimension of at least n x n, where n is the
total number of parameters. The elements for the fixed parameters will be filled with zeros.
These methods are currently implemented by only Minuit and Minuit2.
Change default tolerance in ROOT::Math::MinimizerOptions to be 0.01 from 0.0001.
MathMore
Minuit2
- Improve Printing of information and Error messages. Use the class ROOT::Minuit2::MnPrint to store a
static print level, which can be set by using the static function MnPrint::SetLevel(int ).
-
Add new information messages in the VariableMetricBuilder (i.e. Migrad), to print some messages
during the minimization.The new printing level is now also controlled by the Minuit2Minimizer class.
- Print now in the messages the parameter names instead of the parameter indices.
- fix the update of the number of function calls in Minuit2 after calling Hess after Migrad. The number is now not
reset in MnHesse
- Fix a problem, when, after calling Hesse ,the edm was correct to values below the required tolerance.
Now do not flag these cases as failed minimizations but as good ones.
- Correct tolerance by 2E-3 instead 2E-4 to ve conistent with what is done in F77 Minuit or TMinuit
- Avoid when using the CombinedMinimumBuilder (i.e. the Minimize algorithm) to call two times
ModularFunctionMinimize::Minimum. Since this last function correct the tolerance by the Up value, a
double correction was applied in this case.
- Implement the methods Minuit2Minimizer::GetHessianMatrix(double * mat) and
Minuit2Minimizer::GetCovMatrix(double * mat).
- For retrieving the Hessian, a new method has been added, MnUserParameterState::Hessian, which returns
the Hessian by inverting the covariance matrix, since the Hessian is not stored inside the Minuit2 classes.
- Fix a bug in MnUserTransformation when using unnamed parameters (bug 82552).
- Add the possibility when using Minos to pass the tolerance for the Migrad calls. (use a default of 0.1 * Up, which is
the same value used in F77).
Minuit
- Implement the methods TMinuitMinimizer::GetHessianMatrix(double * mat) and
TMinuitMinimizer::GetCovMatrix(double * mat).
RooFit
HistFactory
One of the core classes used by HistFactory models (RooRealSumPdf) was modified leading to substantial speed improvements (for models that use the default -standard_form option).
This new version supports a few types of interpolation for the normalization of the histograms:
- code = 0: piece-wise linear (old default)
- code = 1: piece-wise log (new default)
- code = 2: parabolic interp with linear extrap ( common at tevatron, avoids kink for asymmetric uncert)
The piece-wise logarithmic interpolation paired with a Gaussian constraint is equivalent to a log-normal constraint in a transformed version of the nuisance parameter. The benifit of this approach is that it is easy to avoid the normalization from taking on unphysical negative values. This is the prescription used by the CMS Higgs group, and agreed upon by the LHC Higgs Combination Group.
There is not yet XML-based steering for the different interpolation types, but there is a simple script to modify it.
results/example_combined_GaussExample_model.root
Near term goals for HistFactory
- Utilities for dealing with Monte Carlo statistical uncertainty in the template histograms
- Support for N-D histograms
- A new style of histogram variations without a constraint term attached (for shapes determined from control samples)
- XML steering for interpolation types
RooStats
General Improvements
This release brings several speed improvements to the RooStats tools and improved stability and performance with PROOF. This comes mainly through changes to the
ToyMCSampler. In addition the
HypoTestInverter tool has been rewritten, leading to some changes in the
HypoTestResult. Finally, a new hypothesis test new called
FrequentistCalculator was written, which plays the same role as the
HybridCalculator but eliminates nuisance parameters in a frequentist way.
ToyMCSampler
The primary interface for this class is to return a
SamplingDistribution of a given
TestStatistic.
The
ToyMCSampler had a number of internal changes for improved performance with PROOF. These should be transparent. In addition, a new method was added
RooAbsData* GenerateToyData(RooArgSet& paramPoint) that gives public access to the generation of toy data with all the same options for the treatment of nuisance parameters, binned or unbinned data, treatment of the global observables, importance sampling, etc. This is new method particularly useful for producing the expected limit bands where one needs to generate background-only pseudo-experiments in the same way that was used for the primary limit calculation.
HypoTestResult
In the process of writing the new HypoTestInverter the conventions for p-values, CLb, CLs+b, and CLs were revisited. The situation is complicated by the fact that when performing a hypothesis test for discovery the null is background-only, but when performing an inverted hypothesis test the null is a signal+background model. The new convention is that the p-value for both the null and the alternate are taken from the same tail (as specified by the test statistic). Both CLs+b and CLb are equivalent to these p-values, and the HypoTestResult has a simple switch
SetBackgroundIsAlt() to specify the pairing between (null p-value, alternate p-value) and (CLb, CLs+b).
HypoTestInverter, HypoTestInverterResult, HypoTestInverterPlot
These classes have been rewritten for using them with the new hypothesis test calculators. The
HypoTestInverter
class can now be constructed by any generic
HypoTestCalculator, and both the
HybridCalculator and the new
FrequentistCalculator are supported.
The
HypoTestInverter class can be constructed in two ways: either passing an
HypoTestCalculator and a data set or by passing the model for the signal, for the background and a data set.
In the first case the user configure the
HypoTestCalculator before passing to the
HypoTestInverter.
It must be configured using as null model the signal plus background model as alternate model the background
model. Optionally the user can pass the parameter to scan, if it is not passed, the first parameter of interest of the
null model will be used. In the second case (when passing directly the model and the data) the
HypoTestInverter
can be configured to use either the frequentist or the hybrid calculator. The user can then configure the class
afterwards. For example set the test statistic to use via the method
SetTestStatistic, number of toys to run
for each hypothesis, by retrieving the contained HypoTestCalculator:
HypoTestInverter inverter(obsData, model_B, model_SB, parameterToScan, HypoTestInverter::kFrequentist);
ProfileLikelihoodRatioTestStat profLR( *model_SB->GetPdf() );
inverter.SetTestStatistic(&profLR);
FrequentistCalculator * htcalc = (FrequentistCalculator*) inverter.GetHypoTestCalculator();
htcalc->SetToys( ntoySB, ntoyB);
The Inverter can then run using a fixed grid of npoint between xmin and xmax or by using an automatic scan, where a
bisection algorithm is used.
For running a fixed grid one needs to call
SetFixedScan(npoints, xmin, xmax), while for running an autoscan use
the function
SetAutoScan. The result is returned in the
GetInterval function as an
HypoTestInverterResult class. If a fixed grid is used the upper limit is obtained by using a interpolation on
the scanned points. The interpolation can be linear or a spline (if
result.SetInterpolationOption(HypoTestInverterResult::kSpline) is called).
The upper limit, the expected P value distributions and also the upper limit distributions can be obtained from the
result class.
HypoTestInverterResult * result = inverter.GetInterval();
double upperLimit = result->UpperLimit();
double expectedLimit = result->GetExpectedUpperLimit(0);
The limit values, p values and bands can be drawn using the
HypoTestInverterPlot class. Example:
HypoTestInverterPlot * plot = new HypoTestInverterPlot("Result","POI Scan Result",result);
plot->Draw("2CL CLb");
Where the Draw option "2CL CLb" draws in addition to the observed limit and bands, the observed CLs+b and CLb.
The result is shown in this figure:
A new tutorial StandardHypoTestInvDemo has been added to show the usage of this class and producing the picture
as the one showed above.
FrequentistCalculator
This is a
HypoTestCalculator that returns a
HypoTestResult similar to the
HybridCalculator. The primary difference is that this tool profiles the nuisance parameters for the null model and uses those fixed values of the nuisance parameters for generating the pseudo-experiments, where the
HybridCalculator smears/randomizes/marginalizes the nuisance parameters.
BayesianCalculator
Several improvements have been put in the class. In particular the possibility to set different integration types. One
can set the different integration types available in the ROOT integration routines
(ADAPTIVE, VEGAS, MISER, PLAIN for multi-dimension). In addition one can use an integration types by generating nuisance
toy MC (method TOYMC). If the nuisance parameters are uncorrelated, this last method can scale up for a large number of
nuisance parameters. It has been tested to work up to 50-100 parameters.
TMVA
TMVA version 4.1.2 is included in this root release. The changes with respect
to ROOT 5.28 / TMVA 4.1.0 are in detail:
Variable transformations
- Variable transformations can now be applied to a user-defined subset
of variables (and regression targets).
- Enable variable transformations for general boosting
- Extended PDEFoam functionality:
- Multiclass classification by training of one discriminator foam for each
variable.
- The cell tree can now be plotted from the macro test/PlotFoams. This makes
it easyer to compare the PDEFoam structure to a decision tree.
- Variable importance ranking by counting the number of cuts made in each
dimension. The variable, for which the most cuts were done is ranked highest.
- Fixed the size of the sampling box in PDEFoam:
In TMVA 4.1.0 the size of the PDEFoam sampling box in each dimension was
2*VolFrac times the foam size. This was contrary to the intention and the
documentation in the UserGuide and is now corrected: In TMVA 4.1.1 the size
of the PDEFoam sampling box in each dimension is now VolFrac times the foam
size. This implies that in TMVA 4.1.1 the VolFrac value for training a PDEFoam
must be doubled in order to give the same results as in TMVA 4.1.0. The default
VolFrac value was also changed from 0.0333 to 0.0666.
- New configuration variable "NbinsMVAoutput" defining the bins of the MVA output
variables in the TMVA training plots produced via the GUI. As always, Config
settings can be modified in the training script via, eg, the command
(TMVA::gConfig().GetVariablePlotting()).fNbinsMVAoutput = 50;
to be called AFTER initialising the TMVA Factory object.
Bug fixes
- Requested number of training and testing events was not
correct when pre-selection cuts were applied. Now the number of
requested events scales with the preselection efficiency and hence
does not need to be adjusted with the pre-selection. This also
corrects the problems seen in the Category classifierm, where
pre-selection is used to build the categories.
- Correct histogram boundaries in PlotVariable.
- Correct scanning procedure in OptimizeTuningParameters.
- Print the significance formula that is actually used
- Small speed improvement for PDEFoam functions.
- Fix for MethodBoost which ensures that the method options for the boosted
classifier are handled correctly during boosting.
- Fixed problems in classification of some methods when booking background
training tree before signal one.
- Fixed preprocessing transformation bug in HMatrix
- Several minor bug fixes for version 4.1.2
Geometry
MonteCarlo
GUI
TRootBrowser
- Change the default canvas name from "Canvas 1" to "Canvas_1", solving the following issue: When saving the canvas as C++ script, it uses the canvas name as object name, creating a non-working C++ script.
- Close the browser before terminating the application
TGListBox
- Fix a rounding problem in TGListBox when the entries have different height. This solves a problem with TGFontTypeComboBox, the last item (the one that reads "13. times") was barely visible. Only the top 2 or 3 pixels could be seen when the vertical scrollbar is at its lowest possible position.
TGClient
- Added a new fStyle data member and the getter/setter methods (GetStyle()/SetStyle()), allowing to select between classic (win95) and modern (e.g. flat popup menu and toolbar buttons) look. This can be enabled/disabled via the new option GUI.Style in $ROOTSYS/etc/system.rootrc, the default being set as modern
TGButton
- Properly position (center) the pictures when using different font size (part of the task #18792)
- Create a new (flat) style for some buttons (e.g. the toolbar buttons) and added the SetStyle() method
TGComboBox
- Keyboard navigation has been implemented
TGToolBar, TRootGuiBuilder, TStyleManager, TRecorder
- Enable the new (flat) button style. This can be enabled/disabled via the GUI.Style entry in $ROOTSYS/etc/system.rootrc (or in a user defined $HOME/.rootrc)
TGMenu
- Add a new (modern) way of displaying the popup menus (flat frame with gray border). This can be selected/changed via the "Gui.Style" entry in the system.rootrc file (modern being the default)
TGScrollBar
- Create a new (flat) style for scrollbars. This is enabled/disabled via the GUI.Style entry in $ROOTSYS/etc/system.rootrc (or in a user defined $HOME/.rootrc)
TGCommandPlugin
- Change the text highlighing color
TGListView
- Change the way the current (selected) item is highlighted (full width instead of text only)
TGListTree
- Change the way the current (selected) item and the item below the mouse are highlighted (full width instead of text only)
- Slightly improve search on Linux (implemented F3, Ctrl+F and Ctrl+G) and make it working on Windows
TGFileBrowser
- Fix a problem when browsing geometries (TGeoManager must not be treated as a regular TDirectory)
- Allow user to specify any custom filter (e.g. *.png) in the filter combo box
- Enable the new (flat) button style. This can be enabled/disabled via the GUI.Style entry in $ROOTSYS/etc/system.rootrc (or in a user defined $HOME/.rootrc)
- Create special icons for symlinks (shortcuts) in the browser (add a small arrow on bottom left corner of the original icon)
TGFileDialog
- Implemented the wish #78935: Longer "File of type:" selector is wanted (make more combo box entries visible)
- Enable the new (flat) button style. This can be enabled/disabled via the GUI.Style entry in $ROOTSYS/etc/system.rootrc (or in a user defined $HOME/.rootrc)
TGFSContainer
- The shortcuts are now working on Windows
TGColorDialog, TGFontDialog, TGTextEditDialogs
- Several improvements in the layout when increasing the font size
TGTextEditor
- Added a "Close" menu entry
- Properly ask the user to save the currently opened file (if modified) when trying to open a new file
- Moved the IsSaved() part of the code in the LoadFile() method, to make sure it works also when the text editor is used as a plugin in the browser
- Change the text highlighing color
- Cleanup the text when quitting root (avoid potential crash on Linux)
TGFrame
- Allow to override CTRL+S behavior by using the TGMainFrame::BindKey() function
TVirtualDragManager
- Renamed TVirtualDragManager::GetDragType() to TVirtualDragManager::GetEDragType(), to avoid potential clash between two classes (TGFrame and TVirtualDragManager) having both GetDragType method with different return types. And they are both inherited by one class (TGuiBldDragManager) which doesn't define GetDragType.
TGSlider
- Added mouse wheel handling
TGToolTip
- Properly set the text color of the tooltip label, using the value of Gui.TooltipForegroundColor in $ROOTSYS/etc/system.rootrc (or in a user defined $HOME/.rootrc)
GUIHtml
TGHtmlBrowser
- Only add non-empty strings (urls) in the combo box, to avoid empty entries
- Enable the new (flat) button style. This can be enabled/disabled via the GUI.Style entry in $ROOTSYS/etc/system.rootrc (or in a user defined $HOME/.rootrc)
TPDF
- The following macro produed a wrong PDF file. The second page had a black
background.
{
gROOT->SetStyle("Plain");
TCanvas* canvas = new TCanvas("canvas", "canvas", 600, 700);
TH1F* h = new TH1F("h","ht", 100, -5, 5);
h->FillRandom("gaus",10000);
canvas->Divide(2,1);
canvas->cd(1); h->Draw();
canvas->Update();
canvas->Print("test.pdf(");
canvas->Print("test.pdf");
canvas->Print("test.pdf)");
}
TPostscript
- Fix a precision problem in the text positionning. When the pad limits along
X or Y were very close the text position might be wrong. This was found
thanks to the test #15 in stressGraphics. The text position is now computed
using double precision variables only.
TASImage
- Horizontal dashed lines having a width greater than 1, were not correct.
TLatex
- Improve the sqrt drawing to avoid the overlapping
problem mentionned here https://savannah.cern.ch/bugs/index.php?82436
TGaxis
- The following macro produced two different labelling. Label "3" was missing
on the axis "b".
{
TGaxis *a = new TGaxis(0.2,0.5,0.8,0.5,0.2,3.5,510,"G");
a->SetMoreLogLabels(1); a->Draw();
TGaxis *b = new TGaxis(0.8,0.7,0.2,0.7,0.2,3.5,510,"G");
b->SetMoreLogLabels(1); b->Draw();
}
TPad
- Add a protection in TPad:Clear() to fix the
bug report #78382. An histogram redrawing in a cloned
pad produced a segmentation fault.
GX11Gui
TGWin32
- Unmap the window before to destroy it, in order to properly receive
kUnmapNotify needed by gClient->WaitForUnmap(). This fixes the problem
reported on
the forum
TH3 Painting
- The new option GLCOL allows to paint TH3 using semi-transparent
colored boxes.
Image produced by $ROOTSYS/tutorials/gl/glvox1.C.
Image produced by $ROOTSYS/tutorials/gl/glvox2.C.
-
Fix the axis position and size when tree->Draw("x:y:z");
is displayed in the GL viewer.
OpenGL
-
Add support for automatic saving of images while doing auto-rotation. See
"Extras" tab of GL-viewer GUI.
EVE
-
Use double precision for track extrapolation.
-
Several small improvements in projections and calorimeter visualization code.
Misc
Tutorials
ROOT page -
Class index -
Top of the page -