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.hTFile: 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 TFiles, 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.RXand 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/eve7root --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=hostnamec.NotebookApp.ip = '*' from default jupyter
config. One has to provide ip address for server binding using
root --notebook --ip=<hostaddr> arguments%jsroot onImages 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::DrawChange 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 ONastiff, 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 warningNone 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.shcmake -DCMAKE_INSTALL_PYROOTDIR=/path/to/PyROOT/install/dir /path/to/ROOT/source
cmake --build .
make installMakeNullPointer(klass) as
bind_object(0,klass)BindObject and AsCObjectROOT.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 RTensorRReader
following a sklearn-like API in C++ and PythonRStandardScaler)batchEvaluate in RooAbsPdfbatchEvaluate functions for heavily used PDFsRooAddPdf::_coefCache does not check boundsTH2Poly -> TH1::DivideRooLinearVar from a
RooWorkspaceRooDataHist’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=OFFTH2PolyROOTGraphicsPrimitivesTPython::LoadMacro is broken in CppyyTGraph does not fill completelyTFile-owned
objectsTFormula v5 reads/writes after arrayRooDataSets 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.hRooMCStudy 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_ptrTCutG copy constructor is wrongRooDataSet::add has side effects on event weight errorTH2Poly::Add wrongly adds bin contentTRint doesn’t catch exceptionsTFile/TTree combinationRooDataHist::sumstd::unique_ptr in STL containerstd::stringstd::shared_ptrTFile::GetBestBuffer casting to Int_t
OverflowsTClassEdit::ResolveTypedef leaves a spurious “std”TSocket::RecvTMemberInspector::TParentBuf::AppendTFitResult->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 RooDataSetTBinomialEfficiencyFitter::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
RooMCStudyTFileMerger/hadd using restricted sources list
on recursive call ?TFormulaROOT_GENERATE_DICTIONARY interface for CMake Usage
Requirements/Generator ExpressionsTBranchObjects (e.g. branches
containing TH2F)TFormula in RooFit by JITted
TFormulaRooJohnson unit testTPythia8: Add option to disable banner in constructorAsNumpyInfo symbols found twice in Pythia and ROOTTMultiGraphReleased on March 15, 2020
Released on April 1, 2020
%jsroot oncopy_string=history.history.keys()[0]RooArgSet::writeToStreamReleased on June 10, 2020
TCanvas if
gROOT.IsBatch() is TrueRooFitResult and
HypoTestInverterResult from diskTH2 histogramTTreeProcessorMT can’t deal with trees with different
names in the same TChainTTree
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_ptrFuncOps__::__le__TClonesArrays read via
TTreeReaderArray is brokenclang::Sema::LookupSpecialMemberRVecs 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 asDecomposedObj[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_ptrFutureWarning in ROOT.pyhadd crashes when slow merging file with multiple array
with same indexTHashTablethisroot.sh sets the wrong PYTHONPATH on LCG
viewsThese changes will be part of a future 6.20/10.