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.
genvector
and smatrix
to instance for one floating point type (float
, double
, Double32_t
, Float16_t
) to instances for any other floating point type.I/O customization rules
when the target classes contained typedefs (in particular Double32_t
)Streamer Function
was explicitly attached to their TClass
.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\macro_image
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.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:
my_templated_function['int','double']() # new syntax
my_templated_function('int','double')() # old sytax, throws a deprecation warning
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 .
( ... )
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
int x = 1;
FloatInt s{2.1, 3};
TTree t("t", "t");
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.