The
following people have contributed to this new version:
David Abdurachmanov, Kim Albertsson, Guilherme Amadio, Whitney
Armstrong, Attila Bagoly, Benjamin Bannier, Wolf Behrenhoff, Bertrand
Bellenot, Georgios Bitzes, Brian Bockelman, Will Breaden, Philippe
Canal, Santiago Castro, Sylvain Corlay, Olivier Couet, Sergey Divakov,
Mattias Ellert, Giulio Eulisse, Gerardo Ganis, Andrei Gheata, Luca
Giommi, Konstantin Gizdov, Enrico Guiraud, John Harvey, Ivana
Hrivnacova, Filip Ilic, Raphael Isemann, Thomas James, Chris Jones,
David Lange, Wim Lavrijsen, Lawrence Lee J, Sergey Linev, Olli Lupton,
Spencer Lyon, Shahzad Malik, Maurizio Martinelli, Pere Mato, Lorenzo
Moneta, Abhinav Moudgil, Frederich Munch, Jan Musinsky, Axel Naumann,
Ajith Pandel, Simon Pfreundschuh, Danilo Piparo, Timur Pocheptsov,
Dmitry Polukhin, Fons Rademakers, Martin Ritter, Heshy Roskes, Maarten
Scholl, Paul Seyfert, Karl Smith, Martin Storø Nyflott, Matevz Tadel,
Enric Tejedor, Diego Torres, Sebastian Uhl, Xavier Valls, Peter Van
Gemeren, Vassil Vassilev, Andreas Weiden, Sandro Wenzel, Stefan Wunsch,
Omar Zapata, Zhe Zhang, Roman Zulak
Removed interfaces
The following interfaces have been removed, after deprecation in
v6.08.
SetFCN(void*) from TVirtualFitter, TFitter,
TBackCompFitter, TMinuit
TFoam::SetRhoInt(void*) ### RooFit
Removed deprecated RooComplex superseded by
std::complex.
Interpreter
Automatic declaration of variables (h = new TH1F(...))
is only available at the prompt. The side-effects of relying on
this in source files is simply too grave. Due to a bug (ROOT-8538),
automatically declared variables must currently reside on the top-most
scope, i.e. not inside an if block etc.
Improved the stack frame information generated by the JIT. By
avoiding interleaving of the memory associated to multiple JIT module,
the generation of stack trace involving jitted code and the catching of
exception going through jitted code has been repaired.
Interpreted code is now optimized; .O 0/1/2/3 can be
used to change the otpimization level, as well as
#pragma cling optimize.
The prompt colors are now much more visible, both on terminals with
light and dark background.
Significant speedup of TMethodCall.
One can now run .x 12file-with@funny=name.C; it will
expect a function called _12file_with_funny_name().
Core Libraries
See “Build, Configuration and Testing Infrastructure” below for
changes in the directory structure.
libCling now exports only a minimal set of symbols.
Add support for std::array_view also for C++11 builds. The
implementation has been modified to work before C++14.
Added TCollection::Notify to allow nofitying more than one
object.
TList formulas;// Add several TTreeFormula to the list; chain.SetNotify(&formulas);
For classes that need the ClassDef support,
ClassDefInline(ClassName, Version) now provides it without
the need for a dictionary source: all members injected by this
ClassDef flavor are generated by the interpreter.
TObjString to
TString
TObjString::GetString() now returns a
const TString& to the TString inside the
TObjString, instead of copying it. This is to prevent very
common misunderstanding of the interface.
In several cases, the misunderstanding of the interface caused
invalid memory accesses to the already destructed temporary
TString returned by GetString(),
e.g. objStr->GetString().Data(). This will be fixed
automatically by the new return type.
In rare cases, the caller expected GetString() to return
a (non-const) reference to the embedded TString, e.g.
objString->GetString().ReplaceAll("a", "b"); // WRONG!
This will now fail to compile, instead of not doing what the author of
the code expected. Please fix that code by using the
TObjString::String() interface, which returns a non-const
TString&:
objString->String().ReplaceAll("a", "b");.
In extremely rare cases, this change breaks a valid use where the
temporary TString was modified and then captured in a new
TString object before the destruction of the temporary:
TString str = objStr->GetString().ReplaceAll("a", "b");.
In these rare cases, please use the new function
CopyString() which clearly indicates that it involves a
temporary.
Histogram Libraries
New class THnChain was added to provide a
TChain-like experience when working with
THnBase’ed histograms (currently THn and
THnSparse) from many files, see here. This
allows to e.g., interactively adjust axis parameters before performing
projections from high-dimensional histograms,
// Create a chain of histograms called `h`.THnChain chain("h");// Add files containing histograms `h` to `chain`.chain->AddFile("file1.root");chain->GetXaxis(1)->SetRangeUser(0.1,0.2);TH1* projection = chain->Projection(0)
TProfile2Poly
Addition of TProfile2Poly class. It is analogous to
TH2D/TProfile2D except it allows the creation
of profiles of histograms that have polygonal bins. Just for a quick
recap some of the functionality includes:
Creatation of bins that allow filling with Fill()
Setting the error being calculated as either
kERRORSPREAD or kERRORMEAN
Setting the bin content to either the Average or Error in Z for
plotting purposes (SetContentToAverage() / SetContentToAverage())
Merging whole TProfile2Poly’s
Two tutorials outlining the use of the added class can be found at: *
root/tutorials/hist/tprofile2polyRealistic.C *
root/tutorials/hist/tprofile2polyRealisticModuleError.C
Other features added
in the Hist Library
Added option S in TEfficiency::Fit to
return a FitResult object
Improve check in TEfficiency for compatibility of
weighted histograms
Fix computation of Chi2 for PoissonLikelihood fits (using
Baker-Cousins chi2)
Math Libraries
MathCore
Improve thread friendliness of the TMinuit class.
Added a new class ROOT::Math::KahanSum<T> for
compensated summations
Modify the internal structure of the FitData classes
(ROOT::Fit::BinData and ROOT::Fit::UnBinData)
to make them able to support vectorization.
Add new templated interfaces for function evaluation that support
vectorized types
GenVector
Extend support for Vectorized types (e.g. types from the
Vc library) in GenVector. Make for exampole the class
Plane3D templated on the contained type.
Add a new method Transform2D::ApplyInverse to apply
efficiently inverse transformations (it avoids the intermidiate
calculations by using Inverse() and then operator() ).
TMatrix
Add a compiler error when using operator [i,j] to
assign matrix elements instead of assigning wrong values.
TMVA
Fixed TMVA::ROCCurve class by adding support for
weights and improve computation of integral and curve in case of low
statistics
Improved support for multi class classification. TMVA is undergoing
an effort to improve support for multi class classification. Fixes and
improvements in this release include additional analysis output
(1-vs-rest roc curves, confusion matrices) and various bugfixes. Work in
this area is still ongoing.
Apply few bug fixes in the DNN. Make the DNN CPU the default and
deprecate the Standard DNN.
Apply some performance optimizations to BDT.
RooStats
Add a function computing the Asimov median significance:
RooStats::AsimovSignificance(s,b,sigma_b) , using as input
the expected number of signal events, the background events and
optionally the uncertainty in the number of background events.
TTree Libraries
TTreeReader now supports TEntryLists,
Double32_t / Float16_t.
TTreeReader::SetLastEntry() has been deprecated. Its
name is misleading; please use
TTreePlayer::SetEntriesRange() instead.
TTree::Branch() now complains for wrong leaf list
strings, e.g. “value/F[4]” (which should really be spelled as
“value[4]/F”).
Allow reading of older version of TTreePerfStats
(ROOT-8520)
In TTree::OptimizeBaskets() do not call GetBasket(0)
to avoid disc reads
It is now possible to define the precision of the default
histogram created by TTree::Draw. Three new parameters are
available in $ROOTSYS/etcsystem.rootrc
the default values are float. They can be set to
double.
Fix ROOT-8742: TTree::SetBranchAddress could not be invoked
safely even when dealing with the same tree obtained from the same file
opened in different threads.
TTree::Branch() now complains if a “name[size]/F” branch
specification is passed wrongly (e.g. as “name/F[size]”)
TDataFrame
Creation of the TDataFrame class. The TDataFrame allows to interact
with data stored in columnar format in a functional and intuitive way in
order to perform data analysis. Parallelism is accessible simply by
activating implicit multi-threading with the ROOT::EnableImplicitMT()
function. In a nutshell, the functionality provided is:
Create and fill histograms with one single method invocation
Express filtering of entries with strings, lambdas or functions
Easy creation of efficiencies of cut-flows
Possibility to run on ranges of entries
Creating columns not present in the original dataset
Chain multiple actions to be executed on the same event loop
Creation of events on-the-fly (e.g. via Pythia or user-define
generator functors), with no need for an input TTree
Snapshot on a rootfile the dataset after cuts and after augmentation
with columns created by the user
Run analyses expressed as chains of actions in parallel in a
transparent way for the user See the
online documentation for more details
2D Graphics Libraries
If one used “col2” or “colz2”, the value of
TH1::fMaximum got modified. This deviated from the behavior
of “col” or “colz”. This is now fixed as requested here.
When the option SAME (or “SAMES”) is used with the option COL, the
boxes’ color are computing taking the previous plots into account. The
range along the Z axis is imposed by the first plot (the one without
option SAME); therefore the order in which the plots are done is
relevant.
With option BOX on 2D histos with negative content:
When several histogram were drawn on top of each other with the
option BOX SAME and if the log scale along Z was on, the
plot showed only the first histogram. This can be reproduce by using the
documentation example illustrating BOX SAMEand turning the
canvas into log scale along Z.
In TLatex:
Do not paint the text when the text size is <= 0. This fixes the
problem mentioned here
Do not paint text if the text string is empty.
From: Sergey Linev: In TPad::SaveAs method json file
extension is now handled
Because of some precision issue some data points exactly on the plot
limits of a TGraph2D were not drawn (option
P). The problem was reported here.
New options for automatic coloring of graphs and histograms. When
several histograms or graphs are painted in the same canvas thanks to
the option “SAME” via a THStack or TMultigraph
it might be useful to have an easy and automatic way to choose their
color. The simplest way is to pick colors in the current active color
palette. Palette coloring for histogram is activated thanks to the
options PFC (Palette Fill Color), PLC (Palette
Line Color) and AMC (Palette Marker Color). When one of
these options is given to TH1::Draw the histogram get its
color from the current color palette defined by
gStyle->SetPalette(…). The color is determined according
to the number of objects having palette coloring in the current
pad.
The line width and line style can be change on 2d histograms painted
with option ARR.
When the angle of a TGraphPolar was not in radian, the error bars
were misplaced. The problem was reported here.
In TASimage::DrawLineInternal the case of a line with 0
pixel along X and 0 pixel along Y was not treated properly. An
horizontal line was drawn instead.
In TGraphPainter::PaintGrapHist: Decouple the
P option (histogram drawn with a simple polymarker) from
the L(Histogram drawn as a simple polyline). This improved
(in some cases some extra markers were drawn) and simplify. the
code.
Candle plot improvements:
Rearragement of TCandle-code - split into calculate and paint
Implementation for a “raw-data candle” inside TCandle - to be used
from TTreeViewer in the future
Implementation of 1D histograms along each candle (left, right and
violin) - to be used for violin-charts
Implementation of a zero indicator line for TCandle - to be used for
violin-charts
Reimplementation if THistPainter draw option VIOLIN
Implementations of presets and individual options for
VIOLIN-charts
Implementation of VIOLIN-charts in THStack - can be combined with
CANDLE
Update of the docs (THistPainter and THStack)
New tutorials
In various places in TGraph the underlying histogram was deleted
when the graph range should be recomputed. This has the side effect that
some graph parameters (like the axis titles) were also deleted. This now
fixed. It was reported here.
Improve the error bars drawing in TLegend to match the plot’s error
drawing. This improvement was requested here.
Implement text clipping in TASImage as requested here. Also the
text size in batch mode for png (gif jpeg) files better matches the size
on screen and pdf.
TMathText and TTeXDump implement the
TLatex character \bar.
In the following example, TPad::WaitPrimitive was not
stoping the macro execution after each plot :
this was reported here.
- New flag Cocoa.EnableFillAreaAntiAliasing in
system.rootrc to enable the anti-aliasing for filled area
for the Cocoa backend. Default is no. - The “BOX” option,
to draw 3D histograms, has been reimplemented by Evgueni Tcherniaev The
following picture show the old and new version
New box option for 3D
histograms
Implement options “BOX1”, “BOX2” and “BOX3” for TH3 equivalent of
“LEGO1”, “LEGO2” and “LEGO3”for TH2.
When a 2d histogram was drawn with option LEGO1 and
white colored, the dark side of the lego was red instead of gray.
New option “0” to draw TH2Poly. When used with any COL
options, the empty bins are not drawn.
Fix a long pending problem with Z axis drawing when a lego or a
surface was drawn upside-down.
Add a protection in TLatex when a string has a syntax error. It was
reported here.
Implement the automatic placement of the Y axis title. If the title
offset is set to 0:
h->GetYaxis()->SetTitleOffset(0.);
the axis title is automatically placed to avoid overlaps with the
axis labels. - Implement the automatic placement of the
TLegend. A new constructor not specifying the legend
position is available. Only width and height are defined. -
ChangeLabel is now available for log axis as well as
requested here. - The
TGraph copy constructor also copy the underlying
TH1F if it exists (it holds the axis titles). -
TGraph axis range was computed differently depending on the
order of SetLog[x|y]” This issue was reported here - Add the
new markers suggested here.
Improve the marker style for the OpenGl backend (some where wrong or
missing).
New markers
Remove a large memory leak in TFITSHDU’s GetArrayRow, GetArrayColumn
and GetTabRealVectorColumn member functions.
When TGraphs belonging to a TMultiGraph
were changed (for instance with SetPoint) after the
TMultiGraph was drawn, the TMultiGraph range
was not recomputed. This issue was discovered thanks to this
forum post.
When a TGraph is drawn, the X-axis is drawn with increasing values
from left to right and the Y-axis from bottom to top. The two options
RX and RY allow to change this order. The
option RX allows to draw the X-axis with increasing values
from right to left and the RY option allows to draw the
Y-axis with increasing values from top to bottom.
g->Draw("APL"); g->Draw("A RX RY PL");
New box option for 3D
histograms
3D Graphics Libraries
In TMarker3DBox::PaintH3 the boxes’ sizes was not
correct.
The option BOXand GLBOX now draw boxes
with a volume proportional to the bin content to be conform to the 2D
case where the surface of the boxes is proportional to the bin
content.
Geometry
It is possible now to run GDMLParser on a file with arithmetic
expressions
Dictionaries
Stop dictionary generation early, during AST scanning, if a union is
selected for I/O as this is not supported (triggered by ROOT-8492)
Allow inclusion of headers in linkdef files ROOT-7765
More expressive error messages when trying to directly select
std::arrays
rootcling now #defines __PIC__ when
parsing input headers [ROOT-8719].
I/O Libraries
[ROOT-8478] -
Prompt error when building streamer info and a data member is a
vector w/o dictionary
Fix ROOT-8686 and ROOT-8595 which led to error when persistifying
classes which featured std::arrays as data members in TTrees.
TDavixFile: Added support for bucket name in path
Fix error sometimes prompted when trying to write std::array
column-wise
Parallelism
Add ROOT::GetImplicitMTPoolSize function to get the size of the
pool used to enable implicit multi threading
Add the TThreadExecutor::Foreach method for parallelising
functions featuring void return type
Add TBufferMerger and TBufferMergerFile classes
TBufferMerger is a class to facilitate writing data in parallel from
multiple threads, while writing to a single output file. Its purpose is
similar to TParallelMergingFile, but instead of using processes that
connect to a network socket, TBufferMerger uses threads that each write
to a TBufferMergerFile, which in turn push data into a queue managed by
the TBufferMerger. An excerpt of the tutorial
is shown below.
// Create the TBufferMergerTBufferMerger merger("mp103_fillNtuple.root");// Define what each worker will doauto work_function =[&](){auto f = merger.GetFile(); TNtuple ntrand("ntrand","Random Numbers","r"); fill(ntrand, nEventsPerWorker); ntrand.Write(); f->Write();};
Global reorganization of the new multi-process / multi-thread
code: the part of TProcessExecutor dedicated to TTree processing is
moved to a new class TTreeProcessorMP, located under tree/treeplayer and
included in the libTreePlayer library. Methods ‘ProcTree’ have been
renamed to ‘Process’, following TTreeProcessorMT.
Full support for TSelector processing and TEntryList has been
added to TTreeProcessorMP, with new related tutorials
(multicore/{mp104_processH1,mp105_processEntryList}.C) and roottests
(root/multicore/tProcessExecutorH1Test.cpp).
PyROOT
Added in PyROOT the converter for std::string_view
JavaScript ROOT
JSROOT upgraded from 4.6.0 to 5.1.2. The major changes:
Support most 2D and 3D draw options for TH1, TH2 and TH3
Support new classes: TH2Poly, TGraph2D
Improve handling of THStack and TMultiGraph
Full implementation of binary ROOT I/O, including TTree
Extensive TTree::Draw() functionality
Support improved JSON format, including arrays compression
New ‘float’ hierarchy browser overlays with objects drawing
Tutorials
New tutorials have been added: - TDataFrame tutorials to exercise the
different use cases - Annotation on a 3D plot using 3D plylines -
Palette coloring for graphs - CandlePlot tutorials to exercise different
options - Multicore tutorials for multi-threaded and multi-process
Build,
Configuration and Testing Infrastructure
rlibmap has been removed; it was deprecated for three
years.
Added the CMake exported ROOT libraries into the ROOT::
namespace. In this way, projects based on CMake using ROOT can avoid
conflicts in library target names. As an example, this is the way to
build a project consisting of one library and one executable using
ROOT.
Added option builtin_all to enable all the built in
options.
For rootcling_stage1 (formerly known as rootcling_tmp), the
package structure was changed to enable homogeneous visibility settings
across object files. See core/README for an overview.
Several non-public headers are not copied into include/ anymore;
they reside in the PACKAGE/res/ subdirectory in the source
tree.
The IMT switch is set to on by default.
A new library is now created, libImt. It contains all classes
which depend on TBB. Those classes were previously part of libThread. As
a consequence rootcling/genreflex do not depend anymore from TBB even in
presence of imt builds.
Refactoring of several math tests to avoid exact comparisons of
floating point numbers
Bugs fixed in this release
[ROOT-3798] -
The various TTree::Branch functions are very hard to figure out
[ROOT-4489] -
Memory leak when TTree::BuildIndex is called multiple times
[ROOT-4568] -
SIGPIPE handler can cause infinite loop when stderr pipe is gone
[ROOT-4812] -
cling::InputValidator::validate and #ifdef
[ROOT-4865] -
I/O for private and protected classes is not yet supported
[ROOT-5035] -
Custom converter not called correctly on member variables
[ROOT-5540] -
Problem switching from small to large size mode when updating a ROOT
File.
[ROOT-5682] -
enums as template parameter for template class
[ROOT-5727] -
ROOT6 does not expand typedef while computing class checksum
[ROOT-5837] -
ROOT ProcessLine doesnt print error after #include
ROOT version 6.10/02 has been released on 6 July 2017
TTree Libraries
Resolved O(N^2) scaling problem in TTree::Draw()
observed when a branch that contains a large TClonesArray where each
element contains another small vector container.
TDataFrame
Allow to snapshot datasets with hundreds of columns without
incurring in errors related to maximum template recursion depth
Better handling of missing branches when selected by the user
Allow to extract columns of the dataset even when their type is a
stl collection
Improved logic of ranges
Properly report error in case the jitting of the call to Snapshot
encounters problems
Fix bug which prevented to initialise the TDF from a collection of
strings
Fix jitting when defining columns attached to an empty TDF
Include all headers of the TDF to the pch and remove dedicated
dictionary
Properly preserve gDirectory value when snapshotting dataset
Fix snapshot when specifying the name of the tree inside a
TDirectory
Avoid dereferencing null ptrs when snapshotting in parallel with
less clusters than workers
Build system
Delay the resolution of ${CMAKE_INSTALL_PREFIX} when installing in a
different location than the configured one
Propagate Intel compiler setup to newer versions
Remove several unused variable warnings also coming from LLVM
Graphics
Adjust Y axis title offset default for 3D axis.
Bugs and Issues fixed in
this release
[ROOT-8877] -
Defer jitting operations aiming to infer columns types
[ROOT-8892] -
ROOT classical build cannot use external Unuran
[ROOT-8836] -
rootcmdlineutils.py module not correctly installed
[ROOT-9032] -
Can’t compile 6.10/06 with Clang 5.0.0 due to TBB
[ROOT-9037] -
TDataFrame ctor does not compile if std::string is passed as
filename
[ROOT-9055] -
ROOT_GENERATE_DICTIONARY finds header files in /usr/bin failing the
build in centos
HEAD of the
v6-10-00-patches branch
These changes will be part of the future 6.10/10
I/O Libraries
Significantly improved the scaling of hadd tear-down/cleanup-phase
in the presence of large number histograms and in the presence of large
number of directories.
Tree Libraries
Add TBranch::BackFill to allowing the addition of new branches to an
existing tree and keep the new basket clustered in the same way as the
rest of the TTree. Use with the following pattern, make sure to to call
BackFill for the same entry for all the branches consecutively:
for(auto e = 0; e < tree->GetEntries(); ++e) { // loop over entries.
for(auto branch : branchCollection) {
... Make change to the data associated with the branch ...
branch->BackFill();
}
}
Since we loop over all the branches for each new entry all the
baskets for a cluster are consecutive in the file.
Miscellanea
XRootD version updated to 4.8.2 (supports gcc 8.1)