ROOT version 6.20/00 was released on February 26, 2020.
For more information, see:
The following people have contributed to this new version:
Kim Albertsson, CERN/ATLAS,
Guilherme Amadio, CERN/SFT,
Bertrand Bellenot, CERN/SFT,
Iliana Betsou, CERN/SFT,
Jakob Blomer, CERN/SFT,
Brian Bockelman, Nebraska,
Rene Brun, CERN/SFT,
Philippe Canal, FNAL,
Javier Cervantes Villanueva, CERN/SFT,
Olivier Couet, CERN/SFT,
Alexandra Dobrescu, CERN/SFT,
Giulio Eulisse, CERN/ALICE,
Johannes Hentrich,
Massimiliano Galli, CERN/SFT and Unibo,
Gerri Ganis, CERN/SFT,
Andrei Gheata, CERN/SFT,
Hadrien Grasland, CNRS,
Enrico Guiraud, CERN/SFT,
Stephan Hageboeck, CERN/SFT,
Desislava Kalaydjieva, CERN/SFT,
Jan Knedlik, GSI,
Philip Leindecker, CERN/SFT,
Sergey Linev, GSI,
Alfonso Luis Castano Marin, UMU,
Pere Mato, CERN/SFT,
Emmanouil Michalainas, AUTh,
Lorenzo Moneta, CERN/SFT,
Alja Mrak-Tadel, UCSD/CMS,
Axel Naumann, CERN/SFT,
Joana Niermann, CERN-SFT,
Vincenzo Eduardo Padulano, Bicocca/SFT,
Danilo Piparo, CERN/SFT,
Fons Rademakers, CERN/SFT,
Otto Schaile, Uni-Muenchen,
Henry Schreiner, Princeton,
Oksana Shadura, Nebraska,
Simon Spies, GSI,
Matevz Tadel, UCSD/CMS,
Yuka Takahashi, Princeton and CERN/SFT,
Enric Tejedor Saavedra, CERN/SFT,
Vassil Vassilev, Princeton/CMS,
Wouter Verkerke, NIKHEF/ATLAS,
Stefan Wunsch, CERN/SFT,
Luca Zampieri, CERN-SFT,
Zhe Zhang, Nebraska
The venerable splash screen is now disabled by default to make ROOT’s
startup faster. Many users already use root -l
to start
ROOT, but this also hides the useful text banner with version
information along with the splash screen. With this new default,
starting up ROOT as just root
will show only the text
banner instead of the splash screen. The splash screen can still be seen
with root -a
or in TBrowser
by opening
Browser Help → About ROOT
.
-cint
, -gccxml
,
-p
, -r
and -c
have no effect and
will be removed in a future release. Please remove them from the
rootcling invocations.+P
, +V
and
+STUB
have no effect and will be removed in a future
release. Please remove them from the rootcling invocations.--deep
has no effect and will be removed
in a future release. Please remove it from the genreflex
invocation.Gtypes.h
and Htypes.h
are deprecated. Please include Rtypes.h
TFile: A new bit TFile::kReproducible
was
introduced. It can be enabled by specifying the
"reproducible"
url option when creating the file:
TFile *f = TFile::Open("name.root?reproducible","RECREATE","File title");
Unlike regular TFile
s, the content of such file has
reproducible binary content when writing exactly same data. This
achieved by writing pre-defined values for creation and modification
date of TKey/TDirectory objects and null value for TUUID objects inside
TFile. As drawback, TRef objects stored in such file cannot be read
correctly.
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.
TMemFile: Apply customization of minimal block size also to the first block.
Add renaming rule for instances of the math classes from
genvector
and smatrix
to instance for one
floating point type (float
, double
,
Double32_t
, Float16_t
) to instances for any
other floating point type.
Corrected the application of I/O customization rules
when the target classes contained typedefs (in particular
Double32_t
)
Prevent splitting of objects when a
Streamer Function
was explicitly attached to their
TClass
.
In hadd fix verbose level arg parsing
Allow user to change the type of the content of a TClonesArray.
Avoid deleted memory access in MakeProject
and in
handling of I/O customization rules
.
Added a new compression algorithm ZSTD [https://github.com/facebook/zstd.git], a dictionary-type algorithm (LZ77) with large search window and fast implementations of entropy coding stage, using either very fast Finite State Entropy (tANS) or Huffman coding. ZSTD offers a better compression ratio and faster decompression speed comparing to ZLIB. Its decompression speed is 2x faster then ZLIB and at least 6x faster comparing to LZMA. ZSTD provides a wide range of compression levels, and after evaluation we recommend to use for your purposes compression level 5 (or 6). To use ZSTD please use next settings:
root [1] _file0->SetCompressionAlgorithm(ROOT::RCompressionSetting::EAlgorithm::kZSTD)
root [2] _file0->SetCompressionLevel(ROOT::RCompressionSetting::ELevel::kDefaultZSTD)
or
root [3] _file0->SetCompressionSettings(505)
or
root [3] _file0->SetCompressionSettings(ROOT::RCompressionSetting::EDefaults::kUseGeneralPurpose)
TTreeFormula
when stale cached
information was re-used.Documentation Many improvements to the doxygen documentation of RooFit classes.
Automatic legends for RooPlot RooPlot now supports BuildLegend as a good starting point for a legend.
Short prefits In unbinned fits that take long,
good starting values for parameters can be found by running a short
prefit before the final fit. Passing
PrefitDataFraction(0.1)
to fitTo()
will e.g. run a prefit on 1% of the data.
Iterating over categories Category classes deriving from RooAbsCategory, e.g. RooCategory now support “natural” iterating using range-based for loops in C++ or Python loops:
import ROOT
cat = ROOT.RooCategory("cat", "cat")
cat.defineType("1Lep", 1)
cat.defineType("2Lep", 2)
for state in cat:
print(state.getVal(), state.GetName())
(1, '1Lep')
(2, '2Lep')
Asymptotically correct parameter uncertainties Added computation of asymptotically correct parameter uncertainties in likelihood fits with event weights. See arXiv 1911.01303 and rf611_weightedfits.C.
Barlow-Beeston tutorial The tutorial rf709_BarlowBeeston.C has been added to RooFit to demonstrate how to incorporate Monte Carlo statistics as systematic uncertainties into a fit. It demonstrates both the “full” and the “light” method.
RooFitMore for GSL All parts of RooFit that use
the GSL (PDFs and integrators) have been moved into the library
RooFitMore
. It gets enabled automatically with the
MathMore
library (-Dmathmore=ON
, default).
Note that -lRooFitMore
might now be required when linking
against RooFit.
A BatchMode
for faster unbinned fits has been added. By
loading data more efficiently, unbinned likelihood computations
can run about 3x faster if the PDFs support it. To enable it,
use
pdf.fitTo(data, RooFit::BatchMode());
Most unbinned PDFs that are shipped with RooFit have been updated to support this mode.
In addition, if ROOT is compiled for a specific architecture, SIMD
instructions can be used in PDF computations. This requires ROOT to be
compiled with -march=native
or e.g.
-mavx2
if the hardware supports it. For maximal
performance, ROOT should also be configured with -Dvdt=ON
.
VDT is a library of fast
math functions, which will automatically be used in RooFit when
available. Depending on the compiler, on the instruction set supported
by the CPU and on what kind of PDFs are used, PDF evaluations
will speed up 5x to 16x. For details see CHEP
2019.
RooFormula has been updated to use ROOT’s TFormula.
This means that expressions passed to RooFormulaVar / RooGenericPdf are
compiled with -O2
optimisation level before they are
evaluated. For complicated functions, this might improve the speed of
the computation. Further, functions that are known to the interpreter
can be used in the expression passed to a PDF. The following macro
e.g. prints the expected result 5.4:
double func(double x, double a) {
return a*x*x + 1.;
}
void testRooFormulaWithClingFunction() {
RooRealVar x("x", "x", 2, -10, 10);
RooRealVar a("a", "a", 1.1, -10, 10);
RooGenericPdf pdf("pdfWithExternalFunc", "func(x, a)", {a, x});
std::cout << pdf.getVal() << std::endl;
}
RooStats::GetGlobalRooStatsConfig()
.TArrow
.TLine/TArrow
objects when
NDC coordinates are used.TGraph::MovePoints()
method.RX
and RY
for TMultiGraph in
order to draw reverse axis along X and Y.TCanvas
Event Status Bar now displays the date and
time when the mouse cursor is moved over a time axis (implemented by
Otto Schaile).TH2Poly
.TEfficiency
.TImage:ls()
TGraph2D
: X Y and Z titles were not saved by
SavePrimitive.TPad::PaintHatches
disappeared.TMultiGraph::SavePrimitive
.-DCMAKE_CXX_STANDARD="17" -Dhttp="ON" -Droot7="ON"
tutorials/eve7
root --notebook arg1 arg2 ...
, extra arguments can be
provided. All these arguments delivered as is to jupyter executable and
can be used for configuration. Like server binding to specific host
root --notebook --ip=hostname
c.NotebookApp.ip = '*'
from default jupyter
config. One has to provide ip address for server binding using
root --notebook --ip=<hostaddr>
arguments%jsroot on
Images in tutorials can now be displayed à JavaScript thanks to
the (js) option added next to the directive
\macro_image
As the tutorial palettes.C
is often hit when
searching the keyword palette
in the reference guide, a
direct link from this example to the full list of predefined palettes
given in TColor
has been added.
Revisited the TSpectrum2 documentation. All the static images have been replaced by macros generating images at reference guide build time. These macros have been added in the tutorial section of the reference guide.
The Reference Guide can now be accessed directly from the ROOT
prompt thanks to a great extension (implemented by Desislava
Kalaydjieva) of the .help
command. For example to access
the Reference Guide for TTree
it is enough to type:
root[0] .help TTree
To open the reference guide for a function/member:
root[0] .help TTree::Draw
Change the layout of the ROOT reference.
python
was renamed to pyroot
. The
option spelled python
is a deprecated alias for
pyroot
.-Dmlp={OFF,ON}
switch for
CMake-Dspectrum={OFF,ON}
switch for CMake-Dfail-on-missing=ON
is passed to CMake-Dall=ON
now switches the default value of all
optional packages to ON
astiff
, cling
,
pch
, thread
, and explicitlink
have been removed and are now ignored. They either had no effect (their
value was not being used in the build system), or could not be disabled
(like cling
and explicitlink
).cxx_std_11
,
cxx_std_14
, and cxx_std_17
.RootNewMacros.cmake
has been renamed to
RootMacros.cmake
. Including the old file by name is
deprecated and will generate a warning. Including
RootMacros.cmake
is not necessary, as now it is already
included when calling find_package(ROOT)
. If you still need
to inherit ROOT’s compile options, however, you may use
include(${ROOT_USE_FILE})
as before.make install
. Only the necessary files by dependent
projects are installed by default now, and they are installed directly
into the cmake/ directory, not cmake/modules/ as before.ROOT_GENERATE_DICTIONARY()
can now attach the
generated source file directly to a library target by using the option
MODULE <library>
, where <library>
is an existing library target. This allows the dictionary to inherit
target properties such as compile options and include directories from
the library target, even when they are added after the call to
ROOT_GENERATE_DICTIONARY()
.REFLEX_GENERATE_DICTIONARY()
and
ROOT_GENERATE_DICTIONARY()
can now have custom extra
dependencies added with the options DEPENDS
and
EXTRA_DEPENDENCIES
, respectively.DEBUGFULL
, OPTIMIZED
,
and PROFILE
have been removed. They were not in use and did
not work in all platforms.CXXFLAGS
set by the user are always respected. If no flags
are set, then the build type defaults to release.${ROOT_PYTHON_VERSION}
, available
after calling find_package(ROOT)
.The following builtins have been updated:
'int','double']() # new syntax
my_templated_function['int','double')() # old sytax, throws a deprecation warning my_templated_function(
None
to a null pointer in C++, a
deprecation warning is issued.buffer.SetSize
a deprecation warning is
issued, the forward compatible alternative is
buffer.reshape
.ROOT.Long
or ROOT.Double
, a
deprecation warning is issued in favour of their equivalent
ctypes
types (c_long
, c_int
,
c_double
)as_cobject
and
bind_object
for AsCObject
and
BindObject
, respectively.cppyy.nullptr
, not only
as cppyy.gbl.nullptr
.add_pythonization
) are
accessible via cppyy.py
.__creates__
,
__mempolicy__
, __release_gil__
for function
proxies, __smartptr__
for object proxies).std::string
and C string
.bytes
to std::string
and to C string.cmake -DPYTHON_EXECUTABLE=/path/to/first/Python/installation /path/to/ROOT/source
cmake --build .
cmake -DPYTHON_EXECUTABLE=/path/to/second/Python/installation /path/to/ROOT/source
cmake --build .
( ... )
ROOT_PYTHON_VERSION=X.Y source /path/to/bin/thisroot.sh
cmake -DCMAKE_INSTALL_PYROOTDIR=/path/to/PyROOT/install/dir /path/to/ROOT/source
cmake --build .
make install
MakeNullPointer(klass)
as
bind_object(0,klass)
BindObject
and AsCObject
ROOT.Long
and ROOT.Double
are no longer in
the API of PyROOT, since new Cppyy requires to use their equivalent
ctypes
types (c_long
, c_int
,
c_double
).from ROOT import *
in Python2
(only).RTensor
class, a container for
multi-dimensional arrays similar to NumPy arraysAsTensor
to convert data from a
RDataFrame
to a RTensor
RReader
following a sklearn-like API in C++ and PythonRStandardScaler
)batchEvaluate
in RooAbsPdf
batchEvaluate
functions for heavily used PDFsRooAddPdf::_coefCache
does not check boundsTH2Poly
-> TH1::Divide
RooLinearVar
from a
RooWorkspace
RooDataHist
’s assignment operator seems to be brokenRooFit::AddTo()
-Dfail-on-missing=ON
-Dexplicitlink=OFF
configuration does not
compile-Droottest=ON
when using a release
tarballbuiltin_clang=OFF
TH2Poly
ROOTGraphicsPrimitives
TPython::LoadMacro
is broken in CppyyTGraph
does not fill completelyTFile
-owned
objectsTFormula
v5 reads/writes after arrayRooDataSet
s with large weight array cannot be
serialisedTStyle
has user defined copy constructor, but no
operator=TFile::MakeProject
severely brokencling::Value
broken if placement-new constructor failsconst char*
and not bytes →
const char*
TTree
is dropped
under specific circumstancesTCanvas.SaveAs
saves png files only in batch modeTBulkBranchRead.hxx
recursively includes
TBranch.h
RooMCStudy
crashes when requesting pulls for parameters
that don’t have pullsstd::pair
written with 6.14/GCC 8.2 not readable
with 6.18/GCC 8.3std::shared_ptr
TCutG
copy constructor is wrongRooDataSet::add
has side effects on event weight errorTH2Poly::Add
wrongly adds bin contentTRint
doesn’t catch exceptionsTFile
/TTree
combinationRooDataHist::sum
std::unique_ptr
in STL containerstd::string
std::shared_ptr
TFile::GetBestBuffer
casting to Int
_t
OverflowsTClassEdit::ResolveTypedef
leaves a spurious “std”TSocket::Recv
TMemberInspector::TParentBuf::Append
TFitResult->Scan()
crashes when multi-threading is
enabledRooFormulaVar
with categories crash when plottedTEveVectorT
on Windowsthen
statement is equivalent to the
else
statement. MethodMLP.cxx 423RooFormula
doesn’t compile when arguments are renamedRooDataSet
Import Tree Branch with long nameMeasurement::PrintXML()
crashes on 6.18+-Dgnuinstall=ON
doesn’t work when
installed with make installRooAbsData::convertToTreeStore
forgets event weightsstd::map
in Python using gcc9 buildsTTree
is shared between RooFit and file after
writing a RooDataSet
TBinomialEfficiencyFitter::Fit
ignores the parameter
limitsAsNumpy
fails with Boolean columnsPyArrayObject
redefined in TMVA/PyMethodBase.h with
different typestring_view
to
TString
breaks existing codeRooFit::CutRange
is buggy with multiple rangechi2FitTo
and fitTo
are not working properly
with multiple rangesstd::vector<T, custom_alloc<T>>
I/OTClass
for HepMC::GenVertex
is being
unloaded when in state 3TStreamerInfo
removed from the file when new object is
writtenTTree::Draw
/Scan
on
specific entries of vectors of vectorsTClassEdit::GetNormalizedName
is wrong on OSXroot-config --python-version
returns an empty stringstdout
message in
RooMCStudy
TFileMerger
/hadd
using restricted sources list
on recursive call ?TFormula
ROOT_GENERATE_DICTIONARY
interface for CMake Usage
Requirements/Generator ExpressionsTBranchObjects
(e.g. branches
containing TH2F
)TFormula
in RooFit by JITted
TFormula
RooJohnson
unit testTPythia8
: Add option to disable banner in constructorAsNumpy
Info
symbols found twice in Pythia and ROOTTMultiGraph
Released on March 15, 2020
Released on April 1, 2020
%jsroot
oncopy_string=history.history.keys()[0]
RooArgSet::writeToStream
Released on June 10, 2020
TCanvas
if
gROOT.IsBatch()
is True
RooFitResult
and
HypoTestInverterResult
from diskTH2
histogramTTreeProcessorMT
can’t deal with trees with different
names in the same TChain
TTree
writing-I
flags provided for dictionary compilationRooRealVar
Name != Titlehesse
does not know which minimizer to useTPad::logX
broken for histograms with Sumw2 errorsRooDataSet
from TTree
with
cuts causes warningsTDirectory::GetObject()
with wrong type leaks memoryTH1
-s Display Incorrectly in root 6.20.04make_shared
/shared_ptr
FuncOps__::__le__
TClonesArrays
read via
TTreeReaderArray
is brokenclang::Sema::LookupSpecialMember
RVec
s of non-split branches can read from invalid
addressesReleased on August 18, 2020
TTree::GetBranch
has been updated to execute its search
trough the set of branches breadth first instead of depth first. In some
cases this changes the branch that is returned. For example with: struct FloatInt {
float f;
int x;
};
and
= 1;
int x 2.1, 3};
FloatInt s{t("t", "t");
TTree t.Branch("i", &i); // Create a top level branch named "i" and a sub-branch name "x"
t.Branch("x", &x);
the old version of t.GetBranch("x")
was return the
i.x
sub-branch while the new version return the
x
top level branch.
TTree::GetBranch
was also upgraded to properly
handle being give a full branch name. In prior version, with the example
above, GetBranch("i.x")
would return nullptr. With the new
version it returns the address of the branch i.x
.
TChain
now properly carries from TTree
to TTree
, each TBranch MakeClass
(also known
as DecomposedObj[ect]
mode, if it was set (implicitly or
explicitly).
TTree::SetBranchAddress
and
TChain::SetBranchAddress
now automatically detect when a
branch needs to be switched to
MakeClass(also known as
DecomposedObj[ect]` mode).
TChain
now always checks the branch address; even in
the case the address is set before any TTree is loaded. Specifically in
addition to checking the address type in the case:
chain->LoadTree(0);
chain->SetBranchAdress(branch_name, &address);
now TChain
will also check the addresses in the
case:
chain->SetBranchAdress(branch_name, &address);
chain->LoadTree(0);
TTree
and TChain
no longet override user
provided sub-branch addresses. Prior to this release doing:// Not setting the top level branch address.
chain->SetBranchAdress(sub_branch_name, &address);
chain->GetEntry(0);
Resulted in the address set to be forgotten. Note that a work-around was:
// Not setting the top level branch address.
chain->GetEntry(0);
chain->SetBranchAdress(sub_branch_name, &address);
But also the address needed to (in most cases) also be set again after each new tree was loaded.
Note that, the following:
chain->SetBranchAdress(sub_branch_name, &address);
chain->SetBranchAdress(top_level_branch_name, &other_address);
chain->GetEntry(0);
will result (as one would expect) with the first SetBranchAddress being ignored/over-ridden.
TTrees
, RDataFrame’s
GetColumnNames
method returns multiple valid spellings for
a given column. For example, leaf "l"
under branch
"b"
might now be mentioned as "l"
as well as
"b.l"
, while only one of the two spellings might have been
recognized before.libNew.so
crashMakeProxy
std::map<int,std::vector<double,*>>
TClass::GetListOfAllPublicMethods()
lists deleted copy
constructor of std::unique_ptr
FutureWarning
in ROOT.py
hadd
crashes when slow merging file with multiple array
with same indexTHashTable
thisroot.sh
sets the wrong PYTHONPATH
on LCG
viewsThese changes will be part of a future 6.20/10.