ROOT version 6.42.00 is scheduled for release in November 2026.
For more information, see:
The following people have contributed to this new version:
Bertrand Bellenot, CERN/EP-SFT,
Jakob Blomer, CERN/EP-SFT,
Lukas Breitwieser, CERN/EP-SFT,
Philippe Canal, FNAL,
Olivier Couet, CERN/EP-SFT,
Marta Czurylo, CERN/EP-SFT,
Florine de Geus, CERN/EP-SFT and University of Twente,
Andrei Gheata, CERN/EP-SFT,
Jonas Hahnfeld, CERN/EP-SFT and Goethe University Frankfurt,
Fernando Hueso Gonzalez, IFIC (CSIC-University of Valencia),
Stephan Hageboeck, CERN/EP-SFT,
Aaron Jomy, CERN/EP-SFT,
Sergey Linev, GSI Darmstadt,
Lorenzo Moneta, CERN/EP-SFT,
Vincenzo Eduardo Padulano, CERN/EP-SFT,
Giacomo Parolini, CERN/EP-SFT,
Danilo Piparo, CERN/EP-SFT,
Jonas Rembser, CERN/EP-SFT,
Silia Taider, CERN/EP-SFT,
Devajith Valaparambil Sreeramaswamy, CERN/EP-SFT,
Vassil Vassilev, Princeton,
Sandro Wenzel, CERN/EP-ALICE,
Tristan Wenzel, ETHZ,
rmkdepend executable is deprecated and will be
removed from the public executables shipped with the installation of
ROOT 6.44. Use instead CMake for dependency tracking, or
makedepend from system packages. If you need manual
inspection, on g++ or clang, a similar result
can be achieved by using
e.g. -std=c++17 -MM -MF file.d -MT -I incs defines -x c++-header;
on Windows with
/std:c++17 /nologo /E /showIncludes /I incs defines /TP.misc/win/ld.sh,
misc/win/makelib.sh and
roottest/scripts/winmakelib.sh are removed in ROOT
6.42.rootql and rootsl (QuickLook and
Spotlight) plugins for visualizing ROOT files in MacOS, that were
developed for ROOT 5.24 are no longer supported in ROOT 6 and are thus
removed from the codebase.vc, veccore,
builtin_vc, builtin_veccore and
rpath that were deprecated are now removed and will result
in configuration errors if used.fail-on-missing=OFF is no longer honored for
opt-in (ie OFF by default) build options requiring external dependencies
such as arrow, cocoa, daos,
daos_mock, dcache,
experimental_adaptivecpp, fcgi,
fortran, gviz, mpi,
pythia8, qt6web, tmva-cudnn,
tmva-pymva, tmva-sofie, uring or
vecgeom. If the respective associated package dependency is
not installed, ROOT will always raise a configuration error independent
of the value of fail-on-missing. The user has to take
action by either providing the dependency or manually disabling that
option via -Darrow=OFF. Note that all=ON
enables several of these options, so building with -Dall=ON
now requires all of their dependencies to be installed, or the unwanted
ones to be disabled explicitly. Build options that are enabled by
default, such as pyroot, opengl,
xml, sqlite, davix,
curl, tmva-cpu or tpython are not
affected: they are still disabled automatically when their dependencies
are missing.fail-on-missing=OFF will no longer be
honored for CMake ROOT build options that have easy-to-install
dependencies (e.g. via homebrew or apt-get), such as those required by
options cfitsio, civetweb, fftw3,
imt, mathmore, nlohmann_json,
tmva-cpu, unuran, vdt or
xrootd. Before, associated builtin_option was
automatically turned ON (or the opt-in feature turned to OFF), now, user
has to install system package or manually set
builtin_option to ON or opt-in feature to
OFF.CINT-like implicit declarations such as
i = 0 is deprecated since ROOT
6.32 and emits warnings
declaration without the 'auto' keyword is deprecated. ROOT
6.44 will be the last release to support this syntax, after ROOT 6.44,
the warning will turn into an error. Update those declarations by
explicitly using the auto keyword:
auto i = 0.RooFit::BatchMode() command argument are deprecated and
will be removed in ROOT 6.44. See the RooFit section below for
details.RooRealVar::removeRange() and the
corresponding method in RooErrorVar that were deprecated in
ROOT 6.40 are now removed.RooAbsReal::createChi2() and
RooAbsReal::chi2FitTo() that take unbinned
RooDataSet data objects were deprecated in ROOT 6.40
and are now removed.builtin_zeromq and builtin_cppzmq
build options that were deprecated in ROOT 6.40 are now removed.roofit_multiprocess build option is deprecated and
will be removed in ROOT 6.44. It has no effect anymore: RooFit’s
multi-process test statistics no longer depend on ZeroMQ and are now
always built on non-Windows platforms, so there is no reason for an
opt-in build option anymore (see the RooFit section below).TVirtualAuth and
TROOT::GetListOfSecContexts(), and the
authenticated sockets
(TSocket::CreateAuthSocket()) feature are now removed
following deprecation in ROOT 6.40.TSSLSocket class is now removed following
deprecation in ROOT 6.40.r=ON or tmva-rmva=ON build options
(TRInterface, RMVA, and friends) are removed, following
deprecation in ROOT 6.40. Their maintenance is no longer justified,
given the broader adoption of the scientific Python ecosystem. Users who
still rely on R from C++ are encouraged to call R directly via
https://cran.r-project.org/package=RInside, which is what the ROOT
bindings were using internally.ROOT::ESTLType
are deprecated and will be removed in ROOT 6.44:
TClassEdit::ESTLType, TDictionary::ESTLType,
TStreamerElement::ESTLType. Please use
ROOT::ESTLType instead.etc/Makefile.arch and the files generated from
config/Makefile-comp.in and
config/Makefile.in) are removed. External projects should
migrate to CMake (for example with find_package(ROOT)), or
obtain compilation and linker flags from
root-config --cflags --libs.mpi build
option (not to be confused with minuit2_mpi, which is
unaffected) are deprecated and will be removed in ROOT 6.44.TMVA::Experimental::SOFIE::RModel has been removed. Users
should not be encouraged to serialize models in experimental classes.
For the serialization of ONNX models one can already use ONNX directly,
and even serialize the ONNX bytes to a ROOT file if required.TMVA::Experimental::SOFIE::Options::kRootBinaryWeightFile,
WeightFileType::RootBinary) is removed. In its place,
weights can now be written in the binary safetensors format
with
TMVA::Experimental::SOFIE::Options::kSafetensorsWeightFile:
the payload is stored as raw little-endian data behind a small JSON
header, loads faster, round-trips the values bit-exactly, and can be
inspected with the standard Python and Rust safetensors tooling.
Sessions of models generated with this option can also be constructed
directly from an in-memory safetensors blob. The default text weight
format (*.dat) is unchanged.TMVA::Experimental::SOFIE::PyKeras and
PyTorch) are now removed, so RSofieReader only
accepts ONNX files. These parsers relied on private implementation
details of Keras and PyTorch, which change faster than is appropriate
for ROOT’s stability standards. Users are encouraged to export their
models to ONNX and use the retained ONNX parser instead.PyKeras,
PyTorch, PyRandomForest, PyGTB
and PyAdaBoost methods), and the corresponding
tmva-pymva build option are deprecated and will be removed
in ROOT 6.44. Like the SOFIE Keras and PyTorch parsers, PyMVA relies on
implementation details of the underlying Python libraries that change
faster than is appropriate for ROOT’s stability standards. Users are
encouraged to train and evaluate their models directly with the Python
machine-learning libraries, which integrate well with ROOT via the
ROOT::Experimental::ML::DataLoader. For high-performance
inference in C++, models can be exported to ONNX and evaluated with
SOFIE (see RSofieReader).TMVA::Experimental::SOFIE::RModel_GNN,
RModel_GraphIndependent, the RFunction classes
and the corresponding ParseFromMemory Python functions) is
removed. It could only parse models built with DeepMind’s
graph_nets and dm-sonnet Python packages, which have
been unmaintained since 2020 and can no longer be installed alongside
current Python and TensorFlow versions; the parser also relied on
private implementation details of those packages. The same graph-network
models (following the formalism of Battaglia et al., arXiv:1806.01261) can be
defined in PyTorch and deployed through the retained SOFIE ONNX parser,
whose operator support (Gather,
ScatterElements with add reduction, ReduceSum,
LayerNormalization, …) covers the graph-network building
blocks, including graphs with a variable number of nodes and edges. The
TMVA_SOFIE_GNN tutorials have been migrated to this
workflow and produce inference results identical to the removed
implementation.TMVA::Experimental::RBDT
class has been removed, along with the
TMVA.Experimental.SaveXGBoost Python function. Experimental
classes should not be persistified since their on-disk layout is not
guaranteed to be stable. An RBDT is now built directly from
an XGBoost model in its native JSON serialization with the new
TMVA::Experimental::RBDT::LoadXGBoost(jsonPath), which
works both from C++ and Python. To convert a trained model, save it
first with XGBoost’s Booster.save_model("model.json") and
then load it with LoadXGBoost.TMVA::IPythonInteractive class and the related
interactive-training interfaces from the TMVA method and fitter classes,
such as MethodBase::ExitFromTraining() or
FitterBase::SetIPythonInteractive().TMVA::Experimental::RStandardScaler has been
removed. It computed means and standard deviations, which can be easily
done without this class.TMVA::Experimental::Classification and
TMVA::Experimental::ClassificationResult classes are
removed. They were the two-class front-end of the 2016–2017
TMVA::Envelope modernization campaign that never graduated
out of the experimental namespace and saw no adoption. The parts of that
effort that did find adoption remain available:
TMVA::Envelope, TMVA::CrossValidation,
TMVA::VariableImportance,
TMVA::HyperParameterOptimisation and
TMVA::ROCCurve, the latter providing the ROC curves that
were previously obtained via ClassificationResult.TMVA::Experimental::RTensor class was removed,
since it was not much adopted by ROOTs own interfaces and is also
getting redundant with std::mdspan in C++23.TestStatSampler and
TestStatistic interfaces that returned uniform random
numbers independent of the data, only meant for debugging the RooStats
framework itself during its initial development.RooTrace class is deprecated and will be removed in
ROOT 6.44. It was a RooFit-specific memory tracer whose instrumentation
hooks are compiled out by default, so it has been inert and untested for
years. For memory debugging, please use general-purpose tools such as
AddressSanitizer or Valgrind instead.RCsg (a library mixture of CSGLib and SOLID) is now deprecated and
will be fully private after ROOT 6.44, meaning the header
CsgOps.h with the class RootCsg::TBaseMesh
will no longer be public. Use instead TGeoTessellated
public interface. If that public interface doesn’t provide what you
need, contact the ROOT team to request its extension.ROOT::Math::ParamFunctionBase,
ROOT::Math::ParamFunctorHandler and
ROOT::Math::ParamMemFunHandler classes in
Math/ParamFunctor.h are removed, together with the
ParamFunctor::GetImpl() and
ParamFunctor::SetFunction() methods that exposed them. They
implemented the type erasure that ParamFunctor now gets
from std::function, mirroring what was already done for
ROOT::Math::Functor. Constructing and calling a
ParamFunctor is unchanged, except that the constructor from
an object and one of its member functions now takes a plain pointer to
the object instead of anything dereferenceable, so smart pointers are no
longer accepted there.compiledata.h will be renamed in ROOT 6.44.
It did not have header guards and is not meant to be used directly. It
is solely used by ROOT internally to setup ACLiC, consider
using gSystem instead to access its content.RConfig.h and RVersion.h is now
deprecated and will be removed after ROOT 6.44, use instead
ROOT/RConfig.hxx and ROOT/RVersion.hxx.bvh library in Geom are
no longer public in ROOT 6.42.Rpair.h: use <utility> instead.Hparam.h and Hoption.h: use instead
THistPainter, TGraph2DPainter public
interfaces.Htypes.h and Gtypes.h: Use instead
Rtypes.h.Bswapcpy.h: no replacement.VectorizedTMath.h: use instead
TMathVectorized.h.PosixThreadInc.h: use instead
<ctime> and <cstdlib>.RStringView.h: use <string_view> or
ROOT/RStringView.hxx instead.NetErrors.h: Use instead TSocket public
interface.strlcpy.h and strtok.h: are deprecated
(but will not emit warnings) and will no longer be part of ROOT
installed headers in ROOT 6.44.snprintf.h: use instead
<cstdio>.Strlen.h: use <cstring> directly as
a replacement. NEED_STRING macro should not be defined or
an error will be raised.HelpTextTV.h: no replacement.Varargs.h and the macro R__VA_COPY: use
<cstdarg> instead.TreeUtils.h: use instead
TNtuple::ReadStream or
TNtupleD::ReadStream.Riostream.h: use <iostream>,
<fstream> or <iomanip>
instead.Rstrstream.h: use instead
<sstream>.ZipLZMA.h, ZipLZ4.h and
ZipZSTD.h: use instead the public methods in the
RZip.h interface.Hepevt.h and cfortran.h: these will be
moved to ROOT/Hepevt.h and ROOT/cfortran.h in
ROOT 6.44. At a later time point they may be fully removed from ROOT
public headers, consider using instead the TGenerator.h
public interface or the cfortran.h header of the
cfitsio library, respectively.TSQLFile class, was not tested for very
long time, not working with only supported sqlite DBCMake versions below 3.26 will emit a warning during configure, since they will become obsolete soon: CMake 3.26 will be the minimum required in ROOT 6.44. It is the version shipped with RHEL 8.10, which is the oldest Linux distribution supported by that release.
After ROOT 6.44, the minimum may rise to 3.31 if an upgrade to LLVM 24 or later is performed, see the minimum version of CMake required by LLVM.
In ROOT 6.22, many (but not all) unused includes were removed from
ROOT header files. The remaining unused includes will be removed after
ROOT 6.44. For instance, #include "TBuffer.h" will be
removed from TKey.h. This change may cause errors during
compilation of ROOT-based code if one was implicitly relying on this
transitive include on downstream code using TBuffer without
actually including TBuffer.h. Another example:
TStyle.h no longer includes internally
TArrayI.h. To fix it well in advance on your side in
downstream code, since no warnings are emitted in the meantime, we
recommend getting a preview of those to-be errors by adding
in your code #define R__LESS_INCLUDES, adding this at the
very top before including any ROOT header. An alternative is to define
this on CMake side via target_compile_definitions. This may
also improve compile time and reduce code inter-dependency; see
https://github.com/include-what-you-use/include-what-you-use/blob/master/docs/WhyIWYU.md
for a good overview of the motivation. The macro
R__LESS_INCLUDES will no longer have an effect after ROOT
6.44 since it will be the new default behavior. Note: if you build ROOT
with option dev=ON, the header RConfigure.h
will already contain that definition, so in that case consider just
including RConfigure.h at the very top, rather than
redefining R__LESS_INCLUDES in downstream code, or
alternatively guard the definition with #ifndef.
ftgl,
gl2ps, gtest, nlohmann_json,
unuran, civetweb, xxhash,
pcre2, should be installed in the system if possible
(e.g. via apt-get or homebrew package
managers). ROOT will not automatically fall-back to their builtin
versions if these are not found: the user is informed of that with a
helpful message. If installing these dependencies in the system is not
possible, the CMake option -Dbuiltin_XYZ=ON has to be
consciously chosen by the user.ftgl, gl2ps,
gtest, nlohmann_json, unuran,
civetweb, xxhash, pcre2, the
source tarballs are now fetched from SPI’s website, as for the vast
majority of ROOT’s builtins.ROOT dropped support for Python 3.10, meaning ROOT now requires at least Python 3.11.
TQObject::Connect() now directly accepts a Python
callable as the slot, for example
button.Connect("Clicked()", on_clicked). The arguments
emitted by the signal are forwarded to the callable, as far as its
signature accepts them, and the connection keeps the callable alive. Use
Disconnect(signal, callable) to undo the connection.
Signals of any signature are supported, no longer only those covered by
the TPyDispatcher::Dispatch() overloads.
The TPyDispatcher class and its
ROOT/TPyDispatcher.h header are removed: it required the
user to create and keep alive a dispatcher object manually, and it was
broken in recent releases anyway, since the interpreter could not
resolve its symbols from the libROOTPythonizations Python
extension module. Replace
obj.Connect(signal, "TPyDispatcher", disp, "Dispatch()")
with obj.Connect(signal, callable).
Reading a collection without its dictionary no longer crashes
when the elements hold a std::string or a
TString. The emulated collection proxy relocated its
elements with a raw memory copy when its buffer had to grow, which
corrupts an object that points into itself, such as a
std::string using the small string optimization; the
invalid pointer was then freed when the object was destroyed. Such
elements are now destroyed and reconstructed at the new location
instead. This affected for instance a
std::vector<std::pair<std::string,double>> read
back without a dictionary.
An RNTupleReader will now by default not load all
metadata on open. Metadata related to the on-disk location of data pages
will instead be loaded during iteration. To restore the old behavior,
set the metadata mode in the RNTupleReadOptions to
kEager.
RFile, ROOT’s modern interface to ROOT file, has moved out of the
ROOT::Experimental namespace.
The RNTupleProcessor is a new, standalone interface for creating
chains (similar to TTree’s TChain) and
joins (similar to TTree friends) from RNTuples in a composable
way, and iterating over their entries. Until this release, it was
available in the experimental namespace. With ROOT v6.42:
ROOT::Experimental. They can be created with
ROOT::RNTupleProcessor::Create() and
ROOT::RNTupleProcessor::CreateChain(), respectively.
Processing joined RNTuples will remain available in the experimental
namespace for this release, in order to address a few additional
(potentially interface-breaking) improvements. Creating an
RNTupleProcessor for joins can (for now) be done by calling
ROOT::Experimental::CreateRNTupleJoinProcessor.ROOT::Experimental::RDF::FromRNTupleProcessor().The RNTuple SoA I/O classes moved out of experimental. These classes
and the related dictionary options provide a mechanism to read and write
a collection of a class, i.e. an “array of struct” (AoS), as “struct of
array” (SoA) in memory. This is useful, e.g., for efficient consumption
of data structures by GPUs. This new feature comes with a technical
documentation (SoA.md) and a tutorial
(ntpl020_SoA.C).
TClass::IsTriviallyRelocatable() reports whether an
object of a class can be moved to a new address with a raw memory copy,
i.e. without running a move or copy constructor (trivial relocatability
in the C++26 sense). It is backed by the new
kClassIsTriviallyRelocatable class property, which
TInterpreter::ClassInfo_ClassProperty() now fills in. A
class the interpreter does not know about, in particular an emulated
one, is conservatively reported as not relocatable.TH1::GetCumulative() now computes a true
multi-dimensional cumulative for 2D (TH2) and 3D
(TH3) histograms, using the inclusion-exclusion principle:
each bin of the result holds the sum of all bins whose indices are no
greater than (forward) or no less than (backward) those of the target
bin along every axis. Previously the method accumulated a
single running sum over the flattened bin iteration, which did not
correspond to a meaningful cumulative distribution in more than one
dimension.
The behavior for one-dimensional histograms is unchanged. Code that relied on the previous 2D/3D output (for example to build per-axis selection efficiency maps) will now obtain different, mathematically consistent values.
The new histogram package continues development in the
ROOT::Experimental namespace. This release introduces
RHistEngine::SnapshotAtomic to obtain a consistent copy
during concurrent filling. There is now a class ROOT::Experimental::RProfile
for (multidimensional) profile histograms. RHist and
RHistEngine with two or three dimensions can be converted
to TH2 or TH3. More conversion functions will
continue to be added in the future (THn,
TProfile).
Minuit2 objective functions can now advertise pairs of parameters
whose mixed second derivative is identically zero, via the new virtual
function
ROOT::Minuit2::FCNBase::SecondDerivativeAlwaysVanishes()
(with corresponding setters on ROOT::Minuit2::FCNAdapter
and ROOT::Minuit2::Minuit2Minimizer). The numerical Hessian
computation in Minuit2 (MnHesse) skips the
finite-difference evaluations for such parameter pairs, which can speed
up Hesse significantly for likelihoods with many mutually independent
parameters. The parameter indices in this interface always refer to the
function’s own full (external) parameter space, including parameters
that are fixed in the minimizer, and the advertised information must
hold for all parameter values; see the FCNBase
documentation for the full contract.
RedefinePerSample transformation. Works similarly
to DefinePerSample, but allows to redefine existing values
of a column on a per-sample basis. This operation is supported in local
and distributed mode.Median action. Computes the exact median of the
input column. At the moment this action is supported in local mode
only.sqrt() of negative arguments in TTreeFormula now
returns NaNSince its introduction in 1995, the formula engine used by
TTree::Draw(), TTree::Scan() and
TTreeFormula silently evaluated sqrt(x) as
sqrt(abs(x)) for negative arguments (or as 0
in the optimized evaluation path of the legacy
ROOT::v5::TFormula). This could produce silently wrong
results, e.g. in selections involving sqrt of an expression
that can become negative. sqrt() now returns NaN for
negative arguments, consistent with TMath::Sqrt(), the
standard C sqrt(), and the modern TFormula
used by TF1. Note that in a selection, a NaN evaluates as
false, so entries where the sqrt argument is
negative now fail the cut instead of being selected based on
sqrt(abs(x)).
The RooFit::MultiProcess package that implements the
parallel gradient minimization with
fitTo(..., RooFit::Parallelize(n)) previously communicated
between the forked processes with ZeroMQ sockets, which required
building ROOT with roofit_multiprocess=ON and the ZeroMQ
(with draft API) and cppzmq dependencies. The interprocess communication
is now implemented directly on top of plain socketpair()
pipes that are inherited by the forked worker processes, so the ZeroMQ
and cppzmq dependencies and the RooFitZMQ library are
removed entirely. Since the feature no longer needs extra dependencies,
it is now always built on non-Windows platforms and the
roofit_multiprocess build option has no effect anymore; it
is deprecated and will be removed in ROOT 6.44. For implementers of
custom RooFit::MultiProcess::Job subclasses, the message
type in the Job interface changed from
zmq::message_t to the new
RooFit::MultiProcess::Message byte-buffer class, which
supports the same usage patterns.
The RooMinimizer::Strategy enum has been removed. It
named the Minuit strategies that are usually referred to just by
integers, but caused confusion because it didn’t include the unnamed
“Strategy 3”. Since people usually set the strategy with integer values
anyway, it was decided that the simplest solution to avoid the confusion
was simply to remove the RooMinimizer::Strategy
enum
RooSimultaneous::expectedEvents() with a
RooSuperCategory index now sums over all components if
its input categories are in the normalization set, as for dataset
variables. Before, it returned the selected component’s yield, which
also gave the wrong total in extended toy generation.
An extended RooSimultaneous whose index category
is a parameter (“switch mode”, like RooMultiPdf) now
evaluates to the selected component and uses its expected events in the
extended term, also with code generation. Before, the value was weighted
by the component’s relative yield, and the new backends dropped the
extended term. Consequently,
RooSimultaneous::getVal(normSet) only includes the relative
channel yields if the index category is in
normSet.
RooFit now analyzes the computation graph of the minimized function
to find pairs of parameters that never appear in the same additive term
of the likelihood, meaning their mixed second derivative is identically
zero. This information is forwarded to Minuit2, which skips the
corresponding finite-difference evaluations in the numerical Hessian
computation (see the Math section above). For likelihoods with many
mutually independent parameters, such as the per-channel nuisance
parameters of large combined HistFactory models, this can speed up
RooMinimizer::hesse() by 30 % or more, with results
identical up to floating-point noise. This optimization is automatic and
requires no user action.
The legacy evaluation backend for likelihood and
chi-square fits is deprecated and will be removed in ROOT 6.44. It was
superseded by the vectorized cpu backend, which is the
default since ROOT 6.32. After the removal of the constant term
optimization (see below), the legacy backend also has no
performance-relevant feature left that would justify its continued
maintenance.
Selecting the legacy backend with
RooFit::EvalBackend("legacy") now prints a deprecation
warning whenever a likelihood or chi-square object is created with it,
and the RooFit::EvalBackend::Legacy() factory function is
marked as deprecated, resulting in compiler warnings.
The RooFit::BatchMode() command argument, which was
superseded by RooFit::EvalBackend() in ROOT 6.28, is
deprecated at the same time and will also be removed in ROOT 6.44. Note
that the C++ declarations of RooFit::BatchMode() had been
unintentionally absent since ROOT 6.30; they are restored in this
release, marked as deprecated, to give downstream code a proper
migration window.
The removal in ROOT 6.44 will also include:
nll::name[pdf,data] and
chi2::name[pdf,data] expressions in the
RooWorkspace::factory() language, which instantiate the
removed classes directly.Users are strongly encouraged to switch to the default
cpu evaluation backend, i.e., to simply not pass any
EvalBackend() or BatchMode() command argument.
If the default backend does not work for a given use case,
please report it by opening an issue on the ROOT GitHub
repository.
The RooFit::Optimize() option (constant term
optimization) was deprecated in ROOT 6.40, and its functionality is now
removed. The RooFit::Optimize() and
RooMinimizer::optimizeConst() methods are kept for API
consistency across ROOT versions, but they have no effect anymore.
In practice this option only affected the legacy
evaluation backend.
Together with the mechanism itself, the public interfaces that only existed to drive it were removed. Code that called or overrode any of the following needs to be adapted:
RooAbsArg::constOptimizeTestStatistic(),
RooAbsArg::findConstantNodes(),
RooAbsArg::setCacheAndTrackHints(),
RooAbsArg::canNodeBeCached() and the
RooAbsArg::ConstOpCode and
RooAbsArg::CacheMode enums.RooAbsData::cacheArgs(), resetCache(),
setArgStatus(), attachCache(),
optimizeReadingWithCaching(),
allClientsCached() and hasFilledCache(),
together with the corresponding RooAbsDataStore interface
(cacheArgs(), cacheOwner(),
attachCache(), setArgStatus(),
resetCache(), cachedVars(),
recalculateCache() and forceCacheUpdate()).
Classes deriving from RooAbsDataStore no longer need to
implement them.RooFit::TestStatistics::RooAbsL::constOptimizeTestStatistic()
and
RooFit::TestStatistics::LikelihoodWrapper::constOptimizeTestStatistic().Since the cache-and-track hints are gone, the
"CacheAndTrack", "NOCacheAndTrack" and
"NeverConstant" attributes no longer have any effect.
The default vectorized CPU evaluation backend (introduced in ROOT 6.32) already performs these optimizations automatically and is not affected by this change. Users are strongly encouraged to switch to the vectorized CPU backend if they are still using the legacy backend.
If the vectorized backend does not work for a given use case, please report it by opening an issue on the ROOT GitHub repository.
A freshly-constructed RooRealVar (or
RooErrorVar) no longer has a default binning of 100 bins.
Instead, RooAbsRealLValue::getBins() now returns
0 until a binning is explicitly set (e.g. via
RooRealVar::setBins()). This makes it possible to
distinguish a variable whose binning was deliberately chosen from one
that was left at the default, which avoids writing redundant
nbins fields when serializing workspaces to HS3 JSON.
For the cases that previously relied on the default of 100 bins, that
value is now injected by the relevant routine: unbinned-dataset plotting
(RooAbsRealLValue::frame()),
RooAbsPdf::generateBinned(), and
RooAbsRealLValue::createHistogram() all fall back to
RooAbsRealLValue::DefaultNBins (100) when the variable has
no binning set. As a result, plotting, generating binned data and
creating histograms from a default-constructed variable behave exactly
as before.
Code that reads getBins()/numBins() of a
bare variable and expected the value 100 should either set
the binning explicitly, or read the bin count from the relevant
histogram or plot frame instead.
When a RooResolutionModel (like
RooGaussModel or RooTruthModel) is used wi th
a RooAbsAnaConvPdf (like RooDecay,
RooBDecay, etc.), it acts as a configuration
object that specifies which model to convolve the basis functions with,
rather than as a nod e of the pdf’s computation graph. The
RooAbsAnaConvPdf builds its own internal basis-function
convolutions from it and evaluates those.
Until now, the resolution model was nevertheless kept as a
(non-value, non-shape) server of the RooAbsAnaConvPdf. As a
side effect, importing such a pdf into a RooWorkspace also
imported the original resolution model as a standalone workspace object,
and it leaked into HS3/JSON exports, even though it played no role in
the computation.
Starting with ROOT 6.42, a resolution model that is only used as the
configuration of a RooAbsAnaConvPdf is no longer a server
of that pdf, and is therefore not imported into the workspace on its own
anymore. The model remains accessible via
RooAbsAnaConvPdf::getModel().
This is not expected to affect typical usage, since the resolution model was never part of the actual likelihood. Workspaces written with older ROOT versions are read back correctly via schema evolution.
Since ROOT 6.36 implementation of “POL” draw option was changed. Angle and radius range automatically scaled to visible histogram range filling full 2*Pi angle and full radius range. This let display TH2 in polar coordinates for any provided range settings, but produced plots are not intuitive. Therefore two new options for polar coordinates were introduced.
“POLF” - fixed polar coordinates. In such case full histogram X range mapped to -PI .. +Pi. And Y axis mapped to radius. In case of histogram zooming angle and radius of each bin remains the same (therefore name “fixed”), just number of displayed bins are reduced.
“POLN” - natural polar coordinates. In this case X axis directly represents angle value in radians (therefore name “natural”) and Y axis is just radius.
Now canvas (or several canvases) can be stored in portable HTML file.
Just call c1->SaveAs("canvas.html") or invoke
correspondent menu item. To store several canvases in single HTML file
one can use:
auto c1 = new TCanvas("c1", "c1", 4);
auto c2 = new TCanvas("c2", "c2", 4);
auto c3 = new TCanvas("c3", "c3", 4);
TCanvas::SaveAll({c1, c2, c3}, "canvases.html");Produced HTML file will include canvas JSON data and JavaScript code to load and display canvas. Such file can be loaded locally in any web browser or send as attachment in email to colleagues.
TPaletteAxis provide now
interactive zooming with mouse cursorTGeo navigationMultithreaded TGeo navigation is now faster and more
scalable, with improved thread-local state management that avoids false
sharing, releases temporary memory during geometry cleanup, and
correctly supports concurrent navigation of multiple geometries.
For ALICE material-budget lookup-table generation on 28 cores, these changes reduced the runtime from 139 s to 72 s and improved scaling from 12x to 23x.
The TGeometry
classes (Geant 3 shapes) have been moved out of Graf3D into their own
library. To link to these classes, use the cmake target
TGeometry (preferred), root-config --libs, or
link with -lTGeometry. When ROOT is configured with
-Dgeom=Off, these classes are now off as well.
The header X3DBuffer.h is no longer part of the installed ROOT headers.
RooFit evaluates its models with backend libraries that
libRooBatchCompute loads at runtime, one of which,
libRooBatchCompute_CUDA, is the only part of ROOT that
requires the CUDA toolkit. It is now possible to build that backend on
its own against an already installed ROOT, so that distributions can
ship a CUDA-free ROOT and provide the GPU backend as a separate
package:
cmake -S <root-source-dir>/roofit/batchcompute -B build -DCMAKE_PREFIX_PATH=<root-install-prefix>
cmake --build build
cmake --install buildroofit/batchcompute/CMakeLists.txt doubles as the
top-level CMakeLists.txt of that standalone project, so no
CMake code has to be maintained downstream. By default the library is
installed into the library directory of the ROOT installation it was
configured against, which is where RooFit looks for it. See
roofit/batchcompute/README.md for the details. Nothing
changes for the regular ROOT build: -Dcuda=ON still builds
the CUDA backend together with everything else.
It is strongly recommended to rely on sytem packages, and not built-in ones. All the built-in packages are now collected in the builtins directory. The version of the following packages has been updated:
More than 180 items in ROOT’s trackers have been addressed in this release:
TClass::Init() does two lookups where one is enoughCMAKE_INSTALL_PREFIX.TF1/TFormula stored with
previous ROOT versionsio_uring is
supportedoperator+libMatrixLLVM_LINK_LLVM_DYLIB=ONcmake_cxxmodules=OFF with C++17<Insert> key properly
at the promptRIterators are not usable with STL
algorithmsCMAKE_OSX_SYSROOT0x pointer-suffix strippingR__memcompress fails with limited stack sizeTASImage::DrawEllips2() works incorrectly when filling
tilted ellipseTASImage::DrawEllips2: Flood fill leaks through contour gap
in asim_straight_ellips() (affects up to 64% of axis-aligned
non-circular ellipses)pdf.getVal(normSet) or createIntegralRooSimultaneous double counts extended
sub-pdfshttp=ON on Ubuntu 26.10TMath::IsInside() returns wrong results when Int_t is
usedTGraphErrors::Draw("3") changes the error band when the
axis range is changed<filesystem> doesn’t work in interpreted
code#var
alias to R_rdf_sizeof_var does not respect string
literals